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 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 >SYSCALL SYS.GetKeyboardEvent bcs .9 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 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 #80 bcs .9 sta CH lda EscSeqParam+1 dec bmi .9 cmp #24 bcs .9 sta CV .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 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