289 lines
4.7 KiB
NASM
289 lines
4.7 KiB
NASM
|
|
.include hwdefs.asm
|
|
|
|
.define CursorBlinkTicks 20
|
|
|
|
.org SYSROM
|
|
lds stack
|
|
ldv interrupt
|
|
ldp screen.char
|
|
|
|
jss clearscreen
|
|
|
|
lda 0
|
|
sta *cursorTimer
|
|
|
|
{
|
|
lda 1
|
|
sta *io.timer
|
|
hlt
|
|
jss handleKeys
|
|
jss blinkCursorTick
|
|
jpr }
|
|
|
|
;-----------
|
|
|
|
FUNC / { / irt
|
|
interrupt:
|
|
;stp *inttempp
|
|
;ldp s / stp *inttemps
|
|
;lds intstack
|
|
;psh f / psh a / psh b / psh c / psh q
|
|
|
|
run
|
|
|
|
;pop q / pop c / pop b / pop a / pop f
|
|
;ldp *inttemps / lds p
|
|
;ldp *inttempp
|
|
jpr }
|
|
|
|
FUNC handleKeys:
|
|
lda *keyboard.queue
|
|
jpz {
|
|
jss keypressed
|
|
jpr handleKeys
|
|
}
|
|
rts
|
|
|
|
FUNC blinkCursorTick:
|
|
lda *cursorTimer
|
|
jnz {
|
|
ldp *screenPos
|
|
ldc ph / ldb pl / adc $04 / ldp cb ; get color addr from screen pos
|
|
;lda *p / xor $80 / sta *p ; toggle highlight bit
|
|
lda *p / xor $03 / sta *p ; toggle black/white
|
|
|
|
lda CursorBlinkTicks
|
|
}
|
|
dec a
|
|
sta *cursorTimer
|
|
rts
|
|
|
|
FUNC numshifts: ")!@#$%^&*("
|
|
FUNC keys_2430: ";=,.-/`"
|
|
FUNC keys_2430_shift: ":+<>_?~"
|
|
FUNC keys_6063: "[\\]'"
|
|
FUNC keys_6063_shift: "{|}\""
|
|
FUNC keys_numpad: "0123456789*+\n-./"
|
|
FUNC keys_numpad_shift: "0123456789*+\n_.?"
|
|
|
|
FUNC keypressed: ; key in a
|
|
ldb a
|
|
|
|
; check for shift
|
|
and $7F
|
|
cmp $10 / jpz keyShift / cmp $14 / jnz keyNoShift
|
|
keyShift:
|
|
lda b / and $80 / shr 7 / sta *shiftDown
|
|
rts
|
|
keyNoShift:
|
|
|
|
lda b
|
|
and $80
|
|
jnz { / rts / }
|
|
|
|
lda b
|
|
and $7F
|
|
; ldp *screenPos / sta *p++ / stp *screenPos
|
|
; jss printhex / lda b
|
|
cmp "A" / jlt { / cmp "Z" / jgt { ; letter
|
|
ldb *shiftDown / jnz {
|
|
add $20
|
|
}
|
|
jss printchar
|
|
rts
|
|
} / }
|
|
cmp "0" / jlt { / cmp "9" / jgt { ; number
|
|
ldb *shiftDown / jpz {
|
|
sub "0" / ldb a / ldp numshifts / adp b
|
|
lda *p
|
|
}
|
|
jss printchar
|
|
rts
|
|
} / }
|
|
ldp keys_2430 / ldq keys_2430_shift / ldb 24 / ldc 30 / jss printcharblock ; symbols
|
|
ldp keys_6063 / ldq keys_6063_shift / ldb 60 / ldc 63 / jss printcharblock
|
|
ldp keys_numpad / ldq keys_numpad_shift / ldb 96 / ldc 111 / jss printcharblock
|
|
cmp 13 / jnz { ; newline
|
|
jss clearCursor
|
|
ldp *screenPos
|
|
ldb pl / ldc ph
|
|
lda b / and $C0 / ldb a
|
|
ldp cb
|
|
adp $40
|
|
stp *screenPos
|
|
jss updateMoveScreen
|
|
rts
|
|
}
|
|
cmp 9 / jnz { ; tab
|
|
|
|
rts
|
|
}
|
|
cmp 32 / jnz { / lda 32 / jsr printchar / rts / } ; space
|
|
cmp 8 / jnz { ; backspace
|
|
ldc 1 / jss moveback
|
|
rts
|
|
}
|
|
cmp 37 / jnz { ; left
|
|
ldc 0 / jss moveback
|
|
rts
|
|
}
|
|
cmp 39 / jnz { ; right
|
|
jss clearCursor
|
|
ldp *screenPos
|
|
lda ph / cmp $0B / jnz {
|
|
lda pl / cmp $FF / jnz {
|
|
rts
|
|
}
|
|
}
|
|
adp 1
|
|
stp *screenPos
|
|
rts
|
|
}
|
|
jss printhex
|
|
rts
|
|
|
|
FUNC moveforward:
|
|
|
|
rts
|
|
|
|
FUNC moveback: ; c = delete char (bool)
|
|
jss clearCursor
|
|
ldp *screenPos
|
|
lda ph / cmp $08 / jnz {
|
|
lda pl / tst a / jnz {
|
|
rts
|
|
}
|
|
}
|
|
adp -1
|
|
lda *p / jpz { ; one character
|
|
tst c / jpz {
|
|
lda 0 / sta *p
|
|
}
|
|
stp *screenPos
|
|
jpr | ; blank line
|
|
{
|
|
lda pl / and $3F ; stop at beginning of line
|
|
adp -1
|
|
jpz |
|
|
lda *p
|
|
jpz }
|
|
adp 1
|
|
stp *screenPos
|
|
}
|
|
rts
|
|
|
|
FUNC printcharblock:
|
|
cmp b / jlt { / cmp c / jgt {
|
|
ldc *shiftDown / jpz {
|
|
ldp q
|
|
}
|
|
sub b / ldb a / adp b
|
|
lda *p / jss printchar
|
|
pop q / rts
|
|
} / }
|
|
rts
|
|
|
|
FUNC clearCursor:
|
|
psh a / psh b / psh c
|
|
ldp *screenPos
|
|
ldc ph / ldb pl / adc $04 / ldp cb ; get highlight addr from screen pos
|
|
;lda *p / and $7F / sta *p ; clear highlight bit
|
|
lda $3E / sta *p ; set to black
|
|
lda 0 / sta *cursorTimer
|
|
pop c / pop b / pop a
|
|
rts
|
|
|
|
FUNC updateMoveScreen:
|
|
ldp *screenPos
|
|
lda ph
|
|
cmp $0C
|
|
jnz {
|
|
jss moveScreenUp
|
|
}
|
|
rts
|
|
|
|
FUNC printchar:
|
|
jss clearCursor
|
|
ldp *screenPos / sta *p++ / stp *screenPos
|
|
jss updateMoveScreen
|
|
rts
|
|
|
|
FUNC moveScreenUp:
|
|
ldp (SCREEN+$40)
|
|
ldq (SCREEN)
|
|
ldb $0F / {
|
|
ldc $40 / {
|
|
lda *p++ / sta *q++
|
|
dec c
|
|
jnz }
|
|
dec b
|
|
jnz }
|
|
stq *screenPos
|
|
ldb $00
|
|
ldc $20
|
|
ldp (SCRCLR+$40*$0F)
|
|
lda $40 / {
|
|
stb *q++
|
|
stc *p++
|
|
dec a
|
|
jnz }
|
|
rts
|
|
|
|
FUNC printhex:
|
|
ldp *screenPos
|
|
ldb a
|
|
and $F0
|
|
shr 4
|
|
add "0"
|
|
cmp "9" / jle { / add 7 / }
|
|
jss printchar
|
|
lda b
|
|
and $0F
|
|
add "0"
|
|
cmp "9" / jle { / add 7 / }
|
|
jss printchar
|
|
lda 0
|
|
jss printchar
|
|
stp *screenPos
|
|
rts
|
|
|
|
FUNC clearscreen:
|
|
ldp screen.char / stp *screenPos
|
|
ldq screen.color
|
|
lda $00 ; blank
|
|
;ldb $20 ; white color, no highlight
|
|
ldb $3E ; black color, no highlight
|
|
ldc 128 ; 128*8 = 4k of each p and q
|
|
{
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
sta *p++
|
|
stb *q++
|
|
dec c
|
|
jnz }
|
|
rts
|
|
|
|
.org SYSRAM
|
|
inttempp: word
|
|
inttemps: word
|
|
intstack: byte[(128-4)]
|
|
stack: byte[128]
|
|
|
|
.org USERRAM
|
|
screenPos: word
|
|
shiftDown: byte
|
|
cursorTimer: byte
|