From 8c445868b5672fe7d8fcda625d9039cba9df7679 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 5 Jan 2021 21:03:44 -0500 Subject: [PATCH] games: update README/Makefiles --- games/Makefile | 22 + games/README | 28 + games/duke/Makefile | 22 +- games/duke/README | 2 + games/duke/graphics/Makefile | 2 +- games/glados3.3/Makefile | 11 +- games/ksp/applesoft/Makefile | 14 +- games/ksp/asm/Makefile | 10 +- games/mist/Makefile | 41 +- games/mist/books/Makefile | 6 +- games/mist/graphics_arbor/Makefile | 4 +- games/mist/graphics_cabin/Makefile | 4 +- games/mist/graphics_channel/Makefile | 4 +- games/mist/graphics_dentist/Makefile | 4 +- games/mist/graphics_dni/Makefile | 4 +- games/mist/graphics_generator/Makefile | 4 +- games/mist/graphics_meche/Makefile | 4 +- games/mist/graphics_mist/Makefile | 4 +- games/mist/graphics_nibel/Makefile | 4 +- games/mist/graphics_octagon/Makefile | 4 +- games/mist/graphics_selena/Makefile | 4 +- games/mist/graphics_ship/Makefile | 4 +- games/mist/graphics_stoney/Makefile | 4 +- games/mist/graphics_sub/Makefile | 4 +- games/mist/graphics_viewer/Makefile | 4 +- games/monkey/Makefile | 24 +- games/monkey/graphics/Makefile | 4 +- games/monkey/graphics_intro/Makefile | 4 +- games/ootw/Makefile | 67 +- games/space_bars/Makefile | 11 +- games/space_bars/README | 5 + games/tb_6502/Changelog | 134 + games/tb_6502/FAQ.tb_6502 | 233 ++ games/tb_6502/Makefile | 21 + games/tb_6502/README.tb_6502 | 130 + games/tb_6502/SINCOS | Bin 0 -> 146 bytes games/tb_6502/TODO | 3 + games/tb_6502/apple2_c00.inc | 12 + games/tb_6502/tb_6502.dsk | Bin 0 -> 143360 bytes games/tb_6502/tb_6502.s | 4291 ++++++++++++++++++++++++ games/tb_6502/tools/rle_data.c | 173 + games/tb_6502/tools/string_to_apple.c | 26 + games/tb_6502/tools/test_random.c | 35 + games/tb_6502/tools/wait.c | 15 + games/tfv/Makefile | 23 +- utils/Makefile | 4 +- 46 files changed, 5289 insertions(+), 144 deletions(-) create mode 100644 games/Makefile create mode 100644 games/README create mode 100644 games/duke/README create mode 100644 games/space_bars/README create mode 100644 games/tb_6502/Changelog create mode 100644 games/tb_6502/FAQ.tb_6502 create mode 100644 games/tb_6502/Makefile create mode 100644 games/tb_6502/README.tb_6502 create mode 100644 games/tb_6502/SINCOS create mode 100644 games/tb_6502/TODO create mode 100644 games/tb_6502/apple2_c00.inc create mode 100644 games/tb_6502/tb_6502.dsk create mode 100644 games/tb_6502/tb_6502.s create mode 100644 games/tb_6502/tools/rle_data.c create mode 100644 games/tb_6502/tools/string_to_apple.c create mode 100644 games/tb_6502/tools/test_random.c create mode 100644 games/tb_6502/tools/wait.c diff --git a/games/Makefile b/games/Makefile new file mode 100644 index 00000000..e8731462 --- /dev/null +++ b/games/Makefile @@ -0,0 +1,22 @@ +all: + cd duke && make + cd glados3.3 && make + cd ksp && make + cd mist && make + cd monkey && make + cd ootw && make + cd space_bars && make + cd tb_6502 && make + cd tfv && make + +clean: + cd duke && make clean + cd glados3.3 && make clean + cd ksp && make clean + cd mist && make clean + cd monkey && make clean + cd ootw && make clean + cd space_bars && make clean + cd tb_6502 && make clean + cd tfv && make clean + rm -f *~ diff --git a/games/README b/games/README new file mode 100644 index 00000000..94bf9b1b --- /dev/null +++ b/games/README @@ -0,0 +1,28 @@ +Various Games/Demakes by VMW Productions + ++ duke + proof of concept demake of Duke Nukem1 + ++ glados3.3 + Applesoft BASIC demo of "Portal" + ++ ksp + Applesoft BASIC demo of Kerbal Space Program + ++ mist + Full demak of Myst, fitting on 3 disks + ++ monkey + proof of concept demake of Secret of Monkey Island + ++ ootw + partial demake of Out of this World / Another World + ++ space_bars + vapor-lock/cycle counted proof of concept game + ++ tb_6502 + Tom Bombem for Apple II, scrolling space shooter + ++ tfv + Talbot Fantasy 7 RPG game diff --git a/games/duke/Makefile b/games/duke/Makefile index dee84067..99d28cad 100644 --- a/games/duke/Makefile +++ b/games/duke/Makefile @@ -1,10 +1,12 @@ -include ../Makefile.inc +include ../../Makefile.inc -DOS33 = ../dos33fs-utils/dos33 -DOS33_RAW = ../dos33fs-utils/dos33_raw -B2D = ../bmp2dhr/b2d -PNG2GR = ../gr-utils/png2gr +DOS33 = ../../utils/dos33fs-utils/dos33 +DOS33_RAW = ../../utils/dos33fs-utils/dos33_raw +B2D = ../../utils/bmp2dhr/b2d +PNG2GR = ../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft + all: duke.dsk @@ -20,12 +22,12 @@ duke.dsk: HELLO LOADER DUKE_TITLE DUKE_LEVEL1 DUKE_LEVEL2 ### HELLO: hello.bas - ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + $(TOKENIZE) < hello.bas > HELLO #### LOADER: loader.o - ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc + ld65 -o LOADER loader.o -C ../../linker_scripts/apple2_1000.inc loader.o: loader.s ca65 -o loader.o loader.s -l loader.lst @@ -33,7 +35,7 @@ loader.o: loader.s #### DUKE_TITLE: duke_title.o - ld65 -o DUKE_TITLE duke_title.o -C ../linker_scripts/apple2_4000.inc + ld65 -o DUKE_TITLE duke_title.o -C ../../linker_scripts/apple2_4000.inc duke_title.o: duke_title.s zp.inc hardware.inc init_vars.s ca65 -o duke_title.o duke_title.s -l duke_title.lst @@ -41,7 +43,7 @@ duke_title.o: duke_title.s zp.inc hardware.inc init_vars.s #### DUKE_LEVEL1: duke_level1.o - ld65 -o DUKE_LEVEL1 duke_level1.o -C ../linker_scripts/apple2_2000.inc + ld65 -o DUKE_LEVEL1 duke_level1.o -C ../../linker_scripts/apple2_2000.inc duke_level1.o: duke_level1.s zp.inc hardware.inc \ print_help.s gr_fast_clear.s quit_yn.s text_drawbox.s level_end.s \ @@ -57,7 +59,7 @@ duke_level1.o: duke_level1.s zp.inc hardware.inc \ #### DUKE_LEVEL2: duke_level2.o - ld65 -o DUKE_LEVEL2 duke_level2.o -C ../linker_scripts/apple2_2000.inc + ld65 -o DUKE_LEVEL2 duke_level2.o -C ../../linker_scripts/apple2_2000.inc duke_level2.o: duke_level2.s zp.inc hardware.inc \ print_help.s gr_fast_clear.s quit_yn.s text_drawbox.s level_end.s \ diff --git a/games/duke/README b/games/duke/README new file mode 100644 index 00000000..27662c54 --- /dev/null +++ b/games/duke/README @@ -0,0 +1,2 @@ +demake proof-of-concept of Duke Nukem1 for Apple II + diff --git a/games/duke/graphics/Makefile b/games/duke/graphics/Makefile index c1aa53ac..6beaec95 100644 --- a/games/duke/graphics/Makefile +++ b/games/duke/graphics/Makefile @@ -1,5 +1,5 @@ -PNG2GR = ../../gr-utils/png2gr +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: level1_graphics.inc level2_graphics.inc diff --git a/games/glados3.3/Makefile b/games/glados3.3/Makefile index 8601c169..af93c204 100644 --- a/games/glados3.3/Makefile +++ b/games/glados3.3/Makefile @@ -1,7 +1,10 @@ -DOS33 = ../dos33fs-utils/dos33 -TXT2BAS = ../asoft_basic-utils/tokenize_asoft -SHAPETABLE = ../hgr-utils/shape_table -SOUNDCONVERT = ../asoft_sound/asoft_sound +DOS33 = ../../utils/dos33fs-utils/dos33 +TXT2BAS = ../../utils/asoft_basic-utils/tokenize_asoft +SHAPETABLE = ../../utils/hgr-utils/shape_table +SOUNDCONVERT = ../../utils/asoft_sound/asoft_sound + +]TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft + all: glados33.dsk diff --git a/games/ksp/applesoft/Makefile b/games/ksp/applesoft/Makefile index 3ffe0513..1491ad62 100644 --- a/games/ksp/applesoft/Makefile +++ b/games/ksp/applesoft/Makefile @@ -1,19 +1,19 @@ -PCX2HGR = ../../hgr-utils/pcx2hgr -DOS33 = ../../dos33fs-utils/dos33 -TXT2BAS = ../../asoft_basic-utils/tokenize_asoft -SHAPETABLE = ../../hgr-utils/shape_table +PCX2HGR = ../../../utils/hgr-utils/pcx2hgr +DOS33 = ../../../utils/dos33fs-utils/dos33 +TXT2BAS = ../../../utils/asoft_basic-utils/tokenize_asoft +SHAPETABLE = ../../../utils/hgr-utils/shape_table all: ksp.dsk $(TXT2BAS): - cd ../../asoft_basic-utils && make + cd ../../../utils/asoft_basic-utils && make $(SHAPETABLE): - cd ../../hgr-utils && make + cd ../../../utils/hgr-utils && make $(PCX2HGR): - cd ../../hgr-utils && make + cd ../../../utils/hgr-utils && make ACMPLX.BAS: acmplx.bas $(TXT2BAS) $(TXT2BAS) < acmplx.bas > ACMPLX.BAS diff --git a/games/ksp/asm/Makefile b/games/ksp/asm/Makefile index ab8892cd..4a36a582 100644 --- a/games/ksp/asm/Makefile +++ b/games/ksp/asm/Makefile @@ -1,8 +1,8 @@ -PCX2HGR = ../../hgr-utils/pcx2hgr -DOS33 = ../../dos33fs-utils/dos33 -TXT2BAS = ../../asoft_basic-utils/tokenize_asoft -SHAPETABLE = ../../hgr-utils/shape_table -MAKEB = ../../dos33fs-utils/make_b +PCX2HGR = ../../../utils/hgr-utils/pcx2hgr +DOS33 = ../../../utils/dos33fs-utils/dos33 +TXT2BAS = ../../../utils/asoft_basic-utils/tokenize_asoft +SHAPETABLE = ../../../utils/hgr-utils/shape_table +MAKEB = ../../../utils/dos33fs-utils/make_b LD65 = /usr/local/bin/ld65 CA65 = /usr/local/bin/ca65 diff --git a/games/mist/Makefile b/games/mist/Makefile index ad28aeec..5e47f3d3 100644 --- a/games/mist/Makefile +++ b/games/mist/Makefile @@ -1,11 +1,14 @@ -include ../Makefile.inc +include ../../Makefile.inc + +DOS33 = ../../utils/dos33fs-utils/dos33 +DOS33_RAW = ../../utils/dos33fs-utils/dos33_raw +PNG_TO_40x96 = ../../utils/gr-utils/png_to_40x96 +PNG_TO_40x48D = ../../utils/gr-utils/png_to_40x48d +PNG2RLE = ../../utils/gr-utils/png2rle +B2D = ../../utils/bmp2dhr/b2d + +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft -DOS33 = ../dos33fs-utils/dos33 -DOS33_RAW = ../dos33fs-utils/dos33_raw -PNG_TO_40x96 = ../gr-utils/png_to_40x96 -PNG_TO_40x48D = ../gr-utils/png_to_40x48d -PNG2RLE = ../gr-utils/png2rle -B2D = ../bmp2dhr/b2d all: mist.dsk mist_side2.dsk mist_side3.dsk @@ -88,7 +91,7 @@ mist_side3.dsk: WBOOT3 MECHE SELENA STONEY SUB ### WBOOT2: wrong_boot2.o - ld65 -o WBOOT2 wrong_boot2.o -C ../linker_scripts/apple2_800.inc + ld65 -o WBOOT2 wrong_boot2.o -C ../../linker_scripts/apple2_800.inc wrong_boot2.o: wrong_boot2.s ca65 -o wrong_boot2.o wrong_boot2.s -l wrong_boot2.lst @@ -96,7 +99,7 @@ wrong_boot2.o: wrong_boot2.s ### WBOOT3: wrong_boot3.o - ld65 -o WBOOT3 wrong_boot3.o -C ../linker_scripts/apple2_800.inc + ld65 -o WBOOT3 wrong_boot3.o -C ../../linker_scripts/apple2_800.inc wrong_boot3.o: wrong_boot3.s ca65 -o wrong_boot3.o wrong_boot3.s -l wrong_boot3.lst @@ -105,7 +108,7 @@ wrong_boot3.o: wrong_boot3.s ### QBOOT: qboot_sector.o - ld65 -o QBOOT qboot_sector.o -C ../linker_scripts/apple2_800.inc + ld65 -o QBOOT qboot_sector.o -C ../../linker_scripts/apple2_800.inc qboot_sector.o: qboot_sector.s qboot_stage2.s ca65 -o qboot_sector.o qboot_sector.s -l qboot_sector.lst @@ -113,7 +116,7 @@ qboot_sector.o: qboot_sector.s qboot_stage2.s ### TEXT_TITLE: text_title.o - ld65 -o TEXT_TITLE text_title.o -C ../linker_scripts/apple2_800.inc + ld65 -o TEXT_TITLE text_title.o -C ../../linker_scripts/apple2_800.inc text_title.o: text_title.s text_print.s wait_a_bit.s ca65 -o text_title.o text_title.s -l text_title.lst @@ -122,7 +125,7 @@ text_title.o: text_title.s text_print.s wait_a_bit.s ### QLOAD: qload.o - ld65 -o QLOAD qload.o -C ../linker_scripts/apple2_1200.inc + ld65 -o QLOAD qload.o -C ../../linker_scripts/apple2_1200.inc qload.o: qload.s qboot.inc \ gr_copy.s gr_offsets.s gr_pageflip.s gr_putsprite_crop.s \ @@ -135,7 +138,7 @@ qload.o: qload.s qboot.inc \ ### LOADER: loader.o - ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc + ld65 -o LOADER loader.o -C ../../linker_scripts/apple2_1000.inc loader.o: loader.s \ gr_copy.s gr_offsets.s gr_pageflip.s gr_putsprite_crop.s \ @@ -147,7 +150,7 @@ loader.o: loader.s \ ### SAVE1: save1.o - ld65 -o SAVE1 save1.o -C ../linker_scripts/apple2_e00.inc + ld65 -o SAVE1 save1.o -C ../../linker_scripts/apple2_e00.inc save1.o: save1.s ca65 -o save1.o save1.s -l save1.lst @@ -155,7 +158,7 @@ save1.o: save1.s ### SAVE2: save2.o - ld65 -o SAVE2 save2.o -C ../linker_scripts/apple2_e00.inc + ld65 -o SAVE2 save2.o -C ../../linker_scripts/apple2_e00.inc save2.o: save2.s ca65 -o save2.o save2.s -l save2.lst @@ -163,7 +166,7 @@ save2.o: save2.s ### SAVE3: save3.o - ld65 -o SAVE3 save3.o -C ../linker_scripts/apple2_e00.inc + ld65 -o SAVE3 save3.o -C ../../linker_scripts/apple2_e00.inc save3.o: save3.s ca65 -o save3.o save3.s -l save3.lst @@ -171,7 +174,7 @@ save3.o: save3.s ### SAVE4: save4.o - ld65 -o SAVE4 save4.o -C ../linker_scripts/apple2_e00.inc + ld65 -o SAVE4 save4.o -C ../../linker_scripts/apple2_e00.inc save4.o: save4.s ca65 -o save4.o save4.s -l save4.lst @@ -179,7 +182,7 @@ save4.o: save4.s ### SAVE5: save5.o - ld65 -o SAVE5 save5.o -C ../linker_scripts/apple2_e00.inc + ld65 -o SAVE5 save5.o -C ../../linker_scripts/apple2_e00.inc save5.o: save5.s ca65 -o save5.o save5.s -l save5.lst @@ -208,7 +211,7 @@ common_routines.inc: qload.lst generate_common #### MIST_TITLE: mist_title.o - ld65 -o MIST_TITLE mist_title.o -C ../linker_scripts/apple2_4000.inc + ld65 -o MIST_TITLE mist_title.o -C ../../linker_scripts/apple2_4000.inc mist_title.o: mist_title.s zp.inc hardware.inc common_defines.inc \ common_routines.inc \ diff --git a/games/mist/books/Makefile b/games/mist/books/Makefile index 7110264c..9a9cffaa 100644 --- a/games/mist/books/Makefile +++ b/games/mist/books/Makefile @@ -1,8 +1,8 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr -TEXT2GR = ../../gr-utils/text2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr +TEXT2GR = ../../../utils/gr-utils/text2gr LZSA = ~/research/lzsa/lzsa/lzsa all: octagon_books.inc diff --git a/games/mist/graphics_arbor/Makefile b/games/mist/graphics_arbor/Makefile index f897df98..7a5af0c2 100644 --- a/games/mist/graphics_arbor/Makefile +++ b/games/mist/graphics_arbor/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: arbor_graphics.inc diff --git a/games/mist/graphics_cabin/Makefile b/games/mist/graphics_cabin/Makefile index b15ad572..1304aeae 100644 --- a/games/mist/graphics_cabin/Makefile +++ b/games/mist/graphics_cabin/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: cabin_graphics.inc diff --git a/games/mist/graphics_channel/Makefile b/games/mist/graphics_channel/Makefile index a417023b..64990647 100644 --- a/games/mist/graphics_channel/Makefile +++ b/games/mist/graphics_channel/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: channel_graphics.inc diff --git a/games/mist/graphics_dentist/Makefile b/games/mist/graphics_dentist/Makefile index d2e0dae5..83fe0ef2 100644 --- a/games/mist/graphics_dentist/Makefile +++ b/games/mist/graphics_dentist/Makefile @@ -1,5 +1,5 @@ -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: dentist_graphics.inc diff --git a/games/mist/graphics_dni/Makefile b/games/mist/graphics_dni/Makefile index 8fe5cc8d..b1768449 100644 --- a/games/mist/graphics_dni/Makefile +++ b/games/mist/graphics_dni/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: dni_graphics.inc diff --git a/games/mist/graphics_generator/Makefile b/games/mist/graphics_generator/Makefile index 9e8aa99a..a58ffe20 100644 --- a/games/mist/graphics_generator/Makefile +++ b/games/mist/graphics_generator/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: generator_graphics.inc diff --git a/games/mist/graphics_meche/Makefile b/games/mist/graphics_meche/Makefile index f5d7bbce..568ea491 100644 --- a/games/mist/graphics_meche/Makefile +++ b/games/mist/graphics_meche/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: meche_graphics.inc diff --git a/games/mist/graphics_mist/Makefile b/games/mist/graphics_mist/Makefile index ee110be7..b1ccfb1c 100644 --- a/games/mist/graphics_mist/Makefile +++ b/games/mist/graphics_mist/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: mist_graphics.inc diff --git a/games/mist/graphics_nibel/Makefile b/games/mist/graphics_nibel/Makefile index ad4da7e0..6e606cf9 100644 --- a/games/mist/graphics_nibel/Makefile +++ b/games/mist/graphics_nibel/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: nibel_graphics.inc diff --git a/games/mist/graphics_octagon/Makefile b/games/mist/graphics_octagon/Makefile index fc0ccf5d..d9057c68 100644 --- a/games/mist/graphics_octagon/Makefile +++ b/games/mist/graphics_octagon/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: octagon_graphics.inc diff --git a/games/mist/graphics_selena/Makefile b/games/mist/graphics_selena/Makefile index 4889acec..72fb6378 100644 --- a/games/mist/graphics_selena/Makefile +++ b/games/mist/graphics_selena/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: selena_graphics.inc diff --git a/games/mist/graphics_ship/Makefile b/games/mist/graphics_ship/Makefile index d694e3c0..a18641a6 100644 --- a/games/mist/graphics_ship/Makefile +++ b/games/mist/graphics_ship/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: ship_graphics.inc diff --git a/games/mist/graphics_stoney/Makefile b/games/mist/graphics_stoney/Makefile index 413038d1..729aa32e 100644 --- a/games/mist/graphics_stoney/Makefile +++ b/games/mist/graphics_stoney/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: stoney_graphics.inc diff --git a/games/mist/graphics_sub/Makefile b/games/mist/graphics_sub/Makefile index f83bc53d..4ce493b9 100644 --- a/games/mist/graphics_sub/Makefile +++ b/games/mist/graphics_sub/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: sub_graphics.inc diff --git a/games/mist/graphics_viewer/Makefile b/games/mist/graphics_viewer/Makefile index bb24d9df..f9d698bc 100644 --- a/games/mist/graphics_viewer/Makefile +++ b/games/mist/graphics_viewer/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: viewer_graphics.inc diff --git a/games/monkey/Makefile b/games/monkey/Makefile index bc3472bc..f21f0110 100644 --- a/games/monkey/Makefile +++ b/games/monkey/Makefile @@ -1,11 +1,13 @@ -include ../Makefile.inc +include ../../Makefile.inc + +DOS33 = ../../utils/dos33fs-utils/dos33 +DOS33_RAW = ../../utils/dos33fs-utils/dos33_raw +PNG_TO_40x96 = ../../utils/gr-utils/png_to_40x96 +PNG_TO_40x48D = ../../utils/gr-utils/png_to_40x48d +PNG2RLE = ../../utils/gr-utils/png2rle +B2D = ../../utils/bmp2dhr/b2d +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft -DOS33 = ../dos33fs-utils/dos33 -DOS33_RAW = ../dos33fs-utils/dos33_raw -PNG_TO_40x96 = ../gr-utils/png_to_40x96 -PNG_TO_40x48D = ../gr-utils/png_to_40x48d -PNG2RLE = ../gr-utils/png2rle -B2D = ../bmp2dhr/b2d all: monkey.dsk @@ -19,14 +21,14 @@ monkey.dsk: HELLO LOADER TITLE MONKEY ### HELLO: hello.bas - ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + $(TOKENIZE) < hello.bas > HELLO #### ### LOADER: loader.o - ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc + ld65 -o LOADER loader.o -C ../../linker_scripts/apple2_1000.inc loader.o: loader.s ca65 -o loader.o loader.s -l loader.lst @@ -34,7 +36,7 @@ loader.o: loader.s ### TITLE: title.o - ld65 -o TITLE title.o -C ../linker_scripts/apple2_2000.inc + ld65 -o TITLE title.o -C ../../linker_scripts/apple2_2000.inc title.o: title.s \ graphics_intro/title_graphics.inc \ @@ -47,7 +49,7 @@ title.o: title.s \ MONKEY: monkey.o - ld65 -o MONKEY monkey.o -C ../linker_scripts/apple2_2000.inc + ld65 -o MONKEY monkey.o -C ../../linker_scripts/apple2_2000.inc monkey.o: monkey.s zp.inc hardware.inc common_defines.inc \ graphics/graphics.inc \ diff --git a/games/monkey/graphics/Makefile b/games/monkey/graphics/Makefile index 9ff2f752..eafa4bf7 100644 --- a/games/monkey/graphics/Makefile +++ b/games/monkey/graphics/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: graphics.inc diff --git a/games/monkey/graphics_intro/Makefile b/games/monkey/graphics_intro/Makefile index 724874bb..b4a89057 100644 --- a/games/monkey/graphics_intro/Makefile +++ b/games/monkey/graphics_intro/Makefile @@ -1,7 +1,7 @@ #include ../Makefile.inc -PNG2RLE = ../../gr-utils/png2rle -PNG2GR = ../../gr-utils/png2gr +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr LZSA = ~/research/lzsa/lzsa/lzsa all: title_graphics.inc diff --git a/games/ootw/Makefile b/games/ootw/Makefile index 25cef853..d6d18921 100644 --- a/games/ootw/Makefile +++ b/games/ootw/Makefile @@ -1,8 +1,9 @@ -include ../Makefile.inc +include ../../Makefile.inc -DOS33 = ../dos33fs-utils/dos33 -PNG2RLE = ../gr-utils/png2rle -PNG2LZ4 = ../gr-utils/png2lz4 +DOS33 = ../../utils/dos33fs-utils/dos33 +PNG2RLE = ../../utils/gr-utils/png2rle +PNG2LZ4 = ../../utils/gr-utils/png2lz4 +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft all: ootw.dsk ootw_side2.dsk ootw_side3.dsk @@ -48,7 +49,7 @@ ootw_side3.dsk: HELLO TITLE ENDING \ #### OOTW_C1: ootw_c1.o - ld65 -o OOTW_C1 ootw_c1.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C1 ootw_c1.o -C ../../linker_scripts/apple2_1700.inc ootw_c1.o: ootw_c1.s \ gr_copy.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -79,7 +80,7 @@ ootw_c1.o: ootw_c1.s \ #### OOTW_C2: ootw_c2.o - ld65 -o OOTW_C2 ootw_c2.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C2 ootw_c2.o -C ../../linker_scripts/apple2_1700.inc ootw_c2.o: ootw_c2.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -102,7 +103,7 @@ ootw_c2.o: ootw_c2.s \ #### OOTW_C3: ootw_c3.o - ld65 -o OOTW_C3 ootw_c3.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C3 ootw_c3.o -C ../../linker_scripts/apple2_1700.inc ootw_c3.o: ootw_c3.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -116,7 +117,7 @@ ootw_c3.o: ootw_c3.s \ ### OOTW_C4: ootw_c4.o - ld65 -o OOTW_C4 ootw_c4.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C4 ootw_c4.o -C ../../linker_scripts/apple2_1700.inc ootw_c4.o: ootw_c4.s \ gr_copy.s gr_twoscreen_scroll.s gr_fast_clear.s gr_pageflip.s \ @@ -133,7 +134,7 @@ ootw_c4.o: ootw_c4.s \ ### OOTW_C5: ootw_c5.o - ld65 -o OOTW_C5 ootw_c5.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C5 ootw_c5.o -C ../../linker_scripts/apple2_1700.inc ootw_c5.o: ootw_c5.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -147,7 +148,7 @@ ootw_c5.o: ootw_c5.s \ ### OOTW_C6: ootw_c6.o - ld65 -o OOTW_C6 ootw_c6.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C6 ootw_c6.o -C ../../linker_scripts/apple2_1700.inc ootw_c6.o: ootw_c6.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -160,7 +161,7 @@ ootw_c6.o: ootw_c6.s \ ### OOTW_C7: ootw_c7.o - ld65 -o OOTW_C7 ootw_c7.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C7 ootw_c7.o -C ../../linker_scripts/apple2_1700.inc ootw_c7.o: ootw_c7.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -173,7 +174,7 @@ ootw_c7.o: ootw_c7.s \ ### OOTW_C8: ootw_c8.o - ld65 -o OOTW_C8 ootw_c8.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C8 ootw_c8.o -C ../../linker_scripts/apple2_1700.inc ootw_c8.o: ootw_c8.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -187,7 +188,7 @@ ootw_c8.o: ootw_c8.s \ ### OOTW_C9: ootw_c9.o - ld65 -o OOTW_C9 ootw_c9.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C9 ootw_c9.o -C ../../linker_scripts/apple2_1700.inc ootw_c9.o: ootw_c9.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -201,7 +202,7 @@ ootw_c9.o: ootw_c9.s \ ### OOTW_C10: ootw_c10.o - ld65 -o OOTW_C10 ootw_c10.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C10 ootw_c10.o -C ../../linker_scripts/apple2_1700.inc ootw_c10.o: ootw_c10.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -215,7 +216,7 @@ ootw_c10.o: ootw_c10.s \ ### OOTW_C11: ootw_c11.o - ld65 -o OOTW_C11 ootw_c11.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C11 ootw_c11.o -C ../../linker_scripts/apple2_1700.inc ootw_c11.o: ootw_c11.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -229,7 +230,7 @@ ootw_c11.o: ootw_c11.s \ ### OOTW_C12: ootw_c12.o - ld65 -o OOTW_C12 ootw_c12.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C12 ootw_c12.o -C ../../linker_scripts/apple2_1700.inc ootw_c12.o: ootw_c12.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -243,7 +244,7 @@ ootw_c12.o: ootw_c12.s \ ### OOTW_C13: ootw_c13.o - ld65 -o OOTW_C13 ootw_c13.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C13 ootw_c13.o -C ../../linker_scripts/apple2_1700.inc ootw_c13.o: ootw_c13.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -260,7 +261,7 @@ ootw_c13.o: ootw_c13.s \ ### OOTW_C14: ootw_c14.o - ld65 -o OOTW_C14 ootw_c14.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C14 ootw_c14.o -C ../../linker_scripts/apple2_1700.inc ootw_c14.o: ootw_c14.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -274,7 +275,7 @@ ootw_c14.o: ootw_c14.s \ ### OOTW_C15: ootw_c15.o - ld65 -o OOTW_C15 ootw_c15.o -C ../linker_scripts/apple2_1700.inc + ld65 -o OOTW_C15 ootw_c15.o -C ../../linker_scripts/apple2_1700.inc ootw_c15.o: ootw_c15.s \ gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ @@ -296,7 +297,7 @@ ootw_c15.o: ootw_c15.s \ #### AUDIO_TEST: audio.o - ld65 -o AUDIO_TEST audio.o -C ../linker_scripts/apple2_1700.inc + ld65 -o AUDIO_TEST audio.o -C ../../linker_scripts/apple2_1700.inc audio.o: audio.s ca65 -o audio.o audio.s -l audio.lst @@ -305,7 +306,7 @@ audio.o: audio.s #### INTRO: intro.o - ld65 -o INTRO intro.o -C ../linker_scripts/apple2_1700_9000.inc + ld65 -o INTRO intro.o -C ../../linker_scripts/apple2_1700_9000.inc intro.o: intro.s \ gr_copy.s gr_fast_clear.s gr_pageflip.s gr_unrle.s gr_putsprite.s \ @@ -352,7 +353,7 @@ intro_data_01.lz4: intro_data_01 truncate -s-8 intro_data_01.lz4 intro_data_01: intro_data_01.o - ld65 -o intro_data_01 intro_data_01.o -C ../linker_scripts/apple2_9000.inc + ld65 -o intro_data_01 intro_data_01.o -C ../../linker_scripts/apple2_9000.inc intro_data_01.o: intro_data_01.s ca65 -o intro_data_01.o intro_data_01.s -l intro_data_01.lst @@ -363,7 +364,7 @@ intro_data_04.lz4: intro_data_04 truncate -s-8 intro_data_04.lz4 intro_data_04: intro_data_04.o - ld65 -o intro_data_04 intro_data_04.o -C ../linker_scripts/apple2_9000.inc + ld65 -o intro_data_04 intro_data_04.o -C ../../linker_scripts/apple2_9000.inc intro_data_04.o: intro_data_04.s ca65 -o intro_data_04.o intro_data_04.s -l intro_data_04.lst @@ -374,7 +375,7 @@ intro_data_06.lz4: intro_data_06 truncate -s-8 intro_data_06.lz4 intro_data_06: intro_data_06.o - ld65 -o intro_data_06 intro_data_06.o -C ../linker_scripts/apple2_9000.inc + ld65 -o intro_data_06 intro_data_06.o -C ../../linker_scripts/apple2_9000.inc intro_data_06.o: intro_data_06.s ca65 -o intro_data_06.o intro_data_06.s -l intro_data_06.lst @@ -385,7 +386,7 @@ intro_data_08.lz4: intro_data_08 truncate -s-8 intro_data_08.lz4 intro_data_08: intro_data_08.o - ld65 -o intro_data_08 intro_data_08.o -C ../linker_scripts/apple2_9000.inc + ld65 -o intro_data_08 intro_data_08.o -C ../../linker_scripts/apple2_9000.inc intro_data_08.o: intro_data_08.s ca65 -o intro_data_08.o intro_data_08.s -l intro_data_08.lst @@ -396,7 +397,7 @@ intro_data_09.lz4: intro_data_09 truncate -s-8 intro_data_09.lz4 intro_data_09: intro_data_09.o - ld65 -o intro_data_09 intro_data_09.o -C ../linker_scripts/apple2_9000.inc + ld65 -o intro_data_09 intro_data_09.o -C ../../linker_scripts/apple2_9000.inc intro_data_09.o: intro_data_09.s ca65 -o intro_data_09.o intro_data_09.s -l intro_data_09.lst @@ -407,7 +408,7 @@ intro_data_09.o: intro_data_09.s #### LOADER: loader.o - ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1400.inc + ld65 -o LOADER loader.o -C ../../linker_scripts/apple2_1400.inc loader.o: loader.s ca65 -o loader.o loader.s -l loader.lst @@ -415,7 +416,7 @@ loader.o: loader.s #### LOADER2: loader2.o - ld65 -o LOADER2 loader2.o -C ../linker_scripts/apple2_1400.inc + ld65 -o LOADER2 loader2.o -C ../../linker_scripts/apple2_1400.inc loader2.o: loader2.s ca65 -o loader2.o loader2.s -l loader2.lst @@ -423,7 +424,7 @@ loader2.o: loader2.s #### TITLE: title.o - ld65 -o TITLE title.o -C ../linker_scripts/apple2_d00.inc + ld65 -o TITLE title.o -C ../../linker_scripts/apple2_d00.inc title.o: title.s loader.s ca65 -o title.o title.s -l title.lst @@ -434,19 +435,19 @@ title.o: title.s loader.s HELLO: hello.bas - ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + $(TOKENIZE) < hello.bas > HELLO #### HELLO2: hello2.bas - ../asoft_basic-utils/tokenize_asoft < hello2.bas > HELLO2 + $(TOKENIZE) < hello2.bas > HELLO2 ##### ENDING: ending.o - ld65 -o ENDING ending.o -C ../linker_scripts/apple2_1700.inc + ld65 -o ENDING ending.o -C ../../linker_scripts/apple2_1700.inc ending.o: ending.s \ pt3_lib_core.s pt3_lib_init.s pt3_lib_mockingboard_detect.s \ @@ -462,7 +463,7 @@ compress_test.inc: intro_graphics/07_soda/drinking01.png $(PNG2LZ4) asm intro_graphics/07_soda/drinking01.png test_lz4 >> compress_test.inc COMPRESS-TEST: compress_test.o - ld65 -o COMPRESS-TEST compress_test.o -C ../linker_scripts/apple2_2000.inc + ld65 -o COMPRESS-TEST compress_test.o -C ../../linker_scripts/apple2_2000.inc compress_test.o: compress_test.s lz4_decode.s compress_test.inc ca65 -o compress_test.o compress_test.s -l compress_test.lst diff --git a/games/space_bars/Makefile b/games/space_bars/Makefile index b0d10dce..d4a58c59 100644 --- a/games/space_bars/Makefile +++ b/games/space_bars/Makefile @@ -1,8 +1,9 @@ -include ../Makefile.inc +include ../../Makefile.inc -DOS33 = ../dos33fs-utils/dos33 -PNG_TO_40x48D = ../gr-utils/png_to_40x48d -B2D = ../bmp2dhr/b2d +DOS33 = ../../utils/dos33fs-utils/dos33 +PNG_TO_40x48D = ../../utils/gr-utils/png_to_40x48d +B2D = ../../utils/bmp2dhr/b2d +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft all: space_bars.dsk @@ -14,7 +15,7 @@ space_bars.dsk: SPACE_BARS HELLO #### SPACE_BARS: space_bars.o - ld65 -o SPACE_BARS space_bars.o -C ../linker_scripts/apple2_4000.inc + ld65 -o SPACE_BARS space_bars.o -C ../../linker_scripts/apple2_4000.inc space_bars.o: space_bars.s instructions.s \ level3_earth.s level6_saturn.s \ diff --git a/games/space_bars/README b/games/space_bars/README new file mode 100644 index 00000000..abf62b0e --- /dev/null +++ b/games/space_bars/README @@ -0,0 +1,5 @@ +proof of concept of a game that uses vapor-lock/cycle counting +to have mid-screen mode switches + +this is hard to do + diff --git a/games/tb_6502/Changelog b/games/tb_6502/Changelog new file mode 100644 index 00000000..05bf55e2 --- /dev/null +++ b/games/tb_6502/Changelog @@ -0,0 +1,134 @@ +8 April 2003 ++ Got simple hello world to compile and run when entered in hex + by hand [ od -t x1 hello ] into apple emulator. ++ start work on add-file-to-disk-image program + +10 April 2003 ++ Add to disk program now lets you add arbitrary files to a disk image. ++ Hello World program now works from "BRUN TB_6502" + +11 April 2003 ++ Move from default Apple start addy of $800 to $c00 so we can + use low-res page flipping (page1 is from $800-$bff) ++ Got print_text_xy routine working ++ Got blit working! VMW opening screen now comes up! + +14 April 2003 ++ RLE compress the sprites ++ get title screen displaying after figuring out minor problem + [was > 256 bytes] + +15 April 2003 ++ Add support for in-line x and y on put_text_xy + +16 April 2003 ++ Worked on dos3.3 utils rather than any useful menu stuff + +9 May 2003 ++ Have menu partially working, plus the about and phobos sprites loading + +15 May 2003 ++ Have "ABOUT" running the way I like, and not as cluttered as it was. + +28 May 2003 ++ Fix up printxy to correctly wrap at 8-byte boundary ++ have the story output text set up correctly. ++ add a "clear_bottom_ function. + +1 June 2003 ++ Story works ++ Spent 3 hours figuring out why put_text_xy have sporadic problem. + Stupid 6502 and no-16-bit addition. So very tired... + +12 June 2003 ++ Add arrow key support ++ Faster clear-screen + +13 June 2003 ++ Fix arrow keys being backwards, add escape key support + +21 June 2003 ++ Get normal TB left/right support, and clipping. ++ Add missile support ++ Fix various minor bugs. ++ Set up page flipping. Make clear_screen, clear_bottom, and blit + handle this properly ++ Get preliminary shields/level/score indicator working ++ (yes my gf was out of town, how can you guess) + + +11 July 2003 ++ Got an enemy to appear in upper left + +14 July 2003 ++ Enemy moving back and forth, but major heisenbug. Why, why, why? + +15 July 2003 ++ Not heisenbug at all. Was running the move-enemy routine when + no enemy.out. Glad I didn't post on usenet asking why my code + was broken! + +16 July 2003 ++ Minimal y movement implemented + +17 July 2003 ++ Added random number generator + +18 July 2003 ++ Re structure enemy handling code to do a copy to zero page first, + thus streamlining things ++ Have missile <-> enemy collision detection working ++ Have minimal score keeping working ++ Have minimal enemy spawning working ++ (Yes gf was out on work related business, how did you guess) + +29 August 2003 ++ Long delay due to move to Ithaca ++ Annoying work getting 16-bit BCD printing to work. Harder than + it looks! + +30 August 2003 ++ Implement Proper Collision detection ++ Enemies can actually damage you ++ Explosions no longer move ++ Have "GAME OVER" print when you die + +7 September 2003 ++ Have it print "Level 1" at start of level + +27 September 2003 ++ HUGELY busy with grad school. Trying to get this + done for minigames competition + +28 September 2003 ++ Actual varied levels working. Trying to adjust speed for playability. ++ Added two more enemies, as having 8 is easier to do with mask instructions + ;) ++ Attempting to add Boss. ++ Added shield increment every 100 points ++ S now toggles sound ++ P now pauses ++ While waiting for keypress, random number gen seeded ++ Updated timinings. yae is too slow :( am trusting + xapple2 as it seems to play most other games properly. + Should fire up my _real_ IIe. + +11 July 2004 ++ Finally got around to uploading on my real IIe. + Subjective delay timing, seems to work. ++ Boss seems to act irregularly? + +13 July 2004 ++ Scrolling stars implemented. + +18 July 2004 ++ "Ending" for end of level 1 ported over. ++ Bonuses added ++ Hi-score (though not to disk) implemented ++ Final balancing on my Apple IIe Platinum ++ Fix some minor bugs ++ Fixed bug where unitialized memory was causing star scrolling to mess up ++ Bumped version number to 1.0 + +24 July 2004 ++ Added sort-of-working paddle/joystick code. diff --git a/games/tb_6502/FAQ.tb_6502 b/games/tb_6502/FAQ.tb_6502 new file mode 100644 index 00000000..e21f368a --- /dev/null +++ b/games/tb_6502/FAQ.tb_6502 @@ -0,0 +1,233 @@ +FAQ. Some questions shamelessly stolen from the tb_asm FAQ + + +Q. Why? + +A. My friend John got a Gameboy + Advance for Christmas. He suggested I port my game + Tom Bombem to it. + + In actuality the specs of the GBA are similar to the machine I + originally wrote TB1 on. It was on a 386-33 with 320x200x256 graphics + and constrained to 640kB of RAM. The game was written in 16-bit + PASCAL with some 32-bit assembly. + + I somehow got side-tracked into an 8k Linux x86 text-mode version first, + and then it seemed obvious to port it to the 6502. Finally the disks + full of poorly written way-to-slow BASIC space games I wrote when + I was in elementary school have been vindicated! + + +Q. The game runs too fast/too slow! It is unplayable! + +A. The game has been balanced and tested on an actual Apple IIe platinum. + If you are running on an emulator, your emulator probably isn't + emulating 100% accurately. + If you are on a real Apple IIe... well it's probably my fault. + If you're clever you can find the timing code in the source + and fix it yourself. + + + +Q. Why did it take you so long to finish? + +A. I originally rushed to get this game entered in the 2003 Minigames + Competition in the 4k game section. I had to cut down on the + features a lot to get it to fit in 4k. + + Despite all this work, I finished 53rd or so. Most of the + complaints were negative because there aren't that many good Apple ][ + emulators out there, but a highlight was the infamous "blocky graphics" + comment by the Atari 2600 programmer. + + Anyway this experience burned me out on the whole concept for a bit, + plus I started grad school which sucked up most of my time. + + But anyway I got a chance to finish it this summer. + + +Q. How did you do the graphics? + +A. With The Gimp. Used 16 color indexed + palette. Saved as xpm. Edited with text editor. + + + +Q. Why LOW-RES graphics mode? + +A. Because I like 16 colors. High-res on the Apple ][ really isn't all + that great and can only do 4 colors or so with weird placement rules. + + And all of you people with Atari 800s and Commodore's feel free to laugh. + But my code here will run in full 16 color mode even on the Original + Apple ][ released in 1977. + + In any case I like blocky graphics, probably dating to my time doing + ANSI graphics for BBS's in the early 90s. + + And don't think low-res mode was a cheating way out. The Apple ][ + framebuffer is _horribly_ convoluted and non-linear. Apparently + this saved some chips on the memory refresh... but man is it a pain + to program. + + +Q. Why is all the text in this game SHOUTING AT ME? + +A. For extra perversity, I want the game to work on all machines + back to the original 1977 Apple ][. Lower-case letters were an + optional add-on until the Apple //e came out much later. + + + +Q. What is the high score? + +A. A bit of a silly question as its impossible to prove. + + The highest _possible_ score is 9999 I am pretty sure, due + to the limitations of a 16 bit BCD number (which is how the + score is stored). + + +Q. Why does the ship have its engines constantly on, even though + it is moving at a constant velocity? + +A. Ummmm... friction. Yeah... space friction. + + + +Q. Why are the stars moving so quickly? Are you going faster than light? + +A. If you look closely you'll notice the stars repeat. Hence you + are really flying very fast in a big circle. Hey, maybe that's + why the engine is constantly firing! + + + +Q. Where in that tiny ship are all of those missiles stored? + +A. In the seventh dimension. + + +Q. Why the seventh dimension? + +A. The others were all full. + + +Q. Why is there a guinea pig in the game? + +A. A local guinea pig threatened me with violence if I did not include + a picture of her. + + +Q. What have you learned from all this assembly programming? + +A. I'm just reminded what Professor Bruce Jacob always said... + A computer is just a state machine. + + + +Q. Why are there only 6 enemies / 2 missiles / shields go up at 100/ etc? + +A. Game balance. Just trying to keep it challenging yet not overwhlmingly + so. [For the original tb1 it was "because my 386 can't keep up" but + that should be less of a problem these days]. + + If you _must_ have it some other way, feel free to mess with the constants + on the first page of the tb_6502.s file, but I cannot guarantee what + the consequences might be! + + +Q. Will there be a sequel? + +A. Yes, it will be released shortly before either the release of + "Duke Nukem Forever (tm)" or the heat death of the universe, + which ever happens first. + + +Q. Why can't Vince stay consitent between "HISCORE" and "HIGH SCORE" + including all possibly variations of "HI-SCORE" "HIGH_SCORE" usw? + +A. The world may never know. + + +Q. What does "usw" mean? + +A. Und So Weiter. + + +Q. That wasn't helpful. + +A. This isn't a question. + + +Q. What's the highest level you can get to? + +A. No matter how you try, once you get to level 7 it will + keep repeating. This is because I multiply the level + by 16 in various places for enemy movement, and it it goes + above 7 then the byte will be negative causing + Bad Things(tm) to happen. + + +Q. Well why don't you modify the code so it doesn't go haywire + after level 7? + +A. I am lazy. Also it should be too hard to get to level 7 anyway + + +Q. What are the enemies supposed to be? + +A. An envelope, a clip-board, a cigarette, a telephone, a dollar-bill, + and an un-identified yellow thing, possibly a banana. All things + malicious marketers might have in excess. + The apple II version has in addition a green toothbrush and a + purple toupe. Those wacky marketers! + +Q. How come the stars appear in straight bands insteas of scattered in the + sky? + +A. Because my pseudo-random number algorithm is at times more pseudo + than random. + + +Q. Why does vince use the stack so often, when it would make much more + sense to backup the Y register to the zero page? + +A. Too much intel x86 programming has warped my mind into thinking + stack usage is a good way of mitigating limited register count. + + Must remind myself the zero page is like a 256-byte register file. + + + +Q. Why is the 6502 instruction set so obtuse? + +A. I HAVE NO IDEA. In coding I keep stumbling across instructions + that I think would be _so_ useful. But they don't exist. But + apparently the instructions I pine for are fairly obvious... + an enhanced 65C02 was released with "bonus" opcodes. Sadly + I cannot use them because of the aforementioned want of Apple ][ + compatibility [the 65C02 wasn't around until the //e. + + ABS (IND), X indexing : would be great working with structs. + BRA -- Branch Always : a great opcode name, but also remove + the need for 16-bit absolute JMP's when + a short branch would do + DEA -- Decrement Accumulator : + That's right, there's no way to decrement + the accumulator. You have to CLC clear + carry then ADC $FF. Yet you can dec + X or Y with one-byte. Weird. + INA -- Incrememnt Accumlator: + See DEA. Yes, even more perverse. Taking + 3 bytes to do what should be a common task. + PHX/PLX + PHY/PLY -- Push/Pop X/Y : + These would be so useful. Otherwise + you can only push/pop the accumulator. + STZ -- Store Zero to Memory : + Would save a lot of LDA #$0 / STA pairs. + TRB/TSB -- Test and Set/Reset bit: + Wow, getting even more CISC here. Atomic + test/set bit instructions. We're ready + for SMP now. diff --git a/games/tb_6502/Makefile b/games/tb_6502/Makefile new file mode 100644 index 00000000..b5e4db60 --- /dev/null +++ b/games/tb_6502/Makefile @@ -0,0 +1,21 @@ +include ../../Makefile.inc + +DOS33 = ../../utils/dos33fs-utils/dos33 +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft + +all: tb_6502.dsk + +tb_6502.dsk: TB_6502 + $(DOS33) -y tb_6502.dsk BSAVE -a 0x0C00 TB_6502 + +#TB_6502: tb_6502 +# make_b ./tb_6502 ./TB_6502 0xC00 + +TB_6502: tb_6502.o + ld65 -o TB_6502 tb_6502.o -C ./apple2_c00.inc + +tb_6502.o: tb_6502.s + ca65 -o tb_6502.o tb_6502.s -l tb_6502.lst + +clean: + rm -f *.lst *.o tb_6502 *~ add_to_disk TB_6502 a.out diff --git a/games/tb_6502/README.tb_6502 b/games/tb_6502/README.tb_6502 new file mode 100644 index 00000000..97a0a7e1 --- /dev/null +++ b/games/tb_6502/README.tb_6502 @@ -0,0 +1,130 @@ +TOM BOMBEM: Merciless Marauding Malicious Marketers + 6502 Apple IIe Edition +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +http://www.deater.net/weave/vmwprod/tb1/tb_6502.html + + by Vince Weaver + + version 1.1 -- 24 July 2004 + + +Quotes about tb_6502: +~~~~~~~~~~~~~~~~~~~~~ + + "The graphics are crude and blocky." + -- random Atari 2600 developer + + +System Requirements: +~~~~~~~~~~~~~~~~~~~~ + Apple ][ Computer + At least 32kB of RAM + Disk drive, or Super Serial Card to load game + + +Background: +~~~~~~~~~~~ + You are Tom Bombem, a shy new intern on Moonbase Alpha. + Somewhat against your will it has become your job to + defend Earth! See the "Story" option in the game + for the rest of the story. + + tb_6502 comes before "tb1: Invasion of the Inanimate Objects" + chronologically, for those who might care. + + +Keybindings: +~~~~~~~~~~~ + Use arrow keys, or i,j,k,m to manuever and navigate menus. + ' ' shoots and selects. + 'h' displays help. 's' toggles sound 'p' pauses + +Options/Hiscore File: +~~~~~~~~~~~~~~~~~~~~~ + + not implemented yet + +Game Play: +~~~~~~~~~~ + Manuever your ship avoiding the falling objects. Shoot them. + + Only 2 missiles can be in the air at the time [this is _not_ a bug. + it's a limit of your ship's missile guidance system]. + + Every 100 points your shields will increase. + + There are special bonuses you can earn at the end of each level. + + + No Shields Hit : going through an entire level without + having an enemy hit your ship + + All Enemies Destroyed : all enemies were destroyed before + scrolling off the screen. [Note, + ramming an enemy with your ship + _DOES_ count as destroying it. Just + don't let them get by you] + + Perfect Shot: Every missile fired hits an enemy. + + + At the end each level you fight the boss. Then the game starts over + with the enemies moving faster! + + +Compiling / Running: +~~~~~~~~~~~~~~~~~~~~ + + RUNNING: + Just obtain an apple emulator. Point it to the tb_6502.dsk image. + Upon booting it should run! + + Also, you can get a real Apple II computer and download the disk + image to a real floppy. That is a bit more complicated. + + COMPILING: + + The following compile instructions assume you are using Linux. + + * first you need the c65 package from: + http://www.cc65.org/ + + To install cc65 you need to unpack, and do a + "make -f make/gcc.mak" from the cc65/src directory. + + The utils we need are ca65 and ld65. Copy them somewhere in your + path (ie /usr/local/bin). + + * To make the disk image you will need the dos33fsprogs package + of mine, available from: + http://www.deater.net/weave/vmwprod/apple/dos33fs.html + Unpack and instal. "make; make install" + + * Now hopefully just type "make" in the tb_6502 directory and + the program should be assembled. "make disk" should copy + the new version to the disk image, assuming all the tools + are installed properly. + + + +About: +~~~~~~ + + When I was much younger, I would type in BASIC games on the Apple II. + I always wanted to write games myself, but the ones I wrote in BASIC + were too slow. I was just starting to learn assembly when we got + a 386 and I moved on to other things. + + But now, only 25 years too late, I finally wrote a playable game! + + The hope is maybe eventually using this as a stepping-board to + creating a Game Boy Advance TomBombem game. + + This game was originally written for the 4k mini-game competition. + It finished embarassingly low in the standings. I've added some + more features now so it is well over the 4k mark. + +Author: +~~~~~~~ + Vince Weaver + http://www.deater.net/weave/ + Special Thanks to KRG + 24 July 2004 + diff --git a/games/tb_6502/SINCOS b/games/tb_6502/SINCOS new file mode 100644 index 0000000000000000000000000000000000000000..c467de3ae57a01f5faf973aad090138bedf8cfcb GIT binary patch literal 146 zcmbQhz|O(N(7_$|?Lyn;_;)20JV@n2S4h@FL z3x)=#?rUg7oHjAgJY{q$z*CdKi$j-TfgwXAhY>?>gwAD+$P-2enhXgX<_rsr7%Dg{ ZA)4-?YHH`OLRQ_!VZ+cA!N9=41pvl_CtLsk literal 0 HcmV?d00001 diff --git a/games/tb_6502/TODO b/games/tb_6502/TODO new file mode 100644 index 00000000..9babbe0a --- /dev/null +++ b/games/tb_6502/TODO @@ -0,0 +1,3 @@ +Save high score to disk. + +OPTIMIZE! diff --git a/games/tb_6502/apple2_c00.inc b/games/tb_6502/apple2_c00.inc new file mode 100644 index 00000000..72588b0d --- /dev/null +++ b/games/tb_6502/apple2_c00.inc @@ -0,0 +1,12 @@ +MEMORY { + ZP: start = $00, size = $1A, type = rw; + RAM: start = $C00, size = $8E00, file = %O; +} + +SEGMENTS { +CODE: load = RAM, type = ro; +RODATA: load = RAM, type = ro; +DATA: load = RAM, type = rw; +BSS: load = RAM, type = bss, define = yes; +ZEROPAGE: load = ZP, type = zp; +} diff --git a/games/tb_6502/tb_6502.dsk b/games/tb_6502/tb_6502.dsk new file mode 100644 index 0000000000000000000000000000000000000000..820c20133aa4345ef868c0b9c50ea8c09c31187a GIT binary patch literal 143360 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�hmK+XaKx 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 M{wMyQlKKDt1GPtJzW@LL literal 0 HcmV?d00001 diff --git a/games/tb_6502/tb_6502.s b/games/tb_6502/tb_6502.s new file mode 100644 index 00000000..14ea471c --- /dev/null +++ b/games/tb_6502/tb_6502.s @@ -0,0 +1,4291 @@ +.define EQU = + +; blt = bcc +; bge = bcs + +;; ZERO PAGE +CH EQU $24 +CV EQU $25 +BASL EQU $28 +BASH EQU $29 +H2 EQU $2C +COLOR EQU $30 +YSAV EQU $34 +YSAV1 EQU $35 +RANDOM_SEED EQU $43 + +;; Our Zero Page Allocations + +PADDLE_STATUS EQU $CA +HISCORE_1 EQU $CB +HISCORE_2 EQU $CC +HISCORE_3 EQU $CD +HISCORE_H EQU $CE +HISCORE_L EQU $CF + +BOSS_X EQU $D0 +BOSS_XADD EQU $D1 +BOSS_COUNT EQU $D2 +BOSS_SMOKE EQU $D3 +BOSS_EXPLODING EQU $D4 +BOSS_WAITING EQU $D5 +BOSS_HITS EQU $D6 +BOSS_SHOOTING EQU $D7 + +ENEMIES_SPAWNED EQU $D8 +ENEMY_TYPE EQU $D9 +ENEMY_WAVE EQU $DA +CURRENT_INIT_X EQU $DB +CURRENT_ENEMY_KIND EQU $DC +TOTAL_ENEMIES_OUT EQU $DD +SCROLL EQU $DE +SOUND_ON EQU $DF + +SHIPX EQU $E0 +SHIPXADD EQU $E1 +ENEMY_PL EQU $E2 +ENEMY_PH EQU $E3 +MISSILE_PL EQU $E4 +MISSILE_PH EQU $E5 +GR_PAGE EQU $E6 +LEVEL EQU $E7 +SHIELDS EQU $E8 +SCOREL EQU $E9 +SCOREH EQU $EA +BONUS_FLAGS EQU $EB + +BCD_BYTEH EQU $EC +BCD_BYTE EQU $ED + +COL_X1 EQU $EC +COL_X2 EQU $ED +COL_X3 EQU $EE +COL_X4 EQU $EF + +ENEMY_EXPLODING EQU $F0 +ENEMY_KIND EQU $F1 +ENEMY_X EQU $F2 +ENEMY_Y EQU $F3 +ENEMY_XADD EQU $F4 +ENEMY_YADD EQU $F5 +ENEMY_XMIN EQU $F6 +ENEMY_XMAX EQU $F7 + +BETWEEN_DELAY EQU $F8 +ENEMY_WAIT EQU $F9 + +STRINGL EQU $FA +STRINGH EQU $FB +PARAM2 EQU $FC +RESULT EQU $FD +LASTKEY EQU $FE +TEMP EQU $FF + +;; VECTORS +BASIC EQU $3D0 ;; VECTOR for return to Applesoft + +KEYPRESS EQU $C000 +KEYRESET EQU $C010 + +SPEAKER EQU $C030 + +;; SOFT SWITCHES +GR EQU $C050 +TEXT EQU $C051 +FULLGR EQU $C052 +TEXTGR EQU $C053 +PAGE0 EQU $C054 +PAGE1 EQU $C055 +LORES EQU $C056 +HIRES EQU $C057 + +PADDLE_BUTTON0 EQU $C061 +PADDL0 EQU $C064 +PTRIG EQU $C070 + +;; MONITOR ROUTINES +HLINE EQU $F819 ;; HLINE Y,$2C at A +VLINE EQU $F828 ;; VLINE A,$2D at Y +CLRSCR EQU $F832 ;; Clear low-res screen +CLRTOP EQU $F836 ;; clear only top of low-res screen +SETCOL EQU $F864 ;; COLOR=A +BASCALC EQU $FBC1 ;; +HOME EQU $FC58 ;; Clear the text screen +WAIT EQU $FCA8 ;; delay 1/2(26+27A+5A^2) us +SETINV EQU $FE80 ;; INVERSE +SETNORM EQU $FE84 ;; NORMAL +COUT1 EQU $FDF0 ;; output A to screen + + +;; GAME PARAMETERS +NUM_MISSILES EQU 2 +NUM_ENEMIES EQU 6 +UP_SHIELDS EQU 32 +WAVE_SIZE EQU 16 +WAVES_TILL_BOSS EQU 5 + +;; BONUS_FLAGS +PERFECT_SHIELDS EQU $80 +PERFECT_KILLS EQU $40 +PERFECT_AIM EQU $1 + + +;========================================================== +; MAIN() +;========================================================== + + + ;============================== + ; back up part of the zero page + ;============================== + + lda #>zero_page_save + sta BASH + lda #(score_string+31) + sta STRINGH + lda #<(score_string+31) + sta STRINGL + jsr print_high_score + + ;============= + ; put vmw logo + ;============= + + lda #$7 ; y=7 + sta CV + lda #$8 ; x=8 + sta CH + lda #>vmw_sprite + sta STRINGH + lda #vmw_string ; string = vmw_string + sta STRINGH + lda #opener_sprite + sta STRINGH + lda #opener_sprite_2 + sta STRINGH + lda #mercy_string ; string = MMMM + sta STRINGH + lda #help_string ; string = "H FOR HELP" + sta STRINGH + lda #zero_page_save + sta BASH + lda #new_game_string ; string starts at "NEW GAME" + sta STRINGH + lda #vince_sprite + sta STRINGH + lda #about_lines + sta STRINGH + lda #help_lines + sta STRINGH + lda #phobos_sprite + sta STRINGH + lda #story_lines + sta STRINGH + lda #evil_ship_sprite + sta STRINGH + lda #tom_sprite + sta STRINGH + lda #you_are_tom + sta STRINGH + lda #earth_sprite + sta STRINGH + lda #ending_lines + sta STRINGH + lda #susie_sprite + sta STRINGH + lda #susie_lines + sta STRINGH + lda #tom_head_sprite + sta STRINGH + lda #tom_sigh + sta STRINGH + lda #missile_0 ; clear the missile struct + sta MISSILE_PH ; should make this clear all BSS + lda #enemy_0 + sta ENEMY_PH + lda #(level_string+9) + sta STRINGH + lda #<(level_string+9) + sta STRINGL + + lda #0 + sta BCD_BYTEH + lda LEVEL + sta BCD_BYTE + jsr print_bcd_byte + + + ;====================== + ; Print level on screen + ;====================== + + lda #>(level_string_xy) + sta STRINGH + lda #<(level_string_xy) + sta STRINGL + + jsr print_text_xy + + ldx #20 + jsr wait_X_100msec ; pause for 3 seconds + bit KEYRESET ; clear keyboard + + ;================================== + ; Enter graphics mode, clear screen + ;================================== + + jsr set_page0_gr ; set graphics mode + jsr clear_screen ; clear screen + + +draw_stars: + + ;===================== + ; Setup star field + ;===================== + + lda #>(star_field) + sta STRINGH + lda #<(star_field) + sta STRINGL + + ldy #$0 +star_init: + jsr random_number + and #$9f + clc + adc #$4 + sta (STRINGL),Y + iny + lda #$0 + sta (STRINGL),Y + iny + bne star_init + + lda #$0 + sta SCROLL + + + ;/========================\ + ;+ + + ;+ MAIN GAME LOOP + + ;+ + + ;\========================/ + +main_game_loop: + jsr clear_screen ; clear screen + jsr show_stars + + + + + +done_scrolling: + + ; ================================ + ; put out new enemies (if needed) + ; ================================ + + inc BETWEEN_DELAY ; inc how long we've delayed + lda BETWEEN_DELAY ; load it in + cmp ENEMY_WAIT ; have we waited long enough? + beq reset_delay + + jmp move_enemies ; if not, go on to movement +reset_delay: + + ; delay==wait, so attempt to put out new enemy + + lda BETWEEN_DELAY + and #$1 + sta BETWEEN_DELAY ; reset delay + + ; special case for boss + + lda #$9 ; if boss, don't keep track of + cmp ENEMY_TYPE ; how many enemies were spawned + bne not_boss_dont_clear + + lda #$1 ; store 1 so we don't increment wave + sta ENEMIES_SPAWNED + +not_boss_dont_clear: + + ; see if we are at a new wave + ; basically, if 16 have been spawned, change + + lda ENEMIES_SPAWNED + and #$0f + bne same_enemy_type ; if not 16 gone by, move on + + ;======================= + ; change the enemy type + + inc ENEMIES_SPAWNED + + jsr random_number + and #$7 ; get a random number 0-7 + sta ENEMY_TYPE + + inc ENEMY_WAVE + + lda ENEMY_WAVE ; have we gone enough waves to reach boss? + cmp #WAVES_TILL_BOSS + bne not_boss_yet + + lda #$8 + sta ENEMY_TYPE + + + +not_boss_yet: + + ; set various constants + ; these may be overriden later + + + lda #20 + sec + sbc LEVEL + sta ENEMY_WAIT ; enemy_wait=20-level + + ; set kind and init x to be random by default + + lda #$ff + sta CURRENT_ENEMY_KIND + sta CURRENT_INIT_X + + + +same_enemy_type: + + ; find empty enemy slot + + ldy #$0 ; point to enemies[0] + tya + +find_empty_enemy: + pha + lda (ENEMY_PL),Y ; get enemy[y].out + beq add_enemy + + pla + clc + adc #$9 + tay + cpy #(NUM_ENEMIES*9) + bne find_empty_enemy + + + jmp move_enemies ; no empty, slots, move on + + +add_enemy: + pla + + ;============================================== + ; First see if we must wait for enemy to clear + ; types 2 and 8 + + lda ENEMY_TYPE + cmp #$2 + + bne check_type_8 + + lda TOTAL_ENEMIES_OUT + beq change_to_type_3 + jmp move_enemies +change_to_type_3: + lda #$3 + sta ENEMY_TYPE + + jsr random_number + and #$8 + sta CURRENT_ENEMY_KIND + + jsr random_number + and #$1F ; mask off so 0-31 + clc + adc #$2 + asl A + sta CURRENT_INIT_X + jmp setup_enemy_defaults + +check_type_8: + + cmp #$8 + beq before_boss_stuff + jmp check_type_9 + +before_boss_stuff: + + ;====================== + ; before boss stuff + + lda TOTAL_ENEMIES_OUT + beq prepare_for_boss + jmp move_enemies + +prepare_for_boss: + + ;=============== + ; HANDLE BONUSES + ;=============== + + ; Set text mode + + jsr set_page0_text + jsr HOME + + ; Print "BONUS POINTS" + + lda #>bonus_string + sta STRINGH + lda #bonus_shields + sta STRINGH + lda #bonus_kills + sta STRINGH + lda #bonus_aim + sta STRINGH + lda #no_bonus_string + sta STRINGH + lda #34 + + lda CURRENT_INIT_X + bpl store_init_x + + jsr random_number + and #$1f + clc + adc #$2 + asl + +store_init_x: + iny ; X + sta (ENEMY_PL),Y + + ; enemy_y is always 0 by default + + iny ; Y + lda #$0 + sta (ENEMY_PL),Y + + lda #$0 + iny + sta (ENEMY_PL),Y ; xadd + iny + sta (ENEMY_PL),Y ; yadd + lda #$2 + iny + sta (ENEMY_PL),Y ; xmin + iny + lda #$24 + sta (ENEMY_PL),Y ; ymin + + dey ; xmin + dey ; yadd + dey ; xadd + + + ;=========================================== + ; Enemy specific inits + + lda ENEMY_TYPE + beq enemy_type_0 + cmp #$1 + beq enemy_type_1 + jmp enemy_type_2 + +enemy_type_0: +enemy_type_1: + + ;================================ + ; ENEMY TYPE 0 and 1 + ; diagonal, no wait + ; movement proportional to level + + lda LEVEL ; xadd = level + sta (ENEMY_PL),Y + + iny + + lsr A + ora #$1 + sta (ENEMY_PL),Y ; yadd = level/2 + jmp move_enemies + +enemy_type_2: + ;===================== + ; Enemy Type 2 + ; just a place-holder + ; waits for enemies to die then moves on to 3 + + cmp #$2 + bne enemy_type_3 + jmp move_enemies + + +enemy_type_3: + + cmp #$3 + bne enemy_type_4 + + ;====================== + ; Enemy type 3 + + lda #$1 + sta (ENEMY_PL),Y ; xadd=1 + + iny + + lda LEVEL + sta (ENEMY_PL),Y ; yadd=level + + jmp move_enemies + +enemy_type_4: + + cmp #$4 + bne enemy_type_5 + + + ;========================= + ; Enemy Type 4 + ; Horizontal, then fall + + lda #$2 + sta (ENEMY_PL),Y ; xadd = 2 + + iny + + jsr random_number + ora #$80 ; set negative + sta (ENEMY_PL),y ; yadd = -(random%128) + ; this means bop back and forth a random + ; time, then drop + + jmp move_enemies + + +enemy_type_5: + cmp #$5 + bne enemy_type_6 + + ;======================== + ; Enemy Type 5 + ; "wiggle" + + lda #$1 + sta (ENEMY_PL),y ; xadd=1 + + iny + lda LEVEL + sta (ENEMY_PL),y ; yadd=2 + + iny + jsr random_number + and #$0f + clc + adc #$2 + sta (ENEMY_PL),y ; xmin=(rand%16)+2 + + + dey ; yadd + dey ; xadd + dey ; y + dey ;x + asl A + sta (ENEMY_PL),y + iny ;y + iny ; xadd + iny ; yadd + iny ; xmin + + jsr random_number + and #$0f + clc + adc (ENEMY_PL),Y + adc #$02 + iny + sta (ENEMY_PL),Y ; xmax = xmin+(rand%16)+2 + + jmp move_enemies + + +enemy_type_6: + cmp #$6 + beq enemy_type_7 + cmp #$7 + beq enemy_type_7 + jmp enemy_type_8 +enemy_type_7: + ;===================== + ; Enemy Types 6+7 + ; "Rain" + + + + jsr random_number + and #6 + bne no_use_own_x + + dey ; y + dey ; x + + lda SHIPX + cmp #$2 + bpl shipx_ok + lda #$2 ; stupid bug where gets stuck is < xmin + +shipx_ok: + + asl A + sta (ENEMY_PL),Y ; one-in-four chance we use shipx as X + + iny ; y + iny ; xadd + +no_use_own_x: + + lda #$0 + sta (ENEMY_PL),Y ; xadd=0 + iny + lda #$1 + sta (ENEMY_PL),Y ; yadd = 1 + + jmp move_enemies + +enemy_type_8: +enemy_type_9: + + ;====================== + ; Things flung by boss + + + dey ; y + dey ; x + + lda BOSS_X + clc + adc #$5 + asl A + sta (ENEMY_PL),Y ; enemy_x=boss_x+5 + + iny + lda #$3 + asl A + asl A + sta (ENEMY_PL),Y ; enemy_y=3 + + + iny + lda #$0 + sta (ENEMY_PL),Y ; xadd=0 + + iny + lda #$2 + sta (ENEMY_PL),Y ; yadd=2 + + + + + +move_enemies: + + ;============================================== + ; Move Enemies! (first thing, if no new added) + ;============================================== + + ldy #$0 ; point to enemies[0] +handle_enemies: + + tya + pha ; store y on stack + + lda (ENEMY_PL),Y ; get enemy[y].out + bne load_enemy_zero_page ; if enemy.out then we are good + + jmp skip_to_next_enemy ; enemy is not out, so skip to next + + + + ;========================================== + ; load this enemy stuff into zero page for + ; easier access + ;========================================== + +load_enemy_zero_page: + ldx #ENEMY_EXPLODING +load_to_zero_page: + iny ; point to exploding + lda (ENEMY_PL),Y + sta 0,X ; store to zero page + inx + cpx #(ENEMY_XMAX+1) ; see if reached end + bne load_to_zero_page ; if not keep copying + + ;================================ + ; skip all movement and collision + ; if exploding + ;================================ + + lda ENEMY_EXPLODING + beq move_enemy_x + jmp draw_enemy + + ;================================ + ; Start the enemy movement engine + ;================================ + + + ;======== + ; Move X + ;======== + +move_enemy_x: + clc + lda ENEMY_X ; X + adc ENEMY_XADD ; x+=xadd + sta ENEMY_X + + lsr A + + cmp ENEMY_XMIN ; are we less than xmin? + bmi switch_dir_enemy_x ; if so, switch direction + + cmp ENEMY_XMAX ; are we greater than xmax? + bpl switch_dir_enemy_x ; if so, switch direction + + jmp move_enemy_y + + +switch_dir_enemy_x: + + ; switch X direction + + lda #$0 ; load zero + sec + sbc ENEMY_XADD ; 0 - ENEMY_XADD + sta ENEMY_XADD ; store it back out, negated + jmp move_enemy_x ; re-add it in + + ;======== + ; Move Y + ;======== + +move_enemy_y: + + lda #$0 ; load in zero + cmp ENEMY_YADD ; compare to YADD + + bmi no_y_special_case ; if minus, we have special case + + inc ENEMY_YADD + bne done_enemy_y + + lda #$0 + sta ENEMY_XADD + lda #$2 + sta ENEMY_YADD + + ; increment y + ; is it > 0? + ; if not keep going + ; if so, yadd=level*2 + + jmp done_enemy_y + +no_y_special_case: + clc + lda ENEMY_Y ; get Y + adc ENEMY_YADD ; y+=yadd + sta ENEMY_Y ; store back out + + lsr A + lsr A + + cmp #$12 ; is y<=12? + bmi done_enemy_y ; if so no need to do anything + beq done_enemy_y + + ; off screen + + pla ; pop saved Y off stack + tay + pha ; push y back on stack + + lda #$0 + sta (ENEMY_PL),Y ; set enemy[i].out=0 + + dec TOTAL_ENEMIES_OUT + + lda BONUS_FLAGS + and #<(~PERFECT_KILLS) + sta BONUS_FLAGS + + jmp skip_to_next_enemy ; skip to next enemy + + +done_enemy_y: + + ;=============== + ; Done Movement + ;=============== + + + ;====================== + ; Check for Collisions + ;====================== + + + ;================================== + ; Check ENEMY <> MISSILE collision + ;================================== + +check_enemy_missile_collision: + + ldy #$0 + sty YSAV +check_missile_loop: + lda (MISSILE_PL),Y + beq missile_not_out + + iny ; point to missile.x + lda (MISSILE_PL),Y ; load missile.x + + sta COL_X1 + sta COL_X2 + + lda ENEMY_X + lsr A + sta COL_X3 + clc + adc #3 + sta COL_X4 + + jsr check_inside + + bcc missile_done + +x_in_range: + + iny + lda (MISSILE_PL),Y ; load missile.y + + sta COL_X3 + clc + adc #2 + sta COL_X4 + + lda ENEMY_Y + lsr A + lsr A + sta COL_X1 + clc + adc #1 + sta COL_X2 + + jsr check_inside + + bcc missile_done + + +horrible_explosion: + + ; clear missile + + ldy YSAV + lda #$0 + sta (MISSILE_PL),Y + + ; clear enemy + + lda #$1 + sta ENEMY_EXPLODING + lda #$40 + sta ENEMY_KIND + + jsr inc_score + + jmp draw_enemy + + +missile_done: +missile_not_out: + ldy YSAV + iny + iny + iny + sty YSAV + cpy #(NUM_MISSILES*3) + bne check_missile_loop + + ;================================= + ; Done missile <> enemy collision + ;================================= + + + ;==================================== + ; check for ship <-> enemy collision + ;==================================== + + lda SHIPX + sta COL_X3 + clc + adc #8 + sta COL_X4 ; big check is shipx - shipx+8 + + lda ENEMY_X + lsr A + sta COL_X1 + clc + adc #2 + sta COL_X2 ; small check enemy_x - enemy_x+2 + + jsr check_inside ; check if overlap + + bcc draw_enemy ; if not, move ahead + + lda #16 + sta COL_X3 + lda #18 + sta COL_X4 ; big check is 16 - 18 + + lda ENEMY_Y + lsr A + lsr A + sta COL_X1 + clc + adc #$1 + sta COL_X2 ; little check is enemy_y - enemy_y+1 + + jsr check_inside ; check if overlap + + bcc draw_enemy ; if not, move ahead + + ; make the enemy explode + + lda #$1 + sta ENEMY_EXPLODING + lda #$40 + sta ENEMY_KIND + + dec SHIELDS + jsr update_shields ; move shields down + + lda #<(~PERFECT_SHIELDS) ; (~PERFECT_SHIELDS) + and BONUS_FLAGS ; remove perfect shield bonus + sta BONUS_FLAGS + + + ;===================================== + ; Done ship <> enemy collision detect + ;===================================== + + +draw_enemy: + + ; See if the enemy is currently exploding + ; if so, do explosion stuff + +check_enemy_explode: + lda ENEMY_EXPLODING ; load enemy[i].exploding + beq not_exploding ; if 0 then not exploding + +handle_exploding: + + jsr click ; make some noise + + clc + lda ENEMY_KIND ; move to next step in explosion + adc #$4 + sta ENEMY_KIND + + cmp #$58 ; have we cycles through explosion? + bne draw_enemy_sprite ; if not, we are still exploding + + dec TOTAL_ENEMIES_OUT ; total_enemies_out-- + + pla + tay ; load y + pha + + lda #$0 ; enemy[i].out=0 + sta (ENEMY_PL),Y + + jmp skip_to_next_enemy + + + ; point to enemies_x + ; goto enemies_xy + + +not_exploding: + + + +draw_enemy_sprite: + + ; point to proper sprite + + lda #>enemy_sprite0 ; point to the missile sprite + sta STRINGH + lda #boss_sprite + sta STRINGH + lda #smoke_sprite0 ; point to the missile sprite + sta STRINGH + lda #laser_sprite0 ; point to the missile sprite + sta STRINGH + lda #smoke_sprite0 ; point to the missile sprite + sta STRINGH + lda #missile_sprite ; point to the missile sprite + sta STRINGH + lda #ship_sprite + sta STRINGH + lda #shields_string + sta STRINGH + lda #score_string + sta STRINGH + lda #level_string + sta STRINGH + lda #game_over_string + sta STRINGH + lda #(score_string+31) + sta STRINGH + lda #<(score_string+31) + sta STRINGL + jsr print_high_score + + jsr HOME + + ; print new high score message + + lda #>new_high_score_string + sta STRINGH + lda #high_score_string + sta STRINGH + lda #shields_string + sta STRINGH + lda #(score_string+7) + sta STRINGH + lda #<(score_string+7) + sta STRINGL + + tya + pha ; save Y on stack + + + ldy #$0 + + lda SCOREH + sta BCD_BYTEH + + lda SCOREL + sta BCD_BYTE + jsr print_bcd_word + + pla ; restore Y + tay + + rts + +;====================== +; print high_score +;====================== + ; location to output to in STRINGH/STRINGL + +print_high_score: + tya + pha ; save Y on stack + + ldy #$0 + + lda HISCORE_H + sta BCD_BYTEH + + lda HISCORE_L + sta BCD_BYTE + jsr print_bcd_word + + pla ; restore Y + tay + + rts + +;========================================================== +; print_bcd_word +;========================================================== + ; string to output in STRINGH/STRINGL + ; byte to output in BCD_BYTE + +print_bcd_word: + + + lda BCD_BYTEH + lsr A + lsr A + lsr A + lsr A + and #$f ; mask low nybble + bne to_ascii_thou + + lda #$A0 ; load a space + + jmp write_thousands +to_ascii_thou: + adc #$B0 ; covert to ascii + +write_thousands: + sta (STRINGL),Y ; store output + + iny + + lda BCD_BYTEH + + and #$f + bne to_ascii_hun + + cmp BCD_BYTEH + + bne to_ascii_hun + + lda #$A0 + jmp write_hundreds + +to_ascii_hun: + adc #$B0 +write_hundreds: + sta (STRINGL),Y + + iny + + +print_bcd_byte: + + lda BCD_BYTE + lsr A + lsr A + lsr A + lsr A + and #$f ; mask low nybble + bne to_ascii_tens ; if not zero, convert to ascii + + cmp BCD_BYTEH + + bne to_ascii_tens + + lda #$A0 + + jmp write_tens +to_ascii_tens: + adc #$B0 ; covert to ascii + +write_tens: + sta (STRINGL),Y ; store output + + iny ; point one lower + + + lda BCD_BYTE + clc + and #$f + adc #$B0 + + sta (STRINGL),Y + + + rts + +;========================================================== +; check inside +;========================================================== + ; Simple collision detection. Have small line x1<->x2 + ; Want to see if it overlaps long line x3<---------->x4 + ; so: + ; if ((x1>x3)&&(x1x3) && (x2 40? + bmi bottom_loop ; if not, loop + + lda #$80 ; go to next line [they are $80 apart] + clc + adc BASL ; increment base + sta BASL ; store it out + lda #$0 ; load 0 into A + adc BASH ; carry into top byte if need be + sta BASH ; and store out + + inx ; increment line count + cpx #$4 ; have we done 4 + bcc bottom_y ; if not, loop + + rts + + +;========================================================== +; print X strings +;========================================================== + ; + ; +print_x_strings: + stx TEMP + jsr print_text_xy + ldx TEMP + dex + bne print_x_strings + rts + + +;========================================================== +; Print text x,y +;========================================================== + ; x=ch y=cv + ; string=string_addr + +print_text_xy: + ldy #$0 ; clear IY + lda (STRINGL),Y ; load x from memory + sta CH ; store to CH + iny ; point to next value + + lda (STRINGL),Y ; load y from memory + sta CV ; store to CV + ; point to beginning of string + + clc + lda #$2 + adc STRINGL + sta STRINGL + lda #$0 + adc STRINGH + sta STRINGH + +print_text: + ldy #$0 + lda CV + jsr BASCALC ; get the address of y in BASH:BASL + clc ; clear the carry + lda BASL ; load BASL + adc CH ; add x + sta BASL ; store BASL back out + +output_loop: + lda (STRINGL),Y ; load char from string_addr+y + beq print_done ; if null terminated, done + sta (BASL),Y ; store to BASH:BASL + iny ; IY++ + jmp output_loop ; loop + +print_done: + iny + tya ; transfer y to accumulator + + + adc STRINGL ; add y and stringl + sta STRINGL ; and store it out + lda #$0 ; clear accumulator + adc STRINGH ; add with carry from prev stringh + sta STRINGH ; and save it + + + rts + + + + +;========================================================== +; clear_screen +;========================================================== + ; + +clear_screen: + + ldx #$0 +clear_0: + cpx #$0 + bne clear_1 + lda GR_PAGE + sta BASH + lda #$0 + sta BASL + ldy #$78 + jmp clear_it +clear_1: + cpx #$1 + bne clear_2 + lda #$80 + sta BASL + ldy #$78 + jmp clear_it +clear_2: + cpx #$2 + bne clear_3 + clc + lda #$1 + adc GR_PAGE + + sta BASH + ldy #$78 + jmp clear_it +clear_3: + cpx #$3 + bne clear_4 + lda #$0 + sta BASL + ldy #$78 + jmp clear_it +clear_4: + cpx #$4 + bne clear_5 + clc + lda #$2 + adc GR_PAGE + sta BASH + ldy #$50 + jmp clear_it +clear_5: + cpx #$5 + bne clear_6 + lda #$80 + sta BASL + ldy #$50 + jmp clear_it +clear_6: + cpx #$6 + bne clear_7 + clc + lda #$3 + adc GR_PAGE + sta BASH + ldy #$50 + jmp clear_it +clear_7: + cpx #$7 + bne clear_8 + lda #$0 + sta BASL + ldy #$50 + jmp clear_it +clear_8: + + rts + +clear_it: + lda #$00 +clear_loop: + dey + + sta (BASL),Y + + bne clear_loop + + inx + jmp clear_0 + +;========================================================== +; show_stars +;========================================================== +; + +show_stars: + + + lda #>star_field ; Load the star offsets + sta STRINGH ; array into + lda # +#include /* strncpy() */ +#include /* isdigit() */ +#include /* open() */ +#include /* close() */ + +char dos_color_to_apple[16]= +{0, /* 0 black */ + 2, /* 1 blue */ + 4, /* 2 green */ + 7, /* 3 cyan */ + 1, /* 4 red */ + 3, /* 5 purple */ + 8, /* 6 brown */ + 10,/* 7 l grey */ + 5, /* 8 d grey */ + 6, /* 9 l blue */ +12, /*10 l green */ +14, /*11 l cyan */ + 9, /*12 l red */ +11, /*13 pink */ +13, /*14 yellow */ +15, /* 15 white */ +} +; + +int get_number(char *string, int *pointer) { + + int temp_number; + + + if (string[*pointer]=='0') { + + /* Hexadecimal */ + if (string[*pointer+1]=='x') { + (*pointer)++; + + (*pointer)++; + temp_number=0; + while(isxdigit(string[*pointer])) { + if ((string[*pointer]>='a') && (string[*pointer]<='f')) + temp_number=16*temp_number+(10+(string[*pointer]-'a')); + if ((string[*pointer]>='A') && (string[*pointer]<='F')) + temp_number=16*temp_number+(10+(string[*pointer]-'A')); + if ((string[*pointer]>='0') && (string[*pointer]<='9')) + temp_number=16*temp_number+(string[*pointer]-'0'); + (*pointer)++; + } + } + else { + /* Octal */ + temp_number=0; + while(isdigit(string[*pointer])) { + temp_number=8*temp_number+(string[*pointer]-'0'); + (*pointer)++; + } + } + + } + else { + /* Decimal */ + temp_number=0; + while(isdigit(string[*pointer])) { + temp_number=10*temp_number+(string[*pointer]-'0'); + (*pointer)++; + } + } + + return temp_number; + +} + + +int main(int argc, char **argv) { + + FILE *input,*output; + + char input_filename[]="sprites"; + int pointer,temp_pointer; + char input_line[BUFSIZ]; + char temp_string[BUFSIZ]; + int color=0,oldcolor,run; + + input=fopen(input_filename,"r"); + if (input==NULL) goto file_error; + + + while(1) { + + if ( fgets(input_line,BUFSIZ,input) ==NULL) goto close_file; + + pointer=0; + + while(pointer14)) { + printf("$%X,",(run<<4)+dos_color_to_apple[oldcolor]); + run=0; + } + run++; + oldcolor=color; + + while(!isdigit(input_line[pointer])) pointer++; + } + if (color!=0) { + printf("$%X,",(run<<4)+dos_color_to_apple[color]); + } + + + printf("$00\n"); + goto done_with_string; + } + + else { + printf("Unknown directive!\n"); + goto close_file; + } + + } + /* end of label */ + if (input_line[pointer]==':') { + + temp_pointer=pointer; + while( (temp_pointer>0) && + (input_line[temp_pointer]!='\t') && + (input_line[temp_pointer]!=' ')) temp_pointer--; + + strncpy(temp_string,input_line+temp_pointer,pointer-temp_pointer); + temp_string[pointer]='\0'; + printf("\t.byte $00\n"); + printf("%s:\n",temp_string); + + } + + + + + pointer++; + } +done_with_string: ; + + + } + + + +close_file: + if (input!=NULL) fclose(input); + +file_error: + return 0; +} diff --git a/games/tb_6502/tools/string_to_apple.c b/games/tb_6502/tools/string_to_apple.c new file mode 100644 index 00000000..b6de2bb7 --- /dev/null +++ b/games/tb_6502/tools/string_to_apple.c @@ -0,0 +1,26 @@ +#include +#include + +int main(int argc, char **argv) { + + char string[BUFSIZ]; + int i; + + while(1) { + fgets(string,BUFSIZ,stdin); + if (feof(stdin)) goto done; + + printf(";# %s\n",string); + printf(".byte\t"); + + printf("$%X",string[0]+128); + + for (i=1;i + +int random_num(int seed) +{ + + static int our_seed; + + if (seed!=-1) our_seed=seed; + + if (our_seed==0) our_seed=13; + + our_seed<<=1; + if (our_seed & 0x100) our_seed^=0x87; + + our_seed&=0xff; + + return our_seed; + +} + +int main(int argc, char **argv) +{ +int i; + int frequency[256]; + for(i=0;i<256;i++) frequency[i]=0; + + for(i=0;i<4096;i++) + frequency[random_num(-1)]++; + + for(i=0;i<256;i++) + printf("%i : %i\n",i,frequency[i]); + + +} + diff --git a/games/tb_6502/tools/wait.c b/games/tb_6502/tools/wait.c new file mode 100644 index 00000000..a28a8f37 --- /dev/null +++ b/games/tb_6502/tools/wait.c @@ -0,0 +1,15 @@ +#include + +int main(int argc, char **argv) { + + int i; + + for(i=0;i<256;i++) { + printf("%i = %x = %i\n",i,i,(26+27*i+5*i*i)/2); + } + + return 0; + + + +} diff --git a/games/tfv/Makefile b/games/tfv/Makefile index 924a0c14..929ceab5 100644 --- a/games/tfv/Makefile +++ b/games/tfv/Makefile @@ -1,15 +1,18 @@ -include ../Makefile.inc +include ../../Makefile.inc + +DOS33 = ../../utils/dos33fs-utils/dos33 +PNG2GR = ../../utils/gr-utils/png2gr +PNG2RLE = ../../utils/gr-utils/png2rle + +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft -DOS33 = ../dos33fs-utils/dos33 -PNG2GR = ../gr-utils/png2gr -PNG2RLE = ../gr-utils/png2rle ARTDIR = ./art all: tfv.dsk $(DOS33): - cd ../dos33fs-utils && make + cd ../../utils/dos33fs-utils && make tfv.dsk: $(DOS33) HELLO LOADER TFV_TITLE TFV_FLYING TFV_WORLD $(DOS33) -y tfv.dsk SAVE A HELLO @@ -21,12 +24,12 @@ tfv.dsk: $(DOS33) HELLO LOADER TFV_TITLE TFV_FLYING TFV_WORLD ### HELLO: hello.bas - ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + $(TOKENIZE) < hello.bas > HELLO #### LOADER: loader.o - ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc + ld65 -o LOADER loader.o -C ../../linker_scripts/apple2_1000.inc loader.o: loader.s init_vars.s common_defines.inc ca65 -o loader.o loader.s -l loader.lst @@ -34,7 +37,7 @@ loader.o: loader.s init_vars.s common_defines.inc ### TFV_TITLE: tfv_title.o - ld65 -o TFV_TITLE tfv_title.o -C ../linker_scripts/apple2_2000.inc + ld65 -o TFV_TITLE tfv_title.o -C ../../linker_scripts/apple2_2000.inc tfv_title.o: tfv_title.s \ gr_vlin.s tfv_opener.s \ @@ -47,7 +50,7 @@ tfv_title.o: tfv_title.s \ ### TFV_FLYING: tfv_flying.o - ld65 -o TFV_FLYING tfv_flying.o -C ../linker_scripts/apple2_2000.inc + ld65 -o TFV_FLYING tfv_flying.o -C ../../linker_scripts/apple2_2000.inc tfv_flying.o: tfv_flying.s \ zp.inc \ @@ -59,7 +62,7 @@ tfv_flying.o: tfv_flying.s \ ### TFV_WORLD: tfv_world.o - ld65 -o TFV_WORLD tfv_world.o -C ../linker_scripts/apple2_2000.inc + ld65 -o TFV_WORLD tfv_world.o -C ../../linker_scripts/apple2_2000.inc tfv_world.o: tfv_world.s \ tfv_overworld.s tfv_drawmap.s tfv_battle.s \ diff --git a/utils/Makefile b/utils/Makefile index 281bf8c9..1ed84f05 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -3,7 +3,7 @@ include ../Makefile.inc all: cd asoft_basic-utils && make cd asoft_presenter && make -# cd asoft_sound && make + cd asoft_sound && make # cd bmp2dhr && make # cd dos33fs-linux2.4 && make cd dos33fs-utils && make @@ -14,7 +14,7 @@ all: install: cd asoft_basic-utils && make install cd asoft_presenter && make install -# cd asoft_sound && make install + cd asoft_sound && make install # cd bmp2dhr && make install # cd dos33fs-linux2.4 && make install cd dos33fs-utils && make install