📄 baseposfix.asm
字号:
;/subrutine name : BasenPosfix.asm
;/user bady : HE
;/fast clock : 4Mhz
;/slow clock : 32768khz
;/programer : Alton
.ADD EQU 0xa4
.DEC EQU 0xa5
.MUL EQU 0xa6
.DIV EQU 0xa7
.LC EQU 0xb2
.RC EQU 0xb3
.And EQU 0x20
.Or EQU 0x21
.Xnor EQU 0x22
.Xor EQU 0x23
.Not EQU 0x24
.Neg EQU 0x25
.area basepostfix(code,rel)
.BaseNPosfix::
call .InitBasePos
.TransbaseN:
lda #>.INDP
sta PP
lda0 .INDP
cmpe .DataDP
brz .EndBasePos
lda #02h
sta PP
lda0 .INDP
sta DP
lda i
sta0 .DataBuf
cmpe #10h ;0----9 A---F
brc .CmpOperand
br .DOnum
.NextDp:
lda0 .INDP
inca
sta0 .INDP
br .TransbaseN
.SynError:
lda #02h
sta0 ErrorFlag
br .EedBasen
;-------------------------------------------
.EndBasePos:
lda #02h
sta PP
lda0 .PSDP
sta DP
decdp
lda DP
cmpe #0ffh
brz .BasePosEnd
call .ClosEndPS
.BasePosEnd:
lda0 .DecFlag
anda #01h
brz 1$
lda0 .DataBuf
sta0 .Buf3
lda #0a8h
sta0 .DataBuf
lda #0h
sta0 .DecFlag
call .StoStack
lda0 .Buf3
sta0 .DataBuf
1$:
lda #03h
sta PP
lda0 .STDP
sta DP
lda DP
cmpe #0ffh
brz .PosEnd
lda i
sta0 .DataBuf
cmpe #0h
brz .PosEnd
cmpe #.LC
brz .NotSave
call .NoSignal
call .ClosEndPS
.NotSave:
lda0 .STDP
deca
sta0 .STDP
br .BasePosEnd
.PosEnd:
lda #02h
sta PP
lda0 .PSDP
sta DP
decdp
lda #0eeh
sta i
.EedBasen:
ret
;-------------------------------------------
.CmpOperand:
call .CheckMem
call .Paricmp
lda0 .DataBuf
cmpe #.LC
brz .DOLC
cmpe #.RC
brz .DORC
lda0 .AfterPari
sta0 .BeforePari
lda0 .AfterPari
cmpe #01h
brz .DOmemSto
cmpe #04h
brz .DOnum
cmpe #0eh
brz .DONotNeg
cmpe #0ch
brz .DOaddec
cmpe #0dh
brz .DOmuldiv
cmpe #0fh
brz .TransCode
br .DO2Operand
;-------------------------------------------
.DOLC:
lda0 .INDP
cmpe #0h
brz .TOStack
lda0 .Buf1
cmpe #.LC
brz .TOStack
cmpe #.RC
brz .RCAddMulCls
call .GetPari
lda0 .AfterPari
cmpe #0h
brz .TOStack
cmpe #01h
brz .LCAddMulCls
cmpe #04h
brz .LCAddMulCls
cmpe #07h
brz .TOStack
cmpe #08h
brz .TOStack
cmpe #09h
brz .TOStack
cmpe #0ch
brz .TOStack
cmpe #0dh
brz .TOStack
cmpe #0eh
brz .TOStack
br .NextDp
;-------------------------------------------
.DORC:
lda0 .DataBuf
sta0 .Buf1
call .ClosEndPS
call .Addnegtive
call .ClosEndPS
call .CkRightC
br .NextDp
;-------------------------------------------
.DOmemSto:
lda0 .INDP
cmpe #0h
brz 1$
call .GetPari
lda0 .AfterPari
cmpe #01h
brz .MemAddMulCls
cmpe #04h
brz .MemAddMulCls
br .Sto2PS
1$:
lda0 .DataBuf
sta0 .Buf3
lda #26h
sta0 .DataBuf
call .StoStack
lda0 .Buf3
sta0 .DataBuf
.Sto2PS:
call .NotSign ;.PosFixSto
br .NextDp
;-------------------------------------------
.DOnum:
lda0 .INDP
cmpe #0h
brz .AddBase
call .GetPari
lda0 .AfterPari
cmpe #04h
brz .Sto2PS
cmpe #0fh
brz .Sto2PS
br .AddBase
;-------------------------------------------
.DOaddec:
lda0 .INDP
cmpe #0h
brz .Signal
call .GetPari
lda0 .Buf1
cmpe #.LC
brz 1$
cmpe #.RC
brz 2$ ;.PushStackCls
lda0 .AfterPari
cmpe #01h
brz 2$ ;.PushStackCls
cmpe #04h
brz 2$ ;.PushStackCls
1$:
br .Signal ;.PushStackCls
2$:
call .Addnegtive
br .PushStackCls
;-------------------------------------------
.DOmuldiv:
call .Addnegtive
br .PushStackCls
;-------------------------------------------
.TransCode:
lda0 .INDP
cmpe #0h
brz .PushStack
lda0 .Buf1
cmpe #.LC
brz .PushStack
call .GetPari
lda0 .AfterPari
cmpe #01h
brz .AddMulCls
cmpe #04h
brz .AddMulCls
br .PushStack
;-------------------------------------------
.DO2Operand:
call .GetPari
lda0 .AfterPari
cmpe #0h
brz .PushStack
cmpe #01h
brz .PushStackCls
cmpe #04h
brz .PushStackCls
br .NextDp
;-------------------------------------------
.DONotNeg:
lda0 .INDP
cmpe #0h
brz .TOStack
call .GetPari
lda0 .Buf1
cmpe #.LC
brz .TOStack
cmpe #.RC
brz .AddMul
lda0 .AfterPari
cmpe #01h
brz .AddMulCls
cmpe #04h
brz .AddMulCls
cmpe #0dh
brz .PushStack
cmpe #0ch
brz .PushStack
cmpe #09h
brz .PushStack
cmpe #08h
brz .PushStack
cmpe #07h
brz .PushStack
cmpe #0eh
brz .TOStack
cmpe #0fh
brz .SynError
br .NextDp
;-------------------------------------------
.AddBase:
call .AddBaseUnit
br .NextDp
.AddBaseUnit:
call .BaseModeChk
lda0 .DataBuf
sta0 .Buf3
lda0 .DataBuf+1
sta0 .DataBuf
call .CheckMem
call .Paricmp
lda0 .AfterPari
sta0 .BeforePari
call .Push2Stack
lda0 .Buf3
sta0 .DataBuf
call .StoFuncPS
lda0 .DataBuf
sta0 .Buf1
ret
;-------------------------------------------
.GetPari::
lda0 .DataBuf
sta0 .Buf2
lda0 .INDP
cmpe #0h
brz .Firstdp
lda0 .Buf1
sta0 .DataBuf
.Firstdp:
call .CheckMem
call .Paricmp
lda0 .Buf2
sta0 .DataBuf
ret
;-------------------------------------------
.Signal:
lda0 .DataBuf
cmpe #.ADD
brz .IsADD
lda0 .DecFlag
inca
sta0 .DecFlag
.IsADD:
lda0 .DataBuf
sta0 .Buf1
br .NextDp
;-------------------------------------------
.PushStackCls:
call .ClosEndPS
.PushStack:
lda0 .DataBuf
sta0 .Buf1
call .Push2Stack
br .NextDp
;-------------------------------------------
.TOStack:
lda0 .DecFlag
anda #01h
brz 1$
lda0 .DataBuf
sta0 .Buf3
lda #0a8h
sta0 .DataBuf
lda #0h
sta0 .DecFlag
call .StoStack
lda0 .Buf3
sta0 .DataBuf
1$:
call .StoStack
lda0 .DataBuf
sta0 .Buf1
br .NextDp
.LCAddMulCls:
call .Addnegtive
call .ClosEndPS
.LCAddMul:
lda #03h
sta PP
lda0 .STDP
sta DP
lda i
cmpe #2Ah
brc 11$
cmpe #26h
brnc 11$
sta0 .DataBuf
lda0 .STDP
deca
sta0 .STDP
call .StoFuncPS
call .ClosEndPS
11$:
lda0 .DataBuf
sta0 .Buf1
lda #.MUL
sta0 .DataBuf
call .StoStack
lda #.LC
sta0 .DataBuf
call .StoStack
lda0 .DataBuf
sta0 .Buf1
br .NextDp
.RCAddMulCls:
call .ClosEndPS
.RCAddMul:
lda0 .DataBuf
sta0 .Buf1
lda #.MUL
sta0 .DataBuf
call .CheckMem
call .Paricmp
lda0 .AfterPari
sta0 .BeforePari
call .StoStack
lda #.LC
sta0 .DataBuf
call .StoStack
lda0 .DataBuf
sta0 .Buf1
br .NextDp
;-------------------------------------------
.AddMulCls:
call .ClosEndPS
.AddMul:
lda0 .DataBuf
sta0 .Buf3
lda #.MUL
sta0 .DataBuf
call .CheckMem
call .Paricmp
lda0 .AfterPari
sta0 .BeforePari
call .Push2Stack
lda0 .Buf3
sta0 .DataBuf
call .CheckMem
call .Paricmp
lda0 .AfterPari
sta0 .BeforePari
call .Push2Stack
br .NextDp
;-------------------------------------------
.MemAddMulCls:
lda0 .DataBuf
sta0 .Buf3
call .Addnegtive
call .ClosEndPS
.MemAddMul:
lda #03h
sta PP
lda0 .STDP
sta DP
lda i
cmpe #2Ah
brc 12$
cmpe #26h
brnc 12$
sta0 .DataBuf
lda0 .STDP
deca
sta0 .STDP
call .StoFuncPS
call .ClosEndPS
12$:
lda0 .DataBuf
sta0 .Buf1
lda #.MUL
sta0 .DataBuf
call .StoStack
lda0 .Buf3
sta0 .DataBuf
call .StoFuncPS
lda0 .DataBuf
sta0 .Buf1
br .NextDp
;-------------------------------------------
.PosFixSto:
lda0 .DecFlag
anda #01h
brz .NotSign
lda #0h
sta0 .DecFlag
lda0 .DataBuf
sta0 .Buf3
lda #0a8h
sta0 .DataBuf
lda #0h
sta0 .DecFlag
call .StoStack
lda0 .Buf3
sta0 .DataBuf
.NotSign:
lda #02h
sta PP
lda0 .PSDP
sta DP
lda0 .DataBuf
sta i
lda0 .PSDP
inca
sta0 .PSDP
lda0 .DataBuf
sta0 .Buf1
ret
;-------------------------------------------
.Push2Stack:
lda0 .DataBuf
sta0 .Buf2
lda #03h
sta PP
lda0 .STDP
sta DP
cmpe #0ffh
brz .Fstdp
lda i
cmpe #0h
brz .Fstdp
cmpe #.LC
brz .Fstdp
sta0 .DataBuf
call .CheckMem
call .Paricmp
lda #0h
sta PP
lda0 .BeforePari
suba .AfterPari
brz .PopStk
brnc .PopStk
lda0 .Buf2
sta0 .DataBuf
call .StoStack
lda0 .DataBuf
sta0 .Buf1
br .EndPushStk
.Fstdp:
call .StoStack
lda0 .DataBuf
sta0 .Buf1
br .EndPushStk
.PopStk:
call .PosFixSto
call .ClosEndPS
lda0 .Buf3
sta0 .DataBuf
lda0 .Buf2
sta0 .DataBuf
lda0 .STDP
deca
sta0 .STDP
cmpe #0ffh
brnz .Push2Stack
br .Fstdp
.EndPushStk:
ret
.Addnegtive::
call .ClosEndPS
lda0 .DecFlag
anda #01h
brz 1$
lda #0h
sta0 .DecFlag
lda0 .DataBuf
sta0 .Buf3
lda #0a8h
sta0 .DataBuf
lda #0h
sta0 .DecFlag
call .StoFuncPS
lda0 .Buf3
sta0 .DataBuf
1$:
ret
;-------------------------------------------
.Paricmp::
lda0 .DataBuf
cmpe #10h
brc .OP1
lda #04h
sta0 .AfterPari
br .EndParicmp
.OP1:
cmpe #.LC
brnz .OP2
lda #0h
sta0 .AfterPari
br .EndParicmp
.OP2:
cmpe #.RC
brnz .OP3
lda #0h
sta0 .AfterPari
br .EndParicmp
.OP3:
cmpe #.Xor
brnz .OP4
lda #07h
sta0 .AfterPari
br .EndParicmp
.OP4:
cmpe #.Xnor
brnz .OP5
lda #07h
sta0 .AfterPari
br .EndParicmp
.OP5:
cmpe #.Or
brnz .OP6
lda #07h ;8
sta0 .AfterPari
br .EndParicmp
.OP6:
cmpe #.And
brnz .OP7
lda #09h
sta0 .AfterPari
br .EndParicmp
.OP7:
cmpe #.Not
brnz .OP8
lda #0eh
sta0 .AfterPari
br .EndParicmp
.OP8:
cmpe #.Neg
brnz .OP9
lda #0eh
sta0 .AfterPari
br .EndParicmp
.OP9:
cmpe #.ADD
brnz .OP10
lda #0ch
sta0 .AfterPari
br .EndParicmp
.OP10:
cmpe #.DEC
brnz .OP11
lda #0ch
sta0 .AfterPari
br .EndParicmp
.OP11:
cmpe #.MUL
brnz .OP12
lda #0dh
sta0 .AfterPari
br .EndParicmp
.OP12:
cmpe #.DIV
brnz .OP13
lda #0dh
sta0 .AfterPari
br .EndParicmp
.OP13:
cmpe #26h
brnz .OP14
lda #0fh
sta0 .AfterPari
br .EndParicmp
.OP14:
cmpe #27h
brnz .OP15
lda #0fh
sta0 .AfterPari
br .EndParicmp
.OP15:
cmpe #28h
brnz .OP16
lda #0fh
sta0 .AfterPari
br .EndParicmp
.OP16:
cmpe #29h
brnz .OP17
lda #0fh
sta0 .AfterPari
br .EndParicmp
.OP17:
cmpe #0a8h
brnz .EndParicmp
lda #0eh
sta0 .AfterPari
br .EndParicmp
.EndParicmp:
ret
;-------------------------------------------
.InitBasePos:
lda #50h
sta0 .PSDP ;Postfix dp
lda #0h
sta0 .STDP ;stack dp
lda #0h
sta0 .INDP
sta0 .Buf1
sta0 .DataBuf
sta0 .BeforePari
sta0 .DecFlag
sta0 .AfterPari
call .ClrP2
call .ClrP3
.EndInitBasePos:
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -