.OS
.CODE
.ADDR x8000
JMP TRAP_GETC
JMP TRAP_PUTC
JMP TRAP_GETS
JMP TRAP_PUTS
JMP TRAP_GETC_TIMER
JMP TRAP_DRAW_RECT
.ADDR x8200
.CODE
OS_START
CONST R7, #0
RTI
.CODE
TRAP_GETC
CONST R0, #0
HICONST R0, #254
LDR R0, R0, #0
BRzp TRAP_GETC
CONST R0, #2
HICONST R0, #254
LDR R0, R0, #0
RTI
.CODE
TRAP_PUTC
CONST R1, #4
HICONST R1, #254
LDR R1, R1, #0
BRzp TRAP_PUTC
CONST R1, #6
HICONST R1, #254
STR R0, R1, #0
RTI
.CODE
TRAP_GETS
CONST R1, #0
CONST R4, #0
HICONST R4, #32
CMP R0, R4
BRn DONE_GETS_NO_WRITE
CONST R4, #255
HICONST R4, #127
CMP R0, R4
BRp DONE_GETS_NO_WRITE
CONST R4, #0
CONST R4, #0
.CODE
READ
CONST R2, #0
HICONST R2, #254
LDR R2, R2, #0
BRzp READ
CONST R3, #2
HICONST R3, #254
LDR R5, R3, #0
CONST R6, #0
HICONST R6, #13
CMP R5, R6
BRz DONE_GETS
CONST R6, #10
CMP R5, R6
BRz DONE_GETS
CONST R6, #0
CMP R5, R6
BRz DONE_GETS
ADD R4, R0, R1
STR R5, R4, #0
ADD R1, R1, #1
BRnzp READ
.CODE
DONE_GETS
CONST R6, #0
HICONST R6, #0
ADD R4, R0, R1
ADD R4, R4, #1
STR R6, R4, #0
.CODE
DONE_GETS_NO_WRITE
RTI
.CODE
TRAP_PUTS
CONST R4, #0
HICONST R4, #32
CMP R0, R4
BRn DONE_PUTS
CONST R4, #255
HICONST R4, #127
CMP R0, R4
BRp DONE_PUTS
CONST R4, #0
.CODE
LOAD
ADD R2, R4, R0
LDR R1, R2, #0
CMPI R1, #0
BRz DONE_PUTS
CONST R2, #4
HICONST R2, #254
LDR R2, R2, #0
BRzp LOAD
CONST R3, #6
HICONST R3, #254
STR R1, R3, #0
ADD R4, R4, #1
BRnzp LOAD
.CODE
DONE_PUTS
RTI
.CODE
TRAP_GETC_TIMER
CONST R1, #10
HICONST R1, #254
CONST R3, #8
HICONST R3, #254
CONST R2, #208
HICONST R2, #7
STR R2, R1, #0
.CODE
AWAIT_LOOP
LDR R4, R3, #0
BRn DONE_WAITING
CONST R0, #0
HICONST R0, #254
LDR R0, R0, #0
BRn READY_TO_READ
BRz AWAIT_LOOP
.CODE
READY_TO_READ
CONST R0, #2
HICONST R0, #254
LDR R0, R0, #0
.CODE
DONE_WAITING
RTI
.CODE
TRAP_DRAW_RECT
STR R7, R6, #-2
STR R5, R6, #-3
ADD R6, R6, #-3
ADD R5, R6, #0
ADD R6, R6, #-5
STR R0, R5, #-1
STR R1, R5, #-2
STR R2, R5, #-3
STR R3, R5, #-4
STR R4, R5, #-5
CMPI R2, #0
BRnz DONE_DRAWING
CMPI R3, #0
BRnz DONE_DRAWING
CMPI R1, #0
BRnz DONE_DRAWING
CONST R7, #124
CMP R3, R7
BRp DONE_DRAWING
CONST R7, #128
CMP R2, R7
BRp DONE_DRAWING
CMPI R0, #0
BRn DONE_DRAWING
CMPI R1, #0
BRn DONE_DRAWING
ADD R3, R3, R1
ADD R2, R2, R0
.CODE
VALIDATE_SIZE_AND_POSITION_Y
CONST R7, #124
CMP R3, R7
BRp FIX_Y
.CODE
VALIDATE_SIZE_AND_POSITION_X
CONST R7, #128
CMP R2, R7
BRp FIX_X
BRnz SET_UP_NEW_ROW
.CODE
FIX_Y
SUB R7, R3, R7
SUB R0, R0, R7
SUB R3, R3, R7
BRnzp VALIDATE_SIZE_AND_POSITION_X
.CODE
FIX_X
SUB R7, R2, R7
SUB R0, R0, R7
SUB R2, R2, R7
.CODE
SET_UP_NEW_ROW
CONST R7, #128
MUL R7, R1, R7
CONST R4, #0
HICONST R4, #192
ADD R7, R7, R0
ADD R7, R7, R4
ADD R4, R0, #0
BRnzp UPDATE_ROW_IF_DONE
.CODE
DRAW_COLUMN
STR R2, R5, #-3
LDR R2, R5, #-5
STR R2, R7, #0
LDR R2, R5, #-3
ADD R4, R4, #1
ADD R7, R7, #1
.CODE
UPDATE_ROW_IF_DONE
CMP R4, R2
BRn DRAW_COLUMN
ADD R1, R1, #1
CMP R1, R3
BRn SET_UP_NEW_ROW
.CODE
DONE_DRAWING
ADD R6, R5, #0
ADD R6, R6, #3
LDR R5, R6, #-3
LDR R7, R6, #-2
RTI
.DATA
.ADDR xA000
OS_GLOBALS_MEM
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
.ADDR xC000
OS_VIDEO_MEM
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP