; gp is always equal to the hardware base address ($1f800000) serial equ $1050 ; serial port base address serial_data equ serial+$0 ; serial port data serial_status equ serial+$4 ; serial port status & bits serial_mode equ serial+$8 ; serial port mode & bits serial_ctrl equ serial+$a ; serial port control serial_baud equ serial+$e ; serial port baud rate (16-bits) SR_CTS equ $100 ; capslock led SR_DSR equ $80 ; numlock led SR_RXRDY equ $2 ; init keyboard serial port baud rate, etc InitKeyboard li s0,$ce sh s0,serial_mode(gp) li s0,$771c sh s0,serial_ctrl(gp) li s0,$6c ; 19200 baud sh s0,serial_baud(gp) jr ra nop ; returns key in a0, else zero! ReadKey lhu a0,serial_status(gp) ; load the status register nop andi a1,a0,SR_DSR ; get num lock sh a1,NumLock andi a1,a0,SR_CTS ; get caps lock sh a1,CapsLock andi a1,a0,SR_RXRDY ; is a key ready? beqz a1,@Exit ; nope! move a0,zero lbu a0,serial_data(gp) ; read a byte from the serial port nop beqz a0,@ReadKey ; next key if zero - invalid!!! nop @Exit jr ra nop NumLock dh 0 ; status of numlock light CapsLock dh 0 ; status of capslock light