Welcome, Guest. Please login or register.


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

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1110 on: 2023.December.09. 22:37:49 »
Tegnap olvastam egy weboldalon, hogy a korábban említett illegális opkód, mint a "ED után ha C0 ... FF"
Akkor azt úgy fogja kezelni, mintha 2 nop lenne.

Offline Ferro73

  • EP addict
  • *
  • Posts: 1016
  • Country: hu
Re: Assembly programozás
« Reply #1111 on: 2023.December.10. 13:24:57 »
Roppant egyszerű ha van eredeti "valós" géped elindítod az ASMON-t
Editbe beírod
Code: [Select]
org 1000h
 ...
 ...
 DB 0EDh,xx
 RET
 RET
 RET
 RET
 END
lefordítod
Futtatod vagy "track" olod a vissza téréskor ellenőrzöd a változásokat a regisztereknél.
A változásból következtethetsz mi lehetett az utasítás.
Én így kerestem amikor olyan kódot találtam a játékprogram átírásánál.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1112 on: 2023.December.10. 16:56:35 »
Hogy lehet track-olni asmonban?

Offline Ferro73

  • EP addict
  • *
  • Posts: 1016
  • Country: hu
Re: Assembly programozás
« Reply #1113 on: 2023.December.10. 19:50:53 »
Bocsi régen használtam "TRACE memory"

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1114 on: 2023.December.20. 02:19:40 »
z88dk a következő assembly kódot generálta
Amit nem értek, a ".i_63" alatt 4 sorral a CCF utasítás. Elvégzi a kivonást, majd törli a flaget, végül ugrik, ha Carry=0. Márpedig a Carry a CCF után nulla lesz.

Code: [Select]
ld hl,0 ;const
add hl,sp
inc (hl)
.i_63
ld h,0
ld a,2
sub l
ccf
jp nc,i_62 ;
ld hl,(_Control)
ld h,0
ex de,hl
ld h,0
call l_eq
jp c,i_65 ;
ld hl,(_Control+1)
ld h,0
ex de,hl
ld h,0
call l_eq
jp nc,i_64 ;
.i_65
ld de,_Joy
ld h,0
add hl,de
push hl
ld hl,105 ;const
push hl
ld l,4
add hl,sp
ld l,(hl)
ld h,0
push hl
call _Get_Joy
pop bc
pop bc
pop de
ld a,l
ld (de),a
jp i_61 ;EOS
.i_62
inc sp
ret

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1349
  • Country: hu
  • Stray cat from Commodore alley
Re: Assembly programozás
« Reply #1115 on: 2023.December.20. 06:15:55 »
Nagyon nem vagyok képben a Z80-nal, de véletlenül nem azért van, hogy ne kelljen abszolút ugrást használnia, hanem elég legyen a relatív? Ilyesféle abúzust én is követek el időnként 6502 assemblyben.

Offline Povi

  • EP addict
  • *
  • Posts: 2322
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #1116 on: 2023.December.20. 09:00:16 »
z88dk a következő assembly kódot generálta
Amit nem értek, a ".i_63" alatt 4 sorral a CCF utasítás. Elvégzi a kivonást, majd törli a flaget, végül ugrik, ha Carry=0. Márpedig a Carry a CCF után nulla lesz.
A CCF nem clear carry flag, hanem COMPLEMENT carry flag.
Azaz invertálja a carry-t. Így már van értelme utána a JP NC utasításnak.
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2322
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #1117 on: 2023.December.20. 09:01:17 »
ne kelljen abszolút ugrást használnia, hanem elég legyen a relatív?
A JP az abszolút ugrás, a JR lenne a relatív. (Jump Relative)
*** Speicherplatz zu klein

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1118 on: 2023.December.20. 14:58:33 »
Miért kell a Carry Flag-et invertálni? Nem elég JUMP NC helyett JUMP C-t használni?

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1119 on: 2023.December.20. 15:56:31 »
Közben olvasom valahol, hogy
OR A - törli a CARRY-t
SCF - beállítja a CARRY-t
CCF - Invert Carry

Gondolom azért választottak utóbbinak ilyen hülye nevet a ZILOG-nál, mert ezzel akarták bizonyítani, hogy nem hasonlít az Intel 8080-ra a Z80 :D

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1120 on: 2024.January.02. 22:43:09 »
Egy 76KB-os fájlt szeretnék betölteni a F4-F5-F6-F7-F8 szegmensekre.
Valaki megosztana egy gépi kódot, ezt hogyan tehetem meg?
A program a nullás lapon lenne, és a 1-es lapra lenne belapozva a F4 majd az F5... stb.

Köszönöm!

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1121 on: 2024.January.03. 00:51:20 »
Közben megvan. Kicsit összezavarodtam azon, hogy EXOS 1 vagy 2 kell-e. De aztán azt mutatta a teszt, hogy 1 az olvasáshoz, 2 pedig íráshoz van.
Ezen kívül ki kellett lesnem, hogy a fájl név hossza az hogyan van meghatározva. Hát úgy, hogy az első byte adja meg a hosszát.
Nem ellenőrzök exos visszatérési értéket, mea culpa.

Code: [Select]
                ORG 1000H

                ;open file for read
                LD DE,fname
                LD A,10 ; channel NR 10
                EXOS 1

                ;page segment F4 to 1.page
                LD A,0F4h  ; first segment
chpage          PUSH AF

                LD c,0B1h
                OUT (c),A ; page segments F4..F5..F6.. etc to 1.page

                ;load file to the selected segment
                LD DE,04000H
                LD BC,04000H
                LD A,10
                EXOS 6

                POP AF
                INC A
                CP 0F9h ; until F8
                JR  C,chpage

                LD A,10 ; close channel
                EXOS 3
                RET

                NOP
                NOP
fname           DEFB 11,"TST4_EP.BMP"  ; file name with lenght
                NOP
                NOP

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14779
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #1122 on: 2024.January.04. 10:31:25 »
Quote
                LD c,0B1h
                OUT (c),A ; page segments F4..F5..F6.. etc to 1.page
Így egyszerűbb, és két bájttal rövidebb:
OUT (0B1h),A

További tippek:
0-ás csatorna használata, ezáltal az EXOS hívásoknál az LD A,n utasítás helyett XOR A használható, ami egy bájttal rövidebb.
Ha pedig majd hibakezelés is teszel bele, akkor az EXOS hívás után lesz egy JP vagy JR NZ, ami után (a nincs hiba esetben) 0 lesz az A-ban, tehát azt már nem kell megadni, így a XOR A is megspórolható.
Példa:
Code: ZiLOG Z80 Assembler
  1. XOR A
  2. LD DE,FILENAME
  3. EXOS 1
  4. JR NZ,ERROR
  5. LD BC,LENGTH
  6. LD DE,START
  7. EXOS 6
  8. JR NZ,ERROR
  9. EXOS 3

A másik a ciklus változó használata. Ezt a veremben mented el, így a PUSH/POP kétszer 2 bájtos memória hozzáférést eredményez.
Célszerűbb a háttér A használata, az EX AF,AF' esetén nincs memóriaművelet, csak CPU-n belüli, így jóval kevesebb órajel alatt végrehajtódik.
Másik megoldás, hogy ott van még a HL regiszter szabadon, amit nem érintenek az EXOS hívások, így az L használható ciklusváltozónak. A regiszterek közti LD szintén gyorsabb, és egyet megspórolunk, mert végén lehet közvetlen INC L, így csak az OUT elé kell (a PUSH helyére) kell egy LD A,L, így egy bájttal rövidebb is lesz a programkód.
Code: ZiLOG Z80 Assembler
  1.                 LD DE,fname
  2.                 XOR A ; channel NR 0
  3.                 EXOS 1
  4.  
  5.                 ;page segment F4 to 1.page
  6.                 LD L,0F4h  ; first segment
  7. chpage          LD A,L
  8.  
  9.                 OUT (0B1h),A ; page segments F4..F5..F6.. etc to 1.page
  10.  
  11.                 ;load file to the selected segment
  12.                 LD DE,04000H
  13.                 LD BC,04000H
  14.                 XOR A
  15.                 EXOS 6
  16.  
  17.                 INC L
  18.                 CP 0F9h ; until F8
  19.                 JR  C,chpage
  20.  
  21.                 XOR A ; close channel
  22.                 EXOS 3
  23.                 RET

Összesen 6 bájt megspórolva. Nyilván jelen esetben tök mindegy :lol: de jobb már ez elején rászokni rövidebb és gyorsabb kód írására!

Offline Tuby128

  • EP addict
  • *
  • Posts: 1487
  • Country: hu
Re: Assembly programozás
« Reply #1123 on: 2024.January.04. 15:05:05 »
Emlékeztet a programozási fogások és melléfogások rovatra az ENTERPRESS-ből :D
Köszönöm a tippeket. Nem is gondoltam volna, hogy 0-ás csatorna van. Basicben is megadhatom?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14779
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #1124 on: 2024.January.04. 15:26:18 »
Nem is gondoltam volna, hogy 0-ás csatorna van. Basicben is megadhatom?
Már maga a BASIC használja, az EDITOR van 0-ásnak nyitva.