From f3bae510cf8566d2e6e65d655b2331dda554b64f Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 14 Dec 2017 00:59:34 -0500 Subject: [PATCH] mode7: add scroller work --- mode7/Makefile | 34 +++- mode7/deater_scroll.inc | 9 ++ mode7/demo_notes | 15 ++ mode7/mode7.dsk | Bin 143360 -> 143360 bytes mode7/mode7.s | 4 + mode7/rainbow_lookup.s | 24 +++ mode7/scroll_demo.s | 70 ++++++++ mode7/scroller.c | 346 ++++++++++++++++++++++++++++++++++++++++ tfv/sprites.png | Bin 1622 -> 1965 bytes 9 files changed, 498 insertions(+), 4 deletions(-) create mode 100644 mode7/deater_scroll.inc create mode 100644 mode7/demo_notes create mode 100644 mode7/rainbow_lookup.s create mode 100644 mode7/scroll_demo.s create mode 100644 mode7/scroller.c diff --git a/mode7/Makefile b/mode7/Makefile index 38f347ef..da456f5a 100644 --- a/mode7/Makefile +++ b/mode7/Makefile @@ -4,14 +4,18 @@ DOS33 = ../dos33fs-utils/dos33 PNG2GR = ../gr-utils/png2gr PNG2RLE = ../gr-utils/png2rle -all: mode7.dsk +all: mode7.dsk scroller $(DOS33): cd ../dos33fs-utils && make -mode7.dsk: $(DOS33) MODE7_ISLAND MODE7_CHECKERBOARD +mode7.dsk: $(DOS33) MODE7_ISLAND MODE7_CHECKERBOARD MODE7_RAINBOW \ + SCROLL_DEMO $(DOS33) -y mode7.dsk BSAVE -a 0x1000 MODE7_ISLAND $(DOS33) -y mode7.dsk BSAVE -a 0x1000 MODE7_CHECKERBOARD + $(DOS33) -y mode7.dsk BSAVE -a 0x1000 MODE7_RAINBOW + $(DOS33) -y mode7.dsk BSAVE -a 0x1000 SCROLL_DEMO + ### @@ -29,6 +33,28 @@ mode7_checkerboard.o: mode7.s checkerboard_lookup.s \ fast_multiply.s utils.s zp.inc sprites.inc ca65 -o mode7_checkerboard.o mode7.s -D CHECKERBOARD_MAP=1 -l mode7.lst -clean: - rm -f *~ *.o MODE7 MODE7_ISLAND MODE7_CHECKERBOARD *.lst +MODE7_RAINBOW: mode7_rainbow.o + ld65 -o MODE7_RAINBOW mode7_rainbow.o -C ./apple2_1000.inc + +mode7_rainbow.o: mode7.s rainbow_lookup.s \ + fast_multiply.s utils.s zp.inc sprites.inc + ca65 -o mode7_rainbow.o mode7.s -D RAINBOW_MAP=1 -l mode7.lst + +SCROLL_DEMO: scroll_demo.o + ld65 -o SCROLL_DEMO scroll_demo.o -C ./apple2_1000.inc + +scroll_demo.o: scroll_demo.s \ + deater_scroll.inc + ca65 -o scroll_demo.o scroll_demo.s -l scroll_demo.lst + +scroller: scroller.o + $(CC) $(LFLAGS) -o scroller scroller.o + +scroller.o: scroller.c + $(CC) $(CFLAGS) -c scroller.c + +clean: + rm -f *~ *.o scroller \ + MODE7 MODE7_ISLAND MODE7_CHECKERBOARD MODE7_RAINBOW \ + SCROLL_DEMO *.lst diff --git a/mode7/deater_scroll.inc b/mode7/deater_scroll.inc new file mode 100644 index 00000000..5cd8246c --- /dev/null +++ b/mode7/deater_scroll.inc @@ -0,0 +1,9 @@ +scroll_length: .byte 127 +scroll_row1: + .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$20,$20,$00,$00,$00,$20,$20,$20,$20,$00,$00,$20,$20,$00,$00,$20,$20,$20,$00,$20,$20,$20,$20,$00,$20,$20,$20,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$40,$00,$00,$40,$40,$00,$00,$00,$40,$40,$40,$00,$00,$00,$00,$00,$00,$10,$00,$00,$10,$00,$10,$10,$10,$10,$00,$10,$10,$10,$00,$00,$10,$10,$10,$10,$00,$10,$10,$10,$00,$10,$10,$10,$00,$10,$10,$10,$00 +scroll_row2: + .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$E6,$00,$06,$E0,$00,$E6,$00,$00,$00,$00,$E6,$00,$00,$E6,$00,$00,$E6,$00,$00,$E6,$00,$00,$00,$00,$E6,$00,$00,$E6,$00,$00,$00,$00,$00,$00,$DC,$00,$00,$00,$DC,$00,$DC,$00,$00,$DC,$00,$DC,$00,$00,$00,$00,$00,$00,$00,$00,$00,$B3,$00,$00,$B3,$00,$B3,$00,$00,$00,$00,$B3,$00,$00,$B3,$00,$B3,$00,$00,$00,$00,$03,$B3,$03,$00,$03,$B3,$03,$00,$03,$B3,$03,$00 +scroll_row3: + .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$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,$00,$00,$00,$00,$00,$00,$DF,$00,$D0,$00,$DF,$00,$DF,$0F,$0F,$DF,$00,$00,$0F,$0F,$D0,$00,$00,$00,$00,$00,$00,$BF,$0F,$0F,$BF,$00,$BF,$0F,$0F,$00,$00,$BF,$0F,$0F,$B0,$00,$BF,$0F,$0F,$00,$00,$00,$0F,$00,$00,$00,$0F,$00,$00,$00,$0F,$00,$00 +scroll_row4: + .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$26,$20,$06,$00,$00,$26,$20,$20,$20,$00,$26,$00,$00,$26,$00,$00,$26,$00,$00,$26,$20,$20,$20,$00,$26,$00,$00,$26,$00,$00,$00,$00,$00,$00,$4C,$0C,$00,$0C,$4C,$00,$4C,$00,$00,$4C,$00,$40,$40,$40,$0C,$00,$00,$00,$00,$00,$00,$13,$00,$00,$13,$00,$13,$10,$10,$10,$00,$13,$00,$00,$13,$00,$13,$10,$10,$10,$00,$00,$13,$00,$00,$00,$13,$00,$00,$00,$13,$00,$00 diff --git a/mode7/demo_notes b/mode7/demo_notes new file mode 100644 index 00000000..8ec8edf0 --- /dev/null +++ b/mode7/demo_notes @@ -0,0 +1,15 @@ +Image, loading screen + +Pre-programmed island flight, over water too. + Scroll in text on bottom? + +Checkerboard spin with bouncing sphere. + +Mockingboard music. + +Credits. + Starfield, raster bars while credits spin letters in place + to each thing. Also white inverse background to make it look + like text is on graphics + +Apple Logo for APPLE ][ FOREVER diff --git a/mode7/mode7.dsk b/mode7/mode7.dsk index 34dabac680255ada8dcfd5e6c740329ea0c63719..8f692df3c892105e1b7e37ffe8cf69d78ae527e1 100644 GIT binary patch literal 143360 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 Stvajzr$6geK0`OhfBhc~`a1vs literal 143360 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 diff --git a/mode7/mode7.s b/mode7/mode7.s index 39df869e..8d520b32 100644 --- a/mode7/mode7.s +++ b/mode7/mode7.s @@ -967,6 +967,8 @@ nomatch: .include "island_lookup.s" .elseif .def(CHECKERBOARD_MAP) .include "checkerboard_lookup.s" +.elseif .def(RAINBOW_MAP) + .include "rainbow_lookup.s" .endif match: @@ -1064,6 +1066,8 @@ lookup_map: .include "island_lookup.s" .elseif .def(CHECKERBOARD_MAP) .include "checkerboard_lookup.s" +.elseif .def(RAINBOW_MAP) + .include "rainbow_lookup.s" .endif rts ; 6 diff --git a/mode7/rainbow_lookup.s b/mode7/rainbow_lookup.s new file mode 100644 index 00000000..1f4559f1 --- /dev/null +++ b/mode7/rainbow_lookup.s @@ -0,0 +1,24 @@ + ;==================== + ; lookup_map + ;==================== + ; finds value in space_x.i,space_y.i + ; returns color in A + ; CLOBBERS: A,Y + + lda SPACEX_I ; 3 + sta spacex_label+1 ; self modifying code, LAST_SPACEX_I ; 4 + + lda SPACEY_I ; 3 + sta spacey_label+1 ; self modifying code, LAST_SPACEY_I ; 4 + + lda SPACEX_I + and #$f + sta TEMP + asl + asl + asl + asl + ora TEMP + eor SPACEY_I + + sta map_color_label+1 ; self-modifying diff --git a/mode7/scroll_demo.s b/mode7/scroll_demo.s new file mode 100644 index 00000000..cb3dc820 --- /dev/null +++ b/mode7/scroll_demo.s @@ -0,0 +1,70 @@ +.include "zp.inc" + + + ;================================ + ; Clear screen and setup graphics + ;================================ + + jsr clear_screens ; clear top/bottom of page 0/1 + jsr set_gr_page0 + + ;=============== + ; Init Variables + ;=============== + lda #0 + sta DISP_PAGE + +scroll_loop: + + ldx scroll_length + ldy #0 +draw_loop: + lda scroll_row1,Y + sta $400,Y + + lda scroll_row2,Y + sta $480,Y + + lda scroll_row3,Y + sta $500,Y + + lda scroll_row4,Y + sta $580,Y + + iny + dex + bne draw_loop + + + ;================== + ; flip pages + ;================== + +; jsr page_flip ; 6 + + ;================== + ; loop forever + ;================== + + jmp scroll_loop ; 3 + +;=============================================== +; External modules +;=============================================== + +.include "utils.s" + +;=============================================== +; Variables +;=============================================== + +.include "deater_scroll.inc" + + ; waste memory with a lookup table + ; move this to the zeropage? + +gr_offsets: + .word $400,$480,$500,$580,$600,$680,$700,$780 + .word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8 + .word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0 + diff --git a/mode7/scroller.c b/mode7/scroller.c new file mode 100644 index 00000000..218d518f --- /dev/null +++ b/mode7/scroller.c @@ -0,0 +1,346 @@ +/* Use grey2 to make RLE more efficient? */ + +#include +#include + +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,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}, // 8 + {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}, // 16 + {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}, // 24 + {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,0,0,0,0,0,0,0,0}, // 32 ' ' + {4, + 0x00, + 0xe0, // ****** + 0xe0, // ****** + 0x40, // ** + 0x40, // ** + 0x00, // + 0x40, // ** + 0x40, // ** + }, + {0,0,0,0,0,0,0,0,0}, // 34 + {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}, // 40 + {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}, // 48 +/* + ** ** ** **** ** ** ****** **** ****** ** **** +** ** **** ** ** ** ** ** ** ** ** ** ** ** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** +** ** ** ** ** ****** **** **** ** ** **** +** ** ** ** ** ** ** ** ** ** ** ** ** +** ** ** ** ** ** ** ** ** ** ** ** ** + ** ****** ****** **** ** **** ** ** ** ** +*/ + {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}, // 56 + {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}, //64 + {5, + 0x00, + 0x60, // **** + 0x90, // ** ** + 0x90, // ** ** + 0xf0, // ******** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + }, + {5, + 0x00, + 0xe0, // ****** + 0x90, // ** ** + 0x90, // ** ** + 0xe0, // ****** + 0x90, // ** ** + 0x90, // ** ** + 0xe0, // ****** + }, + {5, + 0x00, + 0x70, // ****** + 0x80, // ** + 0x80, // ** + 0x80, // ** + 0x80, // ** + 0x80, // ** + 0x70, // ****** + }, + {5, + 0x00, + 0xc0, // **** + 0xa0, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0xa0, // ** ** + 0xc0, // **** + }, + {5, + 0x00, + 0xf0, // ******** + 0x80, // ** + 0x80, // ** + 0xe0, // ****** + 0x80, // ** + 0x80, // ** + 0xf0, // ******** + }, + {0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0}, +/* +******** +** +** +****** +** +** +** + + **** +** +** +** **** +** ** +** ** + **** +*/ + {5, + 0x00, + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0xf0, // ******** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + }, + + {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}, +/* +****** **** ** ** ** ** ** ** ** **** ****** + ** ** ** ** ** **** **** **** ** ** ** ** ** + ** ** ** ** ** ** ** ** **** ** ** ** ** ** + ** ** **** ** ** ** ** **** ** ** ****** + ** ** ** ** ** ** ** ** **** ** ** ** + ** ** ** ** ** ** ** ** ** ** ** ** ** +****** **** ** ** ******** ** ** ** ** **** ** +*/ + + {0,0,0,0,0,0,0,0,0}, + +/* + **** +** ** +** ** +** ** +** ** +** **** + ** ** +*/ + + {5, + 0x00, + 0xe0, // ****** + 0x90, // ** ** + 0x90, // ** ** + 0xe0, // ****** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + }, + + {5, + 0x00, + 0x70, // ****** + 0x80, // ** + 0x80, // ** + 0x60, // **** + 0x10, // ** + 0x10, // ** + 0xe0, // ****** + }, + {4, + 0x00, + 0xe0, // ****** + 0x40, // ** + 0x40, // ** + 0x40, // ** + 0x40, // ** + 0x40, // ** + 0x40, // ** + }, + + {5, + 0x00, + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // **** + }, + + {5, + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x90, // ** ** + 0x50, // ** ** + 0x50, // ** ** + 0x20, // ** + }, + + {6, + 0x00, + 0x88, // ** ** + 0x88, // ** ** + 0x88, // ** ** + 0x88, // ** ** + 0xa8, // ** ** ** + 0xd8, // **** **** + 0x88, // ** ** + }, + + {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}, +/* +** ** ** ** ********** +** ** ** ** ** +** ** ** ** ** + ** ** ** +** ** ** ** +** ** ** ** +** ** ** ********** + +*/ + +}; + + +static int color_map[4][8]={ + {0x2,0x2,0x6,0xe,0xf,0xe,0x6,0x2}, // Blue + {0x4,0x4,0xc,0xd,0xf,0xd,0xc,0x4}, // Green + {0x1,0x1,0x3,0xb,0xf,0xb,0x3,0x1}, // Red + {0x5,0x5,0x7,0xf,0xf,0xf,0x7,0x5}, // Grey +}; + + +int main(int argc, char **argv) { + + //char string[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + char string[]=" \001DEATER \002WAS \003HERE!!!"; + int length=0,width=0,x,y,i; + int color,color1,color2; + int which_color=0; + + unsigned char row[4][256]; + + for(i=0;i>x)); + color1=color?color_map[which_color][0]:0; + color=!!(font[(int)string[i]][2]&(0x80>>x)); + color2=color?(color_map[which_color][1])<<4:0; + row[0][length]=color1|color2; + + color=!!(font[(int)string[i]][3]&(0x80>>x)); + color1=color?color_map[which_color][2]:0; + color=!!(font[(int)string[i]][4]&(0x80>>x)); + color2=color?(color_map[which_color][3])<<4:0; + row[1][length]=color1|color2; + + color=!!(font[(int)string[i]][5]&(0x80>>x)); + color1=color?color_map[which_color][4]:0; + color=!!(font[(int)string[i]][6]&(0x80>>x)); + color2=color?(color_map[which_color][5])<<4:0; + row[2][length]=color1|color2; + + color=!!(font[(int)string[i]][7]&(0x80>>x)); + color1=color?color_map[which_color][6]:0; + color=!!(font[(int)string[i]][8]&(0x80>>x)); + color2=color?(color_map[which_color][7])<<4:0; + row[3][length]=color1|color2; + + + length++; + } + } + + + printf("scroll_length: .byte %d\n",length); + for(y=0;y<4;y++) { + printf("scroll_row%d:\n",y+1); + printf("\t.byte "); + for(x=0;x&_9|-r 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