dos33fsprogs/games/tfv
2021-01-17 16:14:56 -05:00
..
graphics_battle re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
graphics_credits tfv: add in credits 2021-01-14 01:28:18 -05:00
graphics_map fix some more miscompiles 2021-01-05 23:59:08 -05:00
graphics_title fix some more miscompiles 2021-01-05 23:59:08 -05:00
music tfv: add in credits 2021-01-14 01:28:18 -05:00
battle_sprites.inc tfv: magic sorta works 2021-01-14 21:42:26 -05:00
common_defines.inc re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
credits_sprites.inc tfv: add in credits 2021-01-14 01:28:18 -05:00
credits.s tfv: credits: exit back to title on keypress 2021-01-14 10:36:44 -05:00
decompress_fast_v2.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
delay_a.s tfv: add in credits 2021-01-14 01:28:18 -05:00
draw_menu.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
flying_mode7.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
flying_sprites.inc re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_copy.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_fast_clear.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_hlin.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_hline.s tfv: add in credits 2021-01-14 01:28:18 -05:00
gr_offsets.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_pageflip.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_putsprite_crop.s tfv: more work on battle 2021-01-11 15:20:43 -05:00
gr_putsprite.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
gr_vlin.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
hardware.inc re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
hello.bas made an attempt to check in all missing files 2021-01-05 23:30:41 -05:00
help_flying.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
help_overworld.s checkin pending files 2021-01-05 15:32:11 -05:00
init_vars.s made an attempt to check in all missing files 2021-01-05 23:30:41 -05:00
joystick.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
keyboard.s fix some more miscompiles 2021-01-05 23:59:08 -05:00
loader.s tfv: add in credits 2021-01-14 01:28:18 -05:00
long_wait.s tfv: split off hero drawing code 2021-01-17 16:12:06 -05:00
Makefile tfv: battle, split off attack code 2021-01-17 16:14:56 -05:00
mockingboard.s tfv: add in credits 2021-01-14 01:28:18 -05:00
move_letters.s tfv: add in credits 2021-01-14 01:28:18 -05:00
multiply_fast.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
NOTES re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
number_sprites.inc tfv: can attack during battle 2021-01-13 12:16:20 -05:00
README re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
rotate_intro.s made an attempt to check in all missing files 2021-01-05 23:30:41 -05:00
select_item.s made an attempt to check in all missing files 2021-01-05 23:30:41 -05:00
sound_effects.s tfv: split off hero drawing code 2021-01-17 16:12:06 -05:00
speaker_tone.s tfv: split off menu from battle code 2021-01-17 13:54:29 -05:00
text_print.s tfv: battle: menus almost in place 2021-01-12 00:44:03 -05:00
tfv_battle_attack.s tfv: battle, split off attack code 2021-01-17 16:14:56 -05:00
tfv_battle_boss.s tfv: split off summons 2021-01-17 15:22:30 -05:00
tfv_battle_draw_hero.s tfv: split off hero drawing code 2021-01-17 16:12:06 -05:00
tfv_battle_enemy.s tfv: split enemy code off battle 2021-01-17 15:34:23 -05:00
tfv_battle_limit.s tfv: split off limit break and menu code to own file 2021-01-17 14:11:38 -05:00
tfv_battle_magic.s tfv: split off hero drawing code 2021-01-17 16:12:06 -05:00
tfv_battle_menu.s tfv: split off hero drawing code 2021-01-17 16:12:06 -05:00
tfv_battle_summons.s tfv: split off summons 2021-01-17 15:22:30 -05:00
tfv_battle.s tfv: battle, split off attack code 2021-01-17 16:14:56 -05:00
tfv_drawmap.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
tfv_flying.s tfv: add in credits 2021-01-14 01:28:18 -05:00
tfv_game_over.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
tfv_opener.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
tfv_overworld.s tfv: covert all of overworld to put_sprite_crop 2021-01-13 23:33:05 -05:00
tfv_sprites.inc tfv: covert all of overworld to put_sprite_crop 2021-01-13 23:33:05 -05:00
tfv_textentry.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
tfv_title.s tfv: more work on battle 2021-01-11 15:20:43 -05:00
tfv_world.s tfv: battle, split off attack code 2021-01-17 16:14:56 -05:00
tfv.dsk re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
TODO tfv: magic sorta works 2021-01-14 21:42:26 -05:00
vapor_lock.s tfv: add in credits 2021-01-14 01:28:18 -05:00
wait_keypressed.s re-arranged the entire directory structure 2021-01-05 15:29:31 -05:00
zp.inc tfv: drop limit break sorta works 2021-01-14 23:26:24 -05:00

                               Talbot Fantasy 7

                           by Deater (Vince Weaver)

                               vince@deater.net
                    http://www.deater.net/weave/vmwprod/tfv/

Background
~~~~~~~~~~

What you've always wanted, a poorly done FF7 clone for the Apple II.

Yes, I'm using the 40x40 15-color Low-resolution graphics mode of
the Apple II. This means the game could in theory run on the original
Apple II released in 1977 (if you had been fabulously rich enough to
populate all 48k of RAM). 



Mode7 Optimization Notes
~~~~~~~~~~~~~~~~~~~~~~~~


Original implementation:
	Multiplying 1.0 * 2.0 = 2.0, took 707 cycles
	Multiplying ff.ff * ff.ff = 0.0, took 761 cycles

	Cycles: flying=               162
	Cycles: getkey=                46
	Cycles: page_flip=             26
	Cycles: multiply=          88,179
	Cycles: mode7=             76,077
	Cycles: lookup_map=        33,920
	Cycles: put_sprite=         2,561
	==================================
	Total =                   200,971
	Frame Rate = 4.98 fps

Update Multiply to use zero page addresses:
	Multiplying 1.0 * 2.0 = 2.0, took 616 cycles
	Multiplying ff.ff * ff.ff = 0.0, took 664 cycles

	Cycles: flying=              162
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         76,561
	Cycles: mode7=            76,077
	Cycles: lookup_map=       33,920
	Cycles: put_sprite=        2,561
	===================================
	Total =                  189,353
	Frame Rate = 5.28 fps

Update to use "fast multiply" w 2kB squares table lookup:
	Multiplying 1.0 * 2.0 = 2.0, took 228 cycles
	Multiplying ff.ff * ff.ff = 0.0, took 272 cycles

	Cycles: flying=              162
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         27,041
	Cycles: mode7=            76,077
	Cycles: lookup_map=       33,920
	Cycles: put_sprite=        2,561
	=================================
	Total =                  139,833
	Frame Rate = 7.15 fps

Update to optimize fast multiply (reusing NUM1H, return results in register)
	Multiplying 1.0 * 2.0 = 2.0, took 234 cycles
	Multiplying ff.ff * ff.ff = 0.0, took 278 cycles

	Cycles: flying=              162
	Cycles: getkey=               46
        Cycles: page_flip=            26
        Cycles: multiply=         24,935
        Cycles: mode7=            73,925
        Cycles: lookup_map=       33,920
        Cycles: put_sprite=        2,561
	=================================
        Total =                  135,575
	Frame Rate = 7.38 fps

Add a cache to lookup_map

	Cycles: flying=              162
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         24,935
	Cycles: mode7=            73,445
	Cycles: lookup_map=       24,649
	Cycles: put_sprite=        2,561
	=================================
	Total =                  125,824
	Frame Rate = 7.95 fps

Don't draw sky every frame

	Cycles: flying=              162
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         24,935
	Cycles: mode7=            69,099
	Cycles: lookup_map=       24,649
	Cycles: put_sprite=        2,561
	=================================
	Total =                  121,478
	Frame Rate = 8.23 fps

Move checking if over water out of critical section

	Cycles: flying=              187
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         24,935
	Cycles: mode7=            54,374
	Cycles: lookup_map=       24,712
	Cycles: put_sprite=        2,561
	=================================
	Total =                  106,841
	Frame Rate = 9.36 fps

Move to 40x40 mode

	Cycles: flying=              187
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         49,613
	Cycles: mode7=           123,701
	Cycles: lookup_map=       48,847
	Cycles: put_sprite=        2,561
	=================================
	Total =                  224,981
	Frame Rate = 4.44 fps

Remove some unnecessary zero page copies in the mode7 code
	Cycles: flying=              187
	Cycles: getkey=               46
	Cycles: page_flip=            26
	Cycles: multiply=         49,613
	Cycles: mode7=           141,269
	Cycles: lookup_map=       21,718
	Cycles: put_sprite=        2,561
	================================
	Total =                  215,420
	Frame Rate = 4.64 fps

A few more minor cleanups in the Y loop
	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        49,613
	Cycles: mode7=          140,858
	Cycles: lookup_map=      21,718
	Cycles: put_sprite=       2,561
	===============================
	Total =                 215,009
	Frame Rate = 4.65 fps

Add some self-modifying code to inner loop:
	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        49,613
	Cycles: mode7=          131,610
	Cycles: lookup_map=      21,718
	Cycles: put_sprite=       2,561
	================================
	Total =                 205,761
	Frame Rate = 4.86 fps

More self-modifying code, also move SCREEN_X to X register
	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        49,613
	Cycles: mode7=          118,034
	Cycles: lookup_map=      22,747
	Cycles: put_sprite=       2,561
	================================
	Total =                 193,214
	Frame Rate = 5.18 fps

Remove unneeded precision in the 8.8 x 8.8 fixed point multiply
	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        43,588
	Cycles: mode7=          118,034
	Cycles: lookup_map=      22,747
	Cycles: put_sprite=       2,561
	================================
	Total =                 187,189
	Frame Rate = 5.34 fps

In-line unsigned multiply inside of signed multiply (save 12 cycles)
	Multiplying 1.0 * 2.0 = 2.0, took 198 cycles
	Multiplying ff.ff * ff.ff = 0.0, took 218 cycles

	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        40,888
	Cycles: mode7=          118,034
	Cycles: lookup_map=      22,747
	Cycles: put_sprite=       2,561
	================================
	Total =                 184,489
	Frame Rate = 5.42 fps


Have loop counter count down from 40 instead of count up (avoid compare)
	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        40,888
	Cycles: mode7=          115,538
	Cycles: lookup_map=      22,747
	Cycles: put_sprite=       2,561
	================================
	Total =                 181,993
	Frame Rate = 5.49 fps

Move spacez updates out of line and also do some self modifying code
	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        40,680
	Cycles: mode7=          114,830
	Cycles: lookup_map=      22,747
	Cycles: put_sprite=       2,561
	================================
	Total =                 181,077
	Frame Rate = 5.52 fps

Re-arranged multiply result register to allow more optimization.
This looks like a pessimization, but it's because the cycle counting code
	had been undercounting and missed a few add routines :(

	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        40,680
	Cycles: mode7=          115,150
	Cycles: lookup_map=      22,747
	Cycles: put_sprite=       2,561
	================================
	Total =                 181,397
	Frame Rate = 5.51 fps

Make lookup_map inline.  Again it looks like an impressive speedup
but some of this was fixing the cycle count estimates.

	Cycles: flying=             187
	Cycles: getkey=              46
	Cycles: page_flip=           26
	Cycles: multiply=        40,680
	Cycles: mode7=          111,882
	Cycles: lookup_map=      19,872
	Cycles: put_sprite=       2,561
	================================
	Total =                 175,254
	Frame Rate = 5.71 fps



Each cycle removed from inner X loop saves
	32*40=1280 cycles