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

📄 postfix.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;/subrutine name : Postfix.asm
;/user bady      : HE83137
;/fast clock     : 4Mhz
;/slow clock     : 32768khz
;/programer      : Alton
.INPP		EQU		0x02
.PSPP		EQU		0x02
.PosfixDP	EQU		0x50
.STPP		EQU		0x03
.ADD		EQU		0xa4
.DEC		EQU		0xa5
.MUL		EQU		0xa6
.DIV		EQU		0xa7
.LC		EQU		0xb2
.RC		EQU		0xb3
.XY 		EQU		0xd3
.SQUX		EQU		0xd7
.POL		EQU		0xd0
.REC		EQU		0xd6
.NUM		EQU		0xa1
.Comma		EQU		0xb4
.DMS		EQU		0xb7
.Fract		EQU		0xc3
.NCR		EQU		0xc9
.NPR		EQU		0xd5
.REG		EQU		0xb1
.MCL		EQU		0xb6
.Degree		EQU		0xab
.Minute		EQU		0xac
.Second		EQU		0xad
.Point		EQU		0xa0
.Negative	EQU		0xa8
		.area   postfix(code)
.Postfix::
		lda0	.DataDP
		cmpe	#0h
		brz	.NoERROR
		call	.InitPsData		
;===========================================
.IN2PS:
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.PosFixEnd
		lda	#>.INDP
		sta	PP		 
		lda0	.INDP
		cmpe	.DataDP
		brz	.PopAllFunc
.STPostfix:		 
		lda0	.PSDP
		cmpe	#0f0h
		brc     .StackErr
		lda	#.INPP
		sta	PP
		lda0	.INDP
		sta	DP
		lda	i
		sta0	.DataBuf
		sta0	Temp2
		incdp
		lda	DP
		sta0	.INDP				
		lda0	.DataBuf
		cmpe	#0ah
		brc	.FunLCode
		lda0	.Buf1
		cmpe	#0h
		brnz	.CmpUpDown
		call	.StoPosfix
		lda0	Temp2
		sta0	.Buf1	
		br	.IN2PS
.StackErr:
		lda	#03h
		sta0	ErrorFlag
		br	.PosFixEnd		
;-------------------------------------------
.PopAllFunc:
 
		lda	#.PSPP
		sta	PP
		lda0	.PSDP
		sta	DP
		decdp	
		lda	DP
		lda	i	
		cmpe	#0ffh		
		brz	.PopAllFunct		
		call	.ClosEndPS
.PopAllFunct:
		lda	#.PSPP
		sta	PP
		lda	#.PosfixDP	;posfix start dp addr
		sta	DP
		lda	i
		cmpe	#.MCL
		brz	.EndPostfix	
		lda	#.STPP
		sta	PP
		lda0	.STDP
		sta	DP
		lda	DP
		cmpe	#0ffh
		brz	.EndPostfix
		lda	i
		sta0	.DataBuf
		lda0	.FractCount
		cmpe	#01h
		brnz	.NoFractcode
		lda0	.DataBuf
		cmpe	#0dfh
		brnz	.NoFractcode
		lda	#0deh
		sta0	.DataBuf
.NoFractcode:		
		lda0	.DataBuf
		cmpe	#0h
		brz	.EndPostfix		
		cmpe	#.LC
		brz	.NotC
		cmpe	#.RC
		brz	.NotC
		cmpe	#.REG
		brnz	.ClsFont		 
		lda0	.CommaFlag
		cmpe	#0ffh
		brnz	.NotC
.ClsFont:					
		call	.NoSignal
		call	.ClosEndPS
.NotC:
		lda0	.STDP
		deca
		sta0	.STDP
		br	.PopAllFunct
.EndPostfix:
		lda	#.PSPP
		sta	PP
		lda0	.PSDP
		sta	DP
		decdp
		lda	#0eeh		;EEH  Posfix end code
		sta	i
.PosFixEnd:
		 
		lda0	ErrorFlag
		cmpe	#0h
		brz	.NoERROR
		lda0	.INDP
		sta0	.SFDP
		ret
.NoERROR:	
		lda	#03h
		sta	PP
		lda	#0h
		sta	DP
.CKloop:		
		lda	i
		cmpe	#0h
		brz	.EndFractCK
		cmpe	#0dfh	;Fract 1
		brz	.CKnext
		incdp	
		br	.CKloop
.CKnext:
		incdp
		lda	i
		cmpe	#0b2h	;(
		brnz	.CKloop
		lda	#02h
		sta0	ErrorFlag	
.EndFractCK:			
		ret		
;-------------------------------------------
.FunLCode::
		
		lda0	.DataBuf
		sta0	.DataBuf+1
		call	.CheckPari
		call	.CheckMem
		lda0	.AfterPari
		cmpe	#01h
		brz	.MemoryData
		br	.CmpFunct
;-------------------------------------------
.CmpUpDown:
		lda0	.Buf1
		sta0	.DataBuf+1
		cmpe	#.Degree	;#0aah
		brz	.SaveNum
		cmpe	#.Minute	;#0bbh
		brz	.SaveNum
		cmpe	#.Second	;#0ceh
		brz	.SaveNum
		cmpe	#.Negative
		brz	.SaveNum
		cmpe	#.Comma
		brz	.SaveNum
		cmpe	#0b0h		;---5
		brz	.SaveNum	;---5
		cmpe	#0aeh
		brz	.SaveNum
		lda0	.DataBuf
		sta0	.Buf1		;.Buf1
		lda0	.DataBuf+1
		sta0	.DataBuf
		call	.CheckPari
		lda0	Temp2
		sta0	.DataBuf
		lda	#02h
		sta	PP
		lda	#.PosfixDP
		sta	DP
		lda	i
		cmpe	#0h
		brz	.SaveNum
		lda0	.AfterPari
		cmpe	#0h
		brz	.SaveNum
		cmpe	#01h
		brz	.ErrorFlag
		cmpe	#02h
		brz	.SaveNum
		cmpe	#03h
		brz	.SaveNum 
		cmpe	#04h
		brz	.SaveNum 
		cmpe	#05h		;cnr
		brz	.SaveNum
		cmpe	#06h		;05h
		brz	.SaveNum
		cmpe	#07h		;06h
		brz	.SaveNum
		cmpe	#08h		;07
		brz	.SaveNum		
		cmpe	#09h
		brz	.SaveNum
		cmpe	#0ah
		brz	.ErrorFlag
		cmpe	#0bh
		brz	.SaveNum
		cmpe	#0ch
		brz	.SaveNum		 	
		br	.IN2PS
;-------------------------------------------		
.SaveNumCls:
		call	.ClosEndPS
.SaveNum:	
		lda0	.DataBuf
		cmpe	#.Point		;Point
		brnz	.NumSave	
		lda0	.PointFlag
		inca
		sta0	.PointFlag
		cmpe	#02h
		brc	.ErrorFlag	
.NumSave:		
		call	.StoPosfix
		lda0	Temp2
		sta0	.Buf1
		br	.IN2PS
.ErrorFlag:
		lda	#02h
		sta0	ErrorFlag
		br	.PosFixEnd

;===========================================
.CmpFunct:	
		
		lda0	.DataBuf
		cmpe	#.POL
		brz	.DoPolRec 
		cmpe	#.REC
		brz	.DoPolRec 
		cmpe	#.MCL
		brz	.StoInPosfix
		cmpe	#.DMS
		brz	.DoDMS
		cmpe	#.Fract
		brz	.DoFract
		cmpe	#.Point
		brz	.SaveNum
		cmpe	#.Negative
		brz	.SetSignDec
		cmpe	#.ADD
		brz	.SetADDEC
		cmpe	#.DEC
		brz	.SetADDEC
		cmpe	#.MUL
		brz	.SetMulDiv
		cmpe	#.DIV
		brz	.SetMulDiv
		cmpe	#.LC
		brz	.LeftC
		cmpe	#.RC
		brz	.RightC
		cmpe	#.Comma
		brz	.DoComma
		cmpe	#0b0h		;---5
		brz	.DoSime
		lda0	.AfterPari
		cmpe	#01h
		brz	.MemoryData
		br	.FuncCheck
;-------------------------------------------		
.DoComma:	
		 
		lda	#0h
		sta0	.DmsCount
		sta0	.PointFlag
		call	.ClosEndPS		
		call	.PushData	;.StoFuncPS	;----219		
		call	.ClosEndPS
		br	.EndComma	;219
.DoSime:	
		 
		lda	#0h
		sta0	.PointFlag
		call	.ClosEndPS		
		call	.PushData	;.StoFuncPS	;----219		
		call	.ClosEndPS
		lda	#0b0h
		sta0	.Buf1
		br	.EndSime	;219		
.PopPolRec:		
		lda	#.STPP
		sta	PP
		lda0	.STDP
		sta	DP
		lda	i		
		sta0	.DataBuf		
		cmpe	#.POL		;pol(
		brz	.EndComma
		cmpe	#.REG
		brz	.EndComma	;REG MODE	
		cmpe	#.REC		;rec(
		brz	.EndComma
		cmpe	#0h
		brz	.SynErr
		call	.StoFuncPS		
		call	.ClosEndPS
		lda0	.STDP
		deca
		sta0	.STDP
		br	.PopPolRec
		
.EndComma:
		lda	#.Comma
		sta0	.Buf1
.EndSime:		
		lda	#>StateFlag
		sta	PP
		lda	StateFlag
		anda	#07h
		brz	.EndComCK
		lda	#0ffh
		sta0	.CommaFlag
.EndComCK:		
		br	.IN2PS		
;-------------------------------------------		
.DoPolRec:

		lda0	.DataBuf
		sta0	.Buf2	
		lda0	.Buf1
		sta0	.DataBuf	 
		sta0	.DataBuf+1
		call	.CheckPari
		call	.CheckMem
		lda0	.Buf2
		sta0	.DataBuf
		lda0	.Buf1
		cmpe	#07ah		; formula '=' 
		brz	.PushPolRec
		lda0	.INDP
		cmpe	#01h
		brz	.PushPolRec
		lda0	.Buf1
		cmpe	#.LC
		brz	.PushPolRec
		cmpe	#.RC
		brz	.MulPushPolRec
		lda0	.AfterPari
		cmpe	#01h
		brz	.MulPushPolRec
		cmpe	#02h
		brz	.MulPushPolRec
		cmpe	#03h
		brz	.PushPolRec
		cmpe	#04h
		brz	.PushPolRec
		cmpe	#05h
		brz	.PushPolRec
		cmpe	#06h
		brz	.PushPolRec		
		cmpe	#09h
		brz	.PushPolRec
		cmpe	#0ah
		brz	.MulPushPolRec
		cmpe	#0ch
		brz	.PushPolRec
		br	.SynErr 
		
		
		
.MulPushPolRec:
		call	.ClosEndPS
		lda0	.DataBuf
		sta0	.Buf2
		lda	#.Mul
		sta0	.DataBuf
		call	.PushData
		lda0	.Buf2
		sta0	.DataBuf		
.PushPolRec:		
		call	.PushData
		lda	#.LC
		sta0	.DataBuf		 
		call	.StoStack
		lda0	.Buf2
		sta0	.Buf1
		br	.IN2PS	
;---------------------------------------	
.DoDMS:
		lda	#0h
		sta0	.PointFlag
		 
.DoDmsCount:		
		lda0	.DmsCount
		cmpe	#0h
		brz	.IsDegree
		cmpe	#01h
		brz	.IsMin
		cmpe	#02h
		brz	.IsSec
		cmpe	#03h
		brc	.SynErr
.IsDegree:
		lda	#.Degree			
		sta0	.DataBuf				
		sta0	.Buf1
		call	.ClosEndPS
		call	.PushData
		lda0	.DmsCount
		inca
		sta0	.DmsCount	
		br	.IN2PS		
.IsMin:		
		lda	#.Minute
		sta0	.DataBuf
		br	.PushDms
.IsSec:
		lda	#.Second
		sta0	.DataBuf	
		br	.PushDms							
.PushDms:	
		lda0	.DmsCount
		inca
		sta0	.DmsCount			
		lda0	.DataBuf
		sta0	.Buf1
		call	.ClosEndPS
		call	.PushData
		lda	#0aeh
		sta0	.DataBuf
		lda	#09h		;07hae
		sta0	.AfterPari
		br	.PushStack 
.SynErr:
		lda	#02h
		sta0	ErrorFlag		
		br	.PosFixEnd
;-------------------------------------------
.DoFract::
		lda	#0h
		sta0	.FractTrsCnt	;clr LC cnt
		lda	#01h
		sta	PP
		lda	.SetFlag
		anda	#14h
		brnz	.NoSetFract
		 
.NoSetFract:		
		lda0	.DmsCount
		cmpe	#0h
		brz	.NoDmsMode
		lda0	.Buf1
		cmpe	#0abh
		brz	.NoDmsMode
		cmpe	#0ach
		brz	.NoDmsMode
		cmpe	#0adh
		brz	.NoDmsMode
		cmpe	#0aeh		;3/13 add 
		brz	.NoDmsMode
		cmpe	#.RC
		brz	.NoDmsMode
		br	.SynErr
.NoDmsMode:			
		lda	#0h
		sta0	.PointFlag		
		lda0	.DmsCount
		cmpe	#0h
		brz	.DOFractCount
		lda	#0h
		sta0	.DmsCount
.DOFractCount:		
		lda0	.FractCount
		cmpe	#0h
		brz	.Intnum
		cmpe	#01h
		brz	.IntFen
		cmpe	#02h		
		br	.MaErr			;4/19
.Intnum:		
		lda	#0dfh
		sta0	.DataBuf
		br	.PushFrant	
.IntFen:			
		lda	#0deh
		sta0	.DataBuf
		br	.PushFrant
.PushFrant:
		lda0	.FractCount
		inca
		sta0	.FractCount
		br	.PushStackCls
.MaErr:
		lda	#01h
		sta0	ErrorFlag		
		br	.PosFixEnd						
;-------------------------------------------
.SetADDEC:	
		lda0	.DmsCount
		cmpe	#0h
		brz	.AddNoDms
		lda0	.Buf1
		cmpe	#.Degree
		brz	.ClrDmsCntA
		cmpe	#.Minute
		brz	.ClrDmsCntA
		cmpe	#.Second
		brz	.ClrDmsCntA
		cmpe	#0aeh
		brz	.ClrDmsCntA
		cmpe	#.RC
		brnz	.SynErr
		 		     ;	.AddNoDms 2003 1 14.
.ClrDmsCntA:
		lda	#0h
		sta0	.DmsCount		
.AddNoDms:	
		lda0	.FractTrsCnt
		cmpe	#0h
		brnz	.CKNormaldec		
		lda0	.Buf1
		cmpe	#0dfh
		brz	.AdjustOpt
		cmpe	#0deh
		brz	.ClrFractCnt
		 	
.CheckFractCNT:		
		lda0	.FractCount
		cmpe	#01h
		brz	.AdjustOptmuldiv
		cmpe	#02h
		brz	.ClrFractCntMul
.CKNormaldec:		
		lda	#0h
		sta0	.PointFlag				
		lda0	.INDP	;	.PSDP
		cmpe	#01h
		brz	.Sign								
		lda0	.Buf1
		cmpe	#.NUM
		brnc	.PushStackCls		 
		cmpe	#0aeh		;06h
		brz	.PushStack 
		cmpe	#.ADD
		brz	.Sign
		cmpe	#.DEC
		brz	.Sign
		cmpe	#.Mul
		brz	.Sign
		cmpe	#.Div
		brz	.Sign
		cmpe	#.LC
		brz	.Sign
		cmpe	#.Negative
		brz	.Sign
		cmpe	#.Comma
		brz	.Sign
		cmpe	#0b0h	;----5
		brz	.Sign	
		cmpe	#.RC
		brz	.ClrFractCntMul		;.PushStackCls	
		lda0	.DataBuf
		sta0	Temp2;		.Buf2
		lda0	.Buf1
		sta0	.DataBuf
		sta0	.DataBuf+1
		call	.CheckPari
		call	.CheckMem
		lda0	Temp2
		sta0	.Buf1
		sta0	.DataBuf		
		lda0	.AfterPari
		cmpe	#01h
		brz	.PushStackCls
		cmpe	#02h
		brz	.PushStackCls
		cmpe	#05h		;CNR
		brz	.Sign	
		cmpe	#06h		;06h
		brz	.Sign
		cmpe	#0ah
		brz	.PushStack	;.Sign	
		cmpe	#09h
		brz	.Sign	
		cmpe	#07h		;06h
		brz	.Sign	;.PushStack 
		cmpe	#0bh
		brz	.Sign		
		cmpe	#0ch
		brz	.Sign
		br	.IN2PS

			
.ClrFractCnt:		
		lda	#0h
		sta0	.FractCount		
		br	.Sign		;
.ClrFractCntMul:		
		lda	#0h
		sta0	.FractCount		
		br	.PushStackCls 			

.ClrDmsCnt:		 
		lda	#0h
		sta0	.DmsCount		
		br	.PushStack 
;-------------------------------------------		
.SetMulDiv:
		lda0	.DmsCount
		cmpe	#0h
		brz	.MulNoDms
		lda0	.Buf1
		cmpe	#.Degree
		brz	.ClrDmsCntM
		cmpe	#.Minute
		brz	.ClrDmsCntM
		cmpe	#.Second
		brz	.ClrDmsCntM
		cmpe	#0aeh
		brz	.ClrDmsCntM
		cmpe	#.RC
		brz	.MulNoDms
		br	.SynErr
.ClrDmsCntM:
		lda	#0h
		sta0	.DmsCount		
.MulNoDms:			 
		lda	#0h
		sta0	.PointFlag
		lda0	.FractCount
		cmpe	#01h
		brz	.AdjustOptmuldiv	;.AdjustOpt
		cmpe	#02h
		brz	.ClrFractCntMul
		lda0	.DmsCount
		cmpe	#0h
		brnz	.ClrDmsCnt		
		br	.PushStackCls;    .PushStack 
.AdjustOpt:
		
		lda	#.STPP
		sta	PP
		lda0	.STDP
		sta	DP
		lda	i
		cmpe	#.LC
		brz	.PushStackCls
		lda	#0deh
		sta	i		 
		br	.Sign
.AdjustOptmuldiv:
		lda0	.FractTrsCnt
		cmpe	#0h
		brnz	.PushStackCls
		lda	#.STPP
		sta	PP
		lda0	.STDP
		sta	DP
.ChangDFMul:		
		lda	i
		cmpe	#.LC
		brz	.SearchFract
		lda	#0deh
		sta	i
		lda	#0h
		sta0	.FractCount			 
		br	.PushStackCls 
.SearchFract:
		decdp
		br	.ChangDFMul					 
;-------------------------------------------
.SetSignDec:
		lda0	.Buf1
		cmpe	#0dfh
		brz	.CheckFractCNT1	
		cmpe	#0deh
		brnz	.CKNormalsigndec
.CheckFractCNT1:				
		lda0	.FractCount
		cmpe	#01h
		brz	.AdjustOpt
		cmpe	#02h
		brz	.ClrFractCnt
.CKNormalsigndec:		
		lda0	.DataBuf
		sta0	Temp2		;.Buf2
		lda0	.INDP
		cmpe	#01h
		brz	.Sign
		lda0	.Buf1
		cmpe	#.ADD
		brz	.Sign
		cmpe	#.DEC
		brz	.Sign
		cmpe	#.Mul
		brz	.Sign
		cmpe	#.Div
		brz	.Sign
		cmpe	#.LC
		brz	.Sign
		cmpe	#.Negative
		brz	.Sign
		cmpe	#.Comma
		brz	.Sign
		cmpe	#0b0h	;----5
		brz	.Sign
		lda0	.Buf1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -