mode7_demo: split off scroller code

This commit is contained in:
Vince Weaver 2017-12-18 00:40:13 -05:00
parent a3c4beea48
commit 3281551767
6 changed files with 352 additions and 238 deletions

193
asm_routines/gr_scroll.s Normal file
View File

@ -0,0 +1,193 @@
scroll_row1 EQU $8A00
scroll_row2 EQU $8B00
scroll_row3 EQU $8C00
scroll_row4 EQU $8D00
SCROLL_LENGTH EQU $61
OFFSET EQU $62
;========================
; scroll some text
;========================
; RLE compressed data in INL/INH
; CV is Y position to display at
gr_scroll:
lda #0
sta OFFSET
;=======================
; decompress scroll text
;=======================
jsr decompress_scroll
scroll_loop:
ldx #0
ldy CV
lsr
lda gr_offsets,Y ; get position
sta sm1+1
lda gr_offsets+2,Y ; get position
sta sm2+1
lda gr_offsets+4,Y ; get position
sta sm3+1
lda gr_offsets+6,Y ; get position
sta sm4+1
iny
clc
lda gr_offsets,Y ; get position
adc DRAW_PAGE
sta sm1+2
lda gr_offsets+2,Y ; get position
adc DRAW_PAGE
sta sm2+2
lda gr_offsets+4,Y ; get position
adc DRAW_PAGE
sta sm3+2
lda gr_offsets+6,Y ; get position
adc DRAW_PAGE
sta sm4+2
ldy OFFSET
draw_loop:
lda scroll_row1,Y
sm1:
sta $400,X
lda scroll_row2,Y
sm2:
sta $480,X
lda scroll_row3,Y
sm3:
sta $500,X
lda scroll_row4,Y
sm4:
sta $580,X
iny
inx
cpx #40
bne draw_loop
;==================
; flip pages
;==================
jsr page_flip ; 6
;==================
; delay
;==================
lda #125
jsr WAIT
;==================
; loop forever
;==================
clc
lda OFFSET
adc #40
cmp SCROLL_LENGTH
beq done_scrolling
inc OFFSET
jmp scroll_loop ; 3
done_scrolling:
rts
;=======================
; decompress scroll
;=======================
decompress_scroll:
ldy #0
jsr scroll_load_and_increment
sta SCROLL_LENGTH
lda #<scroll_row1
sta OUTL
lda #>scroll_row1
sta OUTH
decompress_scroll_loop:
jsr scroll_load_and_increment ; load compressed value
cmp #$A1 ; EOF marker
beq done_decompress_scroll ; if EOF, exit
pha ; save
and #$f0 ; mask
cmp #$a0 ; see if special AX
beq decompress_scroll_special
pla ; note, PLA sets flags!
ldx #$1 ; only want to print 1
bne decompress_scroll_run
decompress_scroll_special:
pla
and #$0f ; check if was A0
bne decompress_scroll_color ; if A0 need to read run, color
decompress_scroll_large:
jsr scroll_load_and_increment ; get run length
decompress_scroll_color:
tax ; put runlen into X
jsr scroll_load_and_increment ; get color
decompress_scroll_run:
sta (OUTL),Y
pha
clc ; increment 16-bit pointer
lda OUTL
adc #$1
sta OUTL
lda OUTH
adc #$0
sta OUTH
pla
dex ; repeat for X times
bne decompress_scroll_run
beq decompress_scroll_loop ; get next run
done_decompress_scroll:
rts
scroll_load_and_increment:
lda (INL),Y ; load and increment 16-bit pointer
pha
clc
lda INL
adc #$1
sta INL
lda INH
adc #$0
sta INH
pla
rts

View File

@ -58,7 +58,18 @@ static unsigned char font[256][9]={
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{2,
0x00,
0x00, //
0x00, //
0x00, //
0x00, //
0x00, //
0x80, // **
0x80, // **
},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0}, // 48
/*
@ -166,24 +177,83 @@ static unsigned char font[256][9]={
0x90, // ** **
},
{4,
0x00,
0xe0, // ******
0x40, // **
0x40, // **
0x40, // **
0x40, // **
0x40, // **
0xe0, // ******
},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
/*
****** **** ** ** ** ** ** ** ** **** ******
** ** ** ** ** **** **** **** ** ** ** ** **
** ** ** ** ** ** ** ** **** ** ** ** ** **
** ** **** ** ** ** ** **** ** ** ******
** ** ** ** ** ** ** ** **** ** ** **
** ** ** ** ** ** ** ** ** ** ** ** **
****** **** ** ** ******** ** ** ** ** **** **
**** ** **
** ** **
** ** **
** ****
** ** **
** ** ** **
**** ** **
*/
{5,
0x00,
0x80, // **
0x80, // **
0x80, // **
0x80, // **
0x80, // **
0x80, // **
0xf0, // ********
},
{6,
0x00,
0x88, // ** **
0xd8, // **** ****
0xa8, // ** ** **
0x88, // ** **
0x88, // ** **
0x88, // ** **
0x88, // ** **
},
{5,
0x00,
0x90, // ** **
0xd0, // **** **
0xd0, // **** **
0xb0, // ** ****
0xb0, // ** ****
0x90, // ** **
0x90, // ** **
},
{5,
0x00,
0x60, // ****
0x90, // ** **
0x90, // ** **
0x90, // ** **
0x90, // ** **
0x90, // ** **
0x60, // ****
},
{5,
0x00,
0xe0, // ******
0x90, // ** **
0x90, // ** **
0xe0, // ******
0x80, // **
0x80, // **
0x80, // **
},
{0,0,0,0,0,0,0,0,0},
/*
@ -236,10 +306,11 @@ static unsigned char font[256][9]={
0x90, // ** **
0x90, // ** **
0x90, // ** **
0x90, // ****
0x60, // ****
},
{5,
0x00,
0x90, // ** **
0x90, // ** **
0x90, // ** **
@ -259,19 +330,35 @@ static unsigned char font[256][9]={
0xd8, // **** ****
0x88, // ** **
},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{4,
0x00,
0xa0, // ** **
0xa0, // ** **
0xa0, // ** **
0x40, // **
0xa0, // ** **
0xa0, // ** **
0xa0, // ** **
},
{4,
0x00,
0xa0, // ** **
0xa0, // ** **
0xa0, // ** **
0x40, // **
0x40, // **
0x40, // **
0x40, // **
},
{0,0,0,0,0,0,0,0,0},
/*
** ** ** ** **********
** ** ** ** **
** ** ** ** **
** ** **
** ** ** **
** ** ** **
** ** ** **********
**********
**
**
**
**
**
**********
*/
};
@ -333,10 +420,20 @@ static int rle_compress(int color, int j) {
return need_comma;
}
static int vmw_logo[4][18]={
{0x10,0x10,0x10,0x10,0x10,0x40, 0x20,0x20,0x20,0x20,0x20,0x40, 0x20,0x20,0x20,0x20,0x20,0x00},
{0x11,0x11,0x11,0x11,0x11,0x44, 0x22,0x22,0x22,0x22,0x22,0x44, 0x22,0x22,0x22,0x22,0x22,0x00},
{0x00,0x11,0x11,0x11,0x44,0x44, 0x44,0x22,0x22,0x22,0x44,0x44, 0x44,0x22,0x22,0x22,0x00,0x00},
{0x00,0x00,0x11,0x44,0x44,0x44, 0x44,0x44,0x22,0x44,0x44,0x44, 0x44,0x44,0x22,0x00,0x00,0x00},
};
int main(int argc, char **argv) {
//char string[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char string[]=" \001DEATER \002WAS \003HERE!!! ";
// char string[]=" \001DEATER \002WAS \003HERE!!! ";
char string[]=" \001BY DEATER... \002A \010 PRODUCTION ";
// char string[]="\003* APPLE ][ FOREVER * ";
int length=0,width=0,x,y,i,j;
int color,color1,color2;
int which_color=0;
@ -345,6 +442,26 @@ int main(int argc, char **argv) {
for(i=0;i<strlen(string);i++) {
if (string[i]<5) { which_color=string[i]-1; continue;}
/* VMW logo */
if (string[i]==8) {
width=18;
// ********** ********** **********
// ********** ********** **********
// ********** ********** **********
// ****** ****** ******
// ****** ****** ******
// ** ** **
// ** ** **
for(x=0;x<width;x++) {
for(j=0;j<4;j++) {
row[j][length]=vmw_logo[j][x];
}
length++;
}
continue;
}
width=font[(int)string[i]][0];
for(x=0;x<width;x++) {
for(j=0;j<4;j++) {

View File

@ -19,12 +19,13 @@ mode7_demo.dsk: $(DOS33) MODE7_DEMO
MODE7_DEMO: mode7_demo.o
ld65 -o MODE7_DEMO mode7_demo.o -C ./apple2_1000.inc
mode7_demo.o: mode7_demo.s mode7_demo_backgrounds.inc \
mode7_demo.o: mode7_demo.s mode7_demo_backgrounds.inc scrolltext.inc \
../asm_routines/gr_unrle.s \
../asm_routines/hlin_clearscreen.s \
../asm_routines/gr_setpage.s \
../asm_routines/gr_fade.s \
../asm_routines/gr_copy.s
../asm_routines/gr_copy.s \
../asm_routines/gr_scroll.s
ca65 -o mode7_demo.o mode7_demo.s -l mode7_demo.lst

View File

@ -1,10 +0,0 @@
; Original size = 668 bytes
deater_scroll:
; scroll_length:
.byte 167
.byte $A0,$28,$00,$20,$20,$A3,$00,$A4,$20,$00,$00,$20,$20,$00,$00,$A3,$20,$00,$A4,$20,$00,$A3,$20,$A7,$00,$40,$A3,$00,$40,$00,$00,$40,$40,$A3,$00,$A3,$40,$A6,$00,$10,$00,$00,$10,$00,$A4,$10,$00,$A3,$10,$00,$00,$A4,$10,$00,$A3,$10,$00,$A3,$10,$00,$A3,$10,$A0,$82,$00
.byte $A0,$28,$00,$E6,$00,$06,$E0,$00,$E6,$A4,$00,$E6,$00,$00,$E6,$00,$00,$E6,$00,$00,$E6,$A4,$00,$E6,$00,$00,$E6,$A6,$00,$DC,$A3,$00,$DC,$00,$DC,$00,$00,$DC,$00,$DC,$A9,$00,$B3,$00,$00,$B3,$00,$B3,$A4,$00,$B3,$00,$00,$B3,$00,$B3,$A4,$00,$03,$B3,$03,$00,$03,$B3,$03,$00,$03,$B3,$03,$A0,$82,$00
.byte $A0,$28,$00,$EF,$00,$00,$EF,$00,$EF,$0F,$0F,$00,$00,$EF,$0F,$0F,$EF,$00,$00,$EF,$00,$00,$EF,$0F,$0F,$00,$00,$EF,$0F,$0F,$E0,$A6,$00,$DF,$00,$D0,$00,$DF,$00,$DF,$0F,$0F,$DF,$00,$00,$0F,$0F,$D0,$A6,$00,$BF,$0F,$0F,$BF,$00,$BF,$0F,$0F,$00,$00,$BF,$0F,$0F,$B0,$00,$BF,$0F,$0F,$A3,$00,$0F,$A3,$00,$0F,$A3,$00,$0F,$A0,$83,$00
.byte $A0,$28,$00,$26,$20,$06,$00,$00,$26,$A3,$20,$00,$26,$00,$00,$26,$00,$00,$26,$00,$00,$26,$A3,$20,$00,$26,$00,$00,$26,$A6,$00,$4C,$0C,$00,$0C,$4C,$00,$4C,$00,$00,$4C,$00,$A3,$40,$0C,$A6,$00,$13,$00,$00,$13,$00,$13,$A3,$10,$00,$13,$00,$00,$13,$00,$13,$A3,$10,$00,$00,$13,$A3,$00,$13,$A3,$00,$13,$A0,$83,$00
.byte $A1
; Compressed size = 294 bytes

View File

@ -77,212 +77,15 @@ demo_loop:
.include "../asm_routines/pageflip.s"
.include "../asm_routines/gr_fade.s"
.include "../asm_routines/gr_copy.s"
.include "../asm_routines/gr_scroll.s"
.include "mode7_demo_backgrounds.inc"
scroll_row1 EQU $8A00
scroll_row2 EQU $8B00
scroll_row3 EQU $8C00
scroll_row4 EQU $8D00
SCROLL_LENGTH EQU $61
OFFSET EQU $62
;========================
; scroll some text
;========================
; RLE compressed data in INL/INH
; CV is Y position to display at
gr_scroll:
lda #0
sta OFFSET
;=======================
; decompress scroll text
;=======================
jsr decompress_scroll
scroll_loop:
ldx #0
ldy CV
lsr
lda gr_offsets,Y ; get position
sta sm1+1
lda gr_offsets+2,Y ; get position
sta sm2+1
lda gr_offsets+4,Y ; get position
sta sm3+1
lda gr_offsets+6,Y ; get position
sta sm4+1
iny
clc
lda gr_offsets,Y ; get position
adc DRAW_PAGE
sta sm1+2
lda gr_offsets+2,Y ; get position
adc DRAW_PAGE
sta sm2+2
lda gr_offsets+4,Y ; get position
adc DRAW_PAGE
sta sm3+2
lda gr_offsets+6,Y ; get position
adc DRAW_PAGE
sta sm4+2
ldy OFFSET
draw_loop:
lda scroll_row1,Y
sm1:
sta $400,X
lda scroll_row2,Y
sm2:
sta $480,X
lda scroll_row3,Y
sm3:
sta $500,X
lda scroll_row4,Y
sm4:
sta $580,X
iny
inx
cpx #40
bne draw_loop
;==================
; flip pages
;==================
jsr page_flip ; 6
;==================
; delay
;==================
lda #125
jsr WAIT
;==================
; loop forever
;==================
clc
lda OFFSET
adc #40
cmp SCROLL_LENGTH
bne blah
lda #0
sta OFFSET
jmp scroll_loop
blah:
inc OFFSET
jmp scroll_loop ; 3
;=======================
; decompress scroll
;=======================
decompress_scroll:
ldy #0
jsr scroll_load_and_increment
sta SCROLL_LENGTH
lda #<scroll_row1
sta OUTL
lda #>scroll_row1
sta OUTH
decompress_scroll_loop:
jsr scroll_load_and_increment ; load compressed value
cmp #$A1 ; EOF marker
beq done_decompress_scroll ; if EOF, exit
pha ; save
and #$f0 ; mask
cmp #$a0 ; see if special AX
beq decompress_scroll_special
pla ; note, PLA sets flags!
ldx #$1 ; only want to print 1
bne decompress_scroll_run
decompress_scroll_special:
pla
and #$0f ; check if was A0
bne decompress_scroll_color ; if A0 need to read run, color
decompress_scroll_large:
jsr scroll_load_and_increment ; get run length
decompress_scroll_color:
tax ; put runlen into X
jsr scroll_load_and_increment ; get color
decompress_scroll_run:
sta (OUTL),Y
pha
clc ; increment 16-bit pointer
lda OUTL
adc #$1
sta OUTL
lda OUTH
adc #$0
sta OUTH
pla
dex ; repeat for X times
bne decompress_scroll_run
beq decompress_scroll_loop ; get next run
done_decompress_scroll:
rts
scroll_load_and_increment:
lda (INL),Y ; load and increment 16-bit pointer
pha
clc
lda INL
adc #$1
sta INL
lda INH
adc #$0
sta INH
pla
rts
;===============================================
; Variables
;===============================================
.include "deater_scroll.inc"
.include "scrolltext.inc"

10
mode7_demo/scrolltext.inc Normal file
View File

@ -0,0 +1,10 @@
; Original size = 860 bytes
deater_scroll:
; scroll_length:
.byte 215
.byte $A0,$28,$00,$A3,$20,$00,$00,$20,$00,$20,$A6,$00,$20,$20,$A3,$00,$A4,$20,$00,$00,$20,$20,$00,$00,$A3,$20,$00,$A4,$20,$00,$A3,$20,$AE,$00,$40,$40,$A7,$00,$A5,$10,$40,$A5,$20,$40,$A5,$20,$A6,$00,$A3,$40,$00,$00,$A3,$40,$A3,$00,$40,$40,$00,$00,$40,$40,$A3,$00,$40,$00,$00,$40,$00,$00,$A3,$40,$00,$A3,$40,$00,$A3,$40,$00,$00,$40,$40,$00,$00,$40,$00,$00,$40,$A0,$52,$00
.byte $A0,$28,$00,$E6,$00,$00,$E6,$00,$E6,$00,$E6,$A6,$00,$E6,$00,$06,$E0,$00,$E6,$A4,$00,$E6,$00,$00,$E6,$00,$00,$E6,$00,$00,$E6,$A4,$00,$E6,$00,$00,$E6,$AC,$00,$DC,$00,$00,$DC,$A6,$00,$A5,$11,$44,$A5,$22,$44,$A5,$22,$A6,$00,$DC,$00,$00,$DC,$00,$DC,$00,$00,$DC,$00,$DC,$00,$00,$DC,$00,$DC,$00,$0C,$D0,$00,$DC,$00,$00,$DC,$00,$DC,$A5,$00,$DC,$A3,$00,$DC,$00,$00,$DC,$00,$00,$DC,$00,$DC,$DC,$00,$DC,$A0,$52,$00
.byte $A0,$28,$00,$EF,$0F,$0F,$E0,$00,$00,$EF,$A7,$00,$EF,$00,$00,$EF,$00,$EF,$0F,$0F,$00,$00,$EF,$0F,$0F,$EF,$00,$00,$EF,$00,$00,$EF,$0F,$0F,$00,$00,$EF,$0F,$0F,$E0,$AC,$00,$DF,$0F,$0F,$DF,$A7,$00,$A3,$11,$A3,$44,$A3,$22,$A3,$44,$A3,$22,$A7,$00,$DF,$0F,$0F,$00,$00,$DF,$0F,$0F,$D0,$00,$DF,$00,$00,$DF,$00,$DF,$00,$00,$DF,$00,$DF,$00,$00,$DF,$00,$DF,$A5,$00,$DF,$A3,$00,$DF,$00,$00,$DF,$00,$00,$DF,$00,$DF,$00,$DF,$DF,$A0,$52,$00
.byte $A0,$28,$00,$26,$20,$20,$06,$00,$00,$26,$A7,$00,$26,$20,$06,$00,$00,$26,$A3,$20,$00,$26,$00,$00,$26,$00,$00,$26,$00,$00,$26,$A3,$20,$00,$26,$00,$00,$26,$00,$26,$00,$26,$00,$26,$A6,$00,$4C,$00,$00,$4C,$A8,$00,$11,$A5,$44,$22,$A5,$44,$22,$A8,$00,$4C,$A4,$00,$4C,$00,$00,$4C,$00,$0C,$40,$40,$0C,$00,$4C,$40,$0C,$00,$00,$0C,$40,$40,$0C,$00,$0C,$A3,$40,$00,$00,$4C,$00,$00,$40,$4C,$40,$00,$0C,$40,$40,$0C,$00,$4C,$00,$00,$4C,$A0,$52,$00
.byte $A1
; Compressed size = 407 bytes