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

📄 spc700.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
      rcr byte [spcA],1
      mov al,[spcA]
      jc .setcarryflag
      and byte[spcP],0FEh
      mov [spcNZ],al
      ret
.setcarryflag
      or byte[spcP],01h
      mov [spcNZ],al
      ret

;************************************************
; INC/DEC instructions (Verified)
;************************************************

NEWSYM Op8B       ;  DEC dp   -- (dp)               N......Z.
      mov bl,[ebp]
      add ebx,[spcRamDP]
      inc ebp
      ReadByte2
      dec al
      mov [spcNZ], al
      WriteByte
      ret

NEWSYM OpAB       ; INC dp    ++ (dp)               N......Z.
      mov bl,[ebp]
      add ebx,[spcRamDP]
      inc ebp
      ReadByte2
      inc al
      mov [spcNZ], al
      WriteByte
      ret

NEWSYM Op9B       ;  DEC dp+X -- (dp+X)             N......Z.
      mov bl,[ebp]
      add bl,[spcX]
      add ebx,[spcRamDP]
      inc ebp
      ReadByte2
      dec al
      mov [spcNZ], al
      WriteByte
      ret

NEWSYM OpBB       ; INC dp+X  ++ (dp+X)             N......Z.
      mov bl,[ebp]
      add bl,[spcX]
      add ebx,[spcRamDP]
      inc ebp
      ReadByte2
      inc al
      mov [spcNZ], al
      WriteByte
      ret

NEWSYM Op8C       ; DEC labs  -- (abs)              N......Z.
      mov bx,[ebp]
      add ebx,spcRam
      add ebp,2
      ReadByte2
      dec al
      mov [spcNZ], al
      WriteByte
      ret

NEWSYM OpAC       ; INC labs  ++ (abs)              N......Z.
      mov bx,[ebp]
      add ebx,spcRam
      add ebp,2
      ReadByte2
      inc al
      mov [spcNZ], al
      WriteByte
      ret

NEWSYM Op9C       ; DEC A  -- A                  N......Z.
      dec byte [spcA]
      mov al,byte [spcA]
      mov [spcNZ],al
      ret

NEWSYM OpBC       ; INC A  ++ A                  N......Z.
      inc byte [spcA]
      mov al,byte [spcA]
      mov [spcNZ],al
      ret

NEWSYM OpDC       ; DEC Y  -- Y                  N......Z.
      dec byte [spcY]
      mov al,byte [spcY]
      mov [spcNZ],al
      ret

NEWSYM OpFC       ; INC Y  ++ Y                  N......Z.
      inc byte [spcY]
      mov al,byte [spcY]
      mov [spcNZ],al
      ret

NEWSYM Op1D       ; DEC X     -- X                  N......Z.
      dec byte [spcX]
      mov al,byte [spcX]
      mov [spcNZ],al
      ret

NEWSYM Op3D       ; INC X     ++ X                  N......Z.
      inc byte [spcX]
      mov al,byte [spcX]
      mov [spcNZ],al
      ret

;************************************************
; PUSH/POP instructions (Verified)
;************************************************

NEWSYM Op0D       ; PUSH PSW     push PSW to stack       .........
      mov eax,[spcS]
      mov bl,[spcP]
      and bl,01111101b
      test byte [spcNZ],80h
      jnz .NegSet
      cmp byte [spcNZ],0
      je .ZeroSet
      dec byte [spcS]
      mov [spcRam+eax],bl
      ret
.NegSet
      or bl,80h
      dec byte [spcS]
      mov [spcRam+eax],bl
      ret
.ZeroSet
      or bl,02h
      dec byte [spcS]
      mov [spcRam+eax],bl
      ret

NEWSYM Op2D       ; PUSH A       push A to stack         .........
      mov eax,[spcS]
      mov bl,[spcA]
      dec byte [spcS]
      mov [spcRam+eax],bl
      ret

NEWSYM Op4D       ; PUSH X       push X to stack         .........
      mov eax,[spcS]
      mov bl,[spcX]
      dec byte [spcS]
      mov [spcRam+eax],bl
      ret
   
NEWSYM Op6D       ; PUSH Y    push Y to stack         .........
      mov eax,[spcS]
      mov bl,[spcY]
      dec byte [spcS]
      mov [spcRam+eax],bl
      ret

NEWSYM Op8E       ; POP PSW   pop PSW from stack     (Restored)
      inc byte [spcS]
      mov eax,[spcS]
      mov byte [spcNZ],0
      mov bl,[spcRam+eax]
      mov [spcP],bl
      test byte [spcP],2
      jnz .ZeroYes
      mov byte [spcNZ],1
      test byte [spcP],80h
      jz .NoNeg
      or byte [spcNZ],80h
.NoNeg
.ZeroYes
      mov dword [spcRamDP],spcRam
      test byte[spcP],32
      jnz .setpage1
      ret
.setpage1
      add dword [spcRamDP],100h
      ret

NEWSYM OpAE       ; POP A     pop A from stack        .........
      inc byte [spcS]
      mov eax,[spcS]
      mov bl,[spcRam+eax]
      mov [spcA],bl
      ret

NEWSYM OpCE       ; POP X     pop X from stack        .........
      inc byte [spcS]
      mov eax,[spcS]
      mov bl,[spcRam+eax]
      mov [spcX],bl
      ret

NEWSYM OpEE       ; POP Y     pop Y from stack        .........
      inc byte [spcS]
      mov eax,[spcS]
      mov bl,[spcRam+eax]
      mov [spcY],bl
      ret

;************************************************
; Test & set bits Instructions (Verified?)
;************************************************

NEWSYM Op0E       ; TSET1 labs   test and set bits with A   N......Z.
      mov bx,[ebp]
      add ebx,spcRam
      add ebp,2
      ReadByte2
      mov ah,al
      and ah,[spcA]
      mov [spcNZ],ah
      or al,[spcA]
      WriteByte
      ret

NEWSYM Op4E       ; TCLR1     test and clear bits with A N......Z.
      mov bx,[ebp]
      add ebx,[spcRamDP]
      add ebp,2
      ReadByte2
      mov ah,al
      and ah,[spcA]
      mov [spcNZ],ah
      mov ah,[spcA]
      not ah
      and al,ah
      WriteByte
      ret

;************************************************
; Compare/Decrement & Branch Instructions (Verified)
;************************************************

NEWSYM Op2E       ; CBNE dp,rel  compare A with (dp) then BNE   ...
      mov bl,[ebp]
      add ebx,[spcRamDP]
      ReadByte2
      cmp byte [spcA], al
      jne .Jump
      add ebp,2
      ret
.Jump
      movsx ebx,byte [ebp+1]
      add ebp,ebx
      add ebp,2
      ret

NEWSYM OpDE       ; CBNE dp+X,rel   compare A with (dp+X) then BNE ...
      mov bl,[ebp]
      add bl,[spcX]
      add ebx,[spcRamDP]
      ReadByte2
      cmp byte [spcA], al
      jne .Jump
      add ebp,2
      ret
.Jump
      movsx ebx,byte [ebp+1]
      add ebp,ebx
      add ebp,2
      ret

NEWSYM Op6E       ; DBNZ   decrement memory (dp) then JNZ ...
      mov bl,[ebp]
      add ebx,[spcRamDP]
      ReadByte2
      dec al
      jnz .Jump
      add ebp,2
      WriteByte
      ret
.Jump
NEWSYM Op6Eb
      push ebx
      movsx ebx,byte [ebp+1]
      add ebp,ebx
      add ebp,2
      pop ebx
      WriteByte
      ret

NEWSYM OpFE       ; DBNZ Y,rel   decrement Y then JNZ           ...
      dec byte [spcY]
      jnz .Jump
      inc ebp
      ret
.Jump
      movsx ebx,byte [ebp]
      add ebp,ebx
      inc ebp
      ret

;************************************************
; Jump/Subroutine Instructions
;************************************************

NEWSYM Op0F       ; BRK       software interrupt       ...1.0.. 
      inc dword[spc700read]
      dec ebp
      ret

NEWSYM Op1F       ; JMP (labs+X)    PC <- (abs+X+1)(abs+X)         ...
      mov bx,[ebp]
      add bx,[spcX]
      xor eax,eax
      add ebp,2
      mov ax, word [spcRam+ebx]
      mov ebp,spcRam
      add ebp,eax
      ret

NEWSYM Op3F       ; CALL labs    subroutine call          ........
      ; calculate PC
      mov ecx,ebp
      add ecx,2
      sub ecx,spcRam
      mov eax,[spcS]
      mov [spcRam+eax],ch
      dec byte [spcS]
      mov eax,[spcS]
      mov [spcRam+eax],cl
      dec byte [spcS]
      ; set new PC
      mov cx,[ebp]
      add ecx,spcRam
      mov ebp,ecx
      xor ecx,ecx
      ret

NEWSYM Op4F       ; PCALL upage  upage call               ........ 
      ; calculate PC
      mov ecx,ebp
      inc ecx
      sub ecx,spcRam
      mov eax,[spcS]
      mov [spcRam+eax],ch
      dec byte [spcS]
      mov eax,[spcS]
      mov [spcRam+eax],cl
      dec byte [spcS]
      ; set new PC
      xor ecx,ecx
      mov cl,[ebp]
      add ecx,spcRam
      add ecx,0ff00h
      mov ebp,ecx
      xor ecx,ecx
      ret

; I'm not sure about this one and JMP labs+X...

NEWSYM Op5F       ; JMP labs     jump to new location           ...
      mov bx,[ebp]
      add ebp,2
      mov ebp,spcRam
      add ebp,ebx
      ret

NEWSYM Op6F       ; ret          ret from subroutine   ........
      xor ecx,ecx
      inc byte [spcS]
      mov eax,[spcS]
      mov cl,[spcRam+eax]
      inc byte [spcS]
      mov eax,[spcS]
      mov ch,[spcRam+eax]
      add ecx,spcRam
      mov ebp,ecx
      xor ecx,ecx
      ret

NEWSYM Op7F       ; ret1         return from interrupt   (Restored)
      dec ebp
      ret
      xor ecx,ecx
      inc byte [spcS]
      mov eax,[spcS]
      mov cl,[spcRam+eax]
      mov [spcP],cl
      test byte [spcP],80h
      jz .NoNeg
      or byte [spcNZ],80h      
.NoNeg
      test byte [spcP],2
      jz .NoZero
      mov byte [spcNZ],0
      jmp .YesZero
.NoZero
      or byte [spcNZ],1
.YesZero
      inc byte [spcS]
      mov eax,[spcS]
      mov cl,[spcRam+eax]
      inc byte [spcS]
      mov eax,[spcS]
      mov ch,[spcRam+eax]
      add ecx,spcRam
      mov ebp,ecx
      ; set direct page
      mov dword [spcRamDP],spcRam
      test byte[spcP],32
      jz .nodp
      add dword [spcRamDP],100h
.nodp
      xor ecx,ecx
      ret

;************************************************
; Divide/Multiply Instructions
;************************************************

NEWSYM Op9E       ; DIV YA,X     Q:A B:Y <- YA / X       NV..H..Z.
   push edx
   mov ah,[spcY]
   mov al,[spcA]
   xor bh,bh
   xor dx,dx
   mov bl,[spcX]
   cmp bl,0
   je NoDiv
   div bx
   mov byte[spcA],al
   mov byte[spcY],dl
   cmp ah,0
   jne Over
   and byte [spcP],191-16
   pop edx
   mov [spcNZ],al
   ret

NEWSYM NoDiv
   mov byte [spcA],0ffh
   mov byte [spcY],0ffh
   or byte [spcP],16
   and byte[spcP],255-64
   pop edx
   ret
NEWSYM Over
   or byte [spcP],64
   and byte[spcP],255-16
   pop edx
   mov [spcNZ],al
   ret

NEWSYM OpCF       ; MUL YA       YA(16 bits) <- Y * A    N......Z.
      mov al,[spcA]
      mov bl,[spcY]
      mul bl
      mov [spcA],al
      mov [spcY],ah
      ; ??? (Is the n flag set on YA or A?)
      test ax,8000h
      jnz .YesNeg
      cmp ax,0000h
      je .YesZero
      mov byte [spcNZ],1
      ret
.YesNeg
      mov byte [spcNZ],80h
      ret
.YesZero
      mov byte [spcNZ],0
      ret

;************************************************
; Decimal Operations
;************************************************

NEWSYM OpBE       ; DAS A     decimal adjust for sub  N......ZC
;      ret
      ; copy al flags into AH
      xor ah,ah
      test byte[spcNZ],80h
      jz .noneg
      or ah,10000000b
.noneg
      test byte[spcP],01h
      jz .nocarry
      or ah,00000001b
.nocarry
      test byte[spcNZ],0FFh
      jnz .nozero
      or ah,01000000b
.nozero
      test byte[spcP],08h
      jz .nohcarry
      or ah,00010000b
.nohcarry
      mov al,[spcA]
      sahf
      das
      mov [spcA],al
      SPCSetFlagnzc

;spcNF    db 0     ; The Negative Flag  128 or 127
;spcOF    db 0     ; The Overflow Flag   64 or 191
;spcDPF   db 0     ; Direct Page Flag    32 or 223
;spcUF    db 0     ; The Unused Flag ?   16 or 239
;spcHCF   db 0     ; The Half Carry Flag  8 or 247
;spcIF    db 0     ; The interrupt flag   4 or 251
;spcZF    db 0     ; The Zero Flag        2 or 253
;spcCF    db 0     ; The Carry Flag       1 or 254

NEWSYM OpDF       ; DAA A        decimal adjust for add  N......ZC
      ; copy al flags into AH
      xor ah,ah
      test byte[spcNZ],80h
      jz .noneg
      or ah,10000000b
.noneg
      test byte[spcP],01h
      jz .nocarry
      or ah,00000001b
.nocarry
      test byte[spcNZ],0FFh
      jnz .nozero
      or ah,01000000b
.nozero
      test byte[spcP],08h
      jz .nohcarry
      or ah,00010000b
.nohcarry
      mov al,[spcA]
      sahf
      daa
      mov [spcA],al
      SPCSetFlagnzc

NEWSYM Invalidopcode ; Invalid Opcode
      dec ebp
      ret

NEWSYM Spc700AsmEnd

⌨️ 快捷键说明

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