mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-03 12:06:05 +00:00
562 lines
15 KiB
Plaintext
562 lines
15 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.SRC
|
||
NEW
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
.OP 65C02
|
||
.OR $2000
|
||
.TF /A2OSX.BOOT/DRV/DHGR.DRV
|
||
*--------------------------------------
|
||
.INB INC/MACROS.I
|
||
.INB INC/A2OSX.I
|
||
.INB INC/IO.I
|
||
*--------------------------------------
|
||
ZPBASE .EQ ZPDRV
|
||
ZPCOLOR .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 SYS.PSTROutYA
|
||
|
||
lda A2osX.SCREENS
|
||
ora #A2osX.SCREENS.G
|
||
sta A2osX.SCREENS
|
||
|
||
clc
|
||
rts
|
||
CS.END
|
||
MSG.DETECT >PSTRING "\nApple IIe/IIc DHGR Driver.\n"
|
||
*--------------------------------------
|
||
* Device Header (16 Bytes)
|
||
*--------------------------------------
|
||
DEV.HEADER cld
|
||
jmp (DRV.CS.START,x)
|
||
.DA #S.DEV.F.EVENT
|
||
>PSTRING "GFX" NAME
|
||
.HS 00 NAME must Be 5 bytes long
|
||
.HS 00.00
|
||
.HS 00.00.00.00
|
||
*--------------------------------------
|
||
* Driver Code
|
||
*--------------------------------------
|
||
DRV.CS.START .DA OPEN
|
||
.DA GETEVENT
|
||
.DA COUT
|
||
.DA CLOSE
|
||
.DA GETINFO
|
||
.DA IRQ
|
||
.DA SETPIXEL
|
||
.DA GETPIXEL
|
||
.DA HLINE
|
||
.DA VLINE
|
||
.DA BITBLT
|
||
.DA FILLREC
|
||
L.DEVINFO .DA DEVINFO
|
||
.DA 0 end or relocation
|
||
*--------------------------------------
|
||
OPEN lda #A2osX.SCREENS.G
|
||
>SYSCALL SYS.ScreenSelectA
|
||
|
||
ldx #192
|
||
|
||
.81 dex
|
||
|
||
lda BASEL,x
|
||
sta ZPBASE
|
||
lda BASEH,x
|
||
sta ZPBASE+1
|
||
|
||
* lda #$55
|
||
lda #$00
|
||
|
||
ldy #39
|
||
sta SETWRITEAUX
|
||
.82 sta (ZPBASE),y
|
||
dey
|
||
bpl .82
|
||
|
||
* lda #$2A
|
||
lda #$00
|
||
|
||
ldy #39
|
||
sta CLRWRITEAUX
|
||
.83 sta (ZPBASE),y
|
||
dey
|
||
bpl .83
|
||
|
||
txa
|
||
bne .81
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
GETEVENT lda A2osX.ASCREEN
|
||
and #A2osX.SCREENS.G is screen active?
|
||
beq .9
|
||
|
||
>SYSCALL SYS.GetKeyboardEvent
|
||
bcs .9
|
||
rts
|
||
|
||
.9 lda #0 Error = no event
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
COUT
|
||
IRQ sec
|
||
rts
|
||
*--------------------------------------
|
||
CLOSE clc
|
||
rts
|
||
*--------------------------------------
|
||
GETINFO >LDYA L.DEVINFO
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
* SETPIXEL
|
||
* PULLB = Mode
|
||
* 00000001=B/W
|
||
* 00000010=16 colors
|
||
* 1000000=xor (mono on 1 bit)
|
||
* PULLW = X
|
||
* PULLB = Y
|
||
* PULLB = Color (if not xor)
|
||
*--------------------------------------
|
||
SETPIXEL sta SET80STORE
|
||
|
||
>PULLA Pull Mode
|
||
and #$FF
|
||
bpl SETPIXEL.1
|
||
|
||
SETPIXEL.XOR >PULLYA Y=X.LO,A=X.HI
|
||
lsr if 256 =< x < 511
|
||
bcs .1
|
||
lsr
|
||
bcs .2 if 512 < x
|
||
lda DIV7.0,y
|
||
ldx MOD7.0,y
|
||
bra .3
|
||
|
||
.1 lda DIV7.256,y
|
||
ldx MOD7.256,y
|
||
bra .3
|
||
|
||
.2 lda DIV7.512,y
|
||
ldx MOD7.512,y
|
||
|
||
.3 lsr
|
||
tay
|
||
bcs .4 odd=main ram
|
||
sta SETPAGE2
|
||
|
||
.4 >PULLA Pull Y
|
||
tax
|
||
lda BASEL,x setup line Base Ptr
|
||
sta ZPBASE
|
||
lda BASEH,x
|
||
sta ZPBASE+1
|
||
|
||
lda (ZPBASE),y
|
||
eor Mono.Masks,x
|
||
sta (ZPBASE),y
|
||
|
||
sta CLR80STORE
|
||
rts
|
||
*--------------------------------------
|
||
SETPIXEL.1 lsr
|
||
bcc SETPIXEL.COLOR
|
||
>PULLW CX
|
||
>PULLB CY
|
||
|
||
ldy CX
|
||
lsr CX+1 if 256 =< x < 511
|
||
bcs .1
|
||
lsr CX+1
|
||
bcs .2 if 512 < x
|
||
lda DIV7.0,y
|
||
ldx MOD7.0,y
|
||
bra .3
|
||
|
||
.1 lda DIV7.256,y
|
||
ldx MOD7.256,y
|
||
bra .3
|
||
|
||
.2 lda DIV7.512,y
|
||
ldx MOD7.512,y
|
||
|
||
.3 lsr
|
||
bcc .4 odd=main ram
|
||
sta CLRPAGE2
|
||
clc
|
||
bra .41
|
||
.4 sta SETPAGE2
|
||
|
||
.41 ldy CY
|
||
adc BASEL,y setup line Base Ptr
|
||
sta ZPBASE
|
||
lda BASEH,y
|
||
sta ZPBASE+1
|
||
|
||
>PULLA Pull Color
|
||
lsr
|
||
bcs .6 set white pixel
|
||
|
||
lda (ZPBASE)
|
||
and Mono.NMasks,x includes And $7F for mono
|
||
sta (ZPBASE)
|
||
sta CLR80STORE
|
||
rts
|
||
|
||
.6 lda (ZPBASE)
|
||
and #$7F switch back this byte to mono
|
||
ora Mono.Masks,x
|
||
sta (ZPBASE)
|
||
sta CLR80STORE
|
||
rts
|
||
*--------------------------------------
|
||
SETPIXEL.COLOR >PULLW CX Get X.LO...
|
||
>PULLB CY
|
||
|
||
lda CX
|
||
lsr CX+1 divide by 4
|
||
ror
|
||
lsr CX+1
|
||
ror
|
||
tay Y=CX/4 (range 0->139)
|
||
lda DIV7.0,y A=CX/4/7 (range 0->19)
|
||
|
||
asl times 2 (range 0->38)
|
||
|
||
ldx CY
|
||
adc BASEL,x setup line Base Ptr (cc by asl)
|
||
sta ZPBASE ZPBASE now point to first of...
|
||
lda BASEH,x
|
||
sta ZPBASE+1 ...the 4 columns
|
||
|
||
lda MOD7.0,y get MOD
|
||
|
||
asl times 4 to compute index in MASK tables
|
||
asl
|
||
tax set in X for Masks,NMasks
|
||
|
||
>PULLA get COLOR
|
||
|
||
asl times 4 to compute index in PIXELS table
|
||
asl
|
||
tay
|
||
|
||
lda Color.Masks,x bits in 1st byte to light?
|
||
beq .1
|
||
and Color.Pixels,y apply color
|
||
sta GBYTE
|
||
|
||
sta SETPAGE2
|
||
|
||
lda (ZPBASE)
|
||
and Color.NMasks,x reset existing pixel,
|
||
ora GBYTE
|
||
sta (ZPBASE)
|
||
|
||
.1 inx
|
||
iny
|
||
|
||
lda Color.Masks,x
|
||
beq .2
|
||
and Color.Pixels,y apply color
|
||
sta GBYTE
|
||
|
||
sta CLRPAGE2
|
||
|
||
lda (ZPBASE)
|
||
and Color.NMasks,x reset existing pixel,
|
||
ora GBYTE
|
||
sta (ZPBASE)
|
||
|
||
.2 inc ZPBASE
|
||
inx
|
||
iny
|
||
|
||
lda Color.Masks,x
|
||
beq .3
|
||
and Color.Pixels,y apply color
|
||
sta GBYTE
|
||
|
||
sta SETPAGE2
|
||
|
||
lda (ZPBASE)
|
||
and Color.NMasks,x reset existing pixel,
|
||
ora GBYTE
|
||
sta (ZPBASE)
|
||
|
||
.3 inx
|
||
iny
|
||
|
||
lda Color.Masks,x
|
||
beq .8
|
||
and Color.Pixels,y apply color
|
||
sta GBYTE
|
||
|
||
sta CLRPAGE2
|
||
|
||
lda (ZPBASE)
|
||
and Color.NMasks,x reset existing pixel,
|
||
ora GBYTE
|
||
sta (ZPBASE)
|
||
|
||
.8 sta CLR80STORE
|
||
rts
|
||
*--------------------------------------
|
||
GETPIXEL rts
|
||
*--------------------------------------
|
||
HLINE rts
|
||
*--------------------------------------
|
||
VLINE rts
|
||
*--------------------------------------
|
||
FILLREC rts
|
||
*--------------------------------------
|
||
*
|
||
* 0 : hStockObject
|
||
* 1 : Operation
|
||
* Replace
|
||
* Combine (Ora)
|
||
* CombineEx (And with Src Mask,Ora with Src BM)
|
||
* 2 : SrcX
|
||
* 4 : SrcY
|
||
* 6 : DestX
|
||
* 8 : DestY
|
||
* 12 : Width
|
||
* 14 : Height
|
||
*
|
||
*--------------------------------------
|
||
BITBLT
|
||
rts
|
||
*--------------------------------------
|
||
DRV.CS.END
|
||
*--------------------------------------
|
||
Mono.NMasks .DA #%01111110
|
||
.DA #%01111101
|
||
.DA #%01111011
|
||
.DA #%01110111
|
||
.DA #%01101111
|
||
.DA #%01011111
|
||
.DA #%00111111
|
||
*--------------------------------------
|
||
Mono.Masks .DA #%00000001
|
||
.DA #%00000010
|
||
.DA #%00000100
|
||
.DA #%00001000
|
||
.DA #%00010000
|
||
.DA #%00100000
|
||
.DA #%01000000
|
||
*--------------------------------------
|
||
* bits to "and" to reset color of pixel (0 means nothing to do)
|
||
* 4 bytes * 7 mods
|
||
*--------------------------------------
|
||
* c1110000 c3322221 c5444433 c6666555
|
||
Color.NMasks .DA #%01110000,#%00000000,#%00000000,#%00000000
|
||
.DA #%00001111,#%01111110,#%00000000,#%00000000
|
||
.DA #%00000000,#%01100001,#%00000000,#%00000000
|
||
.DA #%00000000,#%00011111,#%01111100,#%00000000
|
||
.DA #%00000000,#%00000000,#%01000011,#%00000000
|
||
.DA #%00000000,#%00000000,#%00111111,#%01111000
|
||
.DA #%00000000,#%00000000,#%00000000,#%00000111
|
||
*--------------------------------------
|
||
* bits to "and" to Get color of pixel (0 means nothing to do)
|
||
* 4 bytes * 7 mods
|
||
*--------------------------------------
|
||
* c1110000 c3322221 c5444433 c6666555
|
||
Color.Masks .DA #%10001111,#%00000000,#%00000000,#%00000000
|
||
.DA #%11110000,#%00000001,#%00000000,#%00000000
|
||
.DA #%00000000,#%10011110,#%00000000,#%00000000
|
||
.DA #%00000000,#%11100000,#%00000011,#%00000000
|
||
.DA #%00000000,#%00000000,#%10111100,#%00000000
|
||
.DA #%00000000,#%00000000,#%11000000,#%00000111
|
||
.DA #%00000000,#%00000000,#%00000000,#%11111000
|
||
*--------------------------------------
|
||
* bits to "ora" to set color of pixel (including "color bit set" for byte hosting bit0)
|
||
* 4 bytes * 16 Colors
|
||
*--------------------------------------
|
||
* c1110000 c3322221 c5444433 c6666555
|
||
Color.Pixels .DA #%00000000,#%00000000,#%00000000,#%00000000 black (color bit disable)
|
||
.DA #%01111111,#%01111111,#%01111111,#%01111111 white (color bit disable)
|
||
.DA #%10010001,#%10100010,#%11000100,#%10001000 dark blue
|
||
.DA #%10100010,#%11000100,#%10001000,#%10010001 dark green
|
||
.DA #%10110011,#%11100110,#%11001100,#%10011001 medium blue
|
||
.DA #%11000100,#%10001000,#%10010001,#%10100010 brown
|
||
.DA #%11010101,#%10101010,#%11010101,#%10101010 grey2
|
||
.DA #%11100110,#%11001100,#%10011001,#%10110011 green
|
||
.DA #%11110111,#%11101110,#%11011101,#%10111011 aqua
|
||
.DA #%10001000,#%10010001,#%10100010,#%11000100 Magenta
|
||
.DA #%10011001,#%10110011,#%11100110,#%11001100 violet
|
||
.DA #%10101010,#%11010101,#%10101010,#%11010101 grey1
|
||
.DA #%10111011,#%11110111,#%11101110,#%11011101 light blue
|
||
.DA #%11001100,#%10011001,#%10110011,#%11100110 orange
|
||
.DA #%11011101,#%10111011,#%11110111,#%11101110 pink
|
||
.DA #%11101110,#%11011101,#%10111011,#%11110111 yellow
|
||
*--------------------------------------
|
||
DIV7.0 .HS 0000000000000001010101010101
|
||
.HS 0202020202020203030303030303
|
||
.HS 0404040404040405050505050505
|
||
.HS 0606060606060607070707070707
|
||
.HS 0808080808080809090909090909
|
||
.HS 0A0A0A0A0A0A0A0B0B0B0B0B0B0B
|
||
.HS 0C0C0C0C0C0C0C0D0D0D0D0D0D0D
|
||
.HS 0E0E0E0E0E0E0E0F0F0F0F0F0F0F
|
||
.HS 1010101010101011111111111111
|
||
.HS 1212121212121213131313131313
|
||
.HS 1414141414141415151515151515
|
||
.HS 1616161616161617171717171717
|
||
.HS 1818181818181819191919191919
|
||
.HS 1A1A1A1A1A1A1A1B1B1B1B1B1B1B
|
||
.HS 1C1C1C1C1C1C1C1D1D1D1D1D1D1D
|
||
.HS 1E1E1E1E1E1E1E1F1F1F1F1F1F1F
|
||
.HS 2020202020202021212121212121
|
||
.HS 2222222222222223232323232323
|
||
.HS 24242424
|
||
DIV7.256 .HS 24242425252525252525
|
||
.HS 2626262626262627272727272727
|
||
.HS 2828282828282829292929292929
|
||
.HS 2A2A2A2A2A2A2A2B2B2B2B2B2B2B
|
||
.HS 2C2C2C2C2C2C2C2D2D2D2D2D2D2D
|
||
.HS 2E2E2E2E2E2E2E2F2F2F2F2F2F2F
|
||
.HS 3030303030303031313131313131
|
||
.HS 3232323232323233333333333333
|
||
.HS 3434343434343435353535353535
|
||
.HS 3636363636363637373737373737
|
||
.HS 3838383838383839393939393939
|
||
.HS 3A3A3A3A3A3A3A3B3B3B3B3B3B3B
|
||
.HS 3C3C3C3C3C3C3C3D3D3D3D3D3D3D
|
||
.HS 3E3E3E3E3E3E3E3F3F3F3F3F3F3F
|
||
.HS 4040404040404041414141414141
|
||
.HS 4242424242424243434343434343
|
||
.HS 4444444444444445454545454545
|
||
.HS 4646464646464647474747474747
|
||
.HS 4848484848484849
|
||
DIV7.512 .HS 494949494949
|
||
.HS 4A4A4A4A4A4A4A4B4B4B4B4B4B4B
|
||
.HS 4C4C4C4C4C4C4C4D4D4D4D4D4D4D
|
||
.HS 4E4E4E4E4E4E4E4F4F4F4F4F4F4F
|
||
*--------------------------------------
|
||
MOD7.0 .HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 00010203
|
||
MOD7.256 .HS 04050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600
|
||
MOD7.512 .HS 010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
.HS 0001020304050600010203040506
|
||
*--------------------------------------
|
||
BASEL .HS 00.00.00.00.00.00.00.00
|
||
.HS 80.80.80.80.80.80.80.80
|
||
.HS 00.00.00.00.00.00.00.00
|
||
.HS 80.80.80.80.80.80.80.80
|
||
.HS 00.00.00.00.00.00.00.00
|
||
.HS 80.80.80.80.80.80.80.80
|
||
.HS 00.00.00.00.00.00.00.00
|
||
.HS 80.80.80.80.80.80.80.80
|
||
.HS 28.28.28.28.28.28.28.28
|
||
.HS A8.A8.A8.A8.A8.A8.A8.A8
|
||
.HS 28.28.28.28.28.28.28.28
|
||
.HS A8.A8.A8.A8.A8.A8.A8.A8
|
||
.HS 28.28.28.28.28.28.28.28
|
||
.HS A8.A8.A8.A8.A8.A8.A8.A8
|
||
.HS 28.28.28.28.28.28.28.28
|
||
.HS A8.A8.A8.A8.A8.A8.A8.A8
|
||
.HS 50.50.50.50.50.50.50.50
|
||
.HS D0.D0.D0.D0.D0.D0.D0.D0
|
||
.HS 50.50.50.50.50.50.50.50
|
||
.HS D0.D0.D0.D0.D0.D0.D0.D0
|
||
.HS 50.50.50.50.50.50.50.50
|
||
.HS D0.D0.D0.D0.D0.D0.D0.D0
|
||
.HS 50.50.50.50.50.50.50.50
|
||
.HS D0.D0.D0.D0.D0.D0.D0.D0
|
||
*--------------------------------------
|
||
BASEH .HS 20.24.28.2C.30.34.38.3C
|
||
.HS 20.24.28.2C.30.34.38.3C
|
||
.HS 21.25.29.2D.31.35.39.3D
|
||
.HS 21.25.29.2D.31.35.39.3D
|
||
.HS 22.26.2A.2E.32.36.3A.3E
|
||
.HS 22.26.2A.2E.32.36.3A.3E
|
||
.HS 23.27.2B.2F.33.37.3B.3F
|
||
.HS 23.27.2B.2F.33.37.3B.3F
|
||
.HS 20.24.28.2C.30.34.38.3C
|
||
.HS 20.24.28.2C.30.34.38.3C
|
||
.HS 21.25.29.2D.31.35.39.3D
|
||
.HS 21.25.29.2D.31.35.39.3D
|
||
.HS 22.26.2A.2E.32.36.3A.3E
|
||
.HS 22.26.2A.2E.32.36.3A.3E
|
||
.HS 23.27.2B.2F.33.37.3B.3F
|
||
.HS 23.27.2B.2F.33.37.3B.3F
|
||
.HS 20.24.28.2C.30.34.38.3C
|
||
.HS 20.24.28.2C.30.34.38.3C
|
||
.HS 21.25.29.2D.31.35.39.3D
|
||
.HS 21.25.29.2D.31.35.39.3D
|
||
.HS 22.26.2A.2E.32.36.3A.3E
|
||
.HS 22.26.2A.2E.32.36.3A.3E
|
||
.HS 23.27.2B.2F.33.37.3B.3F
|
||
.HS 23.27.2B.2F.33.37.3B.3F
|
||
*--------------------------------------
|
||
CX .BS 2
|
||
CY .BS 1
|
||
COL .BS 1
|
||
GBYTE .BS 1
|
||
*--------------------------------------
|
||
DEVINFO .DA #S.DEVINFO.TYPE.GFX type of DEVINFO STRUCT
|
||
DEVINFO.MODES .DA #%10000011 XOR,16 & B/W
|
||
DEVINFO.W .DA 560 X.SIZE
|
||
DEVINFO.H .DA 192 Y.SIZE
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE DRV/DHGR.DRV.S
|
||
ASM
|