A2osX/DRV/DHGR.DRV.S.txt
2021-03-26 18:30:56 +01:00

648 lines
12 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.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF drv/dhgr.drv
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.i
.INB inc/mli.e.i
.INB inc/io.i
.INB inc/gfx.i
.INB inc/gfx.eve.i
*--------------------------------------
ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+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 0
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
L.MSG.DETECT .DA MSG.DETECT
L.MSG.DETECT.IIC .DA MSG.DETECT.IIC
L.MSG.DETECT.EVE .DA MSG.DETECT.EVE
L.MSG.DETECT.80C .DA MSG.DETECT.80C
L.DRV.CS.START .DA DRV.CS.START
L.FD.DEV .DA FD.DEV
L.FD.DEV.NAME .DA FD.DEV.NAME
*--------------------------------------
L.OSD .DA OSD
.DA 0 End Of Reloc Table
*--------------------------------------
Dev.Detect >LDYA L.MSG.DETECT
>SYSCALL PutS
lda A2osX.HWType
cmp #A2osX.HWType.IIc
bcc .1
* stz DCB+S.DCB.GFX.S //c : 80c Mode
>LDYA L.MSG.DETECT.IIC
bra .3
.1 php
sei
sta SET80STORE
sta SETPAGE2
ldx $400 Save Aux $400
lda #$ff Make sure !=1 for comparing later
sta $400
sta CLRPAGE2
ldy $400 Save Main $400
lda #$01 Select Foreground/BKgrnd Colors
sta TXT16.ON Activate 16 color mode
sta $400 Store something in Main
sta SETPAGE2
eor $400 read back AUX, If EVE, must be F/BG colors
bne .2
dec
sta DCB+S.DCB.GFX.S 0=80C,$ff=EVE
.2 stx $400 Set back Aux $400
sta CLRPAGE2
sty $400 Set back Main $400
sta TXT16.OFF
plp
>LDYA L.MSG.DETECT.EVE
bit DCB+S.DCB.GFX.S
bmi .3
>LDYA L.MSG.DETECT.80C
.3 >SYSCALL PutS
>PUSHWI DRV.END
>PUSHWI DRV.CS.END-DRV.CS.START
>PUSHWI DRV.CS.START
>LDYA L.DRV.CS.START
>SYSCALL InsDrv
bcs .9
>STYA FD.DEV+S.FD.DEV.DRVPTR
jsr DrvReloc
>PUSHW L.FD.DEV
>PUSHW L.FD.DEV.NAME
>SYSCALL MKDev
bcs .9
php
sei
>LDYAI $4000
>STYA $800
sta SETWRITEAUX
>STYA $800
sta CLRWRITEAUX
jsr ClrScr
jsr OSD.install
plp
.9 rts
*--------------------------------------
DrvReloc lda FD.DEV+S.FD.DEV.DRVPTR
sec
sbc #DRV.CS.START
sta ZPPtr1
lda FD.DEV+S.FD.DEV.DRVPTR+1
sbc /DRV.CS.START
sta ZPPtr1+1
lda ZPPtr1
clc
adc #Shift.L.LO
sta ZPPtr2
lda ZPPtr1+1
adc /Shift.L.LO+1
sta ZPPtr2+1
lda ZPPtr1
clc
adc #Shift.L.HI
sta ZPPtr3
lda ZPPtr1+1
adc /Shift.L.HI+1
sta ZPPtr3+1
ldy #0
.1 lda (ZPPtr2),y
clc
adc ZPPtr1
sta (ZPPtr2),y
lda (ZPPtr3),y
adc ZPPtr1+1
sta (ZPPtr3),y
iny
cpy #6
bne .1
lda ZPPtr1
clc
adc #Shift.R.LO
sta ZPPtr2
lda ZPPtr1+1
adc /Shift.R.LO+1
sta ZPPtr2+1
lda ZPPtr1
clc
adc #Shift.R.HI
sta ZPPtr3
lda ZPPtr1+1
adc /Shift.R.HI+1
sta ZPPtr3+1
ldy #0
.2 lda (ZPPtr2),y
clc
adc ZPPtr1
sta (ZPPtr2),y
lda (ZPPtr3),y
adc ZPPtr1+1
sta (ZPPtr3),y
iny
cpy #6
bne .2
rts
*--------------------------------------
OSD.install >LDYA L.OSD
>STYA ZPPtr1
>LDYAI X.OSD
>STYA ZPPtr2
lda /X.OSD.LEN
eor #$ff
pha
lda #X.OSD.LEN
eor #$ff
tax
ldy #0
sta SETWRITEAUX
.1 inx
bne .2
pla
inc
beq .3
pha
.2 lda (ZPPtr1),y
sta (ZPPtr2),y
iny
bne .1
inc ZPPtr1+1
inc ZPPtr2+1
bra .1
.3 sta CLRWRITEAUX
rts
*--------------------------------------
ClrScr lda #$55
ldx #0
sta SETHIRES
sta SET80STORE
.1 ldy BASEL,x
sty ZPPtr1
ldy BASEH,x
sty ZPPtr1+1
sta SETPAGE2
jsr .2
eor #$7F
sta CLRPAGE2
jsr .2
inx
cpx #192
bne .1
rts
.2 ldy #39
.3 sta (ZPPtr1),y
dey
bpl .3
rts
*--------------------------------------
CS.END
MSG.DETECT .AZ "Apple IIe/IIc DHGR Driver."
MSG.DETECT.IIC .AZ "Apple //c,IIgs : 'LCM Feline/80c' Mode."
MSG.DETECT.EVE .AZ "Apple //e : 'LCM Eve' Board Detected."
MSG.DETECT.80C .AZ "No Specific H/W Found, 'Video7 80c' Mode."
*--------------------------------------
* Device Header (16 Bytes)
*--------------------------------------
FD.DEV .DA #S.FD.T.CDEV
.DA #0 HANDLER
.DA #0 BUSID
.DA #0 DEVID
.DA 0 BUSPTR
.BS 2 DRVPTR
.DA 0 DCBPTR
.DA 0 BUFPTR
FD.DEV.NAME .AZ "gfx"
*--------------------------------------
* Driver Code
*--------------------------------------
ZPIOCTL .EQ ZPDRV
ZPBasePtr .EQ ZPDRV+2
ZPBMShiftPtr .EQ ZPDRV+4
ZPScrShiftPtr .EQ ZPDRV+6
ZPBMDataPtr .EQ ZPDRV+8
ZPBMMaskPtr .EQ ZPDRV+10
ZPBMSavePtr .EQ ZPDRV+12
*--------------------------------------
ZPTmpWord .EQ ZPDRV+14
*--------------------------------------
LBUF.C1 .EQ ZPDRV+16
LBUF.C1.MASK .EQ ZPDRV+17 Bits to CLR in VMEM : 11100000 00000000 00111111
LBUF.C1.DATA .EQ ZPDRV+18 Bits to SET/ORA/XOR : 000ccccc cccccccc cc000000
LBUF.C2 .EQ ZPDRV+19 C1 C2
LBUF.C2.MASK .EQ ZPDRV+20
LBUF.C2.DATA .EQ ZPDRV+21
*--------------------------------------
BLT.BMMaskPtr .EQ ZPDRV+22
BLT.BMDataPtr .EQ ZPDRV+24
BLT.BMBitOfs .EQ ZPDRV+26
BLT.BMBitOfsL .EQ ZPDRV+27
BLT.ScrBitOfs .EQ ZPDRV+28
BLT.ScrColIdx .EQ ZPDRV+29
BLT.CMASK .EQ ZPDRV+30
*--------------------------------------
ZPTmpByte .EQ ZPDRV+31
*--------------------------------------
DRV.CS.START cld
jmp (.1,x)
.1 .DA STATUS
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA CONTROL
.DA A2osX.BADCALL
.DA OPEN
.DA CLOSE
.DA A2osX.BADCALL
.DA WRITE
*--------------------------------------
J.Cmds .DA SETPIXEL
.DA GETPIXEL
.DA HLINE
.DA VLINE
.DA FILLRECT
.DA BITBLT
.DA GETRECTBUFSIZE
*--------------------------------------
J.LBUF.DrawAtY .DA $ffff
.DA LBUF.DrawAtY.XOR
.DA LBUF.DrawAtY.SET
.DA LBUF.DrawAtY.ORA
.DA $ffff
.DA LBUF.DrawAtY.AND.XOR
.DA LBUF.DrawAtY.AND.SET
.DA LBUF.DrawAtY.AND.ORA
L.Color.Pixels .DA Color.Pixels
.DA 0 end or relocation
*--------------------------------------
STATUS >STYA ZPIOCTL
ldy #S.IOCTL.BUFPTR
lda (ZPIOCTL),y
sta ZPBasePtr
iny
lda (ZPIOCTL),y
sta ZPBasePtr+1
ldy #S.IOCTL.STATCODE
lda (ZPIOCTL),y
beq .1
cmp #S.IOCTL.STATCODE.GETDIB
bne STATUS.DCB
ldy #S.DIB-1
.HS 2C bit abs
.1 ldy #3
.2 lda DIB,y
sta (ZPBasePtr),y
dey
bpl .2
clc
rts
STATUS.DCB cmp #S.IOCTL.STATCODE.GETDCB
bne STATUS.9
ldy #S.DCB.GFX-1
.2 lda DCB,y
sta (ZPBasePtr),y
dey
bpl .2
clc
rts
STATUS.9 lda #MLI.E.BADCTL
sec
rts
*--------------------------------------
OPEN tax DEV.ID in A
lda #S.DIB.S.OPENED
bit DIB+S.DIB.S
bne CLOSE.IOE
lda A2osX.SCRNDEVS+9
beq .1
lda #E.OOH
sec
rts
.1 stx A2osX.SCRNDEVS+9
stx DCB+S.DCB.GFX.DEVID
lda #S.DIB.S.OPENED
tsb DIB+S.DIB.S
*--------------------------------------
CONTROL lda DCB+S.DCB.GFX.DEVID NON STANDARD
cmp A2osX.ASCREEN
beq .8
sta A2osX.ASCREEN
ldy #0
bit DCB+S.DCB.GFX.S
bpl .1 //c,EVE mode
ldy #CONTROL.EVE-CONTROL.80C
.1 ldx CONTROL.80C,y
beq .8 Ending 0
sta $C000,x
iny
bra .1
.8 clc
rts
CLOSE.IOE lda #MLI.E.IO
sec
rts
*--------------------------------------
CLOSE lda #S.DIB.S.OPENED
bit DIB+S.DIB.S
beq CLOSE.IOE
trb DIB+S.DIB.S
stz A2osX.SCRNDEVS+9
clc
rts
*--------------------------------------
WRITE >STYA ZPIOCTL NON STANDARD
lda (ZPIOCTL) Get Cmd
bmi .2
pha
lsr
tax
ldy CB.CmdLen-1,x
.1 lda (ZPIOCTL),y
sta CB.Cache,y
dey
bpl .1
plx
jmp (J.Cmds-2,x)
.2 sta SETWRITEAUX
and #$7f
sta CBX.Cache
lsr
tax
ldy CB.CmdLen-1,x
.3 lda (ZPIOCTL),y
sta CBX.Cache,y
dey
bne .3
sta SETREADAUX
jsr X.OSD
sta CLRREADAUX
sta CLRWRITEAUX
rts
*--------------------------------------
* IN:
* Y = LO
* A = HI
* OUT:
* A = DIV
* X = MOD
*--------------------------------------
DIVMOD7YA dec
bmi .2
clc
beq .1
lda DIV7.512,y
adc #$49
ldx MOD7.512,y
rts
.1 lda DIV7.256,y
adc #$24
ldx MOD7.256,y
rts
.2 lda DIV7.0,y
ldx MOD7.0,y
rts
*--------------------------------------
* IN:
* Y,A = num1 (16)
* X = num2 (8)
* OUT:
* Y,A = (Y,A) * X
*--------------------------------------
YAMultX stx ZPTmpByte
sty ZPTmpWord
sta ZPTmpWord+1
ldy #0 Result LO
tya Result HI
bra .3
.1 pha
tya
clc
adc ZPTmpWord
tay
pla
adc ZPTmpWord+1
.2 asl ZPTmpWord
rol ZPTmpWord+1
.3 lsr ZPTmpByte
bcs .1
bne .2
rts
*--------------------------------------
.INB usr/src/drv/dhgr.drv.s.blt
.INB usr/src/drv/dhgr.drv.s.lbuf
.INB usr/src/drv/dhgr.drv.s.line
.INB usr/src/drv/dhgr.drv.s.pix
.INB usr/src/drv/dhgr.drv.s.rect
*--------------------------------------
DRV.CS.END
*--------------------------------------
.INB usr/src/drv/dhgr.drv.g
*--------------------------------------
CONTROL.80C .DA #SETIOUDIS
.DA #CLRTEXT
* .DA #SETHIRES
.DA #CLR80DISP
.DA #SETAN3
.DA #CLRAN3
.DA #SETAN3
.DA #CLRAN3
.DA #SET80DISP
.DA #SETAN3
.DA #CLRAN3
.DA #SETAN3
.DA #0
CONTROL.EVE .DA #SETIOUDIS
.DA #CLRTEXT
* .DA #SETHIRES
.DA #HR1.OFF
.DA #HR2.ON
.DA #HR3.ON
.DA #0
*--------------------------------------
Shift.L.LO .DA #SHIFT.L1
.DA #SHIFT.L2
.DA #SHIFT.L3
.DA #SHIFT.L4
.DA #SHIFT.L5
.DA #SHIFT.L6
Shift.L.HI .DA /SHIFT.L1
.DA /SHIFT.L2
.DA /SHIFT.L3
.DA /SHIFT.L4
.DA /SHIFT.L5
.DA /SHIFT.L6
Shift.R.LO .DA #SHIFT.L6
.DA #SHIFT.L5
.DA #SHIFT.L4
.DA #SHIFT.L3
.DA #SHIFT.L2
.DA #SHIFT.L1
Shift.R.HI .DA /SHIFT.L6
.DA /SHIFT.L5
.DA /SHIFT.L4
.DA /SHIFT.L3
.DA /SHIFT.L2
.DA /SHIFT.L1
*--------------------------------------
CB.CmdLen .DA #S.CB.Y1+1 SETPIXEL
.DA #S.CB.Y1+1 GETPIXEL
.DA #S.CB.X2+1 HLINE
.DA #S.CB.Y2+1 VLINE
.DA #S.CB.Y2+1 FILLRECT
.DA #S.CB.DstPtr+1 BITBLT
.DA #S.CB.DstPtr+1 GETRECTBUFSIZE
.DA #S.CB.TxtPtr+1 DRAWTEXT
.DA #S.CB.TxtPtr+1 GETTEXTSIZE
*--------------------------------------
CB.Cache .BS S.CB
BM.Cache .BS S.BM
*--------------------------------------
LBUF.MASK .BS 81 81 because of sta LBUF.DATA+1,x!!!
LBUF.DATA .BS 81
*--------------------------------------
DIB .DA #0
.DA #0,#0,#0
>PSTR "Apple II DHGR"
.BS 3
.DA #S.DIB.T.GFX
.DA #0
.DA K.VER
*--------------------------------------
DCB .DA #S.DCB.T.GFX
.BS 1 DEV.ID
.DA #0 S.DCB.GFX.S default to 0
.DA #S.CB.M.MONO+S.CB.M.C16 F
.DA 560 W
.DA 192 H
*--------------------------------------
DRV.END
*--------------------------------------
OSD .PH $1000
.INB usr/src/drv/dhgr.drv.s.osd
.EP
*--------------------------------------
.LIST ON
DRV.CS.SIZE .EQ DRV.CS.END-DRV.CS.START
DRV.SIZE .EQ DRV.END-DRV.CS.START
.LIST OFF
MAN
SAVE usr/src/drv/dhgr.drv.s
ASM