www.pudn.com > sn068s.zip > SPCADDR.NI


; SNEeSe SPC700 CPU emulation core 
; Originally written by Savoury SnaX (Not quite sure if I like AT&T) 
; Maintained/rewritten by Charles Bilyue' 
; 
; Compile under NASM 
; 
; This file contains: 
;  SPC700 addressing mode macros 
; 
 
; Immediate (read-only) 
;  Read 8-bit 
;    OR  A-08  AND A-28  EOR A-48  CMP A-68  ADC A-88  MOV Y-8D 
;    SBC A-A8  CMP Y-AD  CMP X-C8  MOV X-CD  MOV A-E8 
; 
%macro ADDR_imm 0 
%endmacro 
 
; Direct Page 
;  Read 8-bit 
;    OR  A-04  AND A-24  CMP X-3E  EOR A-44  CMP A-64  CMP Y-7E  ADC A-84 
;    SBC A-A4  MOV A-E4  MOV Y-EB  MOV X-F8 
;  Read 16-bit 
;    CMP YA-5A ADD YA-7A SUB YA-9A MOV YA-BA 
;  RMW 8-bit 
;    ASL-0B  ROL-2B  LSR-4B  ROR-6B  DEC-8B  INC-AB 
;  RMW 16-bit 
;    DECW-1A INCW-3A 
;  Write 8-bit 
;    MOV A-C4  MOV Y-CB  MOV X-D8 
;  Write 16-bit 
;    MOV YA-DA 
; 
%macro ADDR_dp 0 
 mov ebx,B_SPC_PAGE 
 mov bl,[1+R_NativePC]  ; get dp 
 add R_NativePC,byte 2 
%endmacro 
 
; Direct Page index X 
;  Read 8-bit 
;    OR  A-14  AND A-34  EOR A-54  CMP A-74  ADC A-94  SBC A-B4  MOV A-F4 
;    MOV Y-FB 
;  RMW 8-bit 
;    ASL-1B  ROL-3B  LSR-5B  ROR-7B  DEC-9B  INC-BB 
;  Write 8-bit 
;    MOV A-D4  MOV Y-DB 
; 
%macro ADDR_Odp_XO 0 
 mov ebx,B_SPC_PAGE 
 mov cl,B_X 
 mov bl,[1+R_NativePC]  ; get dp 
 add R_NativePC,byte 2 
 add bl,cl 
%endmacro 
 
; Direct Page index Y 
;  Read 8-bit 
;    MOV X-F9 
;  Write 8-bit 
;    MOV X-D9 
; 
%macro ADDR_Odp_YO 0 
 mov ebx,B_SPC_PAGE 
 mov cl,B_Y 
 mov bl,[1+R_NativePC]  ; get dp 
 add R_NativePC,byte 2 
 add bl,cl 
%endmacro 
 
; Indexed Indirect 
;  Read 8-bit 
;    OR  A-07  AND A-27  EOR A-47  CMP A-67  ADC A-87  SBC A-A7  MOV A-E7 
;  Write 8-bit 
;    MOV A-C7 
; 
%macro ADDR_OOdp_XOO 0 
 ADDR_Odp_XO 
 GET_WORD_SPC 
 mov ebx,eax 
%endmacro 
 
; Indirect Indexed 
;  Read 8-bit 
;    OR  A-17  AND A-37  EOR A-57  CMP A-77  ADC A-97  SBC A-B7  MOV A-F7 
;  Write 8-bit 
;    MOV A-D7 
; 
%macro ADDR_OOdpO_YO 0 
 ADDR_dp 
 GET_WORD_SPC 
 xor ebx,ebx 
 mov bl,B_Y 
 add bx,ax 
%endmacro 
 
; Direct Page X 
;  Read 8-bit 
;    OR  A-06  AND A-26  EOR A-46  CMP A-66  ADC A-86  SBC A-A6  MOV A-E6 
;  Write 8-bit 
;    MOV A-C6 
; 
%macro ADDR_OXO 0 
 mov ebx,B_SPC_PAGE 
 inc R_NativePC 
 mov bl,B_X 
%endmacro 
 
; Direct Page to Direct Page 
;  RMW 8-bit 
;    OR -09  AND-29  EOR-49  CMP-69  ADC-89  SBC-A9  MOV-FA 
; 
;%1 = reg 
%macro ADDR2_dp_dp 0-1 al   ; al or reg contains src byte 
                            ; bx dest address 
 mov ebx,B_SPC_PAGE 
 mov bl,[1+R_NativePC]  ; get src dp 
 GET_BYTE_SPC 
 mov bl,[2+R_NativePC]  ; get dest dp 
%ifnidni %1,al 
 mov %1,al 
%endif 
 add R_NativePC,byte 3 
%endmacro 
 
; Immediate to Direct Page 
;  RMW 8-bit 
;    OR -18  AND-38  EOR-58  CMP-78  MOV-8F  ADC-98  SBC-B8 
; 
;%1 = reg 
%macro ADDR2_dp_IM 0-1 0    ; -2(R_NativePC) or reg contains src byte 
                            ; bx dest address 
%ifnidni %1,0 
 mov %1,[1+R_NativePC] 
%endif 
 mov ebx,B_SPC_PAGE 
 mov bl,[2+R_NativePC]  ; get dp 
 add R_NativePC,byte 3 
%endmacro 
 
; Direct Page Y to Direct Page X 
;  RMW 8-bit 
;    OR -19  AND-39  EOR-59  CMP-79  ADC-99  SBC-B9 
; 
;%1 = reg 
%macro ADDR2_OXO_OYO 0-1 al ; al or reg contains src byte (Y) 
                            ; bx dest address 
 mov ebx,B_SPC_PAGE 
 inc R_NativePC 
 mov bl,B_Y 
 GET_BYTE_SPC 
%ifnidni %1,al 
 mov %1,al 
%endif 
 mov bl,B_X 
%endmacro 
 
; Direct Page X autoincrement 
;  Read 8-bit 
;    MOV A-BF 
;  Write 8-bit 
;    MOV A-AF 
; 
%macro ADDR_OXOInc 0 
 mov ebx,B_SPC_PAGE     ; Get Page Variable! 
 mov al,B_X 
 mov bl,al 
 inc al 
 inc R_NativePC 
 mov B_X,al 
%endmacro 
 
; Absolute 
;  Read 8-bit 
;    OR  A-05  CMP X-1E  AND A-25  EOR A-45  CMP Y-5E  CMP A-65  ADC A-85 
;    SBC A-A5  MOV A-E5  MOV X-E9  MOV Y-EC 
;  Read 16-bit 
;    CALL -3F  JMP  -5F 
;  RMW 8-bit 
;    ASL  -0C  TSET1-0E  ROL  -2C  LSR  -4C  TCLR1-4E  ROR  -6C  DEC  -8C 
;    INC  -AC 
;  Write 8-bit 
;    MOV A-C5  MOV X-C9  MOV Y-CC 
; 
%macro ADDR_abs 0 
 mov bl,[1+R_NativePC] 
 mov bh,[2+R_NativePC] 
 add R_NativePC,byte 3 
%endmacro 
 
; Absolute index X 
;  Read 8-bit 
;    OR  A-15  AND A-35  EOR A-55  CMP A-75  ADC A-95  SBC A-B5  MOV A-F5 
;  Write 8-bit 
;    MOV A-D5 
; 
%macro ADDR_Oabs_XO 0 
 mov bl,[1+R_NativePC] 
 mov al,B_X 
 mov bh,[2+R_NativePC] 
 add R_NativePC,byte 3 
 add ebx,eax 
 and ebx,0xFFFF 
%endmacro 
 
; Absolute index Y 
;  Read 8-bit 
;    OR  A-16  AND A-36  EOR A-56  CMP A-76  ADC A-96  SBC A-B6  MOV A-F6 
;  Write 8-bit 
;    MOV A-D6 
; 
%macro ADDR_Oabs_YO 0 
 mov bl,[1+R_NativePC] 
 mov al,B_Y 
 mov bh,[2+R_NativePC] 
 add R_NativePC,byte 3 
 add ebx,eax 
 and ebx,0xFFFF 
%endmacro 
 
; mem.bit 
;  Read 8-bit 
;    OR1  C -0A  OR1  C/-2A  AND1 C -4A  AND1 C/-6A  EOR1 C -8A 
;    MOV1 C -AA 
;  Write 8-bit 
;    MOV1  C-CA 
;  RMW 8-bit 
;    NOT1   -EA 
; 
%macro ADDR_membit 0    ; This is a weird addressing mode! 
 mov bl,[1+R_NativePC] 
 xor ecx,ecx 
 mov cl,[2+R_NativePC] 
 add R_NativePC,byte 3 
 mov bh,cl 
 shr ecx,5      ; Get bit number 
 and ebx,0x1FFF ; Get address 
%endmacro