📄 oppotriangle_0225.asm
字号:
;/subrutine name : oppotriangle.asm
;/user bady : HE84770
;/fast clock : 4Mhz
;/slow clock : 32768khz
;/programer : Alton
;|---------------------------------------------------|
;| Program:Asin ,Acos ,Atan |
;| Format: |
;| ex: Asin 0.88 |
;| Input: |
;| Input data to OperandX |
;| call .Asin |
;| result: OperandZ |
;| Acos Atan Atan asame |
;| |
;| ps(if ErrorFlag =1 data is Error) |
;|---------------------------------------------------|
;
pS0 EQU 0X00
pS1 EQU pS0+0X0a
pS2 EQU pS1+0X0a
pS3 EQU pS2+0X0a
pS4 EQU pS3+0X0a
pS5 EQU pS4+0X0a
qS1 EQU pS5+0X0a
qS2 EQU qS1+0X0a
qS3 EQU qS2+0X0a
qS4 EQU qS3+0X0a
c_hsqrt2 EQU qS4+0X0a
H_PI EQU c_hsqrt2+0X0a
Point5 EQU H_PI+0X0A
Int2 EQU Point5+0X0a
X EQU Int2+0X0a
Int1 EQU X+0x0a
R180DivPi EQU Int1+0X0a
PiDiv180 EQU R180DivPi+0X0a
Int0 EQU PiDiv180+0X0a
Int30 EQU Int0+0X0a
Int60 EQU Int30+0X0a
Int90 EQU Int60+0X0a
Int45 EQU Int90+0X0a
INT180 equ Int45+0X0a
;;Golden added
COMBN20000 equ 0x0
COMBR24 equ COMBN20000+0x0a
COMBR70 equ COMBR24+0x0a
;;
Id0 EQU 0X00
Id1 EQU Id0+0X0a
Id2 EQU Id1+0X0a
Id3 EQU Id2+0X0a
At0 EQU Id3+0X0a
At1 EQU At0+0X0a
At2 EQU At1+0X0a
At3 EQU At2+0X0a
At4 EQU At3+0X0a
At5 EQU At4+0X0a
At6 EQU At5+0X0a
At7 EQU At6+0X0a
At8 EQU At7+0X0a
At9 EQU At8+0X0a
At10 EQU At9+0X0a
Num1 EQU At10+0X0a
Num2 EQU Num1+0X0a
Num3 EQU Num2+0X0a
Num4 EQU Num3+0X0a
Int1T EQU Num4+0X0a
Int2T EQU Int1T+0X0a
Int1p5 EQU Int2T+0X0a
.CmpLen EQU 0x07
;-----------------------------------------------
.area asin_data(data,ABS)
.org 0xd8
.KeyC::
.M_Data_Offset:: .ds 1
.IdFlag:: .ds 1 ;ID=0,1,2,3,(4=-1)
.KeyD::
.SignXBuf: .ds 1
.KeyCnt::
.SpecialFlag:: .ds 1
.DPBuf:: .ds 1
.area asin_code(code)
;-----------------------------------------------
.Asin::
lda SignX
sta .SignXBuf
lda #0h
sta SignX
call .X_trans_Buf
call .CheckData
lda ErrorFlag
cmpe #01h
brz .ErrorDataAsin
call .SpecialDegree
lda .SpecialFlag
cmpe #0h
brz .NotSpeicalDegree
cmpe #01h
brz .Degree30Asin
cmpe #02h
brz .Degree90Asin
cmpe #03h
brz .Degree0Asin
.NotSpeicalDegree:
lda #Point5
sta .M_Data_Offset
call .InpDataToY
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #.CmpLen ;06
sta DpCount
call CompareData
lda Temp1
cmpe #1h
brz .SinXBeyondPoint5
call .Buf_trans_X ;2002 7/12
call .Condition1
br .AddSymbols
.SinXBeyondPoint5:
call .Buf_trans_X ;2002 7/12
call .Condition2
br .AddSymbols
.Degree30Asin:
lda #Int30
sta .M_Data_Offset
call .InpData
call .ClrZ
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .AddSymbols
.Degree90Asin:
lda #Int90
sta .M_Data_Offset
call .InpData
call .ClrZ
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .AddSymbols
.Degree0Asin:
lda #Int0
sta .M_Data_Offset
call .InpData
call .ClrZ
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .AddSymbols
.ErrorDataAsin:
call .ClrZ
.AddSymbols:
lda .IdFlag
cmpe #05h
brz .EndDegreeAsin
cmpe #0ch
brz .EndDegreeAsin
call .Degree
.EndDegreeAsin:
lda #0h
sta .IdFlag
;Added by Golden
lda .SignXBuf
cmpe #00h
brz 0$
sta SignZ
0$:
ret
;-----------------------------------------------
.Acos::
lda0 SignX
sta0 SignT
lda ErrorFlag
cmpe #01h
brz .EndAcos
call .X_trans_Buf ;2002 7/12
call .SpecialDegree
lda .SpecialFlag
cmpe #0h
brz .NotSpeicalDegreeAcos
cmpe #01h
brz .Degree60Acos
cmpe #02h
brz .Degree0Acos
cmpe #03h
brz .Degree90Acos
.NotSpeicalDegreeAcos:
lda #0ch
sta .IdFlag
call .Asin
lda ErrorFlag
cmpe #01h
brz .EndAcos
lda #0h
sta SignZ
lda .SignXBuf
cmpe #00h
brz .XBeyond0
lda #H_PI
sta .M_Data_Offset
call .InpData
call .Z_trans_Y
call Addition
br .EndAcos
.Degree60Acos:
lda #Int60
sta .M_Data_Offset
call .InpData
lda SignT
ora #0
brnz NegValue
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .EndAcos
.Degree0Acos:
lda #Int0
sta .M_Data_Offset
call .InpData
;added by golden
lda SignT
ora #0
brnz NegValue
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .EndAcos
.Degree90Acos:
lda #Int90
sta .M_Data_Offset
call .InpData
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .EndAcos
;added by golden
NegValue:
call .X_trans_Z
lda #Int180
sta .M_Data_Offset
call .InpData
call .Z_trans_Y
call Subtration
lda #0h
sta PointZ
sta SignZ
br .EndDegreeAcos
.XBeyond0:
lda #H_PI
sta .M_Data_Offset
call .InpData
call .Z_trans_Y
call Subtration
.EndAcos:
lda .IdFlag
cmpe #05h
brz .EndDegreeAcos
call .Degree
.EndDegreeAcos:
lda #0h
sta .IdFlag
ret
;------------------------------------------------
.Atan::
lda ErrorFlag
cmpe #01h
brz .EndChoiceX
lda #0h
sta .IdFlag
lda SignX
sta .SignXBuf
lda #0h
sta SignX
call .X_trans_Buf
call .ClrY
lda #01h
sta0 OperandY+1
call Subtration
lda0 SignZ
cmpe #01h
brnz .Put90toZ
call .Buf_trans_X
lda #0h
sta ErrorFlag
call .SpecialDegree
lda .SpecialFlag
cmpe #0h
brz .NotSpeicalDegreeAtan
cmpe #02h
brz .Degree45
cmpe #03h
brz .Degree0Atan
.NotSpeicalDegreeAtan:
call .ChoiceX
call .DoZ3
call .DoW3
call .DoS1
call .DoS2
call .DoW4
call .ResultAtan
br .Addsymbol
.Put90toZ:
call .ClrZ
lda #90h
sta0 OperandZ+6
br .SinXtoZ
.Degree0Atan:
lda #Int0
sta .M_Data_Offset
call .InpData
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
br .Addsymbol
.Degree45:
lda #Int45
sta .M_Data_Offset
call .InpData
call .X_trans_Z
lda #05h
sta .IdFlag
lda #0h
sta PointZ
.Addsymbol:
lda .SignXBuf
cmpe #01h
brnz .EndAtan
sta SignZ
.EndAtan:
lda .IdFlag
cmpe #05h
brz .EndDegreeAtan
call .Degree
.EndDegreeAtan:
lda #0h
sta .IdFlag
;Added by Golden
.SinXtoZ:
lda .SignXBuf
cmpe #00h
brz .1$
sta SignZ
.1$:
ret
;------------------------------------------------
.Degree::
lda #0h
sta PP
call .Z_trans_X
lda #R180DivPi
sta .M_Data_Offset
call .InpDataToY
call Multiplation
ret
;------------------------------------------------
.Rad::
lda #0h
sta PP
lda #PiDiv180
sta .M_Data_Offset
call .InpDataToY
call Multiplation
ret
;------------------------------------------------
.Gpercent::
call .ClrY
lda #09h
sta0 OperandY+6
lda #01h
sta0 PointY
lda #0h
sta PP
call Multiplation
ret
;------------------------------------------------
.PI::
lda #0h
sta PP
lda #H_PI
sta .M_Data_Offset
call .InpData
call .X_trans_Z
ret
;------------------------------------------------
.SpecialDegree:
lda #00h
sta .SpecialFlag
lda #Point5
sta .M_Data_Offset
call .InpDataToY
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #.CmpLen ;06 2002.2.21
sta DpCount
call CompareData
call .Buf_trans_X ;2002 7/12
lda Temp1
cmpe #0h
brz .Point5
lda #Int1
sta .M_Data_Offset
call .InpDataToY
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #.CmpLen ;2002.02.21
sta DpCount
call CompareData
call .Buf_trans_X ;2002 7/12
lda Temp1
cmpe #0h
brz .Int1
lda #Int0
sta .M_Data_Offset
call .InpDataToY
call LineUp ;adjust point site
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #.CmpLen ;shift addr size2002.02.21
sta DpCount
call CompareData
call .Buf_trans_X ;2002 7/12
lda Temp1
cmpe #0h
brz .Int0
br .EndSpecialDegree
.Point5:
lda #01h
sta .SpecialFlag
br .EndSpecialDegree
.Int1:
lda #02h
sta .SpecialFlag
br .EndSpecialDegree
.Int0:
lda #03h
sta .SpecialFlag
br .EndSpecialDegree
.EndSpecialDegree:
ret
;------------------------------------------------
.CheckData:
lda #0h
sta .SpecialFlag
sta ErrorFlag
lda #Int1
sta .M_Data_Offset
call .InpDataToY
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #.CmpLen ;2002.02.21 06
sta DpCount
call CompareData
lda Temp1
cmpe #01h
brz .DataError
br .EndCheckData
.DataError:
lda #01h
sta ErrorFlag
.EndCheckData:
ret
;------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -