Rev 984 |
Rev 1011 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
;MAIN "*",#C6
;=================== ОБЫЧНЫЕ КОМАНДЫ ===============
SIM1
;1-байтная, без работы с памятью и SP
LD (sim1),A
EXX
EXA
sim1 NOP
EXA
EXX
_Loop_
SIM1A
;1-байтная, только аккумулятор
LD (sim1A),A
EXA
sim1A NOP
EXA
_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
_LoopC
POPDE
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
EXX
POP DE
EXX
_LoopC
POPHL
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
EXX
POP HL
EXX
_LoopC
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
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
LD D,B,E,C ;=PC
CALL DOSER
_LoopC_JP
PUSHBC
EXX
PUSH BC
EXX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC
PUSHDE
EXX
PUSH DE
EXX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC
PUSHHL
EXX
PUSH HL
EXX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC
PUSHAF
EXA
PUSH AF
EXA
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC
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
CALL DOSER
_LoopC_JP
RSTn
AND #38
LD L,A
ld H,0 ;=PC
CALCpc
LD B,D
ld C,E ;=PC
EXD
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC_JP
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
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
CALL DOSER
_LoopJP
;OK
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_
;OK
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_
SIM3
;3-байтная, без работы с памятью и SP
;это только LD rp,nn
LD (sim3),A
getHL
LD (sim3+1),HL
EXX
sim3 DS 3
EXX
_Loop_
LDSP
getHL
LD (_SP),HL
_Loop_
LDAnn
getHL
getmem ;портит флаги
LD C,A
EXA
LD A,C
EXA
_LoopC
LDHLnn
getHL
getmemBC
PUSH BC
EXX
POP HL
EXX
_LoopC
LDMn
get
next
EXX
PUSH HL
EXX
POP HL
putmem ;портит HL
_LoopC
INCM
EXX
PUSH HL
EXX
POP HL
PUSH HL
getmem ;портит HL
LD B,A
EXA
INC B
EXA
LD A,B
POP HL
putmem
;нельзя mem:INC (HL) - не заработает extpg5
_LoopC
DECM
EXX
PUSH HL
EXX
POP HL
PUSH HL
getmem ;портит HL
LD B,A
EXA
DEC B
EXA
LD A,B
POP HL
putmem
;нельзя mem:INC (HL) - не заработает extpg5
_LoopC
LDnnA
getHL
EXA
LD C,A
EXA
LD A,C
putmem ;портит флаги
_LoopC
LDnnHL
getHL
EXX
PUSH HL
EXX
POP BC
putmemBC
_LoopC
LDArp
rptoBC
LD H,B
ld L,C
getmem
LD C,A
EXA
LD A,C
EXA
_LoopC
LDrpA
rptoBC
LD H,B
ld L,C
EXA
LD C,A
EXA
LD A,C
putmem
_LoopC
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_
;OK
LOGAM
;1-байтная ADD/ADC/... A,(HL)
DEC A ;превращаем (HL) в L
LD (logam),A
EXX
PUSH HL
EXX
POP HL
getmem ;портит HL
LD L,A
EXA
logam NOP
EXA
_LoopC
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
_LoopC
LDMA
EXX
PUSH HL
EXX
POP HL
EXA
LD C,A
EXA
LD A,C
putmem ;портит флаги и HL
_LoopC
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
_LoopC
LDAM
EXX
PUSH HL
EXX
POP HL
getmem ;портит HL
LD L,A
EXA
LD A,L
EXA
_LoopC
JPM
EXX
PUSH HL
EXX
POP DE ;=PC
CALL DOSER
_LoopJP
LDSPHL
EXX
LD (_SP),HL
EXX
_Loop_
ADDSP
EXX
PUSH BC
LD BC,(_SP)
EXA
ADD HL,BC
EXA
POP BC
EXX
_Loop_
;OK
EXSPHL
LD HL,(_SP)
getmemBC
PUSH BC
EXX
EX (SP),HL
EXX
POP BC
LD HL,(_SP)
putmemBC
_LoopC
;=================== #CB КОМАНДЫ ===============
CB2
LD (cb2),A
EXX
EXA
DB #CB
cb2 NOP
EXX
EXA
_Loop_
CB2M
;CB команда с параметром (HL)
INC A ;превращаем (HL) в A
LD (cb2m),A
EXX
PUSH HL
EXX
POP HL
PUSH HL
getmem
LD C,A
EXA
LD B,A
LD A,C
DB #CB
cb2m NOP
LD C,A
LD A,B
EXA
LD A,C
POP HL
putmem
_LoopC
;=================== #DD #CB КОМАНДЫ ===============
DDCBUNDOC
;NYR
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
INC A ;превращаем (HL) в A
LD (ddcbdoc),A
PUSH HL
getmem
LD C,A
EXA
LD B,A
LD A,C
DB #CB
ddcbdoc NOP
LD C,A
LD A,B
EXA
LD A,C
POP HL
putmem
_LoopC
;=================== #ED КОМАНДЫ ===============
LDrpnn
PUSH AF
getHL
getmemBC
POP AF
BCtorp
_LoopC
LDSPnn
getHL
getmemBC
LD (_SP),BC
_LoopC
LDnnrp
rptoBC
PUSH BC
getHL
POP BC
putmemBC
_LoopC
LDnnSP
getHL
LD BC,(_SP)
putmemBC
_LoopC
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 DE,rrdbuf
LD H,D
ld L,E
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 DE,rrdbuf
LD H,D
ld L,E
LD (HL),A
EXA
LDD ;флаги 3 и 5 устанавливаются по (HL)
EXA
POP DE
_LoopC
LDIRER
EXX
IF 0
LD A,D
OR A
JP M,LDIRSLOW
EXD
PUSH HL
ADD HL,BC
XOR H
POP HL
EXD
JP M,LDIRSLOW
EXA
LDIR
EXX
EXA
_Loop_
ENDIF
LDIRSLOW
DEC BC
LD A,C
OR B
JP Z,LDIREND
PUSH DE
PUSH HL
INC HL,DE
EXX
POP HL
getmem
POP HL
putmem
DEC DE,DE
;надо бы сделать PE для обработчика прерыв-й
_LoopC
LDIREND
PUSH DE
PUSH HL
INC HL,DE
EXX
POP HL
getmem
POP HL
putmem
LD A,(HL)
PUSH DE
LD DE,rrdbuf
LD H,D
ld L,E
LD (HL),A
EXA
LD BC,1
LDI ;флаги 3 и 5 устанавливаются по (HL)
POP DE
;PO=конец цикла
EXA
_LoopC
LDDRER
EXX
IF 0
LD A,D
OR A
JP M,LDDRSLOW
EXD
PUSH HL
ADD HL,BC
XOR H
POP HL
EXD
JP M,LDDRSLOW
EXA
LDDR
EXX
EXA
_Loop_
ENDIF
LDDRSLOW
DEC BC
LD A,C
OR B
JP Z,LDDREND
PUSH DE
PUSH HL
DEC HL,DE
EXX
POP HL
getmem
POP HL
putmem
DEC DE,DE
;надо бы сделать PE для обработчика прерыв-й
_LoopC
LDDREND
PUSH DE
PUSH HL
DEC HL,DE
EXX
POP HL
getmem
POP HL
putmem
LD A,(HL)
PUSH DE
LD DE,rrdbuf
LD H,D
ld L,E
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
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 HL,rrdbuf
LD (HL),A
EXA
RRD
EXA
LD A,(HL)
POP HL
putmem
_LoopC
RLDER
EXX
PUSH HL
EXX
POP HL
PUSH HL
getmem
LD HL,rrdbuf
LD (HL),A
EXA
RLD
EXA
LD A,(HL)
POP HL
putmem
_LoopC
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 A,(iff2)
OR A ;эмулируется только P/V
LD A,(_R)
EXA
_Loop_
CPIER
EXX
PUSH BC
PUSH HL
INC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD HL,rrdbuf
LD (HL),A
EXA
CPI
EXA
_LoopC
CPDER
EXX
PUSH BC
PUSH HL
DEC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD HL,rrdbuf
LD (HL),A
EXA
CPD
EXA
_LoopC
CPIRER
EXX
PUSH BC
PUSH HL
INC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD HL,rrdbuf
LD (HL),A
EXA
CPI
jr Z,CPIRPO
JP PO,CPIRPO ;PO=конец цикла
DEC DE,DE
CPIRPO EXA
_LoopC
CPDRER
EXX
PUSH BC
PUSH HL
DEC HL
DEC BC
EXX
POP HL
getmem
POP BC
LD HL,rrdbuf
LD (HL),A
EXA
CPD
jr Z,CPDRPO
JP PO,CPDRPO ;PO=конец цикла
DEC DE,DE
CPDRPO EXA
_LoopC
OUTIER
OUTDER
INIER
INDER
OTIRER
OTDRER
INIRER
INDRER
;NYR - NOP
_LoopC
;=================== #DD КОМАНДЫ ===============
DD2
;2-байтная с IX, без работы с памятью
LD (dd2),A
EXX
EXA
DB #DD
dd2 NOP
EXA
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
;4-байтная с IX, без работы с памятью
;такая только одна: LD IX,nn
getHL
PUSH HL
POP IX
_Loop_
POPIX
LD HL,(_SP)
INC HL,HL
LD (_SP),HL
DEC HL,HL
getmemBC
PUSH BC
POP IX
_LoopC
PUSHIX
PUSH IX
POP BC
LD HL,(_SP)
DEC HL,HL
LD (_SP),HL
putmemBC
_LoopC
LDIXnn
getHL
getmemBC
PUSH BC
POP IX
_LoopC
LDMXn
getdIXtoHL
get
next
putmem ;портит HL
_LoopC
IDCMX
;3-байтная INC/DEC (IX+)
SUB #30 ;превращаем (HL) в B
LD (idcmx),A
getdIXtoHL
PUSH HL
getmem ;портит HL
LD B,A
EXA
idcmx NOP
EXA
LD A,B
POP HL
putmem
_LoopC
LDnnIX
getHL
PUSH IX
POP BC
putmemBC
_LoopC
LOGAMX
;3-байтная ADD/ADC/... A,(IX+)
DEC A ;превращаем (HL) в L
LD (logamx),A
getdIXtoHL
getmem ;портит HL
LD L,A
EXA
logamx NOP
EXA
_LoopC
LDMXr
;3-байтная LD (IX+),r, r<>A
ADD A,8 ;превращаем (HL) в A
LD (ldmrx),A
getdIXtoHL
EXX
ldmrx NOP
EXX
putmem ;портит HL
_LoopC
LDMXA
getdIXtoHL
EXA
LD C,A
EXA
LD A,C
putmem ;портит флаги и HL
_LoopC
LDrMX
;3-байтная LD r,(IX+), r<>A
INC A ;превращаем (HL) в A
LD (ldrmx),A
getdIXtoHL
getmem ;портит HL
EXX
ldrmx NOP
EXX
_LoopC
LDAMX
getdIXtoHL
getmem ;портит HL
LD L,A
EXA
LD A,L
EXA
_LoopC
JPMX
PUSH IX
POP DE ;=PC
CALL DOSER
_LoopJP
LDSPIX
LD (_SP),IX
_Loop_
ADDISP
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
_LoopC