mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-02 16:20:55 +11:00
Compare commits
3 Commits
08392fee60
...
5e0a548faa
Author | SHA1 | Date | |
---|---|---|---|
|
5e0a548faa | ||
|
b9292eb8d0 | ||
|
3a68807cd4 |
@ -17,9 +17,10 @@
|
|||||||
; *** Variables ***
|
; *** Variables ***
|
||||||
; Set to previously received scan code
|
; Set to previously received scan code
|
||||||
.equ KBD_PREV_KC KBD_RAMSTART
|
.equ KBD_PREV_KC KBD_RAMSTART
|
||||||
; Whether Shift key is pressed
|
; Whether Shift key is pressed. When not pressed, holds 0. When pressed, holds
|
||||||
.equ KBD_SHIFT_ON KBD_PREV_KC+1
|
; 0x80. This allows for quick shifting in the glyph table.
|
||||||
.equ KBD_RAMEND KBD_SHIFT_ON+1
|
.equ KBD_SHIFT_ON @+1
|
||||||
|
.equ KBD_RAMEND @+1
|
||||||
|
|
||||||
kbdInit:
|
kbdInit:
|
||||||
xor a
|
xor a
|
||||||
@ -45,59 +46,50 @@ kbdGetC:
|
|||||||
cp KBD_KC_BREAK
|
cp KBD_KC_BREAK
|
||||||
jr z, .break
|
jr z, .break
|
||||||
cp KBD_KC_EXT
|
cp KBD_KC_EXT
|
||||||
jr z, .ignore
|
jr z, .nothing
|
||||||
ex af, af' ; restore saved KC
|
ex af, af' ; restore saved KC
|
||||||
|
; A scan code over 0x80 is out of bounds or prev KC tell us we should
|
||||||
|
; skip. Ignore.
|
||||||
cp 0x80
|
cp 0x80
|
||||||
jr nc, .ignore
|
jr nc, .nothing
|
||||||
; No need to skip, code within bounds, we have something!
|
; No need to skip, code within bounds, we have something!
|
||||||
call .isShift
|
call .isShift
|
||||||
jr z, .shiftPressed
|
jr z, .shiftPressed
|
||||||
; Let's see if there's a ASCII code associated to it.
|
; Let's see if there's a ASCII code associated to it.
|
||||||
push hl ; --> lvl 1
|
push hl ; --> lvl 1
|
||||||
ld hl, KBD_SHIFT_ON
|
ld hl, KBD_SHIFT_ON
|
||||||
bit 0, (hl)
|
or (hl) ; if shift is on, A now ranges in 0x80-0xff.
|
||||||
ld hl, kbdScanCodes ; no flag changed
|
ld hl, kbdScanCodes ; no flag changed
|
||||||
jr z, .shiftNotPressed
|
|
||||||
; Shift is being pressed. Use Shifted table.
|
|
||||||
ld hl, kbdScanCodesS
|
|
||||||
.shiftNotPressed:
|
|
||||||
call addHL
|
call addHL
|
||||||
ld a, (hl)
|
ld a, (hl)
|
||||||
pop hl ; <-- lvl 1
|
pop hl ; <-- lvl 1
|
||||||
or a
|
or a
|
||||||
jp z, unsetZ ; no code. Keep A at 0, but unset Z
|
jr z, kbdGetC ; no code.
|
||||||
; We have something!
|
; We have something!
|
||||||
cp a ; ensure Z
|
cp a ; ensure Z
|
||||||
ret
|
ret
|
||||||
.shiftPressed:
|
.shiftPressed:
|
||||||
ld a, 1
|
ld a, 0x80
|
||||||
ld (KBD_SHIFT_ON), a
|
ld (KBD_SHIFT_ON), a
|
||||||
jr .ignore ; to actual char to return
|
jr .nothing ; no actual char to return
|
||||||
.break:
|
.break:
|
||||||
ex af, af' ; restore saved KC
|
ex af, af' ; restore saved KC
|
||||||
call .isShift
|
call .isShift
|
||||||
jr nz, .ignore
|
jr nz, .nothing
|
||||||
; We had a shift break, update status
|
; We had a shift break, update status
|
||||||
xor a
|
xor a
|
||||||
ld (KBD_SHIFT_ON), a
|
ld (KBD_SHIFT_ON), a
|
||||||
; continue to .ignore
|
; continue to .nothing
|
||||||
.ignore:
|
|
||||||
; A scan code over 0x80 is out of bounds or prev KC tell us we should
|
|
||||||
; skip. Ignore.
|
|
||||||
xor a
|
|
||||||
jp unsetZ
|
|
||||||
.nothing:
|
.nothing:
|
||||||
; We have nothing. Before we go further, we'll wait a bit to give our
|
; We have nothing. Before we go further, we'll wait a bit to give our
|
||||||
; device the time to "breathe". When we're in a "nothing" loop, the z80
|
; device the time to "breathe". When we're in a "nothing" loop, the z80
|
||||||
; hammers the device really fast and continuously generates interrupts
|
; hammers the device really fast and continuously generates interrupts
|
||||||
; on it and it interferes with its other task of reading the keyboard.
|
; on it and it interferes with its other task of reading the keyboard.
|
||||||
push bc
|
xor a
|
||||||
ld b, 0
|
|
||||||
.wait:
|
.wait:
|
||||||
nop
|
inc a
|
||||||
djnz .wait
|
jr nz, .wait
|
||||||
pop bc
|
jr kbdGetC
|
||||||
jp unsetZ
|
|
||||||
; Whether KC in A is L or R shift
|
; Whether KC in A is L or R shift
|
||||||
.isShift:
|
.isShift:
|
||||||
cp KBD_KC_LSHIFT
|
cp KBD_KC_LSHIFT
|
||||||
@ -106,7 +98,7 @@ kbdGetC:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
; A list of the values associated with the 0x80 possible scan codes of the set
|
; A list of the values associated with the 0x80 possible scan codes of the set
|
||||||
; 2 of the PS/2 keyboard specs. 0 means no value. That value is a character than
|
; 2 of the PS/2 keyboard specs. 0 means no value. That value is a character that
|
||||||
; can be read in a GetC routine. No make code in the PS/2 set 2 reaches 0x80.
|
; can be read in a GetC routine. No make code in the PS/2 set 2 reaches 0x80.
|
||||||
kbdScanCodes:
|
kbdScanCodes:
|
||||||
; 0x00 1 2 3 4 5 6 7 8 9 a b c d e f
|
; 0x00 1 2 3 4 5 6 7 8 9 a b c d e f
|
||||||
@ -126,8 +118,7 @@ kbdScanCodes:
|
|||||||
; 0x70 27 = ESC
|
; 0x70 27 = ESC
|
||||||
.db '0','.','2','5','6','8', 27, 0, 0, 0,'3', 0, 0,'9', 0, 0
|
.db '0','.','2','5','6','8', 27, 0, 0, 0,'3', 0, 0,'9', 0, 0
|
||||||
|
|
||||||
; Same values, but shifted
|
; Same values, but shifted, exactly 0x80 bytes after kbdScanCodes
|
||||||
kbdScanCodesS:
|
|
||||||
; 0x00 1 2 3 4 5 6 7 8 9 a b c d e f
|
; 0x00 1 2 3 4 5 6 7 8 9 a b c d e f
|
||||||
.db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,'~', 0
|
.db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,'~', 0
|
||||||
; 0x10 9 = TAB
|
; 0x10 9 = TAB
|
||||||
|
@ -21,25 +21,37 @@ jp init
|
|||||||
.equ STDIO_PUTC aciaPutC
|
.equ STDIO_PUTC aciaPutC
|
||||||
.inc "stdio.asm"
|
.inc "stdio.asm"
|
||||||
|
|
||||||
; *** Shell ***
|
; *** BASIC ***
|
||||||
|
|
||||||
|
; RAM space used in different routines for short term processing.
|
||||||
|
.equ SCRATCHPAD_SIZE 0x20
|
||||||
|
.equ SCRATCHPAD STDIO_RAMEND
|
||||||
.inc "lib/util.asm"
|
.inc "lib/util.asm"
|
||||||
|
.inc "lib/ari.asm"
|
||||||
.inc "lib/parse.asm"
|
.inc "lib/parse.asm"
|
||||||
.inc "lib/args.asm"
|
.inc "lib/fmt.asm"
|
||||||
.inc "lib/stdio.asm"
|
.equ EXPR_PARSE parseLiteralOrVar
|
||||||
.equ SHELL_RAMSTART STDIO_RAMEND
|
.inc "lib/expr.asm"
|
||||||
.equ SHELL_EXTRA_CMD_COUNT 0
|
.inc "basic/util.asm"
|
||||||
.inc "shell/main.asm"
|
.inc "basic/parse.asm"
|
||||||
|
.inc "basic/tok.asm"
|
||||||
|
.equ VAR_RAMSTART SCRATCHPAD+SCRATCHPAD_SIZE
|
||||||
|
.inc "basic/var.asm"
|
||||||
|
.equ BUF_RAMSTART VAR_RAMEND
|
||||||
|
.inc "basic/buf.asm"
|
||||||
|
.equ BAS_RAMSTART BUF_RAMEND
|
||||||
|
.inc "basic/main.asm"
|
||||||
|
|
||||||
init:
|
init:
|
||||||
di
|
di
|
||||||
; setup stack
|
ld sp, RAMEND
|
||||||
ld hl, RAMEND
|
im 1
|
||||||
ld sp, hl
|
|
||||||
|
|
||||||
call aciaInit
|
call aciaInit
|
||||||
call kbdInit
|
call kbdInit
|
||||||
call shellInit
|
call basInit
|
||||||
jp shellLoop
|
ei
|
||||||
|
jp basStart
|
||||||
|
|
||||||
KBD_FETCHKC:
|
KBD_FETCHKC:
|
||||||
in a, (KBD_PORT)
|
in a, (KBD_PORT)
|
||||||
|
Loading…
Reference in New Issue
Block a user