Welcome, Guest. Please login or register.


Author Topic: Assembly programozás (Read 253705 times)

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #240 on: 2011.October.27. 12:06:02 »
OK, ez a megoldás tetszik!

EP-zni meg igazin kell, nem emulátoron! :-)

de azért nem lenne rossz frissíteni a file.rom-ot! :-)
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #241 on: 2011.October.27. 16:21:55 »
Van-e valami megoldás, hogy az EXOS-t megkérdezzük, mi az alapértelmezett eszköz, és ha az nem TAPE:, akkor írjon?

Ha nem is tökéletes megoldás, azt egyszerűen le lehet kérdezni, hogy van-e EXDOS a rendszerben. '"EXDOS", 0FDh' parancsot kell kiadni, és ha sikeres, akkor van EXDOS, tehát menthető a file. Ilyenkor biztosan nem a TAPE: az alapértelmezett, mert vagy a DISK:, vagy a FILE: alapértelmezetté teszi magát a bővítők inicializálásakor (így a program indításakor is). Probléma a FILE: + TAPE: rendszernél van, mert ilyenkor ugyan lehetne menteni ha a FILE: az alapértelmezett, de ez a módszer nem ismeri fel.

Viszont ezzel felfedeztem egy hibát a FILEIO.ROM-ban: nem fájl-orientált eszköznek mutatja magát. (Azaz marad a 3-as változó értéke 0 mint a TAPE esetén.)

Az EXOS leírás alapján nem voltam biztos abban, hogy ezt be kell-e állítani :oops:

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #242 on: 2011.October.29. 23:47:15 »
Felfedeztem egy nagyobb problémát is a FILEIO-val  :oops:
HEASS MERGE-jé nem fut le, *** Call not supported by this device hibával.

Áthidaló megoldás, ha valaki ilyenbe fut bele: egy BAT fájlt kell csinálni, ami a beillesztendõ fájlokat bemásolja RAMDISK-be, majd a forrásszövegben onnan MERGE-zünk.
« Last Edit: 2011.October.30. 00:00:42 by Zozosoft »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #243 on: 2011.October.30. 07:17:17 »
Felfedeztem egy nagyobb problémát is a FILEIO-val  :oops:
HEASS MERGE-jé nem fut le, *** Call not supported by this device hibával.

Pontosan milyen EXOS hívást hiányol ? A FILE: gyakorlatilag azokat a funkciókat tudja, amiket a TAPE:, csak gyorsabb :) Talán az aktuális file pozíció olvasása és állítása kellene, amit nem valósítottam meg, mert a leírás alapján nem voltam egészen biztos abban, hogy ennek pontosan hogyan kellene működnie (paraméterek, hibák, stb.) :oops:

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #244 on: 2011.October.30. 07:50:22 »
Pontosan milyen EXOS hívást hiányol ? A FILE: gyakorlatilag azokat a funkciókat tudja, amiket a TAPE:, csak gyorsabb :)
EXOS 10-t használ a fájlméret beolvasásához:
Code: ZiLOG Z80 Assembler
  1.                 LD DE,BUFFER
  2.                 LD A,13
  3.                 EXOS 1
  4.                 RET NZ
  5.                 LD A,13
  6.                 LD C,0
  7.                 LD DE,BUFFER
  8.                 EXOS 10
  9.                 RET NZ
  10.                 BIT 1,C
  11.                 RET Z
  12.                 LD HL,(BUFFER+4)
  13. SIZEINC:        EX DE,HL
  14.                 LD HL,(SIZE)
  15.                 ADD HL,DE
  16.                 LD (SIZE),HL
Mondjuk ezt is javítani kéne, hogy 64K-nál nagyobb fájlt ne fogadjon el. (+6,7. bájtok vizsgálata)
« Last Edit: 2011.October.30. 09:34:04 by Zozosoft »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #245 on: 2011.October.30. 09:33:25 »
Talán az aktuális file pozíció olvasása és állítása kellene, amit nem valósítottam meg, mert a leírás alapján nem voltam egészen biztos abban, hogy ennek pontosan hogyan kellene mûködnie (paraméterek, hibák, stb.) :oops:
Próbálgattam a funkciót, hogy az EXDOS hogyan kezeli:
-a megadott 16 bájtos puffer visszatéréskor mindig frissitve van, 0-3 a fájlmutató, 4-7 a fájlméret, többi bájt 0
-védelmi bájttal nem sikerült semmit kezdeni, mindig 0 marad, és mindig érvénytelen
-visszatéréskor C=3,azaz mutató és méret érvényes. Nem sikerült érvénytelenséget kiprovokálni.
-fájmegnyitás után (EXOS 1&2) a mutató 0 lesz, a méret megnyitás (1) esetén az aktuális méret, létrehozás (2) esetén 0
-a mutatót szabadon lehet állítgatni, a következõ olvasás vagy írás a megadott pozíciótól fog kezdõdni
-ha a mutatót a fájl vége után állítjuk, akkor olvasáskor értelemszerûen EOF hiba lesz, íráskor a fájl automatikusan megnõ a szükséges mérettel, a beszúrt plusz bájtok tartalma nem definiált. Tehát ha pl létrehozunk egy új fájlt, átállítjuk a mutatót 199999-re, majd beleírunk 1 bájtot, akkor kapunk egy 200000 bájtos fájlt. 

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #246 on: 2011.November.01. 10:35:24 »
Az EXDOS-ban van ez a osztórutin. De hogy mûködik?  :oops: Osztás helyett szoroz...
Code: ZiLOG Z80 Assembler
  1.                 ;DE=DE/C
  2.  
  3. le2af:  PUSH    BC
  4.         LD      B,10H
  5.         XOR     A
  6. le2b3:  SLA     E
  7.         RL      D
  8.         RLA    
  9.         CP      C
  10.         JR      C,LE2BD                
  11.         SUB     C
  12.         INC     E
  13. le2bd:  DJNZ    LE2B3                  
  14.         POP     BC
  15.         RET

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #247 on: 2011.November.01. 11:07:46 »
Az EXDOS-ban van ez a osztórutin. De hogy mûködik?

Egyszerűen :)
    A   |    D   |    E
0000000x|xxxxxxxx|xxxxxxxy
000000xx|xxxxxxxx|xxxxxxyy
00000xxx|xxxxxxxx|xxxxxyyy
0000xxxx|xxxxxxxx|xxxxyyyy
000xxxxx|xxxxxxxx|xxxyyyyy
00xxxxxx|xxxxxxxx|xxyyyyyy
0xxxxxxx|xxxxxxxx|xyyyyyyy
xxxxxxxx|xxxxxxxx|yyyyyyyy
xxxxxxxx|xxxxxxxy|yyyyyyyy
xxxxxxxx|xxxxxxyy|yyyyyyyy
xxxxxxxx|xxxxxyyy|yyyyyyyy
xxxxxxxx|xxxxyyyy|yyyyyyyy
xxxxxxxx|xxxyyyyy|yyyyyyyy
xxxxxxxx|xxyyyyyy|yyyyyyyy
xxxxxxxx|xyyyyyyy|yyyyyyyy
xxxxxxxx|yyyyyyyy|yyyyyyyy

Ugyanúgy működik, mint ahogy 10-es számrendszerben kell osztani (illetve még egyszerűbb is, mert egy számjegy csak 0 vagy 1 lehet). Balról jobbra bitenként megnézi, hogy az ADE felső 8 bitje nagyobb vagy egyenlő-e C-vel, és ha igen, akkor kivonja a C-t és 1 bitet léptet be, egyébként 0 bitet.
« Last Edit: 2011.November.01. 11:15:47 by IstvanV »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #248 on: 2011.November.01. 11:58:22 »
Ezek az IS fiúk tudtak valamit!  :smt038

Offline Attus

  • EP addict
  • *
  • Posts: 1225
  • Country: hu
Re: Assembly programozás
« Reply #249 on: 2011.November.01. 18:05:47 »
Gyönyörû!
 :)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Assembly programozás
« Reply #250 on: 2011.November.01. 19:04:40 »
annak idejen egy kozeli falubol valo traktoros magyarazta el nekem ennek az osztasi modszernek az elvet, es a szorzaset is.

( azt is lehet hasonlo modon bitek szamatol fuggo idoben elvegezni, nem pedig soxor osszeadni, ahogy itt az osztasnal is lehetne soxor kivonni, csak az az esetek tobbsegeben lassabb ),

de aztan a vegen valahogy megsem lettek hasznalva, az egyszeri demo programozonak altalaban mindig olyan tablazatokat kell epitenie a kello futasi sebesseghez, amiben a szamitasok mar mind benne vannak, sajna ep- n nem engedhette meg maganak az ember az algoritmikus szorozgatast osztogatast valosideju cuccokban

na de visszaterve,

mikor ez meg nem tristalyosodott ki bennem, akkor magamtol persze az osszeadogatos ill. kivonogatos modszerekig jutottam el, es ugye akkoriban ott a halal *szan nem errol szolt az elet, es kepzelhetitek a meglepetesem, mikor ganyehordas kozben, egy erdeklodo kerdesre, hogy halotta hogy en igy "szamitogepezek", gondoltam megpenditem neki a szorzas/osztas problemajat, akkor majd leszall rolam, es nem kezd el traktalni hogy ez az egesz mar mekkora hulyeseg, es akkor a ganesvilla masik oldalarol elkezdi nekem tolni a traktoros, hogy hogyan kell csinalni ... :) !


Z80 System

Offline endi

  • EP addict
  • *
  • Posts: 7298
  • Country: hu
  • grafikus, játékfejlesztõ, programozás, scifi, tudományok, vallás
    • Honlapom
Re: Assembly programozás
« Reply #251 on: 2011.November.02. 00:14:44 »
hehe, ez jó
Vigyázat! Szektás vagyok! :)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #252 on: 2011.November.06. 22:26:59 »
Találós kérdésként egy icipici apróság az EXDOS kódjából:
Mi értelme az ilyen programszerkezetnek? A példában kitalált címekkel, az elv a lényeg.
Code: ZiLOG Z80 Assembler
  1. D000H  JR NZ,0D040H
  2. ...
  3. D040H  JP NZ,0E123H

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #253 on: 2011.November.06. 22:37:16 »
Mi értelme az ilyen programszerkezetnek? A példában kitalált címekkel, az elv a lényeg.

Helymegtakarítás ? A JR utasítás rövidebb, mint a JP, és ha sok egymáshoz közeli helyről kell ugyanarra a távoli címre ugrani (pl. hiba esetén), akkor elég csak egy JP, a többi ugrás pedig lehet JR a JP-re. Ilyen megoldást én is használtam néhány byte megtakarítására :)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #254 on: 2011.November.06. 23:17:04 »
Helymegtakarítás ? A JR utasítás rövidebb, mint a JP, és ha sok egymáshoz közeli helyrõl kell ugyanarra a távoli címre ugrani (pl. hiba esetén), akkor elég csak egy JP, a többi ugrás pedig lehet JR a JP-re.
Gyors megfejtés volt!  :smt038
Pontosan így van, itt is funkcióhívások után "kilépés ha hiba" célokra van használva.
Az ember általában végrehajtás szerinti legrövidebb kódra törekszik, ezért nem jut egybõl eszébe ez a bájtfaragó módszer.

Másik gyakran használt módszerük, hogy amikor egy elágazás mindkét ágán valami egyszerû 1-2 bájtnyi utasítás kell végrehajtani, akkor szintén meg lehet spórolni úgy 1 bájtot, hogy az elsõ ág végén nem egy JR-rel ugorjuk át a második ágat, hanem egy töltelék bájttal valami a program szempontjából semleges utasítás paraméter bájtjaivá teszik. Példa:
Code: ZiLOG Z80 Assembler
  1.         BIT     7,L            
  2.         JR      NZ,LC346        ;ugrás, ha írásra kell nyitni
  3.         EXOS    01H             ;csatorna nyitás olvasásra
  4.         DB 01H  ;töltelék bájt, hogy az utána következõ EXOS 2 ne fusson le
  5. LC346:  EXOS    02H             ;csatorna nyitás írásra

Itt ha az olvasás ág fut le, akkor egy
Code: ZiLOG Z80 Assembler
  1. LD BC,02F7H
utasítás fog az EXOS 2 helyett végrehajtódni. Hagyományos kódolással egy JR C348h lenne a DB 01h helyett, ami 1 bájttal hosszabb.
Legtöbbször valamilyen LD utasítással játsszák el ezt, de ha nincs elrontható regiszter, akkor egy feltételes JP kódjai is lehet, ha van olyan feltétel ami tuti nem teljesül, így nem fog elugrani a kapott kamu címre. Erre is egy példa:
Code: ZiLOG Z80 Assembler
  1.         JR      NZ,LE40E        ;ugrás ha igen
  2.         RES     1,E             ;Double stepping kikapcsolása
  3.         DB      0C2H            ;töltelékbájt a RES 2 átugrásához JP      NZ,L93CB
  4. LE40C:  RES     2,E             ;SD lemez
  5. le40e:  SET     0,E


Ezek a trükkök a disassemblerek rémálmai  :ds_icon_cheesygrin: