📄 base.asm
字号:
HEX_DIGITS equ 8
BIN_DIGITS equ 10
OCT_DIGITS equ 10
.area base_code(code,rel)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Public functions
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Base-10 -> Base-2
;Input:OperandX (Dec)
;Output:OperandZ (Bin)
Base_Dec2Bin::
lda0 SignX
sta0 SignTmp
ora #0
brz 1$
lda #0
sta0 SignX
call .X_trans_R
call .ClrY
lda #05h
sta0 OperandY+5
lda #13h
sta0 OperandY+6
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #07h
sta DpCount
call CompareData
lda Temp1
cmpe #2
brz 0$
lda #1
sta0 ErrorFlag
br 3$
;OperandX<0
0$:
call .R_trans_X
lda0 SignTmp
sta0 SignX
call .ClrY
lda #10h
sta0 OperandY+5
lda #24h
sta0 OperandY+6
call Addition
call .Z_trans_X
br 2$
1$:
call .X_trans_R
call .ClrY
lda #05h
sta0 OperandY+5
lda #12h
sta0 OperandY+6
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #07h
sta DpCount
call CompareData
lda Temp1
cmpe #2
brz 22$
lda #1
sta0 ErrorFlag
br 3$
22$:
call .R_trans_X
2$:
call Dec2Bin
3$:
ret
;Base-10 -> Base-8
;Input:OperandX (Dec)
;Output:OperandZ (Oct)
Base_Dec2Oct::
lda0 SignX
sta0 SignTmp
ora #0
brz 1$
lda #0
sta0 SignX
call .X_trans_R
call .ClrY
lda #05h
sta0 OperandY+2
lda #36h
sta0 OperandY+3
lda #87h
sta0 OperandY+4
lda #09h
sta0 OperandY+5
lda #13h
sta0 OperandY+6
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #07h
sta DpCount
call CompareData
lda Temp1
cmpe #2
brz 0$
lda #1
sta0 ErrorFlag
br 2$
;OperandX<0
0$:
call .R_trans_X
lda0 SignTmp
sta0 SignX
call .ClrY
lda #10h
sta0 OperandY+2
lda #73h
sta0 OperandY+3
lda #74h
sta0 OperandY+4
lda #18h
sta0 OperandY+5
lda #24h
sta0 OperandY+6
call Addition
call .Z_trans_X
1$:
call Dec2Oct
2$:
ret
;Base-10 -> Base-16
;Input:OperandX (Dec)
;Output:OperandZ (Hex)
Base_Dec2Hex::
lda0 SignX
sta0 SignTmp
call CheckDecLimit
lda0 ErrorFlag
cmpe #1
brc 2$
lda0 SignTmp
ora #0
brz 1$
;OperandX<0
0$:
lda0 SignTmp
sta0 SignX
call .ClrY
lda #42h
sta0 OperandY+2
lda #94h
sta0 OperandY+3
lda #96h
sta0 OperandY+4
lda #72h
sta0 OperandY+5
lda #96h
sta0 OperandY+6
call Addition
call .Z_trans_X
1$:
call Dec2Hex
2$:
ret
;Input:OperandX (Hex)
;Output:OperandZ (Bin)
Base_Hex2Bin::
call Base_Hex2Dec
call .Z_trans_X
call Base_Dec2Bin
ret
;Input:OperandX (Hex)
;Output:OperandZ (Oct)
Base_Hex2Oct::
call Base_Hex2Dec
call .Z_trans_X
call Base_Dec2Oct
ret
;Input:OperandX (Hex)
;Output:OperandZ (Dec)
Base_Hex2Dec::
lda #0
sta PP
call CheckHexLimit
lda0 ErrorFlag
cmpe #1
brc 3$
lda #HEX_DIGITS
sta0 BufferZ
lda #@Hex2DecTab
sta BufferZ+1
lda #<Hex2DecTab
sta BufferZ+2
call HBO2DecBase
lda0 Buffer+3
anda #0xf0
rorc
rorc
rorc
rorc
anda #0x0f
cmpe #8
brnc 3$
call .Z_trans_X
call .ClrY
lda #42h
sta0 OperandY+2
lda #94h
sta0 OperandY+3
lda #96h
sta0 OperandY+4
lda #72h
sta0 OperandY+5
lda #96h
sta0 OperandY+6
call Subtration
3$:
ret
;Input:OperandX (Bin)
;Output:OperandZ (Oct)
Base_Bin2Oct::
call Base_Bin2Dec
call .Z_trans_X
call Base_Dec2Oct
ret
;Input:OperandX (Bin)
;Output:OperandZ (Hex)
Base_Bin2Hex::
call Base_Bin2Dec
call .Z_trans_X
call Base_Dec2Hex
ret
;Input:OperandX (Bin)
;Output:OperandZ (Decimal)
Base_Bin2Dec::
lda #0
sta PP
call CheckBinLimit
lda0 ErrorFlag
cmpe #1
brc 3$
lda #BIN_DIGITS
sta0 BufferZ
lda #@Bin2DecTab
sta BufferZ+1
lda #<Bin2DecTab
sta BufferZ+2
call HBO2DecBase
lda0 Buffer+2
anda #0xf0
rorc
rorc
rorc
rorc
anda #0x0f
cmpe #1
brnc 3$
call .Z_trans_X
call .ClrY
lda #10h
sta0 OperandY+5
lda #24h
sta0 OperandY+6
call Subtration
3$:
ret
;Input:OperandX (Oct)
;Output:OperandZ (Bin)
Base_Oct2Bin::
call Base_Oct2Dec
call .Z_trans_X
call Base_Dec2Bin
ret
;Input:OperandX (Oct)
;Output:OperandZ (Hex)
Base_Oct2Hex::
call Base_Oct2Dec
call .Z_trans_X
call Base_Dec2Hex
ret
;Input:OperandX (Oct)
;Output:OperandZ (decimal)
Base_Oct2Dec::
lda #0
sta PP
call CheckOctLimit
lda0 ErrorFlag
cmpe #1
brc 3$
lda #OCT_DIGITS
sta0 BufferZ
lda #@Oct2DecTab
sta BufferZ+1
lda #<Oct2DecTab
sta BufferZ+2
call HBO2DecBase
lda0 Buffer+2
anda #0xf0
rorc
rorc
rorc
rorc
anda #0x0f
cmpe #4
brnc 3$
call .Z_trans_X
call .ClrY
lda #10h
sta0 OperandY+2
lda #73h
sta0 OperandY+3
lda #74h
sta0 OperandY+4
lda #18h
sta0 OperandY+5
lda #24h
sta0 OperandY+6
call Subtration
3$:
ret
;;Input:OperandX (decimal)
;Output:ErrorFlag
CheckDecLimit::
call .X_trans_R
lda0 SignX
ora #0
brz 0$
lda #0
sta0 SignX
call .ClrY
lda #21h
sta0 OperandY+2
lda #47h
sta0 OperandY+3
lda #48h
sta0 OperandY+4
lda #36h
sta0 OperandY+5
lda #49h
sta0 OperandY+6
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #07h
sta DpCount
call CompareData
lda Temp1
cmpe #2
brz 1$
lda #1
sta0 ErrorFlag
br 2$
0$:
call .ClrY
lda #21h
sta0 OperandY+2
lda #47h
sta0 OperandY+3
lda #48h
sta0 OperandY+4
lda #36h
sta0 OperandY+5
lda #48h
sta0 OperandY+6
call LineUp
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #07h
sta DpCount
call CompareData
lda Temp1
cmpe #2
brz 1$
lda #1
sta ErrorFlag
br 2$
1$:
call .R_trans_X
2$:
ret
;;Input:OperandX (Oct)
;Output:ErrorFlag
CheckOctLimit::
lda0 PointX
cmpe #(OCT_DIGITS+1)
brnc 0$
lda #1
sta0 ErrorFlag
0$:
ret
;;Input:OperandX (Hex)
;Output:ErrorFlag
CheckHexLimit::
lda0 PointX
cmpe #(HEX_DIGITS+1)
brnc 0$
lda #1
sta0 ErrorFlag
0$:
ret
;;Input:OperandX (Binary)
;Output:ErrorFlag
CheckBinLimit::
lda0 PointX
;cmpe #(BIN_DIGITS+1)
cmpe #(BIN_DIGITS+1)
brnc 0$
lda #1
sta0 ErrorFlag
0$:
ret
;InputOperandX,OperandY (decimal)
;Input:MathOp=1 (decimal)
;Output:OperandZ (decimal)
LogicAnd::
lda #1
sta0 MathOp
call LogicMathOp
ret
;InputOperandX,OperandY (decimal)
;Input:MathOp=2 (decimal)
;Output:OperandZ (decimal)
LogicOr::
lda #2
sta0 MathOp
call LogicMathOp
ret
;InputOperandX,OperandY (decimal)
;Input:MathOp=3 (decimal)
;Output:OperandZ (decimal)
LogicXor::
lda #3
sta0 MathOp
call LogicMathOp
ret
;InputOperandX,OperandY (decimal)
;Input:MathOp=4 (decimal)
;Output:OperandZ (decimal)
LogicXnor::
lda #4
sta0 MathOp
call LogicMathOp
ret
;InputOperandX (decimal)
;Output:OperandZ (decimal)
LogicNeg::
call .X_trans_Buf
call CheckDecLimit
lda0 ErrorFlag
cmpe #1
brc 2$
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -