BuGS/BuGS/genData.pl

622 lines
20 KiB
Perl
Executable File

#!/usr/bin/perl
# genData.pl
# BuGS
#
# Created by Jeremy Rand on 2020-11-03.
# Copyright © 2020 Jeremy Rand. All rights reserved.
use strict;
use integer;
# main
die "$0: Expected one argument pointing to the gen directory" if ($#ARGV != 0);
my $gGenDir = $ARGV[0];
our %gEquates;
# These are global equates which will also become defines in the C header file. Also, these will drive the other
# data that is generated by this script.
$gEquates{"SCREEN_ADDRESS"} = 0x2000;
$gEquates{"SCREEN_PIXELS_WIDE"} = 320;
$gEquates{"SCREEN_PIXELS_TALL"} = 200;
$gEquates{"SCREEN_PIXELS_PER_BYTE"} = 2;
$gEquates{"SCREEN_BYTES_PER_ROW"} = $gEquates{"SCREEN_PIXELS_WIDE"} / $gEquates{"SCREEN_PIXELS_PER_BYTE"};
$gEquates{"TILE_PIXEL_WIDTH"} = 8;
$gEquates{"TILE_PIXEL_HEIGHT"} = 8;
$gEquates{"TILE_BYTE_WIDTH"} = $gEquates{"TILE_PIXEL_WIDTH"} / $gEquates{"SCREEN_PIXELS_PER_BYTE"};
$gEquates{"TOTAL_TILES_WIDE"} = $gEquates{"SCREEN_PIXELS_WIDE"} / $gEquates{"TILE_PIXEL_WIDTH"};
$gEquates{"TOTAL_TILES_TALL"} = $gEquates{"SCREEN_PIXELS_TALL"} / $gEquates{"TILE_PIXEL_HEIGHT"};
$gEquates{"TOTAL_NUM_TILES"} = $gEquates{"TOTAL_TILES_WIDE"} * $gEquates{"TOTAL_TILES_TALL"};
$gEquates{"GAME_NUM_TILES_WIDE"} = 25;
$gEquates{"GAME_NUM_TILES_TALL"} = $gEquates{"TOTAL_TILES_TALL"};
$gEquates{"NUM_GAME_TILES"} = $gEquates{"GAME_NUM_TILES_WIDE"} * $gEquates{"GAME_NUM_TILES_TALL"};
$gEquates{"SIZEOF_TILE_INFO"} = 2;
$gEquates{"RHS_NUM_TILES_WIDE"} = 2;
$gEquates{"NUM_RHS_NON_GAMES_TILES"} = $gEquates{"RHS_NUM_TILES_WIDE"} * $gEquates{"TOTAL_TILES_TALL"};
$gEquates{"RHS_FIRST_TILE"} = $gEquates{"NUM_GAME_TILES"};
$gEquates{"RHS_FIRST_TILE_OFFSET"} = $gEquates{"RHS_FIRST_TILE"} * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"LHS_NUM_TILES_WIDE"} = $gEquates{"TOTAL_TILES_WIDE"} - $gEquates{"GAME_NUM_TILES_WIDE"} - $gEquates{"RHS_NUM_TILES_WIDE"};
$gEquates{"NUM_LHS_NON_GAMES_TILES"} = $gEquates{"LHS_NUM_TILES_WIDE"} * $gEquates{"TOTAL_TILES_TALL"};
$gEquates{"LHS_FIRST_TILE"} = $gEquates{"RHS_FIRST_TILE"} + $gEquates{"NUM_RHS_NON_GAMES_TILES"};
$gEquates{"LHS_FIRST_TILE_OFFSET"} = $gEquates{"LHS_FIRST_TILE"} * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"NUM_NON_GAME_TILES"} = $gEquates{"NUM_RHS_NON_GAMES_TILES"} + $gEquates{"NUM_LHS_NON_GAMES_TILES"};
$gEquates{"SPIDER_MAX_NUM_POSSIBLE_ROWS"} = 10;
$gEquates{"SPIDER_STARTING_TOP_ROW"} = $gEquates{"GAME_NUM_TILES_TALL"} - $gEquates{"SPIDER_MAX_NUM_POSSIBLE_ROWS"};
$gEquates{"SPIDER_STARTING_TOP_ROW_OFFSET"} = $gEquates{"SPIDER_STARTING_TOP_ROW"} * $gEquates{"GAME_NUM_TILES_WIDE"} * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"SPIDER_DISTANCE_900"} = $gEquates{"SCREEN_BYTES_PER_ROW"} * $gEquates{"TILE_PIXEL_HEIGHT"} * 2;
$gEquates{"SPIDER_DISTANCE_600"} = $gEquates{"SCREEN_BYTES_PER_ROW"} * $gEquates{"TILE_PIXEL_HEIGHT"} * 5;
$gEquates{"PLAYER_TILES_HIGH"} = 7;
$gEquates{"MOUSE_MAX_X"} = (($gEquates{"GAME_NUM_TILES_WIDE"} - 1) * $gEquates{"TILE_PIXEL_WIDTH"}) + 1;
$gEquates{"MOUSE_MAX_Y"} = (($gEquates{"PLAYER_TILES_HIGH"} - 1) * $gEquates{"TILE_PIXEL_HEIGHT"}) + 1;
$gEquates{"STARTING_MOUSE_X"} = $gEquates{"MOUSE_MAX_X"} / 2;
$gEquates{"STARTING_MOUSE_Y"} = $gEquates{"MOUSE_MAX_Y"} - 1;
$gEquates{"P1_SCORE_ONES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 6) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P1_SCORE_TENS_OFFSET"} = $gEquates{"P1_SCORE_ONES_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P1_SCORE_HUNDREDS_OFFSET"} = $gEquates{"P1_SCORE_TENS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P1_SCORE_THOUSANDS_OFFSET"} = $gEquates{"P1_SCORE_HUNDREDS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P1_SCORE_FIRST_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 6)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P1_LIVES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 9) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P2_SCORE_ONES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 19) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P2_SCORE_TENS_OFFSET"} = $gEquates{"P2_SCORE_ONES_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P2_SCORE_HUNDREDS_OFFSET"} = $gEquates{"P2_SCORE_TENS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P2_SCORE_THOUSANDS_OFFSET"} = $gEquates{"P2_SCORE_HUNDREDS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P2_SCORE_FIRST_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 19)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"P2_LIVES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 22) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"HIGH_SCORE_ONES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 13) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
$gEquates{"NUM_FLEA_FREQS"} = 120;
$gEquates{"NUM_HIGH_SCORES"} = 10;
our @gTileDirty = ("TILE_STATE_CLEAN") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileScreenOffset = (0) x $gEquates{"TOTAL_NUM_TILES"};
our @gTileType = ("TILE_EMPTY") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileAbove = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileBelow = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileLeft = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileRight = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileBitOffset = (0) x $gEquates{"NUM_GAME_TILES"};
our @gTileBitMask = (0) x $gEquates{"NUM_GAME_TILES"};
our @gTileRightVolume = (0) x $gEquates{"TOTAL_NUM_TILES"};
our @gDirtyNonGameTiles = ("INVALID_TILE_NUM") x $gEquates{"NUM_NON_GAME_TILES"};
our $gNumDirtyNonGameTiles = 0;
our @gFleaFreqs = (0) x $gEquates{"NUM_FLEA_FREQS"};
our @gMouseYAddress = (0) x $gEquates{"MOUSE_MAX_Y"};
our @gMouseYTileAbove = (0) x $gEquates{"MOUSE_MAX_Y"};
our @gMouseYTileBelow = (0) x $gEquates{"MOUSE_MAX_Y"};
our @gMouseXTileLeft = (0) x $gEquates{"MOUSE_MAX_X"};
our @gMouseXTileRight = (0) x $gEquates{"MOUSE_MAX_X"};
our @gScreenToTileOffset = (0) x ($gEquates{"SCREEN_PIXELS_TALL"} * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"});
sub printTileData
{
my ($fh, $symbol, @data) = @_;
print $fh "\n";
print $fh "\n";
print $fh "$symbol anop\n";
for my $index (0 .. $#data)
{
print $fh " dc i2'$data[$index]'\t; Index $index\n";
}
}
sub gameXYToTileOffset
{
my ($x, $y) = @_;
return (($y * $gEquates{"GAME_NUM_TILES_WIDE"}) + $x) * $gEquates{"SIZEOF_TILE_INFO"};
}
sub rhsXYToTileNum
{
my ($x, $y) = @_;
return $gEquates{"RHS_FIRST_TILE"} + ($y * $gEquates{"RHS_NUM_TILES_WIDE"}) + $x;
}
sub rhsXYToTileOffset
{
my ($x, $y) = @_;
return rhsXYToTileNum($x, $y) * $gEquates{"SIZEOF_TILE_INFO"};
}
sub lhsXYToTileNum
{
my ($x, $y) = @_;
return $gEquates{"LHS_FIRST_TILE"} + ($y * $gEquates{"LHS_NUM_TILES_WIDE"}) + $x;
}
sub lhsXYToTileOffset
{
my ($x, $y) = @_;
return lhsXYToTileNum($x, $y) * $gEquates{"SIZEOF_TILE_INFO"};
}
sub addDirtyNonGameTile
{
my ($tileNum) = @_;
if ($gTileDirty[$tileNum] eq "TILE_STATE_CLEAN")
{
my $tileOffset = $tileNum * $gEquates{"SIZEOF_TILE_INFO"};
my $dirtyIndex = $gNumDirtyNonGameTiles / $gEquates{"SIZEOF_TILE_INFO"};
$gTileDirty[$tileNum] = "TILE_STATE_DIRTY";
$gDirtyNonGameTiles[$dirtyIndex] = $tileOffset;
$gNumDirtyNonGameTiles += $gEquates{"SIZEOF_TILE_INFO"};
}
}
sub addLhsGameTile
{
my ($x, $y, $tileType) = @_;
my $tileNum = lhsXYToTileNum($x, $y);
$gTileType[$tileNum] = $tileType;
addDirtyNonGameTile($tileNum);
}
sub addRhsGameTile
{
my ($x, $y, $tileType) = @_;
my $tileNum = rhsXYToTileNum($x, $y);
$gTileType[$tileNum] = $tileType;
addDirtyNonGameTile($tileNum);
}
sub addLhsGameString
{
my ($x, $y, $string) = @_;
foreach my $char (split('', $string)) {
if ($char =~ /^[0-9]$/)
{
addLhsGameTile($x, $y, "TILE_NUMBER_$char");
}
elsif ($char eq ":")
{
addLhsGameTile($x, $y, "TILE_SYMBOL_COLON");
}
elsif ($char ne " ")
{
addLhsGameTile($x, $y, "TILE_LETTER_$char");
}
$x++;
}
}
sub screenAddressForTileAtXY
{
my ($x, $y) = @_;
return $gEquates{"SCREEN_ADDRESS"} + ($gEquates{"SCREEN_BYTES_PER_ROW"} * $y) + ($x / $gEquates{"SCREEN_PIXELS_PER_BYTE"}) + 3;
}
sub initTiles
{
my($tileX, $tileY, $lastOffset);
my $tileIndex = 0;
my $bitOffset = 0;
my $bitMask = 1;
my $rhsTileIndex = $gEquates{"RHS_FIRST_TILE"};
my $lhsTileIndex = $gEquates{"LHS_FIRST_TILE"};
my $screenOffset = 0;
for ($tileY = 0; $tileY < $gEquates{"TOTAL_TILES_TALL"}; $tileY++)
{
$screenOffset = ($tileY * $gEquates{"TILE_PIXEL_HEIGHT"} * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"});
$lastOffset = screenAddressForTileAtXY(0, $tileY * $gEquates{"TILE_PIXEL_HEIGHT"});
for ($tileX = 0; $tileX < $gEquates{"LHS_NUM_TILES_WIDE"}; $tileX++)
{
$gTileScreenOffset[$lhsTileIndex] = $lastOffset;
for (my $word = 0; $word < ($gEquates{"TILE_BYTE_WIDTH"} / $gEquates{"SIZEOF_TILE_INFO"}); $word++)
{
for (my $y = 0; $y < $gEquates{"TILE_PIXEL_HEIGHT"}; $y++)
{
$gScreenToTileOffset[$screenOffset + ($y * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"})] = $lhsTileIndex * $gEquates{"SIZEOF_TILE_INFO"};
}
$screenOffset++;
}
if ($tileY != 0)
{
$gTileAbove[$lhsTileIndex] = lhsXYToTileOffset($tileX, $tileY - 1);
}
if ($tileY != $gEquates{"TOTAL_TILES_TALL"} - 1)
{
$gTileBelow[$lhsTileIndex] = lhsXYToTileOffset($tileX, $tileY + 1);
}
if ($tileX != 0)
{
$gTileLeft[$lhsTileIndex] = lhsXYToTileOffset($tileX - 1, $tileY);
}
if ($tileX == $gEquates{"LHS_NUM_TILES_WIDE"} - 1)
{
$gTileRight[$lhsTileIndex] = gameXYToTileOffset(0, $tileY);
}
else
{
$gTileRight[$lhsTileIndex] = lhsXYToTileOffset($tileX + 1, $tileY);
}
$gTileRightVolume[$lhsTileIndex] = 0;
$lhsTileIndex++;
$lastOffset += $gEquates{"TILE_BYTE_WIDTH"};
}
for ($tileX = 0; $tileX < $gEquates{"GAME_NUM_TILES_WIDE"}; $tileX++)
{
$gTileScreenOffset[$tileIndex] = $lastOffset;
$gTileBitOffset[$tileIndex] = $bitOffset;
$gTileBitMask[$tileIndex] = $bitMask;
for (my $word = 0; $word < ($gEquates{"TILE_BYTE_WIDTH"} / $gEquates{"SIZEOF_TILE_INFO"}); $word++)
{
for (my $y = 0; $y < $gEquates{"TILE_PIXEL_HEIGHT"}; $y++)
{
$gScreenToTileOffset[$screenOffset + ($y * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"})] = $tileIndex * $gEquates{"SIZEOF_TILE_INFO"};
}
$screenOffset++;
}
if ($tileY != 0)
{
$gTileAbove[$tileIndex] = gameXYToTileOffset($tileX, $tileY - 1);
}
if ($tileY != $gEquates{"TOTAL_TILES_TALL"} - 1)
{
$gTileBelow[$tileIndex] = gameXYToTileOffset($tileX, $tileY + 1);
}
if ($tileX == 0)
{
$gTileLeft[$tileIndex] = lhsXYToTileOffset($gEquates{"LHS_NUM_TILES_WIDE"} - 1, $tileY);
}
else
{
$gTileLeft[$tileIndex] = gameXYToTileOffset($tileX - 1, $tileY);
}
if ($tileX == $gEquates{"GAME_NUM_TILES_WIDE"} - 1)
{
$gTileRight[$tileIndex] = rhsXYToTileOffset(0, $tileY);
}
else
{
$gTileRight[$tileIndex] = gameXYToTileOffset($tileX + 1, $tileY);
}
$gTileRightVolume[$tileIndex] = $tileX * 255 / ($gEquates{"GAME_NUM_TILES_WIDE"} - 1);
$tileIndex++;
if ($bitMask == 0x8000)
{
$bitOffset += $gEquates{"SIZEOF_TILE_INFO"} = 2;
$bitMask = 1;
}
else
{
$bitMask <<= 1;
}
$lastOffset += $gEquates{"TILE_BYTE_WIDTH"};
}
for ($tileX = 0; $tileX < $gEquates{"RHS_NUM_TILES_WIDE"}; $tileX++)
{
$gTileScreenOffset[$rhsTileIndex] = $lastOffset;
for (my $word = 0; $word < ($gEquates{"TILE_BYTE_WIDTH"} / $gEquates{"SIZEOF_TILE_INFO"}); $word++)
{
for (my $y = 0; $y < $gEquates{"TILE_PIXEL_HEIGHT"}; $y++)
{
$gScreenToTileOffset[$screenOffset + ($y * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"})] = $rhsTileIndex * $gEquates{"SIZEOF_TILE_INFO"};
}
$screenOffset++;
}
if ($tileY != 0)
{
$gTileAbove[$rhsTileIndex] = rhsXYToTileOffset($tileX, $tileY - 1);
}
if ($tileY != $gEquates{"TOTAL_TILES_TALL"} - 1)
{
$gTileBelow[$rhsTileIndex] = rhsXYToTileOffset($tileX, $tileY + 1);
}
if ($tileX == 0)
{
$gTileLeft[$rhsTileIndex] = gameXYToTileOffset($gEquates{"GAME_NUM_TILES_WIDE"} - 1, $tileY);
}
else
{
$gTileLeft[$rhsTileIndex] = rhsXYToTileOffset($tileX - 1, $tileY);
}
if ($tileX != $gEquates{"RHS_NUM_TILES_WIDE"} - 1)
{
$gTileRight[$rhsTileIndex] = rhsXYToTileOffset($tileX + 1, $tileY);
}
$gTileRightVolume[$rhsTileIndex] = 255;
$rhsTileIndex++;
$lastOffset += $gEquates{"TILE_BYTE_WIDTH"};
}
}
# Calculate the memory address of the 0th row of the player's mouse position.
$lastOffset = $gEquates{"SCREEN_ADDRESS"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * $gEquates{"TILE_BYTE_WIDTH"}) + (($gEquates{"GAME_NUM_TILES_TALL"} - $gEquates{"PLAYER_TILES_HIGH"}) * $gEquates{"TILE_PIXEL_HEIGHT"} * $gEquates{"SCREEN_BYTES_PER_ROW"});
$tileX = 0;
$tileY = $gEquates{"GAME_NUM_TILES_TALL"} - $gEquates{"PLAYER_TILES_HIGH"} - 1;
for (my $y = 0; $y < $gEquates{"MOUSE_MAX_Y"}; $y++)
{
$gMouseYAddress[$y] = $lastOffset;
$lastOffset += $gEquates{"SCREEN_BYTES_PER_ROW"};
if (($y % $gEquates{"TILE_PIXEL_HEIGHT"}) == 0)
{
$tileY++;
}
$gMouseYTileAbove[$y] = gameXYToTileOffset($tileX, $tileY);
if (($y % $gEquates{"TILE_PIXEL_HEIGHT"}) == 0)
{
$gMouseYTileBelow[$y] = gameXYToTileOffset($tileX, $tileY);
}
else
{
$gMouseYTileBelow[$y] = gameXYToTileOffset($tileX, $tileY + 1);
}
}
$tileX = -1;
$tileY = 0;
for (my $x = 0; $x < $gEquates{"MOUSE_MAX_X"}; $x++)
{
if (($x % $gEquates{"TILE_PIXEL_WIDTH"}) == 0)
{
$tileX++;
}
$gMouseXTileLeft[$x] = gameXYToTileOffset($tileX, $tileY);
if (($x % $gEquates{"TILE_PIXEL_WIDTH"}) == 0)
{
$gMouseXTileRight[$x] = gameXYToTileOffset($tileX, $tileY);
}
else
{
$gMouseXTileRight[$x] = gameXYToTileOffset($tileX + 1, $tileY);
}
}
}
sub initNonGameTiles
{
my $x;
my $y;
$x = $gEquates{"LHS_NUM_TILES_WIDE"} / 2;
$y = 0;
addLhsGameTile($x, $y, "TILE_LETTER_B");
$x++;
addLhsGameTile($x, $y, "TILE_LETTER_WHITE_U");
$x++;
addLhsGameTile($x, $y, "TILE_LETTER_GREEN_G");
$x++;
addLhsGameTile($x, $y, "TILE_LETTER_GREEN_S");
$x = 0;
$y = 3;
addLhsGameString($x, $y, "PLAYER 1");
$x = 2;
$y = 5;
addLhsGameString($x, $y, "SCORE:");
$x = 2;
$y = 8;
addLhsGameString($x, $y, "LIVES:");
$x = 0;
$y = 12;
addLhsGameString($x, $y, "HIGH SCORE:");
$x = $gEquates{"LHS_NUM_TILES_WIDE"} - 2;
$y = 13;
addLhsGameString($x, $y, "0");
$x = 0;
$y = 16;
addLhsGameString($x, $y, "PLAYER 2");
$x = 2;
$y = 18;
addLhsGameString($x, $y, "SCORE:");
$x = 2;
$y = 21;
addLhsGameString($x, $y, "LIVES:");
for (my $tileY = 0; $tileY < $gEquates{"TOTAL_TILES_TALL"}; $tileY++)
{
addLhsGameTile($gEquates{"LHS_NUM_TILES_WIDE"} - 1, $tileY, "TILE_RIGHT_BAR");
addRhsGameTile(0, $tileY, "TILE_LEFT_BAR");
}
}
sub initFleaFreqs
{
$gFleaFreqs[0] = (197 * 256 * 32) / ( 2 * 1645);
for (my $i = 1; $i < $gEquates{"NUM_FLEA_FREQS"}; $i++)
{
$gFleaFreqs[$i] = ($gFleaFreqs[$i - 1] * 100000000) / 101161944;
}
}
initTiles();
initNonGameTiles();
initFleaFreqs();
# Generate the tileData.s file
open my $fh, ">", "$gGenDir/tileData.s" or die "$0: Unable to open $gGenDir/tileData.s for writing, $!";
my $text = << "EOF";
case on
mcopy tilesData.macros
keep tilesData
tileData data
using globalData
EOF
print $fh $text;
foreach my $equate (sort keys %gEquates)
{
print $fh "$equate\tgequ " . $gEquates{$equate} . "\n";
}
printTileData($fh, "tileDirty", @gTileDirty);
printTileData($fh, "tileScreenOffset", @gTileScreenOffset);
printTileData($fh, "tileType", @gTileType);
printTileData($fh, "tileAbove", @gTileAbove);
printTileData($fh, "tileBelow", @gTileBelow);
printTileData($fh, "tileLeft", @gTileLeft);
printTileData($fh, "tileRight", @gTileRight);
printTileData($fh, "tileBitOffset", @gTileBitOffset);
printTileData($fh, "tileBitMask", @gTileBitMask);
printTileData($fh, "tileRightVolume", @gTileRightVolume);
printTileData($fh, "dirtyNonGameTiles", @gDirtyNonGameTiles);
printTileData($fh, "fleaFreqs", @gFleaFreqs);
printTileData($fh, "mouseYAddress", @gMouseYAddress);
printTileData($fh, "mouseYTileAbove", @gMouseYTileAbove);
printTileData($fh, "mouseYTileBelow", @gMouseYTileBelow);
printTileData($fh, "mouseXTileLeft", @gMouseXTileLeft);
printTileData($fh, "mouseXTileRight", @gMouseXTileRight);
$text = << "EOF";
numDirtyNonGameTiles dc i2'$gNumDirtyNonGameTiles'
end
EOF
print $fh $text;
close($fh);
# Generate the screenData.s file
open $fh, ">", "$gGenDir/screenData.s" or die "$0: Unable to open $gGenDir/screenData.s for writing, $!";
$text = << "EOF";
case on
mcopy screenData.macros
keep screenData
screenData data screenDataSeg
EOF
print $fh $text;
printTileData($fh, "screenToTileOffset", @gScreenToTileOffset);
$text = << "EOF";
end
EOF
print $fh $text;
close($fh);
# Generate the playerData.s file
open $fh, ">", "$gGenDir/playerData.s" or die "$0: Unable to open $gGenDir/playerData.s for writing, $!";
my $dataSize = 2 * $gEquates{"NUM_GAME_TILES"};
$text = << "EOF";
case on
mcopy playerData.macros
keep playerData
playerData data playerDataSeg
player1Tiles ds $dataSize
player2Tiles ds $dataSize
end
EOF
print $fh $text;
close($fh);
# Generate the tileData.h file
open $fh, ">", "$gGenDir/tileData.h" or die "$0: Unable to open $gGenDir/tileData.h for writing, $!";
$text = << "EOF";
#ifndef _GUARD_PROJECTBuGS_FILEtileData_
#define _GUARD_PROJECTBuGS_FILEtileData_
EOF
print $fh $text;
foreach my $equate (sort keys %gEquates)
{
print $fh "#define $equate " . $gEquates{$equate} . "\n";
}
$text = << "EOF";
#endif /* define _GUARD_PROJECTBuGS_FILEtileData_ */
EOF
print $fh $text;
close($fh);