From b4c8a5ed5ea76e3bb90995570a695168dd763971 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 2 May 2023 00:50:49 -0400 Subject: [PATCH] fn: making progress --- games/sb/Makefile | 6 +- games/sb/duet.s | 17 ++ games/sb/fn.s | 54 +++++- games/sb/fn_graphics/Makefile | 29 ++- games/sb/fn_graphics/a2_fortnight.png | Bin 1420 -> 1384 bytes games/sb/fn_graphics/a2_fortnight_sprites.png | Bin 0 -> 1396 bytes games/sb/hgr_sprite_mask.s | 86 +++++++++ games/sb/hgr_tables.s | 141 +++++++++++++++ games/sb/title.s | 2 +- games/sb/zp.inc | 3 + music/electric_duet/Makefile | 15 +- utils/music/text_to_ed.c | 166 +++++++++++------- 12 files changed, 437 insertions(+), 82 deletions(-) create mode 100644 games/sb/fn_graphics/a2_fortnight_sprites.png create mode 100644 games/sb/hgr_sprite_mask.s create mode 100644 games/sb/hgr_tables.s diff --git a/games/sb/Makefile b/games/sb/Makefile index ea4e5664..91121910 100644 --- a/games/sb/Makefile +++ b/games/sb/Makefile @@ -34,11 +34,13 @@ sb.o: sb.s zx02_optim.s \ FN: fn.o ld65 -o FN fn.o -C $(LINKER_SCRIPTS)/apple2_6000.inc -fn.o: fn.s zx02_optim.s \ +fn.o: fn.s zx02_optim.s duet.s hgr_sprite_mask.s hgr_tables.s \ zp.inc hardware.inc \ + fn_sound/fortnight.ed \ fn_graphics/a2_fortnight.hgr.zx02 \ fn_graphics/a2_fortnight_rat1.hgr.zx02 \ - fn_graphics/a2_fortnight_rat2.hgr.zx02 + fn_graphics/a2_fortnight_rat2.hgr.zx02 \ + fn_graphics/disk_sprites.inc ca65 -o fn.o fn.s -l fn.lst diff --git a/games/sb/duet.s b/games/sb/duet.s index af7e745d..982c63c6 100644 --- a/games/sb/duet.s +++ b/games/sb/duet.s @@ -1,3 +1,5 @@ +; hacked up to switch pages + ; *************************************************************************** ; * Copyright (C) 1979-2015 by Paul Lutus * ; * http://arachnoid.com/administration * @@ -33,9 +35,11 @@ MADDRL = $1E MADDRH = $1F LOC4E = $4E COUNT256 = $4F +WHICH_PAGE = $50 play_ed: LDA #$01 ; 900: A9 01 ; 2 *!* + sta WHICH_PAGE STA INSTRUMENT1 ; 902: 85 09 ; 3 set default STA INSTRUMENT2 ; 904: 85 1D ; 3 instruments PHA ; 906: 48 ; 3 1 on stack @@ -44,13 +48,24 @@ play_ed: BNE load_triplet ; 909: D0 15 ; 4 *!* start decoding change_instrmnt: + INY ; 90B: C8 ; 2 LDA (MADDRL),Y ; 90C: B1 1E ; 5 *!* load next byte + bmi switch_page STA INSTRUMENT1 ; 90E: 85 09 ; 3 save instrument INY ; 910: C8 ; 2 LDA (MADDRL),Y ; 911: B1 1E ; 5 *!* load next byte STA INSTRUMENT2 ; 913: 85 1D ; 3 save instrument + jmp triplet_loop +switch_page: + lda WHICH_PAGE + eor #$1 + sta WHICH_PAGE + tax + lda PAGE1,X + + triplet_loop: LDA MADDRL ; 915: A5 1E ; 3 *!* increment pointer CLC ; 917: 18 ; 2 by three @@ -130,8 +145,10 @@ label7: BIT $C030 ; 96C: 2C 30C0 ; 4 SPEAKER label9: STA LOC4E ; 96F: 85 4E ; 3 + BIT $C000 ; 971: 2C 00C0 ; 4 KEYBOARD DATA BMI exit_player ; 974: 30 C0 ; 4 *!* if keypress, exit + DEY ; 976: 88 ; 2 BNE selfmodify2 ; 977: D0 02 ; 4 *!* BEQ label11 ; 979: F0 06 ; 4 *!* diff --git a/games/sb/fn.s b/games/sb/fn.s index 271fd42e..16767d68 100644 --- a/games/sb/fn.s +++ b/games/sb/fn.s @@ -10,6 +10,11 @@ fortnight_start: + lda #$20 + sta HGR_PAGE + + jsr hgr_make_tables + ;=================== ; set graphics mode ;=================== @@ -37,6 +42,23 @@ floppy_animation: jsr full_decomp + + lda #10 + sta CURSOR_X + lda #10 + sta CURSOR_Y + lda #disk_sprite0 + sta INH + lda #disk_mask0 + sta MASKH + + jsr hgr_draw_sprite + + jsr wait_until_keypress @@ -60,15 +82,30 @@ load_rats: jsr full_decomp + ;============================= + ; play music and animate rat + ;============================= +play_music: + lda #music + sta MADDRH + + jsr play_ed + rat_loop: - bit PAGE1 - jsr wait_until_keypress - bit PAGE2 +; bit PAGE1 +; jsr wait_until_keypress + + + +; bit PAGE2 jsr wait_until_keypress - jmp rat_loop +; jmp rat_loop + jmp fortnight_start wait_until_keypress: @@ -79,6 +116,14 @@ wait_until_keypress: .include "zx02_optim.s" + .include "hgr_sprite_mask.s" + .include "hgr_tables.s" + +.align $100 + .include "duet.s" + +music: + .incbin "fn_sound/fortnight.ed" fn_image: .incbin "fn_graphics/a2_fortnight.hgr.zx02" @@ -87,3 +132,4 @@ rat1_image: rat2_image: .incbin "fn_graphics/a2_fortnight_rat2.hgr.zx02" + .include "fn_graphics/disk_sprites.inc" diff --git a/games/sb/fn_graphics/Makefile b/games/sb/fn_graphics/Makefile index ecac474a..a0e058f8 100644 --- a/games/sb/fn_graphics/Makefile +++ b/games/sb/fn_graphics/Makefile @@ -8,10 +8,35 @@ EMPTY_DISK = ../../../empty_disk/empty.dsk TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft PNG2GR = ../../../utils/gr-utils/png2gr PNG2SPRITES = ../../../utils/gr-utils/png2sprites +HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite all: a2_fortnight.hgr.zx02 \ a2_fortnight_rat1.hgr.zx02 \ - a2_fortnight_rat2.hgr.zx02 + a2_fortnight_rat2.hgr.zx02 \ + disk_sprites.inc + + +#### + +disk_sprites.inc: a2_fortnight_sprites.png + $(HGR_SPRITE) -s -l disk_sprite0 a2_fortnight_sprites.png 14 7 41 34 > disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite1 a2_fortnight_sprites.png 14 42 41 69 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite2 a2_fortnight_sprites.png 14 77 41 104 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite3 a2_fortnight_sprites.png 14 112 41 139 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask0 a2_fortnight_sprites.png 56 7 83 34 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask1 a2_fortnight_sprites.png 56 42 83 69 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask2 a2_fortnight_sprites.png 56 77 83 104 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask3 a2_fortnight_sprites.png 56 112 83 139 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite4 a2_fortnight_sprites.png 98 7 125 34 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite5 a2_fortnight_sprites.png 98 42 125 69 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite6 a2_fortnight_sprites.png 98 77 125 104 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_sprite7 a2_fortnight_sprites.png 98 112 125 139 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask4 a2_fortnight_sprites.png 140 7 167 34 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask5 a2_fortnight_sprites.png 140 42 167 69 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask6 a2_fortnight_sprites.png 140 77 167 104 >> disk_sprites.inc + $(HGR_SPRITE) -s -l disk_mask7 a2_fortnight_sprites.png 140 112 167 139 >> disk_sprites.inc + + #### @@ -42,5 +67,5 @@ a2_fortnight_rat2.hgr: a2_fortnight_rat2.png #### clean: - rm -f *~ *.o *.lst + rm -f *~ *.o *.lst disk_sprintes.inc *.zx02 *.hgr diff --git a/games/sb/fn_graphics/a2_fortnight.png b/games/sb/fn_graphics/a2_fortnight.png index 1902b03873e7483a6e55b29ed0c9551b2f65e8fa..f7f840e991d1b2f5b78b9f800e54a79128fdfce6 100644 GIT binary patch delta 840 zcmV-O1GoH)3+M{4?Ewh|0t5{wveBiRllB29e>F)&K~#9!?V4M%;vf))+v@Ut+yX1; zDmLPa``^k08VKZOLP%t4{!cwe6E0txiwTizM^Ilf)D7Lqm`+fcK03^8GDTz5%4}sm zfaD*zQieVQ4Q$xT7#FFN@h&ZF*b)aF?m%XYO{Gk5X<*}I=&a0}p6=B`M$X9$fqA_C ze|+ALe$P8gQKb)G$yq=xN3@xOg z8A=%b+HZf?cC?Yv@zkG8tD()cL%Wqsi*N10#?Le@zMIxgZjQ)2n#jn8+JRGuha1}G z10&_5Qszz6JTPmax#zTV8km*P+#(}ie>(K7R|mYy@22Y}nP129&txjDD1Up!UngVq zrBB^rmeL$TW-_0GH5U_JsY)}i+#FVFC_`su79wM_$LDJ^nQ6^twAH8CFSHPu+~$i6 zl`_sv*L(6urhG}C*^-$(cFWL78AAZ82HzzZkpA$wl1`%nfy|Y3w%0WC*w*K|0dOz8i&FsVXr;>V?AJZ>vLSB^1CIb zvs#drr&-+gQbt^UcfBVu`a+~Fe-ZbjYsCEU-Kw{ny8M&EqM1(~b4b{rZ?rV6iQ|^3 zjI$_Z+(8dTvV_cWYdU1|X*6TFrxYvDH__h5AtkW!uCatI3o@|}j7?3cW-9tm?4%SD zge1aN7d?FPusI|T`zV#BT_9|>GZ_sgm(8G6P$3h;e@I4yLaDSJG7=lLe~_UYQ3WF#0002M|Hog%Td49t SwJII}0000#{PrAGJ ze-Sd$CSwD0d;ESq?VH+V=n$D(yNqylqH*79WS);PGA#)#`B`uAfHuh7UqqSAaHWh5 zi|yd^F<BOhC> zV%XUtGY!l_XudKAmX(D5>fHfv^83<#lf2)@@?|m=ca+!O@z=>1ee0htF>~AOLf&Lv z1xqd_ywfht`_9d7r2}QCRc0nKL-u;DHj|m|*^IXOXSNH?L?*Xck)cw?x#@gQfBwpp zPsy22GHg~`I90u>Dt%k%;cnZP0sja2nms24o0QX zwBX240yrI{`X3-p85rhDSJWGdq@8gg*7~)f72}@>VVh)T=O=-_m7=P^xW%jKoGQWT=ple0_xsZIKzficldVR5TN@ zRLHRQomAV3438O;CGe1HAC?oCqhl#Ud1PYF!~|ZHN&T+uO~Mp~;W;5-c zymke89O?D+%Od;$Y(b_Y`jP>YF$Eu!Km`YrPz3}O(s`2a59Wm}00000NkvXXu0mjf D=A5qY diff --git a/games/sb/fn_graphics/a2_fortnight_sprites.png b/games/sb/fn_graphics/a2_fortnight_sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..0130ae98dac996af200c7012ab3a536d64b4ccfa GIT binary patch literal 1396 zcmV-)1&jKLP)EX>4Tx04R}tkv&MmKpe$i(@I4u4t9_tlA$`;#V;Id6^c+H)C#RSm|Q=hNkfw2 z;wZQl9Q;_UI=DFN>fkB}f*&BRE>4OrQsV!TLW>v=j{EWM-sA2aAT+B?H3M-#)hr{O zOo-Xssu+BQ9}xsFf@ztV`kW-C;5okT;p6LFjAwbD`*ZZ?3nl}6B5|DQhDE$VJhN%( zocD>ttSsk=&xywkx*+i**A$c`WU4}N!R7AGg%q)-Crd9m$}Q6RVrv>LYkeQevU6TtrrTxlJDtqIJ2lHTZO z(Ia4B8@RacXv!XNxdRM6>9Qd^lAoqfECTOm^i4Tn@D}J>b9-y=blBHm3JeA*M{bTvWpF6iS9e%(ahlQ3*rKYu^sB6d{U59Spli@oorS0^4Fy2Qxh?EX7!< zK9eV^V0d~I=cUz5;|o!rs!XPd6A%*-8h#;aVAxk7Cez%u;$oUW><05n)WEoh*x)NDUKEp%5n>ZxRCg=to z0Vb@^$S|8KRpL&-Tmok3^I^=%Fs{uh6DBH&RE9CO0LC|fwPKkEjKgokXU?|_=g+3I zeFp0cV2;4JC?Fa_6wif0qz4$lAn}LK00y%OujwF6Q=fQR`uL^&EJ!t5HCczsbX7HGp;ZF>H+!?$lc5F+^T#oWtfojPKO? z%#hnO=xrE?RW0-M$*gwD`zVOje5Rz))VYn09h^Z%iNqf;fWd5n&j1E6fB_6(00S7n00uCC0SsUO zbD6~7X5483vs@R4IsZz**bl+9aRCM}fC0>+oruAaA6q$0000\n\n",VERSION); @@ -206,13 +210,14 @@ static void print_help(int just_version, char *exec_name) { printf("This created Electric Duet files\n\n"); printf("Usage:\n"); - printf("\t%s [-h] [-v] [-d] [-o X] [-i X] textfile outbase\n\n", + printf("\t%s [-h] [-v] [-d] [-o X] [-i X] [-l] textfile outbase\n\n", exec_name); printf("\t-h: this help message\n"); printf("\t-v: version info\n"); printf("\t-d: print debug messages\n"); printf("\t-o: Offset octave by X\n"); printf("\t-i: set second instrument to X\n"); + printf("\t-l: generate lyrics file\n"); exit(0); } @@ -224,15 +229,17 @@ int main(int argc, char **argv) { char *result; char ed_filename[BUFSIZ],lyrics_filename[BUFSIZ],*in_filename; char temp[BUFSIZ]; - FILE *ed_file,*lyrics_file,*in_file=NULL; + FILE *ed_file,*lyrics_file=NULL,*in_file=NULL; //int attributes=0; int loop=0,i; int sp,external_frequency,irq; struct note_type a,b,c; int copt; + int generate_lyrics=0; // Instruments 0=square int voice1=0,voice2=0; + int newvoice1,newvoice2; char song_name[BUFSIZ]; char author_name[BUFSIZ]; @@ -265,6 +272,10 @@ int main(int argc, char **argv) { /* instrument to use */ voice1=atoi(optarg); break; + case 'l': + /* generate lyrics */ + generate_lyrics=1; + break; default: print_help(0,argv[0]); break; @@ -303,13 +314,14 @@ int main(int argc, char **argv) { return -1; } - lyrics_file=fopen(lyrics_filename,"w"); - if (lyrics_file==NULL) { - fprintf(stderr,"Couldn't open %s\n",lyrics_filename); - return -1; + if (generate_lyrics) { + lyrics_file=fopen(lyrics_filename,"w"); + if (lyrics_file==NULL) { + fprintf(stderr,"Couldn't open %s\n",lyrics_filename); + return -1; + } } - /* Get the info for the header */ while(1) { @@ -392,7 +404,7 @@ int main(int argc, char **argv) { int frame=0,lyric=0; int lyric_line=1; - fprintf(ed_file,"%c%c%c",1,voice1,voice2); + update_voice(ed_file,voice1,voice2); offset+=3; while(1) { @@ -410,6 +422,38 @@ int main(int argc, char **argv) { if (string[0]=='-') continue; if (string[0]=='*') continue; + if (string[0]=='@') { + sscanf(string,"@%d %d",&newvoice1,&newvoice2); + /* special case */ + if (newvoice1>128) { + update_voice(ed_file,0xff,0xff); + } + else { + voice1=newvoice1; + voice2=newvoice2; + update_voice(ed_file,voice1,voice2); + } + + offset+=3; + + + /* Avoid changing instrument by accident */ + /* Also keep lyrics in sync */ + if (same_count<2) { + same_count=2; + } + + fprintf(ed_file,"%c%c%c",same_count,a_last,b_last); + offset+=3; + if (debug) { + printf("%04X: %x %x %x\n",offset,same_count,a_last,b_last); + } + same_count=0; + + + continue; + } + sp=0; /* Skip line number */ @@ -420,60 +464,59 @@ int main(int argc, char **argv) { if (sp!=-1) sp=get_note(string,sp,&c,line); /* handle lyrics */ - if ((sp!=-1) && (string[sp]!='\n') && (string[sp]!=0)) { - fprintf(lyrics_file,"; %d: %s",frame,&string[sp]); - while((string[sp]==' ' || string[sp]=='\t')) sp++; - if (string[sp]!='\n') { - fprintf(lyrics_file,".byte\t$%02X",lyric_line&0xff); + if (generate_lyrics) { + if ((sp!=-1) && (string[sp]!='\n') && (string[sp]!=0)) { + fprintf(lyrics_file,"; %d: %s",frame,&string[sp]); + while((string[sp]==' ' || string[sp]=='\t')) sp++; + if (string[sp]!='\n') { + fprintf(lyrics_file,".byte\t$%02X",lyric_line&0xff); - /* get to first quote */ - while(string[sp]!='\"') sp++; - sp++; - - /* stop at second quote */ - while(string[sp]!='\"') { - if (string[sp]=='\\') { - sp++; - /* Ignore if we have LED panel */ - if (string[sp]=='i') { - //printf(",$%02X",10); - } - /* form feed */ - else if (string[sp]=='f') { - fprintf(lyrics_file,",$%02X",12); - } - /* Vertical tab */ - else if (string[sp]=='v') { - fprintf(lyrics_file,",$%02X",11); - } - else if (string[sp]=='n') { - fprintf(lyrics_file,",$%02X",13|0x80); - } - else if ((string[sp]>='0') && - (string[sp]<=':')) { - fprintf(lyrics_file,",$%02X",string[sp]-'0'); - } - else { - printf("UNKNOWN ESCAPE %d\n",string[sp]); - } + /* get to first quote */ + while(string[sp]!='\"') sp++; + sp++; + + /* stop at second quote */ + while(string[sp]!='\"') { + if (string[sp]=='\\') { + sp++; + /* Ignore if we have LED panel */ + if (string[sp]=='i') { + //printf(",$%02X",10); + } + /* form feed */ + else if (string[sp]=='f') { + fprintf(lyrics_file,",$%02X",12); + } + /* Vertical tab */ + else if (string[sp]=='v') { + fprintf(lyrics_file,",$%02X",11); + } + else if (string[sp]=='n') { + fprintf(lyrics_file,",$%02X",13|0x80); + } + else if ((string[sp]>='0') && + (string[sp]<=':')) { + fprintf(lyrics_file,",$%02X",string[sp]-'0'); + } + else { + printf("UNKNOWN ESCAPE %d\n",string[sp]); + } + sp++; + continue; + } + fprintf(lyrics_file,",$%02X",string[sp]|0x80); sp++; - continue; } - fprintf(lyrics_file,",$%02X",string[sp]|0x80); - sp++; + fprintf(lyrics_file,",$00\n"); + +// fprintf(lyrics_file," %s",&string[sp]); +// printf("%s",&string[sp]); + } + lyric=1; + } - fprintf(lyrics_file,",$00\n"); - - - -// fprintf(lyrics_file," %s",&string[sp]); -// printf("%s",&string[sp]); - } - lyric=1; - } - if ((a.ed_freq!=0)||(b.ed_freq!=0)) { if (debug) { printf("%d: ",frame); @@ -564,7 +607,10 @@ int main(int argc, char **argv) { fprintf(ed_file,"%c%c%c",0,0,0); // EOF? fclose(ed_file); - fclose(lyrics_file); + + if (generate_lyrics) { + fclose(lyrics_file); + } (void) irq; (void) loop;