mirror of https://github.com/dschmenk/VM02.git
215 lines
3.4 KiB
ArmAsm
Executable File
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 *
|