;============================================================================== ; 8桁プロセッサ ; CPU8A ; 2004.11.17 ;============================================================================== .copyright = "cpu8a.mac ver 1.00 Copyright (C) 2004 LdLabo" const _DR = R0,R1,R2,R3 const _PR = RP0,RP1 const _XR = IX,IY const _JR = JR const _cc = c,z const _AR = NN,R0,R1,R2,R3,RP0,RP1,IX,IY,JR,SR const _ER = DR0,DR1,DR2,DR3,DR4,DR5,DR6,DR7 const _EBR = BR0,BR1,BR2,BR3,BR4,BR5,BR6,BR7,BR8,BR9,BR10,BR11,BR12,BR13,BR14,BR15 ; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- macro ORG NUMBER $ = #0 endm macro DS NUMBER $ = $+#0 endm macro DEFS NUMBER $ = $+#0 endm ; ---------------------------------------------------------------------------- ; ADD ; ---------------------------------------------------------------------------- macro ADD _DR,_DR if ((#0==0) && (#1==0)) error "ADD R0,R0 は使用できません。\n" endif if ((#0==1) && (#1==1)) error "ADD R1,R1 は使用できません。\n" endif if ((#0==2) && (#1==2)) error "ADD R2,R2 は使用できません。\n" endif if ((#0==3) && (#1==3)) error "ADD R3,R3 は使用できません。\n" endif db 010h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; SUB ; ---------------------------------------------------------------------------- macro SUB _DR,_DR if ((#0==0) && (#1==0)) error "SUB R0,R0 は使用できません。\n" endif if ((#0==1) && (#1==1)) error "SUB R1,R1 は使用できません。\n" endif if ((#0==2) && (#1==2)) error "SUB R2,R2 は使用できません。\n" endif if ((#0==3) && (#1==3)) error "SUB R3,R3 は使用できません。\n" endif db 020h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; AND ; ---------------------------------------------------------------------------- macro AND _DR,_DR if ((#0==0) && (#1==0)) error "AND R0,R0 は使用できません。\n" endif if ((#0==1) && (#1==1)) error "AND R1,R1 は使用できません。\n" endif if ((#0==2) && (#1==2)) error "AND R2,R2 は使用できません。\n" endif if ((#0==3) && (#1==3)) error "AND R3,R3 は使用できません。\n" endif db 030h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; OR ; ---------------------------------------------------------------------------- macro OR _DR,_DR if ((#0==0) && (#1==0)) error "OR R0,R0 は使用できません。\n" endif if ((#0==1) && (#1==1)) error "OR R1,R1 は使用できません。\n" endif if ((#0==2) && (#1==2)) error "OR R2,R2 は使用できません。\n" endif if ((#0==3) && (#1==3)) error "OR R3,R3 は使用できません。\n" endif db 040h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; XOR ; ---------------------------------------------------------------------------- macro XOR _DR,_DR db 050h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; NOT ; ---------------------------------------------------------------------------- macro NOT _DR,_DR db 060h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; SHU ; ---------------------------------------------------------------------------- macro SHU _DR,_DR db 070h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; SHD ; ---------------------------------------------------------------------------- macro SHD _DR,_DR db 080h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; LDSR ; ---------------------------------------------------------------------------- macro LDSR db 090h endm ; ---------------------------------------------------------------------------- ; LDIR ; ---------------------------------------------------------------------------- macro LDIR db 095h endm ; ---------------------------------------------------------------------------- ; STMR ; ---------------------------------------------------------------------------- macro STMR db 09Ah endm ; ---------------------------------------------------------------------------- ; RETI ; ---------------------------------------------------------------------------- macro RETI db 09Fh endm ; ---------------------------------------------------------------------------- ; MOVR ; ---------------------------------------------------------------------------- macro MOVR _DR,_DR if ((#0==0) && (#1==0)) error "MOVR R0,R0 は使用できません。\n" endif if ((#0==1) && (#1==1)) error "MOVR R1,R1 は使用できません。\n" endif if ((#0==2) && (#1==2)) error "MOVR R2,R2 は使用できません。\n" endif if ((#0==3) && (#1==3)) error "MOVR R3,R3 は使用できません。\n" endif db 090h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; MOVI ; ---------------------------------------------------------------------------- macro MOVI _DR,NUMBER db 0a0h+#0,#1 endm ; ---------------------------------------------------------------------------- ; MOVMR ; ---------------------------------------------------------------------------- macro MOVMR _DR,_XR db 0b0h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; MOVRM ; ---------------------------------------------------------------------------- macro MOVRM _XR,_DR db 0c0h+(#1<<2)+#0 endm ; ---------------------------------------------------------------------------- ; MOVPR ; ---------------------------------------------------------------------------- macro MOVPR _DR,_XR db 0d0h+(#0<<2)+#1 endm ; ---------------------------------------------------------------------------- ; MOVRP ; ---------------------------------------------------------------------------- macro MOVRP _XR,_DR db 0e0h+(#1<<2)+#0 endm ; ---------------------------------------------------------------------------- ; MOVRX ; ---------------------------------------------------------------------------- macro MOVRX _PR db 00h+(#0<<2) endm ; ---------------------------------------------------------------------------- ; MOVRY ; ---------------------------------------------------------------------------- macro MOVRY _PR db 01h+(#0<<2) endm ; ---------------------------------------------------------------------------- ; MOVXR ; ---------------------------------------------------------------------------- macro MOVXR _PR db 02h+(#0<<2) endm ; ---------------------------------------------------------------------------- ; MOVYR ; ---------------------------------------------------------------------------- macro MOVYR _PR db 03h+(#0<<2) endm ; ---------------------------------------------------------------------------- ; JMP ; ---------------------------------------------------------------------------- macro JMP NUMBER db 0f0h,#0&0ffh,(#0>>8)&0ffh endm ; ---------------------------------------------------------------------------- ; JMPC ; ---------------------------------------------------------------------------- macro JMPC NUMBER db 0f1h,#0&0ffh,(#0>>8)&0ffh endm ; ---------------------------------------------------------------------------- ; JMPZ ; ---------------------------------------------------------------------------- macro JMPZ NUMBER db 0f2h,#0&0ffh,(#0>>8)&0ffh endm ; ---------------------------------------------------------------------------- ; JMPR ; ---------------------------------------------------------------------------- macro JMPR db 0f3h endm ; ---------------------------------------------------------------------------- ; JMPRC ; ---------------------------------------------------------------------------- macro JMPRC db 0f4h endm ; ---------------------------------------------------------------------------- ; JMPRZ ; ---------------------------------------------------------------------------- macro JMPRZ db 0f5h endm ; ---------------------------------------------------------------------------- ; MOVJ ; ---------------------------------------------------------------------------- macro MOVJ NUMBER db 0f6h,#0&0ffh,(#0>>8)&0ffh endm ; ---------------------------------------------------------------------------- ; CALL ; ---------------------------------------------------------------------------- macro CALL NUMBER db 0f7h,#0&0ffh,(#0>>8)&0ffh endm ; ---------------------------------------------------------------------------- ; RET ; ---------------------------------------------------------------------------- macro RET db 0f8h endm ; ---------------------------------------------------------------------------- ; PUSH ; ---------------------------------------------------------------------------- macro PUSH _AR db 0f9h,#0 endm ; ---------------------------------------------------------------------------- ; POP ; ---------------------------------------------------------------------------- macro POP _AR db 0fah,#0 endm ; ---------------------------------------------------------------------------- ; EI ; ---------------------------------------------------------------------------- macro EI db 0fbh endm ; ---------------------------------------------------------------------------- ; DI ; ---------------------------------------------------------------------------- macro DI db 0fch endm ; ---------------------------------------------------------------------------- ; INC ; ---------------------------------------------------------------------------- macro INC _AR db 0fdh,#0 endm ; ---------------------------------------------------------------------------- ; DEC ; ---------------------------------------------------------------------------- macro DEC _AR db 0feh,#0 endm ; ---------------------------------------------------------------------------- ; NOP ; ---------------------------------------------------------------------------- macro NOP db 0ffh endm ; ---------------------------------------------------------------------------- ; ADDC ; ---------------------------------------------------------------------------- macro ADDC db 30h endm ; ---------------------------------------------------------------------------- ; SUBC ; ---------------------------------------------------------------------------- macro SUBC db 35h endm ; ---------------------------------------------------------------------------- ; ROU ; ---------------------------------------------------------------------------- macro ROU db 3Ah endm ; ---------------------------------------------------------------------------- ; ROD ; ---------------------------------------------------------------------------- macro ROD db 3Fh endm ; ---------------------------------------------------------------------------- ; CMP ; ---------------------------------------------------------------------------- macro CMP db 40h endm ; ---------------------------------------------------------------------------- ; MOVX ; ---------------------------------------------------------------------------- macro MOVX NUMBER db 45h,#0&0FFH,(#0>>8)&0FFH endm ; ---------------------------------------------------------------------------- ; MOVY ; ---------------------------------------------------------------------------- macro MOVY NUMBER db 4Ah,#0&0FFH,(#0>>8)&0FFH endm ; ---------------------------------------------------------------------------- ; MOVS ; ---------------------------------------------------------------------------- macro MOVS NUMBER db 4Fh,#0&0FFH,(#0>>8)&0FFH endm ; ---------------------------------------------------------------------------- ; LDCPR ; ---------------------------------------------------------------------------- macro LDCPR db 10h endm ; ---------------------------------------------------------------------------- ; LDDPR ; ---------------------------------------------------------------------------- macro LDDPR db 15h endm ; ---------------------------------------------------------------------------- ; STCPR ; ---------------------------------------------------------------------------- macro STCPR db 1Ah endm ; ---------------------------------------------------------------------------- ; STDPR ; ---------------------------------------------------------------------------- macro STDPR db 1Fh endm ; ---------------------------------------------------------------------------- ; MOVFR ; ---------------------------------------------------------------------------- macro MOVFR db 20h endm ; ---------------------------------------------------------------------------- ; MOVRF ; ---------------------------------------------------------------------------- macro MOVRF db 25h endm ; ---------------------------------------------------------------------------- ; INCR2 ; ---------------------------------------------------------------------------- macro INCR2 db 2Ah endm ; ---------------------------------------------------------------------------- ; DECR2 ; ---------------------------------------------------------------------------- macro DECR2 db 2Fh endm ; ============================================================================ ; 2進数8桁レジスタ 拡張命令 ; ============================================================================ MBEB EQU 10H ; ---------------------------------------------------------------------------- ; MOVR ; ---------------------------------------------------------------------------- MACRO MOVR _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IY MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; MOVI ; ---------------------------------------------------------------------------- MACRO MOVI _EBR,NUMBER MOVX #0+MBEB MOVI R0,NUMBER MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; ADD ; ---------------------------------------------------------------------------- MACRO ADD _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY ADD R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SUB ; ---------------------------------------------------------------------------- MACRO SUB _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY SUB R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; ADDC ; ---------------------------------------------------------------------------- MACRO ADDC _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY ADDC R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SUBC ; ---------------------------------------------------------------------------- MACRO SUBC _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY SUBC R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SHU ; ---------------------------------------------------------------------------- MACRO SHU _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY SHU R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SHD ; ---------------------------------------------------------------------------- MACRO SHD _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY SHD R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; ROU ; ---------------------------------------------------------------------------- MACRO ROU _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY ROU R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; ROD ; ---------------------------------------------------------------------------- MACRO ROD _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY ROD R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; CMP ; ---------------------------------------------------------------------------- MACRO CMP _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY CMP ENDM ; ---------------------------------------------------------------------------- ; AND ; ---------------------------------------------------------------------------- MACRO AND _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY AND R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; OR ; ---------------------------------------------------------------------------- MACRO OR _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY OR R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; XOR ; ---------------------------------------------------------------------------- MACRO XOR _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY XOR R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; NOT ; ---------------------------------------------------------------------------- MACRO NOT _EBR,_EBR MOVX #0+MBEB MOVY #1+MBEB MOVMR R0,IX MOVMR R1,IY NOT R0,R1 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; INC ; ---------------------------------------------------------------------------- MACRO INC _EBR MOVX #0+MBEB MOVMR R0,IX INC R0 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; DEC ; ---------------------------------------------------------------------------- MACRO DEC _EBR MOVX #0+MBEB MOVMR R0,IX DEC R0 MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; MOVRM ; ---------------------------------------------------------------------------- MACRO MOVRM (_ER),_EBR MOVX #0*2+MBE MOVY #1+MBEB MOVMR R0,IX INC IX MOVMR R1,IX MOVRX RP0 MOVMR R0,IY MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; MOVMR ; ---------------------------------------------------------------------------- MACRO MOVMR _EBR,(_ER) MOVX #0+MBEB MOVY #1*2+MBE MOVMR R0,IY INC IY MOVMR R1,IY MOVRY RP0 MOVMR R0,IY MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; MUL ; WORK0 行程 ; 1,2 加算 ; 3,4 累積 ; ---------------------------------------------------------------------------- MACRO MUL _EBR,_EBR MOVX WORK MOVI R0,1 MOVRM IX,R0 ; 行程初期化 MOVX WORK+1 MOVY #1+MBEB MOVMR R0,IY MOVRM IX,R0 INC IX XOR R0,R0 MOVRM IX,R0 ; 加算に乗数を設置 MOVX WORK+3 MOVRM IX,R0 INC IX MOVRM IX,R0 ; 累積を初期化 MULB_X0: MOVX #0+MBEB MOVMR R0,IX MOVX WORK MOVMR R1,IX AND R0,R1 JMPZ MULB_X1 ; 加算なし MOVX WORK+1 MOVY WORK+3 MOVMR R0,IX MOVMR R1,IY ADD R0,R1 MOVRM IY,R0 INC IX INC IY MOVMR R0,IX MOVMR R1,IY ADDC MOVRM IY,R0 ; 累積 MULB_X1: MOVX WORK+1 MOVMR R0,IX SHU R0,R0 MOVRM IX,R0 INC IX MOVMR R0,IX ROU MOVRM IX,R0 ; 加算上移動 MOVX WORK MOVMR R0,IX SHU R0,R0 MOVRM IX,R0 JMPC MULB_X2 ; 終わり JMP MULB_X0 ; 戻る MULB_X2: MOVX #0+MBEB MOVY WORK+3 MOVMR R0,IY MOVRM IX,R0 MOVX #1+MBEB INC IY MOVMR R0,IY MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; DIV ; WORK0 行程 ; 1,2 被除数移動 ; 3 結果 ; ---------------------------------------------------------------------------- MACRO DIV _EBR,_EBR MOVY #1+MBEB MOVX WORK MOVI R0,1 MOVRM IX,R0 ; 行程初期化 MOVX WORK+3 XOR R0,R0 MOVRM IX,R0 ; 結果初期化 MOVX #0+MBEB MOVMR R0,IX MOVX WORK+1 MOVRM IX,R0 INC IX XOR R0,R0 MOVRM IX,R0 ; 被除数設置 DIVB_X0: MOVX WORK+1 MOVMR R0,IX SHU R0,R0 MOVRM IX,R0 INC IX MOVMR R0,IX ROU MOVRM IX,R0 ; 被除数上桁移動 MOVMR R0,IX MOVMR R1,IY CMP JMPC DIVB_X1 ; 減算なし SUB R0,R1 MOVRM IX,R0 ; 減算 MOVX WORK+3 MOVMR R0,IX SHU R0,R0 MOVI R1,1 OR R0,R1 MOVRM IX,R0 ; 結果処理 JMP DIVB_X2 ; 次行程 MOVX WORK+1 MOVMR R0,IX JMP DIVB_X0 DIVB_X1: MOVX WORK+3 MOVMR R0,IX SHU R0,R0 MOVRM IX,R0 DIVB_X2: MOVX WORK MOVMR R0,IX SHU R0,R0 MOVRM IX,R0 JMPC DIVB_X3 ; 終了 JMP DIVB_X0 ; 戻る DIVB_X3: MOVX WORK+3 MOVMR R0,IX MOVX #0+MBEB MOVRM IX,R0 MOVX WORK+2 MOVMR R0,IX MOVX #1+MBEB MOVRM IX,R0 ENDM ; ============================================================================ ; 2進数16桁レジスタ 拡張命令 ; ============================================================================ MBE EQU MBEB+16 WORK EQU MBE+16 ; ---------------------------------------------------------------------------- ; DEC ; ---------------------------------------------------------------------------- MACRO DEC _ER MOVX #0*2+MBE MOVMR R0,IX MOVI R1,1 SUB R0,R1 MOVRM IX,R0 INC IX MOVMR R0,IX MOVI R1,0 SUBC MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; INC ; ---------------------------------------------------------------------------- MACRO INC _ER MOVX #0*2+MBE MOVMR R0,IX MOVI R1,1 ADD R0,R1 MOVRM IX,R0 INC IX MOVMR R0,IX MOVI R1,0 ADDC MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; MOVMR ; ---------------------------------------------------------------------------- MACRO MOVMR _ER,(_ER) MOVX #1*2+MBE MOVMR R0,IX INC IX MOVMR R1,IX MOVRY RP0 MOVX #0*2+MBE MOVMR R0,IY MOVRM IX,R0 INC IX INC IY MOVMR R0,IY MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; MOVRM ; ---------------------------------------------------------------------------- MACRO MOVRM (_ER),_ER MOVX #0*2+MBE MOVMR R0,IX INC IX MOVMR R1,IX MOVRX RP0 MOVY #1*2+MBE MOVMR R0,IY MOVRM IX,R0 INC IX INC IY MOVMR R0,IY MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; NOT ; ---------------------------------------------------------------------------- MACRO NOT _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY NOT R0,R1 MOVRM IX,R0 INC IX INC IY LDSR MOVR R2,R0 MOVMR R0,IX MOVMR R1,IY NOT R0,R1 MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; XOR ; ---------------------------------------------------------------------------- MACRO XOR _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY XOR R0,R1 MOVRM IX,R0 INC IX INC IY LDSR MOVR R2,R0 MOVMR R0,IX MOVMR R1,IY XOR R0,R1 MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; OR ; ---------------------------------------------------------------------------- MACRO OR _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY OR R0,R1 MOVRM IX,R0 INC IX INC IY LDSR MOVR R2,R0 MOVMR R0,IX MOVMR R1,IY OR R0,R1 MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; AND ; ---------------------------------------------------------------------------- MACRO AND _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY AND R0,R1 MOVRM IX,R0 INC IX INC IY LDSR MOVR R2,R0 MOVMR R0,IX MOVMR R1,IY AND R0,R1 MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; ROD ; ---------------------------------------------------------------------------- MACRO ROD _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IY ROD MOVRM IX,R0 INC IX INC IY MOVMR R0,IY ROD MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SHD ; ---------------------------------------------------------------------------- MACRO SHD _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IY SHD R0,R0 MOVRM IX,R0 INC IX INC IY MOVMR R0,IY ROD MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; CMP ; ---------------------------------------------------------------------------- MACRO CMP _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY SUB R0,R1 INC IX INC IY LDSR MOVI R1,80H OR R0,R1 MOVR R2,R0 MOVMR R0,IX MOVMR R1,IY SUBC LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; ROU ; ---------------------------------------------------------------------------- MACRO ROU _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IY ROU MOVRM IX,R0 INC IX INC IY MOVMR R0,IY ROU MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SHU ; ---------------------------------------------------------------------------- MACRO SHU _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IY SHU R0,R0 MOVRM IX,R0 INC IX INC IY MOVMR R0,IY ROU MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; SUBC ; ---------------------------------------------------------------------------- MACRO SUBC _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY SUBC MOVRM IX,R0 LDSR MOVI R1,80H OR R0,R1 MOVR R2,R0 INC IX INC IY MOVMR R0,IX MOVMR R1,IY SUBC MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; SUB ; ---------------------------------------------------------------------------- MACRO SUB _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY SUB R0,R1 MOVRM IX,R0 LDSR MOVI R1,80H OR R0,R1 MOVR R2,R0 INC IX INC IY MOVMR R0,IX MOVMR R1,IY SUBC MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; MOVR ; ---------------------------------------------------------------------------- MACRO MOVR _ER,_ER MOVX #1*2+MBE MOVY #0*2+MBE MOVMR R0,IX MOVRM IY,R0 INC IX INC IY MOVMR R0,IX MOVRM IY,R0 ENDM ; ---------------------------------------------------------------------------- ; MOVI ; ---------------------------------------------------------------------------- MACRO MOVI _ER,NUMBER MOVX #0*2+MBE MOVI R0,#1&0FFH MOVRM IX,R0 INC IX MOVI R0,(#1>>8)&0FFH MOVRM IX,R0 ENDM ; ---------------------------------------------------------------------------- ; ADD ; ---------------------------------------------------------------------------- MACRO ADD _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY ADD R0,R1 MOVRM IX,R0 LDSR MOVI R1,80H OR R0,R1 MOVR R2,R0 INC IX INC IY MOVMR R0,IX MOVMR R1,IY ADDC MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; ADDC ; ---------------------------------------------------------------------------- MACRO ADDC _ER,_ER MOVX #0*2+MBE MOVY #1*2+MBE MOVMR R0,IX MOVMR R1,IY ADDC MOVRM IX,R0 LDSR MOVI R1,80H OR R0,R1 MOVR R2,R0 INC IX INC IY MOVMR R0,IX MOVMR R1,IY ADDC MOVRM IX,R0 LDSR AND R0,R2 PUSH R0 POP SR ENDM ; ---------------------------------------------------------------------------- ; MUL ; 行程 WORK 0 - 1 ; 累積 WORK 2 - 5 ; 加数 WORK 6 - 9 ; ---------------------------------------------------------------------------- MACRO MUL _ER,_ER MOVX WORK MOVI R0,1 MOVRM IX,R0 ; No.0 INC IX XOR R0,R0 MOVRM IX,R0 ; No.1 行程初期化 MOVX WORK+2 MOVRM IX,R0 ; No.0 INC IX MOVRM IX,R0 ; No.1 INC IX MOVRM IX,R0 ; No.2 INC IX MOVRM IX,R0 ; No.3 累積初期化 MOVX #1*2+MBE MOVY WORK+6 MOVMR R0,IX MOVRM IY,R0 ; No.0 INC IX INC IY MOVMR R0,IX MOVRM IY,R0 ; No.1 INC IY XOR R0,R0 MOVRM IY,R0 ; No.2 INC IY MOVRM IY,R0 ; No.3 乗数設置 MUL_X0: MOVX WORK MOVY #0*2+MBE MOVMR R0,IX MOVMR R1,IY AND R0,R1 JMPZ MUL_X1 JMP MUL_X2 ; 加算 MUL_X1: INC IX INC IY MOVMR R0,IX MOVMR R1,IY AND R0,R1 JMPZ MUL_X3 ; 行程増 MUL_X2: MOVX WORK+2 MOVY WORK+6 MOVMR R0,IX MOVMR R1,IY ADD R0,R1 MOVRM IX,R0 ; No.0 INC IX INC IY MOVMR R0,IX MOVMR R1,IY ADDC R0,R1 MOVRM IX,R0 ; No.1 INC IX INC IY MOVMR R0,IX MOVMR R1,IY ADDC R0,R1 MOVRM IX,R0 ; No.2 INC IX INC IY MOVMR R0,IX MOVMR R1,IY ADDC R0,R1 MOVRM IX,R0 ; NO.3 累積加算 MUL_X3: MOVX WORK MOVMR R0,IX SHU R0,R0 MOVRM IX,R0 ; No.0 INC IX MOVMR R0,IX ROU R0,R0 MOVRM IX,R0 ; No.1 行程 JMPC MUL_X4 ; 終了 JMP MUL_X0 ; 戻る MUL_X4: MOVX #0*2+MBE MOVY WORK+2 MOVMR R0,IY MOVRM IX,R0 ; No.0 INC IX INC IY MOVMR R0,IY MOVRM IX,R0 ; No.1 MOVX #1*2+MBE INC IY MOVMR R0,IY MOVRM IX,R0 ; No.2 INC IX INC IY MOVMR R0,IY MOVRM IX,R0 ; No.3 ENDM