CosmOS pre-alpha and launchable application versions of old programs.
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
; Exercises console.asm, the modern console library.
|
||||
;
|
||||
; Every routine in it is called here with the cases that are easy to get wrong: a zero,
|
||||
; the largest thing that fits, the boundary either side of a carry, and a leading zero
|
||||
; that should not print. The reading half is driven by consoleTest.in, which ends with a
|
||||
; line longer than the buffer so that the truncation and the swallowing of the rest are
|
||||
; both shown rather than assumed.
|
||||
;
|
||||
; There is no BRI at the top of console.asm, so this program says where it begins in its
|
||||
; Vector Segment. That is the whole of the arrangement the old library needed a branch for.
|
||||
|
||||
#Include console.asm
|
||||
|
||||
#Program
|
||||
|
||||
start:
|
||||
SETD.0 Banner
|
||||
CALL printString
|
||||
CALL newLine
|
||||
|
||||
; ---- Hexadecimal ----
|
||||
SETD.0 HexLabel
|
||||
CALL printString
|
||||
RSTA
|
||||
CALL printByteHex
|
||||
INIA 0x20
|
||||
OUTA 0x00
|
||||
INIA 0x0F
|
||||
CALL printByteHex
|
||||
INIA 0x20
|
||||
OUTA 0x00
|
||||
INIA 0xA5
|
||||
CALL printByteHex
|
||||
INIA 0x20
|
||||
OUTA 0x00
|
||||
INIA 0xFF
|
||||
CALL printByteHex
|
||||
CALL newLine
|
||||
|
||||
SETD.0 WordHexLabel
|
||||
CALL printString
|
||||
SETD.0 Zero
|
||||
CALL printWordHex
|
||||
INIA 0x20
|
||||
OUTA 0x00
|
||||
SETD.0 Thousand
|
||||
CALL printWordHex
|
||||
INIA 0x20
|
||||
OUTA 0x00
|
||||
SETD.0 Largest
|
||||
CALL printWordHex
|
||||
CALL newLine
|
||||
|
||||
; ---- Decimal, one byte wide ----
|
||||
; Zero has to print a digit, and a hundred has to not print its tens as a blank.
|
||||
SETD.0 ByteLabel
|
||||
CALL printString
|
||||
RSTA
|
||||
CALL printByteDecimal
|
||||
CALL blank
|
||||
INIA 0d7
|
||||
CALL printByteDecimal
|
||||
CALL blank
|
||||
INIA 0d42
|
||||
CALL printByteDecimal
|
||||
CALL blank
|
||||
INIA 0d100
|
||||
CALL printByteDecimal
|
||||
CALL blank
|
||||
INIA 0d255
|
||||
CALL printByteDecimal
|
||||
CALL newLine
|
||||
|
||||
; ---- Decimal, two bytes wide ----
|
||||
; Ten thousand and one is the case that catches a place that stops counting too soon,
|
||||
; and the three zeroes in the middle of it are the case that catches a leading zero
|
||||
; test applied after the first digit.
|
||||
SETD.0 WordLabel
|
||||
CALL printString
|
||||
SETD.0 Zero
|
||||
CALL printWordDecimal
|
||||
CALL blank
|
||||
SETD.0 Nine
|
||||
CALL printWordDecimal
|
||||
CALL blank
|
||||
SETD.0 Ten
|
||||
CALL printWordDecimal
|
||||
CALL blank
|
||||
SETD.0 TwoFiveFive
|
||||
CALL printWordDecimal
|
||||
CALL blank
|
||||
SETD.0 Thousand
|
||||
CALL printWordDecimal
|
||||
CALL blank
|
||||
SETD.0 TenThousandOne
|
||||
CALL printWordDecimal
|
||||
CALL blank
|
||||
SETD.0 Largest
|
||||
CALL printWordDecimal
|
||||
CALL newLine
|
||||
|
||||
; ---- Spaces ----
|
||||
; None of them is a fair number to ask for, and has to print nothing at all.
|
||||
SETD.0 SpaceLabel
|
||||
CALL printString
|
||||
INIA 0x7C
|
||||
OUTA 0x00
|
||||
RSTA
|
||||
CALL printSpaces
|
||||
INIA 0x7C
|
||||
OUTA 0x00
|
||||
INIA 0d4
|
||||
CALL printSpaces
|
||||
INIA 0x7C
|
||||
OUTA 0x00
|
||||
CALL newLine
|
||||
|
||||
; ---- Reading ----
|
||||
SETD.0 ReadLabel
|
||||
CALL printString
|
||||
CALL newLine
|
||||
|
||||
readLoop:
|
||||
SETD.0 LineBuffer
|
||||
INIB 0d16
|
||||
CALL readLine
|
||||
SETD.0 LineLength
|
||||
STQ.0
|
||||
|
||||
; Running out is not an empty line, and this is where the difference shows.
|
||||
SETD.0 ConsoleEndOfInput
|
||||
LDA.0
|
||||
BNA readDone
|
||||
|
||||
INIA 0x5B
|
||||
OUTA 0x00
|
||||
SETD.0 LineBuffer
|
||||
CALL printString
|
||||
INIA 0x5D
|
||||
OUTA 0x00
|
||||
CALL blank
|
||||
SETD.0 LineLength
|
||||
LDA.0
|
||||
CALL printByteDecimal
|
||||
CALL newLine
|
||||
BRI readLoop
|
||||
|
||||
readDone:
|
||||
SETD.0 Ended
|
||||
CALL printString
|
||||
CALL newLine
|
||||
HALT
|
||||
|
||||
; One space. Used between the numbers so that each line reads as a list.
|
||||
blank:
|
||||
INIA 0x20
|
||||
OUTA 0x00
|
||||
RET
|
||||
|
||||
#Data
|
||||
|
||||
Banner:
|
||||
"console test"
|
||||
HexLabel:
|
||||
"byte hex: "
|
||||
WordHexLabel:
|
||||
"word hex: "
|
||||
ByteLabel:
|
||||
"byte dec: "
|
||||
WordLabel:
|
||||
"word dec: "
|
||||
SpaceLabel:
|
||||
"spaces: "
|
||||
ReadLabel:
|
||||
"lines read:"
|
||||
Ended:
|
||||
"end of input"
|
||||
|
||||
Zero:
|
||||
0x00 0x00
|
||||
Nine:
|
||||
0x00 0x09
|
||||
Ten:
|
||||
0x00 0x0A
|
||||
TwoFiveFive:
|
||||
0x00 0xFF
|
||||
Thousand:
|
||||
0x03 0xE8
|
||||
TenThousandOne:
|
||||
0x27 0x11
|
||||
Largest:
|
||||
0xFF 0xFF
|
||||
|
||||
LineLength:
|
||||
0x00
|
||||
LineBuffer:
|
||||
#Reserve 0d17
|
||||
|
||||
#Vectors
|
||||
|
||||
Boot start
|
||||
Reference in New Issue
Block a user