📄 calcmain.asm
字号:
;|---------------------------------------|
;|Program name : CalcMain.asm |
;|Use bady: 83137 |
;|Programer: Alton |
;| |
;|---------------------------------------|
.area calcmain_date(data,abs)
.org 0xd0
.SetT1H EQU 0x0c ;(32768/10)-1=0x0ccb
.SetT1L EQU 0xcb
.SetT2H EQU 0x68 ;(4M/1.5/100)-1=0x682a
.SetT2L EQU 0x2a
.DecM EQU 0x7c
.HexM EQU 0x7d
.BinM EQU 0x7e
.OctM EQU 0x7f
.INS EQU 0x61
.DEL EQU 0x65
.MODE EQU 0xee
.LEFT EQU 0xcc
.RIGHT EQU 0xdd
.RND EQU 0x60
.ANS EQU 0xa2
.ENG EQU 0xc2
.MADD EQU 0xb5
.MSUB EQU 0xdf
.CL EQU 0xdf
.ShiftL EQU 0x14
.ShiftR EQU 0x15
.PercentEqu EQU 0x77
.DT EQU 0xb5
.Enter EQU 0xa3
.DaltaX EQU 0xbd
.DaltaY EQU 0xbe
.StoCode EQU 0x52
.RclCode EQU 0x53
.CalcEqu EQU 0x7b
.ON EQU 0x66
.TimeOut EQU 0xf0 ;Time Out 6Min(69*16)/3=368sec
.RealseTime EQU 0x32
.KeyDown EQU 0x02
.NoKey EQU 0x00
.HaveKey EQU 0x01
.TimeRels EQU 0x08
.KBTest EQU 0xc0 ;PRTD76
.ATTest EQU 0x0c ;PRTD32
;.KeyC:: .ds 1
;.KeyD:: .ds 1
.TempA:: .ds 1
.PPTemp:: .ds 1
.OP1Temp:: .ds 1
.Sec:: .ds 1
.DataDP:: .ds 1
.FinFlag:: .ds 1
.area calcmain_date1(data,abs)
.org 0xdd
.KeyBuf1:: .ds 1
.KeyBuf:: .ds 1
;.KeyCnt:: .ds 1
;.KeyCodeBuf:: .ds 1
.ModeFlag:: .ds 1
.StoFlag:: .ds 1
.KeyCodeBuf:: .ds 1
.KeyTimeCnt:: .ds 1
.TurboCnt::
.NumCnt:: .ds 1
.FormulaDP:: .ds 1
.ForData:: .ds 1
.area calcmain_code(code,abs)
.org 0x00 ;program start
br .Main
.org 0x06 ;interrupt 1
reti
.org 0x09 ;timer 1
br .InterruptT1
.org 0x0c ;timer 2
br .InterruptT2
.org 0x0f ;interrupt 2
reti
.org 0x12 ;TimeBase
reti
;===========================================
; .Main
;===========================================
.Main::
lda #0h
sta PRT17
lda #0xFF
sta PRTD
lda PRTD
anda #.ATTest
cmpe #0h
brz .ATTestMode
lda #0ffh
sta SP
call .Initial
call ModeIcom
call .EI
br .Start
.Sleep::
lda #0ffh
sta SP
call .IntoSleepMode
lda #01h
sta0 .KeyCnt
call .EI
.Wakeup:
lda0 .KeyCnt
cmpe #0h
brnz .Wakeup
lda0 .KeyCodeBuf
cmpe #.ON
brnz .Sleep
.PowerOn:
call .DI
call .ClrData
call ModeIcom ;Disp Icom
call .LcdcOn
call .EI
lda #>.Count
sta PP
lda #.KeyDown
sta .Count
;-------------------------------------------
.Start:
call .IdleMode
.CheckCode:
lda0 .Sec
cmpe #.TimeOut ;(5.3)SEC*69(45h)=368sec=6Min
brc .Sleep
call .KeyCheck
lda #>.Count
sta PP
lda .Count
cmpe #.HaveKey
brz .ScanKey
call T1chkblank ;Blankcheck
lda #>t1count
sta PP
lda t1count
cmpe #0
brnz .CheckCode
call .IdleMode
lda OP2
anda #40h
brz .CheckCode
call .NormalMode
br .CheckCode
;;;;;Show Icom and Blanking and judge have key press down
.ScanKey:
lda0 .KeyCodeBuf
cmpe #0h
brz .CheckCode
sta0 .KeyPos
lda #>.Count
sta PP
lda #02h
sta .Count
lda #>t1count
sta PP
lda #0h
sta t1count
sta0 .Sec ;reset time out clock
call .DI
;-------------------------------------------
.InputKeyHandle:
lda #>StateFlag
sta PP
lda StateFlag
anda #08h
brz .NormalGet
call BasenKeyCode
cmpe #01h
brz .NormalGet
cmpe #02h
brz .BaseNkey
cmpe #03h
brz .BaseNkey
cmpe #04h
brz .NormalGet
.NormalGet:
call .GetKeyCode
.BaseNkey:
lda0 ErrorFlag
cmpe #0h
brnz .DispDotMatrix
call BasenKeyChk
lda #>.SetFlag
sta PP
lda StateFlag
anda #08h
brnz .BaseN
.NotBaseN:
lda .SetFlag
anda #03h ;check (Rnd Eng)
cmpe #01h
brz .DORnd
cmpe #02h
brz .SetDRG
.EditModeInp:
lda0 .KeyPos
cmpe #.Mode
brz .FunctChoice
.MemCheck:
lda .SFlag
anda #30h
brnz .MemoryCK
;-------------------------------------------
; Function Area
;-------------------------------------------
.FunctChoice:
lda0 .KeyPos
cmpe #0h
cmpe #.Mode ;Mode set
brz .Modeadd
lda0 .ModeFlag
anda #0f0h
brnz .DispDotMatrix
lda0 .KeyPos
cmpe #.MADD
brz .GetValue
cmpe #.MSUB
brz .GetValue
cmpe #0f8h ;drg
brz .DRG
cmpe #.ENG ;eng
brz .DispDotMatrix
cmpe #41h ;shift eng
brz .DispDotMatrix
cmpe #.RND
brz .SetRND
cmpe #.Mode ;Mode set
brz .Modeadd
lda0 .ModeFlag
anda #0f0h
brnz .DispDotMatrix
lda0 .KeyPos
cmpe #.DEL ;del
brz .DispDotMatrix
cmpe #.INS
brz .INSck ;ck ins
lda0 .KeyPos
cmpe #.LEFT
brz .CkLR
cmpe #.RIGHT
brz .CkLR
lda #01h
sta PP
lda .SetFlag
anda #20h ;check (Point Fract Dms)
brnz .NoEquCalc ;.DislayMode ;.ModeDisp
br .CKIns
;===========================================
; .CalcResoult
;===========================================
;;;StateFlag 7 6 5 4 3 2 1 0
;;; Comp SD D R G ( LRMode )
.CalcResoult:
lda0 .KeyPos
cmpe #0h
brz .EmitKeyD
;call ChkDispAns ;stop blanking
lda #>StateFlag
sta PP
lda StateFlag ;c0 judge CMPE SD MODE
anda #0c0h
brz .LrModeCk
.CompSDMod:
lda0 .KeyPos
cmpe #.PercentEqu
brz .GetValue
cmpe #.Enter
brz .GetValue
cmpe #.DT
brz .GetValue
cmpe #.CL
brz .GetValue
cmpe #.CalcEqu
brz .GetValue
call ChkDispAns
br .SaveInputData
;;.CommaFlag=0 normal calc or .CommaFlag=ff data input (for SD REG Mode)
.LrModeCk:
lda0 .CommaFlag
cmpe #0h
brz .CompSDMod
lda0 .KeyPos
cmpe #.DT ;For SD REG Mode
brz .GetValue
cmpe #.CL
brz .GetValue
cmpe #.Enter
brz .EnterErr
cmpe #.PercentEqu
brz .EnterErr
call ChkDispAns
br .SaveInputData
;;;;;;;;;;judge press Enter or Ac or Percent Enter
.GetValue::
lda #>.SFlag
sta PP
lda .SFlag
anda #40h ;40=AC
brnz .EmitKeyD
lda .SFlag
anda #48h ;48=AC&EQU
cmpe #48h
brz .EmitKeyD
cmpe #08h
brnz 1$
lda #>StateFlag
sta PP
lda StateFlag ;c0 judge CMPE SD MODE
anda #47h ;43h
brnz .NoEquCalc
lda0 .KeyPos
cmpe #.MADD
brz 2$
cmpe #.MSUB
brnz 1$
2$:
call .I_trans_Z
br .NodispFormul
1$:
call ChkDispAns
.DoSdRegMode:
.NoEquCalc:
;;;;set equ flag is 08h
lda #>.SFlag
sta PP
lda .SFlag
ora #08h ;08=EQU
sta .SFlag
.DislayMode:
lda0 .keyPos
cmpe #0h
brz .EmitKeyD
;Begin Calculate form Syntax->Posfix->PosValue->ChkDispAns->ShowAnschk
;.Close INT
call .AutoaddANS
;;;;;;.DispPari Choice Parity display (dms ,fract, normal)
call .DispPari
lda0 .keyPos
cmpe #0c3h ;c3=ab/c
brz .JudgeFract
cmpe #0b7h ;b7=dms
brnz .SyntaxFormula
lda #>.SFlag
sta PP
lda .SFlag
anda #30h ;30=RCL & STO
brz .Point2DMS
.SyntaxFormula:
;;FormulaMode
;-------------------------------------------
;;SyntaxFormula
lda0 .FormulaFlag
cmpe #01h
brz .GetMdata
call .FormulaCk
lda0 ErrorFlag
cmpe #0h
brnz .CheckErrorFlag
lda #>.SFlag
sta PP
lda .SFlag
anda #80h ;80 =CALc MODE
brz .NormalSyntax
.GetMdata:
lda0 .StoFlag
cmpe #01h
brz .ChkInpData ;CHECK DATA IS EMPTY FOR FORMULA
br .Showformula
.ChkInpData:
lda0 .DataDP
cmpe #0h
brnz .NormalSyntax
lda #0h ;stoflag 0 =input ok 1= need input
sta0 .StoFlag
br .EmitKeyD
.Showformula:
call .GetMemData ;get Memory variable
lda #>.SFlag
sta PP
lda .SFlag
anda #80h ;80=Calc mdoe
brz .NormalSyntax
lda #01h
sta0 .StoFlag
call ChkDispAns
call ShowAnschk
call CalDispLib
br .EmitKeyD
.NormalSyntax:
;;;;Comp SD mode
;-------------------------------------------
lda #>StateFlag
sta PP
lda StateFlag
anda #08h
brnz .BasePosfix
call .Syntax
lda0 ErrorFlag
cmpe #0h
brnz .CheckErrorFlag
call .Postfix
br .ChkPSError
;;;;BaseN
;-------------------------------------------
.BasePosfix:
call .Basensyntax
lda0 ErrorFlag
cmpe #0h
brnz .CheckErrorFlag
call .BaseNPosfix
lda0 ErrorFlag
cmpe #0h
brnz .DispDotMatrix
;-------------------------------------------
.ChkPSError:
lda0 ErrorFlag
cmpe #0h
brnz .DispDotMatrix
lda #01h ;STO Check
sta PP
lda .SetFlag ;SetFlag 20 is dispmode
anda #~20h
sta .SetFlag
lda T1Flag ;Set Flash underline off
ora #80h
sta T1Flag
lda #00h
sta t1count
call T1chkblank ;-----Blankcheck
lda .SetFlag
ora #20h
sta .SetFlag
;;;;;;;calc posfix data value ;;;;;;;;;;;;;;;;;;;
call .PosValue
.ModeDisp:
lda0 ErrorFlag
cmpe #0h
brnz .CheckErrorFlag
lda #>.SetFlag
sta PP
lda .SFlag
anda #80h
brnz .JudgeFract
lda #0h
sta0 .ForMulaFlag
.JudgeFract:
lda .SetFlag
anda #18h
brz .CheckCarryZ
call .I_trans_X
lda #0h
sta0 OperandX+7
call Fract
call .TransFract
;;;;No calculate data only display OperandZ result
.CheckCarryZ:
;;;;;;;;;Adjust data value last bit carry
lda #01h
sta PP
lda .SetFlag
anda #0ch
cmpe #08h
brz .SetFractToPoint
cmpe #04h
brz .Point2DMS
br .SetFractToPoint
.CheckErrorFlag:
lda0 .FormulaFlag
cmpe #01h
brnz .DispDotMatrix
lda #0h
sta0 .StoFlag
sta0 .FormulaFlag
lda #>.SFlag
sta PP
lda .SFlag
anda #~80h
sta .SFlag
br .DispDotMatrix
.Point2DMS:
call .PointToDMS
.SetFractToPoint:
call .Carry
lda #0h
sta0 OperandZ+7
.OnlyDisp:
call ChkDispAns
lda0 ErrorFlag
cmpe #0h
brnz .CheckErrorFlag
lda0 .FormulaFlag
cmpe #01h
brz .NodispFormul
call ShowAnschk
.NodispFormul:
lda #01h ;;;STO MemORY Check
sta PP
lda .SetFlag
ora #20h
sta .SetFlag
lda .SFlag
anda #30h
cmpe #10h
brz .STOMemory
lda0 .KeyPos
cmpe #.MADD
brz .M_ADD
cmpe #.MSUB
brz .M_SUB
cmpe #0h
br .EmitKeyD
.EnterErr:
lda0 .CommaFlag
cmpe #0h
brz .DoSdRegMode
lda #02h
sta0 ErrorFlag
br .CheckErrorFlag
;;;;;;;;;Save Input data to Ram
.SaveInputData:
lda #>.SetFlag
sta PP
lda .SetFlag
anda #80h
brz .Normalinput
lda .SetFlag
anda #~80h
sta .SetFlag
lda0 .KeyPos
cmpe #0a4h ;+
brz .OnlyDisp
cmpe #0a5h ;-
brz .OnlyDisp
;;;Store data
.Normalinput:
lda0 .SFDP
cmpe #0h
brnz .DispDotMatrix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAX input data is 79 step
lda0 .DataDP
cmpe #79
brc .DispDotMatrix
lda0 .KeyPos
sta font
call .StoData
lda0 .keyPos
cmpe #.DaltaX ;For LR Mode
brz .CalcEstimateXY
cmpe #.DaltaY ;For LR Mode
brz .CalcEstimateXY
;;;;;;Display DotMatrix Font
.DispDotMatrix:
call CalDispLib ;,DispDotMatrix
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -