A2osX/DRV/CONSOLE.DRV.S.txt
2017-03-29 17:48:15 +02:00

840 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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