rozkaz z80 LDIR dziala mniej wiecej tak:
sprawdza czy BC (16 bitowy licznik B-starszy bajt, L-mlodszy) jest rowny zero, jesli tak to PC zwieksza o dwa (rozkaz 2bajtowy) i koniec, jesli nie to przesyla jeden bajt z adresu wskazywanego przez HL (H starszy, L mlodszy) do komorki wskazanej przez rejestr DE, zwieksza HL i DE o jeden, zmniejsza BC o jeden, PC zmniejsza o dwa i koniec. w tym miejscu BC = 0. jeden przebieg petli LDIR to 21 cykli, 16 jesli BC=0.
pomyslalem ze mozna pominac ta cala zabawe z kazdorazowym ustawieniem pc, tak zeby emulator musial wielokrotnie dekodowac ten rozkaz i wyszlo mi cos takiego:
_ed_b0 equ * ; LDIR
ldx z80_c
beq _ed_b02
_ed_b05 ldy #0
_ed_b03 lda (z80_hl),y
sta (z80_de),y
iny
dex
bne _ed_b03
stx z80_c
sty temp_z
bne _ed_b01
dec temp_z
_ed_b01 clc
lda z80_l
adc temp_z
sta z80_l
lda z80_h
adc #0
sta z80_h
clc
lda z80_e
adc temp_z
sta z80_e
lda z80_d
adc #0
sta z80_d
_ed_b02 lda z80_b
beq _ed_b04 ; koniec
dec z80_b
jmp _ed_b05 ; kopiuj
_ed_b04 equ *
zdaje sobie sprawe ze kod moze byc bledny i/lub wolny, gdyby tak ktos rzucil okiem i moze pomogl zoptymalizowac