A2osX/DRV/CONSOLE.DRV.S.txt

840 lines
14 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
2015-03-14 21:48:35 +00:00
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BUILD/DRV/CONSOLE.DRV
2015-03-14 21:48:35 +00:00
*--------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
.INB /A2OSX.BUILD/INC/IO.I
.INB /A2OSX.BUILD/INC/MLI.ERR.I
.INB /A2OSX.BUILD/INC/NET.TELNET.I
2015-03-14 21:48:35 +00:00
*--------------------------------------
2016-03-13 21:52:57 +00:00
CURSOR.BLINK.SPEED .EQ 8
ESCSEQ.MAXLEN .EQ 16
2015-06-03 18:30:57 +00:00
*--------------------------------------
ZPBaseL1 .EQ ZPDRV
ZPBaseL2 .EQ ZPDRV+2
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 CPrintFYA
2015-06-03 18:30:57 +00:00
clc
rts
CS.END
MSG.DETECT >CSTR "Apple IIe/IIc 80 Col Driver.\r\n"
2015-06-03 18:30:57 +00:00
*--------------------------------------
* Device Header (16 Bytes)
*--------------------------------------
DEV.HEADER cld
jmp (DRV.CS.START,x)
2017-01-12 17:43:45 +00:00
.DA #S.DEV.S.WRITE+S.DEV.S.READ
.BS 6
>PSTR "CON" NAME
2015-06-03 18:30:57 +00:00
.HS 00 NAME must Be 5 bytes long
*--------------------------------------
* Driver Code
*--------------------------------------
DRV.CS.START .DA STATUS
2017-01-12 17:43:45 +00:00
.DA BADCALL
.DA BADCALL
.DA BADCALL
.DA CONTROL
.DA BADCALL
.DA OPEN
2015-03-14 21:48:35 +00:00
.DA CLOSE
2017-01-12 17:43:45 +00:00
.DA READ
.DA WRITE
L.STAT .DA STAT
2016-01-04 07:22:28 +00:00
*--------------------------------------
J.CtrlChars .DA ENQ 5
.DA BS 8
2016-01-04 07:22:28 +00:00
.DA LF 10
.DA CLRSCR 12
2016-01-04 07:22:28 +00:00
.DA CROUT 13
.DA ESC 27
*--------------------------------------
J.EscCodes .DA Scroll.Dn M
.DA Scroll.Up D
2016-01-04 07:22:28 +00:00
.DA RESET c
*--------------------------------------
J.EscSequences .DA Esc.DispAttr m
.DA Esc.Query n
.DA Esc.Scroll r
2016-01-04 07:22:28 +00:00
.DA Esc.Erase K
.DA Esc.Home H
.DA 0 end of relocation
2015-03-14 21:48:35 +00:00
*--------------------------------------
2017-01-12 17:43:45 +00:00
BADCALL lda #MLI.ERR.BADCALL
sec
rts
*--------------------------------------
STATUS >LDYA L.STAT
clc
rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
OPEN stz CURON
2016-01-04 07:22:28 +00:00
stz bEscMode
stz bEscModeCSI
2016-01-04 07:22:28 +00:00
stz OutPtr
stz OutCnt
2017-01-12 17:43:45 +00:00
sta A2osX.SCRNDEVS DEV.ID in A
2016-06-07 06:10:18 +00:00
jsr RESET
ldy #0
.1 lda TelnetOpt,y
beq CONTROL
jsr Char.Out.Put
iny
bne .1
2017-01-12 17:43:45 +00:00
*--------------------------------------
CONTROL sta SETTEXT
sta SETALTCHAR
sta SET80DISP
sta CLR80STORE
sta CLRPAGE2
lda #1
sta A2osX.ASCREEN
2015-03-14 21:48:35 +00:00
clc
rts
*--------------------------------------
2017-01-12 17:43:45 +00:00
CLOSE stz A2osX.SCRNDEVS
clc
rts
*--------------------------------------
READ jsr Char.Out.Get
bcc .8 IF cs,no char in output buffer...
lda A2osX.ASCREEN
cmp #1 is CON active?
bne .9 no....exit
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 OPENAPPLE
bmi .9 Open apple key, not for us...
2016-03-13 21:52:57 +00:00
lda KBD
bpl .9
sta KBDSTROBE
and #$7F
ldx KeyRemapped
.2 cmp KeyRemapped,x
beq .3
dex
bne .2
2017-01-12 17:43:45 +00:00
bra .8
.3 lda KeyRemappedIdx,x
2016-01-04 07:22:28 +00:00
tay
2015-03-14 21:48:35 +00:00
2016-01-04 07:22:28 +00:00
.4 lda KeyRemappedTbl,y
beq .6
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
iny
bra .4
.6 jsr Char.Out.Get
.8 clc
rts
2017-01-12 17:43:45 +00:00
.9 lda #0 Error = char
2015-03-14 21:48:35 +00:00
sec
rts
*--------------------------------------
2017-01-12 17:43:45 +00:00
WRITE bit bEscMode
2016-01-04 07:22:28 +00:00
bmi COUT.EscMode
2016-01-04 07:22:28 +00:00
pha
jsr CUROFF
pla
cmp #32
2016-01-04 07:22:28 +00:00
bcc COUT.Ctrl
ora INVFLG
ldx CH
ldy CV
jsr SetCharAtXY
*--------------------------------------
FSOUT ldx CH
cpx #79
beq .8
inc CH
.8 clc
rts
2016-01-04 07:22:28 +00:00
*--------------------------------------
COUT.Ctrl ldx #CtrlChars.Cnt-1
2016-01-04 07:22:28 +00:00
.1 cmp CtrlChars,x
beq .2
dex
bpl .1
2016-01-04 07:22:28 +00:00
clc
rts
2015-03-14 21:48:35 +00:00
.2 txa
asl
tax
jmp (J.CtrlChars,x)
2016-01-04 07:22:28 +00:00
*--------------------------------------
COUT.EscMode bit bEscModeCSI
bmi COUT.EscModeCSI
cmp #'['
bne .1
dec bEscModeCSI
stz EscSeq
clc
2015-03-14 21:48:35 +00:00
rts
2016-01-04 07:22:28 +00:00
.1 stz bEscMode
2015-03-14 21:48:35 +00:00
2016-01-04 07:22:28 +00:00
ldy #0
ldx #0
.2 iny
cmp EscCodes,y
beq .3
inx
inx
cpy EscCodes
bne .2
clc
rts
2015-03-14 21:48:35 +00:00
2016-01-04 07:22:28 +00:00
.3 jmp (J.EscCodes,x)
*--------------------------------------
COUT.EscModeCSI inc EscSeq
ldx EscSeq
sta EscSeq,x
cmp #64 End of Seq ?
bcs COUT.ExecEscSeq
cpx #ESCSEQ.MAXLEN too long?
bne .1
stz bEscModeCSI
stz bEscMode
.1 clc
rts
COUT.ExecEscSeq stz EscSeqParamCnt
stz bEscSeqInNum
2016-01-04 07:22:28 +00:00
ldx #0 EscSeq Ptr
.10 stz EscSeqParamTmp
stz EscSeqParamTmp+1
2016-01-04 07:22:28 +00:00
.1 inx
lda EscSeq,x
jsr IsDigit
bcs .2
dec bEscSeqInNum
and #$0F
pha
lda EscSeqParamTmp
ldy EscSeqParamTmp+1
asl EscSeqParamTmp param=param*10
rol EscSeqParamTmp+1
asl EscSeqParamTmp
rol EscSeqParamTmp+1
clc
adc EscSeqParamTmp
sta EscSeqParamTmp
tya
adc EscSeqParamTmp+1
sta EscSeqParamTmp+1
asl EscSeqParamTmp
rol EscSeqParamTmp+1
pla
clc
adc EscSeqParamTmp
sta EscSeqParamTmp
bcc .1
inc EscSeqParamTmp+1
bra .1
.2 bit bEscSeqInNum
bpl .3
stz bEscSeqInNum
lda #255
ldy EscSeqParamTmp+1
bne .21
lda EscSeqParamTmp
.21 ldy EscSeqParamCnt
sta EscSeqParam,y
inc EscSeqParamCnt
.3 lda EscSeq,x
cmp #';'
beq .10
stz bEscModeCSI
stz bEscMode
ldy #0
ldx #0
.4 iny
cmp EscSeqCmds,y
beq .5
inx
inx
cpy EscSeqCmds
bne .4
clc
rts
2016-01-04 07:22:28 +00:00
.5 jmp (J.EscSequences,x)
*--------------------------------------
* PRIVATE
*--------------------------------------
RESET jsr CLRSCR
lda #0
sta SCROLLTOP
lda #23
sta SCROLLBOT
*--------------------------------------
RESETATTR lda #$80
sta INVFLG
clc
2016-01-04 07:22:28 +00:00
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2016-01-04 07:22:28 +00:00
ESC lda #$80
sta bEscMode
clc
rts
2015-06-03 18:30:57 +00:00
*--------------------------------------
ENQ ldy #0
.1 lda ENQ.String,y
beq .8
jsr Char.Out.Put
iny
bne .1
.8 clc
rts
*--------------------------------------
2016-01-04 07:22:28 +00:00
BS ldx CH
beq .1
dec CH
bra .3
.1 ldy CV
bne .2
clc
2015-03-14 21:48:35 +00:00
rts
2016-01-04 07:22:28 +00:00
.2 lda #79
sta CH
dec CV
.3 lda #$20
ora INVFLG
ldx CH
ldy CV
jmp SetCharAtXY
2015-06-03 18:30:57 +00:00
*--------------------------------------
ClrScr 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 #" "
php
sei
sta SETWRITEAUX
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
plp
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
*--------------------------------------
2016-01-04 07:22:28 +00:00
CROUT jsr CLREOL
stz CH
clc
rts
*--------------------------------------
2016-01-04 07:22:28 +00:00
LF ldy CV
cpy #23
beq SCROLL.UP
inc CV
clc
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
jsr COPY.L2toL1
2015-03-14 21:48:35 +00:00
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 .2+1
.1 lda #" "
ldy CV
jsr SetCharAtXY X,Y unmodified
inx
.2 cpx #$ff Self Modified
bne .1
clc
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2016-01-04 07:22:28 +00:00
SCROLL.DN ldx SCROLLBOT
.1 lda BASEL,x
sta ZPBaseL1
lda BASEH,x
sta ZPBaseL1+1
dex
lda BASEL,x
sta ZPBaseL2
lda BASEH,x
sta ZPBaseL2+1
jsr COPY.L2toL1
2016-01-04 07:22:28 +00:00
cpx SCROLLTOP
bne .1
2016-01-04 07:22:28 +00:00
clc
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.Query ldx EscSeqParamCnt
beq .8
dex
bne .8
lda EscSeqParam
cmp #6
bne .8
lda #$1B
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
lda #$5B
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
lda CV
inc
jsr Decimal.Out
2016-01-04 07:22:28 +00:00
lda #';'
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
lda CH
inc
jsr Decimal.Out
lda #'R'
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
.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.Erase 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 ldx #1
lda EscSeqParam
beq .2
ldx #24
cmp #24
bcs .2
tax
.2 dex
stx CV
dec EscSeqParamCnt
beq .8
ldx #1
lda EscSeqParam+1
beq .3
ldx #80
cmp #80
bcs .3
tax
.3 dex
stx CH
.8 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
2016-06-07 06:10:18 +00:00
cmp #1
beq CURBLNK1
2015-03-14 21:48:35 +00:00
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 php
pha
2015-03-14 21:48:35 +00:00
txa
lsr
bcs .1
sei
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
plp
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
GetCharAtXY php
txa
2015-03-14 21:48:35 +00:00
lsr
bcs .1
sei
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
plp
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
COPY.L2toL1 php
sei
sta SETWRITEAUX
sta SETREADAUX
ldy #39
.1 lda (ZPBaseL2),y
sta (ZPBaseL1),y
dey
bpl .1
sta CLRWRITEAUX
sta CLRREADAUX
plp
ldy #39
.2 lda (ZPBaseL2),y
sta (ZPBaseL1),y
dey
bpl .2
rts
*--------------------------------------
IsDigit cmp #'0'
bcc .9
cmp #'9'+1
rts cc if ok, cs if not
.9 sec
rts
*--------------------------------------
2016-01-04 07:22:28 +00:00
Decimal.Out stz DecimalBuffer
stz DecimalBuffer+1
2016-01-04 07:22:28 +00:00
ldx #8
sed
2016-01-04 07:22:28 +00:00
tay
2016-01-04 07:22:28 +00:00
.1 tya
asl
tay
lda DecimalBuffer
adc DecimalBuffer
sta DecimalBuffer
lda DecimalBuffer+1
adc DecimalBuffer+1
sta DecimalBuffer+1
dex
bne .1
2016-01-04 07:22:28 +00:00
cld
2016-01-04 07:22:28 +00:00
stz bDecimal0Out
lda DecimalBuffer+1
and #$0f
beq .2
ora #$30
dec bDecimal0Out
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
.2 lda DecimalBuffer
lsr
lsr
lsr
lsr
bne .3
bit bDecimal0Out
bpl .4
.3 ora #$30
jsr Char.Out.Put
2016-01-04 07:22:28 +00:00
.4 lda DecimalBuffer
and #$0f
ora #$30
*--------------------------------------
Char.Out.Put pha
2016-01-04 07:22:28 +00:00
lda OutPtr
clc
adc OutCnt
and #$0f
tax
pla
sta OutBuffer,x
inc OutCnt
rts
*--------------------------------------
2016-01-04 07:22:28 +00:00
Char.Out.Get sec
lda OutCnt
beq .9
dec OutCnt
ldx OutPtr
lda OutBuffer,x
pha
txa
inc
and #$0f
sta OutPtr
pla
clc
2016-01-04 07:22:28 +00:00
.9 rts
*--------------------------------------
2015-06-03 18:30:57 +00:00
DRV.CS.END
EscCodes >PSTR "MDc"
EscSeqCmds >PSTR "mnrKH"
2015-06-03 18:30:57 +00:00
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
2016-01-04 07:22:28 +00:00
OutBuffer .BS 16
OutPtr .BS 1
OutCnt .BS 1
DecimalBuffer .BS 2
bDecimal0Out .BS 1
*--------------------------------------
2015-12-13 21:29:51 +00:00
KeyRemapped .HS 05080A0B0D15 L,D,U,CR,R
KeyRemappedIdx .HS 050004080C0F
2016-01-04 07:22:28 +00:00
KeyRemappedTbl .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
TelnetOpt .DA #IAC,#DO,#TELOPT.ECHO
.DA #0
*--------------------------------------
CtrlChars.Cnt .EQ 6
CtrlChars .HS 05080A0C0D1B
bEscMode .BS 1
bEscModeCSI .BS 1
2016-01-04 07:22:28 +00:00
bEscSeqInNum .BS 1
EscSeq .BS ESCSEQ.MAXLEN+1
2016-01-04 07:22:28 +00:00
EscSeqParamTmp .BS 2
EscSeqParamCnt .BS 1
EscSeqParam .BS 4
*--------------------------------------
2017-01-12 17:43:45 +00:00
STAT .DA #S.DEVSTAT.S.WRITE+S.DEVSTAT.S.READ
.DA #0,#0,#0
>PSTR "ANSI 80c Console"
.DA #S.DEVSTAT.TYPE.CHAR
2017-01-12 17:43:45 +00:00
.DA #0
.DA $0900
ENQ.String >CSTR "A2osXTERM"
2015-03-14 21:48:35 +00:00
*--------------------------------------
MAN
SAVE /A2OSX.SRC/DRV/CONSOLE.DRV.S
2015-03-14 21:48:35 +00:00
ASM