A2osX/DRV/DHGR.DRV.S.txt
2019-01-11 16:06:05 +00:00

557 lines
11 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
PREFIX
AUTO 4,1
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/GUI/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
*--------------------------------------
ZPPtr .EQ ZPDRV
*--------------------------------------
* 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
.DA 0 End Of Reloc Table
*--------------------------------------
Dev.Detect >LDYA L.MSG.DETECT
>SYSCALL puts
lda MACHID
and #MACHID.T
cmp #MACHID.T.IIc
bne .1
lda #$80
sta DCB+S.DCB.GFX.S $80=//c
>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
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
>PUSHWI DRV.CS.START
>LDYA L.DRV.CS.START
>SYSCALL InsDrv
bcs .9
>STYA FD.DEV+S.FD.DEV.DRVPTR
>PUSHW L.FD.DEV.NAME
>LDYA L.FD.DEV
>SYSCALL MKDEV
bcs .9
php
sei
>LDYAI $4000
>STYA $800
sta SETWRITEAUX
>STYA $800
sta CLRWRITEAUX
sta SETHIRES
sta SET80STORE
jsr ClrScr
plp
.9 rts
*--------------------------------------
ClrScr ldx #191
lda #0
.4 ldy BASEL,x
sty ZPPtr
ldy BASEH,x
sty ZPPtr+1
sta SETPAGE2
ldy #39
.5 sta (ZPPtr),y
dey
bpl .5
sta CLRPAGE2
ldy #39
.6 sta (ZPPtr),y
dey
bpl .6
dex
bpl .4
rts
*--------------------------------------
CS.END
MSG.DETECT .AZ "Apple IIe/IIc DHGR Driver."
MSG.DETECT.IIC .AZ "Apple //c detected, Assuming 'Le Chat Mauve' Mode."
MSG.DETECT.EVE .AZ "'Le Chat Mauve EVE' Board Detected."
MSG.DETECT.80C .AZ "No Specific H/W Found, Assuming 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 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.SHIFT .DA SHIFT.L1
.DA SHIFT.L2
.DA SHIFT.L3
.DA SHIFT.L4
.DA SHIFT.L5
.DA SHIFT.L6
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 ldx #0 DEV.ID in A
.10 ldy A2osX.SCRNDEVS,x
beq .20
inx
cpx #K.SCR.MAX
bne .10
lda #E.OOH
sec
rts
.20 sta A2osX.SCRNDEVS,x
sta DCB+S.DCB.GFX.DEVID
lda #S.DIB.S.OPENED
tsb DIB+S.DIB.S
ldx #0
ldy #1
.1 lda L.SHIFT,x Get relocated LO BYTE
sta Shift.L.LO,y
inx
lda L.SHIFT,x Get relocated HI BYTE
sta Shift.L.HI,y
inx
iny
cpx #12
bne .1
ldx #0 SHIFT.L1 = SHIFT.R6 !!!
ldy #6
.2 lda L.SHIFT,x Get relocated LO BYTE
sta Shift.R.LO,y
inx
lda L.SHIFT,x Get relocated HI BYTE
sta Shift.R.HI,y
inx
dey
bne .2
*--------------------------------------
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
bmi .1 //c,EVE mode
ldy #CONTROL.LCM-CONTROL.80C
.1 ldx CONTROL.SWTCHES,y
bmi .8 Ending $ff
sta $C000,x
iny
bra .1
.8
*--------------------------------------
CLOSE clc
rts
*--------------------------------------
WRITE >STYA ZPIOCTL NON STANDARD
sta SET80STORE
lda (ZPIOCTL) Get Cmd
.1 tax
ldy CB.CmdLen,x
.2 lda (ZPIOCTL),y
sta CB.Cache,y
dey
bpl .2
.3 jsr .10
clc
rts
.10 jmp (J.Cmds,x)
*--------------------------------------
* 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.SWTCHES
* sta CLRTEXT
* sta CLRMIXED
* sta SETHIRES
* sta CLR80STORE
* sta CLRPAGE2
* sta SETIOUDIS
CONTROL.80C
* sta CLRMIXED STA $CO52 ;Full Screen
* sta SETHIRES STA $C057 ;HIRES
* sta CLRTEXT STA $C050 ;Graphics
* sta CLR80DISP STA $C00C ;80 Columns OFF
* sta SETDHIRES STA $C05E ;AN3 OFF
* sta CLRDHIRES STA $C05F ;AN3 ON
* sta SETDHIRES STA $C05E ;AN3 OFF
* sta CLRDHIRES STA $C05F ;AN3 ON
* sta SET80DISP STA $C00D ;80 Columns ON
* sta SETDHIRES STA $C05E ;AN3 OFF
* sta CLRDHIRES STA $C05F ;AN3 ON
* sta SETDHIRES STA $C05E ;AN3 OFF
.DA #CLRTEXT
* .DA #CLRMIXED
.DA #SETHIRES
* .DA #CLR80STORE
* .DA #CLRPAGE2
.DA #SETIOUDIS
.DA #CLR80DISP
.DA #SETDHIRES
.DA #CLRDHIRES
.DA #SETDHIRES
.DA #CLRDHIRES
.DA #SET80DISP
.DA #SETDHIRES
.DA #CLRDHIRES
.DA #SETDHIRES
.DA #$FF
CONTROL.LCM
* sta CLRTEXT
* sta CLRPAGE2
* sta CLRMIXED
* sta SETHIRES
* sta CLRAN2
* sta CLR80DISP
* sta SETDHIRES
* sta CLRDHIRES
* sta SET80DISP
* sta SETDHIRES
* sta CLRDHIRES
* sta SETDHIRES
.DA #CLRTEXT
* .DA #CLRMIXED
.DA #SETHIRES
* .DA #CLR80STORE
* .DA #CLRPAGE2
.DA #SETIOUDIS
.DA #CLRAN2
.DA #CLR80DISP
.DA #SETDHIRES
.DA #CLRDHIRES
.DA #SET80DISP
.DA #SETDHIRES
.DA #CLRDHIRES
.DA #SETDHIRES
.DA #$ff
*--------------------------------------
Shift.L.LO .BS 7
Shift.L.HI .BS 7
Shift.R.LO .BS 7
Shift.R.HI .BS 7
*--------------------------------------
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
*--------------------------------------
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
.BS 1 STATUS
.DA #S.CB.M.MONO+S.CB.M.C16 F
.DA 560 W
.DA 192 H
*--------------------------------------
DRV.END
.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