Login

Subversion Repositories NedoOS

Rev

Rev 1030 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

;=================== ОБЫЧНЫЕ КОМАНДЫ ===============
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