diff --git a/asm_routines/gr_scroll.s b/asm_routines/gr_scroll.s new file mode 100644 index 00000000..5b77bd1f --- /dev/null +++ b/asm_routines/gr_scroll.s @@ -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 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 + diff --git a/mode7/scroller.c b/mode7/scroller.c index 5a4be403..26225b44 100644 --- a/mode7/scroller.c +++ b/mode7/scroller.c @@ -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;iscroll_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" diff --git a/mode7_demo/scrolltext.inc b/mode7_demo/scrolltext.inc new file mode 100644 index 00000000..f235d5fb --- /dev/null +++ b/mode7_demo/scrolltext.inc @@ -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