Uploaded unfinished libraries.
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
; Subroutines for printing int16 values to the console.
|
||||
|
||||
#Include print.asm
|
||||
#Include int16.asm
|
||||
|
||||
#Program
|
||||
|
||||
start:
|
||||
SETD PrintInt16dec
|
||||
CALL printInt16dec
|
||||
CALL lineFeed
|
||||
HALT
|
||||
|
||||
printInt16dec:
|
||||
; We're gonna print an int16 as a decimal.
|
||||
; The Data Pointer is set to our int16.
|
||||
; Let's copy it into a temporary location where we can set up an operand.
|
||||
LDA
|
||||
INCD
|
||||
LDB
|
||||
SETD PrintInt16dec
|
||||
STA
|
||||
INCD
|
||||
STB
|
||||
; Load the buffer address into the Data Pointer
|
||||
SETD PrintInt16decBuffer
|
||||
; Let's clear it before we use it.
|
||||
RSTA STA INCD STA INCD STA INCD STA INCD STA
|
||||
PSHD ; Save the offset Data Pointer value to the Stack.
|
||||
printInt16decLoop:
|
||||
SETD PrintInt16dec
|
||||
; Set Operand B to 0d10.
|
||||
DPUP 0x02
|
||||
INIA 0d10
|
||||
RSTB
|
||||
STB
|
||||
INCD
|
||||
STA
|
||||
DPDN 0x03
|
||||
; Now call int16div.
|
||||
CALL int16div
|
||||
; Store the remainder. We only need the low byte.
|
||||
INCD
|
||||
LDA
|
||||
POPD ; Pop the pointer to the current place value from the Stack.
|
||||
STA
|
||||
DECD ; Decrement and store the Data Pointer on the Stack again.
|
||||
PSHD
|
||||
; If the dividend is 0, we're done.
|
||||
INCD
|
||||
LDA
|
||||
INCD
|
||||
LDB
|
||||
OR
|
||||
BRQ printInt16decLoopDone
|
||||
; Now move the quotient up to Operand A.
|
||||
SETD PrintInt16dec
|
||||
DPUP 0x02
|
||||
LDA
|
||||
INCD
|
||||
LDB
|
||||
DPDN 0x03
|
||||
STA
|
||||
INCD
|
||||
STB
|
||||
; Now branch back to the loop.
|
||||
BRI printInt16decLoop
|
||||
printInt16decLoopDone:
|
||||
SETD PrintInt16decBuffer
|
||||
INIB 0x0A
|
||||
printBufferHex:
|
||||
LDA
|
||||
CCF
|
||||
SUB
|
||||
BRQ continue
|
||||
CALL printByteHex
|
||||
CALL blankSpace
|
||||
INCD
|
||||
BRI printBufferHex
|
||||
continue:
|
||||
CALL lineFeed
|
||||
; All we need to do now is pop the Data Pointer value back off the stack and print the digits until we reach a value of 0x0A.
|
||||
POPD
|
||||
SETD PrintInt16decBuffer
|
||||
LDA
|
||||
INIB 0x0A
|
||||
BRA printInt16decSkipLeadingZeros
|
||||
BRI printInt16decLoop1
|
||||
printInt16decSkipLeadingZeros:
|
||||
INCD
|
||||
LDA
|
||||
BRA printInt16decSkipLeadingZeros
|
||||
printInt16decLoop1:
|
||||
LDA
|
||||
CCF
|
||||
SUB
|
||||
; If Q is zero, we've hit the terminator and are done printing.
|
||||
BRQ printInt16decDone
|
||||
CALL printDecimalDigit
|
||||
INCD
|
||||
; Branch back to see if there are more digits to print.
|
||||
BRI printInt16decLoop1
|
||||
printInt16decDone:
|
||||
RET ; Return to the caller.
|
||||
|
||||
|
||||
|
||||
#Data
|
||||
|
||||
PrintInt16dec:
|
||||
0x07 0xD1 ; Operand A
|
||||
0x00 0x00 ; Operand B
|
||||
|
||||
PrintInt16decBuffer:
|
||||
; This needs to be a five byte buffer to store each digit value.
|
||||
; Let's make it six and use the last byte as a terminator outside the range of 0-9.
|
||||
0x00 0x00 0x00 0x00 0x00 0x0A
|
||||
Reference in New Issue
Block a user