diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..6a55ff0 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,17 @@ +on: [push] + +jobs: + build_pipeline: + runs-on: ubuntu-latest + name: Run assembly and compare binaries + steps: + - uses: actions/checkout@v1 + - name: Install Merlin + uses: digarok/install-merlin32-action@v0.1.0 + + - name: Assemble Source + run: chmod +x build.sh ; ./build.sh + + - name: Super Complex Parity Check Algorithm + run: diff src/twgs_1.8s/twgs rom/twgs_1.8s/twgs-rom.bin + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b3efc6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*Output.txt +_FileInformation.txt diff --git a/README.md b/README.md index b160fc8..744441c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ # TransWarpGS-ROM The TransWarp IIgs ROM 1.8s Disassembly (and reassembly!) + +![Build TWGS v1.8 100% Parity](https://github.com/digarok/TransWarpGS-ROM/workflows/.github/workflows/main.yml/badge.svg) + +This project is intended for educational purposes only. + +## About + +The TransWarp GS was an accelerator card add-on for the Apple IIgs. This project features a complete dissassembly of the source code of the TransWarp IIgs ROM (v1.8s) which can be built into a 100% binary parity version using Merlin32. + +## Build + +You can build the source using Merlin32 directly in the `src/twgs_1.8s` directory like `merlin32 -V . twgs.s` + +There's also a build script in the root folder called `build.sh` but it expects `merlin32` to exist in your path so you'll need to set that up or modify the script to point to where it's located on your system. The advantage of running `./build.sh` is that it checks the output binary and if everything matches it will tell you with the following message: +``` +Binary is v1.8s compatible +```` + +## Comparing + +You could always use `diff` to check against the 1.8s ROM for differences in your output object file, but that only tells you that a difference exists. I find visual diff is very helpful for reassembling these binaries and have included a script I use, in unison with my `hihex` command-line tool to visually diff the resultant binaries. If you don't have hihex, it should fall back to vimdiff with hexdum. + +## CI/CD + +This project uses GitHub actions that I've published on the open marketplace to build the project and also verify the resulting binary. Now it can check the binary parity on every commit! + +## Contributing + +This was a quick release to get this shared out as a priority. Right now, I'd like to accept contributions that add to the documentation and/or disassembly, versus changes or enhancements. If you want to work on enhancements, I suggest you fork the project, add a branch, add a separate version folder in both `rom` and `src` directories. Then if you have a new version you'd like to contribute back you can submit a pull request of that branch to this project. + +## Thanks +There's no way I would've been able to get this far with the contributions of the following stellar technologists: + +Henry Courbis, Anthoni Martino, Antoine Vignau, Geoff Body, Ferox (The Flaming Bird Disassembler), Ewan Wanop (BrkDown) diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..5fdfb24 --- /dev/null +++ b/build.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# set merlin32 exe/path if different +MERLIN=merlin32 +SRCDIR=src/twgs_1.8s/ +ROMDIR=rom/twgs_1.8s/ + +$MERLIN -V $SRCDIR $SRCDIR/twgs.s +diff $SRCDIR/twgs $ROMDIR/twgs-rom.bin +if [ "$?" -eq 0 ] +then + echo "Binary is v1.8s compatible" +else + echo "Not binary compatible with v1.8s" +fi diff --git a/diffbins.sh b/diffbins.sh new file mode 100755 index 0000000..df30429 --- /dev/null +++ b/diffbins.sh @@ -0,0 +1,24 @@ +#!/bin/bash +if ! command -v vimdiff &> /dev/null +then + echo "Sorry this requires vimdiff." + exit +fi + +HEXDUMP=hihex +if ! command -v $HEXDUMP &> /dev/null +then + echo "$HEXDUMP could not be found. " + echo "It is recommended you download this and put it in your path." + echo " https://github.com/digarok/hihex/releases/" + echo "" + sleep 2 + echo "We will revert to hexdump, which does not show high-bit ascii appropriately." + echo "" + sleep 3 + $HEXDUMP=hexdump +fi + + + +vimdiff <($HEXDUMP -offset 0xbc8000 src/twgs_1.8s/twgs) <($HEXDUMP -offset 0xbc8000 rom/twgs_1.8s/twgs-rom.bin) diff --git a/rom/twgs_1.8s/twgs-rom.bin b/rom/twgs_1.8s/twgs-rom.bin new file mode 100644 index 0000000..632e09d Binary files /dev/null and b/rom/twgs_1.8s/twgs-rom.bin differ diff --git a/src/twgs_1.8s/twgs b/src/twgs_1.8s/twgs new file mode 100644 index 0000000..632e09d Binary files /dev/null and b/src/twgs_1.8s/twgs differ diff --git a/src/twgs_1.8s/twgs.2.s b/src/twgs_1.8s/twgs.2.s new file mode 100644 index 0000000..580b057 --- /dev/null +++ b/src/twgs_1.8s/twgs.2.s @@ -0,0 +1,933 @@ +* This is most of the data used for the graphics and sound routines + +Wavetable_Data DW $002A ; not actually sure how this is used yet. + DW $0003 ; i have to finish disasm of routine that + DW $0004 ; uses it, Build_Wavetable + DW $0005 + DW $0006 + DW $0007 + DW $0008 + DW $0009 + DW $000A + DW $000B + DW $000C + DW $000D + DW $000F + DW $0010 + DW $0012 + DW $0014 + DW $0016 + DW $0018 + DW $001A + DW $001D + DW $0020 + DW $0023 + DW $0027 + DW $002B + DW $002F + DW $0034 + DW $0039 + DW $003F + DW $0045 + DW $004C + DW $0054 + DW $005C + DW $0066 + DW $0070 + DW $007B + DW $0087 + DW $0095 + DW $00A4 + DW $00B5 + DW $00C6 + DW $00DA + DW $00F0 + DW $0108 + +Wavetable_Data2 DW $FFFF + DW $FFFF + DW $0002 + DW $0005 + + +Sound_Data HEX 0000000000000580 + HEX 00400000400300000A204112A06D0B00 + HEX 010000000000080004299AA46D910000 + HEX 82006DDBBA44A228497B964C8400E851 + HEX B42F912842D0BE258126CA8812419680 + HEX AC5D32425FB23138104406B46E932924 + HEX 10112D802449FADA2E186549D8972680 + HEX 2840CB0276890C4452D72E2B20920002 + HEX B0DB28890044C1CFB200C9049992F66E + HEX 89680148922DDB13598088AD6B90417C + HEX 02784D4449426841EBB626A328EC5BB4 + HEX 455F660B40826D8B6E0AC02028DFBE25 + HEX 812213FA160081484A82BE2E48269180 + HEX F625591B5280D6C81225B05B97251220 + HEX 1350BE841445414BB7ED4B96C80004FD + HEX 4B0224B32502C11651CABE2E93006F84 + HEX 4CA8DF9789B28064D99A04A284257B9B + HEX 49908436A200684D24774B9A5842261B + HEX 48206C69A2778B047C4B46023225698B + HEX BA7D0948210BD877594451021245812C + HEX 41D216E90B128D8036BD5B644AD2B677 + HEX 8B2809E8DA25220541FBBA00949045DD + HEX C26C1614521098678330685F1008A224 + HEX 421BD72C4F24095A24132200E9CDD605 + HEX 925051ED9640B22489C208E9CDB26517 + HEX 802950D70571924ACAB637842060A145 + HEX 00DBB7C19290754F062CA108A09B2C20 + HEX 5DE06E8D0059D09A49FAB66C7AB64993 + HEX 04B801290A00988CA228ECDFB2088000 + HEX EC892C09DABB2D084801DB9790102060 + HEX 6F105040B730B224495F976472148522 + HEX A011EF9A8940B6ADB3050958F72D9104 + HEX 215D2E4A5BD76D39291140932DB22CA0 + HEX 7B1640D0BE24922948DB9A8416946EDB + HEX 128BD0BB4C12018800D48D82DA6D2929 + HEX 68DDA259A2D0B5992C694D17591400F5 + HEX 5902205A20491736F80B220A00844A96 + HEX D63520A176FB1248A0A0C4122403D826 + HEX 49DFD74422D42DA32448FB9F0012002D + HEX 916949E8DA24849076CB061A40028804 + HEX B02CC066116BBB6D0904B85D6011C202 + HEX 4C12B4AD6B66010D2800E2976494016C + HEX DD935082F6248210AFDB16CA02D64022 + HEX 25E81B2642DABB05998505BA64426BB3 + HEX 4880F6A522000D590143EAD726280400 + HEX 480C61DA9B48D0001958468A42B82504 + HEX 857DC9521968B70151BB6D9225425964 + HEX 09DB9B2619292000644A44B62F21B26D + HEX 9B9E5016D44404B0B65B465168B64D04 + HEX D6369B486181221382B267B3052C0BB2 + HEX 76CBB64E26044082A140A6A47D59B4ED + HEX ED9A499480AC8105284D644958265302 + HEX D8765B8045948124512899E89A4892C0 + HEX CD8290AEEDB624B2284496200960B77D + HEX 01A27821B070DF8644FAA6C8A42860CB + HEX 1242FF160410D46805748800164D3224 + HEX C9C2BA55EBF6459210C95B644AC01644 + HEX 02BCA032A0A50BF6A08925715F328940 + HEX A300D113519085E40B972E2125501246 + HEX 085F1088EDA28090D67DD9444806B63E + HEX 818468D01708D093D19280459B05B05B + HEX 165902204EDA9F24DBA26DB32575CD20 + HEX 0851481800424A88BA7D59B42F298565 + HEX DD6C414B02034800E5DBD22F04161008 + HEX 8166B4A077010048923013DB96701682 + HEX 26DBB704DE640AEB168804D22614816C + HEX 09A6A95F1001D297C886B06CB320E8CB + HEX 2681DB178C1295C5D082A82188E45923 + HEX 0A6F02095993CC149044B880369B882E + HEX B3C02D900C49F842116AB7006AB7494C + HEX 6211C01E5004B44520F02E11F2AC82A2 + HEX 27984C080B66648B340BFABA8984D06C + HEX 19E02D8B4A09063218D0BE6C0225CAD0 + HEX C2645BB7CD82BA3D94816D19044AFB06 + HEX 719B45085A23504F369082BA5502FE04 + HEX 4096095AE08EC2BA20001EC104A001B2 + HEX F025A4B03E0B80058A280D0420994036 + HEX E9539E25086429CF0270914D00499019 + HEX 689B04E902497A830946B018C0205912 + HEX 17A059506DCF22314EA0391BA8E80929 + HEX 40509E24DF1A5200D46DDB3748162109 + HEX EB134088AC4170B34413B527CB341314 + HEX 124806B74C16B86658BB4494BA6C26B4 + HEX 0003B80B8000494E00C8A2D00402DC45 + HEX 8ADA8814F06D98F42E93F42E22B02E20 + HEX 852DB3013581046891853E49B066A228 + HEX 5404A106E9968570B660DD1455B34404 + HEX 9B0E88B2B02CCF808422853688F224B1 + HEX 844454986CFBBA2E0805E8DD8609BA66 + HEX 12409220934A415D602416050824C02E + HEX 1AF22F01B064799C4402210298D6A9DA + HEX 03643281AE1B2844B1802414DC279324 + HEX 684BF72510501002D7EC4282C884D628 + HEX A08A6011041352B69D4200C87F12018B + HEX 46680B2DC10B0264DD264AB301AD4936 + HEX 0192A3E8294561DD64A04B247D91052D + HEX 0B825C00B43F01906D876402D99A8D04 + HEX 14086FA2700B72035196ED4104580009 + HEX 402B2063AB90277892648488508F1641 + HEX 8166420BD66D7EA26402BC8C224508C0 + HEX D66880B342E204B709003593812DBAA8 + HEX 6D1028BC4B979182B46D702389DB4219 + HEX 0014D092B850DABF8C4018005A173091 + HEX 29605F240150023D13DC24B5002CD8A3 + HEX 0830822492DC36C9204882DC04D0088B + HEX 90167C6B04459BC56EDBC4C4168144C8 + HEX 36124A4A487D82AE11054504BE5404B6 + HEX 204CB7645D244385A211141BC090BAC8 + HEX 4092225150026832EA0D087001A23981 + HEX 1653A2B02ED2BE55823C04609351DE26 + HEX 010F2827A1910501F0CD00D62CC99218 + HEX 529385C172990412C940B24C42B2FD5B + HEX B7A591B04B7016CA0024704B2429EFB4 + HEX 26EBB06F84A4D800034941B6A6799288 + HEX 22F2458164641BBE0030F40524804D48 + HEX 0049FB56814F86A814012801C2458738 + HEX 000EE66CCB0483DB092059D26F178066 + HEX 0138409B4C0958022784121BC122408E + HEX 2A754B24FD8B9005D2BC34932689FB52 + HEX 48A06C0000242D17A08E5BBC6010277D + HEX 84D62451BF685F48AC91C4A542B64AFA + HEX 628189A42EA3D8C802020A080C2880BF + HEX 256190005B136F320564002248D67063 + HEX 8B970490932052BE4D14381968286889 + HEX A87D23D445E293210D4C0413B8C800B6 + HEX 4280938081B8456B3BC4C12C698DA2C9 + HEX 820019D09728ABFC24405489930C611B + HEX 5034E9161C49402681E087848228C954 + HEX A17186240C26389C0E52C0267C8D9225 + HEX A3D8055538C90888749DA06280211459 + HEX B6439AB7220E0250092007E9B6E43A80 + HEX 683B9025B8BE211B7063091427542541 + HEX 288D004876890B00AF4B80CCE8B6880D + HEX 242F11011C6042624D12A852961AC00A + HEX A498DA256880E99D052830B06C047645 + HEX D9212C90C728183B500048E699D06482 + HEX B70844063D118C35C1021AD016263AB2 + HEX C1C80669924C044214B80BB82E894718 + HEX 10104610956780B78C88323D01F12D98 + HEX 88D0048005510070CD13306B23E18900 + HEX 6CD203A532088ADA9A404AB92F12560A + HEX D064298AF6480E927541AC44FF126021 + HEX 8A40962A0B0CB28CE03A810980EC9482 + HEX 3151D60ED6800553DCC069131190A86E + HEX 00060B6D160883D140DB2B0902B6474B + HEX 61095B63692246E8CBC645D89B005D64 + HEX 61DB025A08A47D4B644146BA4C163082 + HEX 4BA509C993905B24678316317B2703CC + HEX 244553BF6F9BA4417C6049141649002A + HEX F801DC650084A601869240A406029A81 + HEX 72164C92A1CDDD240C12BF45816E4249 + HEX B4AEED422441B4084F231300901CC040 + HEX 620B349A00B045EF40684AA24C36A4AD + HEX 8936EC51FC0603D00004220742D3280A + HEX F42420C148184D08A0B66288C16D7926 + HEX 498FA6890694656F0064E91227A50404 + HEX 5D2A031BF004161209C8B325849649FB + HEX 4A40C917C0CDD406007003481065C492 + HEX E5A320097E132C11F4085B4D21014278 + HEX C13075C9292943F42CC94C7523A04682 + HEX AA2E24A006889780A3B8455027355EB2 + HEX 434222514B68E829016D90B1E52B90AD + HEX C24A2C21B911400370A1D804D9B06996 + HEX 443419C100DCB26836D0844BA49C8266 + HEX 6909980D8CCA84E2B65189FE45A884CD + HEX D21E0199D560642228973059D80400FA + HEX B36CEBB24513FC64871809C10853D032 + HEX 60ADE0A57B4240C91A34B10064596208 + HEX 62D505C9687909025910C4400268A803 + HEX 905D50F44550DC6D897220C1BC585820 + HEX 3CDF400441D20CF03A7D91204A460054 + HEX 049407013428FE829840B235A244428D + HEX 8800D2BF2DC8447C89360A08A6C016A1 + HEX E54B006DD09F2D308569C82342C0E244 + HEX 80252C591053D1E43DC102C6601644F0 + HEX 22413989604A00109BAE274240FD59B2 + HEX 0940B64CB70108D00A4006933C299A00 + HEX 51C2B4C01A47450020041A5948A465E9 + HEX 6671B30409902124D108EE59B6F489D8 + HEX 2D51D81D4020113AA06584F4BCEBB6C4 + HEX 1028489164118008210A9F275B006824 + HEX D048BA0120CAA6E9919AC450B4BCEB97 + HEX 20CC124116490008BC0C21A526CA26A1 + HEX 0B33ED01B43DB9059940042C89B72D01 + HEX 28685F1040F6172498B60DDB0D804086 + HEX 516207603310F49DA2C1500684C48029 + HEX 4ED236402CA141DC08B8C02548082807 + HEX D64CFD820B0084280FA410580C498ABF + HEX 2C139471D94E6101F0AF52920D167062 + HEX 819458D9A2EDD4166CF324185D040536 + HEX B16415B80C024841810746F39A2450F1 + HEX 156024E0DD1A2D8160410696CC148000 + HEX B208A1DB9A21EC320B50A4BC0D40805B + HEX 334026B626A084254F94D450088022D6 + HEX AE111481C1C0487B86105483064A4B68 + HEX 8550E10100D8C816645FD44CC2564AC6 + HEX 9E056132520204B1897018492424A712 + HEX 650B0369FAD77D099201EDD610040509 + HEX 822C4DCCA21390A237E1122D17141211 + HEX B20B6C0A500212EDD902FD11B0E8C99A + HEX 910812699164388112CA9BD8800BB506 + + HEX 92A5408C2003A260E0098465C144414F + HEX 9F208005097D132404944913DE8D40E2 + HEX 35416800DB5270D1B70895A42E199B89 + HEX A420090C9565F2AC64592474A6283021 + HEX 96CC8616AC5B32C99D80EDCD0289C29F + HEX 04019E4C00B62789490198A0A052B038 + HEX F236469496E501522CAD305319215111 + HEX FE442180006AB509D862785B76287998 + HEX 0D0BB4B84127026EA0514006CD808960 + HEX 110253C2336023F46819A0C450520BCF + HEX BA049508ED593044801599C0B6106904 + HEX 2FA1A86E092A2971338944D8A041D208 + HEX CB2C34C240E4013321163B021281F409 + HEX 81E84BA06162302A902559C1A27D001A + HEX A1490C22EE0245C1163F58B04F8830C7 + HEX 502C400012AC260006114A28CB1E42CB + HEX 96687A072693832E69332C442743C2C6 + HEX 2D9784788108B5CB2EA9D282B502E068 + HEX 9AC16C90E465D92C6BFB46404692CC42 + HEX 122502C33C12402180B6775DB82C91DE + HEX 648889251AA1495E40498F841CDC001A + HEX 6EA24C80A0479400CC0B290A6D1200DC + HEX 1ACC80968512E12EC9A220E1441202B6 + HEX 1A589470DD57AC8900CC821A04860059 + HEX C0A4866464A0824635508637DD3204D0 + HEX E04C6CA215CAE08E488051798436EAA4 + HEX CD54B488500C4E804468AB2D280AB554 + HEX D8BB8840B22650AC3740082C526A60E1 + HEX 2A2C58A2CDD4BE1940BA0191092C88C4 + HEX 05EA205BCAB02070BA3591965471D776 + HEX 0380551209081B2C119F205A0011550A + HEX B4461DD12601F66E69147D91883D1112 + HEX 40EF0499580A89D2BA0052A0F186802E + HEX 1805A810E2245F0568D412285F03B600 + HEX 97E408846F1992B01520721916E94900 + HEX 9D4000C652430902A44C86D15C48B429 + HEX 59F6672B8041C1BEB479334406322022 + HEX D2651420480F851899E0555A2A61DF02 + HEX 06730AA6F00624780048EA84958AA418 + HEX 1A3243399649D23F79DB166D4D14D800 + HEX D481CB201B1001681382274D2E4CD9B2 + HEX 6F22B4188B09050A2103E83A2AC49E29 + HEX 00B2AE1BC4076A0448EF7221C5462043 + HEX 6500D912594806EC5FD40421D4B48116 + HEX A8263230044265C9D61A9BB40A83BC43 + HEX 424320058427558205EBA4C0EAA14491 + HEX 95888F94401B9EE1599CE019A0068A96 + HEX 59D048602229A00442AD4284279AE226 + HEX C3B27C49C538DA28664128688F80C911 + HEX 81CDD080618EA55D4C14192198441032 + HEX 5161963E6B902FD8F22758224C592C43 + HEX C024D1C000209235033317B109A02D92 + HEX F265632EA46222E14B256221227C501E + HEX 14DCB2804B14EDD037ED4404C0228054 + HEX 23726046D2A55A86955DA000DBA108D2 + HEX B41B9B10C31B56C20952286826646C83 + HEX 4478D40868474CC28C8D42A69D40A266 + HEX A084369406045D2D26111851C136EB49 + HEX D0279AD280491AE2113670244000C906 + HEX C13192824906487A9981091E01812365 + HEX A82EAE40C000502AAD78D0CCD8A84692 + HEX A64F8EBA718520448855841154C40B27 + HEX 6683178DCB0E44020F006308C4804208 + HEX 7AA04892F6A04E947519983C5501650A + HEX 91609995BD5A84A581E4908B90790602 + HEX 8C10684113A049B3263E19900F5F7625 + HEX 6BE0000FB042D8522498C406248F40C9 + HEX 28440796294A985187B72082C108C895 + HEX 643172601336904D8E6561C1694DB12C + HEX 09C211994504D98D084A01A907934049 + HEX 00B9D3760CDB89158AA0027A026DE0F4 + HEX 801D80225B2A3A8826E1AB86EC112600 + HEX 7B0E4C0E3211DA5282911EE9C4864CF2 + HEX 02447AB694C1B642E3C65C5AA2E490A4 + HEX 489A6D2A1034554116B981732C429320 + HEX D8C0203C6261D39A18591827C582855A + HEX BE5112072F94C2A95081001722292210 + HEX 6719770E68A0AA423B4083835412D809 + HEX 89DA84C817040C9D04C8726600064400 + HEX 554B83A6B098BD6191136849E0692172 + HEX 6987048482703031C2050AD2BC219660 + HEX DEA071E2108C20D401C2C1420822AC14 + HEX E0E1C1827441F1281B36BD51A54620B3 + HEX 71C08C40F0A08A29181459304D21357D + HEX 1702A83195659496ADABD521C8820598 + HEX 9C379616004482CC0442051232930132 + HEX 2CDBE5A42B1C2503F8201B16E88902E7 + HEX 00D00285106C99B1641728B552121998 + HEX 76A1818A485B2E6E079C3483B68C4C30 + HEX 4A8D03840233742EB0214A08208D7E60 + HEX 13028802724D13939908B0385113856E + HEX 9230D32325C02CA88B60445E26C01B94 + HEX 2ED0E506A03468050D01436609188220 + HEX 1E8B3883F246991EA59196456C5A2498 + HEX E44498303A12223667A07054C4509820 + HEX D04A850052C34281D564D4972C9D1EE0 + HEX 03122DC6905800442130A062421037CC + HEX B4204B048F531C6E8C90231B863A4B86 + HEX 477AD044958A6C069529870241B05424 + HEX 450A60295A49DF58C0438244DBE10003 + HEX 964E9BA5369302E84B52E641206080AD + HEX 20211445C7544741005DD3280C8941E8 + HEX 0094128D82ADD0C60C0EDE04939780C1 + HEX 93209B32EC0608184805080D84CA1B3E + HEX E1098200F132000880523B41E0012666 + HEX 4B0AFC49B2648F826CB366A090010014 + HEX 706C020224FBA037DB02B51CD248192C + HEX 63010209D86C681D1A3851D62449706D + HEX 5047A93181AC11126B8426E8C490C850 + HEX C70143A88D1CF481791628C8BE884DA4 + HEX CC6A8E0C082101964224A13E8500B322 + HEX 0497C458990412031408F62058F42E45 + HEX 572CDF88144B104385261412A4785402 + HEX 5C20B8E1D0E265C8824F4C9661631B0A + HEX D397586A0602092713083301C18720C0 + HEX 5619C8B6DD00953804A22D8AB96E4AF0 + HEX 2613F024F0A440D82AA0C1C5901902E2 + HEX C00400974820C8003147C66552FE25D3 + HEX BCB803B20D0A5437D010603B36598981 + HEX 2017070715A260B0944487020586A646 + HEX 91303FEB3646D013109B22CE1A722083 + HEX 2C08C9886BE01271E18B408A13860ABC + HEX 225302A41B64ADEAA4C8912075214134 + HEX 68244573C180830627C194F191AC20C2 + HEX 0C4E00F448029E22700340E406048A9E + HEX 0858A318F8870D0122B598D14107A04F + HEX 8AB868C53A644467A1581162E106CA8B + HEX 526C4D7631538008CB65154231A062C6 + HEX 09089F455E986C70A22813574A15430C + HEX 480A89690C812936ED68D14241120D4D + HEX 74A801A92D4847801D503C04D44D3952 + HEX 4540B02D26C248D9249340B0ED8B4129 + HEX 4AF27809004105AE444DBC68058E4412 + HEX 862B14920D48F73991A3008C361CC904 + HEX 52325028C31E244CB0787A8E25C3020A + HEX 1B714410602586F2049D33A50AB6A13B + HEX 166CBA7489521A3A1092104BF5005381 + HEX 2CF8E3210212094DB274C37121E92642 + HEX BA9030C1DA8902766B1B308C0893C98D + HEX 9624DCB0D92A3006899C6908F40EE4A1 + HEX 4513D0055810B2C4515509A220418787 + HEX 50B6403A424241E38CC244704F224C17 + HEX 336E9A7A251A56851D20841A081DF011 + HEX 34105675083A27400E6DC21E6A4E8001 + HEX 8400C5190F2048B0BD80B504191918C9 + HEX D04CEAC42951B3A40FA00DCA741D3824 + HEX 6043F310C5344F4C99200384E2092A45 + HEX 99934010E0205AA6F752662C5A0A7104 + HEX 12E1C3C210660028E9962F9BA653AC02 + HEX 4D0B0B0A3D12458B356599CC10410C62 + HEX 19870ED21470EE8434079640979298C1 + HEX 147318A331481147995A2C0990208155 + HEX 04B27205AB33F0C81004DC304B1AC0A5 + HEX E8F02A45902041C04BF93069C1E2C448 + HEX 3D412B83458ACA4578844DAE121139AB + HEX 04D898009E564D3152B41C12A1C30E0D + HEX 2A324D9A0260DE007B701425B0A69543 + HEX C06A980472F010310A9387015A0D1886 + HEX 2A0999F39CA6694A3CE59CCA082B12A8 + HEX 8C340C15A295D538B48A58041BC77008 + HEX 386444864C51A9F0CE748D19525619C2 + HEX 61658208D10090BC52050D861529A744 + HEX 9EA63228AF0009544C91CB2041344DD5 + HEX 80699ECB20998248832E5C318B0CD154 + HEX 4E631524DAB4293E5605E5CC6962AA84 + HEX D55825409028E53454D7350D893C0E61 + HEX 394C49540E8A14E5D31984601584D510 + HEX 0DBC863108025D53C82A8A343C988E31 + HEX D0A089E5A0B12CA7690A913948AB722A + HEX 87289A820453AE44AA7255BB220DD131 + HEX AD1A39242A106A08AB0C511DDD63150D + HEX 2B3AA011D06185AB0019AB100C54649A + HEX C62BC118408EB0735282A808AFB09C82 + HEX 8CD3580D097404BDA22140E62B8814C0 + HEX D5B02AE2540589008E933E57D5384451 + HEX 5925809872D080A80C82A81C534D41A2 + HEX BA2C8724183294D790481A2344733D84 + HEX 5314444550EDCC58240056A81E020583 + HEX AEA0E510680C5404D83931548055A122 + HEX 4FC3720F89122C540047428772883256 + HEX 9E8729D2400EC08731383606090260F3 + HEX C42910B7EB1C32247215849E864DA187 + HEX 560154459C8AE4ACAA691A028F830605 + HEX F3380753020CC150785084561303D541 + HEX A6C1615445B382A91A391DD1208E5382 + HEX 68BE02609E8220BE864801085E818624 + HEX 539C0E633D84E154659C0A0D99AA61D8 + HEX C581C1B22389CE042AA06080A0C9E251 + HEX 4C095C4FC1368DD730A441308573B521 + HEX C7941D100A6045C27242188001C7708C + HEX 02A00CE6404B15D553390C40952300C2 + HEX 00D81007F490208150160D3001A1A144 + HEX B816C5481E4459A315F1D08F1B16C043 + HEX 0181008C69488EA802B4224117674B82 + HEX 059F8E580A12A57AD6301B16AF033380 + HEX 04844308460303234D448A8649F64418 + HEX A003E0856CD0A346DB976E09F0A08A24 + HEX CB000020582330472025840350B2265C + HEX 51986989B72EDDF220922C4A90546EEF + HEX 366E5B00E210200F0170458241109228 + HEX 14411004090277CF823E5C936643A365 + HEX E382005674092706A8AA14A03A208008 + HEX 881DD1B405503947DB02E343BA8C6181 + HEX 6C11C4633086C99204A4D9E0B0DBD324 + HEX 4BD325118660A72541C2A40309E46089 + HEX 1ACA11240040C9B4099AB08A0A893420 + HEX 4D41B2F0D8F6B159B4A659104912A9E8 + HEX 841410584A0012BD2DDDC38445104904 + HEX 15422331C922102208366FFFB665DBB3 + HEX 2C1049098600009926C5010E4DD4DA6E + HEX F1022D415A4D1E528D3202021205C140 + HEX 1A605D98B5EBB241812941260A04499E + HEX 64DBB741FB860D3244459C9171E88200 + HEX 612E16135206998E044E80204450108A + HEX 7704CD923183450D02A4361BBCA81513 + HEX 200B1D44C411100286CA18982CF0F260 + HEX 0DD629EBB334518020D22D0A922488C6 + HEX 0C005080A0011988D1A478C1FCED4B92 + HEX 6509A748C668028204A082976D81A32F + HEX 09E46643B2CCC3418990B46DEE024809 + HEX 76408A645820100251A41329002972C3 + HEX ACE9F26DDB30E5088A80CAC4D0060026 + HEX 021201FDB66EC030A7100D0853562A88 + HEX 01615318AE4ADC2DDB02830294C14A26 + HEX 07619E09A8B6663B41205B90AEA86029 + HEX DB1A0752D07E1B4449044200DE1204D0 + HEX 8D45685600162108F3204B44A280DF13 + HEX A449162EC89E274B00023A204A920562 + HEX C8D2E959B4A5CD644962B251112A0B5B + HEX C469ED220B0EC26DD92E80A20055D026 + HEX 1B44A00079B3A55DB3701A434910B182 + HEX 20D046D9B8E859E04092244185FC8020 + HEX 2100C216E5FB9E6D098354232469B420 + HEX 0AD8214947E02003BA36C9424AA43069 + HEX 6CB304FD96A6D998680B04C8CDB0C492 + HEX C2120231C0C420A20230680728607394 + HEX 308D91296334590A04DD52132E9BB075 + HEX 69A06F83F437DB1A854B1A559C249002 + HEX 005282104388F82021014993A8488E90 + HEX F11A054758A0EC8420079962B54D020D + HEX EFB6ADE914188916E099154C1A305306 + HEX 8008D1A5181B90C1423E28023C62DABE + HEX A40130860EA46D03F4A0162411B2A40B + HEX C9F2466B942FEB922FCB846D84660233 + HEX 214804200AD9A08AD3BE758B10C80D16 + HEX C45123198130589970486B02887B9627 + HEX 43A2398EB40192C50771046C823A2AC4 + HEX B469375440A980005E85145A0735C63E + HEX A8C1D264D823351B0555806461BA310A + HEX B9866C53E3205924272283C009907D45 + HEX 82980900093036802AA1054E873D8114 + HEX 07C827C519901351A168109769D400EE + HEX 1426A8BB02476982A169B528922CA211 + HEX A0C9780A71C9F089C9C06882DA4AC206 + HEX EC86C2ACC1C4A858127D434906806601 + HEX 81D615583C69C0030CECAB8402328599 + HEX ACA91896E9D99B758B3024965061A680 + HEX 842104CC8DE265C934E28182D11A26C6 + HEX 8436019BF60709622892E4460C86B405 + HEX A6600B0D4D61B4919C340F50AE84C342 + HEX 0D2A20798D82B1501F4C89847C327440 + HEX 81C65541034E05D01D502E6C15C34440 + HEX 943A549511DD90464456494099268093 + HEX 2830C6A11B584C0E8665C40030EC1208 + HEX B93C46CA9580E1045D0887AD0022A843 + HEX E3893B328C2182068AAA7D00605541E6 + HEX 49C51124D0E074481D044A04CDC3C602 + HEX 70367828B65199E00644542C98A2BD11 + HEX A021CEA1C8C0428CC1A1235858A00192 + HEX 9D5A32A1B3E208E180681B1DC90C8034 + HEX 081288A812BC45C2080E303148945459 + HEX 4E0605C241C91C1E991415990AA49237 + HEX 710CB009C6E22192C43DCA102F1C6200 + HEX 093C0490112D0D572D60332A6C951840 + HEX C4609835220BA7C139B2808900115187 + HEX A15C29394016981C000045B72C6E0405 + HEX 0B3CA52003E8193C040A472509B693C2 + HEX B2F81195A05A624403F46142463B09B5 + HEX E48820300AA216620679C59481EAE404 + HEX C8E068F2062BC3B82B5AA16A49F21454 + HEX 103842B511D0007104E48D73106B5199 + HEX 0C123046E8E42946363C3A12616B1581 + HEX CC30464AC12258E64401A16D7E403492 + HEX 1601153CD101E408578268818B041B1D + HEX 210C448680A6201BE025DB1B404E0206 + HEX 92600889012D97F42170066A43F00D79 + HEX 50022BB04C58A2538D306F00B7561C60 + HEX 26103300E1C8690CF024703031909890 + HEX 1A8B04A1880799038401C244601144C5 + HEX 343A98B48A6C202689B6A9C875848AA4 + HEX 285714A25110AFC3C304050BAC40346A + HEX AC10808AC07455824E0DF422F2402413 + HEX A6E09A2447D1E24493FE44512E6431A3 + HEX 0847B0544C206780AAD49986810907BD + HEX 12379001040E19430044CC6241A87400 + HEX 37C609024E0B03428527211E100F9882 + HEX CD4A52C44124AE285A000302AC573826 + HEX 9A9C2173843100EA41E3664595A614CD + HEX 14AF003A41EA052802B729E1C0469857 + HEX 280F35EE08344C1E8160C237C04BA12D + HEX 861A49EC20652213424E882D42F608DE + HEX AA2B8BC049073044238E7440921E5BE6 + HEX AC283A00CB00A806B0029F26390BE468 + HEX 001C156C81A103E00C423E8009042688 + HEX C1144823116B316D29340784F2426030 + HEX 80AD26AD03D04838978A5306E80B2435 + HEX 38941C40D05CD01661037E708EE44099 + HEX 90EA40A70041C841A3BA3252CB0C1BA0 + HEX F18A340EB1260E48044EDE802E3AA438 + HEX 559026143E4533A3414836C878D089C8 + HEX 32E14033400EC708E0760C4AA218DB8E + HEX 4B515004DCA210CE320DEA3EE842D2A2 + HEX 90A309158755285A4E91B43508A13DC1 + HEX 20C68B2429CF4681630A5CD1A25960B6 + HEX 11059E30029170034428CF3D04409254 + HEX 5C742D121A0F12C8202924ACDC600E4C + HEX 360E491D053192045815C949004E8A15 + HEX 070019261164744050294272542DA322 + HEX CA0086A9E60289F20201120683660F43 + HEX C26B5039055391018D2279D83A6719E2 + HEX 62D95C0DA4A6310074455512A9479084 + HEX 61AA210C34112EC16AD8802283BC283C + HEX A255DBA4B48140A09E868D95264D64A8 + HEX 695C466753DC299B8728441482A8B06B + HEX 9CC829D1426518F4A9E944BCD8A021D2 + HEX 610450C18C21823D70B5624AB0209843 + HEX 4D11049C1B5C05C0036465544DC18602 + HEX D0958350A2F11A866C1E86AC0EE801CB + HEX 90C5038441F5B0C245B44C5834B5BAAA + HEX 319A95212B33A429586000980E61510E + HEX 81D0E9915725C806E48272EC2A107908 + HEX 8631E2867958A0E57090414BA5230126 + HEX 3852A3182C077468106D581DA01A8781 + HEX 4786F14012441CB2722036F11A238549 + HEX 9275A8A348E3C458858AE048060F0B14 + HEX AC4E9480538E10C5C0220A86022C1635 + HEX DC2678D194B848560A0B55A9001D1451 + HEX 101509530D9A9762EA1105C295802933 + HEX 4DF37425018AA488765545A661DB3544 + HEX A9DC016BAB0C59250E6A7406818BA908 + HEX 06462C32568938A40CB062C7346CEC90 + HEX 25988B012A840D8F8A58D73006511A14 + HEX 5A313E01B6628A396847003460A21650 + HEX 254DEB9E00D26468C297950235ABBAAA + HEX 40CAAA0041DE6C61C12A58740D215200 + HEX 1A7644A2C74589160F5B1A2AC2B5A238 + HEX 0201F294441B52A493EB2849401CC020 + HEX 27DA91E8503524491260BB626093ABA4 + HEX C1D602001E051180CD04E56258998041 + HEX 6005DB14BC1C128C918F449A18400552 + HEX 39A922660A326C1ED2B1DAA1634A908C + HEX 47026D3BAB0083830459AA818204667A + HEX 85C1D5B224E8274CABB003D020AB53A3 + HEX CDCAA62AC53432D0E142C080390D1807 + HEX C13039738080B00200D2204EEFB2291C + HEX 32F09B0A8D012652A89054D714649EC3 + HEX 6909354F4391051582A3023C28A8A331 + HEX 0093658FB05E851249A35420D0B4E42C + HEX 87B10A124E5AE36049C0C2C30A252A04 + HEX 134510844306357B580D0B315C41E022 + HEX 88186609A2EA0AC740530A9D01A2A840 + HEX 76E980CE02520441191A2F0BB331F316 + HEX EDD2A074810E43021081D59470F32A01 + HEX 31370D8794A54F22C59C908C2B94A838 + HEX 80706AA42A0F9A349E0A154284580015 + HEX 85C0400C2C3A066B1637D8C2680E8762 + HEX 88885E11A019C18066531C048C068A41 + HEX 580DC09E269A161ED4A86932A0C84536 + HEX 2D4E1E09401A7C0E842102710880A62B + HEX F0B679D1D439C822619C4E0C9AD4408F + HEX 3C8D5324C5A0020E82314609A16B081C + HEX 4D6915610E9864308089AAAA402E862D + HEX 5AD3C05996CD731A8D0380C9983871C6 + HEX 34009FA66CC40740828189E558646514 + HEX 04E582062A22A5828C08CB17299E132D + HEX 7B82A53886180126423206220CA3700A + HEX B7458F3825690C2558F4C00B8A4050B1 + HEX EB480689651168BA22089A9C4DCB9123 + HEX 41954456B42EDBA3E65136652D00AA90 + HEX A283110140048A50CEA63C08E669CAE2 + HEX 86813850A3062DC42C660E86680415A9 + HEX 826071F080C563964C81A6E9AB22479B + HEX A361886A0E1AA4F1CA4006D1B828C5D6 + HEX C8C320C108C7401A05589AB047D8284E + HEX 835145D11423CB9E3851143C51837880 + HEX 8A118AF48C8196C51994C10425019025 + HEX A9D020675DE228DBF668D9B327012243 + HEX 539A2D9628C848001C19001211246AD3 + HEX 1E2651166F9A0C0045C4685EB22E1E26 + HEX 10091767D801C1902218D350060DC06D + HEX 6BBC6451206A1A0C28205041940C24DA + HEX A069EB1A6D04A68A9018788820117394 + HEX EDC912278B1306910C81901045DBB680 + HEX DBBAEC81420803A445D1040D06001DCA + HEX F6304936481405432A22694544E18094 + HEX EDDB028571122C1BF46C9B1728DA026D + HEX 1A015152254984B4489A2400D2364916 + HEX 0E418030C58BC234DDBA6DF382281A74 + HEX 4484249140B03171BA6C1B8319122111 + HEX 126140800455F1B66ECFA2680EA24292 + HEX 44418684486218354FA2206AF428D20C + HEX 61A82011D0200964A04D7BB480C33400 + HEX A26640985440D5B62FDBA3699AB44DDB + HEX 364A324400D834A80008440A24019206 + HEX 39CA146D5BB33079B64512A3AD530C41 + HEX A22445046600C022450120291C2248DB + HEX 9364D51469130115D0B4358AB62D4CB6 + HEX 2750344A9004459A0C4898A448132830 + HEX E0C2658D022700A610500489801E6563 + HEX B63848300A83832053144D10080C4404 + HEX 4811244892B4050620697B9668810402 + HEX 1AB400E2F46CDB364D810A0812244912 + HEX 044092B468DB140D902419805464DBD6 + HEX 2480A2005A004D02A4309806491420C9 + HEX 008205D0B600009C6CF9966583D66933 + HEX 205194044101A0058AB635DAB6401020 + HEX 4910344002B40DD0B66D6B220DD2060D + HEX 82244292244901836D80B66D01008980 + HEX 2469DBB63DC9B6AD01A035D136491205 + HEX 89902851D0B4A88B1A0500B445924440 + HEX 0404458BA2466BB66D8DA66D0B244906 + HEX 0031D0A2005A146D61B4680224108208 + HEX 49140840D19AED49126DDB166D110551 + HEX 10814982A4498AB6EDD9B22E4DA20880 + HEX 20499224018022409221489244601000 + HEX 6DDDF665DB9E20D00448920841922429 + HEX 00B4458B34001A240A9224499224015A + HEX B7755BB4688DB66D7B82248A24119244 + HEX 019224091205490400000A9845DB0640 + HEX 81B63D59B22D50248980204881164880 + HEX 0640DBB627D8144120A6498424198220 + HEX 098AB64551A0286AC224DA166DDBB66D + HEX 6B12458B264D80240992244910214092 + HEX 0841120068000068DBB66D8B16405BB4 + HEX 6DDB1A0C80A26D8B260500A441824448 + HEX 12014912012DD0B6ED89A2305AA04992 + HEX 2848A2204982B66DDBB66D5B17ADC916 + HEX 4192244900004551B46DDB0008802449 + HEX 120149820449920040011445D1B66DDB + HEX B66D5100280A2040122408D016AD8916 + HEX 0080344912044892204982A000000008 + HEX 12000102B4ED4916050AB4680BA0050A + HEX 240810244980244992000000344892A0 + HEX 4081A268D1B66D51A040032000000068 + HEX 50B46DDB02409224429008290200055A + HEX B445DB1A458B3449922449222009D2B6 + HEX 6E5B17AD51A0401A3400922409022040 + HEX 920448922800020428DA026DDBB66DDB + HEX B66DDB1600000068D102081024019224 + HEX 119244080204400114488B166DDB1A6D + HEX 51044501B42DDAB6010A244992444092 + HEX 204080004881A228800028D0D6645120 + HEX 40820000100000102401021440DBA205 + HEX 5004000A040092244000140580B4400B + HEX 14001000088200280000285A20050000 + HEX 0050040000A001000008000000922641 + HEX 02240100B44501000000A02D801645D1 + HEX 02450B144080204912042800004980A0 + HEX 00000000900201100040010045D1A268 + HEX D302400004489004411000458BA22D50 + HEX 00000000408004015014050000450104 + HEX 088020418020080A1440010000800245 + HEX 01A00000140580340000000010200010 + HEX 202900A0008A02000020090204000000 + HEX 0000A040D1A228001408000000D0A268 + HEX 510000800449122449122448100001D0 + HEX A2685BB4458B02050000005000000A14 + HEX 28500000000048100441802008100441 + HEX 10200010002800A04081B66851142D8A + HEX 16288A02680000010204010224481020 + HEX 408204411000008A16285AB468510005 + HEX 5000088000010000285014050A000890 + HEX 200810040810000000A0005000400100 + HEX 000200000014000A00000014000A0000 + HEX 00000080004080000010000000000000 + HEX 000000004101A0408102285000050000 + HEX 08800041802040000000000005500000 + HEX 00000000000000202800144001144001 + HEX 0008002003409C045100000000000000 + HEX 00000000000000000000000000000000 ;\ + HEX 00000000000000000000000000000000 ; \_ possibly unused space + HEX 00000000000000000000000000000000 ; / + HEX 00000000000000000000000000000000 ;/ + HEX 0000000000000000 + +Buffer_36 ds 36 ; RENAME ME! Used by (L)$E349 routine + +Image_Data_Packed HEX E6116000E609608005E60960800406E6 + HEX 09800806E60A6004E6046400E6046400 + HEX 46E603640006E6098005E60960800406 + HEX E609800444F70F74400044F708E60280 + HEX 0444F708E60280030447F70776666080 + HEX 05E602F70974400447F703440047F703 + HEX 440047F70344000447F7077666608003 + HEX 44F708E60280030447F7077666608002 + HEX 44F70F74400044F7097555800344F709 + HEX 755580020447F709555080035567F70A + HEX 74400447F703440047F703440047F703 + HEX 44000447F7095550800244F709755580 + HEX 020447F70955500044F70F74400044F7 + HEX 0A7550800244F70A7550000447F70A55 + HEX 80020557F70B74400447F703440047F7 + HEX 03440047F70344000447F70A55800244 + HEX F70A7550000447F70A550044F70F7440 + HEX 0044F70B44800244F70B44000447F70A + HEX 74400044F70C74400447F703440047F7 + HEX 03440047F70344000447F70A74400044 + HEX F70B44000447F70A744041910544F703 + HEX 74419105400044F7037491021227F703 + HEX 44800244F7037491021227F703440004 + HEX 47F70341910247F70374400044F70372 + HEX 219108100447F703440047F703440047 + HEX F70344000447F70341910222F7037440 + HEX 0044F7037491021227F70344000447F7 + HEX 0341910222F7037440800644F7037440 + HEX 800744F7037444E60267F70344800244 + HEX F7037444E60267F70344000447F70344 + HEX 800204F70374400044F7037556E60580 + HEX 040447F703440047F703440047F70344 + HEX 000447F7034446E602F70374400044F7 + HEX 037444E60267F70344000447F7034446 + HEX E602F7037440800644F7037440800744 + HEX F7037447F70634800244F7037447F706 + HEX 44000447F70344800204F70374400044 + HEX F70976666080020447F703440047F703 + HEX 440047F70344000447F70344F7067440 + HEX 0044F7037447F70634000447F70344F7 + HEX 067340800644F7037440800744F70374 + HEX 47F7057330800244F7037447F7064400 + HEX 0447F70344800204F7037440000557F7 + HEX 0A6550000447F703440047F703440047 + HEX F70344000447F70344F70674400044F7 + HEX 037447F7057330000447F70344F70633 + HEX 800744F7037440800744F7037447F704 + HEX 7223800344F7037447F70644000447F7 + HEX 0344800204F703744080025557F70A55 + HEX 000447F703440047F703440047F70344 + HEX 000447F70344F70674400044F7037447 + HEX F704722380020447F70344F705223080 + HEX 0744F7037440800744F7037447F70472 + HEX 30800344F7037447F70644000447F703 + HEX 44800204F70374408003B302F7097440 + HEX 0447F703440047F703440047F7034400 + HEX 0447F70344F70674400044F7037447F7 + HEX 04723080020447F70344F70372222080 + HEX 0844F7037440800744F70374442227F7 + HEX 0333800344F7037444A20227F7034400 + HEX 0447F70344800204F703744080040191 + HEX 0522F70374400447F703440047F70344 + HEX 0047F70344000447F7034442A202F703 + HEX 74400044F70374442227F70333800204 + HEX 47F70344419103800A44F70374408007 + HEX 44F70374400227F70333800344F70374 + HEX 40800247F70344000447F70344800204 + HEX F703744000E60955F70374400447F703 + HEX 4664F7044664F70444000447F7034480 + HEX 0204F70374400044F70374400227F703 + HEX 3380020447F70344800E44F703744080 + HEX 0744F70374400222F7037330800244F7 + HEX 037440800247F70344000447F7034480 + HEX 0204F70374400044F70C74400447F70F + HEX 44000447F70344800204F70374400044 + HEX F70374400222F7037330000447F70344 + HEX 800E44F7037440800744F70374400022 + HEX 27F70333800244F7037440800247F703 + HEX 44000447F70344800204F70374400044 + HEX F70C33000447F70E7550000447F70344 + HEX 800204F70374400044F7037440002227 + HEX F70333000447F70344800E44F7037440 + HEX 800744F7037440000227F70333800244 + HEX F7037440800247F70344000447F70344 + HEX 800204F70374400044F70B2330000447 + HEX F70D755580020447F70344800204F703 + HEX 74400044F7037440000227F703330004 + HEX 47F70344800E44F7037440800744F703 + HEX 7440000222F70373300044F703744080 + HEX 0247F70344000447F70344800204F703 + HEX 74400044F70972222080020447F70CB3 + HEX 0280030447F70344800204F703744000 + HEX 44F7037440000222F70373300447F703 + HEX 44800E41910440800741910440800221 + HEX 91041000419104408002419103140004 + HEX 9104148002049104400041910A800404 + HEX 910D1080040491041480020491044000 + HEX 41910440800221910410049104148008 + + HEX FF00 + +Buffer2_36 ds 36 + +Image_Data2_Packed HEX 800306E60B608004E60B8002E602F70A + HEX 74408002066667F70944005567F70B74 + HEX 40000556F70B440557F70C74400055F7 + HEX 0CC402F70D74400447F70CC402F70372 + HEX 219109100447F70322910944F7037446 + HEX E609600447F70355E60560800344F703 + HEX 744447F70774400447F709E602800244 + HEX F703744447F70774400055F70A765500 + HEX 44F703744447F7077440000555F70A75 + HEX 5044F703744447F70774408002033337 + HEX F709C402F7037441910422F703744080 + HEX 0491051227F703C402F7037556E60455 + HEX F703744006E6086557F703C402F70D74 + HEX 400447F70C440557F70C33000447F70B + HEX 7330005557F70A2330000447F70A7233 + HEX 8003B302F70772222080020447F709A2 + HEX 028005019108800404910A1000000000 + HEX 0000FF00010101010101020202020202 + HEX 03030303030404040505050606070708 + HEX 09090A0B0C0D0E0F101113141618191B + HEX 1E202325282C2F33373B40454B51575E + HEX 666E7780DB00 + +LDE07 HEX 9DC301019DC201019CC101019CC00101 + HEX 9CBF01019CBE01019BBD01019BBC0101 + HEX 9BBB01019ABA01019AB902019AB80201 + HEX 9AB7020199B6020299B5020299B40202 + HEX 98B3020298B2020298B1020297B00202 + HEX 97AF030296AE030296AD030296AC0302 + HEX 95AB030295AA030295A9030294A80302 + HEX 94A7030293A6030293A5040293A40403 + HEX 92A3040392A2040391A1040391A00403 + HEX 919F0403909E0403909D04038F9C0403 + HEX 8F9B05038E9A05048E9905048D980504 + HEX 8D9705048D9605048C9505048C940504 + HEX 8B9305048B9205048A9106048A900604 + HEX 898F0604898E0605888D0605888C0605 + HEX 878B0605868A06058689060585880605 + HEX 85870706848607068485070683840706 + HEX 83830706828207068181070681800706 + HEX 807F0706807E07077F7D08077E7C0807 + HEX 7E7B08077D7A08077C7908077C780807 + HEX 7B7708077A7608087A75080879740808 + HEX 78730908787209087771090876700909 + HEX 756F0909756E0909746D0909736C0909 + HEX 726B090A726A090A71690A0A70680A0A + HEX 6F670A0B6E660A0B6E650A0B6D640A0C + HEX 6C630A0C6B620A0D6A610A0D69600A0E + HEX 685F0B0E675E0B0F665D0B10655C0B10 + HEX 655B0B11645A0B1263590B1262580B13 + HEX 61580B1460570B155F560C165E550C17 + HEX 5D540C185C530C195B520C1A5A510C1B + HEX 59500C1C58500C1D574F0C1E564E0C1E + HEX 554D0D1F544C0D1F534C0D20524B0D20 + HEX 514B0D21504A0D214F490D224E490D22 + HEX 4D480D234C470D234B470E244A460E24 + HEX 49460E2548450E2547450E2646440E26 + HEX 45440E2744430E2743430E2842430E28 + HEX 41420F2840420F293F410F293E410F29 + HEX 3D410F2A3C400F2A3B400F2A3A400F2B + HEX 39400F2B383F0F2B373F102C363F102C + HEX 353F102C343F102D333F102D323F102D + HEX 313F102E303F102E2F3F102E2E3F102F + HEX 2D3F112F2C3F112F2B3F11302A3F1130 + HEX 293F1130283F1131273F113126401131 + HEX 25401132244011322341123222411233 + HEX 21411233204212331F4212341E421234 + HEX 1D4312341C4312351B4312351A441235 + HEX 19441236184412361744123616451237 + HEX 15451237144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 14451201144512011445120114451201 + HEX 144512011445120114451201 + + + + + + + + + + + diff --git a/src/twgs_1.8s/twgs.3.s b/src/twgs_1.8s/twgs.3.s new file mode 100644 index 0000000..2b59438 --- /dev/null +++ b/src/twgs_1.8s/twgs.3.s @@ -0,0 +1,2268 @@ +* + +Init_Intro_Graphics SEP #$20 + NOP + LDA #$41 + STAL $E0C029 + REP #$20 + NOP + LDX #$8000 + LDA #$0000 +:loop STAL $E11FFE,X + DEX + DEX + BNE :loop + SEP #$20 + NOP + LDA #$C1 + STAL $E0C029 + REP #$20 + NOP + LDA #$000F + LDX #$0000 + LDY #$003C + JSR Set_SCBs_to_Pal + PHB + LDX #LE417 + LDY #$0200 + LDA #$00B5 +; MVN TWGS_Control,ptr000000 , $BC0000,$000000 + MVN $BC0000,$000000 + PLB + RTS + +Copy_SCB_Tail SEP #$30 + NOP + STY $CB + LDY #$00 +:scb_loop LDA SCB_Tail_Data,Y + STAL $E19D00,X + INY + INX + CPX $CB + BCC :scb_loop + REP #$30 + NOP + RTS + +SCB_Tail_Data HEX 000000010101 ; probably one of the "TransWarp GS" tails + HEX 020304050606 + HEX 0708090A0B0B + +Set_SCBs_to_Pal INY + STY $CB + SEP #$20 + NOP +:loop STAL $E19D00,X + INX + CPX $CB + BCC :loop + REP #$20 + NOP + RTS + +Get_Byte_from_SourcePtr LDA [SrcPtr32] + INC SrcPtr32 ; inc low word of pointer + AND #$00FF ; strip high byte + RTS + +Put_Byte_to_DestPtr SEP #$20 + NOP + STA [DstPtr32] + REP #$20 + NOP + INC DstPtr32 ; inc low word of pointer + RTS + +Unpack_Data LDX #$0001 + JSR Get_Byte_from_SourcePtr + CMP #$0080 + BCC :literal_data ; ? + AND #$0077 + PHA + JSR Get_Byte_from_SourcePtr + TAX + BEQ :done + PLA +:literal_data CLC + ADC $E1 +:repeat_loop JSR Put_Byte_to_DestPtr + DEX + BNE :repeat_loop + BRA Unpack_Data +:done PLA + RTS + +LE227 JSR Get_Byte_from_SourcePtr + JSR Put_Byte_to_DestPtr + DEX + BNE LE227 + RTS + +Unpack_to_Screen STZ $E1 + LDA #^Image_Data_Packed ; #$00BC + STA SrcPtr32+2 + LDA #$00E1 + STA DstPtr32+2 + LDA #$2000 +LE240 STA DstPtr32 + LDA #Image_Data_Packed + STA SrcPtr32 + JSR Unpack_Data + LDA #Image_Data2_Packed + STA SrcPtr32 + JSR Unpack_Data + RTS + +Load_Palettes LDX #$0000 + LDY #$0000 +:copy_rgb_word LDA Master_Palette_Data,Y + STAL $E19E00,X + INY + INY + TYA + AND #$001F ; keeps resetting source index after each palette written + TAY + INX + INX + CPX #$01E0 ; palettes 0 - 14 now the same? + BCC :copy_rgb_word + LDY #$0000 +:gen_fade_col_loop LDA Color_Fade_Lookup_Values,Y + AND #$00FF + ASL + TAX + LDA Color_Fade_RGB_Table,X + PHA + TYA + ASL ; *2 + ASL ; *4 + ASL ; *8 + ASL ; *16 + ASL ; *32 = same color in the next palette + TAX ; as our index + PLA + STAL $E19E0E,X ; store next fade color + INY + CPY #$000C ; not all palettes... up to pal 12 + BCC :gen_fade_col_loop + LDX #$0000 +:next_pal PHX + LDA Pattern_Table,X + AND #$00FF + ASL + ASL + TAY + TXA + XBA + LSR + LSR + LSR + TAX + CLC + ADC #$0010 + STA $CB + LDA Pattern_RGB_Table,Y +:create_rgb STAL $E19E10,X + CLC + ADC Pattern_RGB_Table+2,Y + INX + INX + CPX $CB + BCC :create_rgb + PLX + INX + CPX #$000C + BCC :next_pal + RTS + +Master_Palette_Data HEX 00000600270149047B07AD0AFF0FDF08 + HEX 00002202440466068808AA0ACC0CFF0F + +Color_Fade_Lookup_Values HEX 000000010304030403020100 +Color_Fade_RGB_Table DW $08DF + DW $09DF + DW $0BEF + DW $0CEF + DW $0EFF + +Pattern_Table HEX 000102020203030404040505 +Pattern_RGB_Table HEX 100020001001200210011002 + HEX 000100020101020201000200 + + +Setup_Palette_12 LDX #$001F +:copy_loop LDA Palette_12_Data,X + STAL $E19F80,X + DEX + BPL :copy_loop + RTS + +Palette_12_Data HEX 000000040007000B000F700FF00FF007 + HEX F000F700FF007F000F000B0007000400 + + +* @todo: Investigate. Possibly the animation vectors. +Generate_Cached_Lookup_Table LDA #$2000 + LDX #$0000 + LDY #$0012 +:loop STA Buffer_36,X + CLC + ADC #$008C ; 140 + INX + INX + DEY + BNE :loop + LDA #$29D8 + LDX #$0000 + LDY #$0012 +:loop2 STA Buffer2_36,X + CLC + ADC #$001F ; 31 + INX + INX + DEY + BNE :loop2 + RTS + + +SHGR_Offset_for_X_Y TYA + XBA + LSR + STA DstPtr32 + LSR + LSR + ADC DstPtr32 + STA DstPtr32 + TXA + ADC DstPtr32 + ADC #$2000 + TAY + RTS + + +Fill_Bank_E1_with_Byte PHA + TXA + TYX + TAY + PLA + SEP #$20 + NOP +:fill_loop STAL $E10000,X + INX + DEY + BNE :fill_loop + REP #$20 + NOP + RTS + + +Generate_Grayscale_Color_15 LDA #$0000 + LDX #$0000 +:write_color_15_loop STAL $E19E1E,X + PHA + TXA + CLC + ADC #$0020 + TAX + PLA + ADC #$0111 + CPX #$0200 + BCC :write_color_15_loop + RTS + +LE3B6 PHB + PEA $E1E1 ; + PLB ; set bank to E1 + PLB ; + STA $CB + TXA + EOR #$FFFF + SEC + ADC #$00A0 + STA $F5 +:loop PHX + SEP #$20 + NOP + LDA #$00 +:zero STA |$0000,Y + INY + DEX + BNE :zero + REP #$20 + NOP + TYA + CLC + ADC $F5 + TAY + PLX + DEC $CB + BNE :loop + PLB + RTS + +LE3E4 PHB + PEA $E1E1 + PLB + PLB + STX $FF + SEP #$20 + NOP + LDA #$01 + STA $E1 + XBA + LDA #$00 +LE3F6 CLC +LE3F7 ADC #$0F +LE3F9 CMP $FF + BCC LE403 + SBC $FF + INC $E1 + BRA LE3F9 +LE403 XBA + ASL + ASL + ASL + ASL + ORA $E1 + STA |$0000,Y + XBA + INY + DEX + BNE LE3F6 + REP #$20 + NOP + PLB + RTS + +*----------- + +LE417 = * + + HEX 4C77028BA9E1E148ABABA90000E220EA + HEX A5E3C5E5B00285E5A5E3E5E5EB1AEBC5 + HEX E5B0F78F920200EB8F9C0200A5E58FA0 + HEX 02008F9402008F980200C220EAA9A000 + HEX 38E5E585F564EFA5ED85F1A6F3207702 + HEX A5EF1865EB85EF38E5ED901085EFA5F3 + HEX 1865E385F3A5EF38E5EDB0F0981865F5 + HEX A8C6F1D0D6AB6B8A8F8B0200988F8E02 + HEX 00E230EAA900AAA8EB18BD0000990000 + HEX EB6900C9009002E900EB8A6900AAC8C0 + HEX 0090E7C230EA8A186F8B0200AA98186F + HEX 8E0200A860 + +*--- $0200 code for reference + + +* JMP L0277 +* +*L0203 PHB +* LDA #$E1E1 +* PHA +* PLB +* PLB +* LDA #$0000 +* SEP #$20 +* NOP +* LDA $E3 +* CMP $E5 +* BCS L0218 +* STA $E5 +*L0218 LDA $E3 +*L021A SBC $E5 +* XBA +* INC +* XBA +* CMP $E5 +* BCS L021A +* STAL L0291+1 +* XBA +* STAL L029B+1 +* LDA $E5 +* STAL L029F+1 +* STAL L0293+1 +* STAL L0297+1 +* REP #$20 +* NOP +* LDA #$00A0 +* SEC +* SBC $E5 +* STA $F5 +* STZ $EF +* LDA $ED +* STA $F1 +*L024B LDX $F3 +* JSR L0277 +* LDA $EF +* CLC +* ADC $EB +* STA $EF +* SEC +* SBC $ED +* BCC L026C +*L025C STA $EF +* LDA $F3 +* CLC +* ADC $E3 +* STA $F3 +* LDA $EF +* SEC +* SBC $ED +* BCS L025C +*L026C TYA +* CLC +* ADC $F5 +* TAY +* DEC $F1 +* BNE L024B +* PLB +* RTL +* +*L0277 TXA +* STAL L028A+1 +* TYA +* STAL L028D+1 +* SEP #$30 +* NOP +* LDA #$00 +* TAX +* TAY +* XBA +* CLC +*L028A LDA |$0000,X +*L028D STA |$0000,Y +* XBA +*L0291 ADC #$00 +*L0293 CMP #$00 +* BCC L0299 +*L0297 SBC #$00 +*L0299 XBA +* TXA +*L029B ADC #$00 +* TAX +* INY +*L029F CPY #$00 +* BCC L028A +* REP #$30 +* NOP +* TXA +* CLC +* ADCL L028A+1 +* TAX +* TYA +* CLC +* ADCL L028D+1 +* TAY +* RTS + +*----------- END OF $200 CODE + +LE4CC STZ $D7 + STZ $D9 + STZ $DB + RTS + +LE4D3 LDA $D9 + BNE LE4ED + JSR Get_Byte_from_SourcePtr + PHA + AND #$007F + STA $D9 + PLA + AND #$0080 + STA $D7 + BEQ LE4ED + JSR Get_Byte_from_SourcePtr + STA $DB +LE4ED LDA $D7 + BEQ LE4F5 + LDA $DB + BRA LE4F8 +LE4F5 JSR Get_Byte_from_SourcePtr +LE4F8 DEC $D9 + RTS + +LE4FB STZ $DD + STZ $DF + RTS + +LE500 LDA $DD + BNE LE50F + JSR LE4D3 + XBA + STA $DF + LDA #$0004 + STA $DD +LE50F LDA #$0000 + ASL $DF + BCC LE519 + LDA #$00F0 +LE519 ASL $DF + BCC LE520 + ORA #$000F +LE520 DEC $DD + RTS + +LE523 STA $E1 + STX SrcPtr32 + LDA #^TWGS_Control ; $00BC + STA SrcPtr32+2 + LDX #$0000 + JSR SHGR_Offset_for_X_Y + STY $D3 + LDA #$00E1 + STA $D5 + JSR Get_Byte_from_SourcePtr + INC + STA $FF + LDA #$00A0 + SEC + SBC $FF + LSR + CLC + ADC $D3 + STA $D3 + JSR Get_Byte_from_SourcePtr + INC + STA $CD + RTS + +LE552 JSR LE523 + JSR LE4CC + JSR LE4FB +LE55B LDA $FF + STA $CB +LE55F JSR LE500 + AND $E1 + EOR [$D3] + STA [$D3] + INC $D3 + DEC $CB + BNE LE55F + LDA $D3 + SEC + SBC $FF + ADC #$009F + STA $D3 + DEC $CD + BNE LE55B + RTS + +LE57D JSR LE523 + JSR LE4CC +LE583 LDA $FF + STA $CB +LE587 JSR LE4D3 + EOR [$D3] + JSR Put_Byte_to_DestPtr + DEC $CB + BNE LE587 + LDA $D3 + SEC + SBC $FF + ADC #$009F + STA $D3 + DEC $CD + BNE LE583 + RTS + +LE5A2 JSR Init_Intro_Graphics + JSR Unpack_to_Screen + JSR Load_Palettes + JSR Generate_Cached_Lookup_Table + RTS + +Play_Startup_Intro PHP + REP #$30 + NOP + LDA TWGS_Config_Byte + AND #$0004 + BEQ LE60C + SEP #$20 + NOP + LDAL $E0C029 ; store gfx mode + PHA + REP #$20 + NOP + PHB + PHD + PHK + PLB + PEA $0000 + PLD + JSR Read_TWGS_Mode + PHA + JSR IRQ_Logic_OFF + JSR GS_FAST + PHA + JSR TWGS_ON +LE5DB PHA + STZ Fake_Key_Flag + JSR LE5A2 + JSR LA8F7 + JSR LA95D + JSR LE62E + JSR LE93F + JSR LA9A0 + PLA + JSR SET_TW_MODE + PLA + JSR GS_Speed_Restore + PLA + JSR Set_TWGS_Mode_Keep_Cache + PLD + PLB + SEP #$20 + NOP + JSR Clear_Text_Pages_E0_E1 + PLA + STAL $E0C029 + REP #$20 + NOP +LE60C PLP + RTS + + MX %10 + +Clear_Text_Pages_E0_E1 LDX #$0000 + LDA #$A0 +LE613 STAL $E00400,X + STAL $E10400,X + INX + CPX #$0400 + BCC LE613 + STAL $E0C051 + STAL $E0C052 + STAL TXTPAGE1 + RTS + + MX %00 + +LE62E STZ $BD + STZ $B9 + STZ $BB +LE634 JSR LE649 + JSR LE7E6 + JSR Check_Key + BCS LE648 + INC $BD + LDA $BD + CMP #$5DD4 + BCC LE634 +LE648 RTS + +LE649 LDA $B9 + BNE LE672 + LDA $BD + CMP #$0014 + BCC LE66B + JSR Generate_Grayscale_Color_15 + LDA #LDE07 + STA $9F + STA $A5 + STA $A7 + STZ $AF + STZ $B1 + STZ $B3 + STZ $B5 + INC $B9 +LE66A RTS + +LE66B LDY #$2710 +LE66E DEY + BNE LE66E + RTS + +LE672 CMP #$0001 + BNE LE66A + LDA ($9F) + AND #$00FF + LSR + STA $C1 + LDA #$00A0 + SEC + SBC $C1 + SBC $C1 + STA $F7 + LDY #$0002 + LDA ($9F),Y +LE68E AND #$00FF + STA $F9 + DEY + LDA ($9F),Y + AND #$00FF + STA $A1 + CLC + ADC $F9 + STA $A3 + LDX $A1 + LDY $A3 + JSR Copy_SCB_Tail + LDX $C1 + LDY $A1 + JSR SHGR_Offset_for_X_Y + JSR LEB2D + LDA $9F + SEC + SBC #$0080 + CMP #LDE07 + BCS LE6BF + LDA #LDE07 +LE6BF STA $A9 + JSR LE74A + LDA $B1 + CLC + ADC #$0005 + STA $B1 +LE6CC SEC + SBC #$001E + BCC LE6E0 + STA $B1 + LDA $B5 + CLC + ADC #$0005 + STA $B5 + LDA $B1 + BRA LE6CC +LE6E0 LDA $B5 + CLC + ADC $AF + PHA + AND #$00FF + STA $AF + PLA + XBA + AND #$00FF + ASL + ASL + CLC + ADC $9F + STA $9F + CMP #Init_Intro_Graphics + BCC LE705 + LDA $9F + STA $A9 + JSR LE74A + INC $B9 +LE705 RTS + +LE706 LDA ($AB) + AND #$00FF + LSR + STA $9B + LDY #$0005 + LDA ($AB),Y + AND #$00FF + STA $9D + LDY #$0001 + LDA ($AB),Y + AND #$00FF + CMP $9D + BCC LE72D + BEQ LE748 + INY + CLC + ADC ($AB),Y + AND #$00FF +LE72D CMP $A3 + BCS LE735 + CMP $A1 + BCS LE748 +LE735 PHA + TAY + LDX $9B + JSR SHGR_Offset_for_X_Y + LDA #$00A0 +LE73F SEC + SBC $9B + SBC $9B + TAX + PLA + CLC + RTS + +LE748 SEC + RTS + +LE74A LDA $A5 +LE74C STA $AB + CMP $A9 + BCS LE773 + JSR LE706 + BCS LE76B + PHA + LDA #$0000 + JSR Fill_Bank_E1_with_Byte + PLX + SEP #$20 + NOP + LDA #$00 + STAL $E19D00,X + REP #$20 + NOP +LE76B LDA $AB + CLC + ADC #$0004 + BRA LE74C +LE773 STA $A5 + STZ $AD +LE777 STA $AB + CMP $A7 + BCS LE79C + JSR LE706 + BCS LE792 + TAX + LDY $AD + SEP #$20 + NOP + LDA LE7C6,Y + STAL $E19D00,X + REP #$20 + NOP +LE792 INC $AD + LDA $AB + CLC + ADC #$0004 + BRA LE777 +LE79C STA $AB + CMP $9F + BCS LE7C3 + JSR LE706 + BCS LE7BB + PHA + LDA #$00FF + JSR Fill_Bank_E1_with_Byte + PLX + SEP #$20 + NOP + LDA #$0F + STAL $E19D00,X + REP #$20 + NOP +LE7BB LDA $AB + CLC +LE7BE ADC #$0004 + BRA LE79C +LE7C3 STA $A7 + RTS + +LE7C6 HEX 01010101010202020203030304040405 + HEX 050506060607070808090A0B0C0D0E0F + +LE7E6 LDA $BB + BNE LE819 + LDA $BD + CMP #$1F54 + BCC LE818 + JSR Load_Palettes + LDX #$005C + LDY #$006E + JSR Copy_SCB_Tail + LDA #$FFFF + STA $A9 + LDA #$0012 + STA $9F + LDA #$0001 + STA $BF + LDA #$0001 + STA $AD + LDA #$0002 + STA $C9 + INC $BB +LE818 RTS + +LE819 CMP #$0001 + BNE LE832 + JSR LE88D + BCC LE825 + INC $BF +LE825 JSR LE881 + LDA $BF + CMP #$002E + BCC LE831 + INC $BB +LE831 RTS + +LE832 CMP #$0002 + BNE LE84F + JSR LE88D + BCC LE840 + DEC $9F + INC $BF +LE840 JSR LE881 + LDA $9F + CMP #$FFEE + BNE LE84E + INC $BB + STZ $A9 +LE84E RTS + +LE84F CMP #$0003 + BNE LE86C + JSR LE88D + BCC LE85D + INC $9F + DEC $BF +LE85D JSR LE881 + LDA $9F + BNE LE86B + INC $BB + LDA #$005A + STA $AB +LE86B RTS + +LE86C CMP #$0004 + BNE LE880 + JSR LE881 + JSR LE88D + BCC LE87F + DEC $AB + BNE LE87F + INC $BB +LE87F RTS +LE880 RTS + +LE881 LDX $BF + LDY #$005C + JSR SHGR_Offset_for_X_Y + JSR LE89A + RTS + +LE88D DEC $C9 + BNE LE898 + LDA #$0002 + STA $C9 + SEC + RTS + +LE898 CLC + RTS + +LE89A PHB + LDY #$005C + LDX #$0000 + JSR SHGR_Offset_for_X_Y + LDA #$E1E1 + PHA + PLB + PLB + LDA $9F + BPL LE8B2 + EOR #$FFFF + INC +LE8B2 STA $A3 + LDA $BF + STA $A5 + STZ $A1 + LDA #$0081 + SEC + SBC $BF + STA $A7 + LDX #$29D8 +LE8C5 JSR LE911 + LDA $A9 + BEQ LE8D1 + DEY + STA |$0000,Y + INY +LE8D1 LDA #$001E + MVN $E10000,$E10000 + LDA #$0000 + STA |$0000,Y + TYA + CLC + ADC $A7 + TAY + LDA $A1 + CLC + ADC $A3 + CMP #$0012 + BCC LE8EF + SBC #$0012 +LE8EF STA $A1 + BCC LE901 + LDA $9F + BPL LE8FD + DEC $A5 + INC $A7 + BRA LE901 +LE8FD INC $A5 + DEC $A7 +LE901 CPX #$2C06 + BCC LE8C5 + PLB + DEC $AD + BPL LE910 + LDA #$000C + STA $AD +LE910 RTS + +LE911 LDA $AD + BNE LE939 + TYA + CLC + ADC $A5 + STA $9B + SEP #$20 + NOP +LE91E LDA |$0000,Y + CMP #$88 + BCC LE930 + BNE LE92B + LDA #$00 + BRA LE92D +LE92B SBC #$11 +LE92D STA |$0000,Y +LE930 INY + CPY $9B + BCC LE91E + REP #$20 + NOP + RTS + +LE939 TYA + CLC +LE93B ADC $A5 + TAY + RTS + +LE93F JSR Check_Key + BCC LE945 + RTS + +LE945 JSR Setup_Palette_12 + LDA #$00FF + STA $9F + TAY + JSR LEA9F + BRA LE989 +LE953 LDY $9F + JSR LEA9F + JSR LEA35 + SEP #$20 + NOP + LDX $B5 + LDA #$0C + STAL $E19D00,X + REP #$20 + NOP + LDY $C1 + LDX $F7 + JSR LE3E4 + LDA $B7 + CLC + ADC $FD + TAX + SEP #$20 + NOP + LDA #$0C + STAL $E19D00,X + REP #$20 + NOP + LDY $C3 + LDX $FB + JSR LE3E4 +LE989 LDA $AD + STA $F7 + LDA $AF + STA $F9 + LDX $A9 + STX $B1 + LDY $AB + STY $B5 + JSR SHGR_Offset_for_X_Y + STY $C1 + JSR LEB2D + LDA $A5 + STA $FB + LDA $A7 + STA $FD + LDX $A1 + STX $B3 + LDY $A3 + STY $B7 + JSR SHGR_Offset_for_X_Y + STY $BF + JSR LEB4D + STY $C3 + JSR Check_Key + BCS LE9D0 + LDA $9F + SEC + SBC #$000C + STA $9F + BCS LE953 + JSR LE9DE + JSR LE9D1 +LE9D0 RTS + +LE9D1 LDY #$0514 +LE9D4 LDX #$0320 +LE9D7 DEX + BNE LE9D7 + DEY + BNE LE9D4 + RTS + +LE9DE LDA #$0045 + PHA + LDA #$005C + CLC + ADC #$0012 + PHA +LE9EA LDA $03,S + TAY + LDX #$0000 + JSR SHGR_Offset_for_X_Y + LDX #$00A0 + LDA #$0000 + JSR Fill_Bank_E1_with_Byte + LDA $01,S + TAY + LDX #$0000 + JSR SHGR_Offset_for_X_Y + LDX #$00A0 + LDA #$0000 + JSR Fill_Bank_E1_with_Byte + JSR Delay_YYY + JSR Check_Key + BCS LEA25 + LDA $03,S + INC + STA $03,S + LDA $01,S + DEC + STA $01,S + CMP #$0059 + BCS LE9EA +LEA25 PLA + PLA + RTS + +Delay_YYY LDY #$0032 +:outer LDX #$00C8 +:inner DEX + BNE :inner + DEY + BNE :outer + RTS + +LEA35 LDY $C1 + LDA $A9 + SEC + SBC $B1 + BCC LEA48 + BEQ LEA48 + TAX + LDA $F9 + BEQ LEA48 + JSR LE3B6 +LEA48 LDA $F7 + SEC + SBC $AD + BCC LEA6A + SBC $A9 + CLC + ADC $B1 + BEQ LEA6A + BMI LEA6A + PHA + LDA $C1 + CLC + ADC $F7 + SEC + SBC $01,S + TAY + PLX + LDA $F9 + BEQ LEA6A + JSR LE3B6 +LEA6A LDY $BF + LDA $A1 + SEC + SBC $B3 + BCC LEA7D + BEQ LEA7D + TAX + LDA $FD + BEQ LEA7D + JSR LE3B6 +LEA7D LDA $FB + SEC + SBC $A5 + BCC LEA9E + SBC $A1 + ADC $B3 + BEQ LEA9E + BMI LEA9E + PHA + LDA $BF + CLC +LEA90 ADC $FB + SEC + SBC $01,S + TAY + PLX + LDA $FD + BEQ LEA9E + JSR LE3B6 +LEA9E RTS + +LEA9F LDA #$008C + JSR LEB12 + STA $AD + LDA #$0002 + JSR LEB12 + EOR #$FFFF + SEC + ADC #$0059 + STA $AF + LDA #$0014 + JSR LEB12 + EOR #$FFFF + SEC + ADC #$0059 + STA $AB + LDA $AF + SEC + SBC $AB + STA $AF + LDA #$0046 + JSR LEB12 + EOR #$FFFF + SEC + ADC #$0050 + STA $A9 + LDA #$001F + JSR LEB12 + STA $A5 + LDA #$0015 + JSR LEB12 + CLC + ADC #$0059 + STA $A7 + LDA #$0003 + JSR LEB12 + CLC + ADC #$0059 + STA $A3 + LDA $A7 + SEC + SBC $A3 + STA $A7 + LDA #$0010 + JSR LEB12 + EOR #$FFFF + SEC +LEB0C ADC #$0050 + STA $A1 + RTS + +LEB12 SEP #$30 + NOP + STY $C5 + STA $C7 + LDX #$08 + TYA +LEB1C LSR $C7 + BCC LEB22 + ADC $C5 +LEB22 ROR + DEX + BNE LEB1C + REP #$30 + NOP + AND #$00FF + RTS + +LEB2D LDA $F7 + STA Display_Width + BEQ :done + LDA $F9 + STA Display_Height + BEQ :done + LDA #$008C + STA Image_Width + LDA #$0012 + STA Image_Height + LDA #$2000 + STA Image_Ptr + JSL $000203 +:done RTS + +LEB4D LDA $FB + STA Display_Width + BEQ LEB6C + LDA $FD + STA Display_Height + BEQ LEB6C + LDA #$001F + STA Image_Width + LDA #$0012 + STA Image_Height + LDA #$29D8 + STA Image_Ptr + JSL $000203 +LEB6C RTS + +LEB6D JSR Check_Key + BCS LEBB1 + JSR Clear_Palette_12 + LDX #$0082 + LDY #$00C7 + LDA #$000C + JSR Set_SCBs_to_Pal + JSR LED00 + LDX #About_Hardware + LDY #$0082 + LDA #$0011 + JSR LE552 + JSR LEC58 + JSR Delay_Check_Key + BCS LEBB1 + LDY #About_Hardware + LDX #$EEB7 + JSR LEC06 + BCS LEBB1 + LDX #About_Layout + JSR LEBE9 + BCS LEBB1 + LDX #About_Firmware + JSR LEC06 +LEBB1 BCS LEBE5 + LDX #About_Firmware + LDY #$0082 + LDA #$0022 + JSR LE552 +LEBBF LDX #About_AE + LDY #$00A5 + JSR LE57D + JSR LECA8 + JSR Delay_Check_Key + BCS LEBE5 + LDX #About_AE + LDY #$00A5 + JSR LE57D + LDX #$0082 + LDY #$00C7 + LDA #$0000 + JSR Set_SCBs_to_Pal +LEBE5 JSR Clear_Palette_12 + RTS + +LEBE9 PHX + PHY + LDY #$0082 + LDA #$0011 + JSR LE552 + JSR LEC58 + PLX + LDY #$0082 + LDA #$0022 + JSR LE552 + JSR Delay_Check_Key + PLY + RTS + +LEC06 PHX + PHY + LDY #$0082 + LDA #$0022 + JSR LE552 + JSR LEC80 + PLX + LDY #$0082 + LDA #$0011 + JSR LE552 + JSR Delay_Check_Key + PLY + RTS + +Clear_Palette_12 LDX #16*2*12 ; #$0180 = palette 12 + LDA #$0000 +:clear_loop STAL $E19E00,X + INX + INX + CPX #16*2*13 ; #$01A0 = palette 13 + BCC :clear_loop + RTS + +Delay_Check_Key JSR Check_Key + BCS :done + LDA #$001E +:loop JSR Delay_XXX + PHA + JSR Check_Key + PLA + BCS :done + DEC + BNE :loop +:done RTS + +* ~1sec delay @ 7MHz +Delay_XXX LDX #$00FA ; 250 +:outer LDY #$00C8 ; 200 +:inner DEY + BNE :inner + DEX + BNE :outer + RTS + +LEC58 LDA #$0FFF + STA $9B + LDA #$0000 + STA $9D +:loop JSR Delay_XXX + LDA $9D + STAL $E19F82 + CLC + ADC #$0111 + STA $9D + LDA $9B + STAL $E19F84 + SEC + SBC #$0111 + STA $9B + BCS :loop + RTS + +LEC80 LDA #$0FFF + STA $9B + LDA #$0000 + STA $9D +LEC8A JSR Delay_XXX + LDA $9D + STAL $E19F84 + CLC + ADC #$0111 + STA $9D + LDA $9B + STAL $E19F82 + SEC + SBC #$0111 + STA $9B + BCS LEC8A + RTS + +LECA8 LDA #$0000 + STA $9B + LDA #$0000 + STA $9D +LECB2 JSR Delay_XXX + LDA $9D + LSR + STAL $E19F88 + LDA $9D + CLC + ADC #$0001 + STA $9D + LDA $9B + STAL $E19F8E + CLC + ADC #$0111 + STA $9B + CMP #$1000 + BCC LECB2 + RTS + +LECD6 LDA #$000F + STA $9D + LDA #$0FFF + STA $9B +LECE0 JSR Delay_XXX + LDA $9D + LSR + STAL $E19F88 + LDA $9D + SEC + SBC #$0001 + STA $9D + LDA $9B + STAL $E19F8E + SBC #$0111 + STA $9B + BCS LECE0 + RTS + +LED00 LDA #$0FFF + STAL $E19F86 + RTS + +LED08 LDA #$0000 + STAL $E19F86 + RTS + +*----------- + +About_Hardware HEX 6319020FC0890005040020001F840001 + HEX E08200040E003FF0890005060060001F + HEX 840001E08200020E0082780138880005 + HEX 0700E00007840001E08200030E007082 + HEX 388800050781E00007840001E0820037 + HEX 0E007001FF81F8700E0FC1DF0007C3E0 + HEX FF8701F807E0EF807E0E0F7C01FF87FE + HEX 700E3FF1FFC007E7E3FF8707FE1FF8FF + HEX E1FF8E1E3FC038820F0B381C7879E1E0 + HEX 07FFE78387820F823C38F0F3C3CE3C0F + HEX F0380E07381C7039C0E0077EE703870E + HEX 07381CE07381CE7800F8380FFF1C387F + HEX F9C0E0073CE703870FFF3800E073FFCF + HEX F0008238170FFF1C387FF9C0E00718E7 + HEX 03870FFF3800E073FFCFF0708238030E + HEX 000E82701001C0E00700E703870E0038 + HEX 1CE073800E83780C3C0F0706607839C0 + HEX E00700E78287020F07823C31E073C1CE + HEX 3C3FF01F87FE07E03FF1C0E00700E3FF + HEX 9FC7FE1FF8E071FF8E1E0FC00F81FC03 + HEX C00FE1C0E00700E0FB9FC1FC0782E004 + HEX 707F0E0FFF0086000203308200016094 + HEX 00020330820001609400090331F363EC + HEX 31F363C090000903F333866DB3338660 + HEX 90000103823306066DB33307E0900001 + HEX 0382330506666333069100090331F303 + HEX E661F303C08800 +About_LCA HEX 4B1A02FF80870005380F070007850002 + HEX FFE0870005381E070007850002E0F087 + HEX 0002383C82000107850002E070870002 + HEX 38788200010785002BE0707E01F707E0 + HEX E3C038F03F01F70FC07E0EF8E071FF87 + HEX FF1FF8EFC039E03F07FF1FE1FF8FFEE0 + HEX F3C3CF0F823C05FC003FC007820F5D38 + HEX 63C3CF0FFFE381CE07381CF8003FC007 + HEX 0E07380381CE07FF8381CE073FFCF000 + HEX 39E0070E071FC381CE07E3C381CE073F + HEX FCF00038F0070E070FE381CE07E1E381 + HEX CF0F3800E0003878070E07007381CE07 + HEX E0F3C3C7FF3C1CE000383C07820F2B30 + HEX 73C3CE07E079FF81F71FF8E000381E3F + HEX E7FF3FE1FF8E07E0387E040E07F0E000 + HEX 380F3FE1F71FC07E0E0783000207FC91 + HEX 000203F8CB0002018082F0011F820001 + HEX 0C8B00060181999819808D0001018281 + HEX 0798198F0F1C3E7C8900010182810598 + HEX 1999980C826689000101828105F8199F + HEX 8F0C826689000A018199981998018C3E + HEX 6689000501F8F1981F820F031E466691 + HEX 00013C8600 +About_Layout HEX 501A0270388900031C71C08400047000 + HEX 1C0E890003071C708400051C00070380 + HEX 88000301C71C840005070001C0E08900 + HEX 0271C784007101C00070383FE71E700E + HEX 0FC1C0E01C71C1F83BE01F707E1C0E3F + HEX F9DF9C038FFC7038071C71FF8FFE1FFC + HEX 7FE7FF9E0E7E0381C7879C0E01C71CF0 + HEX F3C3CF0F3C3DFFE7039F00E071C0E703 + HEX 8071C7381CE07381CE077039C0E7801C + HEX 387FF9C0E01C71CFFF381CE073FFDC0E + HEX 7039E0070E1FFE827825071C73FFCE07 + HEX 381CFFF7039C0E7000E707000FFE01C7 + HEX 1CE00381CE073801C0E7879C00198182 + HEX E02FFB807BEF3C1CE073C3CF077038FF + HEX E70007E03FF000E00FDF87FE381C7FF1 + HEX FF9C0E0FB9C000F003F8207001E3C07F + HEX 0E820703DC1FC08800020FF892000201 + HEX FCCE0001C093000130840001188E0007 + HEX 0C07CCC78CCF808D0082038333023180 + HEX 8E0003C0CCDC82CC01608E000330331B + HEX 8233011B8E00070FC7C8C787C3808F00 + HEX 0201E08A00 +About_Firmware HEX 4D1904003800078400013F8500010E85 + HEX 0004038000708300020FFC850001E085 + HEX 00033800078300010182E101C0830001 + HEX 0E850004038000708300031C0E1C8400 + HEX 01E0850036383F077C1DF001C00FFC1F + HEX 83BE0EF807E0EF80038FFC7FF1FFC01F + HEX 00FFC7FE3FF8FFE1FF8FFE0039E1E787 + HEX 9E1E00FF01C0F0F3C3CF0F823C82F055 + HEX 039C0E7039C0E003FC1C0E07381CE073 + HEX 81CE070039C0E7039C0E0003E1C0FFF3 + HEX 81CE073FFCE077039C0E7039C0E0000E + HEX 1C0FFF381CE073FFCE077039C0E7039C + HEX 0E01C0E1C0E00381CE073800E077879E + HEX 1E7039C0E0831E020F07823C26E073C1 + HEX CE073FF0FFC7039C0E00FFC0FC7FE3FF + HEX 8E071FF8E071FE03F07039C0E003F007 + HEX C1FC3B82E004707F0E078C0002038092 + HEX 000138C6000301F18091000118920009 + HEX 01838DBF9863E6C7808B00081E18E36D + HEX B66670CC8B000501818C36DB8266020F + HEX C08B00821806C36CCC6660C08B000901 + HEX 83CC36CCC3E607808500831C89000203 + HEX F09600013C84000260038200830C831E + HEX 0901E00001C18000C0F8820001C08300 + HEX 01068200016685000603018019E63C83 + HEX 33020330820001C0820082C089000C60 + HEX 3C7C666CE1F3E3E01B360C8333050333 + HEX E3E0C3828705C0C1F0F9C782C305C6CE + HEX 3E1F6083660970633331801B060C3382 + HEX 1E010382330930C18CCCC0F19998C682 + HEX 660267068233016082660A6E60633331 + HEX 801B360C1F82331003F33330C18FCCC0 + HEX C19998C667E7E606823383660A366061 + HEX F331B019E60C038233010382330A30C1 + HEX 8C0CC0C198F8C666830602331F823C07 + HEX 7C4660F23330E0820C013F831E120333 + HEX E3E1E3C787C0F99919E663C3C60F3323 + HEX 820005603C0001E082000203F0850082 + HEX 03870001F08600011EC2000403C00380 + HEX 8200050603C001C08400010684001163 + HEX C18606078C03000783C783C006600180 + HEX 8200040C018003840001068400170186 + HEX 6786618CCCCF000C04CC04C00603E183 + HEX C3C018018782C7078DBF87CF8E1E3E82 + HEX 031D00618660C0CCC3000F8CCF8CC003 + HEX C661866600300186630CCE36CCC60682 + HEX 330A000300C18660C18CC30F84CC11C0 + HEX 00666187E3C0600186630CCC36CCC606 + HEX 82330B0003018187E0C30FC3000C83CC + HEX 0FC0066661860060C00186630CCC36CC + HEX 82C68233010082030F018060C600C300 + HEX 0CCC8CCC8003C3E382C31BC08003C663 + HEX 078C36C7C38F1E33030187E7E0618FC0 + HEX CFC0078F078F9500016082000106CD00 + HEX 017E820003600030820002E00F88000D + HEX 63C18606078C03000783C78780820001 + HEX 18820001608400036019808400101800 + HEX 01866786618CCCCF000C04CC0CC08200 + HEX 0118823C827C0B70F0F86018199F1F0F + HEX 1B3E82030D00618660C0CCC3000F8CCF + HEX 8CC082000118846606319998600F1983 + HEX 990C9C18000300C18660C18CC30F84CC + HEX 01C0820003187E608266053181986001 + HEX 84990D98180003018187E0C30FC3000C + HEX 82CC02C7C08200021860836605319998 + HEX 6019849903981B0082030A018060C600 + HEX C3000CCC8C82C082000118823C826604 + HEX 78F0F8F0820F149F1F0F180E030187E7 + HEX E0618FC0CFC0078F0787808D00821885 + HEX 000160820001068900 +About_AE HEX 12168A00010787778B00017486440147 + HEX 8A000107874402477789000174874482 + HEX 47880001078344014785770147880001 + HEX 74834401478544014787000107824402 + HEX 47448247857787000174824402774482 + HEX 478B0001078244824702444784778800 + HEX 01748244027447854401478700010782 + HEX 44034744478544024777860001748244 + HEX 03744477854482478500010782440147 + HEX 83770244478477014785000174874401 + HEX 47844401478400010788448247847784 + HEX 00017488448247870001078244014785 + HEX 77024447857783000174824401748444 + HEX 01478644014782000107824403474447 + HEX 84778644044777007482440374447083 + HEX 00010786448247010783770244478400 + HEX 01078777014782000174824401708500 + HEX 01078644034700078377860001078777 + +*----------- + +CDA_Shutdown RTL ; CDA + +CDA_Startup PHP + PHD + PHB + PEA $0000 + PLD + PHK + PLB + SEP #$30 + NOP + JSR NVRAM_Validate + REP #$30 + NOP +LF6FD LDA #$0007 + STA $5B + JSR Text_Init + LDX #$0001 + LDY #$0017 + JSR Text_Offset_For_X_Y + LDA #$004C + LDY #$0026 + JSR Text_Repeat_Char_Horiz + LDX #$0000 + LDY #$0001 + JSR Text_Offset_For_X_Y + LDA #$005A + LDY #$0016 + JSR Text_Repeat_Char_Vertical + LDX #$0027 + LDY #$0001 + JSR Text_Offset_For_X_Y + LDA #$005F + LDY #$0016 + JSR Text_Repeat_Char_Vertical +LF73B JSR Text_Clear_Window_from_3 + LDX #Menu_Options + SEC + JSR LA06E + JSR STROUT_SelectJK +LF748 JSR STROUT_Open + JSR Display_Version_Info +LF74E JSR Set_No_Items_Selected + LDX #$0004 + LDY #$0003 +LF757 JSR Text_Offset_For_X_Y + LDX #LF7E9 + LDY $5B + JSR Display_Menu_Items +LF762 JSR Menu_Input_Select + BCC LF762 + CPY #$0000 + BNE LF773 + LDA #$0007 + STA $5B + BRA LF74E +LF773 CPY #$0007 + BEQ LF78C + LDA $5B + PHA + JSR LF79C + PLA + STA $5B + SEP #$30 + NOP + JSR Config_to_TW_MODE + REP #$30 + NOP + BRA LF73B +LF78C SEP #$30 + NOP + JSR NVRAM_Save + JSR Config_to_TW_MODE + REP #$30 + NOP + PLB + PLD + PLP + RTL + +LF79C CPY #$0001 + BNE LF7AB +LF7A1 LDX #LF856 + JSR Display_Selected_Menu + JSR LA190 + RTS + +LF7AB CPY #$0002 + BNE LF7BA + LDX #LF85E + JSR Display_Selected_Menu + JSR Configuration_Menu + RTS + +LF7BA CPY #$0003 + BNE LF7CA + LDX #LF86A + JSR Display_Selected_Menu + CLC + JSR LA318 + RTS + +LF7CA CPY #$0004 + BNE LF7DA + LDX #LF87C + JSR Display_Selected_Menu + SEC + JSR LA318 + RTS + +LF7DA CPY #$0005 + BNE LF7E8 + LDX #LF893 + JSR Display_Selected_Menu + JSR About_Transwarp_GS +LF7E8 RTS + +LF7E9 STR "Speed" + BRK $00 +LF7F1 STR "Configure" + BRK $00 +LF7FD STR "Quick Self-Test" + BRK $00 +LF80F STR "Continuous Self-Test" + BRK $00 +LF826 STR "About TransWarp GS" + BRK $00 +LF83B STR " " + BRK $00 +LF83F STR "Quit" + DB $00 + DB $00 + DB $00 +Menu_Options DW $0000 + STR "TransWarp GS" +LF856 DW $0002 + STR "Speed" +LF85E DW $0002 + STR "Configure" +LF86A DW $0002 + STR "Quick Self-Test" +LF87C DW $0002 + STR "Continuous Self-Test" +LF893 DW $0002 + STR "About TransWarp GS..." + +Display_Selected_Menu PHX + JSR Text_Clear_Window_from_3 + LDX #Menu_Options + CLC + JSR LA06E + PLX + SEC + JSR LA06E + RTS + +Display_Version_Info LDX #$0007 + LDY #$0011 + JSR Text_Offset_For_X_Y + LDX #String_TW_Version + JSR Text_Out_Pascal_String + LDX #$000E + LDY #$0012 + JSR Text_Offset_For_X_Y + LDX #String_TW_Revision + JSR Text_Out_Pascal_String + LDX #$0009 + LDY #$0013 + JSR Text_Offset_For_X_Y + LDX #String_TW_Copyright + JSR Text_Out_Pascal_String + LDX #$000A + LDY #$0014 + JSR Text_Offset_For_X_Y + LDX #String_AE + JSR Text_Out_Pascal_String + RTS + +String_TW_Version STR "TransWarp GS version 8/32S" +String_TW_Revision STR "Revision 1.8S" +String_TW_Copyright STR "Copyright (c) 1989-1991" +String_AE STR "Applied Engineering" + + MX %10 + +LF94F REP #$10 + NOP + LDX #$1770 +LF955 DEX + BEQ LF963 + LDAL $E0C026 + LDAL $E0C027 + ROR + BCS LF955 +LF963 LDX #$1D4C + LDA #$07 + STAL $E0C026 +LF96C DEX + BEQ LF99B + LDAL $E0C026 + LDAL $E0C027 + ROR +LF978 BCS LF96C + LDA #$0C + JSR LF99F +LF97F LDA #$32 + JSR LF99F + LDA #$00 + JSR LF99F + LDA #$00 + JSR LF99F + LDA #$FF + SEC +LF991 PHA +LF992 SBC #$01 + BNE LF992 + PLA + SBC #$01 + BNE LF991 +LF99B SEP #$10 + NOP + RTS + +LF99F REP #$10 + NOP + STAL $E0C026 + LDX #$1D4C +LF9A9 DEX + BEQ LF9B3 + LDAL $E0C027 + LSR + BCS LF9A9 +LF9B3 SEP #$10 + NOP + RTS + +LF9B7 REP #$10 + NOP + LDX #$1D4C + SEC +LF9BE DEX + BEQ LF9CE + LDAL $E0C027 + AND #$20 + BEQ LF9BE + CLC + LDAL $E0C026 +LF9CE SEP #$10 + NOP + RTS + +LF9D2 LDAL $E0C027 + PHA + LDA #$00 + STAL $E0C027 + JSR LF94F + LDA #$09 + JSR LF99F + BCS LFA01 + LDA #$51 + JSR LF99F + BCS LFA01 + LDA #$00 + JSR LF99F + BCS LFA01 + JSR LF9B7 + BCS LFA01 + CMP #$A5 + BEQ LFA01 + SEC + BRA LFA02 +LFA01 CLC +LFA02 PLA + STAL $E0C027 + RTS + +LFA08 LDAL $E0C027 + PHA + LDA #$00 + STAL $E0C027 + JSR LF94F + LDA #$08 + JSR LF99F + BCS LFA29 + LDA #$51 + JSR LF99F + BCS LFA29 + LDA #$00 + JSR LF99F +LFA29 PLA + STAL $E0C027 + RTS + +LFA2F REP #$20 + NOP + PHB + PHA + PHA + LDA $06,S + STA $03,S +LFA39 LDA $08,S + STA $05,S + LDA #>LFA5D-1 ; #$BCFA + STA $08,S + LDA #LFA5D-1 + STA $07,S + LDAL LFB24 + LDAL LFB24+2 + LDAL LFFEA + LDAL LFFEA+2 + PLA + RTI + +LFA59 JMPL LFA59 + +LFA5D PHP + REP #$30 + NOP + PHA + PHX + PHY + PHB + LDX #$0000 + LDY #$9F00 + LDA #$00FF + MVN $000000,$E10000 + PLB + JSR LFA88 + PHB + LDX #$9F00 + LDY #$0000 + LDA #$00FF + MVN $E10000,$000000 + PLB + PLY + PLX + PLA + PLP + RTL + +LFA88 PEA ^CDA_Ptr32 ; $00BC + PEA CDA_Ptr32 + _InstallCDA + RTS + +CDA_Ptr32 ADRL CDA_Install_Hdr + + MX %11 + +LFA9A LDX #$FF + TXS + CLC + XCE + JSR LF94F + LDAL $E0C062 + BMI LFB07 + JSR FPGA_Init_Readback + BCC LFAB0 + JSR FPGA_Check_Readback +LFAB0 LDA #$00 + STAL $E0C02D + LDAL $E0C0C8 +LFABA LDAL $E0C0D8 + LDAL $E0C0E8 + LDAL $E0C0F8 +LFAC6 JSR NVRAM_Active_Check + BCC LFAF7 + LDAL $E0C062 + BMI LFB07 + REP #$10 + NOP + JSR Clear_Text_Pages_E0_E1 + SEP #$10 + NOP + JSR L9757 +LFADD JSR LFA08 + JSR NVRAM_Validate + JSR Play_Startup_Intro + REP #$30 + NOP + JSR Time_Active_Screen +LFAEC JSR LA8CB + LDA $00 + JSR NVRAM_Write_Speed + SEP #$30 + NOP +LFAF7 REP #$30 + NOP + JSL Flush_Cache_L +LFAFE SEP #$30 + NOP + JSR CONFIG_TW_From_NVRAM + JSR Cache_ON +LFB07 SEC + XCE + LDA #$00 + PHA +; LDAL LFFFC ; suspicious1 + ldal $00FFFC + CMP #$01 +; LDAL LFFFC+1 ; suspicious2 + ldal $00FFFD + SBC #$00 + PHA +; LDAL LFFFC + ldal $00FFFC + DEC + PHA + RTL + +LFB20 JMPL LFA9A +LFB24 JMPL LFA2F + + MX %00 +Version_Info_L LDA #$0000 + LDX #$0108 + RTL + +Reset_HW_Config_L JSR CONFIG_TW_From_NVRAM + JSR Cache_ON + RTL + +LFB36 RTL + +Get_NVRAM_Speed_L JSR NVRAM_Read_Speed + RTL + +Get_Speed_Setting_Index_L LDX #$0003 ; I believe the 3 is a speed setting (GB has GetNumISpeed) + RTL + +Get_CPU_Frequency_L LDA #$0000 + CPX #$0003 + BCS :exit + CPX #$0002 + BCC :get_from_table + PHX + JSR NVRAM_Read_Speed + PLX + RTL + +:get_from_table PHX + TXA + ASL + TAX + LDAL _frequencyTable,X + PLX +:exit RTL + +_frequencyTable DW $0400 ; 1.024 + DW $0A28 ; 2.600 + DW $1B58 ; 7.000 + +Get_CPU_Frequency_Diff_L PHA + LDX #$0000 +:loop JSL Get_CPU_Frequency_L + CMP $01,S + BCS :found_it + INX + CPX #$0003 + BCC :loop + DEX +:found_it JSL Get_CPU_Frequency_L + SEC + SBC $01,S + STA $01,S + PLA + RTL + +Set_TW_Speed_L SEP #$20 + NOP + CPX #$0000 + BEQ :gs_1mhz + JSR GS_FAST + CPX #$0001 + BEQ :no_accel +:accel JSR TWGS_ON + BRA :done +:no_accel JSR TWGS_OFF + BRA :done +:gs_1mhz JSR GS_1MHZ + JSR TWGS_OFF +:done REP #$20 + NOP + RTL + +Get_TW_Speed_L SEP #$20 + NOP + LDAL CYAREG + BPL :off + LDAL TWGS_Control + AND #$04 + BEQ :zero + LDX #$0002 + BRA :done +:zero LDX #$0001 + BRA :done +:off LDX #$0000 +:done REP #$20 + NOP + RTL + +Get_Speed_and_Frequency_L JSL Get_TW_Speed_L ; in X + JSL Get_CPU_Frequency_L ; in M + RTL + +LFBCF JSR Time_Active_Screen + JSR LA8CB + LDA $00 + RTL + +Set_Speed_From_Frequency_L JSL Get_CPU_Frequency_Diff_L + PHA +LFBDD JSL Set_TW_Speed_L + PLA + RTL + +Flush_Cache_L PHB + JSR Check_Cache_Size + DEC + LDX #$8000 + LDY #$8000 +LFBEE MVN TWGS_Control,TWGS_Control + PLB + RTL + +IRQ_Logic_OFF_L JSR IRQ_Logic_OFF + RTL + +IRQ_Logic_ON_L JSR IRQ_Logic_ON +LFBFA RTL + +Cache_ON_L JSR Cache_ON + RTL + +Cache_OFF_L JSR Cache_OFF + RTL + +Get_TW_Mode_L JSR READ_TW_MODE + RTL + +Set_TW_Mode_L JSR SET_TW_MODE_KEEP_CACHE + RTL + +Get_Cache_Size_L JSR Check_Cache_Size + LDX #$000A +LFC11 LSR + DEX + BNE LFC11 + RTL + +Filler DS $EA + + DS $100 + DS $100 + +TranswarpId ASC 'TWGS' ; happens to be at $FF00 +TranswarpId2 ASC 'SMJS' ; not really sure + + JMPL Version_Info_L + JMPL Reset_HW_Config_L + JMPL Get_NVRAM_Speed_L ; get "max" speed? + JMPL Get_Speed_Setting_Index_L + JMPL Get_CPU_Frequency_Diff_L + JMPL Get_CPU_Frequency_L + JMPL Get_Speed_and_Frequency_L + JMPL Set_Speed_From_Frequency_L + JMPL Get_TW_Speed_L + JMPL Set_TW_Speed_L + JMPL Flush_Cache_L + JMPL IRQ_Logic_OFF_L + JMPL IRQ_Logic_ON_L + JMPL Get_TW_Mode_L + JMPL Set_TW_Mode_L + JMPL Get_Cache_Size_L + JMPL Cache_ON_L + JMPL Cache_OFF_L + JMPL Run_Diagnostic_Tests + JMPL TWGS_Failed + JMPL LFBCF + +Filler2 ds 142 ; hand adjust as I cent get ds working with math/pointers +LFFEA DA LFB24 ; NMI Vector + DA LFA59 +LFFEE DA LFA59 + DA LFA59 + DA LFA59 + DA LFA59 + DA LFA59 + DA LFA59 + DA LFA59 +LFFFC DA LFB20 ; Reset Vector +LFFFE DA LFA59 + + + + + + + + + + + + + + + + diff --git a/src/twgs_1.8s/twgs.MAC.s b/src/twgs_1.8s/twgs.MAC.s new file mode 100644 index 0000000..e732ea8 --- /dev/null +++ b/src/twgs_1.8s/twgs.MAC.s @@ -0,0 +1,50 @@ +_NewHandle MAC + Tool $902 + <<< +_DisposeHandle MAC + Tool $1002 + <<< +_PtrToHand MAC + Tool $2802 + <<< +_HandToPtr MAC + Tool $2902 + <<< +_WriteBParam MAC + Tool $B03 + <<< +_ReadBParam MAC + Tool $C03 + <<< +Tool MAC + LDX #]1 + JSL $E10000 + <<< + + +_InstallCDA MAC + Tool $F05 + <<< + +PushLong MAC + IF #=]1 + PushWord #^]1 + ELSE + PushWord ]1+2 + FIN + PushWord ]1 + <<< + +PushWord MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< + diff --git a/src/twgs_1.8s/twgs.s b/src/twgs_1.8s/twgs.s new file mode 100644 index 0000000..5bf226a --- /dev/null +++ b/src/twgs_1.8s/twgs.s @@ -0,0 +1,3905 @@ +*--------------------------------------------------* +* _______ ___________ * +* /_ __/ | /| / / ___/ __/ * +* / / | |/ |/ / (_ /\ \ * +* /_/ |__/|__/\___/___/ (v1.8s) * +* * +* TWGS32K ROM - V1.8s Binary Parity! * +* Source Disassembly - V0.3 Internal Release #1 * +* * +* This will assemble into an exact binary match of * +* of the TransWarp IIgs 1.8s marked ROMs. * +* For this reason, no changes have been made to * +* the structure of the code, including leaving in * +* unused bytes and such for historical accuracy. * +* * +* This commented Merlin version by Dagen Brock. * +* Massive thanks for the major contributions from * +* Geoff Body, Antoine Vignau, and UltimateMicro. * +* * +* Literally entire portions of the comments are * +* from GeoffB and not me. I just adapted them to * +* my disassembly and do not take credit, though I * +* have added my own work on top of that to other * +* portions of the code and intend to add more * +* details as I discover them. Just trying to * +* give appropriate credit. * +* * +* This version is probably about 80% complete on * +* labeling and about 5-10% complete on comments. * +* Unfortunately my disassembler broke so I let * +* sit for far too long, but it's out there now! * +* * +* Tools used: The Flaming Bird Disassembler * +* Merlin 16+ * +* Merlin 32 (brutaldeluxe.fr) * +* CADIUS (brutaldeluxe.fr) * +* vim,bash,PHP,git * +*--------------------------------------------------* + + mx %00 + org $BC8000 + lst off + use twgs.MAC +*----------- +* @todo +NEEDS_NAME1 = $CB +NEEDS_NAME2 = $F5 + + +*----------- +TWGS_Cache = $02 +TWGS_IRQ = $08 +TWGS_Config_Byte = $0E +HPOS = $2C +VPOS = $2E +Text_Offset = $30 +80_Column = $32 +Pascal_String_Length = $33 +Text_Mask = $35 +Char_MSB_Flag = $36 +FPGA_Data_Ptr = $38 +FPGA_Bit_Offset = $3A +FPGA_Map_Mask_Ptr = $3C +FPGA_Frame_Count = $3E +Cache_Size = $51 +Cache_Max_Mask = $53 + +NVRAM_CMD_Disable_Write = #$80 +NVRAM_CMD_Store = #$81 +NVRAM_CMD_Write_RAM = #$83 +NVRAM_CMD_Enable_Write = #$84 +NVRAM_CMD_Recall = #$85 +NVRAM_CMD_Read_RAM = #$86 + + +Fake_Key_Flag = $83 + +SrcPtr32 = $CF ; gfx unpack routine source (4Bytes $cf-$d2) +DstPtr32 = $D3 ; gfx unpack routine destination (4Bytes $d3-$d6) + +Image_Width = $E3 +Image_Height = $EB +Display_Width = $E5 +Display_Height = $ED +Image_Ptr = $F3 + + +RDVBLBAR = $C019 +VERTCNT = $C02E +HORIZCNT = $C02F + +SLTROMSEL = $E0C02D +CYAREG = $E0C036 ; Speed Register, same as $00? +SoundCtl = $E0C03C +SoundData = $E0C03D +SoundAdrL = $E0C03E +SoundAdrH = $E0C03F +TXTPAGE1 = $E0C054 +TXTPAGE2 = $E0C055 +MOTOR4OFF = $E0C0C8 +MOTOR4ON = $E0C0C9 +MOTOR5OFF = $E0C0D8 +MOTOR5ON = $E0C0D9 +MOTOR7OFF = $E0C0F8 +MOTOR7ON = $E0C0F9 +RD80VID = $E0C01F +INTMGRV = $E10010 + +ptr000000 = $000000 +TWGS_Control = $BC0000 +TWGS_Serial_Data = $BC4000 +TWGS_Serial_Control = $BC4001 + + + +8Bits = $0008 +8KMask = $1FFF +8KSize = $2000 ; 8192 bytes = 8K +32KSize = $8000 ; 32768 bytes = 32K +FPGA_Max_Frames = #$00A0 ; 160 frames +FPGA_Max_Frame_Bytes = #09 +*----------- + + MX %00 + +FPGA_Config HEX FF04400FFB2EBF3FFE7FFEFCBCFFB779 + HEX B5FAFFC7FDFDFFBFF9F5E3EECD9B8FC5 + HEX EF8DEFDF9DFFDFF2FB6FEFFFFDBAFFDB + HEX F7F7F77FFFDBDFF7CBBFAFAFFBFB2FFF + HEX FDFD66F9BBEADF7FBEEFEAFFDBD4DFF7 + HEX EAFFD7FFFDBFFFFF9F77F7FCE9EEEFFC + HEX DFD33BBFB76F7F7FFFF6FEFEF9B57DBB + HEX FFFBFFB7BEEFEEEDFADF5FBFBFF776EE + HEX EFD7FAFEEFBFBDFF63B9DDFABB7777F9 + HEX E4DDD3B767FFDFFFEF4FEFD44DADFAF7 + HEX FB67737DF7AFEBF7DDFD7B3FEF3FF9FF + HEX F7FFFFEDEDFFDF197BFB7E17B2ACF554 + HEX EFCD7FFBDBD3ABBFF77F73FBDFDFDEBC + HEX F9B5EF737FFF5ECF9FFDFDDD9DFDDEB7 + HEX F1F6EBEA6FEE5872BBFEFCFC79393DC7 + HEX EFEE7DEFFFD3FFF9B9FE67C5FCF5DE8F + HEX 9DE5FDFD2DFFFB3BFC7DF5AF7EEF5BDF + HEX DDBFFFB5777AFFDDF6EEFBF5B58FFBFF + HEX BBF6FF7FFFFFBFDFDBDEFDDFBEAAFDFF + HEX EF9CEF3FEEEDFEFFDD7DD7FEABB8D6DF + HEX E5F3D73B767FFFFEFCFE68FFDFFDBF7B + HEX 7775F7AACAFEEFFFBF7DBFBEFB7FFF77 + HEX CE4EDEBC9975EFBBDF737B7A76FDF4B9 + HEX FBEFDF5EDAB57F37EEE77BFBDCFDFDBB + HEX FF7FFF7F7FE7DFEEFD6D7DDBDFF9BB9E + HEX 9F3FA937587D73DCDDFFEF7BFFFB5CE6 + HEX DD8F99FE3DB3FFF3FF777A6EFFFFFEFE + HEX BEFDFFBFEBFBBB777FFFEFEEFEDDDFDD + HEX BBBFA7DF5F7FFDFCFEFEFDFDFFFFEF7F + HEX E7D7D72F3FAF5FDBFABBFDBDFA7FE7FF + HEX F7EFF7BDF5DDEF7BFBFFFFBECFF9F7CB + HEX FE62DEBFF5776DFF9B7D9D7D7B3BDE73 + HEX F7F5EEEFDE97F7FF5DBDEAFF76F5B8FC + HEX FEFFFCEFFBFBFFBFCFDF7FE7EDEDD9D9 + HEX CDD797F2BF3FE76F5F6BEFFFDEFAD9BD + HEX 5B737BBBDFF7F6CFDD7CFBBBBFFFFF77 + HEX 75EB67FDC7DFAFE5E7B37369F583C3B3 + HEX 77E5A7DCFDD3FEFFFBFF7F7EFF9ADF9F + HEX FDFDBFF6FE3F677FFFEAFFEADDDFF3BF + HEX BDBFEF7FFFBFBEFEDAEDF5EDCBFBEF57 + HEX F6DEEEEFFFFBFDFDFFFFF37FFEEFFDFF + HEX DBAFF5A5F6A37FBE76BB73F3F2ECDCEF + HEX BB8BFFEF56DF8EFFFCC5B5FBBBFAA535 + HEX 7FF77EEF9DDDF6EBABEF3DFDFEF7FFFF + HEX EFFFFFD7391B6752B2FEE57CDCEFA9EF + HEX D5D7FFEF67F67F6F65DFDEFEFF9BBFFB + HEX F37FFF6EEE5EFFFDBD9DFBBBF7F7BB7D + HEX 6E6FEB767EFAF4F47E2D6D3D67AFFF7F + HEX FFEFF7F6BBBD7EAFF7FADEEADF8AEEFD + HEX FDFFFB7BFAF575FDCEFEEFF7FFFFB7BF + HEX BF7F7EFFFFFAFFF2E5F5FFFBFFBB7F7F + HEX 7E7FFDBFDFDBEFFEBD97BFFDBDEF9CEF + HEX 7FFCFEFFFA5AFEE766E36A4FC38DE7E7 + HEX 3F777FAFFEEEFFF5FCDFFDBF4A55DFDD + HEX BAF7FACF7F9FFFFEFFFAFBFF77CEC6BE + HEX DD9F757F7BFD7B737EEED7FFFAEB7BDF + HEX 5F3FFDB5F3FE7FF3FFDCDFEFB3BFFBDF + HEX BF7FA79FE6EFFC2DDFB9D9BB9AD3BD39 + HEX BE5F7972DFDD7BFFFFBFFFFFEFE78FF9 + HEX FFF5FFF2EBEFEF797EEFDFFFDFFEBFFD + HEX BFEBBFBB77FF7FFFFEFFDCDDDBE5EFFF + HEX 77CF77FDFA9FBAFFCDFFDFFB7BE797F7 + HEX AFFDFEDEDDFFBBFBFBFE77FFFFDFFFFE + HEX B9FDF4DFFFBDB7DAD7CE793BFFFFFEFF + HEX EFBA7FEE9E6E357FDD3AFAFE73F7F7EF + HEX EFE7DF9DFEDDBFABF7FDD7EFAEEFFDFC + HEX EDDBFFFFFFF7F77FE7ECE5C9EADF73BF + HEX 7BBFB76F5777F7EBFEFFF6FDF97FF37B + HEX EF76BEF6CFFC7E7BFF7FF777F777FA76 + HEX DFFFFDACFF9DBFEBE9FDD3F2BB8737E7 + HEX DDFF9BFEF77FFEF9FFFB889FDF6B6FBD + HEX BFF29BD7F7B4EEEFFBDDD7DE3FBFFF5F + HEX 7F7BFDFBFEDEEDEFF5EFBFBFF7D7FFEE + HEX EEFD5AFDDFFFFFFF727F27FFF74ABFAD + HEX F4AFE3FDEFF1FBFFF5BBF6DDBF81EAFD + HEX 4ED79BFFEFEEDDFDFAFBD3FFFF7DF7E6 + HEX FA75FDD5BF6BE93FFDFFFFFFFFFFFFFD + HEX DFBD3BE936F6DEECAF5FEFECF9B55137 + HEX BBEFFF7F6FFFF7DBF6BFDDFFF7D327FF + HEX FFEFFFDDDFDF9D7BDBB777BFED7F7BEB + HEX 7C7EFFF6B4F6E9CD15B7BFAFDF7FFBFF + HEX FAFFBD7C65537777E7AFFEEC7D3F9FFB + HEX FB7BF7F7FCAEFFEF7FDF7EBFF9BB7F76 + HEX 77FDFAFEFAE5B7FFF3BFFF5FD7FFBFFF + HEX FCDFFF7BF7BFF7FFEDAFFF7C7F3FFD3F + HEX FD797B7B57EDFDDCF7DDBDA3633D575E + HEX EFFCEF7DD9DDCFBD9AFA77F7F7FAEFDB + HEX CFFFFFFFFFFFFFFFFE77DFFEBE9F8DAF + HEX 3B3BFF7BEEB7F774F7DDECBDDFFBFDB7 + HEX B7BFFF6FEFFFECDDAFFFFF5FFF777FE7 + HEX F7F7BFFDFCDA7BDB3B5ADF2F3E2F5F7F + HEX 5CDF75DF79BF77EFEFDFCEEFBEA8F4FD + HEX 7FEDBBE77FFDFF9F8F9F3F1F7FFDB33B + HEX BBF4FC74E9E9F1DFFDFDFDFBFFFBF7F7 + HEX FFFF + +*----------- + +CDA_Install_Hdr STR "TransWarp GS" ; CDA + ADRL CDA_Startup + ADRL CDA_Shutdown + +NVRAM_Disable PHP + SEP #$20 ; 8-bit M + NOP ; all SEP/REP are followed by NOP for stability at + ; higher speeds. + JSR GS_1MHZ ; set CPU @ 1MHz + PHA ; store previous speed + LDA #$00 + STAL TWGS_Serial_Control ; turn off chip select of NVRam, bit7 + PLA ;\__ restore original speed + JSR GS_Speed_Restore ;/ + PLP + RTS + + MX %11 +NVRAM_Send_Byte PHA ; save data to be sent + LDA #$80 + STAL TWGS_Serial_Control ; enable chip select of NVRAM + PLA ; retrieve data + PHY ; save y + LDY #$08 ; # of bits to send +NVRAM_Send_Bit STAL TWGS_Serial_Data ; send serial data msb *yes, bit + ASL ; next bit + DEY ; bits remaining-- + BNE NVRAM_Send_Bit ; loop until all 8 bits sent + PLY ; restore y + RTS + + +NVRAM_Send_Cmd_and_Read PHA ; save data to be sent + LDA #$80 + STAL TWGS_Serial_Control ; enable chip select of NVRAM + PLA ; retrieve data + PHY ; save y + LDY #$07 ; # of bits to send +:nvram_cmd_bit STAL TWGS_Serial_Data ; send serial data msb + ASL ; next bit + DEY ; bits remaining-- + BNE :nvram_cmd_bit ; loop until 7 bits sent + LDA #NVRAM_CMD_Store + STAL TWGS_Serial_Control ; enable NVRAM set to read data + STAL TWGS_Serial_Data ; send last bit of command (msb=1?) and read data + PLY ; restore y + RTS + + +NVRAM_Send_Cmd JSR NVRAM_Send_Byte + LDA #$00 + STAL TWGS_Serial_Control + RTS + + +NVRAM_Write_Word PHA + TXA + AND #$0F + ASL + ASL + ASL + ORA #NVRAM_CMD_Write_RAM + JSR NVRAM_Send_Byte + PLA + JSR NVRAM_Send_Byte + TYA + JSR NVRAM_Send_Byte + LDA #$00 + STAL TWGS_Serial_Control + RTS + + +NVRAM_Modify_Word PHA + JSR NVRAM_Read_Word + PLA + JMP NVRAM_Write_Word + + +NVRAM_Read_Byte LDA #$81 + STAL TWGS_Serial_Control + PHY + LDY #$08 +:nvram_read_bit PHA + LDAL TWGS_Serial_Data + ASL + PLA + ROL + DEY + BNE :nvram_read_bit + PLY + RTS + + +NVRAM_Read_Word TXA + AND #$0F + ASL + ASL + ASL + ORA #NVRAM_CMD_Read_RAM + JSR NVRAM_Send_Cmd_and_Read + JSR NVRAM_Read_Byte + PHA + JSR NVRAM_Read_Byte + TAY + LDA #$00 + STAL TWGS_Serial_Control + PLA + RTS + + +NVRAM_Active LDA #NVRAM_CMD_Enable_Write + JSR NVRAM_Send_Cmd + LDX #$06 + LDA #$AE + JSR NVRAM_Modify_Word + LDA #NVRAM_CMD_Disable_Write + JSR NVRAM_Send_Cmd + RTS + + +NVRAM_Recall REP #$30 + NOP + JSR NVRAM_Read_Speed + PHA + SEP #$30 + NOP + LDA #NVRAM_CMD_Recall + JSR NVRAM_Send_Cmd + JSR NVRAM_Active + REP #$30 + NOP + PLA + JSR NVRAM_Write_Speed + SEP #$30 + NOP + RTS + + +NVRAM_CMP_2_RAM JSR NVRAM_Disable + JSR GS_1MHZ + PHA + LDA #$00 + STAL TWGS_Serial_Data + JSR NVRAM_Recall + LDX #$00 + + +NVRAM_CMP_Read JSR NVRAM_Read_Word + CPX #$13 + BEQ NVRAM_CMP_Skip + CPX #$14 + BEQ NVRAM_CMP_Skip + CMP $0C,X + BNE NVRAM_CMP_Diff + + +NVRAM_CMP_Skip TYA + CMP $1C,X + BNE NVRAM_CMP_Diff + INX + CPX #$10 + BCC NVRAM_CMP_Read + PLA + JSR GS_Speed_Restore + CLC + RTS + + +NVRAM_CMP_Diff PLA + JSR GS_Speed_Restore + SEC + RTS + + +NVRAM_Save REP #$30 + NOP + JSR NVRAM_Read_Speed + STA $13 + SEP #$30 + NOP + JSR NVRAM_Disable + JSR GS_1MHZ + PHA + JSR NVRAM_CMP_2_RAM + BCC NVRAM_No_Save + LDA #NVRAM_CMD_Enable_Write + JSR NVRAM_Send_Cmd + LDA #$00 + STA $12 + INC $0F + BNE NVRAM_Save1 + INC $10 + BNE NVRAM_Save1 + INC $11 +NVRAM_Save1 LDX #$00 +:nvram_save_loop LDA $1C,X + TAY + LDA $0C,X + JSR NVRAM_Write_Word + INX + CPX #$10 + BCC :nvram_save_loop + LDA #NVRAM_CMD_Store + JSR NVRAM_Send_Cmd + LDX #$14 +:nvram_save_delay1 LDY #$00 +:nvram_save_delay2 DEY + BNE :nvram_save_delay2 + DEX + BNE :nvram_save_delay1 + LDA #NVRAM_CMD_Disable_Write + JSR NVRAM_Send_Cmd + JSR NVRAM_Recall +NVRAM_No_Save PLA + JSR GS_Speed_Restore + RTS + + +NVRAM_Validate JSR NVRAM_Disable + JSR GS_1MHZ + PHA + JSR NVRAM_Recall + LDX #$00 +:nvram_validate_loop JSR NVRAM_Read_Word + STA $0C,X + TYA + STA $1C,X + INX + CPX #$10 + BCC :nvram_validate_loop + LDA $0C + CMP #$AE + BNE :nvram_not_valid + LDA $0D + CMP #$01 + BEQ :nvram_valid +:nvram_not_valid LDX #$00 + LDA #$00 +:nvram_new_valid STA $0C,X + INX + CPX #$20 + BCC :nvram_new_valid + LDA #$AE + STA $0C + LDA #$01 + STA $0D + LDA #$0D ; default values? + STA TWGS_Config_Byte + JSR NVRAM_Save +:nvram_valid PLA + JSR GS_Speed_Restore + RTS + +GS_1MHZ PHP ; save processor + SEP #$20 ; 8-bit m + NOP ; stability NOP :P + LDAL CYAREG ; read GS speed reg + PHA ; save it + AND #$7F ; mask fast speed (so, slow now) + STAL CYAREG ; set GS speed reg to 1MHz + PLA ; get previous speed + PLP ; restore processor state (including m/x) + RTS + +GS_FAST PHP + SEP #$20 + NOP + LDAL CYAREG + PHA + ORA #$80 + STAL CYAREG + PLA + PLP + RTS + +TWGS_OFF PHP + SEP #$20 + NOP + LDAL CYAREG + XBA + AND #$7F + STAL CYAREG + LDAL TWGS_Control + PHA + AND #$FB + STAL TWGS_Control + XBA + STAL CYAREG + PLA + PLP + RTS + +TWGS_ON PHP + SEP #$20 + NOP + LDAL CYAREG + XBA + AND #$7F + STAL CYAREG + LDAL TWGS_Control + PHA + ORA #$04 + STAL TWGS_Control + XBA + STAL CYAREG + PLA + PLP + RTS + +GS_Speed_Restore PHP + SEP #$20 + NOP + STAL CYAREG + PLP + RTS + +SET_TW_MODE PHP + SEP #$20 + NOP + PHA + LDAL CYAREG + XBA + AND #$7F + STAL CYAREG + PLA + STAL TWGS_Control + XBA + STAL CYAREG + PLP + RTS + +READ_TW_MODE PHP + SEP #$20 + NOP + JSR GS_1MHZ + PHA + LDAL TWGS_Control + XBA + PLA + JSR GS_Speed_Restore + XBA + PLP + RTS + +SET_TW_MODE_KEEP_CACHE PHP + SEP #$20 + NOP + AND #$FD + PHA + JSR GS_1MHZ + PHA + LDAL TWGS_Control + AND #$02 + ORA $02,S + STAL TWGS_Control + PLA + JSR GS_Speed_Restore + PLA + PLP + RTS + +CONFIG_TW_MODE_KEEP_CACHE PHA + JSR READ_TW_MODE + AND #%11110011 ; #$F3 + PHA + LDA $02,S + AND #$03 + ASL + ASL + ORA $01,S + STA $01,S + PLA + JSR SET_TW_MODE_KEEP_CACHE + PLA + RTS + +CONFIG_TW_From_NVRAM JSR NVRAM_Disable + JSR GS_1MHZ + PHA + JSR NVRAM_Recall + LDX #$00 + JSR NVRAM_Read_Word + CMP #$AE ; check first byte of NVRA + BNE :use_defaults + LDX #$01 + JSR NVRAM_Read_Word + CMP #$01 + BEQ :config_tw_nvram_valid +:use_defaults LDA #$0D + BRA :config_tw +:config_tw_nvram_valid LDX #$02 + JSR NVRAM_Read_Word +:config_tw JSR CONFIG_TW_MODE_KEEP_CACHE + PLA + JSR GS_Speed_Restore + RTS + +Config_to_TW_MODE LDA TWGS_Config_Byte + JSR CONFIG_TW_MODE_KEEP_CACHE + RTS + +NVRAM_Active_Check JSR NVRAM_Disable + JSR GS_1MHZ + PHA + LDX #$06 + JSR NVRAM_Read_Word + CMP #$AE + SEC + BNE :do_check + CLC +:do_check PHP + JSR NVRAM_Active + PLP + PLA + JSR GS_Speed_Restore + RTS + +NVRAM_Read_Speed PHP + PHA + SEP #$30 + NOP + JSR NVRAM_Disable + JSR GS_1MHZ + PHA + LDX #$07 + JSR NVRAM_Read_Word + STA $02,S + INX + JSR NVRAM_Read_Word + STA $03,S + PLA + JSR GS_Speed_Restore + REP #$30 + NOP + PLA + PLP + RTS + +NVRAM_Write_Speed PHP + PHA + SEP #$30 + NOP + JSR NVRAM_Disable + JSR GS_1MHZ + PHA + LDA #NVRAM_CMD_Enable_Write + JSR NVRAM_Send_Cmd + LDX #$07 + LDA $02,S + JSR NVRAM_Modify_Word + INX + LDA $03,S + JSR NVRAM_Modify_Word + LDA #NVRAM_CMD_Disable_Write + JSR NVRAM_Send_Cmd + PLA + JSR GS_Speed_Restore + REP #$30 + NOP + PLA + PLP + RTS + +Check_Cache_Size PHP + SEI + REP #$30 + NOP + PHA + SEP #$20 + NOP + JSR GS_FAST + PHA + JSR TWGS_ON + PHA + JSR READ_TW_MODE + PHA + REP #$20 + NOP + JSR IRQ_Logic_OFF + LDA #Check_Cache_Size + AND #8KMask ; mask 2 8k cache size 8192 bytes + TAX + LDA #$A55A + STAL $BF0000,X + LDA #$5AA5 + STAL $BF2000,X + LDAL $BF0000,X + CMP #$A55A + BEQ :found_32K_cache + LDA #8KSize + BRA :check_cache_size_found +:found_32K_cache LDA #32KSize +:check_cache_size_found STA $04,S + SEP #$20 + NOP + PLA + JSR SET_TW_MODE_KEEP_CACHE + PLA + JSR SET_TW_MODE + PLA + JSR GS_Speed_Restore + REP #$20 + NOP + PLA + PLP + RTS + +32Bit_Multiply LDA $00 + STA $04 + LDA $02 + STA $06 + STZ $00 + STZ $02 + LDX #$0020 +:mul_loop ASL $00 + ROL $02 + ROL $04 + ROL $06 + BCC :next + LDA $00 + CLC + ADC $08 + STA $00 + LDA $02 + ADC $0A + STA $02 +:next DEX + BNE :mul_loop + RTS + +32Bit_Divide STZ $04 + STZ $06 + LDX #$0020 +:div_loop ASL $00 + ROL $02 + ROL $04 + ROL $06 + LDA $04 + CMP $08 + LDA $06 + SBC $0A + BCC :next + STA $06 + LDA $04 + SEC + SBC $08 + STA $04 + INC $00 +:next DEX + BNE :div_loop + RTS + +; +; Text routines +; + +Text_Init JSR Text_Normal + SEP #$20 + NOP + STZ 80_Column + LDAL RD80VID + BPL :not_80col + DEC $32 +:not_80col REP #$20 + NOP + JSR Text_Clear_Window + RTS + +Text_Normal SEP #$20 + NOP + LDA #$FF + STA Text_Mask + REP #$20 + NOP + RTS + +Text_Inverse SEP #$20 + NOP + LDA #$7F + STA Text_Mask + REP #$20 + NOP + RTS + +Text_Clear_Window LDY #$0000 +:next_line LDX #$0000 + JSR Text_Offset_For_X_Y + LDA #$00A0 ; " " + LDY #$0028 ; char count = #40 + JSR Text_Repeat_Char_Horiz + INC VPOS + LDY VPOS + CPY #$0018 ; bottom of screen = 24 + BCC :next_line + RTS + +Text_Offset_For_X_VPOS LDY VPOS + JMP Text_Offset_For_X_Y + + LDX HPOS + JMP Text_Offset_For_X_Y + +Text_Offset_For_X_Y STX HPOS + STY VPOS + JSR Text_Calculate_Offset + LDA HPOS + BIT 80_Column-1 ; check -1 to get flag in high byte of acc + BPL :not_80col + LSR + CLC + ADC #$000A ; offset by 10 to center in 40-col mode +:not_80col CLC + ADC Text_Offset + STA Text_Offset + RTS + +Text_Calculate_Offset TYA + XBA + LSR + AND #$0380 + STA Text_Offset + TYA + AND #$0018 + PHA + ORA Text_Offset + STA Text_Offset + PLA + ASL + ASL + ORA Text_Offset + STA Text_Offset + RTS + +Text_Char_to_Screen PHA + SEP #$20 + NOP + CMP #$60 + BCS :normal_char + CMP #$40 + BCS :mousetext +:normal_char PHA + AND #$80 + STA Char_MSB_Flag ; store hi-bit (normal/inverse flag) + PLA + EOR #$60 + SEC + SBC #$20 + AND #$7F + ORA Char_MSB_Flag +:mousetext PHA + LDA 80_Column + BPL :set_main_mem + LDA HPOS ; even/odd check for aux/main mapping + LSR + BCS :set_main_mem +:set_aux_mem STAL TXTPAGE2 + BRA :store_to_screen +:set_main_mem STAL TXTPAGE1 +:store_to_screen PLA + LDX Text_Offset + AND Text_Mask + STAL $E00400,X ; text memory + STAL TXTPAGE1 + REP #$20 + NOP + INC HPOS + LDA 80_Column-1 ; -1 offset to get flag in high byte of acc + BPL :next_text_address + LDA $2C + LSR + BCS :next_text_same_offset ; no inc needed when swapping page 1/2 +:next_text_address INC Text_Offset +:next_text_same_offset PLA + RTS + +Text_Repeat_Char_Horiz JSR Text_Char_to_Screen + DEY + BNE Text_Repeat_Char_Horiz + RTS + +Text_Repeat_Char_Vertical JSR Text_Char_to_Screen + PHY + PHA + LDY VPOS + LDX HPOS + INY + DEX + JSR Text_Offset_For_X_Y + PLA + PLY + DEY + BNE Text_Repeat_Char_Vertical + RTS + + +Text_Out_Stack_Pascal_String LDA $01,S + INC + TAX + JSR Text_Out_Pascal_String + TXA + STA $01,S + RTS + +Text_Out_Pascal_String LDA |$0000,X ; get string len + AND #$00FF ; max len of 255 + STA Pascal_String_Length +:loop INX + LDA |$0000,X + PHX + JSR Text_Char_to_Screen + PLX + DEC Pascal_String_Length + BNE :loop + RTS + +Text_Out_Word_As_Hex XBA + JSR Text_Out_Byte_As_Hex + XBA +Text_Out_Byte_As_Hex PHA + LSR + LSR + LSR + LSR + JSR Text_Out_Nibble_As_Hex + PLA +Text_Out_Nibble_As_Hex PHA + AND #$000F + CLC + ADC #$00B0 + CMP #$00BA + BCC Text_Out_Nibble_Num + ADC #$0006 +Text_Out_Nibble_Num JSR Text_Char_to_Screen + PLA + RTS + +Text_Clear_Window_from_3 JSR Text_Normal + LDY #$0003 + BRA Text_Clear_Window_from_Y +Text_Clear_Window_from_5 ; not used? + JSR Text_Normal + LDY #$0005 +Text_Clear_Window_from_Y LDX #$0001 + JSR Text_Offset_For_X_Y + LDA #$00A0 + LDY #$0026 + JSR Text_Repeat_Char_Horiz + LDY VPOS + INY + CPY #$0017 + BCC Text_Clear_Window_from_Y + RTS + +; +; FPGA routines +; + MX %11 +FPGA_Read_Config_Frame LDAL TWGS_Serial_Data + LDX #$00 +:read_config_byte LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + ROR $40 + LDAL TWGS_Serial_Data + ASL + LDA $40 + ROR + EOR #$FF + STAL $000100,X + INX + CPX #FPGA_Max_Frame_Bytes ; <- I believe this reference is correct.. value matches. + BCC :read_config_byte + RTS + +FPGA_Init_Readback PHB ; save data bank + PHK ; push current code bank + PLB ; data bank is now using the bank address as the code bank + JSR GS_1MHZ + PHA ; save original speed + LDA #$01 ; config for FPGA read + STAL TWGS_Serial_Control ; It must be used as the rising edge to trigger readback "M0/RTRIG" of FPGA + LDAL TWGS_Serial_Data ; read back dummy data from FPGA + LDAL TWGS_Serial_Data ; read back dummy data from FPGA + LDAL TWGS_Serial_Data ; read back dummy data from FPGA + JSR FPGA_Read_Config_Frame ; get first frame of FPGA config + SEC ; init readback good + LDAL $000108 ; get last byte of frame and check stop bit (bit7) + BMI :exit ; branch if bit7 set, frame is good + CLC ; stop bit incorrect, init readback failed +:exit PLA ; get original speed + JSR GS_Speed_Restore + PLB ; restore data bank + RTS + +FPGA_Check_Readback PHB + PHK + PLB + JSR GS_1MHZ + PHA + REP #$30 + NOP + JSR FPGA_Setup_Ptrs + LDA #$0029 + JSR FPGA_Skip_Bits + LDA #FPGA_Max_Frames + STA FPGA_Frame_Count +:read_next JSR FPGA_Read_Data_Frame + SEP #$30 + NOP + LDX #$00 +:frame_byte TXY + LDAL $000100,X + EORL $000109,X + AND ($3C),Y + BEQ :frame_byte_ok + REP #$30 + NOP + LDA #$0001 + JMP TWGS_Failed + + MX %11 +:frame_byte_ok INX + CPX #FPGA_Max_Frame_Bytes + BCC :frame_byte + JSR FPGA_Read_Config_Frame + REP #$30 + NOP + LDA $3C + CLC + ADC #FPGA_Max_Frame_Bytes + STA FPGA_Map_Mask_Ptr + DEC FPGA_Frame_Count + BNE :read_next + SEP #$30 + NOP + PLA + JSR GS_Speed_Restore + PLB + RTS + + mx %00 +FPGA_Setup_Ptrs LDA #FPGA_Config ; FPGA config data is at start of eprom + STA FPGA_Data_Ptr + STZ FPGA_Bit_Offset + LDA #FPGA_Mask + STA FPGA_Map_Mask_Ptr + RTS + + +FPGA_Read_Data_Frame LDX #$0000 +:next LDA (FPGA_Data_Ptr) + LDY FPGA_Bit_Offset + BEQ :done +:shift LSR ; shift right until data byte is in LSB + DEY + BNE :shift +:done INC $38 + STAL $000109,X + INX + CPX #FPGA_Max_Frame_Bytes + BCC :next + LDA #$0003 + JSR FPGA_Skip_Bits + RTS + +FPGA_Skip_Bits CLC + ADC FPGA_Bit_Offset + CMP #8Bits + BCC :done +:skip_more INC $38 + SBC #8Bits + CMP #8Bits + BCS :skip_more +:done STA FPGA_Bit_Offset + RTS + +Read_TWGS_Mode PHP + SEP #$20 + NOP + PHA + JSR GS_1MHZ + PHA + LDAL TWGS_Control + STA $02,S + PLA + JSR GS_Speed_Restore + PLA + PLP + RTS + +Set_TWGS_Mode_Keep_Cache PHP + SEP #$20 + NOP + AND #$FD + PHA + JSR GS_1MHZ + PHA + LDAL TWGS_Control + AND #$02 + ORA $02,S + STAL TWGS_Control + PLA + JSR GS_Speed_Restore + PLA + PLP + RTS + +IRQ_Logic_OFF PHP + SEP #$20 + NOP + JSR Read_TWGS_Mode + ORA #TWGS_IRQ + JSR Set_TWGS_Mode_Keep_Cache + PLP + RTS + +IRQ_Logic_ON PHP + SEP #$20 + NOP + JSR Read_TWGS_Mode + AND #$F7 + JSR Set_TWGS_Mode_Keep_Cache + PLP + RTS + +Cache_ON PHP + SEP #$20 + NOP + JSR GS_1MHZ + PHA + LDAL TWGS_Control + ORA #TWGS_Cache + STAL TWGS_Control + PLA + JSR GS_Speed_Restore + PLP + RTS + +Cache_OFF PHP + SEP #$20 + NOP + JSR GS_1MHZ + PHA + LDAL TWGS_Control + AND #$FD + STAL TWGS_Control + PLA + JSR GS_Speed_Restore + PLP + RTS + +Time_Active_Screen JSR Read_TWGS_Mode + PHA + PHP + PHB + SEI + JSR IRQ_Logic_OFF + JSR Time_Inactive_VBL + PLB + PLP + PLA + JSR Set_TWGS_Mode_Keep_Cache + RTS + +Time_Inactive_VBL SEP #$20 + NOP + LDA #$E1 + PHA + PLB + LDY #$0200 +:start LDA RDVBLBAR + BPL :start +:end LDA RDVBLBAR + BMI :end + TYX +:delay DEX + BNE :delay +:start2 NOP + INX + LDA RDVBLBAR + BPL :start2 + REP #$20 + NOP + TXA + ASL + PHA + TYA + CLC + ADC $01,S + TAY + PLA + SEP #$20 + NOP + CPX #$0002 + BCS :start + TYX + RTS + +; +; +; using VBL, active screen time is 192 scan lines, see IIgs technote #40 +; using 61HZ screen refresh and 262.5 lines per screen refresh +; active time is 1/60 / 262.5 * 192 = ~0.01219 or ~12.19ms +; or for 50HZ and 312.5 lines ~12.29ms +; +; value in X is 5 cycle delay loop count +; $899 = 2201, so the total number of cycles delayed is 2201 * 5 = 11005 +; +; frequency (Hz) is total delayed cycles / active time (seconds) +; $899 = 0.9 MHZ +; $A82 = 1.1 MHz +; + + +Time_Active_Screen_Slow JSR Time_Active_Screen + CPX #$0899 + BCC :failed + CPX #$0A82 + BCS :failed + CLC + RTS + +:failed SEC + RTS + +Time_Active_Screen_Fast JSR Time_Active_Screen + CPX #$17E2 + BCC :failed + CPX #$19CB + BCS :failed + CLC + RTS + +:failed SEC + RTS + +Time_Active_Screen_TWGS JSR Time_Active_Screen + CLC + RTS + +_DELETEME1 SEC ; NOT USED + RTS ; NOT USED + + MX %00 +Time_Video_Counter PHP + SEI + LDAL INTMGRV + STA $4A + LDAL INTMGRV+2 + STA $4C + LDA Test_IRQ_Vector + STAL INTMGRV + LDA Test_IRQ_Vector+2 + STAL INTMGRV+2 + PLP +:loop LDA #$FFFF + STA $48 + SEP #$20 + NOP + PHB + LDA #$E0 + PHA + PLB + LDX #:end-:code ; length of code to pre cache +:pre_cache LDAL :code-1,X + DEX + BNE :pre_cache +:code LDX #$0016 ; fixed cycle loop count = 22 + + LDA VERTCNT +:wait CMP VERTCNT + BEQ :wait + LDA VERTCNT +:wait2 CMP VERTCNT + BEQ :wait2 +:delay DEX + BNE :delay + LDA HORIZCNT +:end REP #$20 + NOP + AND #$00FF + TAX + PLB + LDA $48 + AND #$00FF + BEQ :loop + PHP + SEI + LDA $4A + STAL INTMGRV + LDA $4C + STAL INTMGRV+2 + PLP + RTS + +Test_IRQ_Vector JMPL TEMP_INTERRUPT_MGR + +TEMP_INTERRUPT_MGR PHP + PHB + PEA $0000 + PLB + PLB + STZ |$0048 + PLB + PLP + JMPL $00004A + +Time_Video_Counter_Slow PHX + JSR Time_Video_Counter + CPX #$00F0 + BCC :fail + CPX #$00F9 + BCS :fail + PLX + CLC + RTS + +:fail PLX + SEC + RTS + +Time_Video_Counter_Fast PHX + JSR Time_Video_Counter + CPX #$006D + BCC :fail + CPX #$0073 + BCS :fail + PLX + CLC + RTS + +:fail PLX + SEC + RTS + +Time_Video_Counter_TWGS PHX + JSR Time_Video_Counter + PLX + CLC + RTS + +_DELETEME2 PLX ; NOT USED + SEC ; NOT USED + RTS ; NOT USED + +Test_CPU JSR GS_FAST + JSR TWGS_ON + LDA $4E + BEQ :long_test + LDX #$0001 + BRA :test_loop +:long_test LDX #$7530 +:test_loop PHX + SEC + SEP #$30 + LDY #$00 + CLC + BCS :fail_8bit + CLC + REP #$30 + LDY #$3818 + BCS :fail_16bit + CPY #$3818 + BNE :fail_16bit + PLX + DEX + BNE :test_loop + LDA #$0002 + LDY #$0000 + RTS + +:fail_8bit REP #$30 + NOP +:fail_16bit PLX + LDY #$0001 + LDA #$0003 + RTS + +Test_NVRAM JSR GS_1MHZ + JSR TWGS_OFF + SEP #$30 + NOP + NOP + LDA #NVRAM_CMD_Enable_Write + JSR NVRAM_Send_Cmd + REP #$30 + NOP + NOP + LDA #$0000 + JSR Test_NVRAM_FILL_16bit + LDX #$0000 + LDA #$FFFF + JSR Test_NVRAM_Compare_Update + LDY #$0001 + BCS :failed + LDX #$FFFF + LDA #$0000 + JSR Test_NVRAM_Compare_Update + LDY #$0002 + BCS :failed + LDA $4E + BNE :ok + LDX #$0000 + LDA #$0001 +:walk_1 JSR Test_NVRAM_Compare_Update + LDY #$0003 + BCS :failed + TAX + ASL + BCC :walk_1 + LDA #$FFFE +:walk_0 JSR Test_NVRAM_Compare_Update + LDY #$0004 + BCS :failed + TAX + SEC + ROL + BCS :walk_0 + JSR Test_NVRAM_Compare_Update + LDY #$0004 + BCS :failed +:ok LDA #$0002 + LDY #$0000 + BRA :exit +:failed LDA #$0003 +:exit PHA + SEP #$30 + NOP + NOP + LDA #NVRAM_CMD_Disable_Write + JSR NVRAM_Send_Cmd + REP #$30 + NOP + NOP + PLA + RTS + +Test_NVRAM_FILL_16bit STA $40 + SEP #$30 + NOP + NOP + LDX #$00 +:loop LDY $40 + LDA $41 + JSR NVRAM_Write_Word + INX + CPX #$10 + BCC :loop + REP #$30 + NOP + LDA $40 + RTS + +Test_NVRAM_Compare_Update STA $40 + STX $42 + SEP #$30 + NOP + NOP + LDX #$00 +:loop JSR NVRAM_Read_Word + CPY $42 + SEC + BNE :exit + CMP $43 + SEC + BNE :exit + LDY $40 + LDA $41 + JSR NVRAM_Write_Word + INX + CPX #$10 + BCC :loop + CLC +:exit REP #$30 + NOP + LDA $40 + LDX $42 + RTS + +Test_Speed_Control LDA $4E + BNE :quick_test + JSR TWGS_OFF + JSR GS_1MHZ + JSR IRQ_Logic_OFF + JSR Time_Active_Screen_Slow + LDY #$0001 + BCS :failed + JSR GS_FAST + JSR GS_1MHZ + JSR GS_FAST + JSR Time_Active_Screen_Fast + LDY #$0002 + BCS :failed + JSR TWGS_ON + JSR TWGS_OFF + JSR TWGS_ON + JSR Time_Active_Screen_TWGS + LDY #$0003 + BCS :failed + JSR GS_1MHZ + JSR GS_FAST + JSR GS_1MHZ + JSR Time_Active_Screen_Slow + LDY #$0004 + BCC :ok +:failed BRA :failed_exit +:quick_test JSR TWGS_OFF + JSR GS_1MHZ + JSR IRQ_Logic_OFF + JSR Cache_ON + JSR Time_Video_Counter_Slow + LDY #$0001 + BCS :failed_exit + JSR GS_FAST + JSR GS_1MHZ + JSR GS_FAST + JSR Time_Video_Counter_Fast + LDY #$0002 + BCS :failed_exit + JSR TWGS_ON + JSR TWGS_OFF + JSR TWGS_ON + JSR Time_Video_Counter_TWGS + LDY #$0003 + BCS :failed_exit + JSR GS_1MHZ + JSR GS_FAST + JSR GS_1MHZ + JSR Time_Video_Counter_Slow + LDY #$0004 + BCS :failed_exit +:ok LDA #$0002 + LDY #$0000 + RTS + +:failed_exit LDA #$0003 + RTS + +Test_IRQ_Logic JSR GS_FAST + JSR TWGS_ON + JSR IRQ_Logic_OFF + JSR Cache_ON + JSR Time_Video_Counter_TWGS + LDY #$0001 + BCS :fail2 + JSR IRQ_Logic_ON + LDA $4E ; quick test flag + BEQ :long_test + LDX #$0001 + BRA :loop +:long_test LDX #$001E +:loop CLI + PHP + SEI + PHP + CLI + PLP + JSR Time_Video_Counter_Fast + LDY #$0002 + BCS :fail1 + PLP + JSR Time_Video_Counter_TWGS + LDY #$0003 + BCS :fail2 + SEP #$04 + NOP + JSR Time_Video_Counter_Fast + LDY #$0004 + BCS :fail2 + REP #$04 + NOP + JSR Time_Video_Counter_TWGS + LDY #$0005 + BCS :fail2 + SEI + JSR Time_Video_Counter_Fast + LDY #$0006 + BCS :fail2 + CLI + JSR Time_Video_Counter_TWGS + LDY #$0007 + BCS :fail2 + DEX + BNE :loop + LDA #$0002 + LDY #$0000 + BRA :exit +:fail1 PLP +:fail2 LDA #$0003 +:exit PHA + JSR IRQ_Logic_OFF + PLA + RTS + +Test_Slot_Slowdown JSR GS_FAST + JSR TWGS_ON + JSR IRQ_Logic_OFF + JSR Cache_ON + SEP #$20 + NOP + LDAL SLTROMSEL + PHA + AND #$4F + STAL SLTROMSEL + LDAL CYAREG + PHA + ORA #$0B + AND #$FB + STAL CYAREG + REP #$20 + NOP + JSR Time_Video_Counter_Slow + BCS :slowdown1 + BRL :skip +:slowdown1 JSR Time_Video_Counter_TWGS + LDY #$0001 + BCC :continue + BRL :failed +:continue LDA $4E + BEQ :long_test + LDX #$0001 + BRA :loop +:long_test LDX #$0064 +:loop SEP #$20 + NOP + LDAL MOTOR4ON + REP #$20 + NOP + JSR Time_Video_Counter_Slow + SEP #$20 + NOP + LDAL MOTOR4OFF + REP #$20 + NOP + LDY #$0002 + BCS :failed + JSR Time_Video_Counter_TWGS + LDY #$0003 + BCS :failed + SEP #$20 + NOP + LDAL MOTOR5ON + REP #$20 + NOP + JSR Time_Video_Counter_Slow + SEP #$20 + NOP + LDAL MOTOR5OFF + REP #$20 + NOP + LDY #$0004 + BCS :failed + JSR Time_Video_Counter_TWGS + LDY #$0005 + BCS :failed + SEP #$20 + NOP + LDAL MOTOR7ON + REP #$20 + NOP + JSR Time_Video_Counter_Slow + SEP #$20 + NOP + LDAL MOTOR7OFF + REP #$20 + NOP + LDY #$0006 + BCS :failed + JSR Time_Video_Counter_TWGS + LDY #$0007 + BCS :failed + DEX + BNE :loop + LDA #$0002 + LDY #$0000 + BRA :exit +:skip LDA #$0004 + LDY #$0000 + BRA :exit +:failed LDA #$0003 +:exit TAX + SEP #$20 + NOP + PLA + STAL CYAREG + PLA + STAL SLTROMSEL + REP #$20 + NOP + TXA + RTS + +Test_Cache_RAM PHP + SEI + JSR GS_FAST + JSR TWGS_ON + JSR IRQ_Logic_OFF + JSR Check_Cache_Size + STA Cache_Size + DEC + STA Cache_Max_Mask + LDA #Test_Cache_RAM + AND Cache_Max_Mask + STA $40 ; save in workspace? + CMP #$0201 + BCC :range_error + LDA #Test_Cache_Flush+1 + AND Cache_Max_Mask + STA $42 ; save in workspace2? + CMP $40 + BCC :range_error + LDA #$0000 + JSR Test_Cache_RAM_Fill + TAY + LDA #$FFFF + JSR Test_Cache_RAM_CompareUpdate + LDY #$0001 + BCS :failed + TAY + LDA #$0000 + JSR Test_Cache_RAM_CompareUpdate + LDY #$0002 + BCS :failed + LDA $4E + BNE :ok + TAY + LDA #$0001 +:walk_1 JSR Test_Cache_RAM_CompareUpdate + LDY #$0003 + BCS :failed + TAY + ASL + BCC :walk_1 + LDA #$FFFE +:walk_0 JSR Test_Cache_RAM_CompareUpdate + LDY #$0004 + BCS :failed + TAY + SEC + ROL + BCS :walk_0 + LDA #$0000 + JSR Test_Cache_RAM_CompareUpdate + LDY #$0004 + BCS :failed +:ok LDA #$0002 + LDY #$0000 + PLP + RTS + +:range_error LDY #$0005 +:failed LDA #$0003 + PLP + RTS + +Test_Cache_RAM_Fill SEP #$20 + NOP + LDX #$0200 +:fill_loop STAL $BF0000,X + INX + CPX $40 + BCC :fill_loop + LDX $42 +:fill_loop2 STAL $BF0000,X + INX + CPX Cache_Size + BCC :fill_loop2 + REP #$20 + NOP + RTS + +Test_Cache_RAM_CompareUpdate STA $44 + SEP #$20 + NOP + LDX #$0200 +:loop TYA + CMPL $BF0000,X + BNE :error + LDA $44 + STAL $BF0000,X + INX + CPX $40 + BCC :loop + LDX $42 +:loop2 TYA + CMPL $BF0000,X + BNE :error + LDA $44 + STAL $BF0000,X + INX + CPX Cache_Size + BCC :loop2 + CLC + BRA :exit +:error SEC +:exit REP #$20 + NOP + LDA $44 + RTS + +Test_Cache_Flush PHP + SEI + JSR GS_FAST + JSR TWGS_ON + JSR IRQ_Logic_OFF + JSR L92B8 + LDA #Test_Cache_Flush + AND Cache_Max_Mask + STA $40 + CMP #$0201 + BCC :range_error + LDA #Test_Shadow_Emulation+1 + AND Cache_Max_Mask + STA $42 + CMP $40 + BCS :begin_test +:range_error LDY #$0007 + LDA #$0003 + PLP + RTS + +:begin_test LDA #$AAAA + JSR L923A + LDA #$AAAA + JSR L9258 + LDY #$0001 + BCS L91EF + JSR Test_Cache_Rom + LDA #$AAAA + JSR L9280 + LDY #$0002 + BCS L91EF + LDA #$5555 + JSR L923A + LDA #$5555 + JSR L9258 + LDY #$0003 +L91EF BCS L9235 + JSR Test_Cache_Rom + LDA #$5555 + JSR L9280 + LDY #$0004 + BCS L9235 + JSR L92D9 + LDA #$AAAA + JSR L923A + JSR L92B8 + LDA #$AAAA + JSR L9280 + LDY #$0005 + BCS L9235 + LDA #$5555 + JSR L923A + JSR L92D9 + LDA #$5555 + JSR L9280 + JSR L92B8 + LDY #$0006 + BCS L9235 + LDA #$0002 + LDY #$0000 + PLP + RTS + +L9235 LDA #$0003 + PLP + RTS + +L923A SEP #$20 + NOP + LDX #$0200 +:store_loop1 STAL $BE0000,X + INX + CPX $40 + BCC :store_loop1 +L9249 LDX $42 +:store_loop2 STAL $BE0000,X + INX + CPX Cache_Size + BCC :store_loop2 + REP #$20 + NOP + RTS + +L9258 SEP #$20 + NOP + LDX #$0200 +:loop CMPL $BE0000,X + BNE :done + INX + CPX $40 + BCC :loop + LDX $42 +:loop2 CMPL $BE0000,X + BNE :done + INX + CPX Cache_Size + BCC :loop2 + REP #$20 + NOP + CLC + RTS + +:done REP #$20 + NOP + SEC + RTS + +L9280 SEP #$20 + NOP + LDX #$0200 +L9286 CMPL $BE0000,X + BEQ L92A3 + INX + CPX $40 + BCC L9286 + LDX $42 +L9293 CMPL $BE0000,X + BEQ L92A3 + INX + CPX Cache_Size + BCC L9293 + REP #$20 + NOP + CLC + RTS + +L92A3 REP #$20 + NOP + SEC + RTS + +Test_Cache_Rom PHB + LDX Cache_Size + LDX #$8000 + LDY #$8000 + LDA Cache_Max_Mask + MVN TWGS_Control,TWGS_Control ; $BC0000,$BC0000 + PLB + RTS + +L92B8 SEP #$20 + NOP + LDAL CYAREG + PHA + AND #$7F + STAL CYAREG + LDAL TWGS_Control + ORA #$02 + STAL TWGS_Control + PLA + STAL CYAREG + REP #$20 + NOP + RTS + +L92D9 SEP #$20 + NOP + LDAL CYAREG + PHA + AND #$7F + STAL CYAREG + LDAL TWGS_Control + AND #$FD + STAL TWGS_Control + PLA + STAL CYAREG + REP #$20 + NOP + RTS + +Test_Shadow_Emulation LDA $4E + BEQ L9301 + BRL L941B +L9301 PEA $0000 + PEA $0000 + PEA $0000 + PEA $0400 + PEA $5000 + PEA $8018 +L9313 PEA $0000 + PEA $0000 + _NewHandle + BCS L934E +L9322 PEA $0000 +L9325 PEA $0000 + PEA $0000 + PEA $0400 +L932E PEA $5000 + PEA $8018 + PEA $0000 + PEA $0000 + _NewHandle +L9341 BCC L9357 + PLA + PLA + _DisposeHandle + BRA L9350 +L934E PLA + PLA +L9350 LDA #$0004 + LDY #$0000 + RTS + +L9357 PHP + SEI + JSR IRQ_Logic_OFF + JSR GS_FAST + JSR TWGS_ON + SEP #$20 + NOP + LDAL $E0C01D + PHA + LDAL $E0C018 + PHA + STAL TXTPAGE1 + STAL $E0C000 + REP #$20 + NOP + PEA $00E0 + PEA $0800 + LDA $08,S + PHA + LDA $08,S + PHA + PEA $0000 + PEA $0400 + _PtrToHand + PEA $00E1 + PEA $0800 + LDA $04,S + PHA + LDA $04,S + PHA + PEA $0000 + PEA $0400 + _PtrToHand + PHB + LDX #$0400 + LDY #$0800 + LDA #$03FF + MVN $E00000,$E00000 + LDX #$0400 + LDY #$0800 + LDA #$03FF + MVN $E10000,$E10000 + PLB + LDAL $012000 + PHA + LDAL $002000 + PHA + LDAL $E12000 + PHA + LDAL $E02000 + PHA +L93DA LDAL $010478 + PHA + LDAL $000478 + PHA + LDAL $E10478 + PHA + LDAL $E00478 + PHA + LDAL $001FFE + PHA + LDAL $004000 + PHA + LDAL $E01FFE + PHA + LDAL $E04000 + PHA + LDAL $0003FE + PHA + LDAL $000878 + PHA + LDAL $E003FE + PHA + LDAL $E00878 + PHA + LDX #$012C + BRA L941E +L941B LDX #$0001 +L941E PHX + SEP #$20 + NOP + STAL TXTPAGE1 + STAL $E0C000 +L942A STAL $E0C056 + REP #$20 + NOP + JSR L95CA + BCS L949B + JSR L95DF + BCS L949B + JSR L957C + BCS L949B + SEP #$20 + NOP + STAL $E0C001 + REP #$20 + NOP + JSR L95CA + BCC L949B + JSR L95DF + BCS L949B + JSR L957C + BCS L949B + SEP #$20 + NOP + STAL $E0C057 + REP #$20 + NOP + JSR L95CA + BCC L949B + JSR L95DF + BCC L949B + JSR L957C + BCS L949B + SEP #$20 + NOP + STAL $E0C000 + STAL $E0C056 + REP #$20 + NOP + JSR L95CA + BCS L949B + JSR L95DF + BCS L949B + JSR L957C + BCS L949B + PLX + DEX + BNE L941E + LDA #$0002 + LDY #$0000 + BRA L949F +L949B PLX + LDA #$0003 +L949F TAX + SEP #$20 + NOP + STAL TXTPAGE1 + STAL $E0C000 + REP #$20 + NOP + LDA $4E + BEQ L94B5 + BRL L9505 +L94B5 PLA + STAL $E00878 + PLA + STAL $E003FE + PLA + STAL $000C78 + PLA + STAL $0003FE + PLA + STAL $E04000 + PLA + STAL $E01FFE + PLA + STAL $004000 + PLA + STAL $001FFE + PLA + STAL $E00478 + PLA + STAL $E10478 + PLA + STAL $000478 + PLA + STAL $010478 + PLA + STAL $E02000 + PLA + STAL $E12000 + PLA + STAL $002000 +L9500 PLA + STAL $012000 +L9505 PHX +L9506 PHY + LDA $4E + BEQ L950E + BRL L9579 +L950E LDA $0A,S + PHA + LDA $0A,S + PHA + PEA $00E1 + PEA $0800 + PEA $0000 + PEA $0400 + _HandToPtr + LDA $0E,S + PHA + LDA $0E,S + PHA + PEA $00E0 + PEA $0800 + PEA $0000 + PEA $0400 + _HandToPtr +L9540 PLY + PLX + SEP #$20 + NOP + STAL $E0C000 + STAL $E0C056 + PLA + BPL L9554 + STAL $E0C001 +L9554 PLA + BPL L955B + STAL $E0C057 +L955B REP #$20 + NOP + PLP + LDA $07,S + PHA + LDA $07,S + PHA + TXA + STA $0B,S + TYA + STA $09,S + _DisposeHandle + _DisposeHandle +L9579 PLY + PLA + RTS + +L957C LDY #$0000 +L957F LDA L959A,Y + TAX + LDA L95AA,Y + JSR L95F4 + BCS L9594 + INY + INY + CPY #$0010 + BCC L957F + CLC + RTS + +L9594 LDA L95BA,Y + TAY + SEC + RTS + +L959A DW $02FE + DW $02FE + DW $0778 + DW $0778 + DW $1EFE + DW $1EFE + DW $3F00 + DW $3F00 +L95AA DW $0000 + DW $00E0 + DW $0000 + DW $00E0 + DW $0000 + DW $00E0 + DW $0000 + DW $00E0 +L95BA DW $0003 + DW $0003 + DW $0003 + DW $0003 + DW $0004 + DW $0004 + DW $0004 + DW $0004 + +L95CA LDA #$0000 + JSR L95D5 + BCC L95DE + LDA #$00E0 +L95D5 LDX #$0378 + JSR L95F4 + LDY #$0001 +L95DE RTS + +L95DF LDA #$0000 + JSR L95EA + BCC L95F3 + LDA #$00E0 +L95EA LDX #$1F00 + JSR L95F4 + LDY #$0002 +L95F3 RTS + +L95F4 PHB + XBA + PHA + PLB + PLB + SEP #$20 + NOP + STAL TXTPAGE1 + REP #$20 + NOP + LDA #$AAAA + STA $0100,X + SEP #$20 + NOP + STAL TXTPAGE2 + REP #$20 + NOP + LDA #$BBBB + STA $0100,X + SEP #$20 + NOP + STAL TXTPAGE1 + REP #$20 + NOP + LDA #$AAAA + CMP $0100,X + BNE L9640 + SEP #$20 + NOP + STAL TXTPAGE2 + REP #$20 + NOP +L9635 LDA #$BBBB + CMP $0100,X + BNE L9640 + SEC + BRA L9641 +L9640 CLC +L9641 PLB + RTS + +Test_Language_Card PHP + SEI + JSR IRQ_Logic_OFF + JSR GS_FAST + JSR TWGS_ON + SEP #$20 + NOP + LDAL $E0C083 + REP #$20 + NOP + LDAL $D000 + PHA + LDAL $E000 + PHA + SEP #$20 + NOP + LDAL $E0C08B + REP #$20 + NOP + LDAL $D000 + PHA + LDA $4E + BEQ L967A + LDX #$0001 + BRA L967D +L967A LDX #$0BB8 +L967D PHX + SEP #$20 + NOP + LDAL $E0C083 + LDAL $E0C083 + REP #$20 + NOP + LDA #$AABB + STAL $D000 + LDA #$CCDD + STAL $E000 + SEP #$20 + NOP + LDAL $E0C08B +L96A1 LDAL $E0C08B + REP #$20 + NOP + LDA #$EEFF + STAL $D000 + SEP #$20 + NOP + LDAL $E0C083 + REP #$20 + NOP + LDA #$AABB + CMPL $D000 + BNE L9717 + LDAL $E000 + CMP #$CCDD + BNE L9717 + SEP #$20 + NOP + LDAL $E0C08B + REP #$20 + NOP + LDAL $D000 + CMP #$EEFF + BNE L9717 + LDAL $E000 + CMP #$CCDD + BNE L9717 + SEP #$20 + NOP + LDAL $C082 + REP #$20 + NOP + LDAL $D000 + CMP #$AABB +L96F8 BEQ L9717 + CMP #$EEFF + BEQ L9717 + LDAL $E000 + CMP #$CCDD + BEQ L9717 + PLX + DEX + BEQ L970F + BRL L967D +L970F LDA #$0002 + LDY #$0000 + BRA L971E +L9717 PLX + LDA #$0003 + LDY #$0001 +L971E TAX + SEP #$20 + NOP + LDAL $E0C08B + LDAL $E0C08B + REP #$20 + NOP + PLA + STAL $D000 + SEP #$20 + NOP + LDAL $E0C083 + LDAL $E0C083 + REP #$20 + NOP + PLA + STAL $E000 + PLA + STAL $D000 +L974A SEP #$20 + NOP + LDAL $C082 + REP #$20 + NOP + TXA + PLP + RTS + +L9757 REP #$30 + NOP + SEC + JSL Run_Diagnostic_Tests + BCC L9764 + JMP TWGS_Failed + +L9764 SEP #$30 + NOP + RTS + + MX %00 +Run_Diagnostic_Tests PHB + PHK + PLB + STZ $4E + BCC L9774 + LDA #$FFFF + STA $4E +L9774 LDX #$0000 +L9777 PHX + JSR (Test_Function_Table1,X) + CMP #$0003 + BEQ L978B + PLX + INX + INX + CPX #$0010 + BCC L9777 + CLC + PLB + RTL + +L978B PLA + LSR + INC + PHY + XBA + ORA $01,S + PLY + SEC + PLB + RTL + +Test_Function_Table1 DA Test_CPU + DA Test_NVRAM + DA Test_Cache_RAM + DA Test_Cache_Flush + DA Test_Speed_Control + DA Test_IRQ_Logic + DA Test_Slot_Slowdown + DA Test_Language_Card + DA Test_Shadow_Emulation + +TWGS_Failed PHP + PHB + PHK + PLB + REP #$30 + NOP + PHA + SEP #$30 + NOP + STAL $E0C051 + STAL $E0C052 + STAL TXTPAGE1 + STAL $E0C056 + STAL $E0C000 + STAL $E0C00C + STAL $E0C00F + LDA #$01 + STAL $E0C029 + REP #$30 + NOP + JSR Text_Init + LDX #$000A + LDY #$0004 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "TransWarp GS failure" + LDX #$000B + LDY #$0005 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "(error code= )" + LDX #$0018 + LDY #$0005 + JSR Text_Offset_For_X_Y + PLA + JSR Text_Out_Word_As_Hex + LDX #$000A + LDY #$0007 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Follow these steps:" + LDX #$000C + LDY #$0009 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "1) Turn off the GS" + LDX #$000C + LDY #$000A + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "2) Wait 20 seconds" + LDX #$000C + LDY #$000B + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "3) Turn on the GS" + LDX #$0007 + LDY #$000D + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "If this screen re-appears," + LDX #$0008 + LDY #$000E + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "note the error code and" + LDX #$0005 + LDY #$000F + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "contact technical support at:" + LDX #$000D + LDY #$0011 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "(214) 241-6069" + LDX #$0002 + LDY #$0012 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "9am to 12:30pm & 1:35pm to 5pm (CST)" + LDX #$0009 + LDY #$0013 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Monday Through Friday" + STP + +*----------- +; FPGA_Mask +; Fgpa_ReadBack_MasK ($9988) +; 160 frames of 71 bits + 1 stop + +FPGA_Mask + HEX 6C6FEF + HEX 5EDCDEBD3D04ECEFDF1FDCBFBF3F14EC + HEX FFFF3FFDFFFF7F36FCFFEF5FFFDFFFBF + HEX 36ACBF6F7F7FDFFEFE16ACFFEFFFFFDF + HEX FFFF17CDFFEF7FFFDFFFFF36CDFFEFFF + HEX FDDFFFFF378F9F3F3F3D7F7E7E76BFBC + HEX 7C7979F9F2F27ABFBE6E7D7DDDFAFA7A + HEX 9F9E2E3D3D5D7A7A7A9F9E2E3D3D5D7A + HEX 7A7ADDDEAEBDBD5D7B7B5BFFFEEEFDFD + HEX DDFBFB7BFFFFFFFFFFFFFFFF7BDFDFAF + HEX BFBF5F7F7F7BDEDFAFBFBF5F7F7F3B0F + HEX 0F1F1E1E3E3C3C58BFBF6F7F7FDFFEFE + HEX 7ABFBF7F7F7FFFFEFE7A9D9F2F3F3F5F + HEX 7E7E5E9D9F2F3F3F5F7E7E5EDDDFAFBF + HEX BF5F7F7F5FDFDFAFBFBF5F7F7F7FFFFF + HEX EFFFFFDFFFFF7FFFFFFFFFFFFFFFFF7F + HEX BFBC7C7979F9F2F27ABFBE6E7D7DDDFA + HEX FA7A9F9E2E3D3D5D7A7A7A9F9E2E3D3D + HEX 5D7A7A7ADDDEAEBDBD5D7B7B5BFFFEEE + HEX FDFDDDFBFB7BFFFFFFFFFFFFFFFF7BDF + HEX DFAFBFBF5F7F7F7BDEDFAFBFBF5F7F7F + HEX 3B0F0F1F1E1E3E3C3C58BFBF6F7F7FDF + HEX FEFE7ABFBF7F7F7FFFFEFE7A9D9F2F3F + HEX 3F5F7E7E5E9D9F2F3F3F5F7E7E5EDDDF + HEX AFBFBF5F7F7F5FDFDFAFBFBF5F7F7F7F + HEX FFFFEFFFFFDFFFFF7FFFFFFFFFFFFFFF + HEX FF7F9190202121414202449388081111 + HEX 11222260BFBC7C7979F9F2F27ABFBE6E + HEX 7D7DDDFAFA7A9F9E2E3D3D5D7A7A7A9F + HEX 9E2E3D3D5D7A7A7ADDDEAEBDBD5D7B7B + HEX 5BFFFEEEFDFDDDFBFB7BFFFFFFFFFFFF + HEX FFFF7BDFDFAFBFBF5F7F7F7BDEDFAFBF + HEX BF5F7F7F3B0F0F1F1E1E3E3C3C58BFBF + HEX 6F7F7FDFFEFE7ABFBF7F7F7FFFFEFE7A + HEX 9D9F2F3F3F5F7E7E5E9D9F2F3F3F5F7E + HEX 7E5EDDDFAFBFBF5F7F7F5FDFDFAFBFBF + HEX 5F7F7F7FFFFFEFFFFFDFFFFF7FFFFFFF + HEX FFFFFFFFFF7FBFBC7C7979F9F2F27ABF + HEX BE6E7D7DDDFAFA7A9F9E2E3D3D5D7A7A + HEX 7A9F9E2E3D3D5D7A7A7ADDDEAEBDBD5D + HEX 7B7B5BFFFEEEFDFDDDFBFB7BFFFFFFFF + HEX FFFFFFFF7BDFDFAFBFBF5F7F7F7BDEDF + HEX AFBFBF5F7F7F3B0F0F1F1E1E3E3C3C58 + HEX BFBF6F7F7FDFFEFE7ABFBF7F7F7FFFFE + HEX FE7A9D9F2F3F3F5F7E7E5E9D9F2F3F3F + HEX 5F7E7E5EDDDFAFBFBF5F7F7F5FDFDFAF + HEX BFBF5F7F7F7FFFFFEFFFFFDFFFFF7FFF + HEX FFFFFFFFFFFFFF7FBFBC7C7979F9F2F2 + HEX 7ABFBE6E7D7DDDFAFA7A9F9E2E3D3D5D + HEX 7A7A7A9F9E2E3D3D5D7A7A7ADDDEAEBD + HEX BD5D7B7B5BFFFEEEFDFDDDFBFB7BFFFF + HEX FFFFFFFFFFFF7BDFDFAFBFBF5F7F7F7B + HEX DEDFAFBFBF5F7F7F3B0F0F1F1E1E3E3C + HEX 3C58BFBF6F7F7FDFFEFE7ABFBF7F7F7F + HEX FFFEFE7A9D9F2F3F3F5F7E7E5E9D9F2F + HEX 3F3F5F7E7E5EDDDFAFBFBF5F7F7F5FDF + HEX DFAFBFBF5F7F7F7FFFFFEFFFFFDFFFFF + HEX 7FFFFFFFFFFFFFFFFF7F919020212141 + HEX 420244938808111111222260BFBC7C79 + HEX 79F9F2F27ABFBE6E7D7DDDFAFA7A9F9E + HEX 2E3D3D5D7A7A7A9F9E2E3D3D5D7A7A7A + HEX DDDEAEBDBD5D7B7B5BFFFEEEFDFDDDFB + HEX FB7BFFFFFFFFFFFFFFFF7BDFDFAFBFBF + HEX 5F7F7F7BDEDFAFBFBF5F7F7F3B0F0F1F + HEX 1E1E3E3C3C58BFBF6F7F7FDFFEFE7ABF + HEX BF7F7F7FFFFEFE7A9D9F2F3F3F5F7E7E + HEX 5E9D9F2F3F3F5F7E7E5EDDDFAFBFBF5F + HEX 7F7F5FDFDFAFBFBF5F7F7F7FFFFFEFFF + HEX FFDFFFFF7FFFFFFFFFFFFFFFFF7FBFBC + HEX 7C7979F9F2F27ABFBE6E7D7DDDFAFA7A + HEX 9F9E2E3D3D5D7A7A7A9F9E2E3D3D5D7A + HEX 7A7ADDDEAEBDBD5D7B7B5BFFFEEEFDFD + HEX DDFBFB7BFFFFFFFFFFFFFFFF7BDFDFAF + HEX BFBF5F7F7F7BDEDFAFBFBF5F7F7F3B0F + HEX 0F1F1E1E3E3C3C58BFBF6F7F7FDFFEFE + HEX 7ABFBF7F7F7FFFFEFE7A9D9F2F3F3F5F + HEX 7E7E5E9D9F2F3F3F5F7E7E5EDDDFAFBF + HEX BF5F7F7F5FDFDFAFBFBF5F7F7F7FFFFF + HEX EFFFFFDFFFFF7FFFFFFFFFFFFFFFFF7F + HEX BBBC7C7979F9F2F26ABBBE6E7D7DDDFA + HEX FA6A9B9E2E3D3D5D7A7A6A9B9E2E3D3D + HEX 5D7A7A6AD9D2A2A5A5454B4B4BF3F2E2 + HEX E5E5C5CBCB6B7B73F3E6E2E6CDCD695B + HEX D3A3A7A3474F4F6BDADBABB7B6576F6F + HEX 290B0A1B1616362C2C483BBB6B7777D7 + HEX EEEE68BBBB6B7777D7EEEE6A999B2B37 + HEX 37576E6E4A999B2B3737576E6E4ED9DB + HEX ABB7B7576F6F4FDBDBABB7B7576F6F6F + HEX FBFBEBF7F6D7EFEF6DFBFBFBF7E2F7EF + HEX EF4D8BF8E8F1E0D1E3E32B8BF8E8F1E0 + HEX D1E3E32388E8C8D1C091A3A303 + +*----------- + + MX %00 +Check_Key LDA Fake_Key_Flag + AND #$00FF + BEQ :no_key + SEP #$20 + NOP + LDAL $E0C000 + REP #$20 + NOP + BPL :no_key + SEC + RTS + +:no_key CLC + RTS + + +Set_No_Items_Selected LDX #$000F + LDA #$FFFF +:next_item STA $72,X + STZ $62,X + DEX + BNE :next_item + RTS + + +Display_Menu_Items CLC + PHP + STX $55 + STX $59 + STY $5B + STZ $5D + LDA $2C + STA $5F + LDA $2E + STA $61 +L9F5F LDX $5F + LDY $2E + INY + JSR Text_Offset_For_X_Y + INC $5D + JSR Text_Normal + LDX $5D + SEP #$20 + NOP + LDA $62,X + CMP $72,X + REP #$20 + NOP + BNE L9F7F + LDA #$0044 + BRA L9F82 +L9F7F LDA #$00A0 +L9F82 JSR Text_Char_to_Screen + LDX $2C + INX + JSR Text_Offset_For_X_VPOS + LDA $5D + CMP $5B + BNE L9FA9 + JSR Text_Inverse + LDX $59 + STX $57 + LDA |$0000,X + AND #$00FF + CMP #$0002 + BCS L9FA9 + JSR Text_Normal + PLP + SEC + PHP +L9FA9 LDX $59 + JSR Text_Out_Pascal_String + JSR Text_Normal + INX + JSR L9FC1 + STX $59 + LDA |$0000,X + AND #$00FF + BNE L9F5F + PLP + RTS + +L9FC1 PHX + STX $59 + LDA ($59) + BEQ L9FEA + STA $59 + LDX $5D + LDA $62,X + AND #$00FF + TAY + LDX $59 + CPY #$0000 + BEQ L9FE7 +L9FD9 STX $59 + LDA ($59) +L9FDD AND #$00FF + SEC + ADC $59 + TAX + DEY + BNE L9FD9 +L9FE7 JSR Text_Out_Pascal_String +L9FEA PLX + INX + INX + RTS + +Menu_Input_Select SEP #$20 + NOP +L9FF1 LDAL $E0C000 + BPL L9FF1 +L9FF7 STAL $E0C010 + REP #$20 + NOP +L9FFE AND #$00FF +LA001 CMP #$009B + BEQ LA048 +LA006 CMP #$008D + BEQ LA04D + CMP #$0088 + BEQ LA051 +LA010 CMP #$0095 + BEQ LA058 +LA015 CMP #$008A + BEQ LA032 +LA01A CMP #$008B + BNE L9FF1 +LA01F LDA $5B + BEQ Menu_Input_Select +LA023 DEC $5B + BNE LA02B + LDA $5D + STA $5B +LA02B JSR LA05F + BCS LA01F + BRA Menu_Input_Select +LA032 LDA $5B + BEQ Menu_Input_Select + INC $5B + CMP $5D + BCC LA041 + LDA #$0001 + STA $5B +LA041 JSR LA05F + BCS LA032 + BRA Menu_Input_Select +LA048 LDY #$0000 + SEC + RTS + +LA04D LDY $5B + SEC + RTS + +LA051 LDA #$FFFF + LDX $5B + CLC + RTS + +LA058 LDA #$0001 + LDX $5B + CLC + RTS + +LA05F LDX $5F + LDY $61 +LA063 JSR Text_Offset_For_X_Y + LDX $55 + LDY $5B + JSR Display_Menu_Items + RTS + +LA06E PHP + PHX + JSR Text_Normal + LDA |$0000,X + TAY + LDX #$0001 + JSR Text_Offset_For_X_Y + LDA VPOS + BEQ :row0 + LDA #$005C + BRA :skip +:row0 LDA #$00DF +:skip LDY #$0026 + JSR Text_Repeat_Char_Horiz + LDX #$0002 + LDY VPOS + INY + JSR Text_Offset_For_X_Y + PLX + INX + INX + JSR Text_Out_Pascal_String + LDX HPOS + INX + JSR Text_Offset_For_X_VPOS + PLP + BCC LA0AA + JSR Text_Inverse +LA0AA LDA #$0027 + SEC + SBC HPOS + TAY + LDA #$00A0 + JSR Text_Repeat_Char_Horiz + JSR Text_Normal + LDX #$0001 + LDY VPOS + INY + JSR Text_Offset_For_X_Y + LDA #$004C + LDY #$0026 + JSR Text_Repeat_Char_Horiz + RTS + +STROUT_SelectHU LDX #$0002 + LDY #$0016 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Select: "'H'" "'U' + RTS + +STROUT_SelectJK LDX #$0002 + LDY #$0016 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Select: "'J'" "'K' + RTS + +STROUT_Open LDX #$001E + LDY #$0016 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Open: "'M' + RTS + +STROUT_Save LDX #$001E + LDY #$0016 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Save: "'M' + RTS + +STROUT_Cancel LDX #$0012 + LDY #$0016 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Cancel: Esc" + RTS + +STROUT_JK JSR STROUT_SelectHU + JSR Text_Out_Stack_Pascal_String + STR " "'J'" "'K' + RTS + +STROUT_PressKeyToStop LDX #$0005 + LDY #$0016 + JSR Text_Offset_For_X_Y + JSR Text_Out_Stack_Pascal_String + STR "Press any key to stop the test" + RTS + +LA17A JSR Text_Normal + LDX #$0001 + LDY #$0016 + JSR Text_Offset_For_X_Y + LDA #$00A0 + LDY #$0026 + JSR Text_Repeat_Char_Horiz + RTS + +LA190 JSR STROUT_JK + JSR STROUT_Cancel + JSR STROUT_Save + JSR Set_No_Items_Selected + SEP #$20 + NOP + LDA #$01 + STA $73 + STA $74 + REP #$20 + NOP + PEA $0000 + PEA $0020 + _ReadBParam + PLA + AND #$0001 + STA $63 + LDA TWGS_Config_Byte + AND #$0001 ; get lsb + STA $64 + LDA #$0001 + STA $5B +LA1C7 SEP #$30 + NOP + LDA TWGS_Config_Byte + AND #$FE + ORA $64 + JSR CONFIG_TW_MODE_KEEP_CACHE + REP #$30 + NOP + PEA $0000 + PEA $0020 + _ReadBParam + LDA $01,S + AND #$FFFE + STA $01,S + LDA $63 + AND #$0001 + ORA $01,S + STA $01,S + PEA $0020 +LA1F6 _WriteBParam + SEP #$20 + NOP +LA200 LDAL CYAREG + AND #$7F + STAL CYAREG + LDA $63 + AND #$01 + LSR + ROR + ORAL CYAREG + STAL CYAREG + REP #$20 + NOP + LDX #$0005 + LDY #$000A + JSR Text_Offset_For_X_Y + JSR Check_Cache_Size + CMP #$8000 + BNE LA231 + LDX #$A239 + BRA LA234 +LA231 LDX #$A243 +LA234 JSR Text_Out_Pascal_String + BRA LA24C +LA239 STR "32K Cache" + STR "8K Cache" +LA24C LDX #$0002 + LDY #$0004 + JSR Text_Offset_For_X_Y + LDX #$A545 +LA258 LDY $5B + JSR Display_Menu_Items + JSR Menu_Input_Select + BCS LA26C + LDA $62,X + EOR #$0001 + STA $62,X + JMP LA1C7 + +LA26C CPY #$0000 + BEQ :done + LDA TWGS_Config_Byte + AND #$00FE ; strip lsb + ORA $64 + STA TWGS_Config_Byte +:done RTS + +Configuration_Menu JSR STROUT_JK + JSR STROUT_Cancel + JSR STROUT_Save + JSR Set_No_Items_Selected + SEP #$20 + NOP + LDA #$01 + STA $73 + STA $75 + STA $76 + REP #$20 + NOP + LDA TWGS_Config_Byte + LSR + PHA + AND #$0001 + EOR #$0001 + STA $63 + PLA + LSR + PHA + AND #$0001 + STA $65 + PLA + LSR + PHA + AND #$0001 + STA $66 + PLA + LSR + AND #$0001 + STA $68 + LDA #$0001 + STA $5B +LA2BD LDX #$0002 +LA2C0 LDY #$0004 + JSR Text_Offset_For_X_Y + LDX #$A6D8 + LDY $5B +LA2CB JSR Display_Menu_Items + JSR Menu_Input_Select +LA2D1 BCS LA2F8 + LDA $62,X + EOR #$0001 + STA $62,X + SEP #$20 + NOP + CPX #$0003 + BNE LA2E8 + LDA $65 + BNE LA2E8 + STA $66 +LA2E8 CPX #$0004 + BNE LA2F3 + LDA $66 + BEQ LA2F3 + STA $65 +LA2F3 REP #$20 + NOP + BRA LA2BD +LA2F8 CPY #$0000 + BEQ LA317 + LDA TWGS_Config_Byte + AND #%0000000011100001 ; #$00E1 + STA TWGS_Config_Byte + LDA $68 + ASL + ORA $66 + ASL + ORA $65 + ASL + ORA $63 + EOR #$0001 + ASL + ORA TWGS_Config_Byte + STA TWGS_Config_Byte +LA317 RTS + +LA318 JSR NVRAM_Read_Speed + PHA + SEP #$30 + NOP + JSR TWGS_ON + PHA + JSR GS_FAST + PHA + REP #$30 + NOP + PHP + LDA #$FFFF + STA Fake_Key_Flag + STZ $4E + JSR STROUT_PressKeyToStop + JSR Set_No_Items_Selected + LDX #$0001 + LDY #$0006 + JSR Text_Offset_For_X_Y + LDX #Test_Strings_List + LDY #$0000 + JSR Display_Menu_Items + SEP #$30 + NOP + JSR NVRAM_Save + REP #$30 + NOP + JSR IRQ_Logic_OFF + PLP +LA357 PHP + SEI + LDX #$0000 +LA35C PHX + LDA #$0001 + JSR LA3B1 + BCS LA36C + LDA $01,S + ASL + TAX + JSR (Test_Function_Table,X) +LA36C PLX + PHX + JSR LA3B1 + JSR Check_Key + PLX + BCS LA382 + INX + CPX #$0009 + BCC LA35C + PLP + BCS LA357 + BRA LA38D +LA382 PLP + SEP #$20 + NOP + STAL $E0C010 + REP #$20 + NOP +LA38D SEP #$30 + NOP +LA390 JSR NVRAM_Validate + JSR Config_to_TW_MODE + PLA + JSR GS_Speed_Restore + PLA + JSR SET_TW_MODE + REP #$30 + NOP + PLA + JSR NVRAM_Write_Speed + JSR LA17A + JSR STROUT_Cancel +LA3AB JSR Menu_Input_Select + BCC LA3AB + RTS + +LA3B1 SEP #$20 + NOP + XBA + LDA $63,X + CMP #$03 + BEQ LA3F3 + LDA #$00 +LA3BD XBA + STA $63,X + REP #$20 + NOP + CMP #$0003 + PHP + PHY + PHX + LDX #$0001 + LDY #$0006 +LA3CF JSR Text_Offset_For_X_Y + LDX #$A5BC + LDY #$0000 + JSR Display_Menu_Items +LA3DB PLA + CLC + ADC #$0007 + TAY + LDX #$0025 + JSR Text_Offset_For_X_Y + PLA + PLP + BNE LA3F1 + ORA #$00B0 + JSR Text_Char_to_Screen +LA3F1 CLC + RTS + +LA3F3 REP #$20 + NOP + SEC + RTS + +Test_Function_Table DA Test_CPU + DA Test_NVRAM + DA Test_Cache_RAM + DA Test_Cache_Flush + DA Test_Speed_Control + DA Test_IRQ_Logic + DA Test_Slot_Slowdown + DA Test_Language_Card + DA Test_Shadow_Emulation + +* ENTRY POINT: ABOUT + +About_Transwarp_GS BRA LA42C + +LA40C JSR STROUT_Cancel + JSR Set_No_Items_Selected + LDX #$0002 + LDY #$0005 +LA418 JSR Text_Offset_For_X_Y + LDX #About_Screen_Strings + LDY #$0000 + JSR Display_Menu_Items +:menu_loop JSR Menu_Input_Select + BCC :menu_loop + BRL About_Exit + +* + +LA42C PushLong #$00000000 ; space for result + PushLong #$00008000 ; size in bytes of block to create + PEA $5000 ; user ID to associate with block + PEA #%1000000000011000 ; attributes + PushLong #$00000000 ; pointer to where block is to begin + _NewHandle + BCC :newhandle_ok + PLA ; pull off empty result + PLA + BRA LA40C +:newhandle_ok PushLong #$00000000 ; space for result + PushLong #$00000200 ; size in bytes of block to create + PEA $5000 ; user ID to associate with block + PEA #%1000000000011000 ; attributes (#$8018) + PushLong #$00000000 ; pointer to where block is to begin + _NewHandle + + BCC :newhandle2_ok ; allocation succeeded + PLA ; otherwise pull off empty result + PLA + _DisposeHandle ; and dispose of the first handle + BRA LA40C +:newhandle2_ok PEA $00E1 + PEA $2000 + LDA $0B,S + PHA + LDA $0B,S + PHA + PEA $0000 + PEA $8000 + _PtrToHand + PEA $0000 + PEA $0200 + LDA $07,S + PHA + LDA $07,S + PHA + PEA $0000 + PEA $0200 + _PtrToHand + SEP #$20 + NOP + LDAL $E0C029 + PHA + REP #$20 + NOP + JSR Read_TWGS_Mode + PHA + JSR IRQ_Logic_OFF + JSR GS_FAST + PHA + JSR TWGS_ON + PHA + LDA #$FFFF + STA Fake_Key_Flag + JSR LE5A2 + JSR LE62E + JSR LEB6D + JSR LE93F + PLA + JSR SET_TW_MODE + PLA + JSR GS_Speed_Restore + PLA + JSR Set_TWGS_Mode_Keep_Cache + SEP #$20 + NOP + STAL $E0C010 + PLA + STAL $E0C029 + REP #$20 + NOP + LDA $07,S + PHA + LDA $07,S + PHA + PEA $00E1 + PEA $2000 + PEA $0000 + PEA $8000 + _HandToPtr + LDA $03,S + PHA + LDA $03,S + PHA + PEA $0000 + PEA $0200 + PEA $0000 + PEA $0200 + _HandToPtr + _DisposeHandle + _DisposeHandle +About_Exit RTS + +_DELETEME3 +Debug_HexWord_Out PHA ; not used? + LDX #$0000 + LDY #$0000 + JSR Text_Offset_For_X_Y + PLA + JSR Text_Out_Word_As_Hex + RTS + +Speed_String_Table STR "System Speed:" + DA :system_speeds + STR "TransWarp Speed:" + DA :twgs_speeds + DB $00 +:system_speeds STR " Normal" + STR " Fast " + DB $00 +:twgs_speeds STR " Normal " + STR " TransWarp" + DB $00 + STR "Quick test" + DW $0000 + STR "Continuous test" + DW $0000 + STR " " + DW $0000 + STR "Quit" + DW $0000 + DB $00 +Test_Strings_List STR "CPU................." + DA String_Space14 + STR "Non-Volatile RAM...." + DA String_Space14 + STR "Cache RAM..........." + DA String_Space14 + STR "Cache flush........." + DA String_Space14 + STR "Speed control......." + DA String_Space14 + STR "Interrupt logic....." + DA String_Space14 + STR "Slot slowdown......." + DA String_Space14 + STR "Language card......." + DA String_Space14 + STR "Shadow emulation...." + DA String_Space14 + DB $00 +String_Space14 STR " " + STR " -- Testing --" + STR " Passed " + STR " ** Failed ** " + STR " Skipped " + DB $00 + STR "AppleTalk/IRQ:" + DA String_Off + STR " " + DB $00 + DB $00 + STR "Startup Graphics:" + DA String_Off + STR "Startup Sound:" + DA String_Off + STR " " + DB $00 + DB $00 + DB $00 +String_Off STR " Off" + STR " On " + DB $00 + STR " No " + STR " Yes" + DB $00 +About_Screen_Strings STR " TransWarp GS" + DW $0000 + STR " Copyright (c)1988-1991" + DW $0000 + STR " Applied Engineering" + DW $0000 + STR " " + DW $0000 + STR " P.O. Box 5100" + DW $0000 + STR " Carrollton, Texas 75011" + DW $0000 + STR " " + DW $0000 + STR " Hardware: Steve Malechek" + DW $0000 + STR " LCA design: Roger Kidson" + DW $0000 + STR " Layout: Harvey Wende" + DW $0000 + STR " Firmware: John Stephen" + DW $0000 + STR " " + DW $0000 + STR " " + DW $0000 + STR " Sales: (214) 241-6060" + DW $0000 + STR "Tech. Support: (900) 369-2323" + DW $0000 + DB $00 + +*----------- + + MX %01 +LA871 JSR LA8CB + LDA #$03E8 + STA $08 + LDA #$0000 + STA $0A + JSR 32Bit_Divide +LA881 LDA $00 + CMP #$000A + BCC LA893 + SBC #$000A + PHA + LDA #$00B1 + JSR Text_Char_to_Screen + PLA +LA893 CLC + ADC #$00B0 + JSR Text_Char_to_Screen + LDA #$00AE + JSR Text_Char_to_Screen + LDA $04 + STA $00 + LDA $06 + STA $02 + LDA #$86A0 + STA $08 + LDA #$0001 + STA $0A + JSR 32Bit_Divide + LDA $00 + CLC +LA8B8 ADC #$00B0 + JSR Text_Char_to_Screen + LDX #$C5 + TAY + JSR Text_Out_Pascal_String + RTS + +String_MHz STR " MHz " + +LA8CB INX + STX $00 + STZ $02 + LDA #$E209 + STA $08 + LDA #$0198 +LA8D8 STA $0A + JSR 32Bit_Multiply + LDA $02 + CLC + ADC #$01F4 + STA $00 + LDA $04 + ADC #$0000 + STA $02 + LDA #$03E8 + STA $08 + STZ $0A + JSR 32Bit_Divide + RTS + +LA8F7 LDA TWGS_Config_Byte + AND #$0008 ; bit 4, #%00000000 00001000 + BEQ :no_sound ; i guess + LDX #$87 + PLB + JSR Build_Wavetable + LDA #$001D + JSR Copy_Sound_Data +:no_sound RTS + + MX %00 + +Copy_Sound_Data PHP + SEI + SEP #$20 + NOP + XBA + LDA #$00 + STAL SoundCtl ; DOC access, no autoinc, vol 0 + LDA #$E1 + STAL SoundAdrL + XBA + DEC + ASL + INC + STAL SoundData + REP #$20 + NOP + LDX #LA958 + LDY #$0000 + LDA #$0000 +LA931 JSR Setup_DOC + INY + CPY #$0020 + BCC LA931 + SEP #$20 + NOP + LDA #$00 + STAL SoundCtl ; DOC access, no autoinc, vol 0 + LDA #$E0 + STAL SoundAdrL + LDAL SoundData +:loop LDAL SoundData + BPL :loop + REP #$20 + NOP + PLP + RTS + +LA958 DB $00 + DB $00 + DB $00 + DB $03 + DB $00 + +LA95D LDA TWGS_Config_Byte + AND #%0000000000001000 ; #$0008 + BEQ :done + JSR Time_Active_Screen + STX $00 + STZ $02 + LDA #$0087 + STA $08 + STZ $0A + JSR 32Bit_Multiply + LDA #$42E0 + STA $08 + STZ $0A + JSR 32Bit_Divide + LDX #Sound_Cfg_Table1 + LDY #$0000 + LDA $00 + JSR Setup_DOC + LDX #Sound_Cfg_Table2 + LDY #$0001 + LDA $00 + JSR Setup_DOC +:done RTS + +Sound_Cfg_Table1 DB $C8 + DB $00 + DB $00 + DB $00 + DB $3F +Sound_Cfg_Table2 DB $C8 + DB $00 + DB $00 + DB $10 + DB $3F + +LA9A0 LDA TWGS_Config_Byte + AND #$0008 + BEQ LA9C5 + LDA #$0001 + JSR Copy_Sound_Data + LDX #Sound_Config_Data + LDY #$0000 + LDA #$0000 + JSR Setup_DOC + LDX #Sound_Config_Data + LDY #$0001 + LDA #$0000 + JSR Setup_DOC +LA9C5 RTS + +Sound_Config_Data DB $00 ; i think... + DB $00 + DB $00 + DB $01 + DB $00 + +Setup_DOC PHP + PHX + PHY + PHA + PHA + SEI + SEP #$20 + NOP + LDA #$0F + STAL SoundCtl ; DOC access, no autoinc, vol 15 + PLA + JSR Store_Sound_Data + PLA + JSR Store_Sound_Data +:store_sound_loop LDA |$0000,X + JSR Store_Sound_Data + INX + CPY #$00E0 + BCC :store_sound_loop + REP #$20 + NOP + PLA + PLY + PLX + PLP + RTS + + +Store_Sound_Data PHA + REP #$20 + NOP + TYA + STAL SoundAdrL +LA9FF SEP #$20 + NOP + PLA + STAL SoundData + REP #$20 + NOP + TYA + CLC + ADC #$0020 + TAY + SEP #$20 + NOP + RTS + +Build_Wavetable STX $85 + SEP #$20 + NOP + LDA #$6F + STAL SoundCtl ; RAM access, autoinc, vol F + REP #$20 + NOP + LDA #$0000 + STAL SoundAdrL + STA $99 + LDA ($85) + AND #$00FF + STA $87 + LDA #$0001 + STA $8F + LDA #$0080 + STA $97 + LDA #$0008 + STA $89 + SEP #$10 + NOP +LAA44 SEP #$20 + NOP + LDA $87 + TAY + AND #$03 + STA $8B + TYA + AND #$04 + STA $8D + REP #$20 + NOP + LDA $87 + LSR + LSR + LSR + STA $87 + LDY $89 + DEY + DEY + DEY + STY $89 + CPY #$03 + BCS LAA83 + INC $85 + LDA ($85) + AND #$00FF + CPY #$00 + BEQ LAA79 + ASL + DEY + BEQ LAA79 + ASL + DEY +LAA79 TSB $87 + LDA $89 + CLC + ADC #$0008 + STA $89 +LAA83 LDA $8F + ASL + TAY + LDA Wavetable_Data,Y + STA $91 + LSR + STA $93 + LSR + STA $95 + LDA $8B + LSR + BCS LAA99 + STZ $93 +LAA99 LSR + BCS LAA9E + STZ $91 +LAA9E LDA $91 + CLC + ADC $93 + STA $91 + LDY $8D + BEQ LAAB7 + EOR #$FFFF + INC + STA $91 + LDA $95 + EOR #$FFFF + INC + STA $95 +LAAB7 LDA $97 + CLC + ADC $91 + STA $97 + BMI LAACC + BEQ LAACC + CMP #$0100 + BCC LAACF + LDA #$00FF + BRA LAACF +LAACC LDA #$0001 +LAACF PHA + LDA $97 + CLC + ADC $95 + STA $97 + LDA $8B + ASL + TAY + LDA Wavetable_Data2,Y + CLC + ADC $8F + STA $8F + TAY + DEY + BPL LAAEE + LDA #$0001 + STA $8F + BRA LAAFA +LAAEE CMP Wavetable_Data + BCC LAAFA + BEQ LAAFA + LDA Wavetable_Data + STA $8F +LAAFA PLA + SEP #$20 + NOP + STAL SoundData + REP #$20 + NOP + INC $99 + LDA $99 + CMP #$7225 + BCS LAB11 + JMP LAA44 + +LAB11 SEP #$20 + NOP + REP #$10 + NOP + LDX $99 + LDA #$00 +:store_loop STAL SoundData + INX + CPX #$8000 + BCC :store_loop + REP #$20 + NOP + RTS + +*----------- + + PUT TWGS.2 + PUT TWGS.3 + + + + + + + + + + + + + +