⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci_add.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 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 + -