VM02/src/consoledrvr.s

215 lines
3.4 KiB
ArmAsm
Executable File

;*
;* CONSOLE DEVICE DRIVER
;*
CON_DRIVER:
CON_DRVR_SZ: .WORD CON_DRVR_END - CON_DRVR_START
CON_READ_OFS: .WORD CON_READ - CON_DRVR_START
CON_WRITE_OFS: .WORD CON_WRITE - CON_DRVR_START
CON_CTRL_OFS: .WORD CON_CTRL - CON_DRVR_START
CON_IRQ_OFS: .WORD CON_IRQ - CON_DRVR_START
CON_DRVR_START:
;
; READ CHARACTER FROM KEYBOARD BUFFER, WAITING IF NONE AVAILABLE
; EXIT: A = CHARACTER
;
CON_READ: SEI
LDX TYPEBUFFLEN
BNE :+
CLI
LDY CURRENT_THREAD
JSR THREAD_NOTIMEOUT
LDY #$03 ; LOAD SLOT #
JSR THREAD_WAITIO
CLC
BCC CON_READ
: LDA TYPEBUFF ; SAVE OLDEST CHAR
PHA
DEC TYPEBUFFLEN
BEQ CONRDEXIT
LDX #$00
: LDA TYPEBUFF+1,X ; SHIFT TYPE AHEAD BUFFER DOWN
STA TYPEBUFF,X
INX
CPX TYPEBUFFLEN
BNE :-
LDY #$03
JSR THREAD_NOTIFYIO
CONRDEXIT: PLA
; CLI
RTS
;
; WRITE TO CONSOLE
;
CON_WRITE: JMP COUT
;
; CONSOLE DEVICE CONTROL
;
CON_CTRL: TYA
AND #$F8 ; MASK OFF SLOT NUMBER
LDX #$00
CMP #IOCTL_AVAIL
BNE :+
LDA TYPEBUFFLEN ; RETURN AVAILABLE KEYBOARD CHARACTERS
CLC
RTS
: CMP #IOCTL_SPACE
BNE :+
LDA #$01
CLC
RTS
: CMP #CONCTL_HOME
BNE :+
LDA MACHID
BMI ROMHOME
AND #$02
BEQ ROMHOME
LDA #$0C ; CTRL-L = HOME CHARACTER
JSR COUT
CLC
RTS
ROMHOME: JSR HOME
CLC
RTS
: CMP #CONCTL_TEXT80
BNE :+
.IFNDEF DEBUG_DUMP
LDA MACHID ; CHECK FOR 80 COL CARD INSTALLED
AND #$02
BEQ CONCTLBAD
SEI ; NO INTS FOR SETUP
LDA #$00
TAX
TAY
BIT ROMIN
JSR $C300
LDA MACHID
BMI ROMHOME
.IF 0
LDA $C301
CMP #$CB
BNE NOTVIDEX
LDA #$02 ; ADJUST VIDEX PARAMETERS
STA $C0B0
LDA #$5E
STA $C0B1
LDA #$07
STA $C0B0
LDA #$1B
STA $C0B1
LDA #$08
STA $C0B0
LDA #$01
STA $C0B1
.ENDIF
NOTVIDEX: LDA #$FF ; CLEAR LOWER-CASE MASK
STA LCOUT_MASK
LDA #$0C ; CTRL-L = HOME CHARACTER
JSR COUT
CLC
RTS
.ENDIF
;: CMP #IOCTL_CLOSE
; BNE :+
; LDA #IOCTL_DEACTIVATE ; FALL THROUGH
: CMP #IOCTL_DEACTIVATE
BNE :+
LDA #26 ; DEACTIVATE 80 COL CARDS
JSR COUT
LDA #'1'
JSR COUT
LDA #8
JSR COUT
LDA #' '
JSR COUT
LDA #21
JSR COUT
BIT $C054 ; SET TEXT MODE
BIT $C051
CLC
RTS
: CMP #IOCTL_ID
BEQ :+
CONCTLBAD: SEC
RTS
: LDA MACHID
AND #$02
BEQ CONCTLOK ; ID $00 = NO 80 COLUMN
LDA MACHID ; ID $80 = II, II+ 80 COLUMN
AND #$80 ; ID $88 = IIE, IIC 80 COLUMN
BEQ :+
LDA #$08
: ORA #$80
CONCTLOK: CLC
RTS
;
; KEYBOARD IRQ. FAKED ON II, II+, AND IIE - THIS WILL ACTUALLY BE AN IRQ ON IIC
;
CON_IRQ: LDA KEYBD
BMI SPCLKEYS
SEC
RTS
SPCLKEYS: BIT CLRKBD ; CLEAR KEYBOARD STROBE
AND #$7F
.IFDEF DEBUG_BREAK
CMP #$03 ; CHECK FOR CTRL-C
BNE NOBREAK
PHP
SEI
BIT CLRKBD
LDA #$4C
STA $03F8
LDA #<BREAKOUT
STA $03F9
LDA #>BREAKOUT
STA $03FA
BIT $C054 ; SET TEXT MODE
BIT $C051
JSR HOME
JSR THREAD_TRACE
BIT ROMIN
JMP $FF65
BREAKOUT: PLA ; REMOVE RETURN ADDRESS
PLA
BIT CLRKBD
BIT LCBNK2
BIT LCBNK2
PLP
SEC
RTS
NOBREAK:
.ENDIF
LDY MACHID ; IS IT A II OR II+?
BMI TYPEAHEAD ; NOPE
CMP #$01 ; CHECK FOR CTRL-A
BNE :+
LDA #$20 ; TOGGLE LOWERCASE MASK
EOR LCIN_MASK ; CTRL-A = CAPS LOCK
STA LCIN_MASK
SEC ; EAT KEYPRESS
RTS
: CMP #$20
BCS CHKKEYLOWER
CMP #$0E ; CTRL-N -> [
BNE :+
LDA #$5B
: CMP #$0F ; CTRL-O -> _
BEQ :+
CMP #$0C ; CTRL-L -> \
BNE CHKKEYLOWER
: ORA #$50
CHKKEYLOWER: CMP #$40
BCC TYPEAHEAD
ORA LCIN_MASK
TYPEAHEAD: LDX TYPEBUFFLEN
CPX #TYPEBUFFMAX
BCS TYPEBUFFULL
STA TYPEBUFF,X
LDA $C061 ; OPEN-APPLE KEY / PB0
AND #$80
ORA TYPEBUFF,X
STA TYPEBUFF,X
INC TYPEBUFFLEN
TYPEBUFFULL: CLC
RTS
CON_DRVR_END EQU *