OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 26.04.2024, 09:00

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 6 ] 
Autor Zpráva
 Předmět příspěvku: Stroják za REM
PříspěvekNapsal: 17.09.2013, 12:32 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 12.05.2013, 19:27
Příspěvky: 1011
Has thanked: 231 times
Been thanked: 221 times
Už v hodně dávných dobách jsem si všímal, jak jsou udělané různé programy v Basicu. Vždycky mě zajímalo, jak je vlastně udlěaný "stroják v Basicu" na prvním řádku většinou za příkazem REM. Od jaké adresy vlastně je a jak může být dlouhý? A jak se provede, aby za REM byl? Vím, že dnes se tato metoda už nepoužívá a je považovaná za prasáckou, ale i tak mě to zajímá, nikdy jsem to pořádně nepochopil.

_________________
Have you played ATARI today?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Stroják za REM
PříspěvekNapsal: 17.09.2013, 13:28 
Offline
Kecálek

Registrován: 06.09.2013, 18:35
Příspěvky: 113
Has thanked: 3 times
Been thanked: 15 times
Preco by sa nemala pouzivat a preco je povazovana za prasacku?

Problemy so strojakom v Basicu su snad len dva:
1. zvacsa tam bol custom loader a to prasarna je, lebo program potom nejde upravit na iny system
2. maloktory kod si zistoval zaciatok Basicu a upravil podla toho volania, takze nefungoval s pripojenym betadiskom, alebo IF1 (alebo cimkolvek,co posuvalo zaciatok Basicu).

Najnovsi program, co som takto videl je Flasher na divIDE a ten je docela pekny ;-)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Stroják za REM
PříspěvekNapsal: 17.09.2013, 13:32 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
To je velmi jednoduche. Napis 1 REM aaaaaaaaaaaaaaaaa odosli a pozri sa do pameti od adresy 23755 (tu normalne zacina basic). Najdes tam najprv dvojbajtove cislo riadku (v nasom pripade 1), potom dvojbajtovu dlzku riadku, potom kod prikazu REM - bajt #EA a za nim uz budu v pameti tie pismenka "a". Tie si mozes (napr. pomocou POKE, alebo z nejakeho monitora, asembleru, alebo uplne mimo Spektra) prepisat hocicim, napr. tvojim strojakom. A normalne ho zavolat pomocou USR. Prve acko bude na adrese 23760, takze ak chces svoj strojak zavolat od zaciatku, tak urob USR 23760.

A aky dlhy moze byt ? Vid vyssie spominana dlzka riadku - je dvojbajtova, takze ten strojak moze mat potencialne az temer 64 kB :) Teoreticky je to obmedzene len volnym miestom v basicu, to zistis pomocou PRINT 65535 - USR 7962. A prakticky tym na kolko tukania acok mas trpezlivost ;)

Este poznamka k tej adrese 23755: Tu zacina basic vzdy, ked nemas ku Spektru pripojenu nejaku periferiu, ktora si ten zaciatok basicu posuva. Napriklad Inteface1 alebo cokolvek s TRDOSom. Bezne u nas rozsirene systemy (bsdos, mdos, demfir, fatware, dosy pre +D a Disciple) basic neposuvaju. Ak chces mat uplnu istotu v kde ten basic presne lezi aj v pripade systemov posuvajucich basic, presnu adresu zaciatku basicu zistis takto: PEEK 23635 + 256 * PEEK 23636


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Stroják za REM
PříspěvekNapsal: 17.09.2013, 22:28 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Pre zaujimavost, takto vyzera zdrojak mojej utilitky "USR 0" ktora prepne basic do USR 0 rezimu a nahra nasledujuci program (vyzadujuci beh v USR 0 rezime), takze clovek to nemusi robit rucne ked sa nachadza v 128 alebo +3 basicu.

Ale teraz nie je podstatne co to robi, ale zaujimave je prave to ulozenie strojaku priamo v basicovom bloku. Krasne na nom vidno, ze strojak v basicu sa nemusi schovavat len do REM-u (kde robi psie kusy pri listingu), ale da sa schovat uplne, tak ze prikaz LIST ho vobec neukaze a clovek ma pocit, ze je to cisty regulerny basic :)

Kód:
16   0000                     org     #5CCB
17   5CCB             
18   5CCB 00 00 24 00 begin   dw      0,length-4      ;; line number, line length
19   5CCF F7 C0 38 0E         db      #F7,#c0,'8',#0E ;; RUN USR 8
20   5CD3 00 00 DD 5C         dw      0,runusr        ;; 5 byte number after code 14
21   5CD7 003AEF2222          db      0,':',#EF,'""'  ;; : LOAD ""
22   5CDC 0D                  db      #0D             ;; end of line (no next line)
23   5CDD             
24   5CDD FD CB 01 A6 runusr  res     4,(iy+#01)      ;; Switch to 48 basic
25   5CE1 2A B2 5C            ld      hl,(ramtop)     ;; Recontruction of stack for 48 basic
26   5CE4 36 3E               ld      (hl),#3E        ;; End-of-stack mark for basic RETURN
27   5CE6 2B                  dec     hl              ;; (for detect RETURN without GOSUB)
28   5CE7 F9                  ld      sp,hl
29   5CE8 21 03 13            ld      hl,#1303        ;; Standart error handler
30   5CEB E5                  push    hl              ;; (for displaying error messages)
31   5CEC ED 73 3D 5C         ld      (errsp),sp
32   5CF0 C3 28 1B            jp      runbas          ;; Continue in 48 basic interpreter
33   5CF3             
34   5CF3             endend
35   5CF3             length  =       endend-begin
36   5CF3             
37   5CF3             errsp   =       #5C3D
38   5CF3             ramtop  =       #5CB2
39   5CF3             runbas  =       #1B28
Funguje to takto: Na zaciatku je dva bajty cislo riadku 0, potom dva bajty dlzka riadku (tu nam vyrata kompiler), potom nasleduje #F7 co je prikaz RUN. Vo vseobecnoti je jedno aky prikaz tu bude, podstatne je ze potrebuje jeden parameter vdaka ktoremu bude vykonana nasledujuca funkcia USR (kod #C0). Za funkciu USR nasleduje nejake cislo, zase je uplne jedno ake, pretoze basic pri behu cislice preskoci a nacita az 5 bajtovu definiciu cisla za kodom #0E. Realna hodnota cisla bude navestie "runusr", ktoreho hodnotu nam znovu vypocita kompiler. Takze vysledkom tohto kusu basicu bude to ze sa nam spusti strojak od adresy "runusr". A teraz pozor, basic riadok konci bajtom #0D. Ak za tymto bajtom nasleduje bajt vecsi ako 127, prikaz LIST si mysli ze je to uplny koniec basicu (ze dalej nasleduju premenne) a dalej uz nic nevypisuje - a to je to tajomstvo vdaka ktoremu LIST neukaze strojak schovany v basicu ;)

A cele je to vlastne aj priklad toho ako sa da napisat basicovy program v asemblerovom kompileri :bulb:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Stroják za REM
PříspěvekNapsal: 18.09.2013, 17:15 
Online
Radil
Uživatelský avatar

Registrován: 13.05.2013, 17:48
Příspěvky: 531
Bydliště: Košice
Has thanked: 430 times
Been thanked: 265 times
Busy píše:
Este poznamka k tej adrese 23755: Tu zacina basic vzdy, ked nemas ku Spektru pripojenu nejaku periferiu, ktora si ten zaciatok basicu posuva. Napriklad Inteface1 alebo cokolvek s TRDOSom. Bezne u nas rozsirene systemy (bsdos, mdos, demfir, fatware, dosy pre +D a Disciple) basic neposuvaju. Ak chces mat uplnu istotu v kde ten basic presne lezi aj v pripade systemov posuvajucich basic, presnu adresu zaciatku basicu zistis takto: PEEK 23635 + 256 * PEEK 23636


Iba upresním, že MDOS posúva začiatok BASICu pri otváraní kanálov pre čítanie/zápis sekvenčných súborov. Ak si to dobre pamätám, tak je to 544 bytov na kanál.
Nič to ale samozrejme nemení na tom, že za normálnych okolností skutočne BASIC začína na adrese 23755 a systémová premenná na adrese 23635 "rieši všetko".

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Stroják za REM
PříspěvekNapsal: 24.11.2013, 14:06 
Offline
Radil

Registrován: 18.10.2013, 15:30
Příspěvky: 263
Bydliště: Oakland, Slovakia
Has thanked: 25 times
Been thanked: 60 times
Busy píše:
A aky dlhy moze byt ? Vid vyssie spominana dlzka riadku - je dvojbajtova, takze ten strojak moze mat potencialne az temer 64 kB :) Teoreticky je to obmedzene len volnym miestom v basicu, to zistis pomocou PRINT 65535 - USR 7962. A prakticky tym na kolko tukania acok mas trpezlivost ;)


A pokial nemas trpezlivost, pripadne potrebujes riadok dlhsi nez obrazovka tak mozes pouzit aj nasledujuci program, ktory okrem inych uzitocnych funkcii pre programatorov v BASICu obsahuje aj nastroj na vytvaranie (takmer) lubolne dlhych riadkov s REM.
Kód:
http://www.worldofspectrum.org/infoseekid.cgi?id=0027000

_________________
Didaktik Gama | ZX Spectrum 128 | ZX Diskface Quick A | BetaDisk 128C Interface | D40 & D80 | divIDE | Interface M/P | Multiface 128 (GOTDJ) | Gama Breaker | D80mini

"Kvalita a stabilita Windows XP se Microsoftu nevyplatila, stal se takovou temnou připomínkou toho, co se stane, když odvedete svou práci moc dobře."


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 6 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 8 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz