PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/CONSOLE.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/IO.I *-------------------------------------- CURSOR.BLINK.SPEED .EQ 2 ESCSEQ.MAXLEN .EQ 16 *-------------------------------------- ZPBaseL1 .EQ ZPDRV ZPBaseL2 .EQ ZPDRV+2 ZPTmpByte .EQ ZPDRV+4 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp Dev.Detect cld,jmp abs=DRV .DA #$61 6502,Level 1 (65c02) .DA #1 DRV Layout Version 1 .DA 0 .DA CS.END-CS.START Code Length .DA DEV.HEADER-CS.START Device Header Offset .DA DRV.CS.START-CS.START Driver Code Offset .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >LDYA L.MSG.DETECT >SYSCALL SYS.PSTROutYA lda A2osX.SCREENS ora #A2osX.SCREENS.C sta A2osX.SCREENS clc rts CS.END MSG.DETECT >PSTRING "Apple IIe/IIc 80 Col Driver.\n" *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) .DA #S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR >PSTRING "CON" NAME .HS 00 NAME must Be 5 bytes long .HS 00.00 .HS 00.00.00.00 *-------------------------------------- * Driver Code *-------------------------------------- DRV.CS.START .DA OPEN .DA GETEVENT .DA COUT .DA CLOSE .DA GETINFO .DA IRQ L.DEVINFO .DA DEVINFO J.EscSeq .DA Esc.DispAttr m .DA Esc.Scroll r .DA Esc.EraseLine K .DA Esc.Home H .DA 0 end of relocation *-------------------------------------- OPEN stz CURON stz KeyRemapIdx stz bEscMode stz bEscModeCSI jsr RESET jsr HOME lda #A2osX.SCREENS.C >SYSCALL SYS.ScreenSelectA clc rts *-------------------------------------- GETEVENT lda A2osX.TIMER16 and #CURSOR.BLINK.SPEED eor CURON beq .1 jsr CURBLNK .1 lda A2osX.ASCREEN and #A2osX.SCREENS.C is screen active? beq .9 ldx KeyRemapIdx are we in remap mode ? bne .4 .11 >SYSCALL SYS.GetKeyboardEvent bcs .9 ldy #S.EVT.DATAHI lda (pEvent),y bne .8 dey lda (pEvent),y ldx KeyRemapped .2 cmp KeyRemapped,x beq .3 dex bne .2 clc rts .3 lda KeyRemappedIdx,x tax lda KeyRemappedTable,x sta (pEvent),y inx stx KeyRemapIdx clc rts .4 lda KeyRemappedTable,x bne .5 stz KeyRemapIdx bra .11 .5 inx stx KeyRemapIdx ldy #S.EVT.DATALO sta (pEvent),y iny lda #0 sta (pEvent),y lda #S.EVT.F.KEY sta (pEvent) clc .8 rts .9 lda #0 Error = no event sec rts *-------------------------------------- COUT bit bEscMode bpl .1 jmp EscMode .1 pha jsr CUROFF pla cmp #32 bcc COUT.CTRL ora INVFLG ldx CH ldy CV jsr SetCharAtXY bra FSOUT COUT.CTRL cmp #8 bne .2 ldx CH beq .10 dec CH bra .12 .10 ldy CV bne .11 clc rts .11 lda #79 sta CH dec CV .12 lda #$20 ora INVFLG ldx CH ldy CV jmp SetCharAtXY .2 cmp #10 beq LFOUT cmp #12 beq HOME cmp #13 beq CROUT cmp #27 ESC dec bEscMode clc rts *-------------------------------------- CLOSE * lda A2osX.SCREENS * and #$FF^A2osX.SCREENS.C * sta A2osX.SCREENS clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO IRQ clc rts *-------------------------------------- * PRIVATE *-------------------------------------- RESET lda #0 sta SCROLLTOP lda #23 sta SCROLLBOT *-------------------------------------- RESETATTR lda #$80 sta INVFLG rts *-------------------------------------- FSOUT ldx CH cpx #79 beq CROUT1 inc CH clc rts *-------------------------------------- CROUT jsr CLREOL stz CH clc rts *-------------------------------------- CROUT1 stz CH LFOUT ldy CV cpy #23 beq SCROLL.UP inc CV clc rts *-------------------------------------- HOME stz CH stz CV ldx #23 .1 lda BASEL,x sta ZPBaseL1 lda BASEH,x sta ZPBaseL1+1 lda #' ' ora INVFLG sta SETWRITEAUX sta SETREADAUX ldy #39 .2 sta (ZPBaseL1),y dey bpl .2 sta CLRWRITEAUX sta CLRREADAUX ldy #39 .3 sta (ZPBaseL1),y dey bpl .3 dex bpl .1 clc rts *-------------------------------------- SCROLL.UP ldx SCROLLTOP .1 lda BASEL,x sta ZPBaseL1 lda BASEH,x sta ZPBaseL1+1 inx lda BASEL,x sta ZPBaseL2 lda BASEH,x sta ZPBaseL2+1 ldy #39 sta SETWRITEAUX sta SETREADAUX .2 lda (ZPBaseL2),y sta (ZPBaseL1),y dey bpl .2 ldy #39 sta CLRWRITEAUX sta CLRREADAUX .3 lda (ZPBaseL2),y sta (ZPBaseL1),y dey bpl .3 cpx SCROLLBOT bne .1 *-------------------------------------- CLREOL ldx CH ldy #80 bra CLR CLRLINE ldx #0 ldy #80 bra CLR CLRSOL ldx #0 ldy CH CLR sty ZPTmpByte .1 phx lda #$20 ora INVFLG ldy CV jsr SetCharAtXY plx inx cpx ZPTmpByte bne .1 clc rts *-------------------------------------- CUROFF lda CURON beq CUREXIT.RTS CURBLNK lda A2osX.ASCREEN and #A2osX.SCREENS.C bne CURBLNK1 lda CURON bne CURBLNK.OFF rts do not Light if screen is not active CURBLNK1 lda CURON bne CURBLNK.OFF ldx CH ldy CV jsr GetCharAtXY sta CURCHAR and #$80 ldx CH ldy CV eor #" " jsr SetCharAtXY bra CUREXIT CURBLNK.OFF ldx CH ldy CV lda CURCHAR jsr SetCharAtXY CUREXIT lda CURON eor #CURSOR.BLINK.SPEED sta CURON CUREXIT.RTS rts *-------------------------------------- SetCharAtXY cmp #$40 bcc .10 cmp #$5F bcs .10 and #$3F .10 pha txa lsr bcs .1 sta SETWRITEAUX .1 clc adc BASEL,y sta ZPBaseL1 lda BASEH,y sta ZPBaseL1+1 pla sta (ZPBaseL1) sta CLRWRITEAUX rts *-------------------------------------- GetCharAtXY txa lsr bcs .1 sta SETREADAUX .1 clc adc BASEL,y sta ZPBaseL1 lda BASEH,y sta ZPBaseL1+1 lda (ZPBaseL1) sta CLRREADAUX rts *-------------------------------------- EscMode bit bEscModeCSI bmi EscModeCSI cmp #'[' bne .1 dec bEscModeCSI stz EscSeq clc rts .1 cmp #'7' save cup & attr cmp #'8' restore cup & attr stz bEscMode clc rts EscModeCSI inc EscSeq ldx EscSeq sta EscSeq,x cmp #64 End of Seq ? bcs ExecEscSeq cpx #ESCSEQ.MAXLEN too long? bne .1 stz bEscModeCSI stz bEscMode .1 clc rts *-------------------------------------- ExecEscSeq stz EscSeqParamCnt stz EscSeqInNum ldx #0 EscSeq Ptr ldy #0 EsqSeqParam Ptr .10 lda #0 sta EscSeqParam,y .1 inx lda EscSeq,x jsr IsDigit bcs .2 dec EscSeqInNum and #$0F pha lda EscSeqParam,y param=param*10 asl asl clc adc EscSeqParam,y asl sta EscSeqParam,y pla clc adc EscSeqParam,y sta EscSeqParam,y bra .1 .2 bit EscSeqInNum bpl .3 stz EscSeqInNum iny .3 lda EscSeq,x cmp #';' beq .10 sty EscSeqParamCnt stz bEscModeCSI stz bEscMode ldy #0 ldx #0 .4 iny cmp EscSeqCmds,y beq .5 inx inx cpy EscSeqCmds bne .4 clc rts .5 jmp (J.EscSeq,x) *-------------------------------------- IsDigit cmp #'0' bcc .9 cmp #'9'+1 rts cc if ok, cs if not .9 sec rts *-------------------------------------- Esc.DispAttr ldx EscSeqParamCnt beq .8 .1 lda EscSeqParam-1,x bne .2 jsr RESETATTR bra .7 .2 cmp #7 bne .8 stz INVFLG .7 dex bne .1 .8 clc rts *-------------------------------------- Esc.Scroll ldx EscSeqParamCnt bne .1 lda #0 ldy #23 bra .8 .1 cpx #2 bne .9 lda EscSeqParam dec ldy EscSeqParam+1 dey .8 sta SCROLLTOP sty SCROLLBOT .9 clc rts *-------------------------------------- Esc.EraseLine ldx EscSeqParamCnt bne .1 jmp CLREOL .1 lda EscSeqParam cmp #1 bne .2 jmp CLRSOL .2 cmp #2 bne .9 jmp CLRLINE .9 clc rts *-------------------------------------- Esc.Home ldx EscSeqParamCnt bne .1 stz CH stz CV clc rts .1 lda EscSeqParam dec bmi .9 cmp #24 bcs .9 sta CV lda EscSeqParam+1 dec bmi .9 cmp #80 bcs .9 sta CH .9 clc rts *-------------------------------------- DRV.CS.END BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 CH .BS 1 CV .BS 1 INVFLG .BS 1 SCROLLTOP .BS 1 SCROLLBOT .BS 1 CURON .BS 1 CURCHAR .BS 1 *-------------------------------------- KeyRemapIdx .BS 1 KeyRemapped .HS 05080A0B0D15 L,D,U,CR,R KeyRemappedIdx .HS 050004080C0F KeyRemappedTable .EQ * KeyRemappedLEFT .HS 1B5B4400 esc[D KeyRemappedDOWN .HS 1B5B4200 esc[B KeyRemappedUP .HS 1B5B4100 esc[A KeyRemappedCR .HS 0D0A00 crlf KeyRemappedRGHT .HS 1B5B4300 esc[C *-------------------------------------- bEscMode .BS 1 bEscModeCSI .BS 1 EscSeq .BS ESCSEQ.MAXLEN+1 EscSeqParamCnt .BS 1 EscSeqParam .BS 4 EscSeqInNum .BS 1 EscSeqCmds >PSTRING "mrKH" *-------------------------------------- DEVINFO .DA #S.DEVINFO.TYPE.CHAR .DA #80 .DA #24 *-------------------------------------- MAN SAVE DRV/CONSOLE.DRV.S ASM