hgr: vgi: working on fast boxes

also fix some other bugs, need to check in more
This commit is contained in:
Vince Weaver 2021-06-19 08:35:20 -04:00
parent 6fc2ea40b3
commit fb63c0742c
8 changed files with 664 additions and 5 deletions

View File

@ -7,7 +7,8 @@ EMPTYDISK = ../../../empty_disk/empty.dsk
all: boxes.dsk make_boxes_asm
boxes.dsk: HELLO MYST.BAS MYST_TINY.BAS MYST_TINY COOL_PATTERN COOL_BOT
boxes.dsk: HELLO MYST.BAS MYST_TINY.BAS MYST_TINY COOL_PATTERN COOL_BOT \
SLOW_TEST FAST_TEST
cp $(EMPTYDISK) boxes.dsk
$(DOS33) -y boxes.dsk SAVE A HELLO
$(DOS33) -y boxes.dsk SAVE A MYST.BAS
@ -15,6 +16,8 @@ boxes.dsk: HELLO MYST.BAS MYST_TINY.BAS MYST_TINY COOL_PATTERN COOL_BOT
$(DOS33) -y boxes.dsk BSAVE -a 0xC00 MYST_TINY
$(DOS33) -y boxes.dsk BSAVE -a 0xC00 COOL_PATTERN
$(DOS33) -y boxes.dsk BSAVE -a 0x370 COOL_BOT
$(DOS33) -y boxes.dsk BSAVE -a 0xC00 SLOW_TEST
$(DOS33) -y boxes.dsk BSAVE -a 0xC00 FAST_TEST
###
@ -38,6 +41,24 @@ COOL_PATTERN: cool_pattern.o
cool_pattern.o: cool_pattern.s
ca65 -o cool_pattern.o cool_pattern.s -l cool_pattern.lst
###
SLOW_TEST: slow_test.o
ld65 -o SLOW_TEST slow_test.o -C $(LINKERSCRIPTS)/apple2_c00.inc
slow_test.o: slow_test.s
ca65 -o slow_test.o slow_test.s -l slow_test.lst
###
FAST_TEST: fast_test.o
ld65 -o FAST_TEST fast_test.o -C $(LINKERSCRIPTS)/apple2_c00.inc
fast_test.o: fast_test.s
ca65 -o fast_test.o fast_test.s -l fast_test.lst
###
COOL_BOT: cool_bot.o
@ -79,4 +100,4 @@ make_boxes_asm.o: make_boxes_asm.c
###
clean:
rm -f *~ *.o *.lst MYST.BAS MYST_TINY.BAS MYST_TINY make_boxes make_boxes_asm COOL_PATTERN
rm -f *~ *.o *.lst MYST.BAS MYST_TINY.BAS MYST_TINY make_boxes make_boxes_asm COOL_PATTERN SLOW_TEST

View File

@ -0,0 +1,306 @@
; VGI Rectangle test
HGR_BITS = $1C
GBASL = $26
GBASH = $27
XRUN = $74
COUNT = $75
HGR_COLOR = $E4
P0 = $F0
P1 = $F1
P2 = $F2
P3 = $F3
P4 = $F4
P5 = $F5
HGR2 = $F3D8 ; clear PAGE2 to 0
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 (A,X),(Y)
COLORTBL = $F6F6
div7_table = $9000
mod7_table = $9100
;=================================
; Simple Rectangle
;=================================
VGI_RCOLOR = P0
VGI_RX1 = P1
VGI_RY1 = P2
VGI_RXRUN = P3
VGI_RYRUN = P4
test:
jsr make_tables
; clear to white
jsr HGR2
lda #$ff
jsr BKGND0
; draw first
lda #$23
sta VGI_RCOLOR
lda #15
sta VGI_RX1
lda #230
sta VGI_RXRUN
lda #0
sta VGI_RY1
lda #191
sta VGI_RYRUN
jsr vgi_simple_rectangle
; draw second
lda #$00
sta VGI_RCOLOR
lda #100
sta VGI_RX1
lda #1
sta VGI_RXRUN
lda #0
sta VGI_RY1
lda #191
sta VGI_RYRUN
jsr vgi_simple_rectangle
end:
jmp end
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
; get ROW into (GBASL)
ldx #0 ; X1 into X
lda VGI_RY1 ; Y1 into A
ldy #0 ; always 0
jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y)
; copy the XRUN
lda VGI_RXRUN
sta XRUN
inc XRUN ; needed because we compare with beq/bne
; get position of first block (x/7) and put into Y
; draw leftmost
ldy VGI_RX1
lda div7_table,Y
tay
; set up the color
and #$1
beq no_shift
lda HGR_BITS
jsr COLOR_SHIFT
; check if narrow case where in same
; see if not starting on boundary
ldx VGI_RX1
lda mod7_table,X
beq draw_run
tax
lda (GBASL),Y
eor HGR_BITS
and left_masks,X
eor (GBASL),Y
sta (GBASL),Y
iny ; move to next
txa ; adjust RUN length
eor #$ff
clc
adc #1
adc XRUN
sta XRUN
no_shift:
; draw common
draw_run:
lda XRUN
cmp #7
bcc draw_right ; blt
lda HGR_BITS
sta (GBASL),Y
iny
lda XRUN
sec
sbc #7
sta XRUN
lda HGR_BITS
jsr COLOR_SHIFT
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:
rts
;=================================
; 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
rts
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,164 @@
; VGI Rectangle test
COUNT = $75
HGR_COLOR = $E4
P0 = $F0
P1 = $F1
P2 = $F2
P3 = $F3
P4 = $F4
P5 = $F5
HGR2 = $F3D8 ; clear PAGE2 to 0
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)
HLINRL = $F530 ; (X,A),(Y)
HGLIN = $F53A ; line to (A,X),(Y)
COLORTBL = $F6F6
;=================================
; Simple Rectangle
;=================================
VGI_RCOLOR = P0
VGI_RX1 = P1
VGI_RY1 = P2
VGI_RXRUN = P3
VGI_RYRUN = P4
test:
; clear screen to white
jsr HGR2
lda #$ff
jsr BKGND0
; first test
lda #$23
sta VGI_RCOLOR
lda #15
sta VGI_RX1
lda #230
sta VGI_RXRUN
lda #0
sta VGI_RY1
lda #191
sta VGI_RYRUN
jsr vgi_simple_rectangle
; second test
lda #$00
sta VGI_RCOLOR
lda #100
sta VGI_RX1
lda #1
sta VGI_RXRUN
lda #0
sta VGI_RY1
lda #191
sta VGI_RYRUN
jsr vgi_simple_rectangle
end:
jmp end
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
rts
;=================================
; 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
rts

View File

@ -34,7 +34,11 @@ circles:
jsr HGR2
lda #0
sta R
draw_next:
.if 0
inc FRAME
ldy FRAME
@ -64,9 +68,17 @@ draw_next:
lda $F300,Y
and #$3f
sta R
.endif
; A=40+RND(1)*200:B=40+RND(1)*100:Y=RND(1)*40
lda #128
sta CX
lda #96
sta CY
; XX=0 YY=R
; D=3-2*R
; GOTO6
@ -233,5 +245,13 @@ do_plots:
jmp circle_loop
done:
lda R
clc
adc #3
sta R
stop:
cmp #90
beq stop
; GOTO1
jmp draw_next

View File

@ -32,6 +32,7 @@ PTRIG = $C070
NORMAL = $F273
HGR2 = $F3D8 ; clear PAGE2 to 0
HGR = $F3E2 ; set hires page1 and clear $2000-$3fff
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)
@ -49,6 +50,7 @@ CLRTOP = $F836 ; clear only top of low-res screen
SETCOL = $F864 ; COLOR=A
ROM_TEXT2COPY = $F962 ; iigs
TEXT = $FB36
SETGR = $FB40 ; init lores and clear screen
TABV = $FB5B ; VTAB to A
ROM_MACHINEID = $FBB3 ; iigs
BELL = $FBDD ; ring the bell
@ -56,6 +58,8 @@ BASCALC = $FBC1 ;
VTAB = $FC22 ; VTAB to CV
HOME = $FC58 ; Clear the text screen
WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us
GETLN = $FD6A
GETLN1 = $FD6F
CROUT1 = $FD8B
SETINV = $FE80 ; INVERSE
SETNORM = $FE84 ; NORMAL

View File

@ -6,7 +6,9 @@
VGI_MAXLEN = 7
vgi_test:
jsr HGR2
jsr SETGR
jsr HGR
bit FULLGR
; get pointer to image data
@ -15,6 +17,38 @@ vgi_test:
lda #>clock_data
sta VGIH
jsr play_vgi
jsr wait_until_keypress
bit TEXTGR
jsr CROUT1 ; print linefeed/cr
loopy:
lda #<string1
sta OUTL
lda #>string1
sta OUTH
jsr fake_input
jsr fake_input
jsr fake_input
bit FULLGR
jmp loopy
done:
jmp done
;==================================
; play_vgi
;==================================
play_vgi:
vgi_loop:
ldy #0
@ -69,7 +103,7 @@ vgi_rts_table:
.word all_done-1 ; 15 = done
all_done:
jmp all_done
rts
.include "vgi_clearscreen.s"
@ -78,3 +112,110 @@ all_done:
.include "vgi_lines.s"
.include "clock.data"
; string data
;
string1:
.byte "YOU SEE A CLOCK TOWER READING 12:00",13
.byte " LEFT/RIGHT/FORWARD",13,0
; SWIM TO TOWER
string2:
.byte "YOU DON'T KNOW HOW TO ",34,"SWIM",34,13,0
; WADE TO TOWER
string3:
.byte "THE KRAKEN WILL EAT YOU",13,0
; I AM WILLING TO TAKE THAT RISK
string4:
.byte "YOU SEE A MYSTERIOUS SPACESHIP",13
.byte " LEFT/RIGHT/FORWARD",13,0
string5:
.byte "THERE IS A METTALIC DOOR BLOCKING YOU",0
; OPEN DOOR
string6:
.byte "THE DOOR IS LOCKED. ATRUS HATES YOU",0
string7:
.byte "SORRY, I DON'T UNDERSTAND THAT",0
; PICK UP PAGE
; WHICH PAGE?
; THE RED ONE
; I'D SAY IT'S MORE OF A PURPLE COLOR
; JUST PICK IT UP!
; THIS WEIRD FIREPLACE HAS MANY BUTTONS
; PRESS BUTTON
; WHICH ONE?
; REALLY?
;=========================
; print_string
;=========================
print_string:
ldy #0
print_string_loop:
lda (OUTL),Y
beq done_print_string
ora #$80
jsr COUT
iny
jmp print_string_loop
done_print_string:
tya ; point to next string
sec
adc OUTL
sta OUTL
lda OUTH
adc #0
sta OUTH
rts
;============================
; WAIT UNTIL KEYPRESS
;============================
wait_until_keypress:
lda KEYPRESS
bpl wait_until_keypress
bit KEYRESET
rts
;=============================
; fake input
;=============================
fake_input:
jsr print_string
jsr CROUT1 ; print linefeed/cr
lda #'>'+$80
jsr COUT
lda #' '+$80
jsr COUT
jsr GETLN1
rts

View File

@ -270,7 +270,7 @@ filled_pos_loop:
ldy #0
pha ; save Y value for later
; pha ; save Y value for later
jsr HPLOT0 ; plot at (Y,X), (A)

View File

@ -17,6 +17,9 @@ P6 = $F7
VGIL = $F8
VGIH = $F9
OUTL = $FC
OUTH = $FD
COLOR1 = $FE
COLOR2 = $FF