⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spc700.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
  jz .setzeroflag
  mov byte [spcNZ],1
  jc .setcarryflag
  and byte [spcP],0FEh
  jmp .skipflags
.setsignflag
  mov byte [spcNZ],80h
  jc .setcarryflag
  and byte [spcP],0FEh
  jmp .skipflags
.setzeroflag
  mov byte [spcNZ],0
  jc .setcarryflag
  and byte [spcP],0FEh
  jmp .skipflags
.setcarryflag
  or byte [spcP],1
.skipflags
%endmacro

;spcNF    db 0     ; The Negative Flag  128 or 127 80h
;spcOF    db 0     ; The Overflow Flag   64 or 191 40h
;spcDPF   db 0     ; Direct Page Flag    32 or 223 20h
;spcUF    db 0     ; The Unused Flag ?   16 or 239 10h
;spcHCF   db 0     ; The Half Carry Flag  8 or 247 08h
;spcIF    db 0     ; The interrupt flag   4 or 251 04h
;spcZF    db 0     ; The Zero Flag        2 or 253 02h
;spcCF    db 0     ; The Carry Flag       1 or 254 01h
;      test byte[spcP],08h
;      jz .nohcarry
;      or ah,00010000b
;.nohcarry

%macro SPCSetFlagnvhzc 0
  lahf
  js .setsignflag
  jz .setzeroflag
  mov byte [spcNZ],1
  jo .setoverflowflag
  and byte [spcP],0BFh
  jmp .skipflags 
.setsignflag
  mov byte [spcNZ],80h
  jo .setoverflowflag
  and byte [spcP],0BFh
  jmp .skipflags
.setzeroflag
  mov byte [spcNZ],0
  jo .setoverflowflag
  and byte [spcP],0BFh
  jmp .skipflags
.setoverflowflag
  or byte [spcP],40h
.skipflags
  and byte [spcP],0F6h
  test ah,01h
  jz .noCarry
  or byte [spcP],1
.noCarry
  test ah,10h
  jz .nohf
  or byte [spcP],8
.nohf
ret
%endmacro

%macro SPCSetFlagnvhzcnoret 0
  lahf
  js .setsignflag
  jz .setzeroflag
  mov byte [spcNZ],1
  jo .setoverflowflag
  and byte [spcP],0BFh
  jmp .skipflags 
.setsignflag
  mov byte [spcNZ],80h
  jo .setoverflowflag
  and byte [spcP],0BFh
  jmp .skipflags
.setzeroflag
  mov byte [spcNZ],0
  jo .setoverflowflag
  and byte [spcP],0BFh
  jmp .skipflags
.setoverflowflag
  or byte [spcP],40h
.skipflags
  and byte [spcP],0F6h
  test ah,01h
  jz .noCarry
  or byte [spcP],1
.noCarry
  test ah,10h
  jz .nohf
  or byte [spcP],8
.nohf
%endmacro

;************************************************
; Misc Opcodes
;************************************************
NEWSYM Op00       ; NOP
      ret
NEWSYM OpEF       ; SLEEP        standby SLEEP mode      .........
      dec ebp
      ret
NEWSYM OpFF       ; STOP         standby STOP mode       .........
      inc dword[spc700read]
      dec ebp
      ret
NEWSYM Op9F       ; XCN A     A(7-4) <-> A(3-0)     N......Z.
      ror byte [spcA],4
      mov al,byte[spcA]
      mov [spcNZ],al
      ret

;************************************************
; Branch Stuff
;************************************************
NEWSYM Op10       ; BPL Branch on N=0
      test byte [spcNZ],128
      jz .branch
      spcbrancher
NEWSYM Op30       ; BMI Branch on N=1
      test byte [spcNZ],128
      jnz .branch
      spcbrancher
NEWSYM Op50       ; BVC Branch on V=0
      test byte [spcP],64
      jz .branch
      spcbrancher
NEWSYM Op70       ; BVS Branch on V=1
      test byte [spcP],64
      jnz .branch
      spcbrancher
NEWSYM Op90       ; BCC Branc on c=0
      test byte [spcP],1
      jz .branch
      spcbrancher
NEWSYM OpB0       ; BCS Branch on C=1
      test byte [spcP],1
      jnz .branch
      spcbrancher
NEWSYM OpD0       ; BNE branch on Z=0
      test byte [spcNZ],255
      jnz .branch
      spcbrancher
NEWSYM OpF0       ; BEQ Branch on Z=1
      test byte [spcNZ],0FFh
      jz .branch
      spcbrancher
NEWSYM Op2F       ; BRA rel      branch always                  ...
      movsx ebx,byte [ebp]
      inc ebp
      add ebp,ebx
      ret

;************************************************
; Clear/Set Flag bits
;************************************************
;  CLRP               20    1     2   clear direct page flag    ..0..... 
NEWSYM Op20       ; CLRP Clear direct page flag
      and byte [spcP],11011111b
      mov dword [spcRamDP],spcRam
      ret
;  SETP               40    1     2   set dorect page flag      ..1..0..
NEWSYM Op40       ; SETP Set Direct Page Flag  (Also clear interupt flag?)
      or byte [spcP],00100000b
      and byte [spcP],11111011b
      mov dword [spcRamDP],spcRam
      add dword [spcRamDP],100h
      ret
;  CLRC               60    1     2   clear carry flag          .......0 
NEWSYM Op60       ; CLRC Clear carry flag
      and byte [spcP],11111110b
      ret
;  SETC               80    1     2   set carry flag            .......1 
NEWSYM Op80       ; SETC Set carry flag
      or byte [spcP],00000001b
      ret
;  EI                 A0    1     3  set interrup enable flag   .....1.. 
NEWSYM OpA0       ; EI set interrupt flag
      or byte [spcP],00000100b
      ret
;  DI                 C0    1     3  clear interrup enable flag .....0..
NEWSYM OpC0       ; DI clear interrupt flag
      and byte [spcP],11111011b
      ret
;  CLRV               E0    1     2   clear V and H             .0..0... 
NEWSYM OpE0       ; CLRV clear V and H
      and byte [spcP],10110111b
      ret
;  NOTC               ED    1     3   complement carry flag     .......C 
NEWSYM OpED       ; NOTC         complement carry flag     .......C 
      xor byte [spcP],00000001b
      ret

;************************************************
; TCALL instructions (Verified)
;************************************************
NEWSYM Op01       ; TCALL 0
      spctcall 30
NEWSYM Op11       ; TCALL 1
      spctcall 28
NEWSYM Op21       ; TCALL 2
      spctcall 26
NEWSYM Op31       ; TCALL 3
      spctcall 24
NEWSYM Op41       ; TCALL 4
      spctcall 22
NEWSYM Op51       ; TCALL 5
      spctcall 20
NEWSYM Op61       ; TCALL 6
      spctcall 18
NEWSYM Op71       ; TCALL 7
      spctcall 16
NEWSYM Op81       ; TCALL 8
      spctcall 14
NEWSYM Op91       ; TCALL 9
      spctcall 12
NEWSYM OpA1       ; TCALL A
      spctcall 10
NEWSYM OpB1       ; TCALL B
      spctcall 08
NEWSYM OpC1       ; TCALL C
      spctcall 06
NEWSYM OpD1       ; TCALL D
      spctcall 04
NEWSYM OpE1       ; TCALL E
      spctcall 02
NEWSYM OpF1       ; TCALL F
      spctcall 00

;************************************************
; SET1 instructions (Verified)
;************************************************
NEWSYM Op02       ; SET1 direct page bit 0
      set1 1 
NEWSYM Op22       ; SET1 direct page bit 1
      set1 2
NEWSYM Op42       ; SET1 direct page bit 2
      set1 4
NEWSYM Op62       ; SET1 direct page bit 3
      set1 8
NEWSYM Op82       ; SET1 direct page bit 4
      set1 16
NEWSYM OpA2       ; SET1 direct page bit 5
      set1 32
NEWSYM OpC2       ; SET1 direct page bit 6
      set1 64
NEWSYM OpE2       ; SET1 direct page bit 7
      set1 128

;************************************************
; CLR1 instructions (Verified)
;************************************************
NEWSYM Op12       ; CLR1 direct page bit 0
      clr1 255-1
NEWSYM Op32       ; CLR1 direct page bit 1
      clr1 255-2
NEWSYM Op52       ; CLR1 direct page bit 2
      clr1 255-4
NEWSYM Op72       ; CLR1 direct page bit 3
      clr1 255-8
NEWSYM Op92       ; CLR1 direct page bit 4
      clr1 255-16
NEWSYM OpB2       ; CLR1 direct page bit 5
      clr1 255-32
NEWSYM OpD2       ; CLR1 direct page bit 6
      clr1 255-64
NEWSYM OpF2       ; CLR1 direct page bit 7
      clr1 255-128

;************************************************
; BBS instructions (Verified)
;************************************************
NEWSYM Op03       ; BBS direct page bit 0
      bbs 1
NEWSYM Op23       ; BBS direct page bit 1
      bbs 2
NEWSYM Op43       ; BBS direct page bit 2
      bbs 4
NEWSYM Op63       ; BBS direct page bit 3
      bbs 8
NEWSYM Op83       ; BBS direct page bit 4
      bbs 16
NEWSYM OpA3       ; BBS direct page bit 5
      bbs 32
NEWSYM OpC3       ; BBS direct page bit 6
      bbs 64
NEWSYM OpE3       ; BBS direct page bit 7
      bbs 128

;************************************************
; BBC instructions (Verified)
;************************************************
NEWSYM Op13       ; BBC direct page bit 0
      bbc 1
NEWSYM Op33       ; BBC direct page bit 1
      bbc 2
NEWSYM Op53       ; BBC direct page bit 2
      bbc 4
NEWSYM Op73       ; BBC direct page bit 3
      bbc 8
NEWSYM Op93       ; BBC direct page bit 4
      bbc 16
NEWSYM OpB3       ; BBC direct page bit 5
      bbc 32
NEWSYM OpD3       ; BBC direct page bit 6
      bbc 64
NEWSYM OpF3       ; BBC direct page bit 7
      bbc 128

;************************************************
; OR A,instructions
;************************************************
NEWSYM Op04       ; OR A,dp   A <- A OR (dp)    N.....Z.
      SPCaddr_DP
      SPC_OR_A
NEWSYM Op14       ; OR A,dp+X    A <- A OR (dp+X)     N.....Z.
      SPCaddr_DP_X
      SPC_OR_A
NEWSYM Op05       ; OR A,labs   A <- A OR (abs)       N.....Z.
      SPCaddr_LABS
      SPC_OR_A
NEWSYM Op15       ; OR A,labs+x  A <- A OR (abs+X)    N.....Z.
      SPCaddr_LABS_X
      SPC_OR_A
NEWSYM Op06       ; OR A,(X)     A <- A OR (X)        N.....Z.
      SPCaddr__X_
      SPC_OR_A
NEWSYM Op16       ; OR A,labs+Y  A <- A OR (abs+Y)    N......Z.
      SPCaddr_LABS_Y
      SPC_OR_A
NEWSYM Op07       ; OR A,(dp+X)  A <- A OR ((dp+X+1)(dp+X))  N......Z.
      SPCaddr_bDP_Xb
      SPC_OR_A
NEWSYM Op17       ; OR A,(dp)+Y  A <- A OR ((dp+1)(dp)+Y)   N......Z.
      SPCaddr_bDPb_Y
      SPC_OR_A
NEWSYM Op08       ; OR A,#inm    A <- A OR inm            N......Z.
      mov al,[ebp]
      inc ebp
      SPC_OR_A

;************************************************
; AND A, instructions
;************************************************
NEWSYM Op24       ; AND A,dp     A <- A AND (dp)      N.....Z.
      SPCaddr_DP
      SPC_AND_A
NEWSYM Op34       ; AND A,dp+x   A <- A AND (dp+X)    N.....Z.
      SPCaddr_DP_X
      SPC_AND_A
NEWSYM Op25       ; AND A,labs   A <- A AND (abs)     N.....Z.
      SPCaddr_LABS
      SPC_AND_A
NEWSYM Op35       ; AND A,labs+X A <- A AND (abs+X)   N.....Z.
      SPCaddr_LABS_X
      SPC_AND_A
NEWSYM Op26       ; AND A,(X)    A <- A AND (X)       N......Z.
      SPCaddr__X_
      SPC_AND_A
NEWSYM Op36       ; AND A,labs+Y A <- A AND (abs+Y)   N......Z.
      SPCaddr_LABS_Y
      SPC_AND_A
NEWSYM Op27       ; AND A,(dp+X) A <- A AND ((dp+X+1)(dp+X)) N......Z.
      SPCaddr_bDP_Xb
      SPC_AND_A
NEWSYM Op37       ; AND A,(dp)+Y A <- A AND ((dp+1)(dp)+Y)  N......Z.
      SPCaddr_bDPb_Y
      SPC_AND_A
NEWSYM Op28       ; AND A,#inm   A <- A AND inm           N......Z.
      mov al,[ebp]
      inc ebp
      SPC_AND_A

;************************************************
; EOR A, instructions
;************************************************
NEWSYM Op44       ; EOR A,dp     A <- A EOR (dp)      N.....Z.
      SPCaddr_DP
      SPC_EOR_A
NEWSYM Op54       ; EOR A,dp+x   A <- A EOR (dp+X)    N.....Z.
      SPCaddr_DP_X
      SPC_EOR_A
NEWSYM Op45       ; EOR A,labs   A <- A EOR (abs)     N.....Z.
      SPCaddr_LABS
      SPC_EOR_A
NEWSYM Op55       ; EOR A,labs+X A <- A EOR (abs+X)   N.....Z.
      SPCaddr_LABS_X
      SPC_EOR_A
NEWSYM Op46       ; EOR A,(X)    A <- A EOR (X)       N......Z.
      SPCaddr__X_
      SPC_EOR_A
NEWSYM Op56       ; EOR A,labs+Y A <- A EOR (abs+Y)   N......Z.
      SPCaddr_LABS_Y
      SPC_EOR_A
NEWSYM Op47       ; EOR A,(dp+X) A <- A EOR ((dp+X+1)(dp+X)) N......Z.
      SPCaddr_bDP_Xb
      SPC_EOR_A
NEWSYM Op57       ; EOR A,(dp)+Y A <- A EOR ((dp+1)(dp)+Y)  N......Z.
      SPCaddr_bDPb_Y
      SPC_EOR_A
NEWSYM Op48       ; EOR A,#inm   A <- A EOR inm           N......Z.
      mov al,[ebp]
      inc ebp
      SPC_EOR_A

;************************************************
; CMP A, instructions
;************************************************
NEWSYM Op64       ; CMP A,dp     A-(dp)               N.....ZC
      SPCaddr_DP
      SPC_CMP_A
NEWSYM Op74       ; CMP A,dp+x   A-(dp+X)             N.....ZC
      SPCaddr_DP_X
      SPC_CMP_A
NEWSYM Op65       ; CMP A,labs   A-(abs)              N.....ZC
      SPCaddr_LABS
      SPC_CMP_A
NEWSYM Op75       ; CMP A,labs+X A-(abs+X)            N.....ZC
      SPCaddr_LABS_X
      SPC_CMP_A
NEWSYM Op66       ; CMP A,(X)    A-(X)                N......ZC
      SPCaddr__X_
      SPC_CMP_A
NEWSYM Op76       ; CMP A,labs+Y A-(abs+Y)            N......ZC
      SPCaddr_LABS_Y
      SPC_CMP_A
NEWSYM Op67       ; CMP A,(dp+X) A-((dp+X+1)(dp+X))      N......ZC
      SPCaddr_bDP_Xb
      SPC_CMP_A
NEWSYM Op77       ; CMP A,(dp)+Y A-((dp+1)(dp)+Y)        N......ZC
      SPCaddr_bDPb_Y
      SPC_CMP_A
NEWSYM Op68       ; CMP A,#inm   A-inm                   N......ZC
      mov al,[ebp]
      inc ebp
      SPC_CMP_A

;************************************************
; ADC A, instructions
;************************************************
NEWSYM Op84       ; ADC A,dp     A <- A+(dp)+C        NV..H.ZC
      SPCaddr_DP
      SPC_ADC_A
NEWSYM Op94       ; ADC A,dp+x   A <- A+(dp+X)+C      NV..H.ZC
      SPCaddr_DP_X
      SPC_ADC_A
NEWSYM Op85       ; ADC A,labs   A <- A+(abs)+C       NV..H.ZC
      SPCaddr_LABS
      SPC_ADC_A
NEWSYM Op95       ; ADC A,labs+X A <- A+(abs+X)+C     NV..H.ZC
      SPCaddr_LABS_X
      SPC_ADC_A
NEWSYM Op86       ; ADC A,(X)    A <- A+(X)+C         NV..H..ZC
      SPCaddr__X_
      SPC_ADC_A
NEWSYM Op96       ; ADC A,labs+Y A <- A+(abs+Y)+C     NV..H..ZC
      SPCaddr_LABS_Y
      SPC_ADC_A
NEWSYM Op87       ; ADC A,(dp+X) A <- A+((dp+X+1)(dp+X)) NV..H..ZC
      SPCaddr_bDP_Xb
      SPC_ADC_A
NEWSYM Op97       ; ADC A,(dp)+Y A <- A+((dp+1)(dp)+Y)   NV..H..ZC
      SPCaddr_bDPb_Y
      SPC_ADC_A
NEWSYM Op88       ; ADC A,#inm   A <- A+inm+C            NV..H..ZC
      mov al,[ebp]
      inc ebp
      SPC_ADC_A

;************************************************
; SBC A, instructions
;************************************************
NEWSYM OpA4       ; SBC A,dp     A <- A-(dp)-!C       NV..H.ZC
      SPCaddr_DP
      SPC_SBC_A
NEWSYM OpB4       ; SBC A,dp+x   A <- A-(dp+X)-!C     NV..H.ZC
      SPCaddr_DP_X
      SPC_SBC_A
NEWSYM OpA5       ; SBC A,labs   A <- A-(abs)-!C      NV..H.ZC
      SPCaddr_LABS
      SPC_SBC_A
NEWSYM OpB5       ; SBC A,labs+x A <- A-(abs+X)-!C    NV..H.ZC
      SPCaddr_LABS_X
      SPC_SBC_A
NEWSYM OpA6       ; SBC A,(X)    A <- A-(X)-!C        NV..H..ZC
      SPCaddr__X_
      SPC_SBC_A
NEWSYM OpB6       ; SBC A,labs+Y A <- A-(abs+Y)-!C    NV..H..ZC
      SPCaddr_LABS_Y
      SPC_SBC_A
NEWSYM OpA7       ; SBC A,(dp+X) A <- A-((dp+X+1)(dp+X))-!C NV..H..ZC
      SPCaddr_bDP_Xb
      SPC_SBC_A
NEWSYM OpB7       ; SBC A,(dp)+Y A <- A-((dp+1)(dp)+Y)-!C   NV..H..ZC
      SPCaddr_bDPb_Y
      SPC_SBC_A
NEWSYM OpA8       ; SBC A,#inm   A <- A-inm-!C           NV..H..ZC
      mov al,[ebp]
      inc ebp
      SPC_SBC_A

;************************************************
; MOV A, instructions
;************************************************
NEWSYM OpE4       ; MOV A,dp     A <- (dp)            N......Z
      SPCaddr_DP
      SPC_MOV_A
NEWSYM OpF4       ; MOV A,dp+x   A <- (dp+X)          N......Z
      SPCaddr_DP_X
      SPC_MOV_A
NEWSYM OpE5       ; MOV A,labs   A <- (abs)           N......Z
      SPCaddr_LABS
      SPC_MOV_A
NEWSYM OpF5       ; MOV A,labs+X A <- (abs+X)         N......Z
      SPCaddr_LABS_X
      SPC_MOV_A
NEWSYM OpE6       ; MOV A,(X)    A <- (X)             N......Z
      SPCaddr__X_
      SPC_MOV_A
NEWSYM OpF6       ; MOV A,labs+Y A <- (abs+Y)         N......Z
      SPCaddr_LABS_Y
      SPC_MOV_A
NEWSYM OpE7       ; MOV A,(dp+X) A <- ((dp+X+1)(dp+X))     N......Z
      SPCaddr_bDP_Xb
      SPC_MOV_A
NEWSYM OpF7       ; MOV A,(dp)+Y A <- ((dp+1)(dp)+Y)       N......Z
      SPCaddr_bDPb_Y
      SPC_MOV_A
NEWSYM OpE8       ;  MOV A,#inm  A <- inm                  N......Z
      mov al,[ebp]
      inc ebp
      SPC_MOV_A

;************************************************
; DP,#imm instructions
;************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -