logo_demo: add myst drawing code

This commit is contained in:
Vince Weaver 2021-11-11 15:58:18 -05:00
parent db607defdf
commit f006d30848
13 changed files with 1444 additions and 4 deletions

View File

@ -128,6 +128,10 @@ WAIT 180
END
TO MYST
CS HT
SETBG 1
.CALL 23084
WAIT 180
END
TO CREDITS
@ -149,8 +153,8 @@ PRINT "DSR
PRINT "OCEAN
PRINT "WARGAMES
PRINT "PLASMA
POLY
PRINT "MYST
PRINT "POLY
MYST
PRINT "CS
PRINT [REPEAT 5 [ CTREE ]]
CREDITS

View File

@ -26,6 +26,14 @@ PTRIG = $C070
;; BASIC ROUTINES
NORMAL = $F273
BKGND0 = $F3F4 ; clear current page to A
HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y)
HPLOT0 = $F457 ; plot at (Y,X), (A)
COLOR_SHIFT = $F47E
HLINRL = $F530 ; (X,A),(Y)
HGLIN = $F53A ; line to (X,A),(Y)
COLORTBL = $F6F6
;; MONITOR ROUTINES

View File

@ -58,6 +58,7 @@ mockingboard_not_found:
.include "nozp.inc"
.include "decompress_fast_v2.s"
.include "myst_vgi.s"
PT3_LOC = $1000

View File

@ -0,0 +1,84 @@
; VGI Myst for LOGO demo
;.include "zp.inc"
;.include "hardware.inc"
VGI_BUFFER = $F0
VGI_TYPE = $F0
P0 = $F1
P1 = $F2
P2 = $F3
P3 = $F4
P4 = $F5
P5 = $F6
P6 = $F7
VGIL = $F8
VGIH = $F9
TEMP0 = $FA
TEMP1 = $FB
TEMP2 = $FC
TEMP3 = $FD
TEMP4 = $FE
TEMP5 = $FF
vgi_myst:
; swap in ROM
; READ_ROM_NO_WRITE
bit $C08A
; save ZP
ldx #$FF
save_loop:
lda $0,X
sta vgi_save,X
dex
bne save_loop
jsr vgi_make_tables
lda #$20
sta $E6 ; setup page1
; get pointer to image data
; Rocket
lda #<rocket_data
sta VGIL
lda #>rocket_data
sta VGIH
jsr play_vgi
; restore ZP
ldx #$FF
restore_loop:
lda vgi_save,X
sta $00,X
dex
bne restore_loop
; restore settings
; READ_RAM1_WRITE_RAM1
bit $C08B
bit $C08B
rts
.include "vgi_common.s"
.include "rocket.data"
vgi_save = $a00

130
demos/logo_demo/rocket.data Normal file
View File

@ -0,0 +1,130 @@
rocket_data:
.byte $16,$16,$00,$7A,$8C,$45
.byte $16,$16,$8C,$7A,$8B,$45
.byte $16,$15,$EF,$AB,$28,$14
.byte $77,$14,$E4,$A2,$E2,$F5,$AB
.byte $77,$14,$E4,$A2,$E0,$F4,$B9
.byte $77,$14,$E8,$BF,$E0,$F4,$B8
.byte $77,$14,$FF,$A5,$F5,$FF,$AB
.byte $77,$14,$FF,$B2,$F5,$FF,$AB
.byte $16,$44,$FF,$AA,$18,$08
.byte $16,$44,$FF,$A3,$0F,$0F
.byte $67,$08,$56,$7C,$6B,$43,$22
.byte $35,$07,$61,$79,$04
.byte $35,$07,$B4,$79,$04
.byte $16,$77,$63,$77,$4C,$08
.byte $16,$44,$67,$72,$4B,$07
.byte $87,$04,$5F,$78,$73,$78,$66
.byte $87,$04,$B9,$78,$73,$78,$AF
.byte $16,$00,$66,$80,$0E,$3F
.byte $16,$00,$9C,$7E,$0D,$41
.byte $16,$00,$B3,$7E,$0F,$41
.byte $16,$33,$59,$89,$04,$09
.byte $16,$33,$BA,$8B,$04,$08
.byte $44,$05,$04,$5E
.byte $53,$1A,$5E
.byte $87,$04,$19,$5E,$54,$69,$2B
.byte $87,$05,$E9,$67,$67,$72,$B3
.byte $35,$04,$D9,$57,$20
.byte $35,$07,$F7,$57,$19
.byte $16,$44,$E7,$3B,$20,$05
.byte $87,$04,$FF,$3A,$36,$3A,$DE
.byte $16,$44,$E6,$6C,$13,$0C
.byte $16,$44,$F0,$6F,$26,$04
.byte $16,$44,$DC,$73,$2B,$05
.byte $16,$55,$2C,$54,$BE,$11
.byte $87,$05,$2C,$54,$4D,$54,$45
.byte $87,$05,$EA,$58,$4B,$58,$B6
.byte $16,$55,$4B,$4C,$73,$08
.byte $87,$07,$DF,$54,$54,$58,$EA
.byte $16,$55,$2C,$65,$8D,$05
.byte $87,$05,$E4,$65,$65,$6B,$BB
.byte $87,$05,$2C,$6A,$6A,$71,$4A
.byte $16,$55,$4A,$6A,$6F,$07
.byte $87,$05,$4A,$71,$71,$64,$66
.byte $87,$05,$B5,$71,$71,$64,$AD
.byte $16,$54,$63,$71,$4A,$04
.byte $16,$44,$EA,$58,$05,$0D
.byte $87,$04,$AD,$54,$4F,$58,$A3
.byte $87,$04,$DB,$58,$53,$57,$D2
.byte $67,$CC,$43,$50,$07,$1E,$B3
.byte $67,$CC,$46,$4C,$05,$04,$B3
.byte $67,$CC,$46,$6A,$05,$08,$B3
.byte $67,$CC,$B7,$4C,$07,$24,$B3
.byte $44,$04,$96,$50
.byte $53,$73,$50
.byte $53,$73,$6C
.byte $53,$78,$6F
.byte $53,$89,$6F
.byte $44,$07,$8A,$51
.byte $53,$8A,$6D
.byte $44,$04,$8B,$60
.byte $53,$A8,$61
.byte $44,$04,$8B,$64
.byte $53,$A5,$64
.byte $16,$66,$94,$74,$0A,$08
.byte $16,$77,$93,$65,$0B,$10
.byte $16,$51,$96,$67,$05,$0A
.byte $77,$16,$9A,$5F,$94,$9E,$65
.byte $44,$02,$97,$61
.byte $53,$9B,$61
.byte $77,$11,$80,$81,$65,$6D,$BF
.byte $77,$13,$81,$81,$6D,$81,$BF
.byte $16,$33,$81,$81,$16,$3E
.byte $77,$11,$99,$81,$AA,$B3,$BF
.byte $77,$13,$98,$81,$98,$AA,$BF
.byte $44,$00,$98,$81
.byte $53,$AA,$BF
.byte $44,$00,$81,$81
.byte $53,$6D,$BF
.byte $44,$00,$7F,$73
.byte $53,$80,$85
.byte $44,$03,$7F,$73
.byte $53,$7A,$81
.byte $44,$02,$7B,$7E
.byte $53,$7B,$93
.byte $44,$03,$78,$80
.byte $53,$74,$90
.byte $53,$6D,$9A
.byte $53,$63,$9E
.byte $16,$22,$61,$A4,$03,$1B
.byte $35,$02,$62,$A1,$04
.byte $44,$00,$99,$75
.byte $53,$98,$84
.byte $44,$03,$99,$76
.byte $53,$9D,$81
.byte $44,$02,$9E,$7E
.byte $53,$9D,$8D
.byte $44,$03,$9E,$7F
.byte $53,$A2,$8E
.byte $53,$A8,$9A
.byte $53,$B2,$A0
.byte $16,$22,$B1,$A4,$04,$1B
.byte $35,$02,$B3,$A1,$04
.byte $16,$66,$AE,$58,$05,$26
.byte $16,$66,$AE,$49,$05,$07
.byte $44,$06,$B1,$5A
.byte $53,$B1,$4A
.byte $44,$00,$81,$BF
.byte $53,$90,$BB
.byte $44,$00,$8B,$BC
.byte $53,$84,$B4
.byte $53,$82,$AA
.byte $53,$81,$9D
.byte $53,$86,$95
.byte $53,$8B,$8F
.byte $53,$87,$8A
.byte $53,$86,$84
.byte $53,$8A,$7E
.byte $53,$83,$7F
.byte $44,$00,$7E,$91
.byte $53,$8F,$8E
.byte $44,$86,$17,$36
.byte $53,$EE,$41
.byte $53,$B1,$4A
.byte $53,$AA,$52
.byte $53,$AD,$55
.byte $53,$BD,$58
.byte $53,$D1,$56
.byte $FF

146
demos/logo_demo/rocket.vgi Normal file
View File

@ -0,0 +1,146 @@
; Rocket from Myst
;CLS 255 ; white background
RECT 1 6 0 122 140 191 ; ocean left
RECT 1 6 140 122 279 191 ; ocean right
; rock
RECT 1 5 239 171 279 191 ; green/orange rock
VTRI 4 228 162 226 245 171 ; black edge
VTRI 4 228 162 224 244 185 ; black edge
VTRI 4 232 191 224 244 184 ; upside down
VTRI 4 255 165 245 255 171 ; black right edge
VTRI 4 255 178 245 255 171 ; black right edge
RECT 4 4 255 170 279 178 ; rock shade
RECT 4 4 255 163 270 178 ; rock shade
; base
DRECT 0x8 0x22 86 124 193 191 ; green brick dock
FCIRC 7 97 121 4 ; left platform
FCIRC 7 180 121 4 ; right platform
RECT 7 7 99 119 175 127 ; platform
RECT 4 4 103 114 178 121 ; shady platform
HTRI 4 95 120 115 120 102 ; left shady plat
HTRI 4 185 120 115 120 175 ; right shady plat
RECT 0 0 102 128 116 191 ; left shade
RECT 0 0 156 126 169 191 ; center shade
RECT 0 0 179 126 194 191 ; right shade
RECT 3 3 89 137 93 146 ; left light
RECT 3 3 186 139 190 147 ; right light
; spaceship
POINT 5 4 94 ; nosepipe
LINETO 26 94 ;
HTRI 4 25 94 84 105 43 ; noscone
; draw deeper Z body
HTRI 5 233 103 103 114 179 ; behind bottom fin
; draw tails
FCIRC 4 217 87 32 ; tails
FCIRC 7 247 87 25 ; tails cutout
RECT 4 4 231 59 263 64 ; top fin
HTRI 4 255 58 54 58 222
RECT 4 4 230 108 249 120 ; bottom fin
RECT 4 4 240 111 278 115 ; bottom fin
RECT 4 4 220 115 263 120 ; bottom fin
; draw body
RECT 5 5 44 84 234 101 ; body
HTRI 5 44 84 77 84 69 ; left top
HTRI 5 234 88 75 88 182 ; right top
RECT 5 5 75 76 190 84 ; center top
HTRI 7 223 84 84 88 234 ; right cutout
RECT 5 5 44 101 185 106 ; next strip down
HTRI 5 228 101 101 107 187 ; over bottom fin
HTRI 5 44 106 106 113 74 ; left under
RECT 5 5 74 106 185 113 ; next layer
HTRI 5 74 113 113 100 102 ; next left
HTRI 5 181 113 113 100 173 ; next right
RECT 5 4 99 113 173 117 ; next layer
; decorations
RECT 4 4 234 88 239 101 ; nozzle
HTRI 4 173 84 79 88 163 ; weird scoop
HTRI 4 219 88 83 87 210 ; another scoop
DRECT 0xcc 0xb3 67 80 74 110 ; left stripe
DRECT 0xcc 0xb3 70 76 75 80 ; left stripe
DRECT 0xcc 0xb3 70 106 75 114 ; left stripe
DRECT 0xcc 0xb3 183 76 190 112 ; right stripe
; door
POINT 4 150 80
LINETO 115 80
LINETO 115 108
LINETO 120 111
LINETO 137 111
POINT 7 138 81
LINETO 138 109
; door lines
POINT 4 139 96
LINETO 168 97
POINT 4 139 100
LINETO 165 100
; marker switch
RECT 6 6 148 116 158 124 ; base
RECT 7 7 147 101 158 117 ; border
RECT 5 1 150 103 155 113 ; woodgrain
VTRI 6 154 95 148 158 101 ; top
POINT 2 151 97 ; handle
LINETO 155 97
; walkway
VTRI 1 128 129 101 109 191 ; left path green
VTRI 3 129 129 109 129 191 ; left path white
RECT 3 3 129 129 151 191 ; center path
VTRI 1 153 129 170 179 191 ; right path green
VTRI 3 152 129 152 170 191 ; right path white
POINT 0 152 129 ; right gap
LINETO 170 191 ; right gap
POINT 0 129 129 ; left gap
LINETO 109 191 ; left gap
; left railing
POINT 0 127 115 ; far left pole
LINETO 128 133
POINT 3 127 115 ; far left rope
LINETO 122 129
POINT 2 123 126 ; center left pole
LINETO 123 147
POINT 3 120 128 ; center left rope
LINETO 116 144
LINETO 109 154
LINETO 99 158
RECT 2 2 97 164 100 191 ; near pole
FCIRC 2 98 161 4 ; near pole circle
; right railing
POINT 0 153 117 ; far right pole
LINETO 152 132
POINT 3 153 118 ; far right rope
LINETO 157 129
POINT 2 158 126 ; center right pole
LINETO 157 141
POINT 3 158 127 ; center right rope
LINETO 162 142
LINETO 168 154
LINETO 178 160
RECT 2 2 177 164 181 191 ; near pole
FCIRC 2 179 161 4 ; near pole circle
; wire pole
RECT 6 6 174 88 179 126 ; pole
RECT 6 6 174 73 179 80 ; insulator
POINT 6 177 90 ; thinner pole
LINETO 177 74 ; to top
; shadow
POINT 0 129 191
LINETO 144 187
POINT 0 139 188
LINETO 132 180
LINETO 130 170
LINETO 129 157
LINETO 134 149
LINETO 139 143
LINETO 135 138
LINETO 134 132
LINETO 138 126
LINETO 131 127
POINT 0 126 145
LINETO 143 142
; power wire
POINT 6 279 54 ; from off screen
LINETO 238 65
LINETO 177 74
LINETO 170 82
LINETO 173 85
LINETO 189 88
LINETO 209 86
END

View File

@ -0,0 +1,303 @@
; VGI_Circles
XX = TEMP0
MINUSXX = TEMP1
YY = TEMP2
MINUSYY = TEMP3
D = TEMP4
COUNT = TEMP5
;========================
; VGI circle
;========================
VGI_CCOLOR = P0
VGI_CX = P1
VGI_CY = P2
VGI_CR = P3
vgi_circle:
ldx VGI_CCOLOR
lda COLORTBL,X
sta HGR_COLOR
;===============================
; draw circle
;===============================
; draw circle at (CX,CY) of radius R
; signed 8-bit math so problems if R > 64?
; XX=0 YY=R
; D=3-2*R
; GOTO6
lda #0
sta XX
lda VGI_CR
sta YY
lda #3
sec
sbc VGI_CR
sbc VGI_CR
sta D
jmp do_plots
circle_loop:
; X=X+1
inc XX
; IF D>0 THEN Y=Y-1:D=D+4*(X-Y)+10
lda D
bmi else
dec YY
lda XX
sec
sbc YY
asl
asl
clc
adc D
adc #10
jmp store_D
else:
; ELSE D=D+4*X+6
lda XX
asl
asl
clc
adc D
adc #6
store_D:
sta D
do_plots:
; setup constants
lda XX
eor #$FF
sta MINUSXX
inc MINUSXX
lda YY
eor #$FF
sta MINUSYY
inc MINUSYY
; HPLOT CX+X,CY+Y
; HPLOT CX-X,CY+Y
; HPLOT CX+X,CY-Y
; HPLOT CX-X,CY-Y
; HPLOT CX+Y,CY+X
; HPLOT CX-Y,CY+X
; HPLOT CX+Y,CY-X
; HPLOT CX-Y,CY-X
; calc X co-ord
lda #7
sta COUNT
pos_loop:
lda COUNT
and #$4
lsr
tay
lda COUNT
lsr
bcc xnoc
iny
xnoc:
lda VGI_CX
clc
adc XX,Y
tax
; calc y co-ord
lda COUNT
lsr
eor #$2
tay
lda VGI_CY
clc
adc XX,Y
ldy #0
jsr HPLOT0 ; plot at (Y,X), (A)
dec COUNT
bpl pos_loop
; IFY>=XTHEN4
lda YY
cmp XX
bcs circle_loop
jmp vgi_loop
;========================
; VGI circle
;========================
; VGI_CCOLOR = P0
; VGI_CX = P1
; VGI_CY = P2
; VGI_CR = P3
vgi_filled_circle:
ldx VGI_CCOLOR
lda COLORTBL,X
sta HGR_COLOR
;===============================
; draw filled circle
;===============================
; draw filled circle at (CX,CY) of radius R
; signed 8-bit math so problems if R > 64?
; XX=0 YY=R
; D=3-2*R
; GOTO6
lda #0
sta XX
lda VGI_CR
sta YY
lda #3
sec
sbc VGI_CR
sbc VGI_CR
sta D
jmp do_filled_plots
filled_circle_loop:
; X=X+1
inc XX
; IF D>0 THEN Y=Y-1:D=D+4*(X-Y)+10
lda D
bmi filled_else
dec YY
lda XX
sec
sbc YY
asl
asl
clc
adc D
adc #10
jmp store_filled_D
filled_else:
; ELSE D=D+4*X+6
lda XX
asl
asl
clc
adc D
adc #6
store_filled_D:
sta D
do_filled_plots:
; setup constants
lda XX
eor #$FF
sta MINUSXX
inc MINUSXX
lda YY
eor #$FF
sta MINUSYY
inc MINUSYY
; HPLOT CX+X,CY+Y
; HPLOT CX-X,CY+Y
; HPLOT CX+X,CY-Y
; HPLOT CX-X,CY-Y
; HPLOT CX+Y,CY+X
; HPLOT CX-Y,CY+X
; HPLOT CX+Y,CY-X
; HPLOT CX-Y,CY-X
lda #3
sta COUNT
filled_pos_loop:
; calc left side
; calc X co-ord
lda COUNT
ora #$1
eor #$2
tay
lda VGI_CX
clc
adc XX,Y
tax
; calc y co-ord
ldy COUNT
lda VGI_CY
clc
adc XX,Y
ldy #0
; pha ; save Y value for later
jsr HPLOT0 ; plot at (Y,X), (A)
; calc right side
lda COUNT
and #$2
eor #$2
tay
lda XX,Y
asl
ldy #0
ldx #0
jsr HLINRL ; plot relative (X,A), (Y)
; so in our case (0,XX*2),0
dec COUNT
bpl filled_pos_loop
; IFY>=XTHEN4
lda YY
cmp XX
bcs filled_circle_loop
jmp vgi_loop

View File

@ -0,0 +1,7 @@
vgi_clearscreen:
; lda P0
; jsr BKGND0
; jmp vgi_loop ; return

View File

@ -0,0 +1,72 @@
; VGI library
VGI_MAXLEN = 7
;==================================
; play_vgi
;==================================
play_vgi:
vgi_loop:
ldy #0
data_smc:
lda (VGIL),Y
sta VGI_BUFFER,Y
iny
cpy #VGI_MAXLEN
bne data_smc
lda VGI_TYPE
and #$f
clc
adc VGIL
sta VGIL
bcc no_oflo
inc VGIH
no_oflo:
lda VGI_TYPE
lsr
lsr
lsr
lsr
; look up action in jump table
asl
tax
lda vgi_rts_table+1,X
pha
lda vgi_rts_table,X
pha
rts ; "jump" to subroutine
vgi_rts_table:
.word vgi_clearscreen-1 ; 0 = clearscreen
.word vgi_simple_rectangle-1 ; 1 = simple rectangle
.word vgi_circle-1 ; 2 = plain circle
.word vgi_filled_circle-1 ; 3 = filled circle
.word vgi_point-1 ; 4 = dot
.word vgi_lineto-1 ; 5 = line to
.word vgi_dithered_rectangle-1 ; 6 = dithered rectangle
.word vgi_vertical_triangle-1 ; 7 = vertical triangle
.word vgi_horizontal_triangle-1 ; 8 = horizontal triangle
.word vgi_vstripe_rectangle-1 ; 9 = vstripe rectangle
.word vgi_line-1 ;10 = line
.word vgi_line_far-1 ;11 = line far
.word all_done-1
.word all_done-1
.word all_done-1
.word all_done-1 ; 15 = done
all_done:
rts
.include "vgi_clearscreen.s"
.include "vgi_circles.s"
.include "vgi_rectangle.s"
.include "vgi_lines.s"
.include "vgi_triangles.s"

View File

@ -0,0 +1,95 @@
; VGI Lines
;========================
; VGI point
;========================
vgi_point:
jsr vgi_point_common
jmp vgi_loop
;========================
; VGI point common
;========================
VGI_PCOLOR = P0 ; if high bit set, then PX=PX+256
VGI_PX = P1
VGI_PY = P2
vgi_point_common:
ldy #0
lda VGI_PCOLOR
bpl vgi_point_color
iny
vgi_point_color:
and #$7f
tax
lda COLORTBL,X
sta HGR_COLOR
ldx VGI_PX
lda VGI_PY
jsr HPLOT0 ; plot at (Y,X), (A)
rts
;========================
; VGI line to
;========================
VGI_LX = P0
VGI_LY = P1
vgi_lineto:
ldx #0
ldy VGI_LY
lda VGI_LX
jsr HGLIN ; line to (X,A),(Y)
jmp vgi_loop
;========================
; VGI LINE
;========================
; VGI_LX = P0
; VGI_LY = P1
VGI_LX2 = P3
VGI_LY2 = P4
vgi_line:
jsr vgi_point_common
ldx #0
ldy VGI_LY2
lda VGI_LX2
jsr HGLIN ; line to (X,A),(Y)
jmp vgi_loop
;========================
; VGI LINE FAR
;========================
; assume second x-coord is > 256
; VGI_LX = P0
; VGI_LY = P1
; VGI_LX2 = P3
; VGI_LY2 = P4
vgi_line_far:
jsr vgi_point_common
ldx #1
ldy VGI_LY2
lda VGI_LX2
jsr HGLIN ; line to (X,A),(Y)
jmp vgi_loop

View File

@ -0,0 +1,462 @@
; VGI Rectangle
; VGI Rectangle test
COLOR_MODE = TEMP0
OTHER_MASK = TEMP1
XRUN = TEMP2
div7_table = $800
mod7_table = $900
USE_FAST = 1
.if (USE_FAST=0)
; slow
;=================================
; Simple Rectangle
;=================================
VGI_RCOLOR = P0
VGI_RX1 = P1
VGI_RY1 = P2
VGI_RXRUN = P3
VGI_RYRUN = P4
vgi_simple_rectangle:
simple_rectangle_loop:
lda VGI_RCOLOR
asl ; nibble swap by david galloway
adc #$80
rol
asl
adc #$80
rol
sta VGI_RCOLOR
and #$f
tax
lda COLORTBL,X
sta HGR_COLOR
ldx VGI_RX1 ; X1 into X
lda VGI_RY1 ; Y1 into A
ldy #0 ; always 0
jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y)
lda VGI_RXRUN ; XRUN into A
ldx #0 ; always 0
ldy #0 ; relative Y is 0
jsr HLINRL ; (X,A),(Y)
inc VGI_RY1
dec VGI_RYRUN
bne simple_rectangle_loop
jmp vgi_loop
;=================================
; Dithered Rectangle
;=================================
; VGI_RCOLOR = P0
; VGI_RX1 = P1
; VGI_RY1 = P2
; VGI_RXRUN = P3
; VGI_RYRUN = P4
VGI_RCOLOR2 = P5
vgi_dithered_rectangle:
dithered_rectangle_loop:
lda COUNT
and #$1
beq even_color
odd_color:
lda VGI_RCOLOR
jmp save_color
even_color:
lda VGI_RCOLOR2
save_color:
sta HGR_COLOR
inc COUNT
ldx VGI_RX1 ; X1 into X
lda VGI_RY1 ; Y1 into A
ldy #0 ; always 0
jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y)
lda VGI_RXRUN ; XRUN into A
ldx #0 ; always 0
ldy #0 ; relative Y is 0
jsr HLINRL ; (X,A),(Y)
inc VGI_RY1
dec VGI_RYRUN
bne dithered_rectangle_loop
jmp vgi_loop
.else
; FAST
;=================================
; Simple Rectangle
;=================================
VGI_RCOLOR = P0
VGI_RX1 = P1
VGI_RY1 = P2
VGI_RXRUN = P3
VGI_RYRUN = P4
VGI_RCOLOR2 = P5 ; only for dither
;==================================
; VGI Simple Rectangle
;==================================
vgi_simple_rectangle:
lda #0
sta COLOR_MODE
simple_rectangle_loop:
lda COLOR_MODE
beq simple_colors
bmi striped_colors
bpl handle_dither
simple_colors:
lda VGI_RCOLOR
asl ; nibble swap by david galloway
adc #$80
rol
asl
adc #$80
rol
sta VGI_RCOLOR
and #$f
tax
lda COLORTBL,X
sta HGR_COLOR
jmp done_colors
handle_dither:
lda COUNT
and #$1
beq deven_color
dodd_color:
lda VGI_RCOLOR
jmp dsave_color
deven_color:
lda VGI_RCOLOR2
dsave_color:
sta HGR_COLOR
inc COUNT
jmp done_colors
striped_colors:
; don't need to do anything here?
done_colors:
; get ROW into (GBASL)
ldx VGI_RX1 ; X1 into X
lda VGI_RY1 ; Y1 into A
ldy #0 ; always 0
jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y)
; Y is already the RX1/7
; adjust color if in striped mode
lda COLOR_MODE
bpl not_striped
jsr swap_colors
not_striped:
; copy the XRUN
lda VGI_RXRUN
sta XRUN
inc XRUN ; needed because we compare with beq/bne
; check if narrow corner case where begin and end same block
; if RX%7 + XRUN < 8
ldx VGI_RX1
lda mod7_table,X
clc
adc XRUN
cmp #8
bcs not_corner
corner:
; want to use MASK of left_mask, MOD7 and 7-XRUN
lda mod7_table,X
tax
lda (GBASL),Y
eor HGR_BITS
and left_masks,X
ldx XRUN
and right_masks,X
eor (GBASL),Y
sta (GBASL),Y
jmp done_row ; that's all
not_corner:
; see if not starting on boundary
ldx VGI_RX1
lda mod7_table,X
beq draw_run
; handle not full left border
tax
lda (GBASL),Y
eor HGR_BITS
and left_masks,X
eor (GBASL),Y
sta (GBASL),Y
iny ; move to next
; adjust RUN length by 7- mod7
txa ; load mod7
eor #$ff
sec
adc #7
eor #$ff
sec
adc XRUN
sta XRUN
; lda HGR_BITS ; cycle colors for next
; jsr COLOR_SHIFT
jsr swap_colors
;no_shift:
; draw common
draw_run:
lda XRUN
cmp #7
bcc draw_right ; blt
lda HGR_BITS ; get color
sta (GBASL),Y ; store out
; jsr COLOR_SHIFT ; shift colors
iny ; move to next block
jsr swap_colors
lda XRUN ; take 7 off the run
sec
sbc #7
sta XRUN
jmp draw_run
; draw rightmost
draw_right:
beq done_row
; lda HGR_BITS
; jsr COLOR_SHIFT
; see if not starting on boundary
ldx XRUN
tax
lda (GBASL),Y
eor HGR_BITS
and right_masks,X
eor (GBASL),Y
sta (GBASL),Y
done_row:
inc VGI_RY1
dec VGI_RYRUN
;bne simple_rectangle_loop
beq done_done
jmp simple_rectangle_loop
done_done:
jmp vgi_loop
;==========================
; swap colors
;==========================
swap_colors:
lda COLOR_MODE
bmi swap_colors_striped
lda HGR_BITS ; get color
jsr COLOR_SHIFT ; shift colors
rts
swap_colors_striped:
tya
and #1
bne swap_odd
lda VGI_RCOLOR
jmp swap_done
swap_odd:
lda VGI_RCOLOR2
swap_done:
sta HGR_BITS
rts
;=================================
; Dithered Rectangle
;=================================
; VGI_RCOLOR = P0
; VGI_RX1 = P1
; VGI_RY1 = P2
; VGI_RXRUN = P3
; VGI_RYRUN = P4
; VGI_RCOLOR2 = P5
vgi_dithered_rectangle:
lda #1
sta COLOR_MODE
lda #0
sta COUNT
jmp simple_rectangle_loop
;=================================
; Vertical Striped Rectangle
;=================================
; VGI_RCOLOR = P0
; VGI_RX1 = P1
; VGI_RY1 = P2
; VGI_RXRUN = P3
; VGI_RYRUN = P4
; VGI_RCOLOR2 = P5
vgi_vstripe_rectangle:
lda #128
sta COLOR_MODE
lda #0
sta COUNT
jmp simple_rectangle_loop
.endif
;=====================
; make /7 %7 tables
;=====================
vgi_init:
vgi_make_tables:
ldy #0
lda #0
ldx #0
div7_loop:
sta div7_table,Y
inx
cpx #7
bne div7_not7
clc
adc #1
ldx #0
div7_not7:
iny
bne div7_loop
ldy #0
lda #0
mod7_loop:
sta mod7_table,Y
clc
adc #1
cmp #7
bne mod7_not7
lda #0
mod7_not7:
iny
bne mod7_loop
rts
left_masks:
.byte $FF,$FE,$FC,$F8, $F0,$E0,$C0
right_masks:
.byte $81,$83,$87, $8F,$9F,$BF,$FF

View File

@ -0,0 +1,96 @@
; VGI Triangles
SKIP = TEMP0
;========================
; VGI vertical triangle
;========================
VGI_TCOLOR = P0
VGI_VX = P1
VGI_VY = P2
VGI_TXL = P3
VGI_TXR = P4
VGI_TYB = P5
vgi_vertical_triangle:
lda VGI_TCOLOR
lsr
lsr
lsr
lsr
sta SKIP
lda VGI_TCOLOR
and #$f
tax
lda COLORTBL,X
sta HGR_COLOR
vtri_loop:
ldy #0
ldx VGI_VX
lda VGI_VY
jsr HPLOT0 ; plot at (Y,X), (A)
ldx #0
ldy VGI_TYB
lda VGI_TXL
jsr HGLIN ; line to (X,A),(Y)
lda VGI_TXL
clc
adc SKIP
sta VGI_TXL
; inc VGI_TXL
; lda VGI_TXL
cmp VGI_TXR
bcc vtri_loop
done_vtri:
jmp vgi_loop ; bra
;========================
; VGI horizontal triangle
;========================
; VGI_TCOLOR = P0
; VGI_VX = P1
; VGI_VY = P2
VGI_THYT = P3
VGI_THYB = P4
VGI_THXR = P5
vgi_horizontal_triangle:
ldx VGI_TCOLOR
lda COLORTBL,X
sta HGR_COLOR
htri_loop:
ldy #0
ldx VGI_VX
lda VGI_VY
jsr HPLOT0 ; plot at (Y,X), (A)
ldx #0
ldy VGI_THYT
lda VGI_THXR
jsr HGLIN ; line to (X,A),(Y)
inc VGI_THYT
lda VGI_THYT
cmp VGI_THYB
bcc htri_loop
done_htri:
jmp vgi_loop

View File

@ -12,8 +12,8 @@ MB_ADDR_H = $0D
; only used for title screen...
TEMP = $FA
TEMPY = $FB
;TEMP = $FA
;TEMPY = $FB
;INL = $FC
;INH = $FD
;OUTL = $FE
@ -27,3 +27,35 @@ GBASL = $26
GBASH = $27
BASL = $28
BASH = $29
HGR_COLOR = $E4
.if 0
VGI_BUFFER = $F0
VGI_TYPE = $F0
P0 = $F1
P1 = $F2
P2 = $F3
P3 = $F4
P4 = $F5
P5 = $F6
P6 = $F7
VGIL = $F8
VGIH = $F9
OUTL = $FC
OUTH = $FD
COLOR1 = $FE
COLOR2 = $FF
TEMP0 = $10
TEMP1 = $11
TEMP2 = $12
TEMP3 = $13
TEMP4 = $14
TEMP5 = $15
.endif
HGR_BITS = $1C