From a92120827c02e72c88d080a788401ccd3e13e835 Mon Sep 17 00:00:00 2001 From: Rebecca Heineman Date: Wed, 8 Jul 2015 12:48:09 -0700 Subject: [PATCH] Initial Checkin From the archives of 1991 --- .gitignore | 32 + LICENSE.txt | 38 + README.rst | 56 + source/buildall.a65 | 16 + source/custombuild.py | 59 + source/icon.a65 | 197 ++ source/shapes.a65 | 138 + source/spaceace.a65 | 2602 +++++++++++++++++ source/spaceacerez.a65 | 195 ++ tools/bin/macosx/packsound | Bin 0 -> 144368 bytes tools/bin/windows/x64/packsound.exe | Bin 0 -> 100352 bytes tools/bin/windows/x86/packsound.exe | Bin 0 -> 93184 bytes tools/packsound/packsoundv10win.sln | 20 + tools/packsound/packsoundv10win.vcxproj | 35 + .../packsound/packsoundv10win.vcxproj.filters | 14 + .../packsoundxc3osx.xcodeproj/project.pbxproj | 231 ++ tools/packsound/source/packsound.cpp | 198 ++ tools/packsound/source/packsound.h | 23 + 18 files changed, 3854 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.rst create mode 100644 source/buildall.a65 create mode 100644 source/custombuild.py create mode 100644 source/icon.a65 create mode 100644 source/shapes.a65 create mode 100644 source/spaceace.a65 create mode 100644 source/spaceacerez.a65 create mode 100644 tools/bin/macosx/packsound create mode 100644 tools/bin/windows/x64/packsound.exe create mode 100644 tools/bin/windows/x86/packsound.exe create mode 100644 tools/packsound/packsoundv10win.sln create mode 100644 tools/packsound/packsoundv10win.vcxproj create mode 100644 tools/packsound/packsoundv10win.vcxproj.filters create mode 100644 tools/packsound/packsoundxc3osx.xcodeproj/project.pbxproj create mode 100644 tools/packsound/source/packsound.cpp create mode 100644 tools/packsound/source/packsound.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bab0c16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# +# This file tells Git about engine files that never really belong in source control. They are usually build products, log +# files and intermediate files generated from a compiler or the engine runtime. +# +# +# NOTE: +# Paths that start with / match paths relative to the root (where the .gitignore file is) +# Paths that end with / will match a folder and all files under it (but not a regular file with no extension) +# Use * for wildcards. Wildcards stop at path separators +# Use ** for a wildcard that spans path separators +# Paths in this file should use forward slash characters, not back slashes +# Use \ to escape special characters like ! and # +# Use ! to negate a previous pattern. But it doesn't work if the parent sub-folder was masked out already. +# + + +# Ignore project files in the root +**/bin +**/temp + +# Allow this folder to be saved +!/tools/bin + +# IDE droppings +*.pdb +*.user +*.suo +*.opensdf +*.sdf + +# Ignore Mac desktop services store files +.DS_Store diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..3306e11 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,38 @@ +The gist of the license... Have fun using this code, I won't sue you +and you can't sue me. However, please be nice about it and give me a +credit in your software that you used my code in. + +Please? + +-------------------------------------------- + +Copyright (c) 2013-2015 Rebecca Ann Heineman + +-------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +1. The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +Rebecca Ann Heineman +becky@burgerbecky.com + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..df22f6d --- /dev/null +++ b/README.rst @@ -0,0 +1,56 @@ +Space Ace IIgs +============== + +The complete archive for Space Ace for the Apple IIgs +===================================================== + +In 1990, ReadySoft released Space Ace for the Apple IIgs. +I purchased a copy and was appalled that the port was only +for ProDOS and required you to play the game on floppy disks. +Being the reverse engineering nutcase I was, I promptly +disassembled the game and converted it back into source code. +I then re-wrote the game to use the Apple IIgs hard disk +and updated all the file manager code to GS/OS. After +creating a really horrible icon for the game, I then +uploaded my new application file to friends who wanted to +play Space Ace on their hard drives and then promptly +forgot about this port. + +Here it is, 2015, and after searching my archive CDs, +I found this source and decided to share it with you, +the programming public, so you can get a glimpse of what +65816 code looked like for the Apple IIgs. This code +ACTUALLY COMPILES AND RUNS using the Brutal Deluxe +a65816 assembler and my python based build scripts. +I've successfully built this on my Mac and ran the +executable using Sweet16 and in Windows with Kegs. +I've included the build tools and its source and exes for +Mac (Intel/PPC) and Windows. + +In case you're wondering, yes, I did do this port just +because I wanted it running natively on my Apple IIgs +hard drive. Yes, I'm insane. + +Enjoy! + +http://www.whatisthe2gs.apple2.org.za/space-ace + +And one more thing... +===================== + +The intellectual property of Space Ace is the exclusive property of +Don Bluth and Digital Leisure. +No transfer of the intellectual property of Space Ace or any transfer of the +ownership of the sounds, art or other game assets are given nor implied. +If anyone wishes to release a version of Space Ace for the Apple IIgs commercially, +(I have absolutely no idea why? You'd sell like, what? 3 copies?) +contact Digital Leisure for a license. + +The source code... Go for it. + +Rebecca Ann Heineman + +Olde Skuul + +Seattle, WA + diff --git a/source/buildall.a65 b/source/buildall.a65 new file mode 100644 index 0000000..3298307 --- /dev/null +++ b/source/buildall.a65 @@ -0,0 +1,16 @@ +* +* Link +* + + DSK ../bin/SpaceAce#b3db03 + TYP $B3 ;Application + XPL + + + ASM spaceace.a65 + DS 0 + KND #$1000 ;No spec mem + ALI None + LNA SpaceAce + SNA SpaceAce + diff --git a/source/custombuild.py b/source/custombuild.py new file mode 100644 index 0000000..bfed79f --- /dev/null +++ b/source/custombuild.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import subprocess +import shutil +import burger + +# +# Compile the code and data for Space Ace IIgs +# + +def main(workingDir): + + # + # Create the output folder if needed + # + + toolfolder = os.path.dirname(workingDir) + destfolder = os.path.join(toolfolder,'bin') + burger.createfolderifneeded(destfolder) + + # + # Update the map files + # + + filelist = [ + ['icon','spaceace.icon#ca0000'], # Icon file + ['buildall','SpaceAce#b3db03'], # Application file + ['spaceacerez','SpaceAce#b3db03r'] # Resource file + ] + + error = 0 + + for item in filelist: + src = os.path.join(workingDir,item[0] + '.a65') + dest = os.path.join(destfolder,item[1]) + if burger.isthesourcenewer(src,dest)==True: + cmd = 'a65816 . ' + item[0] + '.a65' + error = subprocess.call(cmd,cwd=workingDir,shell=True) + if error!=0: + return error + + # + # Do some cleanup + # + + burger.deletefileifpresent(os.path.join(workingDir,'_FileInformation.txt')) + return error + +# +# If called as a function and not a class, +# call my main +# + +if __name__ == "__main__": + sys.exit(main(os.path.dirname(os.path.abspath(__file__)))) + + diff --git a/source/icon.a65 b/source/icon.a65 new file mode 100644 index 0000000..ffe2e0e --- /dev/null +++ b/source/icon.a65 @@ -0,0 +1,197 @@ +* +* Space Ace IIgs Icon file +* Read Apple II File Type Notes for $CA +* Finder Icons File July 1989 +* + + LST OFF + TR ON + + ORG 0 + +* +* ICN file header +* + +iBlkNext ;Handle to next icon + ADRL 0 ;Must be NULL + +iBlkID + DA 1 ;Icon file ID, must be 1 + +iBlkPath ;Handle to the pathname + ADRL 0 ;Must be NULL + +iBlkName + DS 16 ;Name if the icon file (Pascal string) + +iBlkIcons + +* +* Array of icons +* + +iDataLen + DA iEndIcon-* ;Size of this individual icon + DS 64 ;Buffer for the name of the icon file + + STR 'SPACEACE' ;16 byte buffer for the filename to match + DS 15-8 + + DA $B3 ;File type (Application) + DA $0000 ;Auxtype (Application) + +* +* Large icon +* + + DA $FFFF ;Color icon + DA 47*56/2 ;Image size in bytes + DA 47 ;Height of the big icon + DA 56 ;Width of the big icon in pixels + +* +* Large icon image +* + + HEX FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF222222222222222222FFFFFF + HEX FFFFFFFFFFFFFFFFFFFFFFFFFFFFF222EEEEEEEEEEEEEEEEEE22FFFF + HEX FFFFFFFFFFFFFFFFFFFFFFFFFF222EEEEEEEEEEEEEEEEEEEEEEE22FF + HEX FFFFFFFFFFFFFFFFFFFFFFFF22EEEEEEEEEEEEEEEEEEEEEEEEEEEE2F + HEX FFFFFFFFFFFFFFFFFFFFFF22EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE2F + HEX FFFFFFFFFFFFFFFFFFFF22EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE22 + HEX FFFFFFFFFFFFFFFFFF22EEEEEEEEEEEEEEEEEEEEE2EEEEEEEEEEEEE2 + HEX FFFFFFFFFFFFFFFF22EEEEEEEEEEEEEEEEEEEEEEEE2EEEEEEEEEEEE2 + HEX FFFFFFFFFFFFFFF2EEEEEEEEEEEEEEEEEEEEEEEEEEE2EEEEEEEEEEE2 + HEX FFFFFFFFFFFFFF2EEEEEEEEEEEEEEEE2222222EEEEEE2EEEEEEEEEE2 + HEX FFFFFFFFFFFF22EEEEEEEEEEEEEE222FFFFFFF22EEEE2EEEEEEEEEE2 + HEX FFFFFFFFFFF2EEEEEEEEEEEEEE22FFFFFFFFFFFF22EEE2EEEEEEEEE2 + HEX FFFFFFFFFF2EEEEEE2222222E2FFFFFFFFFFFFFFFF2EE2EEEEEEEE22 + HEX FFFFFFFFF2EEEEE22EEEEEEE2FFFFFFF22222FFFFFF2222EEEEEEE2F + HEX FFFFFFFF2EEEEE2EEEEEEEEE2FFFFF222222222FFFFFFF2EEEEEEE2F + HEX FFFFFFF2EEEEE2EEEEEEEEEEE2FFF2222FFFF222FFFFFFF2EEEEE2FF + HEX FFFFFF2EEEEEEEEEEEEEEEEEE2FF222FFFFFFFF22FFFFFF2EEE22FFF + HEX FFFFF2EEEEEEEEEEEEEEEEEEE2FFFFFFFFFFFFFF22FFFFF2222222FF + HEX FFFF2EEEEEEEEEEEEEEEEEEEE2FFFFF222222FFFF222FFFFFF2222FF + HEX FFF2EEEEEEEEEEEEEEEEEEEEE2FFFF22FDD1F2FFFFFFFF2FFFFFF2FF + HEX FFF2EEEEEEEEEEEEEEEEEEEEE2FFF2222FD11F2FFFFFFF2FFFFFFF2F + HEX FF2EEEEEEEEEEEEEEEEEEEEE2FFFFF222222222FFFFFFFF2222FFF2F + HEX FF2EEEEEE22222EEEEEEEEEE2FFFFFFFFF2F22FFFF2FFFF22D12FF2F + HEX F2EE2EEE2FFFFF22EEEEEEEE2FFFFFFFFF22FFFF22FFFFFF2222FF2F + HEX F2E2EEE2FF2222FF2EEEEEE2FFFFFFFFF2FFFFF2FFFFFFFFFFFFF2FF + HEX 2EE2EEE2FFFFFF22F2EEEEE2FFFFFFFFFFFFFF2FFFFFFFFFFF2FF2FF + HEX 2E2EEE2FFFFFF2FF2F2EEE2FFFFFFFFFFFFFFF2FF222FFFFFF2FFF2F + HEX 222EEE2FFFFF2FFFF22EE2FFFFFFFFFFFFFFFFF22FFF2FFF22FFFF2F + HEX FF2EEE2FFFFF2FFFF2F222FFFFFFFFFFFFFFFFFFFFFFFFF2FFFFFF2F + HEX FF2EEE2FFFFFF2FFFFFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F + HEX FF2EEEE2FFFFFF22FFFFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F + HEX FF2EEEE2FFFFFFFFFFFFFF2FFFFFFFFFFFFFFFFFF22222FFFFFFFF2F + HEX FF2EEEEE2FFFFFFFF2FFFFF2FFFFFFFFFFFFFFF22FFFFF22FFFFF2FF + HEX FF2EEEEEE2FFFFF2F2FFFFFF2FFFFFFFFFFFF22FFFFFFFFF2FFFF2FF + HEX FF2EEEEEEE22222FF2FFFFFFF2FFFFFFFFFF2FFFFFFFFFFFF2FF2FFF + HEX FF2EEEEEEEEEE2FFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FFF + HEX FFF2EEEEEEEE2FFFF2FFFFFFFFFFFFFFFFFFFFFFF2222FFFFFFF2FFF + HEX FFF2EEEEEEEE2FFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFF222FFFF2FFF + HEX FFF2EEEEEEE2FFFFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FFF + HEX FFFF2EEEEE2FFFFFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FFF + HEX FFFF2EEEEE2FFFFFFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FFF + HEX FFFFF2EEE2FFFFFFFF2FFFFFFFFFFF22222222FFFFFFFFFFFFFF2FFF + HEX FFFFFF2E2FFFFFFFFF2FFFFFF22222FFFFFFFFFFFFFFFFFFFFFF2FFF + HEX FFFFFFF22FFFFFFFFFF2FF222FFFFFFFFFFFFFFFFFFFFFFFFFFF2FFF + HEX FFFFFFF2FFFFFFFFFFF222FFFFFFFFFFFFFFFFFFFFFF222FFFF2FFFF + HEX FFFFFFF2FFFFFFFFFFF2FFFFFFFFFFFFF22FFFFFFFFFFFF2FF2FFFFF + HEX FFFFFF2FFFFFFFFFFFF2FFFFFFFFFFFFFFF222FFFFFFFFFF22FFFFFF + +* +* Large icon mask +* + + HEX 0000000000000000000000000000000FFFFFFFFFFFFFFFFFFF000000 + HEX 00000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000 + HEX 00000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + HEX 000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000 + HEX 0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 + HEX 0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000 + HEX 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 + +* +* Small icon +* + + DA $0000 ;Monochrome icon + DA 8*8/2 + DA 8 ;Small icon height + DA 8 ;Small icon width + +* +* Small icon image +* + + HEX 0000000F + HEX 0FFFFFF0 + HEX 0FFFFFF0 + HEX 0FFFFFF0 + HEX 0FFFFFF0 + HEX 0FFFFFF0 + HEX 0FFFFFF0 + HEX 00000000 + +* +* Small icon mask +* + + HEX FFFFFFF0 + HEX FFFFFFFF + HEX FFFFFFFF + HEX FFFFFFFF + HEX FFFFFFFF + HEX FFFFFFFF + HEX FFFFFFFF + HEX FFFFFFFF +iEndSmallIcon + + +iEndIcon + DA 0 ;End of the list + + SAV ../bin/spaceace.icon#ca0000 \ No newline at end of file diff --git a/source/shapes.a65 b/source/shapes.a65 new file mode 100644 index 0000000..8e8597b --- /dev/null +++ b/source/shapes.a65 @@ -0,0 +1,138 @@ + LST OFF + TR ON + XC + XC + REL + + ENT DigitPtr,Press0Start,MissionIsOver + +* +* Fonts +* + +DigitPtr DA Num0,Num1,Num2,Num3,Num4 + DA Num5,Num6,Num7,Num8,Num9 + +Num0 DB 2,20 + HEX 01C00630080811C41364222224122412 + HEX 24122412241224122412241222223366 + HEX 11C4180C0E3803E0000001C007F00E38 + HEX 0C181C1C180C180C180C180C180C180C + HEX 180C180C1C1C0C180E3807F001C00000 + +Num1 DB 2,20 + HEX 00E0012002200420082009200F200120 + HEX 01200120012001200120012001200120 + HEX 01200120012001E0000000C001C003C0 + HEX 07C006C000C000C000C000C000C000C0 + HEX 00C000C000C000C000C000C000C00000 + +Num2 DB 2,20 + HEX 03E00C18100423E22632241224123C12 + HEX 00220046008C01180230046008C01180 + HEX 23FE200220023FFE000003E00FF81C1C + HEX 180C180C180C000C001C0038007000E0 + HEX 01C0038007000E001C001FFC1FFC0000 + +Num3 DB 2,20 + HEX 03C00C30100823C42664242424243C24 + HEX 01C40208020403E20032181224122422 + HEX 23C6300C1C3807E0000003C00FF01C38 + HEX 1818181818180018003801F001F8001C + HEX 000C000C180C181C1C380FF003C00000 + +Num4 DB 2,20 + HEX 007800880108010802080248044804C8 + HEX 08C809C81148134823CE200220023FCE + HEX 00480048004800780000007000F000F0 + HEX 01F001B003B00330073006300E300C30 + HEX 1C301FFC1FFC00300030003000300000 + +Num5 DB 2,20 + HEX 3FF82004200427FC2400240027C02430 + HEX 200823C43C2200120012381224122422 + HEX 23C6300C1C3807E000001FF81FF81800 + HEX 1800180018001BC01FF01C38001C000C + HEX 000C000C180C181C1C380FF003C00000 + +Num6 DB 2,20 + HEX 03E00C18100423E226322412241E27C0 + HEX 2430200821C422222412241224122222 + HEX 31C6180C0E3803E0000003E00FF81C1C + HEX 180C180C180018001BC01FF01E381C1C + HEX 180C180C180C1C1C0E3807F001C00000 + +Num7 DB 2,20 + HEX 3FFC200220023FE20046004C00880098 + HEX 0110013002200260044004C004800880 + HEX 0980090009000F0000001FFC1FFC001C + HEX 003800300070006000E000C001C00180 + HEX 03800300030007000600060006000000 + +Num8 DB 2,20 + HEX 01C00630080811C413641224122411C4 + HEX 08080410080811C42222241224122222 + HEX 31C6180C0E3803E0000001C007F00E38 + HEX 0C180C180C180E3807F003E007F00E38 + HEX 1C1C180C180C1C1C0E3807F001C00000 + +Num9 DB 2,20 + HEX 01C00630080811C42222241224122412 + HEX 2412222231C218020E1203F238122422 + HEX 23C6300C1C3807E0000001C007F00E38 + HEX 1C1C180C180C180C180C1C1C0E3C07FC + HEX 01EC000C000C181C1C380FF003C00000 + +* +* The mission is over +* + +MissionIsOver DB 20,11 + HEX E1C0000000C18C00000C0000000C000038000000 + HEX 9240000000A29200001200000012000044000000 + HEX 9240000000A29200001200000012000092000000 + HEX 925E337600949E1F1F1E1E3E001E1F0139663CEC + HEX CCE14C890094A220A0A221410022208129994312 + HEX 61CCCCC48088B247C7B24CCC8032478129999989 + HEX 334CCCCC8080926262124CCC8012620129999999 + HEX 124CCCCF8094923131124CCC8012310129C3819F + HEX 124CCCC800949238B8924CCC8012388193429F90 + HEX 2161E204009CA141C1A161CC80214180C666C308 + HEX 3F3F3FFC00F7BF7F7F3F3F7F803F7F007C3C7FF8 + + HEX 0000000000000000000000000000000000000000 + HEX 6180000000410C00000C0000000C000038000000 + HEX 6180000000410C00000C0000000C00006C000000 + HEX 61800000006300000000000000000000C6000000 + HEX 331E337600631C1F1F1C1E3E001C1F00C6663CEC + HEX 1E33333B00770C38380C3333000C3800C6666676 + HEX 0C333333007F0C1C1C0C3333000C1C00C6666666 + HEX 0C333330006B0C0E0E0C3333000C0E00C63C7E60 + HEX 0C333330006B0C07070C3333000C07006C3C6060 + HEX 1E1E1DF800631E3E3E1E1E33001E3E0038183CF0 + HEX 0000000000000000000000000000000000000000 + +* +* Press "0" to start +* + +Press0Start DB 16,9 + HEX FF80000000007F00E00007F3800001C0 + HEX 80C000000000C181A0000C1E80000340 + HEX CE7FDFDFFFE09C833BF809CCEFEFFE70 + HEX 4E447070302098820E0C08F828388C10 + HEX 40E32727E7E094833CE40E3CEF9C6670 + HEX 4FA7203070608C813CA40F8CF814E678 + HEX CE67E7FF3F209C8134E409CCD39CFE68 + HEX 824230606060C1818E0C0C1E38484318 + HEX FE7E1FFFFFC07F00FBF807F3EFFFC1F0 + + HEX 00000000000000000000000000000000 + HEX 7F00000000003E00400003E100000080 + HEX 3180000000006300C000063300000180 + HEX 31BB8F8FCFC06701F1F00707C7C773E0 + HEX 3F1CD8D818006B00C31801C300639980 + HEX 3018DFCF8F807300C318007307E31980 + HEX 30181800C0C06300CB1806332C630190 + HEX 7C3C0F9F9F803E0071F003E1C7B780E0 + HEX 00000000000000000000000000000000 diff --git a/source/spaceace.a65 b/source/spaceace.a65 new file mode 100644 index 0000000..ba7b097 --- /dev/null +++ b/source/spaceace.a65 @@ -0,0 +1,2602 @@ + LST OFF + TR ON + XC + XC + MX %00 + REL + +* +* Predefined labels: +* + +TLStartUp = $201 +TLShutDown = $301 +TLMountVolume = $1101 +StartUpTools = $1801 +ShutDownTools = $1901 + +MMStartUp = $202 +MMShutDown = $302 +NewHandle = $902 +DisposeHandle = $1002 +DisposeAll = $1102 + +SetHeartBeat = $1203 +DelHeartBeat = $1303 +GetNewID = $2003 +DeleteID = $2103 + +SetColorTable = $0E04 +SetAllSCBs = $1404 +GetPort = $1C04 +HideCursor = $9004 + +GetNextEvent = $A06 + +Tool_Entry = $E10000 +GSOSSTACK = $E100B0 + +MyToolTable = 1 + +MemHandles = 128 ;Maximum number of handles + +; EXT DigitPtr,MissionIsOver,Press0Start + +* +* Main entry +* + + PHK ;Set my bank + PLB + TSC ;Save my stack pointer + STA MyStack + TDC ;Save my direct page + STA MyDirect + + JSR InitTools ;Init the game tools + BCS QuitMe + JSR CheckHardDrive ;Check if I am running off of a Hard drive + JSR Game ;Play the game +QuitNow LDA MyStack + TSC +QuitMe JSR KillTools + PEA #0 ;No parms + TSC ;Get pointer to data + INC + PEA #0 ;Bank of stack + PHA ;Pointer + PEA #$2029 ;GSOS Quit + JSL GSOSSTACK ;Exit! + BRK $F0 ;Error! + +* +* Actual game +* + +Game PEA #1 ;Picture #1 + JSR LoadScripts + JSR PlayTitlePage ;Show and play the title page + PEA #2 ;Picture #2 + JSR LoadScripts + PEA #3 ;Picture #3 + JSR LoadScripts + PEA #4 ;Picture #4 + JSR LoadScripts + PEA #5 ;Picture #5 + JSR LoadScripts + BRA DemoLoop2 + +DemoLoop JSR PlayTitlePage +DemoLoop2 JSR FadeOut + JSR GetJoyStick + AND #$0010 + BNE FadeStart2 + JSR ShowCredits + JSR GetJoyStick + AND #$0010 + BNE FadeStart + JSR FadeOut + JSR WaitForFade + LDA #-1 ;Do not show the current score + STA ScoreDisable + PEA #6 + JSR PlayAScene + STZ ScoreDisable ;Allow score display + CMP #-1 + BEQ StartGame + JSR WaitForFade + BRA DemoLoop + +* +* Start a new game +* + +StartGame STZ ScoreDisable ;Allow score display +FadeStart JSR FadeOut ;Fade out the screen +FadeStart2 JSR WaitForFade ;Wait until the fade is complete + STZ Score ;No score + LDA #3 ;3 Lives + STA Lives + LDA #6 ;Start at scene #6 + STA CurrentScene ;Save + +* +* Main game loop +* + +]A LDA CurrentScene ;Get scene number + DEC + ASL ;Long word pointer + ASL + TAX + LDA ScriptPtrs,X ;Is there a game script here? + BEQ :WinGame ;I won? + LDA CurrentScene + PHA + JSR PlayAScene ;Play an animation scene + CMP #-1 + BEQ YouDied3 + INC CurrentScene + BRA ]A + +:WinGame LDA #-1 ;I won!! + STA WinFlag + PEA #5 ;Victory screen + JSR RunAllScenes + JSR FadeIn ;Fade in colors + JSR WaitForFade ;Wait until done +]A JSR GetJoyStick ;Wait until the fire button is pressed + AND #$0010 + BEQ ]A + JSR FadeOut ;Fade it out + JSR WaitForFade ;Wait until done + JSR ShowScoreScreen ;Show final score + JSR WaitForFire ;Wait for fire button +]B JSR FadeOut + JSR WaitForFade + PEA #5 ;Force loading in disk #1 + JSR LoadScripts + BRL DemoLoop + +YouDied3 JSR ShowScoreScreen +]A JSR GetJoyStick ;Wait for fire button + AND #$10 + BEQ ]A + BRA ]B + +* +* Play a scene script +* + +PlayAScene +:RTSVal = 1 +:CurrentScene = 3 +:EndDirect = 5 + + TSC + PHD + TCD + JSR ShowScoreScreen + PEI :CurrentScene + JSR LoadScripts +]A JSR WaitForFire + JSR FadeOut + JSR WaitForFade + PEI :CurrentScene + JSR RunAllScenes + PHA ;Save error + JSR ShutOffSoundNow + STZ SoundPresent + PLX ;Get error code + LDA ScoreDisable ;Is the score screen allowed? + BNE :Exit ;Nope? + CPX #-1 ;Error? + BNE :Exit + DEC Lives ;1 less life + BEQ :Exit + JSR ShowScoreScreen + BRA ]A + +:Exit PHX ;Save answer + PEI :CurrentScene + JSR UnloadScripts + PLX + PLD ;Restore direct page + PLA ;Fix return address + STA 2-1,S + TXA + RTS + +* +* Run all animation scenes in the script +* + +RunAllScenes +:RTSVal = 1 +:SceneNum = 3 +:EndDirect = 5 + + TSC + PHD + TCD + + STZ JoyStickVal ;Init joystick + LDA :SceneNum + DEC ;-1 for 0-?? + ASL + ASL + TAX + LDA ScriptPtrs+2,X ;Get animation script pointer + TAX +]A PHX + LDA: $0002,X ;Get pointer to game moves + PHA + LDA: $0000,X ;Get number of script to play + PHA + JSR RunAScene + PLX ;Restore index + CMP #-1 + BEQ :HesDeadJim + INX ;Next script pointer + INX + INX + INX + LDA: $0000,X ;Any more? + BEQ :HesDeadJim ;He lives! + PHX + JSR ShutOffSoundNow ;No more sound! + JSR FadeOut ;Fade it out + JSR WaitForFade ;Wait + PLX ;Next script + BRA ]A + +:HesDeadJim PHA + JSR FadeOut ;Fade it out + PLX + PLD + PLA + STA 2-1,S + TXA + RTS + +* +* Run a single scene +* + +RunAScene +:Pointer = 1 +:RTSVal = 5 +:FileNum = 7 +:MovesPointer = 9 +:EndDirect = 11 + + TSC + SEC + SBC #4 + TCS + PHD + TCD + + STZ PlayedDeath +:PlayAgain PEI :FileNum ;Save scene number + JSR FindFileInCache ;Find it in the cache + ASL + ASL + TAX + LDA CacheHandle,X ;Save pointer + STA :Pointer + LDA CacheHandle+2,X + STA :Pointer+2 + LDY #2 + LDA [:Pointer] + STA UnpackPtr + LDA [:Pointer],Y + STA UnpackPtr+2 + + LDA :FileNum ;Restore it + ORA #$400 ;Make into a sound file + PHA + JSR FindFileInCache ;Present? + LDY #-1 + STY SoundPresent + CMP #-1 + BEQ :NoSound + + STZ SoundPresent ;Sound is present + ASL + ASL + TAX + LDA CacheHandle,X ;Get pointer + STA :Pointer + LDA CacheHandle+2,X + STA :Pointer+2 + LDY #8 + LDA [:Pointer],Y ;Size of memory + STA RawSoundSize + + LDY #2 + LDA [:Pointer] + TAX + CLC + ADC #4 + STA RawPackSoundPtr + LDA [:Pointer],Y + STX :Pointer + STA :Pointer+2 + ADC #0 + STA RawPackSoundPtr+2 + + LDA [:Pointer] ;Get pitch + STA SoundPitch + LDY #2 + LDA [:Pointer],Y ;Get length of file in pages + STA SoundTime + +:NoSound STZ DocRamPtr ;Init DOC pointer + STZ FrameCounter + + PEA #0 ;Force screen to 320 mode + LDX #SetAllSCBs + JSL Tool_Entry + JSR ResetSound ;Reset sound hardware + JSR UnpackSomeSound ;Unpack sound data + JSR WaitForFade ;Wait for screen fade + JSR ProcessFrame ;Draw initial screen + +* +* Move loop +* + +]B JSR VideoSoundLoad ;Update sound data + INC FrameCounter ;+1 to frame # + LDX ScoreDisable ;Score screen allowed? + BEQ :CheckAMove ;Yep, game in progress + JSR GetJoyStick ;Joystick pressed? + BEQ :NextFrame + LDX #-1 ;Exit + BRL :Exit + +:CheckAMove LDX :MovesPointer ;Pointer to moves +]A LDA: $0000,X ;Get time offset + AND #$FF ;No move moves? + BEQ :NextFrame ;Skip + BIT #$80 ;Wait for time + BEQ :TimeYet + PHX + JSR GetJoyStick + PLX + AND: $0001,X ;Get joystick value + BNE :BadMove + BRA :Skip1 + +:TimeYet CMP FrameCounter + BEQ :CheckMove +:Skip1 INX ;Next index + INX + INX + INX + BRA ]A + +:CheckMove PHX + JSR GetJoyStick + PLX + EOR: $0001,X ;Move to check + AND #$FF ;Match? + BEQ :GoodMove ;Ok! + BIT WimpMode ;I feel so wimpy! + BMI :GoodMove ; + +:BadMove STZ JoyStickVal + PHX + JSR ShutOffSoundNow + PLX + LDA: $0002,X ;Get scene to jump to + XBA + STA :FileNum ;Save file number + LDX #NullMoves + STX :MovesPointer + DEC PlayedDeath ;I am playing the death scene + BRL :PlayAgain + +:GoodMove STZ JoyStickVal ;Reset joystick + REP #$31 +* CLC + LDA Score ;100 points per move + ADC #100 + STA Score +:NextFrame JSR ProcessFrame ;Play a frame + CMP #-1 + BEQ :EndNow + LDA SideNeeded + BEQ :JB + DEC SideNeeded + BEQ :EndNow +:JB BRL ]B + +:EndNow JSR VideoSoundLoad + LDX #0 + LDA PlayedDeath + BEQ :Exit + DEX +:Exit PLD + LDA :RTSVal,S + STA :EndDirect-2,S + CLC + TSC + ADC #4+4 + TCS + TXA + RTS + +* +* Show the title page +* + +PlayTitlePage PEA #1 + JSR RunAllScenes + JSR FadeIn + JSR WaitForFade + JSR StartSoundNow + LDA #170 + STA CountDown + +]A JSR GetJoyStick + AND #$10 + BNE :Exit + JSR LoadSomeDOCRam + LDA CountDown + BNE ]A + +:Exit JSR ShutOffSoundNow + STZ SoundPresent + RTS + +* +* Who did what? +* + +ShowCredits PEA #3 + JSR RunAllScenes + JSR FadeIn + JSR WaitForFade + LDA #200 + STA CountDown +]A JSR GetJoyStick + AND #$10 + BNE :Exit + LDA CountDown + BNE ]A +:Exit RTS + +* +* Show score +* + +ShowScoreScreen LDA ScoreDisable + BNE :Exit + PEA #2 + JSR RunAllScenes + JSR CalcHighLow + PEA #$8408 ;Screen address + PEA #4*2 ;5 digits long + LDA Score ;Show score + PHA + JSR PrDec + PEA #$8480 ;Screen address + PEA #0 ;Only 1 digit + LDA Lives ;Print the number of lives + PHA + JSR PrDec + + LDA WinFlag ;Did you win? + BNE :OverNow + LDA Lives ;No more lives? + BNE :Cont4 +:OverNow PEA #$93C8 ;Place on screen + PEA #MissionIsOver + JSR DrawAShape +:Cont4 JSR FadeIn ;Fade in the screen + JSR WaitForFade ;Wait until done + LDA #100 + STA CountDown +:Exit RTS + +* +* Wait until the fire button is pressed +* + +WaitForFire JSR GetJoyStick ;Get joystick value + AND #$0010 + BNE :Fire + LDA CountDown ;Wait for IRQ time + BNE WaitForFire +:Fire RTS + +* +* Unpack a picture file crossing banks +* + +UnpackPicSlow +:RTSVal = 1 +:DestPtr = 3 +:UnpackPtr = 7 +:EndDirect = 11 + + TSC + PHB + PHD + TCD + + SEP #$20 + PEI :DestPtr+1 + PLB + PLB + LDX :DestPtr + LDY #0 + +]A LDA [:UnpackPtr],Y + BEQ :Exit + BMI :RunLength + INY + STA :DestPtr+2 +]B LDA [:UnpackPtr],Y + STA: $0000,X + INY + INX + DEC :DestPtr+2 + BNE ]B + BRA ]A + +:RunLength AND #$7F + STA :DestPtr+2 + INY + LDA [:UnpackPtr],Y + INY +]B STA: $0000,X + INX + DEC :DestPtr+2 + BNE ]B + BRA ]A + +:Exit REP #$30 + PLD + PLB + PLA + STA 8-1,S + CLC + TSC + ADC #8-2 + TCS + RTS + +* +* Unpack an animation frame with bank crossing +* + +UnpackAnimSlow +:RTSVal = 1 +:DestPtr = 3 +:UnpackPtr = 7 +:EndDirect = 11 + + TSC + PHB + PHD + TCD + + SEP #$20 + PEI :DestPtr+1 + PLB + PLB + LDX :DestPtr + LDY #0 +]A LDA [:UnpackPtr],Y + BNE :NotPack + INY + LDA [:UnpackPtr],Y + STA :DestPtr+2 + INY + LDA [:UnpackPtr],Y + INY +]B STA: $0000,X + INX + DEC :DestPtr+2 + BNE ]B + BRA :Next + +:NotPack BMI :NotTab + REP #$21 + AND #$FF + STA :DestPtr+2 + TXA + ADC :DestPtr+2 + TAX + SEP #$20 + INY + BRA :Next + +:NotTab AND #$7F + STA :DestPtr+2 + INY +]B LDA [:UnpackPtr],Y + STA: $0000,X + INY + INX + DEC :DestPtr+2 + BNE ]B +:Next CPX #$9D00 + BLT ]A + REP #$30 + PLD + PLB + PLA + STA 8-1,S + CLC + TSC + ADC #8-2 + TCS + RTS + +* +* Play a single animation frame +* + +ProcessFrame +:Palette = 1 +:Pointer = 33 +:RTSVal = 37 +:EndDirect = 39 + + TSC + SEC + SBC #36 + TCS + PHD + TCD + + JSR GetJoyStick ;Process the joystick + LDA QuitFlag + BEQ :cc + BRL QuitNow + +:cc LDA PauseFlag ;Is the game paused? + BEQ :NoPause + SEP #$20 + LDAL $E100CA ;Ensoniq + STAL $E1C03C + LDA #$A0 ;My Voice + STAL $E1C03E + LDA #$01 ;Halt it! + STAL $E1C03D + REP #$20 +]A JSR GetJoyStick ;Process the joystick + LDA PauseFlag ;Wait for pause to finish + BNE ]A + SEP #$20 + LDA #$A0 + STAL $E1C03E ;sound address ptr (lo) + LDA MySoundHalt + STAL $E1C03D ;sound data register + REP #$20 + +* +* Now, process the current frame +* + +:NoPause LDA UnpackPtr + STA :Pointer + LDA UnpackPtr+2 + STA :Pointer+2 + LDA [:Pointer] ;Get length of record + CMP #$FF00 + BLT :Fine1 + LDX #-1 + BRL :Exit +:Fine1 CLC + ADC :Pointer + STA UnpackPtr ;Save new low word + BCC :NoCross + INC UnpackPtr+2 ;Next bank +:NoCross CLC ;+2 to index past length word + LDA #2 + ADC :Pointer + STA :Pointer + BCC :CU + INC :Pointer + +* +* Play an animation frame +* + +:CU LDA [:Pointer] ;Check if a palette needs to be loaded + BIT #$80 + BEQ :NoNewPalette ;No new palette needed! + PHA ;Save opcode + + LDY #32-1 +]A LDA [:Pointer],Y ;Save my new palette + STA NewPalette-1,Y + DEY + DEY + BPL ]A + + LDA 1,S ;Get header + BIT #$40 ;New picture? + BEQ :NoBlank + LDA FadeFactor ;Fade in progress? + BEQ :NoBlank + + LDX #32-2 +]A STZ :Palette,X ;Blank out the palette! + DEX + DEX + BPL ]A + LDA #0 + PHA + PHA + TDC + INC + PHA + LDX #SetColorTable ;Set color palette + JSL Tool_Entry + +:NoBlank LDA #-1 ;Set flag + STA BlankPalFlag + CLC + LDA :Pointer + ADC #32 ;Index past palette + STA :Pointer + BCC :YC + INC :Pointer+2 +:YC PLA ;Restore opcode + +* +* Now draw initial screen +* + +:NoNewPalette INC :Pointer + BNE :CS + INC :Pointer+2 +:CS PEI :Pointer+2 ;Save pointer to data + PEI :Pointer + LDX VideoBank + PHX + PEA #$2000 + + BIT #$0040 ;Picture or animation? + BEQ :Anim + JSR UnpackPicSlow ;Unpack picture + BRA :DrawZero + +:Anim JSR UnpackAnimSlow + +:Cont6 LDA BlankPalFlag ;Blank picture? + BEQ :DrawZero + LDA SideNeeded ;Disk side required? + BNE :DrawZero + LDA FadeFactor ;Fade active? + BEQ :DoFade + STZ BlankPalFlag ;Palette is new + STA ColorFlag ;Save color + BRA :BeginSound +:DoFade JSR FadeIn ;Fade in new picture + JSR WaitForFade ;Wait until done + +:BeginSound JSR StartSoundNow ;Begin sound + +:DrawZero LDA ScoreDisable ;Is the score disabled? + BEQ :Exit2 + JSR CalcHighLow ;Get colors + PEA #$2030 + PEA #Press0Start ;Press "0" to start + JSR DrawAShape +:Exit2 LDX #0 +:Exit PLD ;Exit ok! + CLC + TSC + ADC #36 + TCS + TXA + RTS + +* +* Heartbeat IRQ +* + +MyIRQ DS 4 ;Handle to next heartbeat +HeartTime DA 1 ;Time to next heartbeat + DA $A55A ;Signature + +HeartBeatCode +:Palette = 1 ;Temp color palette +:EventRec = 33 ;Event record +:PFlag = 49 +:RTLVal = 50 ;Return address +:EndDirect = 53 + + + PHP + REP #$30 + TSC + SEC + SBC #48 ;Get my local storage + TCS + PHB ;Save bank + PHD + PHK + PLB + TCD + LDA #1 ;Reset timer + STA HeartTime + CLC + LDA SoundTimeDelta + ADC SoundTime + AND #$7FFF + STA SoundTimeDelta + + LDA DiskTime + BEQ :DiskMe + DEC DiskTime +:DiskMe + + LDA CountDown + BEQ :DoneCount + DEC CountDown + +:DoneCount LDA StartTimer ;Do I start the video timer? + BEQ :Ecch1 ;Nope + STZ StartTimer ;Clear + STA VideoCount ;Start it! +:Ecch1 LDA VideoCount ;Counted down? + BEQ :CheckKey + DEC VideoCount ;Count + +* +* Check the keyboard +* + +:CheckKey STZ KeyTime ;Allow an event to be processed + +* +* Do I set a new palette +* + + LDA ColorFlag + BEQ :NoColorChange + STZ ColorFlag + PEA #0 + PEA #^NewPalette + PEA #NewPalette + LDX #SetColorTable ;Set color palette + JSL Tool_Entry + +* +* Do I fade the screen? +* + +:NoColorChange LDA FadeFlag + BEQ :ExitIRQ + CLC + LDA FadeFactor + ADC FadeFlag + STA FadeFactor + BEQ :Zilch + CMP #16 + BNE :UseFade +:Zilch STZ FadeFlag ;End fade + +:UseFade SEP #$30 + LDY #0 + LDA #0 +]A PHA + LSR + LSR + LSR + LSR + STA FadeTable,Y + PLA + CLC + ADC FadeFactor + INY + CPY #16 + BNE ]A + + LDX #32-2 +]A LDA NewPalette,X + LSR + LSR + LSR + LSR + TAY + LDA FadeTable,Y + ASL + ASL + ASL + ASL + STA :Palette,X + LDA NewPalette,X + AND #$0F + TAY + LDA :Palette,X + ORA FadeTable,Y + STA :Palette,X + + LDY NewPalette+1,X + LDA FadeTable,Y + STA :Palette+1,X + DEX + DEX + BPL ]A + REP #$30 + LDA #0 + PHA + PHA + TDC + INC + PHA + LDX #SetColorTable + JSL Tool_Entry +:ExitIRQ PLD + PLB + CLC + TSC + ADC #48 ;Remove palette + TCS + PLP + CLC + RTL ;Exit + +* +* Fade the screen in +* + +FadeIn LDA FadeFactor + BNE :InProgress + STZ BlankPalFlag ;Palette is no longer blank + LDA #1 + STA FadeFlag +:InProgress RTS + +* +* Fade the screen away +* + +FadeOut LDA FadeFactor + BEQ :InProgress + STZ BlankPalFlag ;Palette is no longer blank + LDA #-1 + STA FadeFlag +:InProgress RTS + +* +* Wait for a screen fade to complete +* + +WaitForFade +]A LDA FadeFlag ;Fade in progress? + BNE ]A + RTS + +* +* Unpack a small amount of sound data +* + +UnpackSomeSound +:Pointer = 1 +:Length = 5 +:RTSVal = 7 +:EndDirect = 9 + + TSC + SEC + SBC #6 + TCS + PHD + TCD + LDA SoundPresent ;Sound loaded? + BNE :Exit ;Nope, exit + LDA SoundSize ;Any sound data left? + BEQ :Exit + CMP #$800 + BLT :UseThis + LDA #$800 +:UseThis STA :Length + SEC + LDA SoundSize + SBC :Length + STA SoundSize + + SEP #$20 + LDAL $E100CA + ORA #$60 + STAL $E1C03C + REP #$20 + LDA DocRamPtr + STAL $E1C03E + CLC + ADC :Length + ADC :Length + STA DocRamPtr + CLC + LDA PackSoundPtr + STA :Pointer + ADC :Length + STA PackSoundPtr + LDA PackSoundPtr+2 + STA :Pointer+2 + ADC #0 + STA PackSoundPtr+2 + + LDY #0 + LDX :Length +]B SEP #$20 +]A LDA [:Pointer],Y + AND #$F0 + BNE :NoZero1 + INC ;Fix for Apple IIgs +:NoZero1 STAL $E1C03D ;sound data register + + LDA [:Pointer],Y + ASL + ASL + ASL + ASL + BNE :NoZero2 + INC +:NoZero2 STAL $E1C03D ;sound data register + INY + DEX + BNE ]A + REP #$20 +:Exit PLD ;Reset direct page + CLC + TSC + ADC #6 + TCS + RTS ;Exit + +* +* Load some DOC ram from time to time +* + +VideoSoundLoad + SEP #$20 + LDAL $E100CA + ORA #$60 + STAL $E1C03C ;Set video pointer + REP #$20 + LDA DocRamPtr + STAL $E1C03E ;sound address ptr (hi +]A LDA VideoCount ;Is the video playing? + BEQ :VideoOver + JSR LoadSomeDOCRam ;Play some sound + BRA ]A ;Loop + +:VideoOver LDA #8 ;Wait 8 ticks + STA StartTimer +]A LDA StartTimer ;Time up? + BEQ :Exit + JSR LoadSomeDOCRam + BRA ]A +:Exit RTS + +* +* Load some DOC ram +* + +LoadSomeDOCRam +:Pointer = 1 +:Length = 5 +:RTSVal = 7 +:EndDirect = 9 + + TSC + SEC + SBC #6 + TCS + PHD + TCD + + LDA SoundPresent ;Sound available? + BNE :JExit + LDA SoundSize ;Any data left? + BEQ :JExit + LDA SoundTimeDelta ;Time up? + AND #$FF00 + SEC + SBC DocRamPtr ;Get differance + BGE :Pos + EOR #$8000 ;Negate +:Pos CMP #$1000 ;Ram needed? + BGE :Add +:JExit BRA :Exit + +:Add LDA SoundSize ;Any data left? + CMP #$100 + BLT :UseThis + LDA #$100 +:UseThis STA :Length + SEC + LDA SoundSize + SBC :Length + STA SoundSize + + SEP #$20 + LDAL $E100CA + ORA #$60 + STAL $E1C03C ;sound control register + REP #$20 + LDA DocRamPtr + STAL $E1C03E ;sound address ptr (lo) + CLC + ADC :Length + ADC :Length + AND #$7FFF ;Keep in bounds + STA DocRamPtr + CLC + LDA PackSoundPtr ;Get pointer to data + ADC :Length + STA :Pointer + STA PackSoundPtr + LDA PackSoundPtr+2 + ADC #0 + STA :Pointer+2 + STA PackSoundPtr+2 + + SEP #$20 ;8 bit mode + LDX :Length ;1 page of data + LDY #0 +]A LDA [:Pointer],Y ;Get sound byte + AND #$F0 ;Mask + BNE :NoZero1 + INC ;No zeros! +:NoZero1 STAL $E1C03D ;Save in DOC ram + LDA [:Pointer],Y + ASL ;Shift upper nibble + ASL + ASL + ASL + BNE :NoZero2 + INC ;No zeros! +:NoZero2 STAL $E1C03D ;Save in DOC ram + INY + DEX + BNE ]A + REP #$20 ;16 bit +:Exit PLD ;Reset direct page + CLC + TSC + ADC #6 + TCS + RTS ;Exit + +* +* Reset sound hardware +* + +ResetSound LDA SoundPresent + BNE :Exit + SEP #$20 + LDAL $E100CA ;Access DOC + STAL $E1C03C + LDA #$C0 ;Waveform size + STAL $E1C03E + LDA #$3F + STAL $E1C03D + LDA #$00 ;Pitch + STAL $E1C03E + LDA SoundPitch + STAL $E1C03D + LDA #$20 ;High byte + STAL $E1C03E + LDA SoundPitch+1 + STAL $E1C03D + LDA #$40 ;Volume + STAL $E1C03E + LDA #$FF + STAL $E1C03D + LDA #$80 ;Pointer + STAL $E1C03E + LDA DocRamPtr+1 + STAL $E1C03D + REP #$20 + LDA RawSoundSize ;Reset sound pointers + STA SoundSize + LDA RawPackSoundPtr + STA PackSoundPtr + LDA RawPackSoundPtr+2 + STA PackSoundPtr+2 +:Exit RTS + +* +* Clear the halt bit to a loaded sound +* + +StartSoundNow LDA SoundFlag ;Get the halt bit flag for sound enable + STA MySoundHalt + LDA SoundPresent ;Sound loaded? + BNE :Nope + STZ SoundTimeDelta ;Reset time delta + SEP #$20 + LDAL $E100CA + STAL $E1C03C + LDA #$A0 ;Halt register + STAL $E1C03E + LDA MySoundHalt ;Set/Clear halt bit + STAL $E1C03D + REP #$20 ;16 bit +:Nope RTS ;Exit + +* +* Turn off the sound hardware +* + +ShutOffSoundNow LDA SoundPresent + BNE :Exit + LDA MySoundHalt + BNE :Exit + LDA #$01 ;Enable sound + STA MySoundHalt + SEP #$20 + LDAL $E100CA + STAL $E1C03C ;Access DOC registers + LDA #$40 + STAL $E1C03E ;Base address + LDA #0 + STAL $E1C03D + LDA #$A0 ;Halt bit + STAL $E1C03E + LDA #$02 ;Reset it + STAL $E1C03D + LDA #$00 ;Sound speed + STAL $E1C03E + LDA #$FF ;Maximum + STAL $E1C03D + LDA #$20 + STAL $E1C03E + LDA #$FF + STAL $E1C03D + LDA #$A0 ;Halt bit + STAL $E1C03E ; +]A LDAL $E1C03D ;Get halt bit + LSR + BCC ]A + REP #$20 + LDY #8192 ;Wait a little extra anyways +]A DEY + BNE ]A +:Exit RTS ;Exit + +* +* Flush the cache +* + +UnloadScripts +:Handle = 1 +:RTSVal = 5 ;Return address +:ScriptNum = 7 ;Script number +:EndDirect = 9 + + TSC + SEC + SBC #4 + TCS + PHD + TCD + + LDA :ScriptNum ;Get script number + CMP #6 ;Permanent? + BLT :Exit + DEC ;-1 for 0-99 + ASL ;Long word pointer + ASL + TAY + LDX ScriptPtrs,Y ;Get pointer to file list + BRA :Loop ;Jump into loop + +]A PHX + PHA ;File number + JSR FindFileInCache ;Is the file in the cache? + CMP #-1 + BEQ :NotHere ;Nope! + ASL + ASL + TAX + LDA CacheHandle,X ;Get handle + STA :Handle + LDA CacheHandle+2,X + STA :Handle+2 + LDY #4 + LDA [:Handle],Y ;Unlock the handle + AND #$7FFF + STA [:Handle],Y +:NotHere PLX ;Restore index + INX ;Next entry + INX +:Loop LDA: $0000,X ;End of list? + BNE ]A ;Load it in +:Exit PLD ;Restore direct page + LDA :RTSVal,S + STA :EndDirect-2,S + CLC + TSC + ADC #2+4 + TCS + RTS ;Exit + +* +* Load a file sequence from a script +* + +LoadScripts +:RTSVal = 1 ;Return address +:ScriptNum = 3 ;Script number +:EndDirect = 5 + + TSC + PHD + TCD + LDA :ScriptNum ;Get script number + DEC ;-1 for 0-99 + ASL ;Long word pointer + ASL + TAY + LDX ScriptPtrs,Y ;Get pointer to file list + BRA :Loop ;Jump into loop + +]A PHX + STA :ScriptNum ;Save file # in temp + PHA ;Is this file in memory? + JSR LockMemory ;Is the memory present and locked? + CMP #-1 + BNE :Fine ;It's here! + PEI :ScriptNum ;End of list? + JSR LoadNewFile ;Load in a new file +:Fine PLX ;Restore index + INX ;Next entry + INX +:Loop LDA: $0000,X ;End of list? + BNE ]A ;Load it in + PLD ;Restore direct page + PLA ;Fix return address + STA 2-1,S + RTS ;Exit + +* +* Check if the file is in memory already? +* + +LockMemory +:Handle = 1 ;Temp handle +:RTSVal = 5 ;Return address +:FileNum = 7 ;File number +:EndDirect = 9 + + TSC + SEC + SBC #4 ;Allocate local storage + TCS + PHD + TCD + + PEI :FileNum ;Save file number + JSR FindFileInCache ;Is the file in the cache? + CMP #-1 + BEQ :NotHere ;Nope! + STA :FileNum ;Save handle number + ASL + ASL + TAX + LDA CacheHandle,X ;Get handle + STA :Handle + LDA CacheHandle+2,X + STA :Handle+2 + + LDY #4 + LDA [:Handle],Y ;First lock down the handle + ORA #$8000 + STA [:Handle],Y + + LDX #0 ;Assume ok + LDY #2 + LDA [:Handle] ;Valid handle? + ORA [:Handle],Y + BNE :Exit + PEI :FileNum ;Kill this cache handle + JSR KillCacheEntry ;Bye bye +:NotHere LDX #-1 ;Exit +:Exit PLD ;Restore direct page + LDA :RTSVal,S ;Fix return address + STA :EndDirect-2,S + CLC + TSC + ADC #4+2 + TCS + TXA + RTS ;Exit + +* +* Find a file number in cache +* + +FindFileInCache +:RTSVal = 1 ;Return address +:FileNum = 3 ;Script number +:EndDirect = 5 + + TSC + PHD + TCD + LDY #MemHandles-1*2 + LDA :FileNum +]A CMP CacheFileNum,Y ;Match? + BEQ :GotIt ;File list is not loaded + DEY + DEY + BPL ]A + LDX #-1 ;Assume bogus dude! + BRA :Exit +:GotIt TYA + LSR + TAX +:Exit PLD ;Restore direct page + PLA ;Fix return address + STA 2-1,S + TXA ;Return the error code + RTS ;Exit + +* +* Kill a cache entry completely +* + +KillCacheEntry +:RTSVal = 1 ;Return address +:HandleNum = 3 ;Script number +:EndDirect = 5 + + LDA :HandleNum,S ;Get the handle number + ASL + TAX ;Word index + STZ CacheFileNum,X ;Kill entry number + ASL + TAX + LDA CacheHandle+2,X ;Get handle + PHA + LDA CacheHandle,X + PHA + LDX #DisposeHandle ;Remove handle + JSL Tool_Entry + PLA ;Fix return address + STA 2-1,S + RTS ;Exit + +* +* Load in a new file into the cache +* + +LoadNewFile +:RTSVal = 1 +:FileNum = 3 +:EndDirect = 5 + + TSC + PHD ;Create my stack frame + TCD + +* +* Which disk is the file on? +* + + BIT HardDisk ;Is this on a hard drive? + BMI :HD1 ;Don't log disks then! + LDA :FileNum ;Get the file number + SEP #$30 ;8 bit + LDY #'1'-1 ;Start at side #1 +]A INY + CMP DiskSides-$31,Y ;On this side? + BGE ]A + REP #$20 + LDX #7-1*2 +]A CMP WeirdSides,X + BEQ :PlusOne + DEX + DEX + BPL ]A + BRA :UseX + +:PlusOne INY +:UseX STY VideoName+7 ;Get disk side + STY AudioName+7 + STY DeathName+7 + STY DeathAudioName+7 + +* +* Master loop +* + +:HD1 SEP #$30 + LDA :FileNum ;File number to load + LDY #-1 + SEC +]A INY ;Inc tens + SBC #10 ;Sub a ten + BCS ]A ;More? + ADC #10 ;Undo subtraction + ORA #'0' ;Fix ones + XBA ;Swap + TYA ;Get tens + ORA #'0' ;Fix tens + REP #$30 ;Back to 16 bit + STA VideoName+14 ;Save file number + STA AudioName+14 + STA DeathName+14 + STA DeathAudioName+14 + + LDA :FileNum+1 ;Get file type (PreShifted by 4) + AND #$FF ;Force byte + TAY + LDA FNamePointers+2,Y + PHA + LDA FNamePointers,Y ;Get true filename + PHA + JSR LoadAFile ;Pass the filename to the file + PHY ;Save the pointer + PHX + PEA #0 ;Blank entry + JSR FindFileInCache ;Find the entry + ASL + TAX + LDA :FileNum ;File number + STA CacheFileNum,X ;Save it + TXA + ASL + TAX + PLA ;Save start address + STA CacheHandle,X + PLA ;Save start address + STA CacheHandle+2,X +:Exit PLD ;Restore master index + PLA + STA 2-1,S + RTS ;Exit + +* +* Load a file into memory +* Return the handle +* + +LoadAFile +:OpenParms = 1 ;Number of parms +:OpenID = 3 ;1 +:OpenFileName = 5 ;2 +:OpenReqAccess = 9 ;3 +:OpenResourceNum = 11 ;4 +:OpenAccess = 13 ;5 +:OpenFileType = 15 ;6 +:OpenAuxType = 17 ;7 +:OpenStorage = 21 ;8 +:OpenCreateTime = 23 ;9 +:OpenModTime = 31 ;10 +:OpenOptions = 39 ;11 +:OpenEOF = 43 ;12 + +:CloseParms = 47 ;Close the file +:CloseID = 49 ;1 + +:ReadParms = 51 ;Read from the file +:ReadID = 53 ;1 +:ReadAdr = 55 ;2 +:ReadLen = 59 ;3 +:ReadBytes = 63 ;4 + +:Handle = 67 ;Temp handle +:RTSVal = 71 ;Return address +:FileName = 73 ;Filename pointer +:EndDirect = 77 + + TSC + SEC + SBC #:RTSVal-1 ;Allocate my local storage + TCS + PHD + TCD + +* +* Create the open file record +* + + LDA #12 ;12 parms + STA :OpenParms + LDA :FileName ;Get the filename + STA :OpenFileName + LDA :FileName+2 + STA :OpenFileName+2 + LDA #1 ;I want read only access + STA :OpenReqAccess + STZ :OpenResourceNum ;Only the data fork + + PEA #0 ;Bank #0 + TDC + INC + PHA + PEA #$2010 ;Open the file + STZ :OpenOptions + STZ :OpenOptions+2 + JSL GSOSSTACK + BCC :OpenOk + +* +* Ask for a specific disk +* + + JSR FadeOut ;Oh oh + JSR WaitForFade + LDA #1 + BIT HardDisk + BMI :HD3 + LDA VideoName+7 ;Get the disk # + AND #$FF + SEC + SBC #'0' ;Convert to hex +:HD3 STA SideNeeded + PEA #4 ;Show side needed + JSR RunAllScenes + JSR FadeIn ;Fade it in + JSR WaitForFade + +* +* Wait until the file is online +* + +:LongDelay LDA #2*60 + STA DiskTime +]A JSR GetJoyStick ;Process the joystick + LDA QuitFlag ;Did I quit? + BEQ :cc + BRL QuitNow +:cc LDA DiskTime + BNE ]A + + PEA #0 ;Bank #0 + TDC + INC + PHA + PEA #$2010 ;Open the file + STZ :OpenOptions + STZ :OpenOptions+2 + JSL GSOSSTACK + BCS :LongDelay + +* +* Wait for screen +* + + JSR FadeOut ;Fade out the screen + JSR WaitForFade + LDA WinFlag ;Is it over? + BNE :OpenOk + LDA Lives ;Game over? + BEQ :OpenOk + JSR ShowScoreScreen ;Show the current score as I load + +* +* The file is open +* + +:OpenOk LDA :OpenID ;Get the ID + STA :ReadID + STA :CloseID + + PHA ;Space for handle + PHA + PEI :OpenEOF+2 + PEI :OpenEOF + LDA NewID + PHA + PEA #$8200 ;Allow it to be purged! + PHA + PHA + LDX #NewHandle + JSL Tool_Entry + PLX + PLY + BCS :Fatal + STX :Handle ;Dereferance it + STY :Handle+2 + LDA [:Handle] + STA :ReadAdr + LDY #2 + LDA [:Handle],Y + STA :ReadAdr+2 + + LDA #4 + STA :ReadParms + LDA :OpenEOF + STA :ReadLen ;Read in $60000 long + LDA :OpenEOF+2 + STA :ReadLen+2 + PEA #0 + TDC + CLC + ADC #:ReadParms + PHA + PEA #$2012 ;Read in the file + JSL GSOSSTACK + BCC :ReadOk +:Fatal BRL QuitNow ;Quit! + +:ReadOk LDA #1 + STA :CloseParms + PEA #0 + TDC + CLC + ADC #:CloseParms + PHA + PEA #$2014 + JSL GSOSSTACK ;CLOSE + LDX :Handle ;Return the handle + LDY :Handle+2 + PLD + LDA :RTSVal,S + STA :EndDirect-2,S + CLC + TSC + ADC #:RTSVal-1+4 + TCS + RTS ;Exit + +* +* Print a number in decimal +* X = Precision +* + +PrDec +:RTSVal = 1 +:Value = 3 ;Value to convert +:Length = 5 ;Precision +:Screenad = 7 ;Screen address to draw at +:EndDirect = 9 + + TSC + PHD + TCD +]B LDY #-2 + LDA :Value + LDX :Length + SEC +]A INY + INY + SBC Tens,X ;Sub from 10's table + BCS ]A + ADC Tens,X ;Fix it + STA :Value + PEI :Screenad + LDA DigitPtr,Y ;Which number? + PHA + JSR DrawAShape ;Draw it + STA :Screenad ;Save new screen address + DEC :Length ;Count down + DEC :Length + BPL ]B ;Try again + PLD + PLA + STA 6-1,S + CLC + TSC + ADC #6-2 + TCS + RTS ;Exit + +* +* Draw a shape +* + +DrawAShape +:Width = 1 +:Height = 3 +:RTSVal = 5 +:ShapePtr = 7 +:Screenad = 9 +:EndDirect = 11 + + TSC + SEC + SBC #4 + TCS + PHD + TCD + + LDY :ShapePtr + LDA: $0000,Y ;Get width of shape + AND #$FF + STA :Width + LDA: $0001,Y ;Get height of shape + AND #$FF + STA :Height ;Save + INY + INY ;Index to true shape data + PEI :Width ;Save width + PHA ;Save height + LDA ForeColor ;Get the foreground color + PHA + PHY ;Save the pointer to the shape + LDA VideoBank ;Video bank + PHA + PEI :Screenad ;Pointer to screen memory + JSR Draw4Bit ;Draw the first shape + + PEI :Width ;Width + PEI :Height ;Height + LDY BackColor ;Get the foreground color + PHY + PHA ;Pointer to the shape (Continued) + LDA VideoBank + PHA + PEI :Screenad + JSR Draw4Bit ;Draw the second shape + LDA :Width ;2 pixels per byte + ASL + ASL + CLC + ADC :Screenad ;Add to the base address + TAX ;Move to the next char + PLD + LDA :RTSVal,S ;Get return address + STA :EndDirect-2,S + CLC + TSC + ADC #4+4 ;Adjust + TCS + TXA ;Return current shape pointer + RTS ;Exit + +* +* Draw a 2 bit per pixel imag +* + +Draw4Bit +:Temp1 = 1 ;Bit temp +:Width2 = 3 ;Temp widht +:RTSVal = 5 ;Return address +:Screenad = 7 ;Pointer to video memory +:ShapePtr = 11 ;Pointer to shape +:Color = 13 ;Color to draw with +:Height = 15 ;Height of shape +:Width = 17 ;Width of shape +:EndDirect = 19 + + + TSC + SEC + SBC #4 ;Allocate local storage + TCS + PHD ;Save direct page + TCD + SEP #$20 ;8 bit + LDA :Color ;Make lower into upper for speed drawing + ASL + ASL + ASL + ASL + STA :Color+1 + +* +* Main loop +* + +]C SEP #$20 ;8 bit + LDY #0 ;Clear screen index register + LDA :Width ;Get width of shape + STA :Width2 +]B LDA (:ShapePtr) ;Get a shape byte + INC :ShapePtr + BNE :CU + INC :ShapePtr+1 +:CU STA :Temp1 ;Save temp + +* +* Convert the 1 bit per pixel image +* + + LDX #4 ;4 pixels per byte +]A ASL :Temp1 + BCC :ClearUpper ;Use as is? + LDA [:Screenad],Y + AND #$0F ;Keep upper pixel + ORA :Color+1 ;Get color to draw with + STA [:Screenad],Y + +:ClearUpper ASL :Temp1 ;Get another bit + BCC :ClearLower ;Keep lower pixel? + LDA [:Screenad],Y + AND #$F0 + ORA :Color + STA [:Screenad],Y ;Save to screen + +:ClearLower INY ;Next screen index + DEX ;All 8 bits done? + BNE ]A + DEC :Width2 ;All bytes done? + BNE ]B ;Loop + REP #$21 ;16 bit and clear carry + LDA :Screenad ;Get current scan line +* CLC + ADC #160 ;Next down + STA :Screenad + DEC :Height ;All done? + BNE ]C + LDX :ShapePtr ;Get current shape index + PLD + LDA :RTSVal,S ;Get return address + STA :EndDirect-2,S + CLC + TSC + ADC #4+12 ;Adjust + TCS + TXA ;Return current shape pointer + RTS ;Exit + +* +* Choose the brightest and the darkest colors +* and same the color numbers in ForeColor and BackColor +* + +CalcHighLow +:Temp = 1 +:MinInten = 3 +:MaxInten = 5 +:RTSVal = 7 + + TSC + SEC + SBC #6 ;Allocate my local storace + TCS + PHD + TCD + LDA #-1 ;Assume maximum intensity + STA :MinInten + STZ :MaxInten ;Assume minimum intensity + + LDY #32-2 ;All palette colors +]A LDA NewPalette,Y + AND #$0F + STA :Temp + LDA NewPalette,Y + LSR + LSR + LSR + LSR + AND #$0F + CLC + ADC :Temp + STA :Temp + LDA NewPalette+1,Y + AND #$FF + CLC + ADC :Temp + CMP :MinInten + BGE :More + STA :MinInten + STY ForeColor +:More CMP :MaxInten + BLT :Less + STA :MaxInten + STY BackColor +:Less DEY + DEY + BPL ]A + LSR ForeColor + LSR BackColor + PLD + TSC + CLC + ADC #6 + TCS + RTS + +* +* Init all the system tools and memory requirements +* + +InitTools +:Palette = 1 ;Temp palette +:Handle = 33 ;Temp handle +:RTSVal = 37 ;Return address +:EndDirect = 39 + + TSC + SEC + SBC #36 ;Create my stack frame + TCS + PHD + TCD + + PHA ;Space for ID + LDX #MMStartUp ;Start up the Memory Manager + JSL Tool_Entry + PLX + STX MyID ;Save my ID + BCS :Err2 + + LDX #TLStartUp ;Start up the Tool Locator + JSL Tool_Entry + BCS :Err2 + + PHA ;Space for handle + PHA + LDA MyID ;Save my application ID + PHA + PEA #2 ;Resource referance + PEA #^MyToolTable ;Index to tool list + PEA #MyToolTable + LDX #StartUpTools ;Start up all my tools + JSL Tool_Entry + PLX ;Get referance pointer + PLY + BCC :ToolOk +:Err2 BRL :Error + +:ToolOk STX ToolRef ;Save referance record + STY ToolRef+2 + + PHA + PEA #$1000 ;Application ID + LDX #GetNewID ;Get data memory ID + JSL Tool_Entry + PLX + BCS :Error + STX NewID ;Save it + + PEA #^MyIRQ ;Install my heartbeat irq + PEA #MyIRQ + LDX #SetHeartBeat + JSL Tool_Entry + + SEP #$20 + LDAL $E1C034 ;Set the border color to black + STA OldBorderColor + AND #$F0 + STAL $E1C034 + LDA #-1 + STA OldBorderColor+1 + + REP #$20 + PEA #0 ;Force screen to 320 mode + LDX #SetAllSCBs + JSL Tool_Entry + + LDX #32-2 +]A STZ :Palette,X ;Init a blank palette + DEX + DEX + BPL ]A + + LDA #0 + PHA ;Palette #0 + PHA ;Bank #0 + TDC + INC + PHA + LDX #SetColorTable ;Set color palette + JSL Tool_Entry + LDX #HideCursor + JSL Tool_Entry + + PHA ;Get the current port + PHA + LDX #GetPort + JSL Tool_Entry + PLA + STA :Handle + PLA + STA :Handle+2 + LDY #4 + LDA [:Handle],Y + STA VideoBank + LDA #0 + +:Error TAX ;Save error code + PLD ;Restore direct page + CLC + TSC + ADC #36 ;Remove local + TCS + TXA + CMP #1 + RTS + +* +* Quit the program RIGHT NOW! +* + +KillTools PEA #^MyIRQ + PEA #MyIRQ + LDX #DelHeartBeat + JSL Tool_Entry + +:NoDisp LDA OldBorderColor + BPL :NotBack + SEP #$20 + STAL $E1C034 ;clock control register + REP #$20 +:NotBack + + LDX ToolRef ;Any tools loaded? + LDY ToolRef+2 + BNE :Tools + TXA + BEQ :NoTools +:Tools PEA #1 ;Referance is by handle + PHY ;Pointer to Tool list + PHX + LDX #ShutDownTools ;Turn off all tools + JSL Tool_Entry + +:NoTools LDA NewID ;Get my memory ID + BEQ :BadID + PHA ;Remove + PHA ;Kill memory + LDX #DisposeAll ;Kill all allocated memory + JSL Tool_Entry + LDX #DeleteID ;Remove this ID + JSL Tool_Entry + +:BadID LDX #TLShutDown ;Kill Tool Locator + JSL Tool_Entry + LDA MyID + PHA + LDX #MMShutDown ;Kill Memory manager + JSL Tool_Entry + RTS + +* +* Check if the disk is online +* + +CheckHardDrive + PEA #^:FileInfo + PEA #:FileInfo + PEA #$2006 ;Get File Info + JSL GSOSSTACK + BCC :Floppy + +* +* Adjust pointer table to get rid of prefixs +* + + LDX #4-1*4 +]A CLC + LDA FNamePointers,X + ADC #5 + STA FNamePointers,X + TAY + LDA #9 + STA: $0000,Y + LDA #'9:' + STA: $0002,Y + DEX + DEX + DEX + DEX + BPL ]A + LDA #14 ;Corrent the final length + STA DeathAudioName+5 + LDA #-1 ;This is a hard disk game + STA HardDisk +:Floppy RTS + +:FileInfo DA 2 ;Parm count + ADRL VideoName ;Pathname + DS 2 ;Access + +* +* Read the joystick/keyboard +* + +GetJoyStick +:EventRec = 1 +:RTSVal = 17 +:EndDirect = 19 + + TSC + SEC + SBC #16 ;Stack frame + TCS + PHD + TCD + LDA KeyTime ;Time to read the keyboard? + BEQ :Read + BRL :NotYet ;Exit now + +:Read DEC KeyTime ;Set flag + + PHA + PEA #$FFFF ;Allow desk accs + PEA #0 + TDC + INC ;My event record + PHA + LDX #GetNextEvent + JSL Tool_Entry + PLA ;Get event # + BCS :NoKey2 ;Error? + BEQ :NoKey2 ;No event? + LDA :EventRec ;Event type + CMP #3 ;Keyboard + BEQ :KeyOk + CMP #5 ;Auto key? + BNE :NoKey2 +:KeyOk LDA :EventRec+2 ;Get key + CMP #'a' + BLT :Use + CMP #'z'+1 + BGE :Use + AND #$DF ;Convert to upper case + +:Use CMP #'Q' ;Quit? + BNE :NotQuit + LDA #-1 ;Set the quit flag + STA QuitFlag + BRA :NoKey2 + +:NotQuit CMP #'P' ;Pause + BNE :NotPause + LDA PauseFlag + EOR #-1 + STA PauseFlag +:NoKey2 BRL :NoKey + +:NotPause CMP #'S' ;Sound + BEQ :Sound + CMP #$13 ;Ctrl-S + BEQ :Sound + CMP #'A' ;Audio + BNE :NotSound +:Sound LDA SoundFlag ;Toggle sound bit + EOR #1 + STA SoundFlag + BRA :NoKey + +:NotSound CMP #'W' + BNE :NotWimp + LDA WimpMode + EOR #-1 + STA WimpMode + BRA :NoKey + +:NotWimp LDX #$10 ;Assume fire + CMP #$0D ;Enter + BEQ :JoyKey + CMP #'0' + BEQ :JoyKey + LDX #$08 + CMP #'2' ;2 or 5 + BEQ :JoyKey + CMP #'5' + BEQ :JoyKey + CMP #$0A + BEQ :JoyKey + + LDX #$02 + CMP #'4' + BEQ :JoyKey + CMP #$08 + BEQ :JoyKey + + LDX #$01 + CMP #'6' + BEQ :JoyKey + CMP #$15 + BEQ :JoyKey + + LDX #$04 + CMP #'8' + BEQ :JoyKey + CMP #$0B + BNE :NoKey +:JoyKey TXA + LDX JoyStickVal + BEQ :TooSoon + LDA #$FFFF +:TooSoon TSB JoyStickVal +:NoKey +:NotYet LDX JoyStickVal + PLD + CLC + TSC + ADC #16 + TCS + TXA + RTS + +* +* My global variables +* + +Tens DA 1,10,100,1000,10000 ;Tens for PrDec + +VideoBank DA $E1 ;Bank of video memory +WimpMode DS 2 ;I am wimping out! +MyID DS 2 ;My memory ID +NewID DS 2 ;My data ID +MyDirect DS 2 ;My direct page address +MyStack DS 2 ;My stack pointer +ToolRef DS 4 ;My tool handle +ForeColor DS 2 ;Foreground color +BackColor DS 2 ;Background color +SoundFlag DS 2 ;Set if sound is disabled +PauseFlag DS 2 ;Set if game is paused +QuitFlag DS 2 ;Set if game is quit +FadeFactor DS 2 ;Current fade index +FadeFlag DS 2 ;Fade direction (If any) +FadeTable DS 16 ;Fade multiply table +KeyTime DS 2 ;Zero if time to read the keyboard +ColorFlag DS 2 ;Set if a new palette is created +OldBorderColor DS 2 ;Previous border color +NewPalette DS 32 ;New game palette +JoyStickVal DS 2 ;Joy stick value +StartTimer DS 2 ;Set to start the videocount +VideoCount DS 2 ;Number of video frames of time delat +CountDown DS 2 ;Count down IRQ timer +SoundTimeDelta DS 2 ;Current running sound time +SoundTime DS 2 ;Sound time speed +MySoundHalt DA 1 ;Sound halt flag +Score DS 2 ;Current score +DiskTime DS 2 ;Time between disk events +HardDisk DS 2 ;Set if on a hard disk +UnpackPtr DS 4 ;Pointer to video data +PackSoundPtr DS 4 ;Pointer to current sound data +SoundSize DS 2 ;Remaining sound data +DocRamPtr DS 2 ;Pointer to DOC RAM +RawPackSoundPtr DS 4 ;True pointer to sound data +RawSoundSize DS 2 ;Size of sound data +FrameCounter DS 2 ;Current frame # +BlankPalFlag DS 2 ;Screen blanked? +SoundPitch DS 2 ;Sound pitch +PlayedDeath DS 2 ;Am I playing a death scene? +SoundPresent DS 2 ;Is a sound loaded? +CurrentScene DS 2 ;Which scene is active? +Lives DS 2 ;Number of lives left +WinFlag DS 2 ;Set if you have won! +ScoreDisable DS 2 ;Set if score screen is shut down +SideNeeded DS 2 ;Disk side needed (For floppies) + +* +* GSOS parmeters +* + +FNamePointers ADRL VideoName + ADRL AudioName + ADRL DeathName + ADRL DeathAudioName + +VideoName STRL ':DISK1:VIDEO01' +AudioName STRL ':DISK1:AUDIO01' +DeathName STRL ':DISK1:DEATH01' +DeathAudioName STRL ':DISK1:DEATH01AUDIO' + +* +* File index cache +* + +CacheFileNum DS 2*MemHandles +CacheHandle DS 4*MemHandles + +DiskSides DB 10,14,19,25,29,35,39,44,99 + +WeirdSides DA 9,$0412,$0C12,34,$822,$C22,$426 + +Files01 DA 01,$0401,0 +Files02 DA 02,0 +Files03 DA 03,0 +Files04 DA 04,0 +Files05 DA 05,0 + +AList01 DA 01,NullMoves + DA 0 +AList02 DA 02,NullMoves + DA 0 +AList03 DA 03,NullMoves + DA 0 +AList04 DA 04,NullMoves + DA 0 +AList05 DA 05,NullMoves + DA 0 + +Files06 DA 06,$0406,07,$0407,$0807,$0C07,0 +AList06 DA 06,NullMoves + DA 07,L16CD + DA 0 +L16CD HEX 18010807220208072B080807 +NullMoves HEX 00 + +Files07 DA 08,$0408,$0807,$0C07,0 +AList07 DA 08,L16EA + DA 0 +L16EA HEX 0F0808071E04080700 + +Files08 DA $0409,$0809,$0C09,09,0 +AList08 DA 09,L1703 + DA 0 +L1703 HEX 0D0108091B020809350208094F02080900 + +Files09 DA 10,$040A,$080A,$0C0A,11,$040B,0 +AList09 DA 10,L172C + DA 11,NullMoves + DA 0 +L172C HEX 1104080A00 + +Files10 DA 12,$040C,$080C,$0C0C,0 +AList10 DA 12,L1741 + DA 0 +L1741 HEX 0D10080C00 + +Files11 DA $080D,$0C0D,13,$040D,0 +AList11 DA 13,L1756 + DA 0 +L1756 HEX 0E01080D1404080D00 + +Files12 DA $080D,$0C0D,14,$040E,0 +AList12 DA 14,L176F + DA 0 +L176F HEX 1201080D1601080D00 + +Files13 DA 15,$040F,$080F,$0C0F,16,$0410,0 +AList13 DA 15,L1790 + DA 16,L1799 + DA 0 +L1790 HEX 0A08080F1001080F00 +L1799 HEX 0908080F0E02080F00 + +Files14 DA 17,$0411,$080F,$0C0F,0 +AList14 DA 17,L17B2 + DA 0 +L17B2 HEX 1110080F00 + +Files15 DA 18,$0812,$0412,$0C12,0 +AList15 DA 18,L17C7 + DA 0 +L17C7 HEX 2004081200 + +Files16 DA 19,$0413,$0813,$0C13,20,$0414,21,$0415,0 +AList16 DA 19,L17EC + DA 20,L17F1 + DA 21,L17F6 + DA 0 +L17EC HEX 1304081300 +L17F1 HEX 0D01081300 +L17F6 HEX 1104081300 + +Files17 DA 22,$0416,$0816,$0C16,23,$0417,0 +AList17 DA 22,L1813 + DA 23,L1818 + DA 0 +L1813 HEX 0F01081600 +L1818 HEX 1002081600 + +Files18 DA 24,$0418,$0816,$0C16,25,$0419,26,$041A,0 +AList18 DA 24,L183D + DA 25,L1842 + DA 26,L1847 + DA 0 +L183D HEX 0D02081600 +L1842 HEX 1401081600 +L1847 HEX 0B04081600 + +Files19 DA $081B,$0C1B,$081C,$0C1C,27,$041B,0 +AList19 DA 27,L1860 + DA 0 +L1860 HEX FF04081BFF08081B0C10081C1701081C00 + +Files20 DA $081B,$0C1B,$081C,$0C1C,28,$041C,0 +AList20 DA 28,L1885 + DA 0 +L1885 HEX FF04081BFF08081B0810081C00 + +Files21 DA $081B,$0C1B,$081C,$0C1C,29,$041D,0 +AList21 DA 29,L18A6 + DA 0 +L18A6 HEX FF04081BFF08081B0C10081C00 + +Files22 DA $081B,$0C1B,$081C,$0C1C,30,$041E,0 +AList22 DA 30,L18C7 + DA 0 +L18C7 HEX FF01081B0B10081C00 + +Files23 DA $081B,$0C1B,$081C,$0C1C,31,$041F,0 +AList23 DA 31,L18E4 + DA 0 +L18E4 HEX 0904081C1308081C00 + +Files24 DA $081B,$0C1B,$081C,$0C1C,32,$0420,0 +AList24 DA 32,L1901 + DA 0 +L1901 HEX 0510081C0E08081C00 + +Files25 DA $081B,$0C1B,$081C,$0C1C,33,$0421,0 +AList25 DA 33,L191E + DA 0 +L191E HEX 0901081C0E08081B00 + +Files26 DA $0422,$0C22,34,$0822,35,$0423,0 +AList26 DA 34,NullMoves + DA 35,L193F + DA 0 +L193F HEX 0502082200 + +Files27 DA $0824,$0C24,36,$0424,37,$0425,0 +AList27 DA 36,NullMoves + DA 37,L195C + DA 0 +L195C HEX 0B01082400 + +Files28 DA $0824,$0C24,38,$0426,0 +AList28 DA 38,L1971 + DA 0 +L1971 HEX 0D10082200 + +Files29 DA $0827,$0C27,39,$0427,40,$0428,41,$0429,0 +AList29 DA 39,NullMoves + DA 40,L199A + DA 39,NullMoves + DA 41,L199F + DA 0 +L199A HEX 0801082700 +L199F HEX 1102082700 + +Files30 DA $0827,$0C27,39,$0427,42,$042A,43,$042B,0 +AList30 DA 39,NullMoves + DA 42,L19C8 + DA 39,NullMoves + DA 43,L19CD + DA 0 +L19C8 HEX 0C01082700 +L19CD HEX 0B0208271201082700 + +Files31 DA 44,$042C,45,$042D,46,$042E,47,$042F,0 +AList31 DA 44,NullMoves + DA 45,NullMoves + DA 46,NullMoves + DA 47,NullMoves + DA 0 + +Files32 DA 48,$0430,49,$0431,0 +AList32 DA 48,NullMoves + DA 49,NullMoves + DA 0000 + +ScriptPtrs DA Files01,AList01 ;1 + DA Files02,AList02 ;2 + DA Files03,AList03 ;3 + DA Files04,AList04 ;4 + DA Files05,AList05 ;5 + DA Files06,AList06 ;6 + DA Files07,AList07 ;7 + DA Files08,AList08 ;8 + DA Files09,AList09 ;9 + DA Files10,AList10 ;10 + DA Files11,AList11 ;11 + DA Files12,AList12 ;12 + DA Files13,AList13 ;13 + DA Files14,AList14 ;14 + DA Files15,AList15 ;15 + DA Files16,AList16 ;16 + DA Files17,AList17 ;17 + DA Files18,AList18 ;18 + DA Files19,AList19 ;19 + DA Files20,AList20 ;20 + DA Files21,AList21 ;21 + DA Files22,AList22 ;22 + DA Files23,AList23 ;23 + DA Files24,AList24 ;24 + DA Files25,AList25 ;25 + DA Files26,AList26 ;26 + DA Files27,AList27 ;27 + DA Files28,AList28 ;28 + DA Files29,AList29 ;29 + DA Files30,AList30 ;30 + DA Files31,AList31 ;31 + DA Files32,AList32 ;32 + DA 0 ;No more scripts + + PUT shapes.a65 diff --git a/source/spaceacerez.a65 b/source/spaceacerez.a65 new file mode 100644 index 0000000..c8b22ac --- /dev/null +++ b/source/spaceacerez.a65 @@ -0,0 +1,195 @@ +* +* Space Ace IIgs Resource file +* + + LST OFF + TR ON + +rIcon = $8001 ; Icon type +rPicture = $8002 ; Picture type +rControlList = $8003 ; Control list type +rControlTemplate = $8004 ; Control template type +rC1InputString = $8005 ; GS/OS class 1 input string +rPString = $8006 ; Pascal string type +rStringList = $8007 ; String list type +rMenuBar = $8008 ; MenuBar type +rMenu = $8009 ; Menu template +rMenuItem = $800A ; Menu item definition +rTextForLETextBox2 = $800B ; Data for LineEdit LETextBox2 call +rCtlDefProc = $800C ; Control definition procedure type +rCtlColorTbl = $800D ; Color table for control +rWindParam1 = $800E ; Parameters for NewWindow2 call +rWindParam2 = $800F ; Parameters for NewWindow2 call +rWindColor = $8010 ; Window Manager color table +rTextBlock = $8011 ; Text block +rStyleBlock = $8012 ; TextEdit style information +rToolStartup = $8013 ; Tool set startup record +rResName = $8014 ; Resource name +rAlertString = $8015 ; AlertWindow input data +rText = $8016 ; Unformatted text +rCodeResource = $8017 +rCDEVCode = $8018 +rCDEVFlags = $8019 +rTwoRects = $801A ; Two rectangles +rFileType = $801B ; Filetype descriptors--see File Type Note $42 +rListRef = $801C ; List member +rCString = $801D ; C string +rXCMD = $801E +rXFCN = $801F +rErrorString = $8020 ; ErrorWindow input data +rKTransTable = $8021 ; Keystroke translation table +rWString = $8022 ; not useful--duplicates $8005 +rC1OutputString = $8023 ; GS/OS class 1 output string +rSoundSample = $8024 +rTERuler = $8025 ; TextEdit ruler information +rFSequence = $8026 +rCursor = $8027 ; Cursor resource type +rItemStruct = $8028 ; for 6.0 Menu Manager +rVersion = $8029 +rComment = $802A +rBundle = $802B +rFinderPath = $802C +rPaletteWindow = $802D ; used by HyperCard IIgs 1.1 +rTaggedStrings = $802E +rPatternList = $802F +rRectList = $C001 +rPrintRecord = $C002 +rFont = $C003 + +verUS = $0000 + + ORG $0000 + +* +* Resource file header +* + + ADRL 0 ;Version (0 = Little Endian) + ADRL FileToMap ;FileToMap + ADRL FileToMapEnd-FileToMap ;FileMapSize + DS 128 ;FileMemo + +FileToMap + DA 0 ;Not used + ADRL 0 ;Version (0 = Little Endian) + ADRL FileToMap ;FileToMap + ADRL FileToMapEnd-FileToMap ;FileMapSize + + + DA ResourceList-FileToMap ;MapToIndex + DA 0 ;mapFileNum + DA 0 ;mapID + ADRL 14 ;MapIndexSize (Size per entry) + ADRL 4 ;MapIndexUsed (Number of resources) + DA 10 ;MapFreeListSize + DA 1 ;MapFreeListUsed ;Number of used entries + +* +* Free data array +* + + ADRL EndOfFile ;End of the file + ADRL $FFFFFFFF-EndOfFile ;Amount of free space + DS {10-1}*8 ;Rest of the data (Not used) + + DS $100-* ;Pad to next sector + +* +* Array of resource entries +* + +ResourceList + DA rToolStartup ;resType + ADRL 1 ;resID + ADRL ToolStartup ;resOffset + DA 0 ;resAttr + ADRL ToolStartupEnd-ToolStartup ;resSize + ADRL 0 ;resHandle + + DA rResName ;resType + ADRL $18013 ;resID + ADRL ResourceNames ;resOffset + DA 0 ;resAttr + ADRL ResourceNamesEnd-ResourceNames ;resSize + ADRL 0 ;resHandle + + DA rVersion ;resType + ADRL 1 ;resID + ADRL Version ;resOffset + DA 0 ;resAttr + ADRL VersionEnd-Version ;resSize + ADRL 0 ;resHandle + + DA rComment ;resType + ADRL 1 ;resID + ADRL Comment ;resOffset + DA 0 ;resAttr + ADRL CommentEnd-Comment ;resSize + ADRL 0 ;resHandle + + DS 202 +FileToMapEnd + + +* +* Tool startup +* + +ToolStartup + DA 0 ;Flags + DA $C000 ;Start quickdraw in 320 mode + DA 0 ;Not used + ADRL 0 ;Not used + DA 7 ;Number of tools to start + DA 3 + DA $300 + DA 4 + DA $301 + DA 5 + DA $302 + DA 6 + DA $300 + DA 8 + DA $301 + DA 11 + DA $200 + DA 30 + DA $100 +ToolStartupEnd + +Version + DB 0 ;Release number + DB $A0 ;Development / Final + DB $10 ;Version 2.1 + DB 2 + + DA verUS ;Region code + STR 'Space Ace' + STR '(C) 1989,1991, ReadySoft Inc.' +VersionEnd + +Comment + ASC 'Space Ace was rewritten by Rebecca Ann Heineman so that ' + ASC 'you can use extra GS/OS memory and allow full use ' + ASC 'of a hard drive. Press 'D2'Q'D3' to quit from the game.'0D0D + + ASC 'Please purchase the real game from ReadySoft Inc. ' + ASC '30 Wertheim Court, Unit #2, Richmond Hill, Ontario, ' + ASC 'Canada, L4B 1B9'0D0D + ASC 'Tel (416)-731-4175' +CommentEnd + +ResourceNames + DA 1 ;Name holder + ADRL 1 ;Number of resources + ADRL 1 ;Resource ID + STR 'MyTools' ;Name of the resource +ResourceNamesEnd + +* +* Label for the end of the file, for file size +* + +EndOfFile + + SAV ../bin/SpaceAce#b3db03r \ No newline at end of file diff --git a/tools/bin/macosx/packsound b/tools/bin/macosx/packsound new file mode 100644 index 0000000000000000000000000000000000000000..0fba40949bcc88e787449d26ee2a11a7bdf43214 GIT binary patch literal 144368 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 D?JzCC literal 0 HcmV?d00001 diff --git a/tools/bin/windows/x64/packsound.exe b/tools/bin/windows/x64/packsound.exe new file mode 100644 index 0000000000000000000000000000000000000000..ae00796c3794fdc8bb6fb85287a36e01222396fc GIT binary patch literal 100352 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 literal 0 HcmV?d00001 diff --git a/tools/bin/windows/x86/packsound.exe b/tools/bin/windows/x86/packsound.exe new file mode 100644 index 0000000000000000000000000000000000000000..d6ad377e17eccb17d1a4c124f470face2398a53b GIT binary patch literal 93184 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 literal 0 HcmV?d00001 diff --git a/tools/packsound/packsoundv10win.sln b/tools/packsound/packsoundv10win.sln new file mode 100644 index 0000000..a4fbe1d --- /dev/null +++ b/tools/packsound/packsoundv10win.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "packsound", "packsoundv10win.vcxproj", "{8CAB6D8F-1F54-342A-A976-B3AC26EB8576}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8CAB6D8F-1F54-342A-A976-B3AC26EB8576}.Release|Win32.ActiveCfg = Release|Win32 + {8CAB6D8F-1F54-342A-A976-B3AC26EB8576}.Release|Win32.Build.0 = Release|Win32 + {8CAB6D8F-1F54-342A-A976-B3AC26EB8576}.Release|x64.ActiveCfg = Release|x64 + {8CAB6D8F-1F54-342A-A976-B3AC26EB8576}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tools/packsound/packsoundv10win.vcxproj b/tools/packsound/packsoundv10win.vcxproj new file mode 100644 index 0000000..1c51b9a --- /dev/null +++ b/tools/packsound/packsoundv10win.vcxproj @@ -0,0 +1,35 @@ + + + + + Release + Win32 + + + Release + x64 + + + + packsound + ..\bin\windows\ + {8CAB6D8F-1F54-342A-A976-B3AC26EB8576} + + + + + + + + + + $(ProjectDir)source;%(AdditionalIncludeDirectories) + + + + + + + + + diff --git a/tools/packsound/packsoundv10win.vcxproj.filters b/tools/packsound/packsoundv10win.vcxproj.filters new file mode 100644 index 0000000..13be8e0 --- /dev/null +++ b/tools/packsound/packsoundv10win.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + source + + + source + + + {6A6F04C1-7342-3D5C-A6A4-779EF27C7D1F} + + + diff --git a/tools/packsound/packsoundxc3osx.xcodeproj/project.pbxproj b/tools/packsound/packsoundxc3osx.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3e5d6d8 --- /dev/null +++ b/tools/packsound/packsoundxc3osx.xcodeproj/project.pbxproj @@ -0,0 +1,231 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 2975406015CFD4772E57E4D6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 957F7268BCFABFC0E258709B /* QuartzCore.framework */; }; + 457443B50A464B981B7F33A0 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB663B78C243F425CB5F622D /* IOKit.framework */; }; + 9ED89AC12C3D9718E3B17835 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60566A081602146F3C8BA8CA /* Carbon.framework */; }; + B54FC9256679818F58A1B7FC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BBF96056AA4E7B57C08772 /* Cocoa.framework */; }; + B68D493CFB2FE31F3D7C57A5 /* packsound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F3835B6D83177655093922B5 /* packsound.cpp */; }; + BD1F68D147E9B32F91C8594B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6061B328817055E8B2E193D6 /* AppKit.framework */; }; + D337DA4A07D1F3CC84F2449B /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AC54CC47F3C0DD9956B9AD3 /* OpenGL.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + 8F5ADA69E6CF0A5F85B84100 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + filePatterns = "*.glsl"; + fileType = pattern.proxy; + isEditable = 1; + outputFiles = ( + "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h", + ); + script = "${SDKS}/macosx/bin/stripcomments ${INPUT_FILE_PATH} -c -l g_${INPUT_FILE_BASE} ${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXFileReference section */ + 04BBF96056AA4E7B57C08772 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 153770813E582A11A3AC4062 /* packsound */ = {isa = PBXFileReference; explicitFileType = compiled.mach-o.executable; includeInIndex = 0; path = packsound; sourceTree = BUILT_PRODUCTS_DIR; }; + 32398A14DA8C84502195F75F /* packsound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = packsound.h; path = source/packsound.h; sourceTree = SOURCE_ROOT; }; + 53A745DDC21ECBC748B26AF9 /* burger.toolxcoosx.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = burger.toolxcoosx.xcconfig; path = xcode/burger.toolxcoosx.xcconfig; sourceTree = SDKS; }; + 60566A081602146F3C8BA8CA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + 6061B328817055E8B2E193D6 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 957F7268BCFABFC0E258709B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 9AC54CC47F3C0DD9956B9AD3 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + CB663B78C243F425CB5F622D /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + F3835B6D83177655093922B5 /* packsound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = packsound.cpp; path = source/packsound.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84C32067AA706885861DBAF2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BD1F68D147E9B32F91C8594B /* AppKit.framework in Frameworks */, + 9ED89AC12C3D9718E3B17835 /* Carbon.framework in Frameworks */, + B54FC9256679818F58A1B7FC /* Cocoa.framework in Frameworks */, + 457443B50A464B981B7F33A0 /* IOKit.framework in Frameworks */, + D337DA4A07D1F3CC84F2449B /* OpenGL.framework in Frameworks */, + 2975406015CFD4772E57E4D6 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4CE489F4A9041625DE5927C3 /* source */ = { + isa = PBXGroup; + children = ( + F3835B6D83177655093922B5 /* packsound.cpp */, + 32398A14DA8C84502195F75F /* packsound.h */, + ); + path = source; + sourceTree = SOURCE_ROOT; + }; + 50CFB971DA7264BD50846293 /* packsound */ = { + isa = PBXGroup; + children = ( + 6555983C4FFDAFC88D6ED936 /* Frameworks */, + 9796CE949CD3951E99BB35F6 /* Products */, + 4CE489F4A9041625DE5927C3 /* source */, + 53A745DDC21ECBC748B26AF9 /* burger.toolxcoosx.xcconfig */, + ); + name = packsound; + sourceTree = ""; + }; + 6555983C4FFDAFC88D6ED936 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6061B328817055E8B2E193D6 /* AppKit.framework */, + 60566A081602146F3C8BA8CA /* Carbon.framework */, + 04BBF96056AA4E7B57C08772 /* Cocoa.framework */, + CB663B78C243F425CB5F622D /* IOKit.framework */, + 9AC54CC47F3C0DD9956B9AD3 /* OpenGL.framework */, + 957F7268BCFABFC0E258709B /* QuartzCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9796CE949CD3951E99BB35F6 /* Products */ = { + isa = PBXGroup; + children = ( + 153770813E582A11A3AC4062 /* packsound */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E5BAEE20F1E65333937E97F8 /* packsound */ = { + isa = PBXNativeTarget; + buildConfigurationList = 24B610ECC900D2F6B262E5AD /* Build configuration list for PBXNativeTarget "packsound" */; + buildPhases = ( + 193563A30A43A524C4061DC0 /* Sources */, + 84C32067AA706885861DBAF2 /* Frameworks */, + B491C6B43A4AFEBA72EDE202 /* ShellScript */, + 2E2CA33F02F2C6797FC94387 /* ShellScript */, + ); + buildRules = ( + 8F5ADA69E6CF0A5F85B84100 /* PBXBuildRule */, + ); + dependencies = ( + ); + name = packsound; + productName = packsound; + productReference = 153770813E582A11A3AC4062 /* packsound */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D81F2798ABA480661C5010EC /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + }; + buildConfigurationList = 872A09416D22001CCFA95821 /* Build configuration list for PBXProject "packsoundxc3osx" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 50CFB971DA7264BD50846293 /* packsound */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E5BAEE20F1E65333937E97F8 /* packsound */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2E2CA33F02F2C6797FC94387 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${CONFIGURATION_BUILD_DIR}/${EXECUTABLE_NAME}", + ); + outputPaths = ( + "${CONFIGURATION_BUILD_DIR}/../../../bin/macosx/${FINAL_OUTPUT}", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" == \"Release\" ]; then\n${SDKS}/macosx/bin/p4 edit ../bin/macosx/${FINAL_OUTPUT}\n${CP} ${CONFIGURATION_BUILD_DIR}/${EXECUTABLE_NAME} ../bin/macosx/${FINAL_OUTPUT}\nfi\n\n"; + showEnvVarsInLog = 0; + }; + B491C6B43A4AFEBA72EDE202 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${CONFIGURATION_BUILD_DIR}/${EXECUTABLE_NAME}", + ); + outputPaths = ( + "${SRCROOT}/bin/${EXECUTABLE_NAME}${IDESUFFIX}${SUFFIX}", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ ! -d ${SRCROOT}/bin ]; then mkdir ${SRCROOT}/bin; fi\n${CP} ${CONFIGURATION_BUILD_DIR}/${EXECUTABLE_NAME} ${SRCROOT}/bin/${EXECUTABLE_NAME}${IDESUFFIX}${SUFFIX}\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 193563A30A43A524C4061DC0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B68D493CFB2FE31F3D7C57A5 /* packsound.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 0AD89479A6F9267244955A36 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 53A745DDC21ECBC748B26AF9 /* burger.toolxcoosx.xcconfig */; + buildSettings = { + }; + name = Release; + }; + AFD1EFE3D6FB31324ADCA0EA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 24B610ECC900D2F6B262E5AD /* Build configuration list for PBXNativeTarget "packsound" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFD1EFE3D6FB31324ADCA0EA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 872A09416D22001CCFA95821 /* Build configuration list for PBXProject "packsoundxc3osx" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0AD89479A6F9267244955A36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D81F2798ABA480661C5010EC /* Project object */; +} diff --git a/tools/packsound/source/packsound.cpp b/tools/packsound/source/packsound.cpp new file mode 100644 index 0000000..bf6f293 --- /dev/null +++ b/tools/packsound/source/packsound.cpp @@ -0,0 +1,198 @@ +/*************************************** + + Tool to process data for Space Ace IIgs + + Copyright (c) 1995-2015 by Rebecca Ann Heineman + + It is released under an MIT Open Source license. Please see LICENSE + for license details. Yes, you can use it in a + commercial title without paying anything, just give me a credit. + Please? It's not like I'm asking you for money! + +***************************************/ + +#include "packsound.h" + +#define DOC_28MHZ 28636360.0f // Master Ensoniq clock rate +#define DOC_RATE (DOC_28MHZ/32.0f) // Ensoniq clock rate +#define SCAN_RATE (DOC_RATE/34.0f) // All oscillators are enabled + +struct SpaceAceAudioFile_t { + Word16 m_uDOCRate; // Value to put into the Ensoniq DOC for sample rate + Word16 m_uBytesPerTick; // Number of bytes consumed per 1/60th of a second tick + Word8 m_Data[1]; // Raw audio data +}; + +static const Word8 g_Lookup[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; + +/*************************************** + + Process a sound file into 4 bits per sample + +***************************************/ + +static Word ExtractSound(OutputMemoryStream *pOutput,const Word8 *pInput,WordPtr uInputLength) +{ + if (uInputLength<4) { + printf("Input is too small\n"); + return 1; + } + if (MemoryCompare("RIFF",pInput,4)) { + printf("Not a sound file\n"); + return 1; + } + Word32 uFileLength = LittleEndian::Load(reinterpret_cast(pInput+4)); + if (uFileLength!=uInputLength) { + printf("Sound file length mismatch\n"); + return 1; + } + + // Calculate the DOC rate + int iSampleRate = LittleEndian::Load(reinterpret_cast(pInput+24)); + // Convert from a IIgs step rate to a samples per second rate + int iDOCRate = static_cast(((static_cast(iSampleRate)*512.0f)/SCAN_RATE)+0.5f); + + // Output the Space Ace audio header + pOutput->Append(static_cast(iDOCRate)); + pOutput->Append(static_cast((iSampleRate+59)/60)); + + // WGet the number of samples + Word uSoundLength = LittleEndian::Load(reinterpret_cast(pInput+40)); + uSoundLength>>=1U; + if (uSoundLength) { + const Word8 *pTemp = pInput+44; + do { + // Convert to 4 bits per sample audio + pOutput->Append(static_cast((pTemp[0]&0xF0U)+(pTemp[1]>>4U))); + pTemp+=2; + } while (--uSoundLength); + } + return 0; +} + +/*************************************** + + Convert a Space Ace file to a WAV file + +***************************************/ + +static Word EncapsulateToWAV(OutputMemoryStream *pOutput,const Word8 *pInput,WordPtr uInputLength) +{ + // Too small? + if (uInputLength<4) { + return 10; + } + const Word8 *pWork = pInput+4; + WordPtr uCounter = uInputLength-4; + + int iSampleRate = LittleEndian::Load(&reinterpret_cast(pInput)->m_uDOCRate); + // Convert from a IIgs step rate to a samples per second rate + iSampleRate = static_cast((static_cast(iSampleRate)/512.0f)*SCAN_RATE); + + // Trim excess data if needed + + if (uCounter) { + do { + if (pWork[uCounter-1]==0x88) { + break; + } + } while (--uCounter); + } + + pOutput->Append("RIFF"); + pOutput->Append(static_cast((uCounter*2)+44)); + pOutput->Append("WAVEfmt "); + pOutput->Append(static_cast(16)); // Chunk size (Minimum) + pOutput->Append(static_cast(1)); // Format code (PCM) + pOutput->Append(static_cast(1)); // Mono + pOutput->Append(static_cast(iSampleRate)); // Samples per second + pOutput->Append(static_cast(iSampleRate)); // Bytes per second (Same as samples) + pOutput->Append(static_cast(1)); // Byte aligned + pOutput->Append(static_cast(8)); // Bits per sample + pOutput->Append("data"); + pOutput->Append(static_cast(uCounter*2)); + + // No diff + do { + pOutput->Append(g_Lookup[(pWork[0]>>4)&0xF]); + pOutput->Append(g_Lookup[pWork[0]&0xF]); + ++pWork; + } while (--uCounter); + + return 0; +} + +/*************************************** + + Main dispatcher + +***************************************/ + +int BURGER_ANSIAPI main(int argc,const char **argv) +{ + ConsoleApp MyApp(argc,argv); + CommandParameterBooleanTrue DoSound("Process Sound","s"); + CommandParameterBooleanTrue DoWave("Convert to Wave","w"); + const CommandParameter *MyParms[] = { + &DoSound, + &DoWave + }; + + argc = MyApp.GetArgc(); + argv = MyApp.GetArgv(); + argc = CommandParameter::Process(argc,argv,MyParms,sizeof(MyParms)/sizeof(MyParms[0]), + "Usage: packsound InputFile OutputFile\n\n" + "Preprocess data for Space Ace IIgs.\nCopyright by Rebecca Ann Heineman\n",3); + if (argc<0) { + Globals::SetErrorCode(10); + } else { + MyApp.SetArgc(argc); + + Filename InputName; + InputName.SetFromNative(argv[1]); + + WordPtr uInputLength; + Word8 *pInput = static_cast(FileManager::LoadFile(&InputName,&uInputLength)); + if (!pInput) { + printf("Can't open %s!\n",argv[1]); + Globals::SetErrorCode(10); + } else { + + // Convert wave to data + if (DoSound.GetValue()) { + OutputMemoryStream Output; + if (ExtractSound(&Output,pInput,uInputLength)) { + printf("Can't convert %s!\n",argv[1]); + Globals::SetErrorCode(10); + } else { + Filename OutputName; + OutputName.SetFromNative(argv[2]); + if (Output.SaveFile(&OutputName)) { + printf("Can't save %s!\n",argv[2]); + Globals::SetErrorCode(10); + } + } + + // Convert raw audio to WAV + } else if (DoWave.GetValue()) { + OutputMemoryStream Output; + if (EncapsulateToWAV(&Output,pInput,uInputLength)) { + printf("Can't convert %s!\n",argv[1]); + Globals::SetErrorCode(10); + } else { + Filename OutputName; + OutputName.SetFromNative(argv[2]); + if (Output.SaveFile(&OutputName)) { + printf("Can't save %s!\n",argv[2]); + Globals::SetErrorCode(10); + } + } + } else { + printf("No conversion selected for %s!\n",argv[1]); + Globals::SetErrorCode(10); + } + Free(pInput); + } + } + return Globals::GetErrorCode(); +} diff --git a/tools/packsound/source/packsound.h b/tools/packsound/source/packsound.h new file mode 100644 index 0000000..aeb54ce --- /dev/null +++ b/tools/packsound/source/packsound.h @@ -0,0 +1,23 @@ +/*************************************** + + Tool to pre-process data for Space Ace IIgs + + Copyright (c) 1995-2015 by Rebecca Ann Heineman + + It is released under an MIT Open Source license. Please see LICENSE + for license details. Yes, you can use it in a + commercial title without paying anything, just give me a credit. + Please? It's not like I'm asking you for money! + +***************************************/ + +#ifndef __PACKSOUND_H__ +#define __PACKSOUND_H__ + +#ifndef __BURGER__ +#include +#endif + +extern int BURGER_ANSIAPI main(int argc,const char **argv); + +#endif