;=================== ОБЫЧНЫЕ КОМАНДЫ ===============
SIM1
;1-байтная, без работы с памятью и SP
LD (sim1),A
EXX
EXA
sim1 NOP
EXA
EXX
_Loop_
SIM1A
;1-байтная, только аккумулятор
LD (sim1A),A
EXA
sim1A NOP
EXA
_Loop_
SIM1LD
;1-байтная ld r,r (без аккумулятора)
LD (sim1LD),A
EXX
sim1LD NOP
EXX
_Loop_
INCSP
LD HL,(_SP)
INC HL
LD (_SP),HL
_Loop_
DECSP
LD HL,(_SP)
DEC HL
LD (_SP),HL
_Loop_
POPBC
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
EXX
POP BC
EXX
_LoopCimmediately
POPDE
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
EXX
POP DE
EXX
_LoopCimmediately
POPHL
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
EXX
POP HL
EXX
_LoopCimmediately
POPAF
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
POP AF
EXA
_LoopC
RETcc
ADD A,2 ;превращаем RET в JP
LD (retcc),A
EXA
retcc JP NZ,RETccY
EXA
_Loop_
RETccY EXA
RETER
imitret
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
LD D,B
ld E,C ;=PC
_LoopC_JP
PUSHBC
EXX
PUSH BC
EXX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopCimmediately
PUSHDE
EXX
PUSH DE
EXX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopCimmediately
PUSHHL
EXX
PUSH HL
EXX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopCimmediately
PUSHAF
EXA
PUSH AF
EXA
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopCimmediately
CALLcc
SUB 2 ;превращаем CALL в JP
LD (callcc),A
EXA
callcc JP NZ,CALLccY
EXA
next
next
_Loop_
CALLccY EXA
CALLER
getHL
CALCpc
EXD ;new PC
LD B,H
ld C,L ;=old PC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC_JP
RSTn
AND #38
LD L,A
ld H,0 ;=PC
CALCpc
EXD
LD B,H
ld C,L ;=old PC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC_JP_NODOS
JRcc
LD (jrcc),A
EXA
jrcc JR NZ,JRccY
EXA
next
_Loop_
JRccY EXA
JRER
get
next
DJNZY LD L,A
RLA
SBC A,A
LD H,A
CALCpc
ADD HL,DE
EXD ;=PC
_LoopJP_NODOS
DJNZER
get
next
EXX
DEC B
EXX
JP NZ,DJNZY
_Loop_
JPcc
LD (jpcc),A
EXA
jpcc JP NZ,JPccY
EXA
next
next
_Loop_
JPccY EXA
JPER
getHL
EXD ;=PC
_LoopJP
EXXER
EXX
PUSH HL
LD H,B
ld L,C
LD BC,(_BC)
LD (_BC),HL
LD HL,(_DE)
EXD
LD (_DE),HL
LD HL,(_HL)
EX (SP),HL
LD (_HL),HL
POP HL
EXX
_Loop_
EXAER
LD HL,(_AF)
PUSH HL
POP AF
EXA
PUSH AF
POP HL
LD (_AF),HL
_Loop_
SIM2
;2-байтная, без работы с памятью
LD L,A
get
next
LD H,A
LD (sim2),HL
EXX
EXA
sim2 DS 2
EXA
EXX
_Loop_
LDBC
getHL ;TODO getBC'
push hl
EXX
pop bc
EXX
_Loop_
LDDE
getHL ;TODO getDE'
push hl
EXX
pop de
EXX
_Loop_
LDHL
getHL ;TODO getHL'
push hl
EXX
pop hl
EXX
_Loop_
LDSP
getHL
LD (_SP),HL
_Loop_
LDAnn
getHL
mem ;портит флаги ;TODO без первого ld a,h
EXA
LD A,(hl)
EXA
_LoopCimmediately
LDHLnn
getHL
getmemBC ;TODO getmemHL' без первого ld a,h
PUSH BC
EXX
POP HL
EXX
_LoopCimmediately
LDMn
get
next
EXX
PUSH HL
EXX
POP HL
putmem ;портит HL
_LoopCimmediately
INCM
EXX
PUSH HL
EXX
POP HL
PUSH HL
mem ;портит HL
ld b,(hl)
POP HL ;TODO rra:ld h,a
EXA
INC B
EXA
LD A,B
putmem ;TODO putmemB
;нельзя mem:INC (HL) - не заработает extpg5
_LoopCimmediately
DECM
EXX
PUSH HL
EXX
POP HL
PUSH HL
mem ;портит HL
ld b,(hl)
EXA
DEC B
EXA
LD A,B
POP HL
putmem
;нельзя mem:INC (HL) - не заработает extpg5
_LoopCimmediately
LDnnA
getHL
EXA
LD C,A
EXA
LD A,C
putmem ;портит флаги ;TODO putmemC
_LoopCimmediately
LDnnHL
getHL
EXX
PUSH HL
EXX
POP BC
putmemBC ;TODO putmemHL'
_LoopCimmediately
LDAbc
exx
push bc
exx
pop hl
mem
EXA
LD A,(hl)
EXA
_LoopCimmediately
LDAde
exx
push de
exx
pop hl
mem
EXA
LD A,(hl)
EXA
_LoopCimmediately
LDbcA
exx
push bc
exx
pop hl
EXA
LD C,A
EXA
LD A,C
putmem
_LoopCimmediately
LDdeA
exx
push de
exx
pop hl
EXA
LD C,A
EXA
LD A,C
putmem
_LoopCimmediately
OUTnA
get
next
LD C,A
EXA
LD B,A
EXA
LD A,B
CALL EMUOUT
_LoopSWI
INAn
get
next
LD C,A
EXA
LD B,A
EXA
CALL EMUIN
;флагов быть не должно!
LD B,A
EXA
LD A,B
EXA
_LoopSWI
DIER
XOR A
LD (iff1),A
LD (iff2),A
_Loop_
EIER
LD A,-1
LD (iff1),A
LD (iff2),A
_Loop_
HALTER
;XOR A
;OUT (-2),A
LD A,I
JP PE,$-2
;_Loop_
NOPER
_Loop_
LOGAM
;1-байтная ADD/ADC/... A,(HL)
LD (logam),A
EXX
PUSH HL
EXX
POP HL
mem ;портит HL
EXA
logam NOP
EXA
_LoopCimmediately
LDMr
;1-байтная LD (HL),r, r<>A
ADD A,8 ;превращаем (HL) в A
LD (ldmr),A
EXX
PUSH HL
ldmr NOP
EXX
POP HL
putmem ;портит HL
_LoopCimmediately
LDMA
EXX
PUSH HL
EXX
POP HL
EXA
LD C,A
EXA
LD A,C
putmem ;портит флаги и HL ;TODO putmemA'
_LoopCimmediately
LDrM
;1-байтная LD r,(HL), r<>A
INC A ;превращаем (HL) в A
LD (ldrm),A
EXX
PUSH HL
EXX
POP HL
getmem ;портит HL
EXX
ldrm NOP
EXX
_LoopCimmediately
LDAM
EXX
PUSH HL
EXX
POP HL
mem ;портит HL
EXA
LD A,(hl)
EXA
_LoopCimmediately
JPM
EXX
PUSH HL
EXX
POP DE ;=PC
_LoopJP
LDSPHL
EXX
LD (_SP),HL
EXX
_Loop_
ADDSP
EXX
PUSH BC
LD BC,(_SP)
EXA
ADD HL,BC
EXA
POP BC
EXX
_Loop_
EXSPHL
LD HL,(_SP)
getmemBC
PUSH BC
EXX
EX (SP),HL
EXX
POP BC
LD HL,(_SP)
putmemBC
_LoopCimmediately
;=================== #CB КОМАНДЫ ===============
CB2
LD (cb2),A
EXX
EXA
DB #CB
cb2 NOP
EXX
EXA
_Loop_
CB2M
;CB команда с параметром (HL)
sub 6 ;превращаем (HL) в B
LD (cb2m),A
EXX
PUSH HL
EXX
POP HL
PUSH HL
mem
ld b,(hl)
EXA
DB #CB
cb2m NOP
EXA
LD A,B
POP HL
putmem
_LoopCimmediately
;=================== #DD #CB КОМАНДЫ ===============
DDCBDOC
;HL=IX+d
;RL/.. (IX+d): DD CB d OPCODE
;BIT n,(IX+d): DD CB d OPCODE
;RES n,(IX+d): DD CB d OPCODE
;SET n,(IX+d): DD CB d OPCODE
sub 6 ;превращаем (HL) в B
LD (ddcbdoc),A
PUSH HL
mem
ld b,(hl)
EXA
DB #CB
ddcbdoc NOP
EXA
LD A,B
POP HL
putmem
DDCBUNDOC
;TODO op r,(iz+d)
_LoopC
;=================== #ED КОМАНДЫ ===============
LDBCnn
getHL
getmemBC ;TODO getmemBC' без первого ld a,h
push bc
exx
pop bc
exx
_LoopCimmediately
LDDEnn
getHL
getmemBC ;TODO getmemDE' без первого ld a,h
push bc
exx
pop de
exx
_LoopCimmediately
LDSPnn
getHL
getmemBC ;TODO без первого ld a,h
LD (_SP),BC
_LoopCimmediately
LDnnBC
exx
push bc
exx
getHL
pop bc
putmemBC ;TODO putmemBC' без первого ld a,h
_LoopCimmediately
LDnnDE
exx
push de
exx
getHL
pop bc
putmemBC ;TODO putmemDE' без первого ld a,h
_LoopCimmediately
LDnnSP
getHL
LD BC,(_SP)
putmemBC ;TODO без первого ld a,h
_LoopCimmediately
SBCHLSP
exa
exx
push bc
LD BC,(_SP)
sbc hl,bc
pop bc
exx
exa
_Loop_
ADCHLSP
exa
exx
push bc
LD BC,(_SP)
adc hl,bc
pop bc
exx
exa
_Loop_
LDIER
EXX
PUSH BC
PUSH DE
PUSH HL
INC HL,DE
DEC BC
EXX
POP HL
getmem
POP HL
putmem
POP BC
PUSH DE
LD D,secbuf/256
LD H,D
LD (HL),A
EXA
LDI ;флаги 3 и 5 устанавливаются по (HL)
EXA
POP DE
_LoopC
LDDER
EXX
PUSH BC
PUSH DE
PUSH HL
DEC HL,DE
DEC BC
EXX
POP HL
getmem
POP HL
putmem
POP BC
PUSH DE
LD D,secbuf/256
LD H,D
LD (HL),A
EXA
LDD ;флаги 3 и 5 устанавливаются по (HL)
EXA
POP DE
_LoopC
LDIRER
EXX
DEC BC
LD A,C
OR B
JP Z,LDIREND
PUSH DE
PUSH HL
INC HL,DE
EXX
POP HL
getmem
POP HL
putmem
CALCpc
DEC DE,DE
;надо бы сделать PE для обработчика прерыв-й
_LoopC_JP_NODOS
LDIREND
PUSH DE
PUSH HL
INC HL,DE
EXX
POP HL
getmem
POP HL
putmem
LD A,(HL)
PUSH DE
LD D,secbuf/256
LD H,D
LD (HL),A
EXA
LD BC,1
LDI ;флаги 3 и 5 устанавливаются по (HL)
POP DE
;PO=конец цикла
EXA
_LoopC
LDDRER
EXX
DEC BC
LD A,C
OR B
JP Z,LDDREND
PUSH DE
PUSH HL
DEC HL,DE
EXX
POP HL
getmem
POP HL
putmem
CALCpc
DEC DE,DE
;надо бы сделать PE для обработчика прерыв-й
_LoopC_JP_NODOS
LDDREND
PUSH DE
PUSH HL
DEC HL,DE
EXX
POP HL
getmem
POP HL
putmem
LD A,(HL)
PUSH DE
LD D,secbuf/256
LD H,D
LD (HL),A
EXA
LD BC,1
LDD ;флаги 3 и 5 устанавливаются по (HL)
POP DE
;PO=конец цикла
EXA
_LoopC
IMn
AND #18
LD (immode),A
_Loop_
ED2
LD (ed2),A
EXX
EXA
DB #ED
ed2 NOP
EXX
EXA
_Loop_
RETIER
RETNER
LD A,(iff2)
LD (iff1),A
JP RETER
OUTCr
RRA
RRA
RRA
AND 7
ADD A,#78 ;превращаем OUT в LD A,r
LD (outcr),A
CP #7E
EXX
outcr NOP
PUSH BC
EXX
POP BC
jr NZ,$+3
XOR A
CALL EMUOUT
_LoopSWI
INrC
ADD A,7 ;превращаем IN в LD r,A
LD (inrc),A
EXX
PUSH BC
EXX
POP BC
EXA
PUSH AF
CALL EMUIN
POP BC
LD C,A
LD A,B
EXA ;с флагами
LD A,C
EXX
inrc NOP
EXX
_LoopSWI
INFC
EXX
PUSH BC
EXX
POP BC
EXA
PUSH AF
CALL EMUIN
POP BC
LD A,B
EXA ;с флагами
_LoopSWI
OUTCA
EXX
PUSH BC
EXX
POP BC
EXA
LD L,A
EXA
LD A,L
CALL EMUOUT
_LoopSWI
INAC
EXX
PUSH BC
EXX
POP BC
CALL EMUIN
EXA ;с флагами
_LoopSWI
RRDER
EXX
PUSH HL
EXX
POP HL
PUSH HL
getmem
LD H,secbuf/256
LD (HL),A
EXA
RRD
EXA
LD A,(HL)
POP HL
putmem
_LoopCimmediately
RLDER
EXX
PUSH HL
EXX
POP HL
PUSH HL
getmem
LD H,secbuf/256
LD (HL),A
EXA
RLD
EXA
LD A,(HL)
POP HL
putmem
_LoopCimmediately
LDIA
EXA
LD (_I),A
EXA
_Loop_
LDRA
EXA
LD (_R),A
EXA
_Loop_
LDAI
EXA
LD A,(iff1) ;??? так в US
OR A ;эмулируется только P/V
LD A,(_I)
EXA
_Loop_
LDAR
EXA
ld hl,_R
ld a,r
xor (hl)
and 0x7f
xor (hl)
ld (hl),a
LD A,(iff2)
OR A ;эмулируется только P/V
LD A,(hl);(_R)
EXA
_Loop_
CPIER
EXX
PUSH BC
PUSH HL
INC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD H,secbuf/256
LD (HL),A
EXA
CPI
EXA
_LoopCimmediately
CPDER
EXX
PUSH BC
PUSH HL
DEC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD H,secbuf/256
LD (HL),A
EXA
CPD
EXA
_LoopCimmediately
CPIRER
EXX
PUSH BC
PUSH HL
INC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD H,secbuf/256
LD (HL),A
CALCpc
EXA
CPI
jr Z,CPIRPO
JP PO,CPIRPO ;PO=конец цикла
DEC DE,DE
CPIRPO EXA
_LoopC_JP_NODOS
CPDRER
EXX
PUSH BC
PUSH HL
DEC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD H,secbuf/256
LD (HL),A
CALCpc
EXA
CPD
jr Z,CPDRPO
JP PO,CPDRPO ;PO=конец цикла
DEC DE,DE
CPDRPO EXA
_LoopC_JP_NODOS
OUTIER
exx
exa
dec b
push bc
push hl
inc hl
exa
exx
pop hl
getmem
pop bc
CALL EMUOUT
_LoopSWI
OUTDER
exx
exa
dec b
push bc
push hl
dec hl
exa
exx
pop hl
getmem
pop bc
CALL EMUOUT
_LoopSWI
INIER
INDER
OTIRER
OTDRER
INIRER
INDRER
;NYR - NOP ;TODO!!!
_LoopC;_JP
;=================== #DD КОМАНДЫ ===============
DD2
;2-байтная с IX, без работы с памятью
LD (dd2),A
EXX
EXA
DB #DD
dd2 NOP
EXA
EXX
_Loop_
DD2LD
;2-байтная с IX, без работы с памятью и аккумулятором
LD (dd2LD),A
EXX
DB #DD
dd2LD NOP
EXX
_Loop_
DD3
;3-байтная с IX, без работы с памятью
;только для LD LX/HX,n
LD L,A
get
next
LD H,A
LD (dd3),HL
DB #DD
dd3 DS 2
_Loop_
LDIX
getHL ;TODO getIX
PUSH HL
POP IX
_Loop_
POPIX
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC ;TODO getmemIX
PUSH BC
POP IX
_LoopCimmediately
PUSHIX
PUSH IX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC ;TODO putmemIX
_LoopCimmediately
LDIXnn
getHL
getmemBC ;TODO getIX без первого ld a,h
PUSH BC
POP IX
_LoopCimmediately
LDMXn
getdIXtoHL
;push hl ;чтобы get мог портить H
get
next
;pop hl
putmem ;портит HL
_LoopCimmediately
IDCMX
;3-байтная INC/DEC (IX+)
SUB #30 ;превращаем (HL) в B
LD (idcmx),A
getdIXtoHL
PUSH HL
mem ;портит HL
ld b,(hl)
EXA
idcmx NOP
EXA
LD A,B
POP HL
putmem
_LoopCimmediately
LDnnIX
getHL
PUSH IX
POP BC
putmemBC ;TODO putmemIX без первого ld a,h
_LoopCimmediately
LOGAMX
;3-байтная ADD/ADC/... A,(IX+)
LD (logamx),A
getdIXtoHL
mem ;портит HL
EXA
logamx NOP
EXA
_LoopCimmediately
LDMXr
;3-байтная LD (IX+),r, r<>A
ADD A,8 ;превращаем (HL) в A
LD (ldmrx),A
getdIXtoHL
EXX
ldmrx NOP
EXX
putmem ;портит HL
_LoopCimmediately
LDMXA
getdIXtoHL
EXA
LD C,A
EXA
LD A,C
putmem ;портит флаги и HL ;TODO putmemA'
_LoopCimmediately
LDrMX
;3-байтная LD r,(IX+), r<>A
INC A ;превращаем (HL) в A
LD (ldrmx),A
getdIXtoHL
getmem ;портит HL
EXX
ldrmx NOP
EXX
_LoopCimmediately
LDAMX
getdIXtoHL
mem ;портит HL
EXA
LD A,(hl)
EXA
_LoopCimmediately
JPMX
PUSH IX
POP DE ;=PC
_LoopJP
LDSPIX
LD (_SP),IX
_Loop_
ADDISP
push bc ;fix!
LD BC,(_SP)
EXA
ADD IX,BC
EXA
POP BC
_Loop_
EXSPIX
LD HL,(_SP)
getmemBC
PUSH BC
EX (SP),IX
POP BC
LD HL,(_SP)
putmemBC
_LoopCimmediately