lda CURS_Y
cmp #SCR_HEIGHT ; screen height
bne plot
- lda #0 ; wrap around to line 0
- sta CURS_Y
+ dec CURS_Y ; bottom of screen reached, scroll
+ ldx #0
+scroll: lda SCRNBASE+$00A5,x
+ sta SCRNBASE+$0085,x
+ lda SCRNBASE+$01A5,x
+ sta SCRNBASE+$0185,x
+ lda SCRNBASE+$02A5,x
+ sta SCRNBASE+$0285,x
+ inx
+ bne scroll
plot: ldy CURS_Y
lda ScrLo,y
--- /dev/null
+;
+; unsigned char kbhit (void);
+;
+
+ .export _kbhit
+ .include "osic1p.inc"
+
+_kbhit:
+ lda #%11111110 ; Select first keyboard row
+scan:
+ sta KBD ; Select keyboard row
+ tax ; Save A
+ lda KBD ; Read keyboard columns
+ ora #$01 ; Mask out lsb (Shift Lock), since we ignore it
+ cmp #$FF ; No keys pressed?
+ bne keypressed
+ txa ; Restore A
+ sec ; Want to shift in ones
+ rol a ; Rotate row select to next bit position
+ cmp #$FF ; Done?
+ bne scan ; If not, continue
+ ldx #$00 ; High byte of return is always zero
+ lda #$00 ; Return false
+ rts
+keypressed:
+ ldx #$00 ; High byte of return is always zero
+ lda #$01 ; Return true
+ rts
SCRNBASE := $D000 ; Base of video RAM\r
INPUTC := $FD00 ; Input character from keyboard\r
RESET := $FF00 ; Reset address, show boot prompt\r
+KBD := $DF00 ; Polled keyboard register\r
\r
; Other definitions\r
VIDEORAMSIZE = $0400 ; Size of C1P video RAM (1 kB)\r