;* ;* 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 $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 *