Login

Subversion Repositories NedoOS

Rev

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