Pohodlny prenos parametrov z basicu do strojaku

Tipy a triky v assembleri a v BASICu. Prosby o rady pri programovaní.
Správa
Autor
Busy
Príspevky: 330
Dátum registrácie: Po Nov 25, 2013 9:11 pm
Bydlisko: Bratislava
Kontaktovať používateľa:

Pohodlny prenos parametrov z basicu do strojaku

#1 Príspevok od používateľa Busy » So Apr 02, 2016 4:56 pm

Pokial potrebujete preniest nejake hodnoty z basicu do strojaku, obvykle na to pouzijete POKE. V basicu spravite POKE add1,parameter1 : POKE add2,parameter2 ... a strojak si potom parametre nacita z prislusnych adries. Existuje vsak aj ovela elegantnejsi sposob - napisat parametre priamo za volanie strojaku funkciou USR a strojak si parametre sam precita priamo s basicoveho programu. Ideologicky by to vyzeralo nejak takto:

RANDOMIZE USR addr, parameter1, parameter2

Toto by bolo super, ale je tu jeden mensi problem. A tym je syntaxna kontrola basicu pri odosielani riadku. Prikaz RANDOMIZE vyzaduje iba jeden parameter a pri pokuse o pouzitie viac parametrov riadok nepojde odoslat. Istou moznostou je pouzitie prikazu PRINT namiesto RANDOMIZE, lenze a) obcas nie je vhodne vysledok funkcie USR vypisovat na obrazovku, b) ak potrebujeme vysledok funkcie USR dalej spracovavat (potrebujeme vediet hodnotu vratenu do basicu), prikaz PRINT aj tak nemozeme pouzit.

Jednym zo sposobov, ako zachovat vratenu hodnotu zo strojaku, a zaroven "oklamat" syntaxnu kontrolu basicu, je napriklad takyto:

LET a=USR addr: PRINT Parameter1,Parameter2

Syntaxna kontrola basicu si bude mysliet, ze jej davame dva samostatne prikazy oddelene dvojbodkou - prvym je volanie strojaku a ulozenie vysledku do premennej A, a druhy je vypis dvoch ciselnych hodnot. Ale po zavolani naseho strojaku sa staneme panmi situacie my, basic osvindlujeme tak ze dvojbodku a prikaz PRINT preskocime, nacitame si obidva parametre a vykoname co treba. A po navrate zo strojaku basic obabreme tak aby normalne pokracoval dalsimi prikazmi nasledujucimi za PRINTom.

A takto vyzera strojak, ktory toto vsetko urobi:

Kód: Vybrať všetko

14   8000 DF          addr    rst     #18     ;; Vrat aktualny znak v basicu
15   8001 FE 3A               cp      ':'     ;; Musi to byt dvojbodka
16   8003 20 21               jr      nz,error ; Ak nie je, skok na chybu
17   8005 E7                  rst     #20     ;; Posun na dalsi znak v basicu
18   8006 FE F5               cp      #F5     ;; Musi to byt prikaz PRINT
19   8008 20 1C               jr      nz,error ; Ak nie je, skok na chybu
20   800A E7                  rst     #20     ;; Posun na prvy znak prveho parametra
21   800B CD FB 24            call    #24FB   ;; Vyhodnotenie hodnoty prveho parametra
22   800E CD 99 1E            call    #1E99   ;; Ulozenie hodnoty parametra do BC
23   8011 C5                  push    bc      ;; Uschova prveho parametra na stack
24   8012 DF                  rst     #18     ;; Vrat aktualny znak za prvym parametrom
25   8013 FE 2C               cp      ','     ;; Musi to byt ciarka
26   8015 20 0F               jr      nz,error ; Ak nie je, skok na chybu
27   8017 E7                  rst     #20     ;; Posun na prvy znak druheho parametra
28   8018 CD FB 24            call    #24FB   ;; Vyhodnotenie hodnoty druheho parametra
29   801B CD 94 1E            call    #1E94   ;; Ulozenie hodnoty druheho parametra do A
30   801E             
31   801E 5F                  ld      e,a     ;; Druhy parameter do DE
32   801F 16 00               ld      d,#00
33   8021 E1                  pop     hl      ;; Prvy parameter do HL
34   8022 19                  add     hl,de
35   8023 44                  ld      b,h
36   8024 4D                  ld      c,l     ;; Sucet parametrov do BC
37   8025 C9                  ret             ;; Navrat z USR s navratovou hodnotu BC
38   8026             
39   8026 CF          error   rst     #08     ;; Chybove hlasenie
40   8027 0B                  db      #0B     ;; Nonsence in basic
Parameter1 sa nacita do registra BC (vhodne pre cisla v rozsahu 16 bitov), parameter2 sa nacita do registra A (vhodne pre 8-bitove cisla). Ako parametre mozno pouzit lubovolne ciselne vyrazy, vratane pouzitia premennych. Pri nacitavani parametrov su osetrene maximalne rozsahy hodnot, t.j. 16-bit hodnota musi byt v rozsahu 0..65535, 8bitova v rozsahu 0..255. Ak budu tieto rozsahy prekrocene, vypise sa standartne chybove hlasenie Integer ouf of range.

Od adresy #801E je potom priklad pouzitia parametrov nacitanych z basicu - funkcia USR vrati v BC ich sucet.

Kontroly ci sme v basicu narazili na dvojbodku, prikaz PRINT a na ciarku, mozeme kludne vynechat, z hladiska samotneho fungovania nacitania parametrov nie su dolezite. Dolezity je len samotny posun na dalsi znak v basicu pomocou RST #20.

Používateľov profilový obrázok
rombor
Príspevky: 33
Dátum registrácie: Ut Okt 08, 2013 1:28 pm

Re: Pohodlny prenos parametrov z basicu do strojaku

#2 Príspevok od používateľa rombor » Ne Apr 03, 2016 4:09 pm

Podobnú záležitosť som popisoval tiež tuto: viewtopic.php?f=15&t=52&p=372#p372

Busy
Príspevky: 330
Dátum registrácie: Po Nov 25, 2013 9:11 pm
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Pohodlny prenos parametrov z basicu do strojaku

#3 Príspevok od používateľa Busy » Ne Apr 03, 2016 5:20 pm

Ano, volat strojak s parametrami pomocou FN je elegantnejsie a take "objektovejsie". Ale tento sposob so sebou prinasa pre basic program povinnost zabezpecit, aby vsetky ciselne parametre boli cele kladne cisla v rozsahu 0..65535. Akonahle tato podmienka nie je splnena, a do parametra FN sa dostane cislo zaporne, desatinne alebo vecsie ako 65535, tak hodnota nacitana v strojaku uz nebude povodnej hodnote parametra zodpovedat. Moj (pramociarejsi) sposob vsetky tieto situacie osetruje uz implicitne - desatine cisla automaticky zaokruhli na najblizsie cele cislo a ak cislo nie je kladne a v rozsahu podla zvoleneho cieloveho registra (BC alebo A) tak automaticky vygeneruje chybu Integer out of range.

Napísať odpoveď