打印

求教:怎样写个跨页调用的宏?

[复制链接]
1776|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyfsxs|  楼主 | 2008-12-30 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中颖芯片的ROM中,当程序超过2K时,在调用子程序时,是要考虑页面的切换问题的,这个我在实践中体会过了,由于这个问题,不得不把子程序分在两页写.现在想写一个智能跨页调用的宏来解决这一问题,请教怎样写?
 还有一个问题,中颖单片机的宏参数有上限吗?
沙发
warm_ice| | 2008-12-30 12:56 | 只看该作者

这个应该对您有帮助:

;;=============================================================================
;===================中颖指令宏定义=====================================
;*******************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
;=====================================

使用特权

评论回复
板凳
yyfsxs|  楼主 | 2008-12-30 17:34 | 只看该作者

谢谢

如果我对上帝说我要感谢一个人,上帝一定会说你早该这么做了

使用特权

评论回复
地板
warm_ice| | 2008-12-31 11:13 | 只看该作者

呵呵.

客气了.感谢您对中颖的支持,祝您新年快乐!

使用特权

评论回复
5
liufabing| | 2014-6-27 17:27 | 只看该作者
正好需要,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

35

帖子

0

粉丝