;
|
;
|
; keyboard.s -- a PC keyboard as input device
|
; keyboard.s -- a PC keyboard as input device
|
;
|
;
|
|
|
;***************************************************************
|
;***************************************************************
|
|
|
.set kbdbase,0xF0200000 ; keyboard base address
|
.set kbdbase,0xF0200000 ; keyboard base address
|
|
|
; .import cout
|
; .import cout
|
; .import byteout
|
; .import byteout
|
|
|
.import xltbl1 ; kbd translation table 1
|
.import xltbl1 ; kbd translation table 1
|
.import xltbl2 ; kbd translation table 2
|
.import xltbl2 ; kbd translation table 2
|
|
|
.export kbdinit ; initialize keyboard
|
.export kbdinit ; initialize keyboard
|
.export kbdinchk ; check if input available
|
.export kbdinchk ; check if input available
|
.export kbdin ; do keyboard input
|
.export kbdin ; do keyboard input
|
|
|
;***************************************************************
|
;***************************************************************
|
|
|
.code
|
.code
|
.align 4
|
.align 4
|
|
|
kbdinit:
|
kbdinit:
|
jr $31
|
jr $31
|
|
|
kbdinchk:
|
kbdinchk:
|
add $8,$0,kbdbase
|
add $8,$0,kbdbase
|
ldw $2,$8,0
|
ldw $2,$8,0
|
and $2,$2,1
|
and $2,$2,1
|
jr $31
|
jr $31
|
|
|
kbdin:
|
kbdin:
|
sub $29,$29,12
|
sub $29,$29,12
|
stw $31,$29,8
|
stw $31,$29,8
|
stw $16,$29,4
|
stw $16,$29,4
|
stw $17,$29,0
|
stw $17,$29,0
|
kbdin0:
|
kbdin0:
|
jal kbdinp
|
jal kbdinp
|
add $16,$2,$0 ; key 1 in $16
|
add $16,$2,$0 ; key 1 in $16
|
add $8,$0,0xF0
|
add $8,$0,0xF0
|
bne $16,$8,kbdin2
|
bne $16,$8,kbdin2
|
kbdin1:
|
kbdin1:
|
jal kbdinp
|
jal kbdinp
|
j kbdin0
|
j kbdin0
|
kbdin2:
|
kbdin2:
|
jal kbdinp
|
jal kbdinp
|
add $17,$2,$0 ; key 2 in $17
|
add $17,$2,$0 ; key 2 in $17
|
beq $17,$16,kbdin2
|
beq $17,$16,kbdin2
|
add $8,$0,0xF0
|
add $8,$0,0xF0
|
beq $17,$8,kbdin3
|
beq $17,$8,kbdin3
|
j kbdin5
|
j kbdin5
|
kbdin3:
|
kbdin3:
|
jal kbdinp
|
jal kbdinp
|
bne $2,$16,kbdin2
|
bne $2,$16,kbdin2
|
kbdin4:
|
kbdin4:
|
add $4,$16,$0 ; use key 1
|
add $4,$16,$0 ; use key 1
|
add $5,$0,xltbl1 ; with translation table 1
|
add $5,$0,xltbl1 ; with translation table 1
|
jal xlat
|
jal xlat
|
j kbdx
|
j kbdx
|
kbdin5:
|
kbdin5:
|
jal kbdinp
|
jal kbdinp
|
add $8,$0,0xF0
|
add $8,$0,0xF0
|
bne $2,$8,kbdin5
|
bne $2,$8,kbdin5
|
kbdin6:
|
kbdin6:
|
jal kbdinp
|
jal kbdinp
|
beq $2,$16,kbdin7
|
beq $2,$16,kbdin7
|
beq $2,$17,kbdin9
|
beq $2,$17,kbdin9
|
j kbdin5
|
j kbdin5
|
kbdin7:
|
kbdin7:
|
jal kbdinp
|
jal kbdinp
|
add $8,$0,0xF0
|
add $8,$0,0xF0
|
bne $2,$8,kbdin7
|
bne $2,$8,kbdin7
|
kbdin8:
|
kbdin8:
|
jal kbdinp
|
jal kbdinp
|
bne $2,$17,kbdin7
|
bne $2,$17,kbdin7
|
j kbdin11
|
j kbdin11
|
kbdin9:
|
kbdin9:
|
jal kbdinp
|
jal kbdinp
|
add $8,$0,0xF0
|
add $8,$0,0xF0
|
bne $2,$8,kbdin9
|
bne $2,$8,kbdin9
|
kbdin10:
|
kbdin10:
|
jal kbdinp
|
jal kbdinp
|
bne $2,$16,kbdin9
|
bne $2,$16,kbdin9
|
j kbdin11
|
j kbdin11
|
kbdin11:
|
kbdin11:
|
add $8,$0,0x12 ; left shift key
|
add $8,$0,0x12 ; left shift key
|
beq $16,$8,kbdin12
|
beq $16,$8,kbdin12
|
add $8,$0,0x59 ; right shift key
|
add $8,$0,0x59 ; right shift key
|
beq $16,$8,kbdin12
|
beq $16,$8,kbdin12
|
add $8,$0,0x14 ; ctrl key
|
add $8,$0,0x14 ; ctrl key
|
beq $16,$8,kbdin14
|
beq $16,$8,kbdin14
|
j kbdin13
|
j kbdin13
|
kbdin12:
|
kbdin12:
|
add $4,$17,$0 ; use key 2
|
add $4,$17,$0 ; use key 2
|
add $5,$0,xltbl2 ; with translation table 2
|
add $5,$0,xltbl2 ; with translation table 2
|
jal xlat
|
jal xlat
|
j kbdx
|
j kbdx
|
kbdin13:
|
kbdin13:
|
add $4,$16,$0 ; use key 1
|
add $4,$16,$0 ; use key 1
|
add $5,$0,xltbl1 ; with translation table 1
|
add $5,$0,xltbl1 ; with translation table 1
|
jal xlat
|
jal xlat
|
j kbdx
|
j kbdx
|
kbdin14:
|
kbdin14:
|
add $4,$17,$0 ; use key 2
|
add $4,$17,$0 ; use key 2
|
add $5,$0,xltbl1 ; with translation table 1
|
add $5,$0,xltbl1 ; with translation table 1
|
jal xlat
|
jal xlat
|
and $2,$2,0xFF-0x60 ; then reset bits 0x60
|
and $2,$2,0xFF-0x60 ; then reset bits 0x60
|
j kbdx
|
j kbdx
|
kbdx:
|
kbdx:
|
ldw $17,$29,0
|
ldw $17,$29,0
|
ldw $16,$29,4
|
ldw $16,$29,4
|
ldw $31,$29,8
|
ldw $31,$29,8
|
add $29,$29,12
|
add $29,$29,12
|
jr $31
|
jr $31
|
|
|
kbdinp:
|
kbdinp:
|
add $8,$0,kbdbase
|
add $8,$0,kbdbase
|
kbdinp1:
|
kbdinp1:
|
ldw $9,$8,0
|
ldw $9,$8,0
|
and $9,$9,1
|
and $9,$9,1
|
beq $9,$0,kbdinp1 ; wait until character ready
|
beq $9,$0,kbdinp1 ; wait until character ready
|
ldw $2,$8,4 ; get character
|
ldw $2,$8,4 ; get character
|
add $9,$0,0xE0
|
add $9,$0,0xE0
|
beq $2,$9,kbdinp1 ; ignore E0 prefix
|
beq $2,$9,kbdinp1 ; ignore E0 prefix
|
add $9,$0,0xE1
|
add $9,$0,0xE1
|
beq $2,$9,kbdinp1 ; as well as E1 prefix
|
beq $2,$9,kbdinp1 ; as well as E1 prefix
|
jr $31
|
jr $31
|
|
|
xlat:
|
xlat:
|
sub $29,$29,8
|
sub $29,$29,8
|
stw $31,$29,4
|
stw $31,$29,4
|
stw $16,$29,0
|
stw $16,$29,0
|
and $16,$4,0xFF
|
and $16,$4,0xFF
|
add $8,$16,$5
|
add $8,$16,$5
|
ldbu $2,$8,0
|
ldbu $2,$8,0
|
bne $2,$0,xlat1
|
bne $2,$0,xlat1
|
; add $4,$0,'<'
|
; add $4,$0,'<'
|
; jal cout
|
; jal cout
|
; add $4,$16,$0
|
; add $4,$16,$0
|
; jal byteout
|
; jal byteout
|
; add $4,$0,'>'
|
; add $4,$0,'>'
|
; jal cout
|
; jal cout
|
add $2,$16,$0
|
add $2,$16,$0
|
xlat1:
|
xlat1:
|
ldw $16,$29,0
|
ldw $16,$29,0
|
ldw $31,$29,4
|
ldw $31,$29,4
|
add $29,$29,8
|
add $29,$29,8
|
jr $31
|
jr $31
|
|
|