A2osX/DRV/CONSOLE.DRV.S.txt

616 lines
11 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
2015-06-03 18:30:57 +00:00
PREFIX /A2OSX.SRC
2015-03-14 21:48:35 +00:00
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
2015-06-03 18:30:57 +00:00
.TF /A2OSX.BOOT/DRV/CONSOLE.DRV
2015-03-14 21:48:35 +00:00
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
*--------------------------------------
2015-06-03 18:30:57 +00:00
CURSOR.BLINK.SPEED .EQ 2
ESCSEQ.MAXLEN .EQ 16
2015-06-03 18:30:57 +00:00
*--------------------------------------
ZPBaseL1 .EQ ZPDRV
ZPBaseL2 .EQ ZPDRV+2
ZPTmpByte .EQ ZPDRV+4
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
* File Header (16 Bytes)
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
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
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
* Relocation Table
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
L.MSG.DETECT .DA MSG.DETECT
.DA 0 End Of Reloc Table
*--------------------------------------
Dev.Detect >LDYA L.MSG.DETECT
>SYSCALL SYS.PSTROutYA
2015-06-03 18:30:57 +00:00
lda A2osX.SCREENS
ora #A2osX.SCREENS.C
sta A2osX.SCREENS
clc
rts
CS.END
MSG.DETECT >PSTRING "Apple IIe/IIc 80 Col Driver.\n"
2015-06-03 18:30:57 +00:00
*--------------------------------------
* 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
2015-03-14 21:48:35 +00:00
.DA GETEVENT
2015-06-03 18:30:57 +00:00
.DA COUT
2015-03-14 21:48:35 +00:00
.DA CLOSE
.DA GETINFO
2015-06-03 18:30:57 +00:00
.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
2015-03-14 21:48:35 +00:00
*--------------------------------------
OPEN stz CURON
stz KeyRemapIdx
stz bEscMode
stz bEscModeCSI
jsr RESET
2015-03-14 21:48:35 +00:00
jsr HOME
lda #A2osX.SCREENS.C
>SYSCALL SYS.ScreenSelectA
2015-03-14 21:48:35 +00:00
clc
rts
*--------------------------------------
2015-06-03 18:30:57 +00:00
GETEVENT lda A2osX.TIMER16
2015-03-14 21:48:35 +00:00
and #CURSOR.BLINK.SPEED
eor CURON
2015-10-19 20:35:00 +00:00
beq .1
2015-03-14 21:48:35 +00:00
jsr CURBLNK
2015-10-19 20:35:00 +00:00
.1 lda A2osX.ASCREEN
2015-10-19 20:35:00 +00:00
and #A2osX.SCREENS.C is screen active?
beq .9
ldx KeyRemapIdx are we in remap mode ?
bne .4
.11 >SYSCALL SYS.GetKeyboardEvent
2015-10-19 20:35:00 +00:00
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
2015-10-19 20:35:00 +00:00
rts
2015-03-14 21:48:35 +00:00
.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
2015-03-14 21:48:35 +00:00
.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
2015-03-14 21:48:35 +00:00
bne .2
ldx CH
beq .10
dec CH
bra .12
.10 ldy CV
bne .11
clc
2015-03-14 21:48:35 +00:00
rts
.11 lda #79
sta CH
dec CV
2015-06-03 18:30:57 +00:00
.12 lda #$20
ora INVFLG
2015-03-14 21:48:35 +00:00
ldx CH
ldy CV
jmp SetCharAtXY
2015-03-14 21:48:35 +00:00
.2 cmp #10
beq LFOUT
cmp #12
beq HOME
cmp #13
2015-03-14 21:48:35 +00:00
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
*--------------------------------------
2015-03-14 21:48:35 +00:00
FSOUT ldx CH
cpx #79
beq CROUT1
inc CH
clc
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
CROUT jsr CLREOL
stz CH
clc
rts
2015-06-03 18:30:57 +00:00
*--------------------------------------
2015-03-14 21:48:35 +00:00
CROUT1 stz CH
LFOUT ldy CV
2015-03-14 21:48:35 +00:00
cpy #23
beq SCROLL.UP
inc CV
clc
2015-03-14 21:48:35 +00:00
rts
2015-06-03 18:30:57 +00:00
*--------------------------------------
HOME stz CH
stz CV
ldx #23
2015-03-14 21:48:35 +00:00
.1 lda BASEL,x
sta ZPBaseL1
2015-03-14 21:48:35 +00:00
lda BASEH,x
sta ZPBaseL1+1
2015-03-14 21:48:35 +00:00
lda #' '
ora INVFLG
sta SETWRITEAUX
sta SETREADAUX
2015-03-14 21:48:35 +00:00
ldy #39
.2 sta (ZPBaseL1),y
2015-03-14 21:48:35 +00:00
dey
bpl .2
sta CLRWRITEAUX
sta CLRREADAUX
ldy #39
.3 sta (ZPBaseL1),y
2015-03-14 21:48:35 +00:00
dey
bpl .3
dex
bpl .1
clc
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
SCROLL.UP ldx SCROLLTOP
2015-03-14 21:48:35 +00:00
.1 lda BASEL,x
sta ZPBaseL1
lda BASEH,x
sta ZPBaseL1+1
inx
lda BASEL,x
sta ZPBaseL2
2015-03-14 21:48:35 +00:00
lda BASEH,x
sta ZPBaseL2+1
2015-03-14 21:48:35 +00:00
ldy #39
sta SETWRITEAUX
sta SETREADAUX
2015-03-14 21:48:35 +00:00
.2 lda (ZPBaseL2),y
sta (ZPBaseL1),y
2015-03-14 21:48:35 +00:00
dey
bpl .2
2015-03-14 21:48:35 +00:00
ldy #39
sta CLRWRITEAUX
sta CLRREADAUX
.3 lda (ZPBaseL2),y
sta (ZPBaseL1),y
2015-03-14 21:48:35 +00:00
dey
bpl .3
cpx SCROLLBOT
bne .1
*--------------------------------------
CLREOL ldx CH
ldy #80
bra CLR
CLRLINE ldx #0
ldy #80
bra CLR
2015-03-14 21:48:35 +00:00
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
2015-03-14 21:48:35 +00:00
*--------------------------------------
CUROFF lda CURON
beq CUREXIT.RTS
2015-06-03 18:30:57 +00:00
CURBLNK lda A2osX.ASCREEN
2015-03-14 21:48:35 +00:00
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
2015-03-14 21:48:35 +00:00
ldx CH
ldy CV
eor #" "
2015-03-14 21:48:35 +00:00
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
2015-03-14 21:48:35 +00:00
txa
lsr
bcs .1
sta SETWRITEAUX
.1 clc
adc BASEL,y
sta ZPBaseL1
2015-03-14 21:48:35 +00:00
lda BASEH,y
sta ZPBaseL1+1
2015-03-14 21:48:35 +00:00
pla
sta (ZPBaseL1)
sta CLRWRITEAUX
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
GetCharAtXY txa
2015-03-14 21:48:35 +00:00
lsr
bcs .1
sta SETREADAUX
.1 clc
adc BASEL,y
sta ZPBaseL1
2015-03-14 21:48:35 +00:00
lda BASEH,y
sta ZPBaseL1+1
2015-03-14 21:48:35 +00:00
lda (ZPBaseL1)
sta CLRREADAUX
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
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
2015-11-29 22:21:52 +00:00
.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 #';'
2015-11-29 22:21:52 +00:00
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
*--------------------------------------
2015-06-03 18:30:57 +00:00
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
2015-03-14 21:48:35 +00:00
CH .BS 1
CV .BS 1
INVFLG .BS 1
SCROLLTOP .BS 1
SCROLLBOT .BS 1
2015-03-14 21:48:35 +00:00
CURON .BS 1
CURCHAR .BS 1
*--------------------------------------
KeyRemapIdx .BS 1
2015-12-13 21:29:51 +00:00
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"
*--------------------------------------
2015-06-03 18:30:57 +00:00
DEVINFO .DA #S.DEVINFO.TYPE.CHAR
.DA #80
.DA #24
2015-03-14 21:48:35 +00:00
*--------------------------------------
MAN
SAVE DRV/CONSOLE.DRV.S
ASM