A2osX/DRV/DHGR.DRV.S.txt
Rémy GIBERT 593f20becd bug fix
2015-03-23 18:09:21 +01:00

546 lines
15 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
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/DHGR.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
*--------------------------------------
ZPBASE .EQ ZPDRV
ZPCOLOR .EQ ZPDRV+2
*--------------------------------------
* Main DRV entry point
* input :
* X = CMD
* 0 : OPEN
* 2 : GETEVENT
* 6 : OUT
* 8 : CLOSE
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA OPEN
.DA GETEVENT
.DA OUT
.DA CLOSE
.DA GETINFO
.DA SETPIXEL
.DA GETPIXEL
.DA HLINE
.DA VLINE
.DA FILLREC
.DA BITBLT
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
OPEN lda #S.DEV.F.GFX
sta (pDevContext)
ldy #S.DEV.NAME
ldx #0
.1 lda DEVNAME,x
sta (pDevContext),y
cpx DEVNAME
beq .8
inx
iny
bne .1
.8 lda A2osX.SCREENS
ora #A2osX.SCREENS.G
sta A2osX.SCREENS
lda #A2osX.SCREENS.G
>SYSCALL SYS.ScreenSelectA
sta SET80STORE
ldx #192
.81 dex
lda BASEL,x
sta ZPBASE
lda BASEH,x
sta ZPBASE+1
lda #$D5
ldy #39
sta SETPAGE2
.82 sta (ZPBASE),y
dey
bpl .82
lda #$AA
ldy #39
sta CLRPAGE2
.83 sta (ZPBASE),y
dey
bpl .83
dex
lda BASEL,x
sta ZPBASE
lda BASEH,x
sta ZPBASE+1
lda #$2A
ldy #39
sta SETPAGE2
.84 sta (ZPBASE),y
dey
bpl .84
lda #$55
ldy #39
sta CLRPAGE2
.85 sta (ZPBASE),y
dey
bpl .85
txa
bne .81
>DEBUG
clc
rts
*--------------------------------------
GETEVENT
OUT clc
rts
*--------------------------------------
CLOSE lda A2osX.SCREENS
and #$FF^A2osX.SCREENS.G
sta A2osX.SCREENS
clc
rts
*--------------------------------------
GETINFO >LDYA L.DEVINFO
clc
rts
*--------------------------------------
* SETPIXEL
*--------------------------------------
* PULLB = X.LO
* PULLB = X.HI
* PULLB = Y
* PULLB = Mode
* 00000001=mono
* 00000010=16 colors
* 1000000=xor (mono on 1 bit)
* PULLB = Color (if not xor)
*--------------------------------------
SETPIXEL >PULLA X.LO
tax
>PULLA X.HI
lsr if 256 =< x < 511
bcs .1
lsr
bcs .2 if 512 < x
ldy DIV7.0,x
lda MOD7.0,x
bra .3
.1 ldy DIV7.256,x
lda MOD7.256,x
bra .3
.2 ldy DIV7.512,x
lda MOD7.512,x
.3 pha save MOD,y=DIV
>PULLA Pull Y
tax
lda BASEL,x setup line Base Ptr
sta ZPBASE
lda BASEH,x
sta ZPBASE+1
sta SET80STORE and prepare for page switching
sta SETHIRES
plx get back MOD in x
>PULLA Pull Mode
and #$FF
bpl SETPIXEL.SOLID
SETPIXEL.XOR tya
lsr
tay
bcs .1 odd=main ram
sta SETPAGE2
bra .2
.1 sta CLRPAGE2
.2 lda (ZPBASE),y
eor Mono.Masks,x
sta (ZPBASE),y
rts
*--------------------------------------
* A=Mode,X=MOD,Y=DIV
*--------------------------------------
SETPIXEL.SOLID dec
bne SETPIXEL.COLOR
tya
lsr
tay
bcs .1 odd=main ram
sta SETPAGE2
bra .2
.1 sta CLRPAGE2
.2 >PULLA get COLOR
lsr
bcs .3 set white pixel
lda (ZPBASE),y
and Mono.NMasks,x includes And $7F for mono
sta (ZPBASE),y
rts
.3 lda (ZPBASE),y
and #$7F switch back this byte to mono
ora Mono.Masks,x
sta (ZPBASE),y
rts
*--------------------------------------
* X=MOD,Y=DIV
*--------------------------------------
SETPIXEL.COLOR tya
lsr Divide Col by 2 to get in range 0->39
and #$FE make it 0->38 as color mask on 4 bytes
clc
adc ZPBASE ZPBASE now point to first of the 4 columns
sta ZPBASE
txa get MOD
asl times 4 to compute index in color tables
asl
tax set in X for Masks,NMasks
>PULLA get COLOR
asl
asl
tay
lda Color.Masks,x
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 rts
*--------------------------------------
GETPIXEL
*--------------------------------------
HLINE
*--------------------------------------
VLINE
*--------------------------------------
FILLREC
*--------------------------------------
* params : X,Y,W,H
*--------------------------------------
BITBLT
rts
*--------------------------------------
CS.END
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
*--------------------------------------
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)
*--------------------------------------
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
*--------------------------------------
Color.Masks.DEL .DA #%00001111,#%00000000,#%00000000,#%00000000 (nothing to do)
.DA #%01110000,#%00000001,#%00000000,#%00000000 asl0,asl0,rol1,asl0,rol1,asl0,rol1
.DA #%00000000,#%00011110,#%00000000,#%00000000 lsr1
.DA #%00000000,#%01100000,#%00000011,#%00000000 asl1,asl1,rol2,asl1,rol2
.DA #%00000000,#%00000000,#%00111100,#%00000000 lsr2,lsr2
.DA #%00000000,#%00000000,#%01000000,#%00000111 asl2,asl2,rol3
.DA #%00000000,#%00000000,#%00000000,#%01111000 lsr3,lsr3,lsr3
*--------------------------------------
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
* pixel masks c1110000.c3322221.c5444433.c6666555
*--------------------------------------
Color.Pixels .DA #%00000000,#%00000000,#%00000000,#%00000000 (color bit disable)
.DA #%10010001,#%10100010,#%11000100,#%10001000
.DA #%10100010,#%11000100,#%10001000,#%10010001
.DA #%10110011,#%11100110,#%11001100,#%10011001
.DA #%11000100,#%10001000,#%10010001,#%10100010
.DA #%11010101,#%10101010,#%11010101,#%10101010
.DA #%11100110,#%11001100,#%10011001,#%10110011
.DA #%11110111,#%11101110,#%11011101,#%10111011
.DA #%10001000,#%10010001,#%10100010,#%11000100
.DA #%10011001,#%10110011,#%11100110,#%11001100
.DA #%10101010,#%11010101,#%10101010,#%11010101
.DA #%10111011,#%11110111,#%11101111,#%11011101
.DA #%11001100,#%10011001,#%10110011,#%11100110
.DA #%11011101,#%10111011,#%11110111,#%11101110
.DA #%11101110,#%11011101,#%10111011,#%11110111
.DA #%01111111,#%01111111,#%01111111,#%01111111 (color bit disable)
*Black 00 00 00 00 0000
*Magenta 08 11 22 44 0001
*Brown 44 08 11 22 0010
*Orange 4C 19 33 66 0011
*Dark Green 22 44 08 11 0100
*Grey1 2A 55 2A 55 0101
*Green 66 4C 19 33 0110
*Yellow 6E 5D 3B 77 0111
*Dark Blue 11 22 44 08 1000
*Violet 19 33 66 4C 1001
*Grey2 55 2A 55 2A 1010
*Pink 5D 3B 77 6E 1011
*Medium Blue 33 66 4C 19 1100
*Light Blue 3B 77 6E 5D 1101
*Aqua 77 6E 5D 3B 1110
*White 7F 7F 7F 7F 1111
*--------------------------------------
DEVNAME >PSTRING "GFX"
GBYTE .BS 1
*--------------------------------------
DS.START
DEVINFO .DA #S.DEV.F.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
DS.END
*--------------------------------------
MAN
SAVE DRV/DHGR.DRV.S
ASM