;;============================================================================= ;===================中颖指令宏定义===================================== ;*******************TEMP为中间变量寄存器******************* ;中颖MCU减法的说明 ;所有的减法指令执行后的差均为补码 ;当CY=1时,说明无借位,结果为正数,不需调整为原码(正数原码=补码) ;当CY=0时,说明有借位,结果为负数,差需调整为原码才能使用
;预编译识别RAM分页,简化指令行书写,共计16条指令 ;===================================== MADC MACRO BX ADC BX,(BX>>7)&07H ENDM ;===================================== MADCM MACRO BX ADCM BX,(BX>>7)&07H ENDM ;===================================== MADD MACRO BX ADD BX,(BX>>7)&07H ENDM ;===================================== MADDM MACRO BX ADDM BX,(BX>>7)&07H ENDM ;===================================== MSBC MACRO BX SBC BX,(BX>>7)&07H ENDM ;===================================== MSBCM MACRO BX SBCM BX,(BX>>7)&07H ENDM ;===================================== MSUB MACRO BX SUB BX,(BX>>7)&07H ENDM ;===================================== MSUBM MACRO BX SUBM BX,(BX>>7)&07H ENDM ;===================================== MEOR MACRO BX EOR BX,(BX>>7)&07H ENDM ;===================================== MEORM MACRO BX EORM BX,(BX>>7)&07H ENDM ;===================================== MOR MACRO BX OR BX,(BX>>7)&07H ENDM ;===================================== MORM MACRO BX ORM BX,(BX>>7)&07H ENDM ;===================================== MAND MACRO BX AND BX,(BX>>7)&07H ENDM ;===================================== MANDM MACRO BX ANDM BX,(BX>>7)&07H ENDM ;===================================== MLDA MACRO BX LDA BX,(BX>>7)&07H ENDM ;===================================== MSTA MACRO BX STA BX,(BX>>7)&07H ENDM ;===================================== MLDI MACRO BX,IX LDI TEMP,IX STA BX,(BX>>7)&07H ENDM ;===================================== MLD MACRO BX,BY LDA BY,(BY>>7)&07H STA BX,(BX>>7)&07H ENDM ;=====================================
;===================通用宏定义===================================== ;************************************************************** ;通用宏定义(中颖) ;**************************************************************
;清零操作 ;===================================== CLR MACRO B0X LDI TEMP,00H STA B0X ENDM ;===================================== ;清进位位 CLRCY MACRO LDI TEMP,00H ADD TEMP ENDM ;=====================================
;加1减1操作 ;===================================== INC4 MACRO B0X ADIM B0X,01H ENDM ;===================================== DEC4 MACRO B0X SBIM B0X,01H ENDM ;===================================== INC8 MACRO B0XH,B0XL ADIM B0XL,01H LDI TEMP,00H ADCM B0XH ENDM ;===================================== DEC8 MACRO B0XH,B0XL SBIM B0XL,01H LDI TEMP,00H SBCM B0XH ENDM ;=====================================
;8位立即数加减法 ;===================================== ADDI8 MACRO B0XH,B0XL,IYH,IYL;(XH,XL IS BANK0) ADIM B0XL,IYL LDI TEMP,IYH ADCM B0XH ENDM ;===================================== SUBI8 MACRO B0XH,B0XL,IYH,IYL;(XH,XL IS BANK0) SBIM B0XL,IYL LDI TEMP,IYH SBCM B0XH ENDM ;=====================================
;8位加减法 ;===================================== ;调用: ADD8 被加数高位,被加数低位,加数高位,加数低位, ;和存入被加数 ADD8 MACRO B0XH,B0XL,B0YH,B0YL;(XH,XL,YH,YL IS BANK0) LDA B0YL ADDM B0XL LDA B0YH ADCM B0XH ENDM ;===================================== ;调用: ADD8 被减数高位,被减数低位,减数高位,减数低位, ;差存入被减数 SUB8 MACRO B0XH,B0XL,B0YH,B0YL;(XH,XL,YH,YL IS BANK0) LDA B0YL SUBM B0XL LDA B0YH SBCM B0XH ENDM ;===================================== SUB8M MACRO B0XH,B0XL,IYH,IYL SBIM B0XL,IYL LDI TEMP,IYH SBCM B0XH ENDM ;=====================================
;位操作 ;===================================== SETBA MACRO B0X,IBIT ORIM B0X,IBIT ENDM ;===================================== CLRBA MACRO B0X,IBIT ANDIM B0X,IBIT^0FH ENDM ;===================================== CPLB MACRO B0X,IBIT EORIM B0X,IBIT ENDM ;=====================================
;条件转移宏定义 ;位条件转移 ;===================================== JPCB MACRO B0X,IBIT,ADDR LDI TEMP,IBIT AND B0X,00H BAZ ADDR ENDM ;===================================== JPSB MACRO B0X,IBIT,ADDR LDI TEMP,IBIT AND B0X,00H BNZ ADDR ENDM ;===================================== ;op0 > op1 tHen jump address ;===================================== CJA4 MACRO B0X,IY,ADDR SBI B0X,IY BAZ $+2 BC ADDR ENDM ;===================================== ;op0 < op1 tHen jump address ;===================================== CJB4 MACRO B0X,IY,ADDR SBI B0X,IY BNC ADDR ENDM ;===================================== ;op0 <=op1 tHen jump address ;===================================== CJBE4 MACRO B0X,IY,ADDR SBI B0X,IY BAZ ADDR BNC ADDR ENDM ;==================================== ;op0 >= op1 tHen jump address ;==================================== CJAE4 MACRO B0X,IY,ADDR SBI B0X,IY BC ADDR ENDM ;===================================== ;op0 == op1 tHen jump address ;===================================== CJE4 MACRO B0X,IY,ADDR ;Y=BAN SBI B0X,IY BAZ ADDR ENDM ;===================================== ;op0 != op1 tHen jump address ;===================================== CJNE4 MACRO B0X,IY,ADDR SBI B0X,IY BNZ ADDR ENDM ;===================================== ;op0 = op1 tHen jump address ;===================================== CJE8 MACRO B0XH,B0XL,IYH,IYL,ADDR ;( XH,XL IS BANK0 ) SBI B0XH,IYH BNZ $+3 SBI B0XL,IYL BAZ ADDR ENDM ;===================================== ;op0 != op1 tHen jump address ;===================================== CJNE8 MACRO B0XH,B0XL,IYH,IYL,ADDR ;( XH,XL IS BANK0 ) SBI B0XH,IYH BNZ ADDR SBI B0XL,IYL BNZ ADDR ENDM ;===================================== ;op0 < op1 tHen jump address ;===================================== CJB8 MACRO B0XH,B0XL,IYH,IYL,ADDR ;( XH,XL IS BANK0 ) SBI B0XH,IYH BNC ADDR BNZ $+3 SBI B0XL,IYL BNC ADDR ENDM ;===================================== ;op0 >= op1 tHen jump address ;==================================== CJAE8 MACRO B0XH,B0XL,IYH,IYL,ADDR SBI B0XH,IYH BAZ $+3 BC ADDR JMP $+3 SBI B0XL,IYL BC ADDR ENDM ;===================================== ;op0 = op1 tHen jump address ;===================================== DJE8 MACRO B0XH,B0XL,A0XH,A0XL,ADDR ;( XH,XL IS BANK0 ) LDA A0XH SUB B0XH BNZ $+3 LDA A0XL SUB B0XL BAZ ADDR ENDM ;===================================== ;op0 != op1 tHen jump address ;===================================== DJNE8 MACRO B0XH,B0XL,A0XH,A0XL,ADDR ;( XH,XL IS BANK0 ) LDA A0XH SUB B0XH BNZ ADDR LDA A0XL SUB B0XL BNZ ADDR ENDM ;===================================== ;op0 < op1 tHen jump address ;===================================== DJB8 MACRO B0XH,B0XL,A0XH,A0XL,ADDR ;( XH,XL IS BANK0 ) LDA A0XH SUB B0XH BNC ADDR BNZ $+3 LDA A0XL SUB B0XL BNC ADDR ENDM ;==================================== ;op0 >= op1 tHen jump address ;==================================== DJAE8 MACRO B0XH,B0XL,A0XH,A0XL,ADDR ; LDA A0XH SUB B0XH BAZ $+3 BC ADDR JMP $+4 LDA A0XL SUB B0XL BC ADDR ENDM ;===================================== ;op0 < op1 tHen jump address ;===================================== DJB16 MACRO B0XH,B0XM,B0XML,B0XL,A0XH,A0XM,A0XML,A0XL,ADDR ; LDA A0XH SUB B0XH BNC ADDR BNZ $+11 LDA A0XM SUB B0XM BNC ADDR BNZ $+7 LDA A0XML SUB B0XML BNC ADDR BNZ $+3 LDA A0XL SUB B0XL BNC ADDR ENDM ;====================================
;移位操作 ;===================================== ;变量右移1位 MSHR MACRO BX,BK LDA BX,BK SHR STA BX,BK ENDM ;===================================== ;变量左移1位 MSHL MACRO BX,BK LDA BX,BK ADDM BX,BK ENDM ;===================================== ;变量带进位位左移1位 ;SHIFT LEFT WITH CARRY MSHLC MACRO BX,BK LDA BX,BK ADCM BX,BK ENDM ;===================================== ;变量带进位位右移1位 ;SHIFT RIGHT WITH CARRY MSHRC MACRO BX,BK LDA BX,BK BC $+3 SHR JMP $+4 SHR STA TEMP,00H ORIM TEMP,1000B STA BX,BK ENDM ;===================================== ;MSHRC MACRO BX,BK ; LDA BX,BK ; CALL MSHR_CY ; STA BX,BK ; ENDM ;MSHR_CY: ; BC $+3 ; SHR ; RTNI ; SHR ; STA TEMP,00H ; ORIM TEMP,1000B ; RTNI ;===================================== ;8位带进位位右移 MSHRC8 MACRO BXH,BXL,BKH,BKL ;HIGH NIBBLE LDA BXH,BKH BC $+3 SHR JMP $+4 SHR STA TEMP,00H ORIM TEMP,1000B STA BXH,BKH ;LOW NIBBLE LDA BXL,BKL BC $+3 SHR JMP $+4 SHR STA TEMP,00H ORIM TEMP,1000B STA BXL,BKL ENDM ;===================================== ;8位左移 MSHL8 MACRO BXH,BXL,BKH,BKL LDA BXL,BKL ADDM BXL,BKL BC $+4 LDA BXH,BKH ADDM BXH,BKH JMP $+3 LDA BXH,BKH ADCM BXH,BKH ENDM ;===================================== ;功能: Bank0-->直接跳转,Bank123-->跨页跳转,修改RomBank寄存器 ;条件: 仅用于Bank0 <--> Bank123间跨页跳转,可直接用rtni返回 LONGJUMP MACRO FUNCLABEL LDI TEMP,(FUNCLABEL>>11)&0FH BAZ $+2 LDI ROMBANK,((FUNCLABEL>>11)-1)&0FH JMP FUNCLABEL ENDM DISABLEINT EQU 0000B ENABLEINT EQU 1111B ;===================================== ;功能: Bank0<-->Bank123间相互子程序长调用,地址范围 8K ;条件: 1.主程序与子程序在同一Bank ; 2.主程序与子程序分在Bank0<-->Bank123两个页面中 ;如果扩展此指令功能,使之支持8K内任意调用,则返回指令亦需改造,call前备份 ;Rombank,rtni前恢复之. LONGCALL MACRO FUNCLABEL CALL $+2 JMP $+5 LDI TEMP,(FUNCLABEL>>11)&0FH BAZ $+2 LDI ROMBANK,((FUNCLABEL>>11)-1)&0FH JMP FUNCLABEL ENDM ;===================================== ;功能: Bank0<-->Bank1间相互子程序长调用,地址范围 4K ;条件: 1.主程序与子程序在同一Bank ; 2.主程序与子程序分在Bank0<-->Bank1两个页面中 ;如果扩展此指令功能,使之支持4K内任意调用,则返回指令亦需改造,call前备份 ;Rombank,rtni前恢复之. SLONGCALL MACRO FUNCLABEL CALL $+2 JMP $+2 JMP FUNCLABEL ENDM ;===================================== ;功能: Bank0 主程序调用 Bank123 子程序 CALL_B0_B123 MACRO FUNCLABEL CALL $+2 JMP $+3 LDI ROMBANK,((FUNCLABEL>>11)-1)&0FH JMP FUNCLABEL ENDM ;===================================== ;功能: Bank123 主程序调用 Bank0 子程序 CALL_B123_B0 MACRO FUNCLABEL CALL $+2 JMP $+2 JMP FUNCLABEL ENDM ;=====================================
;===================================== ;入口: Address-->表头地址,BXH,BXL-->8位偏移量 ;出口: 8位数据-->RDT1,RDT0 ;影响资源: R3,R2,R1,R0 256bytes以内查表 LOOKUP macro Address,BXH,BXL ;得到表头 ldi R3,(Address>>12)&0FH ldi R2,(Address>>8)&0FH ldi R1,(Address>>4)&0FH ldi R0,(Address>>0)&0FH ;得到目的地址 lda BXL,(BXL>>7)&07H addm R0,(R0>>7)&07H lda BXH,(BXH>>7)&07H adcm R1,(R1>>7)&07H ldi TEMP,0 adcm R2,(R2>>7)&07H ldi TEMP,0 adcm R3,(R3>>7)&07H ;查表 lda R3,(R3>>7)&07H STA RDT3,(RDT3>>7)&07H lda R2,(R2>>7)&07H STA RDT2,(RDT2>>7)&07H lda R1,(R1>>7)&07H STA RDT1,(RDT1>>7)&07H lda R0,(R0>>7)&07H STA RDT0,(RDT0>>7)&07H nop endm ;===================================== |