📄 sci_add.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2003.9 *
; * File Name : SCI_ADD.ASM *
; ***************************************************************************
pw 128
case off
externs on
include ST2202.def ; Include ST2100 I/O define.
include Data.def ; Data RAM define.
include Bios.h
include Graphics.h
include Keydef.def
include Graph.def
include cal.def
public CHK_SQR_FAC
public turnexp_hex_to_dec_shift
;=====================================================
Num0K equ 0 ;'0'
Num1K equ 1 ;'1'
Num2K equ 2 ;'2'
Num3K equ 3 ;'3'
Num4K equ 4 ;'4'
Num5K equ 5 ;'5'
Num6K equ 6 ;'6'
Num7K equ 7 ;'7'
Num8K equ 8 ;'8'
Num9K equ 9 ;'9'
DotK equ 10 ;'.'
Exp10K equ 11 ;Exp10
MinusK equ 12 ;'-'
ShiftK equ 13 ;Shift
PiK equ 14 ;Pi
AngleK equ 15 ;Angle
HypK equ 16 ;Hyp
CK equ 17 ;Clear
ACK equ 18 ;AllClear
MRK equ 19 ;MR
MCK equ 20 ;MC
MAddK equ 21 ;M+
MSubK equ 22 ;M-
EQUK equ 23 ;'='
ADDK equ 24 ;'+'
SUBK equ 25 ;'-'
DIVK equ 26 ;'/'
MULK equ 27 ;'*'
XEYK equ 28 ;X^Y
XE1YK equ 29 ;X^1/Y
PERK equ 30 ;'%'
LnK equ 31 ;Ln
LogK equ 32 ;Log
SQRFOTK equ 33 ;Square Foot
INVK equ 34 ;1/X
EXK equ 35 ;E^X
B10EXK equ 36 ;10^X
XE2 equ 37 ;X^2
XSTEP equ 38 ;X!
SinK equ 39 ;Sin
CosK equ 40 ;Cos
TanK equ 41 ;Tan
ASinK equ 42 ;ASin
ACosK equ 43 ;ACos
ATanK equ 44 ;ATan
SinHK equ 45 ;SinH
CosHK equ 46 ;CosH
TanHK equ 47 ;TanH
ASinHK equ 48 ;ASinH
ACosHK equ 49 ;ACosH
ATanHK equ 50 ;ATanH
exp_flag equ 280h
sciodd_even equ 281h
memory_bak equ cal_fixram+30
MemFlag_bak equ cal_fixram+40 ;1
PS3 .SECTION ; Program ROM location 0080h
BANKNO EQU sci_addbank
;==========================================================
public xxxxxx
public xeyff_bug
TEMP3_EXP EQU $8A
TEMP3_HO EQU $8B
TEMP3_MOH EQU $8C
TEMP3_MO EQU $8D
TEMP3_LO EQU $8E
TEMP1_EXP EQU $93
TEMP1_HO EQU $94
TEMP1_MOH EQU $95
TEMP1_MO EQU $96
TEMP1_LO EQU $97
TEMP2_EXP EQU $98
TEMP2_HO EQU $99
TEMP2_MOH EQU $9A
TEMP2_MO EQU $9B
TEMP2_LO EQU $9C
FAC_EXP EQU $9D
FAC_HO EQU $9E
FAC_MOH EQU $9F
FAC_MO EQU $A0
FAC_LO EQU $A1
FAC_SGN EQU $A2
ARG_EXP EQU $A5
ARG_HO EQU $A6
ARG_MOH EQU $A7
ARG_MO EQU $A8
ARG_LO EQU $A9
ARG_SGN EQU $AA
STATE_BUF EQU $AB
STATE_BUF1 EQU $AC
CALDATA EQU B0H
INXMOV EQU CALDATA
INXMOV1 EQU CALDATA+1
FMULBUF0 EQU CALDATA+2
FMULBUF1 EQU CALDATA+3
FMULBUF2 EQU CALDATA+4
FMULBUF3 EQU CALDATA+5
FMULBUF4 EQU CALDATA+6
STRLT2 EQU CALDATA+7
CMPFLAG EQU CALDATA+8 ;原本APPLE2 的 16H 暂存器
STRBUF1 EQU CALDATA+9
STRBUF2 EQU CALDATA+10
STRBUF3 EQU CALDATA+11
ERR_FLAG EQU CALDATA+12 ;运算错误存错误讯息,原APPLE $DE 暂存器
CMPFAC1 EQU CALDATA+13 ;FAC的比较暂存器
CMPFAC2 EQU CALDATA+14 ;FAC的比较暂存器
;==========================================
SUB_BUF EQU 80H ;程式返回位置.
TEMP4_EXP EQU 81H
TEMP4_HO EQU 82H
TEMP4_MOH EQU 83H
TEMP4_MO EQU 84H
TEMP4_LO EQU 85H
FLOAT_STAT EQU 86H ;BIT 7 6 5 4 3 2 1 0
;=========
ASL_FAC:
ASL <FAC_LO
ROL <FAC_MO
ROL <FAC_MOH
ROL <FAC_HO
RTS
;=========
ROL_ARG:
ROL <ARG_LO
ROL <ARG_MO
ROL <ARG_MOH
ROL <ARG_HO
RTS
;=========
CLR_ARG:
STZ <ARG_EXP
STZ <ARG_HO
STZ <ARG_MOH
STZ <ARG_MO
STZ <ARG_LO
STZ <ARG_SGN
RTS
;====================
xeyff_bug:
lda arg_exp
bne ?x_is_not_0
lda fac_exp
bne ?y_is_not_0
?0___:
jmp ?XeyFerr
?y_is_not_0:
lda fac_sgn
bne ?0___
stz fac_exp+0
stz fac_exp+1
?_result_is_0_or_1:
stz fac_exp+2
stz fac_exp+3
stz fac_exp+4
stz fac_exp+5
rts
?x_is_not_0:
lda fac_exp
bne ?y_is_not_0_and_x_is_not_0
lda #81h
sta fac_exp+0
dec
sta fac_exp+1
bra ?_result_is_0_or_1
?y_is_not_0_and_x_is_not_0:
lda Arg_Sgn
beq ?XeYf1
lda Fac_Exp
sec
sbc #81h
bcs ?XeYf6
lda Fac_Ho
beq ?Xefa
jsr CHK_SQR_FAC
lda <ERR_FLAG
beq ?xefa
jmp ?XeyFerr
?xefa:
jmp ?Xef7
?XeYf6:
tax
lda Fac_Ho
pha
lda Fac_Moh
pha
lda Fac_Mo
pha
lda Fac_Lo
pha
?XeYf2:
asl Fac_Lo
rol Fac_Mo
rol Fac_Moh
rol Fac_Ho
dex
bpl ?XeYf2
lda fac_Lo
ora Fac_Mo
ora Fac_Moh
ora Fac_Ho
bne ?Xeyf3
pla
sta Fac_Lo
pla
sta Fac_Mo
pla
sta Fac_Moh
pla
sta Fac_Ho
bra ?xxxxxx
?XeYf1:
lda Fac_Exp
beq ?XeyFerr
?xxxxxx:
lda Fac_Exp
cmp #81h
bne ?Xef4
lda Fac_Lo
ora Fac_Mo
ora Fac_Moh
bne ?Xef4
lda Fac_Ho
cmp #80h
bne ?Xef4
lda Fac_Sgn
bne ?Xef5
; jsr MOVFA
jsr ljsr
dw scibank
dw movfa-1
bra ?ok
?Xef5:
; jsr MOVFA
jsr ljsr
dw scibank
dw MOVFA-1
; jsr X_INV
jsr ljsr
dw scibank
dw x_inv-1
bra ?ok
?Xef4:
lda Arg_Ho
bne ?Xef7
lda Fac_Ho
bne ?Xef8
?Xef9:
; lda #35h
lda #85h
bra ?XeyFerr1
?Xef8: lda Fac_Sgn
beq ?Xef7
bra ?Xef9
?Xef7:
; jsr FPwrt_s
jsr ljsr
dw scibank
dw FPwrt_s-1
bra ?ok
?Xeyf3:
pla
sta Fac_Lo
pla
sta Fac_Mo
pla
sta Fac_Moh
pla
sta Fac_Ho
?XeyFerr:
; lda #55h
lda #85h
?XeyFerr1:
sta <Err_Flag
?ok: rts
xxxxxx:
lda arg_exp+0
pha
lda arg_exp+1
pha
lda arg_exp+2
pha
lda arg_exp+3
pha
lda arg_exp+4
pha
lda arg_exp+5
pha
lda fac_sgn
pha
jsr ljsr
dw scibank
dw TranBinDec-1
jsr DisplayNum_bug_in_sci_add
stz StatusFlag
stz DecExp
stz DecText
stz DecText+1
jsr ljsr
dw scibank
dw fin-1
pla
sta fac_sgn
pla
sta arg_exp+5
pla
sta arg_exp+4
pla
sta arg_exp+3
pla
sta arg_exp+2
pla
sta arg_exp+1
pla
sta arg_exp+0
rts
DisplayNum_bug_in_sci_add:
jsr ljsr
dw scibank
dw five_to_inc_1-1
ldx #11
?42: lda TextBuf,x
bne ShowDecNum
dex
bpl ?42
ldx #11
lda #ffh
?43: sta TextBuf,x
dex
bne ?43
rts
ShowDecNum:
jsr ljsr
dw scibank
dw CutTail-1
lda DecExp ;读取十进位指数部分.
cmp #8 ;if > 9 则用浮点显示法.
bcs ?ShowFloat ;否则用实数表示法.
jsr ljsr
dw scibank
dw add_little_dot-1
ldx #8
?30200:
lda TextBuf,x
cmp #DotK
bne ?3020
lda #ffh
sta TextBuf,x
dex
bra ?3021
?3020: cmp #ffh
bne ?30211
dex
bra ?30200
?30211: cmp #0 ;小数点右边若为 0 则填ff
bne ?3021 ;
lda #0ffh ;
sta TextBuf,x ;
bra ?30200 ;
?3021: lda TextBuf,x ;小数点左边为若为ff 则填0
cmp #ffh ;
bne ?3022 ;
stz TextBuf,x ;
dex ;
bpl ?3021 ;
?3022:
rts
?ShowFloat:
lda DecExp
cmp #0feh
bcc ShowFloat
Realint:
lda DecExp
eor #ffh
ina
tay
?2: ldx #8
?1: lda TextBuf,x
sta TextBuf+1,x
dex
bpl ?1
stz TextBuf
dey
bpl ?2
?3: lda #DotK
sta TextBuf+1
rts
ShowFloat:
ldx #7
?1: lda TextBuf,x
sta TextBuf+1,x
dex
bpl ?1
lda #DotK
sta TextBuf+1
rts
CHK_SQR_FAC:
lda <fac_sgn
and #80h
sta <fac_sgn
stz sciodd_even
jsr copy_fac_to_data_bak1
LDA <ARG_EXP
PHA
LDA <ARG_EXP+1
PHA
LDA <ARG_EXP+2
PHA
LDA <ARG_EXP+3
PHA
LDA <ARG_EXP+4
PHA
LDA <ARG_EXP+5
PHA
jsr ljsr
dw scibank
dw X_INV-1
jsr if_x_large_than_99999999
bcs CHK_SQR_ERROR
;==========================
jsr xxxxxx ;四舍五入
jsr if_x_large_than_99999999
bcs CHK_SQR_ERROR
jsr copy_fac_to_data_bak
LDA <FAC_EXP
SEC
SBC #80H
BCC CHK_SQR_ERROR
BEQ CHK_SQR_ERROR
TAY
JSR CLR_ARG
SQR_1:
JSR ASL_FAC
JSR ROL_ARG
DEY
BNE SQR_1
LDY #4
SQR_2:
LDA FAC_HO-1,Y
BNE CHK_SQR_ERROR
DEY
BNE SQR_2
BBR0 <ARG_LO,CHK_SQR_ERROR
;倒数是奇整数:
inc sciodd_even
jsr copy_data_bak_to_fac
jsr ljsr ;哪目
dw scibank ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -