📄 lib.asm
字号:
;**************************************;
;PRJ : FAT_SCALE ;
;MODULE: LIB ;
;***************************************************************************;
; CW_MUL ;
;***************************************************************************;
;[TWO BYTES]*[TWO BYTES]=[FOUR BYTES] ;
;INPUT: CCC_BUF: MULTIPLIER ;
; ACC_BUF: MULTIPLICAND ;
;OUTPUT:BCC_BUF: PRODUCT ;
;**************************************;
;[BCC_BUF] <= [ACC_BUF] * [CCC_BUF] ;
;**************************************;
CW_MUL: CALL CLR_BCC_BUF ; CLEAR PRODUCT
LD W,#0 ; W AS COUNT
RCF ;
MULTI_L1: ;
LD HL,#(BCC_BUF+0) ; ROTATE LEFT PRODUCT
LD Y,#03H ;
CALL ROTATE_LEFT ;
RCF ; ROTATE LEFT MULTIPLIER
LD HL,#(CCC_BUF+0) ;
LD Y,#01H ;
CALL ROTATE_LEFT ;
BTST C ;
JPS MULTI_L2 ; C = 0
RCF ; PRODUCT <= MULTIPLICAND + MULTIPLIER
LD EA,ACC_BUF+0 ; BCC_BUF <= ACC_BUF + CCC_BUF
LD HL,EA ;
LD EA,BCC_BUF+0 ;
ADC EA,HL ;
LD BCC_BUF+0,EA ;
LD EA,ACC_BUF+2 ;
LD HL,EA ;
LD EA,BCC_BUF+2 ;
ADC EA,HL ;
LD BCC_BUF+2,EA ;
;---------------------------- ;
LD HL,#00 ;
LD EA,BCC_BUF+4 ;
ADC EA,HL ;
LD BCC_BUF+4,EA ;
LD EA,BCC_BUF+6 ;
ADC EA,HL ;
LD BCC_BUF+6,EA ;
MULTI_L2: ;
INCS W ;
JPS MULTI_L1 ;
RET ;
;**************************************;
;***************************************************************************;
; CW_DIV ;
;***************************************************************************;
;CW_DIV: ;
;INPUT : [ACC_BUF]: 4 NIBS,DIVISOR ;
; [BCC_BUF]: 8 NIBS,DIVIDEND ;
; [ABS_ERR]: 6 NIBS,REMAINDER ;
;OUTPUT: [CCC_BUF]: 4 NIBS,RESULT ;
;**************************************;
;[CCC_BUF] <= [BCC_BUF]/[ACC_BUF] ;
;**************************************;
CW_DIV: LD EA,#00H ;
LD ABS_ERR+0,EA ;
LD ABS_ERR+2,EA ;
LD ABS_ERR+4,EA ; CLEAR REMAINDER
LD CCC_BUF+0,EA ;
LD CCC_BUF+2,EA ; CLEAR RESULT
LD WX,#31 ;
DIV_L1: RCF ; DIVIDEND ROTATE LEFT ONE BIT
LD HL,#(BCC_BUF+0) ;
LD Y,#03H ;
CALL ROTATE_LEFT ;
LD HL,#(ABS_ERR+0) ;
LD Y,#02 ;
CALL ROTATE_LEFT ; REMAINDER ROTATE LEFT ONE BIT
; COMPARE REMAINDER WITH DIVISOR ;
LD A,ABS_ERR+4 ;
CPSE A,#00H ;
JPS DIV_L3 ;
LD EA,ACC_BUF+2 ; REMAINDER_H >= DIVISOR_H ?
LD HL,EA ;
LD EA,ABS_ERR+2 ;
SBS EA,HL ;
JPS DIV_L2 ; YES. GO ON COMPARE
JPS DIV_L4 ; NO. REMAINDER < DIVISOR
DIV_L2: LD EA,ABS_ERR+2 ;
CPSE EA,HL ; REMAINDER_H = DIVISOR_H ?
JPS DIV_L3 ; NO. ABS_ERR (REMAINDER) > ACC_BUF(DIVISOR)
; REMAINDER_H = DIVISOR_H
LD EA,ACC_BUF+0 ; YES. GO ON COMPARE LOW ORDER BYTE ....
LD HL,EA ;
LD EA,ABS_ERR+0 ;
SBS EA,HL ; REMAINDER_L > = DIVISOR_L ?
JPS DIV_L3 ; YES.
JPS DIV_L4 ; NO. REMAINDER < DIVISOR
;----------------------------- ;
DIV_L3: LD EA,ACC_BUF+0 ; REMAINDER <= REMAINDER - DIVISOR
LD HL,EA ;
LD EA,ABS_ERR+0 ;
SBC EA,HL ;
LD ABS_ERR+0,EA ;
LD EA,ACC_BUF+2 ;
LD HL,EA ;
LD EA,ABS_ERR+2 ;
SBC EA,HL ;
LD ABS_ERR+2,EA ;
LD YZ,#00 ;
LD EA,ABS_ERR+4 ;
SBC EA,YZ ;
LD ABS_ERR+4,EA ;
SCF ; C = 1
;-------------------------- ;
DIV_L4: LD HL,#(CCC_BUF+0) ; RESULT ROTATE LEFT ONE BIT
LD Y,#01H ;
CALL ROTATE_LEFT ;
DECS WX ;
JPS DIV_L1 ;
RET ;
;**************************************;
;***************************************************************************;
; HEX_BCD ;
;***************************************************************************;
; HEX_BCD ;
; FUNCTION: HEX DATA CONVERT TO BCD DATA
; INPUT: [CCC_BUF] (4 NIBS) ;
; OUTPUT:[BCC_BUF] (6 NIBS) ;
;**************************************;
HEX_BCD:CALL CLR_BCC_BUF ;
LD Z,#0 ; Z AS COUNT
HEX_BCD_1: ;
RCF ; C = 0
LD HL,#(CCC_BUF+0) ; ROTATE LEFT ACC_BUF
LD Y,#01H ;
CALL ROTATE_LEFT ;
LD HL,#(BCC_BUF+0) ; ROTATE LEFT BCC_BUF
LD Y,#02H ;
CALL ROTATE_LEFT ;
INCS Z ; Z ++
JPS HEX_BCD_2 ;
RET ;
HEX_BCD_2: ;
LD Y,#05H ;
LD HL,#(BCC_BUF+0) ;
HEX_BCD_3: ;
CALL ADJ_BCD ;
INCS HL ;
DECS Y ;
JPS HEX_BCD_3 ;
JPS HEX_BCD_1 ;
;**************************************;
;**************************************;
ADJ_BCD:LD A,@HL ;
ADS A,#03H ;
NOP ;
ADS A,#08H ; (HL) +3 > 7 ?
RET ; NO. EXIT
LD A,@HL ; YES.
ADS A,#03H ;
NOP ;
LD @HL,A ;
RET ;
;**************************************;
;**************************************;
;SHIFT 4 NIBBLS LEFT ONS BIT ;
; LD HL,#AAA ;
; LD Y,#03H ;
ROTATE_LEFT: ;
LD EA,@HL ;
ADC EA,EA ;
LD @HL,EA ;
INCS HL ;
INCS HL ;
DECS Y ;
JPS ROTATE_LEFT ;
RET ;
;**************************************;
;**************************************;
; AAA<==AAA+BBB ;
; AAA: 6 NIBS, BBB; 4 NIBS ;
ADD2B3B: ;
; LD WX,#BBB ;
; LD HL,#AAA ;
;-------------------------- ;
LD Y,#03 ;
RCF ;
ADD2B3B_1: ;
PUSH HL ;
LD EA,WX ;
LD HL,EA ;
LD A,@HL ;
POP HL ;
ADC A,@HL ;
LD @HL,A ;
INCS WX ;
INCS HL ;
DECS Y ;
JPS ADD2B3B_1 ;
;-------------------------- ;
LD A,#0 ;
ADC A,@HL ;
LD @HL,A ;
INCS HL ;
LD A,#0 ;
ADC A,@HL ;
LD @HL,A ;
RET ;
;**************************************;
;**************************************;
; LD HL,#ABS_ERR ;
ABS2BB: LD Y,#03H ;
ABS2BB_1: ;
LD A,@HL ;
COM A ;
LD @HL,A ;
INCS HL ;
DECS Y ;
JPS ABS2BB_1 ;
LD EA,#(256-04) ;
ADS HL,EA ;
NOP ;
RCF ;
LD EA,@HL ;
LD WX,#01 ;
ADC EA,WX ;
LD @HL,EA ;
INCS HL ;
INCS HL ;
LD WX,#00 ;
LD EA,@HL ;
ADC EA,WX ;
LD @HL,EA ;
RET ;
;**************************************;
;**************************************;
;FUNCTION: [HL] <= [YZ] - [WX] ;
;INPUT: [AAA],[BBB] ;
;OUTPUT: C,[CCC] ;
; CCC<= BBB - AAA ;
; LD YZ,#BBB ; BBB >= AAA: RET
; LD WX,#AAA ; BBB < AAA: SRET
; LD HL,#CCC ;
; CCC<= BBB - AAA ;
SUB2BB: LD E,#03 ; CCC <= AAA
SUB2BB_1: ;
LD A,@WX ;
LD @HL,A ;
INCS WX ;
INCS HL ;
DECS E ;
JPS SUB2BB_1 ;
LD EA,#(256-04) ;
ADS HL,EA ; HL <= HL -4 (RESEST HL)
NOP ;
;------------------------- ;
RCF ; CCC<= BBB - CCC
LD EA,YZ ;
LD WX,EA ;
LD Z,#03 ;
SUB2BB_2: ;
LD A,@WX ;
SBC A,@HL ;
LD @HL,A ;
INCS WX ;
INCS HL ;
DECS Z ;
JPS SUB2BB_2 ;
BTST C ; C = 1 ?
RET ; NO. (WX) >= (HL)
SRET ; YES.
;**************************************;
;**************************************;
;DIV/2 ;
;INPUT : (HL) ;
;4 NIBBS ;
; LD HL,#(AAA+3) ;
DIVTWO: RCF ;
LD Y,#03H ;
DIVTWO_1:LD A,@HL ;
RRC A ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -