C.S 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265
  1. .title "CROSSBOW for Atari 7800"
  2. ; 10/2/87 Started by Scott Marshall
  3. ; 12/17/87 Milestone #1 delivered
  4. ; 2/1/88 Milestone #2 delivered
  5. ; 2/16/88 Milestone #3 delivered
  6. ; 2/24/88 Milestone #4 delivered
  7. ; 3/14/88 Milestone #5 delivered
  8. ; 4/6/88 Milestone #6 delivered
  9. ; 4/18/88 Milestone #7 delivered
  10. ;
  11. ;
  12. .include "\\INCLUDE\\MARIA.S" ;maria equates and some macros
  13. .include "BM\\ADDR.S" ;bitmap addresses
  14. .include "MACROS.S" ;special-purpose macros
  15. .include "EQUATES.S"
  16. .include "AUDEQU.S" ;audio equates
  17. .include "VARS.S" ;all variables
  18. ;
  19. ; set the bank
  20. setbank 7
  21. ;
  22. ; choose if debug examine is enabled for compiling. If true,
  23. ; the finish quest sequence after killing the face is disabled
  24. ;
  25. EXAMINE equ FALSE
  26. ;
  27. .org CODE ;fixed ROM $C000 .. $FFFF
  28. ;
  29. ; load in the ROM data tables
  30. ;
  31. .include "TABLES.S"
  32. ;
  33. ; the executable code
  34. ;
  35. ; place for IRQ to attach
  36. ;
  37. dummy:
  38. rti
  39. main:
  40. ;
  41. ; initialize hardware
  42. ;
  43. lda #$7 ;lock in 7800 mode
  44. sta PTCTRL
  45. sei ;block interrupts
  46. cld ;clear decimal mode
  47. lda #0
  48. sta OFFSET ;future expansion
  49. sta PTCTRL ;avoid joystick freeze
  50. ldx #$FF ;init stack
  51. txs
  52. ;
  53. ; init high score
  54. ;
  55. jsr initscore ;clear score to zero
  56. jsr newhiscore ;clear hi score
  57. ;
  58. restart0: ;from hitting SELECT during a game
  59. lda #$7f ;turn MARIA off
  60. sta CTRL
  61. ;
  62. ; init audio
  63. ;
  64. lda #$FF
  65. sta soundon
  66. lda #0
  67. tax
  68. sta spriority,x
  69. sta shistory,x
  70. jsr setav
  71. inx
  72. sta spriority,x
  73. sta shistory,x
  74. jsr setav
  75. ;
  76. ; Initialize software
  77. ;
  78. ; Maria zones and headers
  79. ;
  80. ; Copy zone list from ROM to RAM (MARIA can't read it from ROM)
  81. ;
  82. ldx #0
  83. .loop1: dex
  84. lda romzon,x
  85. sta ramzon,x
  86. txa
  87. bne .loop1
  88. ;
  89. ; make the vblank header
  90. ;
  91. lda #%01000000 ;5 byte to set write mode
  92. sta vblhdr+1
  93. lda #SCWP ;offscreen to the right
  94. sta vblhdr+4
  95. lda #0 ;2nd header null
  96. sta vblhdr+6
  97. ;
  98. ; initialize application
  99. ;
  100. ;
  101. ; set switch states
  102. ;
  103. lda SWCHB ;console
  104. sta oldsw
  105. lda SWCHA ;joystick
  106. sta oldjs
  107. *
  108. ***** added by Dave S. 5-Jul-88
  109. *
  110. * init default state of gun mode based on "UP" bit of left joystick
  111. *
  112. ldx #$ff ;assume gun
  113. and #$10 ;see if lite gun likely to be installed
  114. beq .gunok ;power-up UP means probable gun
  115. ldx #0 ;else, do 'stick
  116. .gunok:
  117. stx gun ;init this guy
  118. *
  119. ***** end Dave's addition
  120. *
  121. lda #0 ;turn off
  122. sta selecton ;select
  123. sta pauseon ;pause,
  124. sta left ;and js
  125. sta right
  126. sta up
  127. sta down
  128. sta faddir ;fader init
  129. sta fadtim
  130. ;
  131. ; gun/stick option init
  132. ;
  133. lda gun ;if 0 or FF, this is a warm start
  134. beq .warmstart ;so don't clear this flag
  135. eor #$FF
  136. beq .warmstart
  137. lda #0
  138. sta gun
  139. .warmstart:
  140. ;
  141. ; init rand
  142. ;
  143. jsr initrand
  144. ;
  145. ; Set up Maria zone and header lists
  146. ;
  147. ; clear screen
  148. ;
  149. jsr clearsc
  150. ;
  151. ; init fader
  152. ;
  153. jsr cutout
  154. ;
  155. ; setup interrupts
  156. ;
  157. jsr clrijt1
  158. ;
  159. ; init MARIA to 160 x 2 mode
  160. ;
  161. lda #(ramzon & $ff) ;zone addr low
  162. sta DPPL
  163. lda #(ramzon >> 8) ;zone addr high
  164. sta DPPH
  165. jsr waitvbl ;wait for vert blank
  166. ;
  167. ; TURN MARIA ON
  168. lda #%01000000 ;color,DMA on,CW 2,border on,transp,160x2
  169. sta CTRL
  170. jsr waitvbl ;wait while MARIA reads 5-byte header
  171. lda #0 ;null vbl header to buy future time
  172. sta vblhdr+1
  173. ;
  174. ; main program loop (forever)
  175. ;
  176. mainloop:
  177. jsr doattr ;attract mode
  178. restart: ;from hitting RESET
  179. lda #FALSE
  180. sta idlemode
  181. sta pauseon
  182. jsr cutout
  183. ldx #$FF
  184. txs
  185. jsr doplay ;play game
  186. jsr doend ;say "the end"
  187. jmp mainloop
  188. ;
  189. ; do attract mode
  190. ;
  191. doattr:
  192. lda #TRUE
  193. sta idlemode ;turns true if fire button down
  194. .loop: jsr dotitle
  195. beq .exit
  196. lda #DESERT
  197. jsr doselfplay
  198. beq .exit
  199. jsr dotitle
  200. beq .exit
  201. lda #TOWN
  202. jsr doselfplay
  203. bne .loop
  204. .exit:
  205. makesound UWILLDA
  206. makesound UWILLDB
  207. jsr fadeoutwait
  208. rts
  209. ;
  210. ; title screen
  211. ;
  212. dotitle:
  213. lda #TITLE
  214. sta cursc
  215. jsr setupsc
  216. makeheaders crsbwhdr
  217. maketall logotall
  218. jsr titlerags
  219. jsr fadeinwait
  220. jsr showselect
  221. ldx #4
  222. jsr doidlewait
  223. jsr fadeout
  224. jsr doidlefade
  225. lda idlemode ;set return flag
  226. rts
  227. ;
  228. ; idle fade .. wait for fade done or idlemode going low
  229. ;
  230. doidlefade:
  231. jsr waitbot
  232. jsr dofades
  233. lda idlemode
  234. beq .exit
  235. lda faddir
  236. bne doidlefade
  237. .exit: rts
  238. ;
  239. ; do self-play
  240. ;
  241. doselfplay:
  242. sta cursc
  243. jsr clrbh
  244. jsr initrand
  245. jsr setroster
  246. jsr nextsc
  247. jsr fadeout
  248. jsr doidlefade
  249. lda idlemode ;set return flag
  250. rts
  251. ;
  252. ; do idle wait .. call with 4 second units in x reg, returns when
  253. ; time elapsed or idlemode false
  254. doidlewait:
  255. lda #$FF
  256. sta clock
  257. .loop: pushx
  258. jsr waitbot
  259. jsr dofades
  260. popx
  261. lda clock
  262. bne .nodec
  263. dex
  264. beq .exit
  265. .nodec:
  266. lda idlemode
  267. bne .loop
  268. .exit:
  269. rts
  270. ;
  271. ; init score (clear to zero)
  272. ;
  273. initscore:
  274. lda #0 ;init score
  275. sta score
  276. lda #LDZERO ;blank leading zeroes
  277. _curdig set 1
  278. .rept SCRDGTS-1 ;assembly loop
  279. sta score+_curdig
  280. _curdig set _curdig+1
  281. .endr
  282. rts
  283. ;
  284. ; set roster (friends joined and potential)
  285. ;
  286. setroster:
  287. lda #JOINED
  288. sta frstat+HERO
  289. sta frstat+WOMAN
  290. sta frstat+DWARF
  291. lda #POTENTIAL
  292. sta frstat+NEGRO
  293. sta frstat+MONK
  294. sta frstat+GIRL
  295. sta frstat+WIMP
  296. sta frstat+MERLIN
  297. rts
  298. ;
  299. ; do play mode
  300. ;
  301. doplay:
  302. ;
  303. ; clear been-here record
  304. ;
  305. jsr clrbh
  306. ;
  307. ; set these things false
  308. ;
  309. lda #FALSE
  310. sta gavewarning
  311. sta gameover
  312. ;
  313. ; set current screen
  314. ;
  315. lda #MAP ;should be MAP ;set current and previous screen
  316. sta cursc
  317. sta prevsc
  318. ;
  319. ; clear the list of map paths
  320. ;
  321. ldx #NUMBPATHS-1
  322. lda #FALSE
  323. .loop: sta pathmem,x
  324. dex
  325. bpl .loop
  326. ;
  327. ; init score
  328. ;
  329. jsr initscore
  330. ;
  331. ; set roster of friends
  332. ;
  333. jsr setroster
  334. ;
  335. ; play until gameover
  336. ;
  337. .nextscloop:
  338. jsr waitbot
  339. jsr clearsc
  340. jsr nextsc
  341. jsr fadeoutwait
  342. lda gameover ;exit if game over
  343. beq .nextscloop
  344. rts
  345. ;
  346. ; next screen jump table
  347. ; reads cursc (current screen), jumps to right subroutine
  348. nextsc:
  349. lda cursc
  350. asl
  351. tay
  352. lda jmptab,y
  353. sta jaddr
  354. lda jmptab+1,y
  355. sta jaddr+1
  356. jmp (jaddr)
  357. ;
  358. ; clear been here table
  359. ;
  360. clrbh:
  361. ldx #NUMBSCRS-1
  362. lda #0
  363. .loop: sta beenhere,x
  364. dex
  365. bpl .loop
  366. rts
  367. ;
  368. ; each screen has its own function
  369. ; the game screens are called using the jump table
  370. ; do the map screen
  371. ;
  372. domap:
  373. jsr waitbot
  374. jsr clearsc
  375. jsr setupsc
  376. setpal 0,1,BLACK ;loadpals doesn't set these, so we set them here
  377. setpal 0,2,BLUE
  378. setpal 0,3,GRAY
  379. setpal 1,1,RED+1
  380. makeheaders iconhdrs
  381. ;
  382. ; left and right ragged edges
  383. ;
  384. maketall raglr2
  385. ;
  386. ; draw in black all connecting paths that player has already taken
  387. ;
  388. ldy #NUMBPATHS-1 ;set loop counter
  389. .loop: lda pathmem,y ;if not walked on, don't draw
  390. beq .skip
  391. tya ;convert pointer from byte to word
  392. asl
  393. tax
  394. lda pathlist,x ;get data
  395. sta addrl
  396. lda pathlist+1,x
  397. sta addrh
  398. pushy
  399. jsr readhdrs ;draw the lines
  400. popy
  401. .skip: dey
  402. bpl .loop
  403. ;
  404. ;
  405. ; path buttons
  406. ;
  407. ; read path table to decide 2 or 3 paths
  408. ;
  409. lda prevsc
  410. asl
  411. asl
  412. tay
  413. lda pathtab+2,y
  414. sta path3
  415. ;
  416. ;
  417. ; switch to two-path or three-path according to sign of path3
  418. ;
  419. bmi twopaths
  420. lda #p3hdrs & $FF ;3 paths
  421. sta addrl
  422. lda #p3hdrs >> 8
  423. sta addrh
  424. lda #SCWP/3 ;set dividing lines for buttons
  425. sta redline
  426. lda #(SCWP/3)*2
  427. sta greenline
  428. jmp end3p
  429. twopaths:
  430. lda #p2hdrs & $FF ;2 paths
  431. sta addrl
  432. lda #p2hdrs >> 8
  433. sta addrh
  434. lda #SCHWP ;set dividing lines for buttons
  435. sta redline
  436. lda #SCWP
  437. sta greenline
  438. end3p:
  439. ;
  440. jsr readhdrs
  441. ;
  442. jsr doscore
  443. jsr lockbkg ;lock background
  444. ;
  445. ; setup interrupts
  446. ;
  447. jsr waitbot
  448. setijt INTZ2,intgrnd1
  449. setijt INTZ0,intgrnd2 ;blink button backgrounds
  450. jsr fadeinwait
  451. lda #0 ;set clock for blink
  452. sta clock
  453. lda #20
  454. sta timeout ;start timeout
  455. .maploop:
  456. jsr waitclear
  457. jsr docursor
  458. jsr doblink
  459. jsr setcursor
  460. lda movsta+N_CURSOR
  461. and #S_NOTHREAT ;test for cursor firing
  462. bne .maploop
  463. makesound FIRE
  464. lda movy+N_CURSOR ;fire button, check for cursor not over buttons
  465. cmp #ZONEHL-5 ;below buttons?
  466. bmi .maploop ;yes, loop
  467. cmp #(ZONEHL*3)-5 ;above buttons?
  468. bpl .maploop ;yes, loop
  469. lda movx+N_CURSOR ;on a button, read x
  470. clc
  471. adc #5 ;fudge, compensate in doblink
  472. cmp redline ;red?
  473. bmi .choosered
  474. cmp greenline ;green?
  475. bmi .choosegreen
  476. lda #CHOOSEBLUE ;blue.
  477. jmp .break
  478. .choosered:
  479. lda #CHOOSERED
  480. jmp .break
  481. .choosegreen:
  482. lda #CHOOSEGREEN
  483. .break:
  484. sta choice ;store player's choice
  485. clc ;set pal so line is drawn in button color
  486. adc #1
  487. asl
  488. asl
  489. asl
  490. asl
  491. asl
  492. sta subpal
  493. jsr clrmov ;erase cursor to make room in header list
  494. lda prevsc ;calc choice in 2d matrix of paths
  495. asl
  496. asl
  497. clc
  498. adc choice
  499. tay
  500. lda pathtab,y ;now we know the next screen
  501. sta cursc
  502. ldx pathmatrix,y ;find out which path to draw on screen
  503. lda #TRUE
  504. sta pathmem,x ;register that we're drawing this path
  505. txa ;convert byte to word
  506. asl
  507. tax
  508. lda pathlist,x ;get header data for this path
  509. sta addrl
  510. lda pathlist+1,x
  511. sta addrh
  512. jsr readhdrs2 ;draw the new lines
  513. ;
  514. lda #BLACK ;kill blink
  515. sta ground1
  516. sta fadgrnd1
  517. makesound CUCKOO
  518. ;
  519. ; timeout
  520. ;
  521. lda #ONESEC
  522. jsr waitalarm
  523. rts
  524. ;
  525. ; do blink, also the 20 sec map limit
  526. ;
  527. doblink:
  528. lda clock ;timeout 20 seconds
  529. and #%00111111
  530. bne .notyet
  531. dec timeout
  532. bne .notyet
  533. lda #ZONEHL ;time is up .. set cursor on path buttons
  534. sta movy+N_CURSOR
  535. jsr rand160 ;random x pos
  536. sec
  537. sbc #5 ;compensate for fudge in maploop
  538. sta movx+N_CURSOR
  539. lda #0 ;activate
  540. sta movsta+N_CURSOR
  541. .notyet:
  542. lda clock
  543. ror
  544. ror
  545. ror
  546. ror
  547. and #1
  548. tay
  549. lda .blinkcolors,y
  550. sta ground1
  551. sta fadgrnd1
  552. rts
  553. .blinkcolors: .dc.b BLACK,YELLOW+2
  554. ;
  555. ; do the cave screen
  556. ;
  557. docave:
  558. jsr dogtrdy
  559. maketall cavtall
  560. jsr lockbkg
  561. jsr initfrs
  562. jsr initcavet
  563. jsr initeye
  564. jsr initsnowman
  565. jsr initices
  566. jsr initbat
  567. jsr initfsts ;path enable falling stal.
  568. jsr waitbot
  569. jsr domites ;ready on fadein
  570. jsr dofsts
  571. ldx #N_CAVET
  572. jsr dotreasure
  573. makesound BATCRY
  574. jsr fadeinwait
  575. makesound BATCRY
  576. ;
  577. ; cave loop
  578. ;
  579. .caveloop:
  580. jsr waitclear
  581. jsr doeye
  582. jsr dosnowman
  583. jsr dofsts ;falling stalactites that enable path
  584. jsr dobat
  585. jsr dofrs ;do friend
  586. ldx #N_CAVET
  587. jsr dotreasure
  588. jsr doices ;do enemy
  589. jsr domites ;onlayed stalagmites
  590. jsr cpst ;cursor, points, score, threats, exit flag
  591. ldx #N_CAVET
  592. jsr checktreasure
  593. lda activefrs
  594. bne .caveloop
  595. jsr checkend ;gameover?
  596. bne .exit
  597. jsr waitclear
  598. jsr domites ;put onlays into background
  599. jsr levelcomp ;level completed
  600. lda cursc ;set previous screen
  601. sta prevsc
  602. lda #MAP ;update current screen
  603. sta cursc
  604. .exit: rts
  605. ;
  606. ; do stalagmites
  607. ;
  608. domites:
  609. setbaddr (MITE1+3) ;top half of mite 1
  610. ldpw BKGPAL,3
  611. sta palwid
  612. lda #3
  613. sta curzon
  614. lda #10
  615. sta hpos
  616. jsr mkhdr
  617. lda #2 ;bottom half
  618. sta curzon
  619. lda #(MITE1 & $FF)
  620. sta baddrl
  621. jsr mkhdr
  622. lda #(MITE2 & $FF) ;mite 2
  623. sta baddrl
  624. lda #37
  625. sta hpos
  626. jsr mkhdr
  627. lda #(MITE3 & $FF) ;mite 3
  628. sta baddrl
  629. lda #90
  630. sta hpos
  631. jsr mkhdr
  632. lda #(MITE4 & $FF) ;mite 4
  633. sta baddrl
  634. lda #118
  635. sta hpos
  636. jsr mkhdr
  637. rts
  638. ;
  639. ; do the town screen
  640. ;
  641. dotown:
  642. jsr dogtrdy
  643. ;
  644. ; make background
  645. ;
  646. maketall towtall
  647. setbaddr CHIMN1 ;chimney that sticks up over bitmap
  648. lda #1
  649. sta srcht
  650. lda #141
  651. sta vpos
  652. lda #132
  653. sta hpos
  654. ldpw 3,3 ;pal, width
  655. sta palwid
  656. jsr xvermov
  657. setbaddr CHIMN1 ;chimney over center house
  658. lda #1
  659. sta srcht
  660. lda #113
  661. sta vpos
  662. lda #94
  663. sta hpos
  664. ldpw 3,3 ;pal, width
  665. sta palwid
  666. jsr xvermov
  667. setbaddr STAR ;stars in the sky
  668. ldpw 7,1
  669. sta palwid
  670. lda #1
  671. sta srcht
  672. lda #170
  673. sta vpos
  674. lda #40
  675. sta hpos
  676. jsr xvermov
  677. setbaddr STAR ;stars in the sky
  678. lda #1
  679. sta srcht
  680. lda #160
  681. sta vpos
  682. lda #47
  683. sta hpos
  684. jsr xvermov
  685. setbaddr STAR ;stars in the sky
  686. lda #1
  687. sta srcht
  688. lda #183
  689. sta vpos
  690. lda #77
  691. sta hpos
  692. jsr xvermov
  693. setbaddr STAR ;stars in the sky
  694. lda #1
  695. sta srcht
  696. lda #189
  697. sta vpos
  698. lda #152
  699. sta hpos
  700. jsr xvermov
  701. jsr lockbkg
  702. ;
  703. ; init friends
  704. ;
  705. jsr initfrs
  706. ;
  707. ;
  708. jsr inittownt ;town treasure
  709. ;
  710. ; enemys
  711. ;
  712. jsr initeye
  713. jsr initwolf
  714. jsr initlamps
  715. jsr initghost
  716. jsr initwinds
  717. jsr initbolt
  718. jsr initwiz
  719. ;
  720. ; setup interrupts
  721. ;
  722. jsr waitbot
  723. setijt INTZ2,intgrnd1
  724. setijt INTZ0,intgrnd2
  725. ldx #N_TOWNT ;ready on fadein
  726. jsr dotreasure
  727. jsr fadeinwait
  728. ;
  729. ; town loop
  730. ;
  731. .townloop:
  732. jsr waitclear
  733. jsr doeye
  734. jsr dowinds
  735. jsr dolamps
  736. jsr dofrs
  737. ldx #N_TOWNT
  738. jsr dotreasure
  739. jsr dobolt
  740. jsr doghost
  741. jsr dowolf
  742. jsr dowiz
  743. jsr cpst ;cursor, points, score, threats, exit flag
  744. ldx #N_TOWNT
  745. jsr checktreasure
  746. lda activefrs
  747. bne .townloop
  748. jsr checkend ;gameover?
  749. bne .exit
  750. jsr waitclear
  751. jsr levelcomp
  752. lda cursc ;set previous screen
  753. sta prevsc
  754. lda #MAP ;update current screen
  755. sta cursc
  756. .exit: rts
  757. ;
  758. ; do the desert screen
  759. ;
  760. dodesert:
  761. jsr dogtrdy
  762. ;
  763. ; make background
  764. ;
  765. makeheaders desclouds
  766. maketall destall
  767. jsr lockbkg
  768. ;
  769. ; init friends
  770. ;
  771. jsr initfrs
  772. jsr initdest
  773. ;
  774. ; enemys
  775. ;
  776. jsr initscorp
  777. jsr initants
  778. jsr initeye
  779. jsr initbird
  780. jsr initsnake
  781. jsr initrabbit
  782. ;
  783. ; setup interrupts
  784. ;
  785. jsr waitbot
  786. setijt INTZ6,intgrnd1
  787. ldx #N_DEST ;ready on fadein
  788. jsr dotreasure
  789. jsr docactuses
  790. makesound BIRDCRY
  791. jsr fadeinwait
  792. makesound BIRDCRY
  793. ;
  794. ; desert loop
  795. ;
  796. .desertloop:
  797. ;
  798. ; high priority tasks
  799. ;
  800. jsr waitclear
  801. jsr dosnake
  802. jsr dorabbit
  803. jsr doscorp
  804. jsr doants
  805. jsr dofrs ;do friends
  806. ldx #N_DEST
  807. jsr dotreasure
  808. jsr dobird
  809. jsr docactuses ;onlays
  810. jsr doeye
  811. jsr cpst ;cursor, points, score, threats, exit flag
  812. ldx #N_DEST
  813. jsr checktreasure
  814. lda activefrs
  815. bne .desertloop
  816. ;
  817. jsr checkend ;gameover?
  818. bne .exit
  819. jsr waitclear
  820. jsr docactuses
  821. jsr levelcomp ;level completed
  822. lda cursc ;set previous screen
  823. sta prevsc
  824. lda #MAP ;update current screen
  825. sta cursc
  826. .exit:
  827. rts
  828. ;
  829. ; do cactuses, onlayed over desert scene
  830. ;
  831. docactuses:
  832. setbaddr CACTUS ;left
  833. lda #0
  834. sta curzon
  835. lda #11
  836. sta hpos
  837. ldpw 4,10
  838. sta palwid
  839. lda #5
  840. sta destht
  841. lda #1
  842. sta srcht
  843. lda #10
  844. sta srcw
  845. jsr tallobj
  846. lda #(CACTUS + 10) & $FF ;right one shifted down 1 zone
  847. sta baddrl
  848. lda #4
  849. sta destht
  850. lda #110
  851. sta hpos
  852. jsr tallobj
  853. rts
  854. ;
  855. ; do the jungle screen
  856. ;
  857. dojungle:
  858. jsr dogtrdy
  859. ;
  860. ; make background
  861. ;
  862. maketall juntall
  863. jsr lockbkg
  864. ;
  865. ; init friends
  866. ;
  867. jsr initfrs
  868. ;
  869. jsr initbag ;jungle treasure
  870. ;
  871. ; enemys
  872. ;
  873. jsr initchimps
  874. jsr inittoc
  875. jsr initplant
  876. jsr initeye
  877. ;
  878. ; setup interrupts
  879. ;
  880. jsr waitbot
  881. setijt INTZ9,intgrnd1
  882. setijt INTZ3,intgrnd2
  883. jsr dojunonlays ;ready on fadein
  884. ldx #N_BAG
  885. jsr dotreasure
  886. makesound TOCANCRY
  887. jsr fadeinwait
  888. makesound TOCANCRY
  889. ;
  890. ; jungle loop
  891. ;
  892. .jungleloop:
  893. ;
  894. ; high priority tasks
  895. ;
  896. jsr waitclear
  897. ldx #N_BAG
  898. jsr dotreasure
  899. jsr dofrs
  900. jsr doplant
  901. jsr dochimps
  902. jsr dotoc
  903. jsr dojunonlays ;jungle onlays
  904. jsr doeye
  905. jsr cpst ;cursor, points, score, threats
  906. ldx #N_BAG
  907. jsr checktreasure
  908. ;
  909. lda activefrs
  910. bne .jungleloop
  911. ;
  912. ; exit seq
  913. ;
  914. jsr checkend
  915. bne .exit
  916. jsr waitclear
  917. jsr dojunonlays
  918. jsr levelcomp
  919. lda cursc ;set previous screen
  920. sta prevsc
  921. lda #MAP ;update current screen
  922. sta cursc
  923. .exit: rts
  924. ;
  925. ; do jungle onlays, treetops and ground veg
  926. ;
  927. dojunonlays:
  928. setbaddr JUN3 ;rough tops of trees
  929. lda #0
  930. sta hpos
  931. lda #9
  932. sta curzon
  933. ldpw BKGPAL,SCHWB
  934. sta palwid
  935. jsr mkhdr
  936. lda #SCHWP
  937. sta hpos
  938. jsr mkhdr
  939. setbaddr JUN4 ;darkening leaves above
  940. inc curzon
  941. ldpw 4,SCHWB
  942. sta palwid
  943. jsr mkhdr
  944. lda #0
  945. sta hpos
  946. jsr mkhdr
  947. setbaddr JUN2 ;undergrowth onlay, top left half
  948. lda #1
  949. sta curzon
  950. ldpw BKGPAL,SCHWB
  951. sta palwid
  952. jsr mkhdr
  953. lda #(SCWP/4)*3 ;top fourth quarter
  954. sta hpos
  955. ldpw BKGPAL,SCWB/4
  956. sta palwid
  957. jsr mkhdr
  958. lda #(JUN2 + 10) & $FF ;top third quarter
  959. sta baddrl
  960. lda #SCHWP
  961. sta hpos
  962. jsr mkhdr
  963. setbaddr C23 ;bottom left half
  964. lda #0
  965. sta hpos
  966. dec curzon
  967. ldpw BKGPAL,SCHWB
  968. sta palwid
  969. jsr mkhdr
  970. lda #SCHWP ;bottom right half
  971. sta hpos
  972. jsr mkhdr
  973. rts
  974. ;
  975. ; do the castle screen
  976. ;
  977. docastle:
  978. jsr dogtrdy
  979. ;
  980. ; make background
  981. ;
  982. maketall castall
  983. makeheaders casclouds
  984. jsr lockbkg
  985. ;
  986. ; init friends
  987. ;
  988. jsr initfrs
  989. ;
  990. ; enemys
  991. ;
  992. jsr initarchers
  993. jsr initptera
  994. jsr initali2
  995. jsr initeye
  996. ;
  997. ; castle door
  998. ;
  999. jsr initdoor
  1000. ;
  1001. ; set interrupts
  1002. ;
  1003. setijt INTZ6,intgrnd1
  1004. jsr dodoor ;ready on fadein
  1005. jsr fadeinwait
  1006. ;
  1007. ; castle loop
  1008. ;
  1009. .castleloop:
  1010. ;
  1011. ; high priority tasks
  1012. ;
  1013. jsr waitclear
  1014. jsr doeye
  1015. jsr dodoor ;drawbridge door
  1016. jsr dofrs ;do friends
  1017. jsr dowall ;the wall the frs walk behind
  1018. jsr doarchers
  1019. jsr doptera
  1020. jsr doali2
  1021. jsr cpst ;cursor, points, score, threats, exit flag
  1022. bne .castleloop
  1023. ;
  1024. ; exit seq
  1025. ;
  1026. jsr checkend
  1027. bne .exit
  1028. jsr waitclear
  1029. jsr dodoor
  1030. jsr levelcomp
  1031. lda cursc ;set previous screen
  1032. sta prevsc
  1033. lda #MAP ;update current screen
  1034. sta cursc
  1035. .exit:
  1036. rts
  1037. ;
  1038. ; do castle wall that friends walk behind
  1039. ;
  1040. dowall:
  1041. setbaddr (CAS1 + 18 + 8)
  1042. ldpw BKGPAL,4
  1043. sta palwid
  1044. lda #18
  1045. sta srcw
  1046. lda #2
  1047. sta srcht
  1048. lda #3
  1049. sta destht
  1050. lda #2
  1051. sta curzon
  1052. lda #120
  1053. sta hpos
  1054. jsr tallobj
  1055. rts
  1056. ;
  1057. ; do the volcano screen
  1058. ;
  1059. dovolcano:
  1060. jsr dogtrdy
  1061. ;
  1062. ; background
  1063. ;
  1064. setbaddr BM_VOLCANO
  1065. jsr mkbkg
  1066. jsr lockbkg
  1067. ;
  1068. ; init movers
  1069. ;
  1070. jsr initfrs
  1071. jsr initrocks
  1072. jsr initflrocks
  1073. jsr initvolups
  1074. jsr initltng
  1075. jsr initskyflash
  1076. jsr initdiamnd
  1077. jsr initbldr
  1078. jsr initeye
  1079. jsr initlriver
  1080. setijt INTZ5,intgrnd1
  1081. ldx #N_DIAMOND ;ready on fadein
  1082. jsr dotreasure
  1083. jsr dobldr
  1084. makesound BOOM
  1085. jsr fadeinwait
  1086. makesound BOOM
  1087. .volcanoloop:
  1088. ;
  1089. ; high priority
  1090. ;
  1091. jsr waitclear
  1092. jsr doeye
  1093. jsr doskyflash
  1094. jsr doltng
  1095. jsr dovolups
  1096. jsr dolriver
  1097. jsr dobldr
  1098. ldx #N_DIAMOND
  1099. jsr dotreasure
  1100. jsr dofrs
  1101. jsr doflrocks
  1102. jsr dorocks
  1103. jsr cpst ;cursor, points, score, threats
  1104. ldx #N_DIAMOND
  1105. jsr checktreasure
  1106. lda activefrs
  1107. bne .volcanoloop
  1108. ;
  1109. ; terminate volcano screen
  1110. ;
  1111. lda #GRAY ;clear skyflash
  1112. sta sky
  1113. sta fadsky
  1114. lda #RED-1 ;clear mountain flash
  1115. sta P6C2
  1116. jsr checkend
  1117. bne .exit
  1118. jsr waitclear
  1119. jsr levelcomp
  1120. .exit: lda cursc ;set previous screen
  1121. sta prevsc
  1122. lda #MAP ;update current screen
  1123. sta cursc
  1124. rts
  1125. ;
  1126. ; sky flash
  1127. ;
  1128. initskyflash:
  1129. ldx #N_SKYFLASH
  1130. jsr randt1
  1131. lda #FALSE
  1132. sta movid+N_SKYFLASH
  1133. rts
  1134. doskyflash:
  1135. lda movid+N_SKYFLASH
  1136. beq .noton
  1137. lda #GRAY ;this should match volpal table sky color
  1138. sta fadsky
  1139. bne initskyflash ;always branch, target does rts
  1140. .noton: dec movt1+N_SKYFLASH
  1141. bne .exit
  1142. lda #WHITE ;time up .. flash the sky
  1143. sta fadsky
  1144. lda #TRUE
  1145. sta movid+N_SKYFLASH
  1146. makesound BOOM
  1147. .exit: rts
  1148. ;
  1149. ; do the bridge screen
  1150. ;
  1151. dobridge:
  1152. jsr dogtrdy
  1153. ;
  1154. ; make background
  1155. ;
  1156. setbaddr BM_BRIDGE
  1157. jsr mkbkg
  1158. ;
  1159. jsr lockbkg
  1160. ;
  1161. ; init friends
  1162. ;
  1163. jsr initfrs
  1164. ;
  1165. ; enemys
  1166. ;
  1167. jsr initfrog
  1168. jsr initfish
  1169. jsr initali
  1170. jsr initbeaver
  1171. jsr initowl
  1172. jsr initrockbri
  1173. jsr initbuzz
  1174. jsr initeye
  1175. jsr waitbot
  1176. setijt INTZ8,intgrnd1
  1177. jsr fadeinwait
  1178. ;
  1179. ; bridge loop
  1180. ;
  1181. .bridgeloop:
  1182. jsr waitclear
  1183. jsr doeye
  1184. jsr doali
  1185. jsr dofish
  1186. jsr dobeaver
  1187. jsr doowl
  1188. jsr dofrs ;do friend
  1189. jsr dorockbri
  1190. jsr dobuzz
  1191. jsr dobronlay ;bridge onlay
  1192. jsr dofrog
  1193. jsr cpst ;cursor, points, score, threats, exit flag
  1194. bne .bridgeloop
  1195. jsr checkend ;gameover?
  1196. bne .exit
  1197. jsr waitclear
  1198. jsr levelcomp
  1199. lda cursc
  1200. sta prevsc
  1201. lda #MAP ;update current screen
  1202. sta cursc
  1203. .exit: rts
  1204. ;
  1205. ; do bridge onlayed
  1206. ;
  1207. dobronlay:
  1208. setbaddr BRONLAY ;left
  1209. lda #5
  1210. sta curzon
  1211. lda #0
  1212. sta hpos
  1213. ldpw 6,SCHWB
  1214. sta palwid
  1215. lda #2
  1216. sta destht
  1217. lda #2
  1218. sta srcht
  1219. lda #SCHWB
  1220. sta srcw
  1221. jsr tallobj
  1222. lda #(BRONLAY + 20) & $FF ;right
  1223. sta baddrl
  1224. lda #SCHWP
  1225. sta hpos
  1226. jsr tallobj
  1227. rts
  1228. ;
  1229. ; do the room screen
  1230. ;
  1231. doroom:
  1232. jsr dogtrdy
  1233. ;
  1234. ; make background
  1235. ;
  1236. makeheaders roohdrs
  1237. jsr lockbkg
  1238. ;
  1239. ; init friends
  1240. ;
  1241. jsr initfrs
  1242. ;
  1243. ; enemys
  1244. ;
  1245. jsr initeye
  1246. jsr initdaggers
  1247. jsr initdrag
  1248. jsr inittrap
  1249. jsr inittorches
  1250. jsr initchest
  1251. jsr initrdface
  1252. jsr initspear1
  1253. jsr initspear2
  1254. jsr initflsh
  1255. jsr initface1
  1256. jsr initface2
  1257. ldx #N_CHEST
  1258. jsr dotreasure ;ready on fade in
  1259. jsr dotorches
  1260. makesound CREAKY
  1261. jsr fadeinwait
  1262. ;
  1263. ; room loop
  1264. ;
  1265. .roomloop:
  1266. jsr waitclear
  1267. jsr doeye
  1268. jsr dotrap ;trap door
  1269. jsr doflsh
  1270. ldx #N_CHEST
  1271. jsr dotreasure
  1272. jsr doface1
  1273. jsr doface2
  1274. jsr dordface
  1275. jsr dotorches
  1276. jsr dofrs ;friends
  1277. jsr dodaggers ;enemies
  1278. jsr dospears
  1279. jsr dodrag
  1280. jsr cpst ;cursor, points, score, threats
  1281. ldx #N_CHEST
  1282. jsr checktreasure
  1283. ;
  1284. lda activefrs
  1285. bne .roomloop
  1286. jsr checkend
  1287. bne .exit
  1288. jsr waitclear
  1289. jsr levelcomp
  1290. lda cursc ;set previous screen
  1291. sta prevsc
  1292. lda #FACE ;update current screen
  1293. sta cursc
  1294. .exit:
  1295. rts
  1296. ;
  1297. ; do the face screen
  1298. ;
  1299. doface:
  1300. jsr dobeware
  1301. jsr setupsc
  1302. ;
  1303. ; make background
  1304. ;
  1305. jsr drawface
  1306. jsr drawfloor
  1307. jsr lockbkg
  1308. ;
  1309. ; init friends
  1310. ;
  1311. jsr initfrs
  1312. ;
  1313. ; enemys
  1314. ;
  1315. jsr initeyes
  1316. jsr doeyes ;ready on fadein
  1317. makesound HAHAHA
  1318. jsr fadeinwait
  1319. ;
  1320. ; face loop
  1321. ;
  1322. .faceloop:
  1323. jsr waitclear
  1324. jsr doeyes
  1325. jsr dofrs ;do friend
  1326. jsr dofds ;face daggers
  1327. jsr cpst ;cursor, points, score, threats
  1328. ;
  1329. lda movsta+N_EYEL
  1330. and movsta+N_EYER
  1331. bmi finishquest ;target does rts
  1332. lda activefrs
  1333. bne .faceloop
  1334. jsr checkend
  1335. bne .exit
  1336. jsr waitclear
  1337. jsr doeyes
  1338. jsr levelcomp
  1339. lda #MAP ;update current screen
  1340. sta prevsc ;setting previous screen to map
  1341. sta cursc ;allows us to start from beginning again
  1342. .exit:
  1343. rts
  1344. ;
  1345. ; finish quest
  1346. ;
  1347. finishquest:
  1348. .if (EXAMINE = FALSE)
  1349. ;
  1350. ; mark any joined friends survived
  1351. ;
  1352. ldy #NUMBFRS-1
  1353. .loop1: lda frstat,y
  1354. cmp #JOINED
  1355. bne .skip
  1356. lda #SURVIVED
  1357. sta frstat,y
  1358. .skip: dey
  1359. bpl .loop1
  1360. ;
  1361. ; do skull animation
  1362. ;
  1363. jsr waitbot
  1364. jsr clearsc ;erase face
  1365. jsr drawfloor ;redraw floor
  1366. jsr lockbkg
  1367. lda #$FF ;set clock to sync dissolve
  1368. sta clock
  1369. lda #$D8
  1370. sta mesclock ;message clock
  1371. lda #2 ;set current message
  1372. sta curmes
  1373. makesound BOOM
  1374. lda #1 ;dissolve direction
  1375. sta disdir
  1376. lda #0 ;dissolve state
  1377. sta facefade
  1378. jsr setdissolve
  1379. .loop2: jsr drawdissolve
  1380. lda facefade
  1381. cmp #MAXFADE
  1382. bne .loop2
  1383. lda #ONESEC*2
  1384. sta clock
  1385. makesound BOOM
  1386. .loop3: jsr waitclear ;show only skull
  1387. jsr drawskull
  1388. jsr domessage
  1389. jsr dofrs
  1390. jsr doscore
  1391. lda clock
  1392. bne .loop3
  1393. lda #$FF ;dissolve direction
  1394. sta disdir
  1395. sta clock
  1396. .loop4: jsr drawdissolve
  1397. lda facefade
  1398. bne .loop4
  1399. ;
  1400. ; play out fr walk until no friends
  1401. ;
  1402. jsr waitclear
  1403. jsr drawface
  1404. makeheaders eyehdrs
  1405. jsr lockbkg
  1406. jsr domessage
  1407. jsr dofrs
  1408. jsr doscore
  1409. .loop5: jsr waitclear
  1410. jsr domessage
  1411. jsr dofrs
  1412. jsr doscore
  1413. lda activefrs
  1414. bne .loop5
  1415. ;
  1416. ; screen end seq
  1417. ;
  1418. lda #$25
  1419. jsr incsc
  1420. lda #$54
  1421. jsr incsc
  1422. jsr waitclear
  1423. jsr doscore
  1424. makeheaders hdrbns
  1425. makesound CLANKA
  1426. makesound CLANKB
  1427. lda #ONESEC*2
  1428. jsr waitalarm
  1429. jsr checkend
  1430. bne .exit
  1431. jsr waitclear
  1432. jsr levelcomp
  1433. lda #MAP ;update current screen
  1434. sta prevsc ;setting previous screen to map
  1435. sta cursc ;allows us to start from beginning again
  1436. .exit:
  1437. .endif
  1438. rts
  1439. ;
  1440. ; draw dissolve
  1441. ;
  1442. drawdissolve:
  1443. jsr waitclear ;dissolve from face to skull
  1444. jsr dodissolve
  1445. jsr dostagger
  1446. jsr domessage
  1447. jsr dofrs
  1448. jsr doscore
  1449. rts
  1450. ;
  1451. ; do staggered draw of face and skull
  1452. ;
  1453. dostagger:
  1454. lda clock
  1455. and #1
  1456. beq .face
  1457. ;skull:
  1458. jsr drawskull
  1459. rts
  1460. .face:
  1461. jsr drawface
  1462. rts
  1463. ;
  1464. ; do messages (you have .. try again..)
  1465. ;
  1466. domessage:
  1467. dec mesclock
  1468. bne .draw
  1469. dec curmes ;twice for words
  1470. dec curmes
  1471. bmi .exit
  1472. makesound BOOM
  1473. .draw:
  1474. ldx curmes
  1475. bmi .exit
  1476. lda mestab,x
  1477. sta addrl
  1478. lda mestab+1,x
  1479. sta addrh
  1480. jsr readhdrs
  1481. .exit:
  1482. rts
  1483. ;
  1484. ; draw face floor
  1485. ;
  1486. drawfloor:
  1487. setbaddr FFLOOR ;tiled floor
  1488. ldpw 5,12
  1489. sta palwid
  1490. lda #12
  1491. sta srcw
  1492. lda #1
  1493. sta srcht
  1494. lda #3
  1495. sta destht
  1496. lda #0
  1497. sta curzon
  1498. lda #-3 & $FF
  1499. sta hpos
  1500. jsr tallobj
  1501. lda #-3 + (48*1) ;five repititions
  1502. sta hpos
  1503. jsr tallobj
  1504. lda #-3 + (48*2)
  1505. sta hpos
  1506. jsr tallobj
  1507. lda #-3 + (48*3)
  1508. sta hpos
  1509. jsr tallobj
  1510. lda #-3 + (48*4)
  1511. sta hpos
  1512. jsr tallobj
  1513. rts
  1514. ;
  1515. ; draw face
  1516. ;
  1517. drawface:
  1518. maketall facetall
  1519. .if 0
  1520. setbaddr BM_FACE
  1521. lda #(SCWP - (22*4))/2 ;center hpos
  1522. sta hpos
  1523. ldpw 6,22
  1524. sta palwid
  1525. lda #22
  1526. sta srcw
  1527. lda #4
  1528. sta srcht
  1529. lda #8
  1530. sta destht
  1531. lda #4
  1532. sta curzon
  1533. jsr tallobj
  1534. .endif
  1535. rts
  1536. ;
  1537. ; draw skull
  1538. ;
  1539. drawskull:
  1540. maketall skulltall
  1541. .if 0
  1542. setbaddr BM_SKULL
  1543. lda #((SCWP - (17*4))/2) + 3 ;center hpos
  1544. sta hpos
  1545. ldpw 2,17
  1546. sta palwid
  1547. lda #17
  1548. sta srcw
  1549. lda #4
  1550. sta srcht
  1551. lda #8
  1552. sta destht
  1553. lda #4
  1554. sta curzon
  1555. jsr tallobj
  1556. .endif
  1557. rts
  1558. ;
  1559. ; do dissolve from face to skull
  1560. ;
  1561. dodissolve:
  1562. lda clock
  1563. and #%00001111
  1564. beq .changeit
  1565. rts
  1566. .changeit:
  1567. lda facefade
  1568. clc
  1569. adc disdir
  1570. sta facefade
  1571. setdissolve:
  1572. lda facefade
  1573. sta fadsta ;fade the face
  1574. ldx #(6*4) ;pal 6
  1575. jsr fadepal
  1576. lda #MAXFADE ;fade the skull
  1577. sec
  1578. sbc facefade
  1579. sta fadsta
  1580. ldx #(2*4) ;pal 2
  1581. jsr fadepal
  1582. lda #0 ;clear fadsta so subsequent fade will be right
  1583. sta fadsta
  1584. rts
  1585. ;
  1586. ; do "get ready" screen
  1587. ;
  1588. dogtrdy:
  1589. lda idlemode ;if idle mode, skip "get ready"
  1590. bne .skipthis
  1591. jsr clearsc
  1592. lda #BLACK
  1593. sta sky
  1594. setpal 0,1,YELLOW
  1595. jsr clrijt
  1596. makeheaders gtrdyhdr
  1597. jsr cutin
  1598. lda #ONESEC*3
  1599. jsr waitalarm
  1600. jsr cutout
  1601. .skipthis:
  1602. jsr setupsc ;altruistic act of this function to caller
  1603. rts
  1604. ;
  1605. ; do "beware" screen
  1606. ;
  1607. dobeware:
  1608. makesound DRUM
  1609. lda #TITLE ;temp setting to title screen sets pals
  1610. sta cursc
  1611. jsr setupsc
  1612. lda #BLACK
  1613. sta sky
  1614. lda #FACE
  1615. sta cursc
  1616. jsr cutin
  1617. makeheaders bewarehdrs
  1618. lda #255
  1619. jsr waitalarm
  1620. lda #102
  1621. jsr waitalarm
  1622. jsr cutout
  1623. rts
  1624. ;
  1625. ; do end.. say "the end" or "gameover"
  1626. ;
  1627. doend:
  1628. jsr comparesc ;compare hi score and current score
  1629. bcs .nonew ;if higher
  1630. jsr newhiscore ;make new high score
  1631. .nonew:
  1632. lda #TITLE
  1633. sta cursc
  1634. jsr setupsc
  1635. makesound CREAKY
  1636. makeheaders gmovrhdr
  1637. jsr titlerags
  1638. setpal 6,1,YELLOW
  1639. lda #5 ;display final score
  1640. sta curzon
  1641. lda #80
  1642. sta hpos
  1643. ldpw 6,2
  1644. sta palwid
  1645. jsr drawscore
  1646. ;
  1647. ; display high score
  1648. ;
  1649. ldy #SCRDGTS-1 ;copy current score to save buffer
  1650. .loop1: lda score,y
  1651. sta savescore,y
  1652. dey
  1653. bpl .loop1
  1654. ldy #SCRDGTS-1 ;copy hi score to score buffer
  1655. .loop2: lda hiscore,y
  1656. sta score,y
  1657. dey
  1658. bpl .loop2
  1659. lda #3 ;display hi score
  1660. sta curzon
  1661. lda #80
  1662. sta hpos
  1663. ldpw 6,2
  1664. sta palwid
  1665. jsr drawscore
  1666. ldy #SCRDGTS-1 ;copy saved current score back to score buffer
  1667. .loop3: lda savescore,y
  1668. sta score,y
  1669. dey
  1670. bpl .loop3
  1671. jsr fadeinwait
  1672. lda #128
  1673. jsr waitalarm
  1674. makesound BOOM
  1675. lda #255
  1676. jsr waitalarm
  1677. lda #255
  1678. jsr waitalarm
  1679. jsr fadeoutwait
  1680. rts
  1681. ;
  1682. ; title screen style ragged edges
  1683. ;
  1684. titlerags:
  1685. maketall raglr1
  1686. makeheaders ragudhdr
  1687. rts
  1688. ;
  1689. ; setupscreen
  1690. ; standard setup for interactive screens
  1691. ;
  1692. setupsc:
  1693. jsr clrijt
  1694. jsr clearsc
  1695. jsr clrmsta ;clear moving object status to idle
  1696. jsr loadpals
  1697. jsr screenbank
  1698. jsr initcursor
  1699. ldy cursc
  1700. lda frypostab,y
  1701. sta frypos
  1702. lda fallevels,y ;enemy fall level where they die
  1703. sta fallevel
  1704. lda frlimits,y ;set walk limit before friend survives
  1705. sta frlimit
  1706. lda #FRNOSTOP ;for waiting for path enables like drawbridge
  1707. sta frstop
  1708. lda #0 ;points display time
  1709. sta ptime
  1710. sta gottreasure
  1711. sta dropflag
  1712. rts
  1713. ;
  1714. ; do threats .. find collisions between dangerous enemies and friends.
  1715. ;
  1716. dothreats:
  1717. ;
  1718. ; check the cursor against the enemies
  1719. ;
  1720. lda movsta+N_CURSOR ;if cursor not hot, skip
  1721. and #S_NOTHREAT
  1722. bne .donecursor
  1723. ldy #N_CURSOR ;y is cursor
  1724. ldx #N_CURSOR ;right before first enemy
  1725. .loop:
  1726. inx ;first enemy
  1727. txa
  1728. cmp #MAXMOV ;done?
  1729. beq .donecursor
  1730. lda movsta,x ;chk status bits
  1731. and #S_IDLE | S_INVULNERABLE
  1732. bne .loop
  1733. jsr coldet ;collision detect
  1734. bcc .loop
  1735. jsr dodeath ;yes! cursor hit something
  1736. .donecursor:
  1737. ;
  1738. ; check friends against threats (including cursor)
  1739. ;
  1740. ldy #FRIEND1 ;fr 1
  1741. .outerloop:
  1742. lda movsta,y ;check status
  1743. and #S_IDLE | S_INVULNERABLE
  1744. bne .donefr ;if idle or invulnerable, skip
  1745. ldx #1 ;just before first enemy
  1746. .innerloop:
  1747. inx ;next enemy
  1748. txa ;
  1749. cmp #MAXMOV ;done?
  1750. beq .donefr
  1751. lda movsta,x ;active?
  1752. and #S_IDLE | S_NOTHREAT
  1753. bne .innerloop ;if idle or no threat, loop
  1754. jsr coldet ;collision detect
  1755. bcc .innerloop ;check for injured friend
  1756. jsr hurtfr
  1757. jmp .exit ;only one fr injury allowed
  1758. .donefr:
  1759. dey ;point next fr
  1760. bpl .outerloop ;loop if no overflow
  1761. .exit:
  1762. .if 0
  1763. lda movsta+N_CURSOR ;if cursor still firing, means it hit nothing
  1764. and #S_NOTHREAT ;so make fire sound
  1765. bne .nosound
  1766. makesound FIRE
  1767. .nosound:
  1768. .endif
  1769. rts
  1770. ;
  1771. ; hurt friend
  1772. ; This func called when something dangerous hits a friend
  1773. ; FR in y reg, enemy (or cursor) in x reg
  1774. hurtfr:
  1775. pushy
  1776. pushx ;leaves x in acc
  1777. cmp #N_CURSOR ;injured by player?
  1778. bne .notcursor
  1779. lda movsta,x ;null cursor threat for subsequent target
  1780. ora #S_NOTHREAT
  1781. sta movsta,x
  1782. lda gavewarning ;already warned player?
  1783. bne .alreadywr
  1784. makeheaders hdrdntsht ;give first warning
  1785. makesound FIRE ;crossbow fire sound
  1786. lda #ONESEC*2
  1787. sta timer
  1788. jsr waitalarm
  1789. lda #TRUE
  1790. sta gavewarning
  1791. jmp .exit
  1792. .alreadywr:
  1793. ;
  1794. ; friend has been shot by player and warning has already been issued
  1795. ;
  1796. lda limptab,y ;already limping?
  1797. bne .alreadylp
  1798. ldx movid,y ;fr says "ouch"
  1799. lda frouchtab,x
  1800. jsr playsound
  1801. lda #TRUE ;mark fr limping
  1802. sta limptab,y
  1803. bne .exit ;always branch
  1804. .alreadylp:
  1805. ;
  1806. ; enemy kills a friend
  1807. ;
  1808. .notcursor:
  1809. lda #S_SETINIT ;flag to reinit killer
  1810. sta movsta,x
  1811. lda #1
  1812. sta movt1,x
  1813. jsr killfr
  1814. .exit:
  1815. popx
  1816. popy
  1817. rts
  1818. ;
  1819. ; kill friend, mov in y reg
  1820. ;
  1821. killfr:
  1822. ldx movid,y ;friend cries out
  1823. lda frahtab,x
  1824. jsr playsound
  1825. lda #DIEING ;status
  1826. sta movsta,y
  1827. lda #1 ;immediate update
  1828. sta movt1,y
  1829. lda #4 ;above first frame of fire
  1830. sta movframe,y
  1831. lda #2
  1832. sta movht,y
  1833. tya ;put mov in x reg
  1834. tax
  1835. ldy #DEATHID ;special id for death flames
  1836. jsr setfrpal
  1837. rts
  1838. ;
  1839. ; do death of enemy
  1840. ; killer in y, victim in x
  1841. ;
  1842. dodeath:
  1843. lda movsta,y ;null threat of killer
  1844. ora #S_NOTHREAT
  1845. sta movsta,y
  1846. jsr startdeath
  1847. rts
  1848. ;
  1849. ; start death seq, mov in x
  1850. ;
  1851. startdeath:
  1852. lda #S_NOTHREAT | S_INVULNERABLE ;strip victim
  1853. sta movsta,x
  1854. lda movdseql,x ;start death sequence
  1855. sta movaniml,x
  1856. lda movdseqh,x
  1857. sta movanimh,x
  1858. lda #1 ;flag for immediate update
  1859. sta movt1,x
  1860. lda #JUMPALWAYS
  1861. sta movloop,x
  1862. rts
  1863. ;
  1864. ;
  1865. ;
  1866. .include "coldet.s"
  1867. ;coldet: goes here
  1868. ;
  1869. ;
  1870. ; clear moving object status .. set them all to inactive
  1871. ;
  1872. clrmsta:
  1873. ldy #MAXMOV-1
  1874. lda #S_HANG
  1875. .loop: sta movsta,y
  1876. dey
  1877. bpl .loop
  1878. rts
  1879. ;
  1880. ; screenbank
  1881. ; use cursc to lookup ROM bank, and switch
  1882. ;
  1883. screenbank:
  1884. ldy cursc
  1885. lda banktab,y
  1886. sta BANKSW
  1887. rts
  1888. ;
  1889. ; transfer pal, source in y reg, dest in x reg
  1890. ; increments regs
  1891. ;
  1892. transpal:
  1893. inx ;skip control reg shadow
  1894. lda (haddrl),y ;c1
  1895. sta palshad,x
  1896. inx
  1897. iny
  1898. lda (haddrl),y ;c2
  1899. sta palshad,x
  1900. inx
  1901. iny
  1902. lda (haddrl),y ;c3
  1903. sta palshad,x
  1904. inx
  1905. iny
  1906. rts
  1907. ;
  1908. ; load pals .. reads global cursc, looks up addr of pal data, loads
  1909. ; pal data into shadow pals
  1910. ;
  1911. loadpals:
  1912. lda cursc ;get par
  1913. asl ;point to words
  1914. tax ;index
  1915. lda SCPALTAB,x ;low byte
  1916. sta haddrl
  1917. lda SCPALTAB+1,x ;high byte
  1918. sta haddrh
  1919. ldy #0 ;source index first table byte
  1920. ldx #8 ;dest index first palshad byte of pal 2
  1921. jsr transpal ;transfer pals 2 .. 7
  1922. jsr transpal ;(pals 0 .. 1 for frs)
  1923. jsr transpal
  1924. jsr transpal
  1925. jsr transpal
  1926. jsr transpal
  1927. lda (haddrl),y ;backgrounds
  1928. sta sky
  1929. iny
  1930. lda (haddrl),y
  1931. sta ground1
  1932. iny
  1933. lda (haddrl),y
  1934. sta ground2
  1935. rts
  1936. ;
  1937. ; start of game logic subroutines
  1938. ;
  1939. ; level completed routine
  1940. ; who survived, new friends, etc
  1941. levelcomp:
  1942. ldx cursc ;register that we were here
  1943. inc beenhere,x
  1944. cpx #FACE ;if not face screen
  1945. beq .skipmessage
  1946. makeheaders hdrlvlcmp ;say "level completed"
  1947. .skipmessage:
  1948. jsr lockbkg
  1949. jsr doscore ;show score
  1950. lda #ONESEC
  1951. jsr waitalarm
  1952. jsr clrmov
  1953. makeheaders hdrsrvbns ;survival bonus window
  1954. jsr lockbkg
  1955. ; go through roster of friends to see who survived
  1956. lda #NUMBFRS ;show survivals to player
  1957. sta curfr
  1958. .loop1: dec curfr
  1959. bmi break20 ;done?
  1960. ldy curfr
  1961. lda frstat,y
  1962. cmp #SURVIVED
  1963. bne .loop1 ;not survived?
  1964. ;survived
  1965. lda #JOINED ;update his stat for next sc
  1966. sta frstat,y
  1967. ldx #0
  1968. ldy curfr
  1969. jsr setfrpal
  1970. jsr clrmov
  1971. lda #35 ;draw new icon
  1972. sta hpos
  1973. lda #32
  1974. sta vpos
  1975. ldpw 0,FRWB
  1976. sta palwid
  1977. jsr xdrawfr
  1978. lda #$14 ;add 10000 to score
  1979. jsr incsc
  1980. jsr doscore
  1981. makesound CLANKA
  1982. makesound CLANKB
  1983. lda #50
  1984. jsr waitalarm
  1985. jmp .loop1
  1986. break20: ;done with survival bonuses
  1987. ;
  1988. ; find and echo the new friend
  1989. ;
  1990. ; lookup new friend for this screen
  1991. ldx cursc
  1992. ldy newfrtab,x
  1993. ;
  1994. ; leave if no new friend for this screen
  1995. bmi skipnewfr
  1996. ; leave if this friend not potential anymore
  1997. lda frstat,y
  1998. cmp #POTENTIAL
  1999. bne skipnewfr
  2000. ; set this friend's status
  2001. lda #JOINED
  2002. sta frstat,y
  2003. sty curfr
  2004. makeheaders hdrnewfr ;new friend window
  2005. ; draw new friend
  2006. ldx #1
  2007. ldy curfr
  2008. jsr setfrpal
  2009. lda #115 ;draw icon
  2010. sta hpos
  2011. lda #32
  2012. sta vpos
  2013. ldpw 1,FRWB
  2014. sta palwid
  2015. jsr xdrawfr
  2016. makesound CLANK2A
  2017. makesound CLANK2B
  2018. skipnewfr:
  2019. lda #50
  2020. jsr waitalarm
  2021. rts
  2022. ;
  2023. ; check end of screen to see if game over
  2024. ; exit with gameover var in acc
  2025. checkend:
  2026. ;
  2027. ; see if any friends survived
  2028. ;
  2029. lda idlemode ;if idlemode, set gameover
  2030. bne .nosurvivors
  2031. ldy #NUMBFRS
  2032. .loop: dey
  2033. bmi .nosurvivors ;done?
  2034. lda frstat,y
  2035. cmp #SURVIVED
  2036. bne .loop ;not survived?
  2037. rts ;zero flag set, tested as return value
  2038. .nosurvivors:
  2039. lda #TRUE
  2040. sta gameover
  2041. rts
  2042. ;
  2043. ; draw friend
  2044. ; give it curfr, hpos, curzon
  2045. xdrawfr:
  2046. lda curfr ;fr id
  2047. tax ;get height
  2048. lda frhts,x
  2049. sta srcht
  2050. lda curfr ;get bitmap addr
  2051. asl ;times 8
  2052. asl
  2053. asl
  2054. clc
  2055. adc #6 ;get standing frame
  2056. tax
  2057. lda fftab,x
  2058. sta baddrl
  2059. lda #HER >> 8
  2060. sta baddrh
  2061. jsr xvermov
  2062. rts
  2063. ;
  2064. ; do switches
  2065. ;
  2066. dosw:
  2067. lda idlemode
  2068. beq .nofire
  2069. *
  2070. *** added by dave 5-Jul-88 ***
  2071. *
  2072. * New stuff added by Dave S. to start-up a game via gun
  2073. *
  2074. lda gun ;are we in gun mode?
  2075. beq .notgun ;br if not--just do previous stuff
  2076. lda SWCHA ;else, check gun trigger
  2077. and #$10 ;it's like a joystick "UP" switch
  2078. beq .nofire ;br if not actuated
  2079. bne .gunfire ;else, always br to start-up game
  2080. .notgun:
  2081. *
  2082. **** end of Dave S. additions *****
  2083. *
  2084. *
  2085. lda INPT4 ;if not play mode and fire button down, start play
  2086. bmi .nofire
  2087. .gunfire:
  2088. lda #FALSE
  2089. sta activefrs
  2090. sta idlemode
  2091. .nofire:
  2092. lda SWCHA ;check joystick
  2093. cmp oldjs
  2094. bne newjs
  2095. lda SWCHB ;check console
  2096. cmp oldsw
  2097. bne newcon
  2098. rts ;return if no switches changed
  2099. newjs:
  2100. sta oldjs ;save
  2101. eor #$FF
  2102. tax
  2103. and #%10000000
  2104. sta right
  2105. txa
  2106. and #%01000000
  2107. sta left
  2108. txa
  2109. and #%00010000
  2110. sta up
  2111. txa
  2112. and #%00100000
  2113. sta down
  2114. rts
  2115. newcon:
  2116. sta oldsw
  2117. lda #RESET
  2118. bit oldsw
  2119. bne noreset
  2120. jmp restart
  2121. noreset:
  2122. lda #PAUSE
  2123. bit oldsw
  2124. bne nopause
  2125. lda pauseon ;handle descent of PAUSE button
  2126. eor #$FF
  2127. sta pauseon
  2128. bne enterpause
  2129. lda #$FF ;exit pause
  2130. sta soundon
  2131. ldx #0
  2132. lda audvshadow,x
  2133. jsr setav
  2134. ldx #1
  2135. lda audvshadow,x
  2136. jsr setav
  2137. rts
  2138. enterpause:
  2139. lda #0 ;enter pause
  2140. sta soundon
  2141. sta AUDV0
  2142. sta AUDV1
  2143. rts
  2144. nopause:
  2145. lda #SELECT ;select button down?
  2146. bit oldsw
  2147. bne .noselect
  2148. .if EXAMINE
  2149. jmp doex
  2150. .endif
  2151. lda cursc
  2152. cmp #TITLE ;if not title screen, ignore select
  2153. beq .selectgun
  2154. jmp restart0
  2155. .selectgun:
  2156. lda gun ;toggle gun flag
  2157. eor #$FF
  2158. sta gun
  2159. jmp showselect ;target does rts
  2160. .noselect:
  2161. rts
  2162. ;
  2163. ; show select .. gun or stick?
  2164. ;
  2165. showselect:
  2166. lda gun
  2167. beq .stick
  2168. ;gun:
  2169. resetpal 5,2,WHITE
  2170. resetpal 5,3,BLACK
  2171. rts
  2172. .stick:
  2173. resetpal 5,3,WHITE
  2174. resetpal 5,2,BLACK
  2175. rts
  2176. ;
  2177. ; do examine (look at a video bank)
  2178. ;
  2179. .if EXAMINE
  2180. doex:
  2181. ; lda #7 ;set the bank
  2182. ; sta BANKSW
  2183. lda #0
  2184. sta xpos
  2185. sta ypos
  2186. jsr fadeoutwait
  2187. jsr clrijt
  2188. lda #BLACK
  2189. sta sky
  2190. setpal 7,1,BLUE
  2191. setpal 7,2,GRAY
  2192. setpal 7,3,WHITE
  2193. jsr clearsc
  2194. jsr fadein
  2195. .loop: jsr waitclear
  2196. jsr setex
  2197. jsr dofades
  2198. lda right
  2199. beq .notright
  2200. inc xpos
  2201. .notright:
  2202. lda left
  2203. beq .notleft
  2204. dec xpos
  2205. .notleft:
  2206. lda up
  2207. beq .notup
  2208. inc ypos
  2209. .notup:
  2210. lda down
  2211. beq .notdown
  2212. dec ypos
  2213. .notdown:
  2214. jmp .loop
  2215. ;
  2216. ; set examine
  2217. ;
  2218. setex: lda #$80
  2219. sta baddrh
  2220. lda xpos
  2221. sta baddrl
  2222. ldpw 7,31
  2223. sta palwid
  2224. lda #((160-(31*4))/2)
  2225. sta hpos
  2226. lda #4
  2227. sta curzon
  2228. lda #4
  2229. sta destht
  2230. lda #4
  2231. sta srcht
  2232. lda #31
  2233. sta srcw
  2234. jsr tallobj
  2235. rts
  2236. .endif
  2237. ;
  2238. ; inc score, only by integer times power of 10
  2239. ; input data in A reg, format: low nib: exponent, hi nib: mantissa
  2240. ; uses x and y regs
  2241. incsc:
  2242. ldy idlemode ;if idle, no score
  2243. bne .exit
  2244. pha ;save input
  2245. and #%00001111 ;mask exp
  2246. tay ;set indexes
  2247. tax
  2248. ;
  2249. ; clear leading zeroes from here to ones place
  2250. ;
  2251. .loop1:
  2252. lda score,y
  2253. cmp #LDZERO
  2254. bne .break
  2255. lda #0
  2256. sta score,y
  2257. dey
  2258. beq .break
  2259. bne .loop1
  2260. .break:
  2261. ;
  2262. ; add and carry
  2263. ;
  2264. pla ;get mantissa
  2265. lsr
  2266. lsr
  2267. lsr
  2268. lsr
  2269. .loop2: clc ;carry amount is now in acc
  2270. adc score,x
  2271. sta score,x
  2272. cmp #10
  2273. bmi .nocarry
  2274. lda #0
  2275. sta score,x
  2276. inx ;next higher digit
  2277. txa ;avoid overflow
  2278. cmp #SCRDGTS
  2279. bpl .nocarry
  2280. lda score,x ;if target is ldzero, make it #1 and rts
  2281. cmp #LDZERO
  2282. bne .notldzero
  2283. lda #1
  2284. sta score,x
  2285. .exit: rts
  2286. .notldzero:
  2287. lda #1 ;carry a 1
  2288. bne .loop2
  2289. .nocarry:
  2290. rts
  2291. ;
  2292. ; cursor, points, score, threats
  2293. ;
  2294. cpst:
  2295. jsr docursor
  2296. jsr drawpoints
  2297. jsr doscore
  2298. jsr setcursor
  2299. jsr dothreats
  2300. lda activefrs ;also set exit flag
  2301. rts
  2302. ;
  2303. ; score value table. Input: score index, Output, score value
  2304. ; this makes a blank leading zero ($F) = 0
  2305. scorevals:
  2306. .dc.b 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0
  2307. ;
  2308. ; compare score
  2309. ; return carry clear if current score greater than hi score
  2310. comparesc:
  2311. ldy #SCRDGTS-1 ;index high digit
  2312. .loop: ldx hiscore,y ;read score digit
  2313. lda scorevals,x ;load absolute digit value
  2314. ldx score,y ;read hiscore digit
  2315. cmp scorevals,x ;compare values
  2316. bne .exit ;if new score different from old hi, return
  2317. .nexty:
  2318. dey ;else loop
  2319. bpl .loop ;and return carry set (by above) if done
  2320. sec
  2321. .exit:
  2322. rts
  2323. ;
  2324. ; new high score .. copy current score to high score
  2325. ;
  2326. newhiscore:
  2327. ldy #SCRDGTS-1 ;index top digit
  2328. .loop: lda score,y
  2329. sta hiscore,y
  2330. dey
  2331. bpl .loop
  2332. rts
  2333. ;
  2334. ; do score: draw it once at bottom center of screen
  2335. ;
  2336. doscore:
  2337. lda #((SCWP-(DGTWP*SCRDGTS))/2) ;init hdr pars
  2338. sta hpos
  2339. ldpw 7,2
  2340. sta palwid
  2341. lda #0
  2342. sta curzon
  2343. jsr drawscore
  2344. rts
  2345. ;
  2346. ; draw score: put it where needed, in specified pal
  2347. ; give it hpos,palwid,curzon
  2348. ;
  2349. drawscore:
  2350. ldy #SCRDGTS-1 ;loop counter
  2351. .loop: lda score,y ;lookup baddr in table
  2352. tax
  2353. lda numadt,x
  2354. sta baddrl
  2355. lda #ZERO >> 8
  2356. sta baddrh
  2357. pushy
  2358. jsr mkhdr ;make header
  2359. popy
  2360. lda hpos ;inc hpos
  2361. clc
  2362. adc #DGTWP
  2363. sta hpos
  2364. dey ;dec loop count
  2365. bpl .loop
  2366. rts
  2367. ;
  2368. ; draw points .. where an enemy has been killed
  2369. ;
  2370. drawpoints:
  2371. lda ptime
  2372. beq .exit
  2373. dec ptime
  2374. lda paddrl ;baddrl
  2375. sta baddrl
  2376. lda #POINTS >> 8 ;baddrh
  2377. sta baddrh
  2378. lda ppalwid ;palwid
  2379. sta palwid
  2380. lda phpos ;hpos
  2381. sta hpos
  2382. lda pvpos ;vpos
  2383. sta vpos
  2384. lda #1 ;srcht
  2385. sta srcht
  2386. jsr xvermov
  2387. .exit:
  2388. rts
  2389. ;
  2390. ; init friends
  2391. ;
  2392. initfrs:
  2393. lda #0 ;init active frs count
  2394. sta activefrs
  2395. ;
  2396. ; friend0
  2397. ;
  2398. ldy #NUMBFRS ;search for friend
  2399. .fr0loop:
  2400. dey
  2401. lda frstat,y
  2402. cmp #JOINED
  2403. bne .fr0loop
  2404. pushy ;fr found! init
  2405. ldx #FRIEND0
  2406. jsr initfr
  2407. popy
  2408. lda cursc ;if face screen, only 1 fr
  2409. cmp #FACE
  2410. beq .onefr
  2411. ;
  2412. ; friend1
  2413. ;
  2414. .fr1loop:
  2415. dey ;continue search for friend
  2416. bmi .onefr
  2417. lda frstat,y
  2418. cmp #JOINED
  2419. bne .fr1loop ;not joined
  2420. ldx #FRIEND1 ;create fr 1
  2421. jsr initfr
  2422. jsr rand ;rand idle status 0 .. 8 sec
  2423. ora #%11111000
  2424. sta movsta,x
  2425. jsr randt1 ;rand start time 0 .. 4 sec
  2426. rts
  2427. ;
  2428. ; here if only fr0 active
  2429. ;
  2430. .onefr:
  2431. ldx #FRIEND1
  2432. lda #S_HANG
  2433. sta movsta,x
  2434. rts
  2435. ;
  2436. ; init friend
  2437. ; mov in X, id in Y
  2438. initfr:
  2439. lda #FALSE ;clear limp
  2440. sta limptab,x
  2441. inc activefrs
  2442. lda #WALKING ;assume stat walking
  2443. sta movsta,x
  2444. tya ;id
  2445. sta movid,x
  2446. lda #0 ;frame
  2447. sta movframe,x
  2448. lda #HER >> 8 ;baddrh
  2449. sta movfrh,x
  2450. pushy
  2451. jsr randt1 ;randomized start time
  2452. popy
  2453. lda #((-FRWP) & $FF) ;initial position
  2454. sta movx,x
  2455. lda frypos ;set his vertical pos
  2456. sta movy,x
  2457. lda #FRWB ;width
  2458. sta movw,x
  2459. lda frhts,y ;table lookup height
  2460. sta movht,x
  2461. lda #CROSSING ;use id in y
  2462. sta frstat,y
  2463. ;
  2464. ; if face screen, start fr falling
  2465. ;
  2466. lda cursc ;is this screen
  2467. cmp #FACE ;face?
  2468. bne .notface ;no, skip
  2469. lda #SCHL ;set y above screen
  2470. sta movy,x
  2471. lda #FALLHPOS ;set x onscreen
  2472. sta movx,x
  2473. lda #FALLING ;set status to falling
  2474. sta movsta,x
  2475. lda #FALLTIME ;frame time
  2476. sta movt1,x
  2477. .notface:
  2478. jsr setfrpal
  2479. rts
  2480. ;
  2481. ; set friend pal, id in y reg, mov in x reg
  2482. ;
  2483. setfrpal:
  2484. pushx
  2485. tya ;calc source pal from id
  2486. asl ;4 bytes per pal
  2487. asl
  2488. tay
  2489. txa ;calc dest pal from mov
  2490. asl ;4 bytes per pal
  2491. asl
  2492. tax
  2493. inx ;color 1
  2494. iny
  2495. lda frpaltab,y
  2496. sta palshad,x
  2497. sta PALS,x
  2498. inx ;color 2
  2499. iny
  2500. lda frpaltab,y
  2501. sta palshad,x
  2502. sta PALS,x
  2503. inx ;color 3
  2504. iny
  2505. lda frpaltab,y
  2506. sta palshad,x
  2507. sta PALS,x
  2508. popx
  2509. rts
  2510. ;
  2511. ; do friends
  2512. ;
  2513. dofrs:
  2514. ldpw 0,FRWB
  2515. sta palwid
  2516. ldx #FRIEND0 ;first friend
  2517. jsr dofr
  2518. ldpw 1,FRWB
  2519. sta palwid
  2520. ldx #FRIEND1 ;second friend
  2521. jsr dofr
  2522. ;
  2523. ; see if any fr is waiting
  2524. ;
  2525. lda #FALSE ;assume false
  2526. sta frwait
  2527. lda movx+FRIEND0
  2528. cmp frstop
  2529. bne .try1
  2530. lda movsta+FRIEND0
  2531. bpl .rettrue
  2532. .try1:
  2533. lda movx+FRIEND1
  2534. cmp frstop
  2535. bne .exit
  2536. lda movsta+FRIEND1
  2537. bmi .exit
  2538. .rettrue:
  2539. lda #TRUE
  2540. sta frwait
  2541. .exit: rts
  2542. ;
  2543. ; do one friend
  2544. ; ord of friend in x reg
  2545. ; uses y reg
  2546. ; clobbers all regs
  2547. ;
  2548. dofr: dec movt1,x ;update?
  2549. bne .frnoup
  2550. lda movsta,x ;active?
  2551. bmi .fridle
  2552. bne .notwalking ;walking?
  2553. ;
  2554. ; fr walking
  2555. ;
  2556. .walking:
  2557. lda movx,x ;see if stopped by obstacle
  2558. cmp frstop
  2559. bne .notstopped
  2560. ;
  2561. ; fr stopped
  2562. ;
  2563. lda #6 ;stopped, set standing frame
  2564. sta movframe,x
  2565. lda #13 ;reset time
  2566. sta movt1,x
  2567. lda dropflag ;drop thru trap door?
  2568. bne .startdrop ;if not dropping, draw
  2569. jmp .drawfr
  2570. .startdrop:
  2571. lda #DROPPING ;set status to ..
  2572. sta movsta,x
  2573. jmp .dropping
  2574. .notstopped:
  2575. lda movx,x ;inc, check for this friend done
  2576. clc
  2577. adc #2
  2578. sta movx,x
  2579. cmp frlimit
  2580. bne .frnocomp
  2581. lda #SURVIVED ;YES! friend completed
  2582. jsr nextfr
  2583. rts
  2584. .frnocomp:
  2585. ldy movframe,x ;limp or don't limp depends on timing table
  2586. lda limptab,x ;selected
  2587. beq .nolimp
  2588. ;limp:
  2589. lda limpwalk,y
  2590. bne .donelimp ;branch always
  2591. .nolimp:
  2592. lda okwalk,y
  2593. .donelimp:
  2594. sta movt1,x
  2595. dec movframe,x
  2596. bpl .nowrap
  2597. lda #5 ;wrap walk cycle
  2598. sta movframe,x
  2599. .nowrap:
  2600. jmp .drawfr
  2601. ;
  2602. ; fr idle
  2603. ;
  2604. .fridle:
  2605. cmp #S_HANG
  2606. beq .hung ;if not hung,
  2607. inc movsta,x ;inc inactive status
  2608. .hung:
  2609. lda #ONESEC
  2610. sta movt1,x
  2611. rts
  2612. ;
  2613. ; fr no update (just draw)
  2614. ;
  2615. .frnoup:
  2616. lda movsta,x ;abort if idle
  2617. bmi .nodraw
  2618. jmp .drawfr2
  2619. .nodraw:
  2620. rts
  2621. ;
  2622. ; not walkng .. switch on status
  2623. ;
  2624. .notwalking:
  2625. cmp #DIEING
  2626. beq .dieing
  2627. cmp #DROPPING ;in room screen, dropping thru trap door
  2628. beq .dropping
  2629. ;
  2630. ; only alternative is:
  2631. ; fr falling in face screen
  2632. ;
  2633. .falling:
  2634. lda movy,x ;move friend down one zone
  2635. sec
  2636. sbc #ZONEHL
  2637. sta movy,x
  2638. cmp frypos
  2639. beq .donefalling ;done falling?
  2640. lda #FALLTIME ;set time
  2641. sta movt1,x
  2642. jmp .drawfr
  2643. .donefalling:
  2644. lda #WALKING ;reset to walking stat
  2645. sta movsta,x
  2646. lda #0
  2647. sta movframe,x
  2648. lda #14
  2649. sta movt1,x
  2650. jmp .walking
  2651. ;
  2652. ; fr dieing in flames
  2653. ;
  2654. .dieing:
  2655. lda movframe,x ;if done dieing, nextfr
  2656. bne .contdie
  2657. lda #DEAD
  2658. jsr nextfr
  2659. rts
  2660. .contdie:
  2661. lda #14 ;reset time
  2662. sta movt1,x
  2663. dec movframe,x ;next frame
  2664. lda movframe,x ;lookup bitmap address
  2665. asl
  2666. tay
  2667. lda frdietab,y
  2668. sta movfrl,x
  2669. jmp .drawfr2 ;draw it
  2670. ;
  2671. ; fr dropping down trap door
  2672. ;
  2673. .dropping:
  2674. dec movht,x ;show only upper portion of fr
  2675. beq .donedrop ;done if no fr left
  2676. lda movfrh,x ;inc baddrh to show upper part
  2677. clc
  2678. adc #$10
  2679. sta movfrh,x
  2680. lda #6
  2681. sta movt1,x
  2682. inc movx,x
  2683. inc movx,x
  2684. jmp .drawfr2
  2685. .donedrop: ;fr has finished dropping thru trap door
  2686. lda #SURVIVED
  2687. jsr nextfr
  2688. rts
  2689. .drawfr:
  2690. ;
  2691. ; calc bitmap addr from id and frame number
  2692. ;
  2693. lda movid,x ;get guy's identity
  2694. asl
  2695. asl
  2696. asl ;shift left by number of frames per guy
  2697. clc
  2698. adc movframe,x ;add for which frame
  2699. tay
  2700. lda fftab,y ;read table
  2701. sta movfrl,x
  2702. lda #HER >> 8 ;constant page address
  2703. sta movfrh,x
  2704. ;
  2705. ; xvermov call
  2706. ;
  2707. .drawfr2:
  2708. lda movfrl,x
  2709. sta baddrl
  2710. lda movfrh,x
  2711. sta baddrh
  2712. lda movy,x
  2713. sta vpos
  2714. lda movx,x
  2715. sta hpos
  2716. lda movht,x
  2717. sta srcht
  2718. jsr xvermov
  2719. rts
  2720. ;
  2721. ; next friend .. a friend has completed, so who's next?
  2722. ; call with mov in x reg, new status in acc
  2723. ;
  2724. nextfr:
  2725. dec activefrs ;one less friend active
  2726. ldy movid,x ;put friend identity in y reg
  2727. sta frstat,y ;store new status
  2728. ;
  2729. ; look for next party member
  2730. ;
  2731. ldy #NUMBFRS-1
  2732. .loop: lda frstat,y
  2733. cmp #JOINED
  2734. beq .newfr
  2735. dey
  2736. bpl .loop
  2737. ;no more friends for this screen
  2738. ;null this mover
  2739. lda #S_HANG ;set status to inactive
  2740. sta movsta,x
  2741. lda #ONESEC
  2742. sta movt1,x
  2743. rts
  2744. .newfr:
  2745. jsr initfr
  2746. rts
  2747. ;
  2748. ; init scorpion
  2749. ;
  2750. initscorp:
  2751. ldx #N_SCORP
  2752. makeaniminit scorpinit
  2753. jsr harder
  2754. rts
  2755. ;
  2756. ; do scorpion
  2757. ;
  2758. doscorp:
  2759. ldx #N_SCORP
  2760. jsr checkreinit
  2761. beq initscorp ;target does rts
  2762. jsr doanim
  2763. rts
  2764. ;
  2765. ; init ghost
  2766. ;
  2767. initghost:
  2768. ldx #N_GHOST
  2769. makeaniminit ghostinit
  2770. jsr rand63
  2771. adc movy+N_GHOST
  2772. sta movy+N_GHOST
  2773. lda #$FF ;id controls up or down movement
  2774. sta movid+N_GHOST
  2775. jsr harder
  2776. rts
  2777. ;
  2778. ; do ghost
  2779. ;
  2780. doghost:
  2781. ldx #N_GHOST
  2782. jsr falldeath
  2783. bcs initghost ;target does rts
  2784. lda movsta+N_GHOST ;see if dead
  2785. and #S_NOTHREAT
  2786. bne .ghostok
  2787. ;ghostalive
  2788. lda movy+N_GHOST
  2789. cmp #ZONEHL*3 ;see if too low
  2790. bcs .notlow
  2791. ;low
  2792. lda #1 ;too low, start rising
  2793. sta movid+N_GHOST
  2794. .notlow:
  2795. lda clock ;change height every other field
  2796. and #1
  2797. beq .nomove
  2798. lda movid+N_GHOST
  2799. clc
  2800. adc movy+N_GHOST
  2801. sta movy+N_GHOST
  2802. .nomove:
  2803. lda movx+N_GHOST ;reinit if finished crossing
  2804. tay
  2805. cmp #-(5*4) & $FF ;offscreen to left?
  2806. bcs .ghostok
  2807. tya
  2808. cmp #SCWP+1 ;offscreen to right?
  2809. bcs initghost ;target does rts
  2810. bcc .ghostok
  2811. .ghostok:
  2812. jsr doanim ;checked ok
  2813. rts
  2814. ;
  2815. ; init bolt
  2816. ;
  2817. initbolt:
  2818. ldx #N_BOLT
  2819. makeaniminit boltinit
  2820. jsr rand63 ;random x pos
  2821. adc #(-8) & $FF
  2822. sta movx+N_BOLT
  2823. rts
  2824. dobolt:
  2825. ldx #N_BOLT ;check for reset
  2826. jsr falldeath
  2827. bcs initbolt
  2828. jsr doanim
  2829. rts
  2830. ;
  2831. ; init wolf
  2832. ;
  2833. initwolf:
  2834. ldx #N_WOLF
  2835. makeaniminit wolfinit
  2836. jsr rand140x ;set random h pos
  2837. rts
  2838. ;
  2839. ; do wolf
  2840. ;
  2841. dowolf:
  2842. ldx #N_WOLF
  2843. jsr checkreinit
  2844. beq initwolf ;initwolf performs rts
  2845. jsr doanim
  2846. rts
  2847. ;
  2848. ; init eye
  2849. ;
  2850. initeye:
  2851. ldx #N_EYE
  2852. makeaniminit eyeseqinit
  2853. rts
  2854. ;
  2855. ; do eye
  2856. ;
  2857. doeye:
  2858. ldx #N_EYE
  2859. jsr doanim
  2860. rts
  2861. ;
  2862. ; town wiz and fireball
  2863. ;
  2864. initwiz:
  2865. ldx #N_WIZ
  2866. makeaniminit wizinit
  2867. jsr harder
  2868. initfrball:
  2869. ldx #N_FRBALL
  2870. makeaniminit frballinit
  2871. rts
  2872. dowiz:
  2873. ldx #N_FRBALL
  2874. jsr falldeath
  2875. bcc .noreinit
  2876. jsr initfrball
  2877. .noreinit:
  2878. ldx #N_WIZ ;launch frball
  2879. ldy #N_FRBALL
  2880. jsr dolaunch
  2881. jsr doanim ;wiz anim
  2882. ldx #N_FRBALL ;frball anim
  2883. jsr doanim
  2884. rts
  2885. ;
  2886. ; bridge fish
  2887. ;
  2888. initfish:
  2889. ldx #N_FISH
  2890. makeaniminit fishinit
  2891. jsr rand ;put fish randomly at various pos
  2892. and #%00000011
  2893. tay
  2894. lda fishx,y
  2895. sta movx,x
  2896. lda fishy,y
  2897. sta movy,x
  2898. rts
  2899. dofish:
  2900. ldx #N_FISH
  2901. jsr checkreinit
  2902. beq initfish ;target does rts
  2903. jsr doanim
  2904. rts
  2905. ;
  2906. ; init frog
  2907. ;
  2908. initfrog:
  2909. ldx #N_FROG
  2910. makeaniminit froginit
  2911. rts
  2912. ;
  2913. ; do frog
  2914. ;
  2915. dofrog:
  2916. ldx #N_FROG
  2917. jsr checkreinit
  2918. beq initfrog ;target does rts
  2919. jsr doanim
  2920. rts
  2921. ;
  2922. ; init rock (bridge)
  2923. ;
  2924. initrockbri:
  2925. ldx #N_ROCKBRI
  2926. makeaniminit rockbriinit
  2927. jsr harder
  2928. rts
  2929. dorockbri:
  2930. ldx #N_ROCKBRI
  2931. jsr checkreinit
  2932. beq initrockbri ;target does rts
  2933. jsr doanim
  2934. rts
  2935. ;
  2936. ; init buzzard
  2937. ;
  2938. initbuzz:
  2939. ldx #N_BUZZ
  2940. makeaniminit buzzinit
  2941. jsr harder
  2942. rts
  2943. ;
  2944. ; do buzzard
  2945. ;
  2946. dobuzz:
  2947. ldx #N_BUZZ
  2948. jsr falldeath
  2949. bcs initbuzz ;target does rts
  2950. jsr doanim
  2951. rts
  2952. ;
  2953. ; init aligator
  2954. ;
  2955. initali:
  2956. ldx #N_ALI
  2957. makeaniminit aliinit
  2958. rts
  2959. ;
  2960. ; do alligator
  2961. ;
  2962. doali:
  2963. ldx #N_ALI
  2964. jsr checkreinit
  2965. beq initali ;target does rts
  2966. jsr doanim
  2967. rts
  2968. ;
  2969. ; init aligator 2 (castle)
  2970. ;
  2971. initali2:
  2972. ldx #N_ALI2
  2973. makeaniminit ali2init
  2974. rts
  2975. ;
  2976. ; do alligator 2 (castle)
  2977. ;
  2978. doali2:
  2979. ldx #N_ALI2
  2980. jsr checkreinit
  2981. beq initali2 ;target does rts
  2982. jsr doanim
  2983. rts
  2984. ;
  2985. ; init beaver
  2986. ;
  2987. initbeaver:
  2988. ldx #N_BEAVER
  2989. makeaniminit beaverinit
  2990. rts
  2991. ;
  2992. ; do beaver
  2993. ;
  2994. dobeaver:
  2995. ldx #N_BEAVER
  2996. jsr checkreinit
  2997. beq initbeaver ;target does rts
  2998. jsr doanim
  2999. rts
  3000. ;
  3001. ; init owl
  3002. ;
  3003. initowl:
  3004. ldx #N_OWL
  3005. makeaniminit owlinit
  3006. rts
  3007. ;
  3008. ; do owl
  3009. ;
  3010. doowl:
  3011. ldx #N_OWL
  3012. jsr checkreinit
  3013. beq initowl ;target does rts
  3014. jsr doanim
  3015. rts
  3016. ;
  3017. ; volcano animations
  3018. ;
  3019. ;
  3020. ; init rocks
  3021. ;
  3022. initrocks:
  3023. ldx #N_ROCK1
  3024. jsr initrock
  3025. ldx #N_ROCK2
  3026. jsr initrock
  3027. rts
  3028. ;
  3029. ; init rock
  3030. ;
  3031. initrock:
  3032. makeaniminit rockinit
  3033. jsr randxth ;set random xpos, time, harder
  3034. rts
  3035. ;
  3036. ; do rocks
  3037. ;
  3038. dorocks:
  3039. ldx #N_ROCK1
  3040. jsr dorock
  3041. ldx #N_ROCK2
  3042. jsr dorock
  3043. rts
  3044. ;
  3045. ; do rock
  3046. ;
  3047. dorock:
  3048. jsr checkreinit
  3049. beq initrock ;target does rts
  3050. jsr doanim
  3051. rts
  3052. ;
  3053. ; init flaming rocks
  3054. ;
  3055. initflrocks:
  3056. ldx #N_FLROCK1
  3057. jsr initflrock
  3058. ldx #N_FLROCK2
  3059. jsr initflrock
  3060. rts
  3061. ;
  3062. ; init flaming rock
  3063. ;
  3064. initflrock:
  3065. makeaniminit flrockinit
  3066. jsr randxth ;rand x, t1, harder
  3067. rts
  3068. ;
  3069. ; do flaming rocks
  3070. ;
  3071. doflrocks:
  3072. ldx #N_FLROCK1
  3073. jsr doflrock
  3074. ldx #N_FLROCK2
  3075. jsr doflrock
  3076. rts
  3077. ;
  3078. ; do flaming rock
  3079. ;
  3080. doflrock:
  3081. jsr checkreinit
  3082. beq initflrock ;target does rts
  3083. jsr doanim
  3084. rts
  3085. ;
  3086. ; treasure code
  3087. ;
  3088. ; cave treasure
  3089. ;
  3090. initcavet:
  3091. ldx #N_CAVET
  3092. makeaniminit ctinit
  3093. rts
  3094. ;
  3095. ; bag treasure (jungle)
  3096. ;
  3097. initbag:
  3098. ldx #N_BAG
  3099. makeaniminit baginit
  3100. rts
  3101. ;
  3102. ; desert treasure
  3103. ;
  3104. initdest:
  3105. ldx #N_DEST
  3106. makeaniminit destinit
  3107. rts
  3108. ;
  3109. ; town treasure
  3110. ;
  3111. inittownt:
  3112. ldx #N_TOWNT
  3113. makeaniminit ttinit
  3114. rts
  3115. ;
  3116. ; init chest treasure
  3117. ;
  3118. initchest:
  3119. ldx #N_CHEST
  3120. makeaniminit chestinit
  3121. rts
  3122. ;
  3123. ; init diamond treasure
  3124. ;
  3125. initdiamnd:
  3126. ldx #N_DIAMOND
  3127. makeaniminit diamndinit
  3128. rts
  3129. ;
  3130. ; generic do treasures
  3131. ;
  3132. dotreasure:
  3133. lda movsta,x ;if treasure status idle, quit
  3134. bmi .exit
  3135. lda gottreasure ;if treasure not gotten, just draw
  3136. beq .notgot
  3137. jsr startdeath
  3138. .notgot:
  3139. jsr doanim
  3140. .exit: rts
  3141. ;
  3142. ; check treasure .. returns TRUE if friend touches treasure
  3143. ; call with mov in X reg
  3144. ;
  3145. checktreasure:
  3146. lda gottreasure
  3147. bne .exitfalse
  3148. lda movsta+FRIEND0
  3149. bmi .fr0idle
  3150. ldy #FRIEND0
  3151. jsr coldet
  3152. bcs .exittrue
  3153. .fr0idle:
  3154. lda movsta+FRIEND1
  3155. bmi .exitfalse
  3156. ldy #FRIEND1
  3157. jsr coldet
  3158. bcc .exitfalse
  3159. .exittrue:
  3160. lda #TRUE
  3161. sta gottreasure
  3162. .exitfalse:
  3163. rts
  3164. ;
  3165. ; init boulder that allows friends to walk
  3166. ;
  3167. initbldr:
  3168. ldx #N_BLDR
  3169. makeaniminit bldrinit
  3170. lda #30
  3171. sta frstop
  3172. rts
  3173. ;
  3174. ; do boulder
  3175. ;
  3176. dobldr:
  3177. ldx #N_BLDR
  3178. jsr dostoptime ;if frs stopped too long, drop boulder
  3179. bcc .cont
  3180. makeanim bldrdseq2
  3181. .cont:
  3182. lda movsta + N_BLDR ;has it fallen yet?
  3183. and #S_INVULNERABLE
  3184. beq .stillup
  3185. lda #FRNOSTOP ;YES! clear friend stop
  3186. sta frstop
  3187. .stillup:
  3188. jsr doanim
  3189. rts
  3190. ;
  3191. ; init volcano up flares
  3192. ;
  3193. initvolups:
  3194. ldx N_VOLUP1
  3195. jsr initvolup
  3196. ldx N_VOLUP2
  3197. jsr initvolup
  3198. rts
  3199. initvolup:
  3200. makeaniminit volupinit
  3201. jsr rand63 ;random wait time
  3202. sta movt1,x
  3203. and #%00000111 ;rand x pos
  3204. pha
  3205. clc
  3206. adc movx,x
  3207. sta movx,x
  3208. pla
  3209. tay ;random left, right angle
  3210. lda flangles,y
  3211. sta movid,x
  3212. rts
  3213. flangles: .dc.b $FF,$FF,$FF,0,0,1,1,1
  3214. ;
  3215. ; do flares
  3216. ;
  3217. dovolups:
  3218. ldx #N_VOLUP1
  3219. jsr dovolup
  3220. ldx #N_VOLUP2
  3221. jsr dovolup
  3222. rts
  3223. dovolup:
  3224. lda movsta,x
  3225. bmi .inactive ;if active, shift in x every 4 fields
  3226. lda clock
  3227. and #%00000011
  3228. bne .noshift
  3229. lda movx,x
  3230. clc
  3231. adc movid,x
  3232. sta movx,x
  3233. .inactive:
  3234. jsr checkreinit
  3235. beq initvolup ;target does rts
  3236. .noshift:
  3237. jsr doanim
  3238. rts
  3239. ;
  3240. ; lightning
  3241. ;
  3242. initltng:
  3243. ldx #N_LTNG
  3244. makeaniminit ltnginit
  3245. jsr randt1
  3246. rts
  3247. ;
  3248. ; do lightning
  3249. ;
  3250. doltng:
  3251. ldx #N_LTNG
  3252. jsr checkreinit
  3253. beq initltng ;target does rts
  3254. jsr doanim
  3255. lda #RED-1 ;set the mountain color (match to volpal table)
  3256. sta P6C2 ;pal 6 color 2
  3257. lda movsta+N_LTNG ;read lightning status
  3258. bmi .exit
  3259. lda #WHITE ;if active turn mountains white
  3260. sta P6C2
  3261. .exit: rts
  3262. ;
  3263. ; lava river
  3264. ;
  3265. initlriver:
  3266. ldx #N_LRIVER
  3267. makeaniminit lriverinit
  3268. rts
  3269. dolriver:
  3270. ldx #N_LRIVER
  3271. jsr doanim
  3272. rts
  3273. ;
  3274. ; room daggers
  3275. ;
  3276. initdaggers:
  3277. ldx #N_DAGGER1
  3278. jsr initdagger
  3279. ldx #N_DAGGER2
  3280. jsr initdagger
  3281. ldx #N_DAGGER3
  3282. jsr initdagger
  3283. rts
  3284. initdagger:
  3285. makeaniminit daggerinit
  3286. jsr rand ;random x pos
  3287. and #%00011111
  3288. adc #10
  3289. sta movx,x
  3290. jsr randt1 ;random start time
  3291. jsr harder
  3292. rts
  3293. dodaggers:
  3294. ldx #N_DAGGER1
  3295. jsr dodagger
  3296. ldx #N_DAGGER2
  3297. jsr dodagger
  3298. ldx #N_DAGGER3
  3299. jsr dodagger
  3300. rts
  3301. dodagger:
  3302. jsr falldeath
  3303. bcs initdagger ;target does rts
  3304. jsr doanim
  3305. rts
  3306. ;
  3307. ; face daggers
  3308. ;
  3309. initfd:
  3310. txa ;read lookup table to select seq
  3311. sec
  3312. sbc #N_FD1
  3313. asl
  3314. tay
  3315. lda fdtab,y
  3316. sta animl
  3317. lda fdtab+1,y
  3318. sta animh
  3319. jsr doaniminit
  3320. rts
  3321. ;
  3322. ;
  3323. ;
  3324. dofds:
  3325. jsr rand ;randomly launch left or right
  3326. bcs .rightfirst
  3327. ;leftfirst:
  3328. ldy #N_EYEL ;to check for launch
  3329. jsr fdlaunch
  3330. ldy #N_EYER
  3331. bne .leftdone ;branch always
  3332. .rightfirst:
  3333. ldy #N_EYER
  3334. jsr fdlaunch
  3335. ldy #N_EYEL
  3336. .leftdone:
  3337. jsr fdlaunch
  3338. ldx #N_FD1 ;animate all the face daggers
  3339. .loop: pushx
  3340. jsr doanim
  3341. popx
  3342. inx
  3343. cpx #N_FD16 + 1
  3344. bmi .loop
  3345. rts
  3346. ;
  3347. ; face dagger launch .. eye in y
  3348. ;
  3349. fdlaunch:
  3350. lda movsta,y
  3351. cmp #N_FD1 ;if eye has valid fd mov
  3352. bmi .exit
  3353. cmp #N_FD16 + 1
  3354. bpl .exit
  3355. tax
  3356. lda movsta,x ;and target dag idle
  3357. bpl .exit
  3358. pushy
  3359. jsr initfd ;init it!
  3360. popy
  3361. lda #0 ;turn it on
  3362. sta movsta,x
  3363. lda #1
  3364. sta movt1,x
  3365. lda movx,y ;copy x and y
  3366. sta movx,x
  3367. lda movy,y
  3368. sta movy,x
  3369. .exit: rts
  3370. ;
  3371. ; init trap
  3372. ;
  3373. inittrap:
  3374. ldx #N_TRAP
  3375. makeaniminit trapinit
  3376. lda #SCHWP-4 ;friends will stop over trap door
  3377. sta frstop
  3378. rts
  3379. ;
  3380. ; do trap
  3381. ;
  3382. dotrap:
  3383. ldx #N_TRAP ;check for flash triggers trap
  3384. ldy #N_FLASH
  3385. jsr dotrigger
  3386. jsr doanim
  3387. lda movsta+N_TRAP ;check for trap triggers drop
  3388. bmi .trigoff
  3389. and #S_TRIGGER
  3390. beq .notrig
  3391. sta dropflag ;set flag
  3392. lda #S_INVULNERABLE | S_NOTHREAT ;clear trigger status
  3393. sta movsta+N_TRAP
  3394. .notrig:
  3395. rts
  3396. .trigoff:
  3397. lda #FALSE
  3398. sta dropflag
  3399. rts
  3400. ;
  3401. ; torches
  3402. ;
  3403. inittorches:
  3404. ldx #N_TORCH1
  3405. makeaniminit torchinit
  3406. lda #8*ZONEHL
  3407. sta movy,x
  3408. lda #13
  3409. sta movx,x
  3410. lda #14
  3411. sta movt1,x
  3412. ldx #N_TORCH2
  3413. makeaniminit torchinit
  3414. ldx #N_TORCH3
  3415. makeaniminit torchinit
  3416. lda #114
  3417. sta movx,x
  3418. lda #42
  3419. sta movt1,x
  3420. ldx #N_TORCH4
  3421. makeaniminit torchinit
  3422. lda #142
  3423. sta movx,x
  3424. lda #7
  3425. sta movt1,x
  3426. lda #8*ZONEHL
  3427. sta movy,x
  3428. rts
  3429. ;
  3430. ; do torches
  3431. ;
  3432. dotorches:
  3433. ldx #N_TORCH1
  3434. jsr doanim
  3435. ldx #N_TORCH2
  3436. jsr doanim
  3437. ldx #N_TORCH3
  3438. jsr doanim
  3439. ldx #N_TORCH4
  3440. jsr doanim
  3441. lda movsta+N_TORCH1 ;if all torches idle, darken room
  3442. and movsta+N_TORCH2
  3443. and movsta+N_TORCH3
  3444. and movsta+N_TORCH4
  3445. bpl .exit
  3446. resetpal 6,3,CYAN-5
  3447. sta sky
  3448. sta fadsky
  3449. resetpal 6,2,RED-2
  3450. .exit: rts
  3451. ;
  3452. ; init rdface
  3453. ;
  3454. initrdface:
  3455. ldx #N_RDFACE
  3456. makeaniminit rdfaceinit
  3457. rts
  3458. ;
  3459. ; do rdface
  3460. ;
  3461. dordface:
  3462. lda movsta+N_CHEST ;if chest status
  3463. bpl .notrig ;minus and not
  3464. cmp #S_HANG ;hang, trigger red face
  3465. beq .notrig
  3466. lda #S_HANG ;turn off chest
  3467. sta movsta+N_CHEST
  3468. lda #S_NOTHREAT | S_INVULNERABLE ;activate face
  3469. sta movsta+N_RDFACE
  3470. lda #1
  3471. sta movt1+N_RDFACE
  3472. .notrig:
  3473. ldx #N_RDFACE
  3474. jsr doanim
  3475. rts
  3476. ;
  3477. ; room spears
  3478. ;
  3479. initspear1:
  3480. ldx #N_SPEAR1
  3481. makeaniminit spearinit
  3482. rts
  3483. initspear2:
  3484. ldx #N_SPEAR2
  3485. makeaniminit spearinit
  3486. lda #ZONEHL*5
  3487. sta movy+N_SPEAR2
  3488. rts
  3489. dospears:
  3490. lda movsta+N_FLASH ;launch if flash and not launched
  3491. bmi .nolaunch
  3492. lda movsta+N_SPEAR1
  3493. bpl .nolaunch
  3494. lda movsta+N_SPEAR2
  3495. bpl .nolaunch
  3496. lda #0
  3497. sta movsta+N_SPEAR1
  3498. sta movsta+N_SPEAR2
  3499. lda #1
  3500. sta movt1+N_SPEAR1
  3501. lda #12
  3502. sta movt1+N_SPEAR2
  3503. .nolaunch:
  3504. ldx #N_SPEAR1
  3505. jsr doanim
  3506. ldx #N_SPEAR2
  3507. jsr doanim
  3508. ldx #N_SPEAR1
  3509. jsr checkreinit
  3510. beq initspear1
  3511. ldx #N_SPEAR2
  3512. jsr checkreinit
  3513. beq initspear2
  3514. .exit: rts
  3515. ;
  3516. ; flash on statue's staff
  3517. ;
  3518. initflsh:
  3519. ldx #N_FLASH
  3520. makeaniminit flashinit
  3521. rts
  3522. doflsh:
  3523. ldx #N_FLASH
  3524. lda movsta+N_FLASH
  3525. bpl .flshactive ;if not active
  3526. lda frwait ;and frs stopped
  3527. beq .drawflsh
  3528. lda #1 ;activate
  3529. sta movt1+N_FLASH
  3530. lda #S_NOTHREAT
  3531. sta movsta+N_FLASH
  3532. makeanim flashseq
  3533. makesound FANFAREA
  3534. makesound FANFAREB
  3535. jmp .drawflsh
  3536. .flshactive:
  3537. lda frwait ;if active and frs not stopped
  3538. beq initflsh ;reinit flash (does rts)
  3539. .drawflsh:
  3540. jsr doanim
  3541. rts
  3542. ;
  3543. ; init face1
  3544. ;
  3545. initface1:
  3546. ldx #N_FACE1
  3547. makeaniminit face1init
  3548. rts
  3549. ;
  3550. ; do face1
  3551. ;
  3552. doface1:
  3553. ldx #N_FACE1
  3554. jsr doanim
  3555. rts
  3556. ;
  3557. ; init face2
  3558. ;
  3559. initface2:
  3560. ldx #N_FACE2
  3561. makeaniminit face2init
  3562. rts
  3563. ;
  3564. ; do face2
  3565. ;
  3566. doface2:
  3567. ldx #N_FACE2
  3568. jsr doanim
  3569. rts
  3570. ;
  3571. ; init dragon (room)
  3572. ;
  3573. initdrag:
  3574. ldx #N_DRAG
  3575. makeaniminit draginit
  3576. jsr harder
  3577. jsr initroofrbl
  3578. rts
  3579. ;
  3580. ; init room fireball
  3581. ;
  3582. initroofrbl:
  3583. ldx #N_ROOFRBL
  3584. makeaniminit roofrblinit
  3585. rts
  3586. ;
  3587. ; do dragon
  3588. ;
  3589. dodrag:
  3590. ldx #N_ROOFRBL
  3591. jsr falldeath
  3592. bcc .noreinit
  3593. jsr initroofrbl ;target does rts
  3594. .noreinit:
  3595. jsr doanim
  3596. ldx #N_DRAG
  3597. jsr doanim
  3598. ldx #N_ROOFRBL
  3599. ldy #N_DRAG
  3600. jsr dotrigger
  3601. rts
  3602. ;
  3603. ; init windows
  3604. ;
  3605. initwinds:
  3606. ldx #N_WIN1
  3607. makeaniminit win1init
  3608. inx
  3609. makeaniminit win2init
  3610. inx
  3611. makeaniminit win3init
  3612. inx
  3613. makeaniminit win4init
  3614. inx
  3615. makeaniminit win5init
  3616. inx
  3617. makeaniminit win6init
  3618. rts
  3619. ;
  3620. ; do window enemies
  3621. ;
  3622. dowinds:
  3623. ldx #N_WIN1
  3624. jsr doanim
  3625. ldx #N_WIN2
  3626. jsr doanim
  3627. ldx #N_WIN3
  3628. jsr doanim
  3629. ldx #N_WIN4
  3630. jsr doanim
  3631. ldx #N_WIN5
  3632. jsr doanim
  3633. ldx #N_WIN6
  3634. jsr doanim
  3635. rts
  3636. ;
  3637. ; init street lamps
  3638. ;
  3639. initlamps:
  3640. ldx #N_LAMP1
  3641. makeaniminit lampinit
  3642. jsr rand
  3643. and #%00011111
  3644. sta movt1+N_LAMP1
  3645. inx
  3646. makeaniminit lampinit
  3647. lda #86
  3648. sta movx+N_LAMP2
  3649. jsr rand
  3650. and #%00011111
  3651. sta movt1+N_LAMP2
  3652. inx
  3653. makeaniminit lampinit
  3654. lda #116
  3655. sta movx+N_LAMP3
  3656. rts
  3657. ;
  3658. ; do street lamps
  3659. ;
  3660. dolamps:
  3661. ldx #N_LAMP1
  3662. jsr doanim
  3663. ldx #N_LAMP2
  3664. jsr doanim
  3665. ldx #N_LAMP3
  3666. jsr doanim
  3667. lda movsta+N_LAMP1 ;darken scene if all lamps idle
  3668. and movsta+N_LAMP2
  3669. and movsta+N_LAMP3
  3670. bpl .exit
  3671. resetpal 6,1,BLUE-3
  3672. sta ground1
  3673. sta fadgrnd1
  3674. resetpal 6,2,WHITE-6
  3675. sta ground2
  3676. sta fadgrnd2
  3677. resetpal 6,3,GREEN-3
  3678. .exit: rts
  3679. ;
  3680. ; init plant
  3681. ;
  3682. initplant:
  3683. ldx #N_PLANT
  3684. makeaniminit plantinit
  3685. jsr rand ;randomly choose x pos
  3686. and #%00000001
  3687. tay
  3688. lda plantxtab,y
  3689. sta movx+N_PLANT
  3690. jsr harder
  3691. rts
  3692. ;
  3693. ; do plant
  3694. ;
  3695. doplant:
  3696. ldx #N_PLANT
  3697. jsr checkreinit
  3698. beq initplant ;target does rts
  3699. jsr doanim
  3700. rts
  3701. ;
  3702. ; init chains holding up drawbridge
  3703. ;
  3704. initchains:
  3705. ldx #N_CHAIN1
  3706. makeaniminit chain1init
  3707. ldx #N_CHAIN2
  3708. makeaniminit chain2init
  3709. rts
  3710. ;
  3711. ; do chains holding up drawbridge
  3712. ;
  3713. dochains:
  3714. jsr dostoptime ;if frs stopped too long, force chains
  3715. bcc .cont
  3716. ldx #N_CHAIN1
  3717. makeanim chaindseq
  3718. ldx #N_CHAIN2
  3719. makeanim chaindseq
  3720. .cont:
  3721. ldx #N_CHAIN1
  3722. jsr doanim
  3723. ldx #N_CHAIN2
  3724. jsr doanim
  3725. rts
  3726. ;
  3727. ; init door
  3728. ;
  3729. initdoor:
  3730. lda #FALSE
  3731. sta doordown
  3732. jsr initchains
  3733. lda #1
  3734. sta movt1+N_DOOR
  3735. lda #4
  3736. sta movframe+N_DOOR
  3737. lda #S_HANG
  3738. sta movsta+N_DOOR ;inactivate
  3739. lda #60
  3740. sta frstop ;stop friends
  3741. rts
  3742. ;
  3743. ; do drawbridge door
  3744. ;
  3745. dodoor:
  3746. jsr dochains
  3747. lda movsta+N_CHAIN1 ;if chains exist, just draw
  3748. and movsta+N_CHAIN2
  3749. bpl .drawdoor
  3750. lda movframe+N_DOOR ;if on frame 0, just draw
  3751. beq .drawdoor
  3752. dec movt1+N_DOOR ;if time not up, just draw
  3753. bne .drawdoor
  3754. lda #12 ;reset time, inc frame
  3755. sta movt1+N_DOOR
  3756. dec movframe+N_DOOR
  3757. bne .drawdoor ;if frame zero, let friends walk
  3758. lda #FRNOSTOP
  3759. sta frstop
  3760. .drawdoor:
  3761. lda #1
  3762. sta curzon
  3763. sta srcht
  3764. lda movframe+N_DOOR
  3765. asl
  3766. tay
  3767. lda .doorjtab,y
  3768. sta jaddr
  3769. lda .doorjtab+1,y
  3770. sta jaddr+1
  3771. jmp (jaddr)
  3772. .doorjtab: .dc.w .jdoor9,.jdoor7,.jdoor4,.jdoor2,.jdoor1
  3773. .jdoor1:
  3774. setbaddr DOOR1 ;closed
  3775. ldpw 4,7
  3776. sta palwid
  3777. lda #7
  3778. sta srcw
  3779. lda #5
  3780. sta destht
  3781. lda #91
  3782. sta hpos
  3783. bne .readydoor
  3784. .jdoor2:
  3785. setbaddr DOOR2
  3786. ldpw 4,10
  3787. sta palwid
  3788. lda #10
  3789. sta srcw
  3790. lda #4
  3791. sta destht
  3792. lda #83
  3793. sta hpos
  3794. bne .readydoor
  3795. .jdoor4:
  3796. setbaddr DOOR4
  3797. ldpw 4,10
  3798. sta palwid
  3799. lda #10
  3800. sta srcw
  3801. lda #3
  3802. sta destht
  3803. lda #81
  3804. sta hpos
  3805. bne .readydoor
  3806. .jdoor7:
  3807. setbaddr DOOR7
  3808. ldpw 4,12
  3809. sta palwid
  3810. lda #12
  3811. sta srcw
  3812. lda #2
  3813. sta destht
  3814. lda #73
  3815. sta hpos
  3816. bne .readydoor
  3817. .jdoor9:
  3818. lda doordown
  3819. bne .notdown
  3820. makesound BOOM
  3821. lda #TRUE
  3822. sta doordown
  3823. .notdown:
  3824. setbaddr DOOR9 ;open
  3825. ldpw 4,12
  3826. sta palwid
  3827. lda #12
  3828. sta srcw
  3829. lda #2
  3830. sta destht
  3831. lda #73
  3832. sta hpos
  3833. .readydoor:
  3834. jsr tallobj
  3835. rts
  3836. ;
  3837. ; archers amd arrows
  3838. ;
  3839. initarchers:
  3840. lda #N_ARCHERS
  3841. sta curarcher
  3842. lda #N_ARROWS
  3843. sta curarrow
  3844. .loop: jsr initarcher
  3845. jsr initarrow
  3846. inc curarcher
  3847. inc curarrow
  3848. lda curarcher
  3849. cmp #N_ARCHERS + MAXARCHERS
  3850. bne .loop
  3851. rts
  3852. ;
  3853. ;
  3854. ;
  3855. initarcher:
  3856. ldx curarcher
  3857. makeaniminit archerinit
  3858. txa ;table lookup vhpos
  3859. sec
  3860. sbc #N_ARCHERS
  3861. tay
  3862. lda archersy,y ;vpos
  3863. sta movy,x
  3864. lda archersx,y ;hpos
  3865. sta movx,x
  3866. jsr randt1 ;random start time
  3867. ora #%11110000
  3868. sta movsta,x
  3869. jsr harder
  3870. rts
  3871. ;
  3872. ;
  3873. ;
  3874. initarrow:
  3875. ldx curarrow
  3876. makeaniminit arrowinit
  3877. jsr rand ;randomly choose arrow angle
  3878. and #%00000010
  3879. tay
  3880. lda arrowseqtab,y
  3881. sta movaniml,x
  3882. lda arrowseqtab+1,y
  3883. sta movanimh,x
  3884. rts
  3885. ;
  3886. ; do archers and arrows
  3887. ;
  3888. doarchers:
  3889. lda #N_ARCHERS
  3890. sta curarcher
  3891. lda #N_ARROWS
  3892. sta curarrow
  3893. .loop: jsr doarcher
  3894. jsr doarrow
  3895. inc curarcher
  3896. inc curarrow
  3897. lda curarcher
  3898. cmp #N_ARCHERS + MAXARCHERS
  3899. bne .loop
  3900. rts
  3901. ;
  3902. ;
  3903. ;
  3904. doarcher:
  3905. tax
  3906. jsr checkreinit
  3907. beq initarcher ;target does rts
  3908. jsr doanim
  3909. rts
  3910. ;
  3911. ;
  3912. ;
  3913. doarrow:
  3914. ldx curarrow ;if special reinit code (-1)
  3915. lda movsta,x
  3916. cmp #$FF
  3917. beq initarrow ;target does rts
  3918. ldx curarcher ;check for launching
  3919. ldy curarrow
  3920. jsr dolaunch
  3921. ldx curarrow ;animate
  3922. jsr doanim
  3923. ldx curarrow ;if active and
  3924. lda movsta,x
  3925. bmi .exit
  3926. lda movy,x ;below ground, reinit
  3927. cmp #32
  3928. bcc initarrow ;target does rts
  3929. .exit: rts
  3930. ;
  3931. ; falldeath
  3932. ; mov in x, carry set if enemy fallen below fall level, or
  3933. ; if hung
  3934. ;
  3935. falldeath:
  3936. lda movsta,x ;hung?
  3937. cmp #S_READINIT
  3938. beq .rettrue
  3939. lda movsta,x ;idle?
  3940. bmi .retfalse
  3941. lda fallevel ;below fall level?
  3942. cmp movy,x
  3943. rts
  3944. .retfalse:
  3945. clc
  3946. rts
  3947. .rettrue:
  3948. sec
  3949. rts
  3950. ;
  3951. ; check reinit rts false (equal) if status = readinit
  3952. ;
  3953. checkreinit:
  3954. lda movsta,x
  3955. cmp #S_READINIT
  3956. rts
  3957. ;
  3958. ; do launch..launcher in x, launchee in y
  3959. ; if stat of x is launch, sets x and y of launchee and launches
  3960. dolaunch:
  3961. lda movsta,x ;time to launch?
  3962. cmp #S_LAUNCH
  3963. bne .exit
  3964. lda #0 ;YES, clear launch status
  3965. sta movsta,x
  3966. lda movx,x ;copy coords
  3967. sta movx,y
  3968. lda movy,x
  3969. sta movy,y
  3970. lda #1 ;time to activate
  3971. sta movt1,y
  3972. lda #0 ;activated launchee
  3973. sta movsta,y
  3974. .exit: rts
  3975. ;
  3976. ; init ptera
  3977. ;
  3978. initptera:
  3979. ldx #N_PTERA
  3980. makeaniminit pterainit
  3981. jsr harder
  3982. rts
  3983. ;
  3984. ; do ptera
  3985. ;
  3986. doptera:
  3987. ldx #N_PTERA
  3988. jsr falldeath
  3989. bcs initptera ;target does rts
  3990. jsr doanim
  3991. rts
  3992. ;
  3993. ; init tocan
  3994. ;
  3995. inittoc:
  3996. ldx #N_TOC1
  3997. makeaniminit toc1init
  3998. rts
  3999. ;
  4000. ; do tocan (the one standing alone)
  4001. ;
  4002. dotoc:
  4003. ldx #N_TOC1
  4004. jsr doanim
  4005. rts
  4006. ;
  4007. ; init dependent animations
  4008. ;
  4009. initcoco:
  4010. ldx #N_COCO
  4011. makeaniminit cocoinit
  4012. rts
  4013. inittoc2:
  4014. ldx #N_TOC2
  4015. makeaniminit toc2init
  4016. rts
  4017. ;
  4018. ; init chimps
  4019. ;
  4020. initchimps:
  4021. ldx #N_CHIMP1
  4022. jsr initchimp1
  4023. ldx #N_CHIMP2 ;coconut chimp
  4024. jsr initchimp2
  4025. ldx #N_CHIMP3 ;tocan chimp
  4026. jsr initchimp3
  4027. jsr inittoc2 ;dependent animations
  4028. jsr initcoco
  4029. rts
  4030. ;
  4031. ; reinit chimp 1
  4032. ;
  4033. initchimp1:
  4034. jsr stdchimp
  4035. makeanim chimp1seq
  4036. rts
  4037. ;
  4038. ; reinit chimp 2 (coconut thrower)
  4039. ;
  4040. initchimp2:
  4041. jsr stdchimp
  4042. makeanim chimp2seq
  4043. rts
  4044. ;
  4045. ; reinit chimp 3 (tocan thrower)
  4046. ;
  4047. initchimp3:
  4048. jsr stdchimp
  4049. makeanim chimp3seq
  4050. rts
  4051. ;
  4052. ; do chimps
  4053. ;
  4054. dochimps:
  4055. ldx #N_CHIMP1
  4056. jsr junreinit
  4057. bcc .skipinit1
  4058. jsr initchimp1
  4059. .skipinit1:
  4060. jsr doanim
  4061. ldx #N_CHIMP2 ;do coconut throwing chimp 2
  4062. jsr junreinit
  4063. bcc .skipinit2
  4064. jsr initchimp2
  4065. .skipinit2:
  4066. jsr doanim
  4067. ldx #N_CHIMP2
  4068. ldy #N_COCO
  4069. jsr dolaunch
  4070. ldx #N_COCO
  4071. jsr junreinit
  4072. bcc .skipinit3
  4073. jsr initcoco
  4074. .skipinit3:
  4075. jsr doanim
  4076. ldx #N_CHIMP3 ;chimp 3, who throws the tocan
  4077. jsr junreinit
  4078. bcc .skipinit4
  4079. jsr initchimp3
  4080. .skipinit4:
  4081. jsr doanim
  4082. ldx #N_CHIMP3 ;launch and do victum tocan
  4083. ldy #N_TOC2
  4084. jsr dolaunch
  4085. ldx #N_TOC2
  4086. jsr junreinit
  4087. bcc .skipinit5
  4088. jsr inittoc2
  4089. .skipinit5:
  4090. jsr doanim
  4091. ;
  4092. ; if toc2 shot while chimp3 dependent, redirect chimp3
  4093. ;
  4094. lda movsta+N_CHIMP3
  4095. cmp #S_DEPENDENT
  4096. bne .norechimp
  4097. lda movsta+N_TOC2
  4098. cmp #S_NOTHREAT | S_INVULNERABLE ;dieing status
  4099. bne .norechimp
  4100. ldx #N_CHIMP3
  4101. makeanim chimp3climb
  4102. lda #S_NOTHREAT
  4103. sta movsta+N_CHIMP3
  4104. .norechimp:
  4105. ;
  4106. ; if chimp3 shot while toc2 dependent, redirect toc2
  4107. ;
  4108. lda movsta+N_TOC2
  4109. cmp #S_DEPENDENT
  4110. bne .noretoc
  4111. lda movsta+N_CHIMP3
  4112. cmp #S_NOTHREAT | S_INVULNERABLE ;dieing status
  4113. bne .noretoc
  4114. ldx #N_TOC2
  4115. makeanim tocescapeseq
  4116. lda #S_NOTHREAT
  4117. sta movsta+N_TOC2
  4118. .noretoc:
  4119. rts
  4120. ;
  4121. ; jungle reinit, give mov in x reg
  4122. ; returns carry set if status=reinit or fallen below screen
  4123. ;
  4124. junreinit:
  4125. lda movsta,x
  4126. cmp #S_READINIT
  4127. beq .rettrue
  4128. lda movy,x
  4129. clc
  4130. adc #ZONEHL
  4131. rts
  4132. .rettrue:
  4133. sec
  4134. rts
  4135. ;
  4136. ; standard chimp init
  4137. ; call with mov in x reg, sets movx, and movid to vine ord,
  4138. ; y, randomized idle sta
  4139. ;
  4140. stdchimp:
  4141. makeaniminit chimpinit
  4142. lda #$FF ;invalidate this guy's id
  4143. sta movid,x
  4144. .loop:
  4145. jsr rand ;select a random vine
  4146. and #%00000111
  4147. cmp movid+N_CHIMP1 ;repeat until unreserved vine found
  4148. beq .loop
  4149. cmp movid+N_CHIMP2
  4150. beq .loop
  4151. cmp movid+N_CHIMP3
  4152. beq .loop
  4153. sta movid,x ;set id to ord of vine
  4154. tay
  4155. lda chimpvines,y ;table lookup x value
  4156. sta movx,x
  4157. jsr randt1 ;random wait time
  4158. jsr harder
  4159. rts
  4160. ;
  4161. ; init snowman
  4162. ;
  4163. initsnowman:
  4164. ldx #N_SNOWMAN
  4165. makeaniminit snoinit
  4166. jsr rand
  4167. and #%1
  4168. tay
  4169. lda snoxtab,y
  4170. sta movx+N_SNOWMAN
  4171. rts
  4172. ;
  4173. ; do snowman
  4174. ;
  4175. dosnowman:
  4176. ldx #N_SNOWMAN
  4177. jsr checkreinit
  4178. beq initsnowman ;target does rts
  4179. jsr doanim
  4180. rts
  4181. ;
  4182. ; init bat
  4183. ;
  4184. initbat:
  4185. ldx #N_BAT
  4186. makeaniminit BATINIT
  4187. jsr rand63 ;random x pos
  4188. adc #20
  4189. sta movx,x
  4190. jsr harder
  4191. rts
  4192. dobat:
  4193. ldx #N_BAT ;check reinit
  4194. jsr falldeath
  4195. bcs initbat ;target does rts
  4196. lda movx+N_BAT ;reinit if offscreen to right
  4197. cmp #SCWP
  4198. bcs initbat ;target does rts
  4199. jsr doanim
  4200. rts
  4201. ;
  4202. ; init ices
  4203. ;
  4204. initices:
  4205. ldx #ICE + MAXICE
  4206. .loop: dex
  4207. jsr initice
  4208. txa
  4209. cmp #ICE
  4210. bne .loop
  4211. rts
  4212. ;
  4213. ; init ice
  4214. ;
  4215. initice:
  4216. makeaniminit iceinit
  4217. jsr rand ;random idle status
  4218. ora #%11111100
  4219. sta movsta,x
  4220. jsr randxth ;rand x, t1, harder
  4221. rts
  4222. ;
  4223. ; doices
  4224. ;
  4225. doices: ldx #ICE ;first ice
  4226. .loop: pushx
  4227. jsr doice
  4228. popx
  4229. inx
  4230. txa
  4231. cmp #(ICE+MAXICE) ;done with all ices?
  4232. bne .loop
  4233. rts
  4234. ;
  4235. ; do ice
  4236. ;
  4237. doice:
  4238. jsr checkreinit
  4239. beq initice ;initice performs rts
  4240. jsr doanim
  4241. rts
  4242. ;
  4243. ; init falling stalactites that enable path
  4244. ;
  4245. initfsts:
  4246. ldx #N_FST1 ;init them
  4247. makeaniminit fstinit
  4248. ldx #N_FST2
  4249. makeaniminit fstinit
  4250. lda #144 ;move 2nd one to proper x
  4251. sta movx+N_FST2
  4252. lda #35 ;scramble time
  4253. sta movt1+N_FST2
  4254. lda #%00000001 ;set bit pattern of ids to mark fall sta
  4255. sta movid+N_FST1
  4256. lda #%00000010
  4257. sta movid+N_FST2
  4258. lda #0 ;clear fall status bits
  4259. sta fallsta
  4260. lda #CAVESTOP1 ;set fr stop
  4261. sta frstop
  4262. rts
  4263. ;
  4264. ; do falling stalactites
  4265. ;
  4266. dofsts:
  4267. ldx #N_FST1
  4268. jsr dofst
  4269. ldx #N_FST2
  4270. jsr dofst
  4271. rts
  4272. ;
  4273. ;
  4274. ;
  4275. dofst:
  4276. lda movsta,x ;if status
  4277. and #S_INVULNERABLE ;invulnerable bit
  4278. bne .nodrop ;high, don't try to auto-drop it
  4279. jsr dostoptime ;is fr idly waiting for stag to fall?
  4280. bcc .nodrop ;no, skip
  4281. makeanim fstdseq ;yes, start death seq
  4282. jmp .readydraw ;and draw
  4283. .nodrop:
  4284. lda movsta,x ;quiescent?
  4285. and #S_QUIET
  4286. bne .readydraw
  4287. lda movy,x ;see if hit ground
  4288. cmp #8
  4289. bcs .readydraw
  4290. makeanim fstqseq ;YES! just hit ground
  4291. makesound BOOM
  4292. lda #S_NOTHREAT | S_INVULNERABLE | S_QUIET
  4293. sta movsta,x
  4294. lda #8 ;lock y level
  4295. sta movy,x
  4296. lda movid,x ;register fall status
  4297. ora fallsta
  4298. sta fallsta
  4299. tay ;lookup new stop point
  4300. lda cavestoptab,y
  4301. sta frstop
  4302. .readydraw:
  4303. jsr doanim
  4304. rts
  4305. ;
  4306. ; do stop time .. return carry set if frs are waiting too long
  4307. ;
  4308. dostoptime:
  4309. lda frwait
  4310. beq .nostop
  4311. lda clock
  4312. bne .retfalse
  4313. dec clock ;move clock past trigger point
  4314. dec stoptime ;1 stop time click
  4315. bne .retfalse
  4316. ;rettrue:
  4317. lda #4 ;reset stop time to avoid redundant signals
  4318. sta stoptime
  4319. sec
  4320. rts
  4321. .nostop: ;if no frs stopped, keep time at 4*4 (12 .. 16 secs)
  4322. lda #4
  4323. sta stoptime
  4324. .retfalse:
  4325. clc
  4326. rts
  4327. ;
  4328. ; init ants
  4329. ;
  4330. initants: ldx #ANTS + MAXANTS
  4331. .loop1: dex
  4332. jsr initant
  4333. txa
  4334. cmp #ANTS
  4335. bne .loop1
  4336. rts
  4337. ;
  4338. ; Input: ant number in x reg
  4339. ;
  4340. antytab: .dc.b 5,59
  4341. initant:
  4342. jsr rand ;randomly decide if right or left ant
  4343. bcs .doleft
  4344. makeaniminit antrinit
  4345. jmp .finishant
  4346. .doleft:
  4347. makeaniminit antlinit
  4348. .finishant:
  4349. lda #0 ;make ant go neither up nor down
  4350. sta movid,x
  4351. jsr rand ;randomly choose y pos
  4352. and #%1
  4353. tay
  4354. lda antytab,y
  4355. sta movy,x
  4356. jsr rand ;randomize idle time
  4357. ora #%11100000 ;make from -1 .. -31
  4358. sta movsta,x
  4359. jsr harder
  4360. rts
  4361. ;
  4362. ; do ants
  4363. ;
  4364. doants:
  4365. ldx #ANTS ;first ice
  4366. .loop:
  4367. jsr doant
  4368. inx
  4369. txa
  4370. cmp #(ANTS+MAXANTS) ;done with all ices?
  4371. bne .loop
  4372. rts
  4373. ;
  4374. ; do one ant
  4375. ; ord of ant in X reg
  4376. doant:
  4377. pushx
  4378. jsr doanim
  4379. popx
  4380. jsr checkreinit
  4381. beq initant ;target does rts
  4382. lda movsta,x ;if idle, forget the rest
  4383. bpl .notidle
  4384. rts
  4385. .notidle:
  4386. lda movx,x ;reinit if crawled offscreen
  4387. clc
  4388. adc #8 ;check partly off on left
  4389. bcs .notoff
  4390. adc #(256-SCWP-8)
  4391. bcs initant ;target does rts
  4392. .notoff:
  4393. lda movy,x ;a threat only if near friend's height
  4394. cmp #28
  4395. bcc .nothreat
  4396. cmp #36
  4397. bcs .nothreat
  4398. lda #0 ;set status threatening
  4399. beq .yesthreat ;cheat .. branch always
  4400. .nothreat:
  4401. lda #S_NOTHREAT
  4402. .yesthreat:
  4403. sta movsta,x
  4404. lda clock ;every so often, change the rise and fall
  4405. and #%01111111
  4406. bne .nochange
  4407. jsr rand
  4408. bcs .nochange
  4409. and #%00000111
  4410. tay
  4411. lda antupdown,y
  4412. sta movid,x
  4413. .nochange:
  4414. lda clock ;move it up or down
  4415. and #%00000111
  4416. bne .skip
  4417. lda movid,x
  4418. clc
  4419. adc movy,x
  4420. sta movy,x
  4421. .skip:
  4422. lda movy,x ;see if its too high
  4423. cmp #64
  4424. bmi .nottoohigh
  4425. lda #64
  4426. sta movy,x
  4427. .nottoohigh:
  4428. lda movy,x ;see if its too low
  4429. bpl .nottoolow
  4430. lda #0
  4431. sta movy,x
  4432. .nottoolow:
  4433. lda movy,x ;if at friend's level, stop rise or fall
  4434. cmp #32
  4435. bne .nolevel
  4436. lda #0
  4437. sta movid,x
  4438. .nolevel:
  4439. rts
  4440. ;
  4441. ; init bird (desert)
  4442. ;
  4443. initbird:
  4444. ldx #N_BIRD
  4445. makeaniminit birdinit
  4446. lda #0 ;y delta
  4447. sta movid+N_BIRD
  4448. lda #$FF ;time till descent
  4449. sta timer
  4450. jsr rand ;random x pos
  4451. and #%00001111
  4452. adc #20
  4453. sta movx,x
  4454. jsr harder
  4455. rts
  4456. dobird:
  4457. ldx #N_BIRD ;check reinit
  4458. jsr falldeath
  4459. bcs initbird ;target does rts
  4460. lda movsta+N_BIRD ;control descent
  4461. bmi .nodrop
  4462. lda timer
  4463. bne .nodrop
  4464. jsr rand
  4465. bcs .nodrop
  4466. lda #-1 & $FF
  4467. sta movid+N_BIRD
  4468. .nodrop:
  4469. lda movy+N_BIRD ;stop descent if too low
  4470. cmp #4*ZONEHL
  4471. bcs .nostopdrop
  4472. lda #0
  4473. sta movid+N_BIRD
  4474. .nostopdrop:
  4475. lda movx+N_BIRD ;reinit if offscreen to right
  4476. clc
  4477. adc #(256 - SCWP)
  4478. bcs initbird ;target does rts
  4479. jsr doanim
  4480. lda movy+N_BIRD ;add delta to y
  4481. clc
  4482. adc movid+N_BIRD
  4483. sta movy+N_BIRD
  4484. rts
  4485. ;
  4486. ; init snake
  4487. ;
  4488. initsnake:
  4489. ldx #N_SNAKE
  4490. makeaniminit snakeinit
  4491. jsr rand63 ;rand x and y pos
  4492. adc #(160 - 64 - 8)/2
  4493. sta movx,x
  4494. jsr rand ;rand y pos (only on zone)
  4495. and #%00010000
  4496. clc
  4497. adc #3*ZONEHL
  4498. sta movy,x
  4499. rts
  4500. ;
  4501. ; do snake (desert)
  4502. ;
  4503. dosnake:
  4504. ldx #N_SNAKE
  4505. jsr checkreinit
  4506. beq initsnake ;target does rts
  4507. jsr doanim
  4508. rts
  4509. ;
  4510. ; init rabbit
  4511. ;
  4512. initrabbit:
  4513. ldx #N_RABBIT
  4514. makeaniminit rabbitinit
  4515. rts
  4516. ;
  4517. ; do rabbit (desert)
  4518. ;
  4519. dorabbit:
  4520. ldx #N_RABBIT
  4521. jsr checkreinit
  4522. beq initrabbit ;target does rts
  4523. lda movx+N_RABBIT
  4524. clc ;reinit of offscreen to right
  4525. adc #20 ;slightly left of screen is ok
  4526. bcs .notoff
  4527. lda movx+N_RABBIT
  4528. adc #(256 - SCWP)
  4529. bcs initrabbit ;target does rts
  4530. .notoff:
  4531. jsr doanim
  4532. rts
  4533. ;
  4534. ; face screen animations
  4535. ;
  4536. initeyes:
  4537. lda #FALSE
  4538. sta eyesred
  4539. sta frtarget
  4540. ldx #N_EYEL
  4541. makeaniminit wteyelinit
  4542. ldx #N_EYER
  4543. makeaniminit wteyerinit
  4544. rts
  4545. ;
  4546. initrdeyes:
  4547. lda #%10000000 | S_NOTHREAT ;if idle or no threat
  4548. bit movsta+N_EYEL
  4549. bne .next ;don't reint
  4550. ldx #N_EYEL
  4551. makeaniminit rdeyelinit ;init
  4552. .next: lda #%10000000 | S_NOTHREAT ;ditto
  4553. bit movsta+N_EYER
  4554. bne .exit
  4555. ldx #N_EYER
  4556. makeaniminit rdeyerinit ;init
  4557. .exit:
  4558. lda #TRUE
  4559. sta eyesred
  4560. makesound DIEA
  4561. makesound DIEB
  4562. rts
  4563. ;
  4564. initwteyes:
  4565. lda #%10000000 | S_NOTHREAT ;if idle or no threat
  4566. bit movsta+N_EYEL
  4567. bne .next
  4568. ldx #N_EYEL
  4569. makeaniminit wteyelinit ;init
  4570. .next: lda #%10000000 | S_NOTHREAT ;ditto
  4571. bit movsta+N_EYER
  4572. bne .exit
  4573. ldx #N_EYER
  4574. makeaniminit wteyerinit ;init
  4575. .exit: lda #FALSE
  4576. sta eyesred
  4577. rts
  4578. ;
  4579. doeyes:
  4580. ldx #N_EYEL ;do anims
  4581. jsr doanim
  4582. ldx #N_EYER
  4583. jsr doanim
  4584. lda movsta+FRIEND0 ;if friend not dieing
  4585. cmp #DIEING
  4586. beq .notarg ;and within range
  4587. lda movx+FRIEND0
  4588. cmp #45
  4589. bcc .notarg
  4590. lda #TRUE ;set target flag
  4591. bne .skip ;cheat always branch
  4592. .notarg:
  4593. lda #FALSE
  4594. .skip:
  4595. sta frtarget ;store as frtarget
  4596. lda eyesred ;if eyes not red
  4597. bne .doeyesred
  4598. ;doeyeswt: ;do eyes white
  4599. lda movsta+N_EYEL ;if neither idle nor no threat
  4600. ora movsta+N_EYER
  4601. and #%10000000
  4602. bne .insync
  4603. lda movsta+N_EYEL ;and sync bits different,
  4604. eor movsta+N_EYER
  4605. and #S_SYNC
  4606. beq .insync
  4607. jsr initwteyes ;resync
  4608. .insync:
  4609. lda frtarget ;if fr target
  4610. beq .exit
  4611. jsr initrdeyes ;make red
  4612. jmp .exit
  4613. .doeyesred:
  4614. lda frtarget ;if not frtarget
  4615. bne .exit
  4616. jsr initwteyes ;make white
  4617. .exit:
  4618. rts
  4619. ;
  4620. ; harder .. reduce idle time to make screens harder when revisited
  4621. ;
  4622. harder:
  4623. txa ;put x (mov) in y
  4624. ldy cursc
  4625. ldx beenhere,y ;put times been here in x
  4626. tay
  4627. .loop: dex
  4628. bmi .exit
  4629. lda movsta,y
  4630. lsr
  4631. ora #%10000000 ;keep negative
  4632. sta movsta,y
  4633. lda movt1,y
  4634. lsr
  4635. ora #1 ;make sure this isn't zero
  4636. sta movt1,y
  4637. bne .loop ;cheat always
  4638. .exit: tya
  4639. tax
  4640. rts
  4641. ;
  4642. ; do trigger .. a mover in y may trigger the mover in x
  4643. ;
  4644. dotrigger:
  4645. lda movsta,x ;if triggeree active, abort
  4646. bpl .exit
  4647. lda movsta,y
  4648. bmi .exit ;triggerer must be active
  4649. and #S_TRIGGER ;and trigger bit set
  4650. beq .exit
  4651. lda movsta,y ;shut off trigger
  4652. and #(~S_TRIGGER) & $FF
  4653. sta movsta,y
  4654. lda #0 ;activate triggered
  4655. sta movsta,x
  4656. lda #1
  4657. sta movt1,x
  4658. .exit:
  4659. rts
  4660. ;
  4661. ; do animation init
  4662. ; pass it address of initialization data, and mov in x reg.
  4663. ; completely sets up the sequence
  4664. ;
  4665. doaniminit:
  4666. ldy #0
  4667. lda (animl),y ;height
  4668. sta movht,x
  4669. iny
  4670. lda (animl),y ;width
  4671. sta movw,x
  4672. iny
  4673. lda (animl),y ;palwid
  4674. sta movpw,x
  4675. iny
  4676. lda (animl),y ;xpos
  4677. sta movx,x
  4678. iny
  4679. lda (animl),y ;ypos
  4680. sta movy,x
  4681. iny
  4682. lda (animl),y ;status
  4683. sta movsta,x
  4684. iny
  4685. lda (animl),y ;time
  4686. sta movt1,x
  4687. iny
  4688. lda (animl),y ;frame addr
  4689. sta movfrl,x
  4690. iny
  4691. lda (animl),y
  4692. sta movfrh,x
  4693. iny
  4694. lda (animl),y ;seq addr
  4695. sta movaniml,x
  4696. iny
  4697. lda (animl),y
  4698. sta movanimh,x
  4699. iny
  4700. lda (animl),y ;death seq
  4701. sta movdseql,x
  4702. iny
  4703. lda (animl),y
  4704. sta movdseqh,x
  4705. iny
  4706. lda (animl),y ;type (stationary or moving xy)
  4707. sta movtype,x
  4708. lda #JUMPALWAYS ;null loop counter
  4709. sta movloop,x
  4710. rts
  4711. ;
  4712. ; super animation machine .. moving, multi-header objects
  4713. ; start by setting movaniml/h to address of first instruction
  4714. ; instruction format is time .. frame .. delta .. etc.
  4715. ; delta is x,y in high, low nibble, plus 8 to avoid sign extension
  4716. ; a null time ends sequence
  4717. ; end seq format: (null time), status, restart addrl/h
  4718. ; THIS VERSION ALSO HAS AUDIO,JUMP, STATUS, POINTS, LOOP FUNCTIONS
  4719. doanim:
  4720. dec movt1,x
  4721. beq .animup ;update?
  4722. lda movsta,x ;no update .. check status
  4723. bpl .drawanim ;not idle?
  4724. rts ;idle .. return
  4725. .animup:
  4726. lda movsta,x ;check status
  4727. bpl .active ;active?
  4728. cmp #S_HANG ;if hang, return
  4729. bne .nothang
  4730. rts
  4731. .nothang:
  4732. inc movsta,x ;idle .. inc status
  4733. bpl .active ;newly active?
  4734. lda #ONESEC ;inactive .. reset time for one sec
  4735. sta movt1,x
  4736. rts ;bye!
  4737. .active:
  4738. ldy #0 ;clear indirect index register
  4739. lda movaniml,x ;fetch address of animation instruction
  4740. sta animl ;and put it in zero page for indirection
  4741. lda movanimh,x
  4742. sta animh
  4743. .nextinst:
  4744. lda (animl),y ;get time value
  4745. beq .animnonframe ;zero time = non-frame instruction
  4746. sta movt1,x ;set time
  4747. iny
  4748. lda (animl),y ;get frame address
  4749. sta movfrl,x
  4750. iny
  4751. lda movtype,x ;if type minus, skip dx,dy
  4752. bmi .skipdxdy
  4753. lda (animl),y ;delta x
  4754. clc
  4755. adc movx,x
  4756. sta movx,x
  4757. iny
  4758. lda (animl),y ;delta y
  4759. clc
  4760. adc movy,x
  4761. sta movy,x
  4762. iny
  4763. .skipdxdy:
  4764. tya ;update and save animation pointer
  4765. clc
  4766. adc animl
  4767. sta movaniml,x
  4768. lda #0 ;carry into high byte
  4769. adc animh
  4770. sta movanimh,x
  4771. .drawanim:
  4772. lda movfrl,x ;format vermov call
  4773. sta baddrl
  4774. lda movfrh,x
  4775. sta baddrh
  4776. lda movy,x
  4777. sta vpos
  4778. lda movx,x
  4779. sta hpos
  4780. lda movht,x
  4781. sta srcht
  4782. lda movpw,x
  4783. sta palwid
  4784. jsr xvermov
  4785. rts
  4786. .animnonframe: ;non-frame instruction
  4787. iny
  4788. pushx
  4789. lda (animl),y ;lookup the instruction token in jumptable
  4790. tax
  4791. lda .jmptab,x
  4792. sta jaddr
  4793. lda .jmptab+1,x
  4794. sta jaddr+1
  4795. popx
  4796. iny
  4797. jmp (jaddr)
  4798. .jmptab:
  4799. .dc.w .doaudio,.dojump,.dostatus,.dopoints,.doloop,.dodelta
  4800. .doaudio:
  4801. lda (animl),y
  4802. jsr playsound
  4803. iny
  4804. jmp .nextinst
  4805. .dojump:
  4806. lda movloop,x
  4807. cmp #JUMPALWAYS ;if invalid loop time, jump always
  4808. beq .readyjump
  4809. sec ;decrement
  4810. sbc #1
  4811. sta movloop,x
  4812. bcs .readyjump ;if repeated required times, don't jump
  4813. iny
  4814. iny
  4815. jmp .nextinst
  4816. .readyjump:
  4817. lda (animl),y ;replace old address with new
  4818. sta movaniml,x
  4819. iny
  4820. lda (animl),y
  4821. sta movanimh,x
  4822. jmp .animup ;back to top
  4823. .dostatus:
  4824. lda (animl),y ;new status, next action
  4825. sta movsta,x ;depends on status, so
  4826. iny ;re-evaluate
  4827. tya ;update and save animation pointer
  4828. clc
  4829. adc animl
  4830. sta movaniml,x
  4831. lda #0 ;carry animl to animh
  4832. adc animh
  4833. sta movanimh,x
  4834. jmp .animup
  4835. .dopoints:
  4836. pushx
  4837. pushy
  4838. lda (animl),y
  4839. tay
  4840. jsr addpoints
  4841. popy
  4842. popx
  4843. iny
  4844. jmp .nextinst
  4845. .doloop:
  4846. lda (animl),y ;set the loop counter
  4847. sta movloop,x
  4848. iny
  4849. jmp .nextinst
  4850. .dodelta:
  4851. lda (animl),y ;add delta x and y
  4852. clc
  4853. adc movx,x
  4854. sta movx,x
  4855. iny
  4856. lda (animl),y
  4857. clc
  4858. adc movy,x
  4859. sta movy,x
  4860. iny
  4861. jmp .nextinst
  4862. ;
  4863. ; add points.. given ord of point value, sets up screen display
  4864. ; and increments player's score
  4865. ; call with mov in x, score code in y
  4866. addpoints:
  4867. lda ptsbmtab,y ;baddrl
  4868. sta paddrl
  4869. lda ptspwtab,y ;palwid
  4870. sta ppalwid
  4871. lda movx,x ;hpos
  4872. sta phpos
  4873. lda movy,x ;vpos
  4874. sta pvpos
  4875. lda #ONESEC ;time
  4876. sta ptime
  4877. tya ;inc score (two data bytes)
  4878. asl
  4879. tay
  4880. pushx
  4881. pushy
  4882. lda ptsinctab,y
  4883. jsr incsc
  4884. popy
  4885. pushy
  4886. lda ptsinctab+1,y
  4887. jsr incsc
  4888. popy
  4889. popx
  4890. rts
  4891. ;
  4892. ; fade machine: the following subroutines manage fades and cuts.
  4893. ; cut in and cut out cause immediate actions to the screen.
  4894. ; fade in and fade out set the flag faddir (fade direction), and
  4895. ; the fade occurs when the routine "dofades" is called every field.
  4896. ; waitfade is called when there is no action by the caller until
  4897. ; any pending fade is completed.
  4898. ; fadepals and fadecolor are utilities internal to the fade machine.
  4899. ; Any setting of colors intended to be faded correctly must be done
  4900. ; in the pal shadows (use the macro setpal).
  4901. ;
  4902. ; fade in and wait
  4903. ;
  4904. fadeinwait:
  4905. jsr fadein
  4906. jsr waitfade
  4907. rts
  4908. ;
  4909. ; fade out and wait
  4910. ;
  4911. fadeoutwait:
  4912. jsr fadeout
  4913. jsr waitfade
  4914. rts
  4915. ;
  4916. ; wait for fade to finish
  4917. ;
  4918. waitfade:
  4919. jsr waitbot
  4920. jsr dofades
  4921. lda faddir
  4922. bne waitfade
  4923. rts
  4924. ;
  4925. ; cut to black
  4926. ;
  4927. cutout:
  4928. lda #MAXFADE
  4929. sta fadsta
  4930. jsr fadepals
  4931. rts
  4932. ;
  4933. ; cut from black
  4934. ;
  4935. cutin:
  4936. lda #0
  4937. sta fadsta
  4938. jsr fadepals
  4939. rts
  4940. ;
  4941. ; fade in
  4942. ;
  4943. fadein:
  4944. lda #FADEIN
  4945. sta faddir
  4946. rts
  4947. ;
  4948. ; fade out
  4949. ;
  4950. fadeout:
  4951. lda #FADEOUT
  4952. sta faddir
  4953. rts
  4954. ;
  4955. ; do fades
  4956. ; task for fade in/out
  4957. ; reads global: faddir
  4958. ; uses locals: fadsta, fadtim, fadlum
  4959. dofades:
  4960. lda faddir
  4961. bne .fadewaits ;return if no fade waiting
  4962. rts
  4963. .fadewaits:
  4964. dec fadtim ;time between changes
  4965. bmi .update
  4966. rts
  4967. .update:
  4968. lda #FADSP ;reset timer
  4969. sta fadtim
  4970. lda faddir ;test direction
  4971. bmi .fadingout
  4972. ;fadingin:
  4973. lda fadsta
  4974. beq .faddone
  4975. dec fadsta ;fade in
  4976. jsr fadepals
  4977. rts
  4978. .fadingout:
  4979. lda fadsta
  4980. cmp #MAXFADE
  4981. beq .faddone
  4982. inc fadsta ;fade out
  4983. jsr fadepals
  4984. rts
  4985. .faddone:
  4986. lda #0 ;fade done, switch to idle mode
  4987. sta fadtim
  4988. sta faddir
  4989. rts
  4990. ;
  4991. ; fade pals
  4992. ;
  4993. fadepals:
  4994. lda #NUMBPAL
  4995. sta i
  4996. ldx #0
  4997. .loop: jsr fadepal
  4998. dec i
  4999. bne .loop
  5000. ldy sky ;fade ground and sky
  5001. jsr fadecolor
  5002. sta fadsky
  5003. ldy ground1
  5004. jsr fadecolor
  5005. sta fadgrnd1
  5006. ldy ground2
  5007. jsr fadecolor
  5008. sta fadgrnd2
  5009. rts
  5010. ;
  5011. ; fade pal .. put pal color zero offset in x reg
  5012. ;
  5013. fadepal:
  5014. inx ;skip MARIA register
  5015. ldy palshad,x ;color 1
  5016. jsr fadecolor
  5017. sta PALS,x
  5018. inx
  5019. ldy palshad,x ;color 2
  5020. jsr fadecolor
  5021. sta PALS,x
  5022. inx
  5023. ldy palshad,x ;color 3
  5024. jsr fadecolor
  5025. sta PALS,x
  5026. inx
  5027. rts
  5028. ;
  5029. ; fadecolor
  5030. ; call with intended color in Y reg
  5031. ; returns faded color in A reg
  5032. ; uses global fadsta (fade state)
  5033. ; uses temp fadlum (faded luminance)
  5034. fadecolor:
  5035. tya ;get input
  5036. and #$0F ;mask in luminance
  5037. sec
  5038. sbc fadsta ;subtract fade state
  5039. bpl fall30
  5040. lda #BLACK ;if negative return (black)
  5041. rts ;done for negative
  5042. fall30:
  5043. sta fadlum ;get input
  5044. tya ;get intended color
  5045. and #$F0 ;keep chroma
  5046. ora fadlum ;add lum
  5047. rts ;done
  5048. ;
  5049. ; wait for alarm
  5050. ; call with field count in a reg
  5051. ; returns when time is up
  5052. ;
  5053. waitalarm:
  5054. sta timer
  5055. .loop: jsr waitbot
  5056. jsr dofades
  5057. lda timer
  5058. bne .loop
  5059. rts
  5060. ;
  5061. ; wait for vblank
  5062. ;
  5063. waitvbl:
  5064. .loop1:
  5065. bit MSTAT ;wait until vblank is off
  5066. bmi .loop1
  5067. .loop2:
  5068. bit MSTAT ;wait until vblank is on
  5069. bpl .loop2
  5070. lda #0 ;clear bottom-of-screen flag
  5071. sta botflag
  5072. sta intcnt ;set interrupt count flag
  5073. rts ;return
  5074. ;
  5075. ; wait for bottom of screen (set by last-zone interrupt)
  5076. ; also, sound and pause functions occur in this routine
  5077. ;
  5078. waitbot:
  5079. jsr dosound
  5080. .loop:
  5081. lda botflag ;check flag
  5082. beq .loop ;loop
  5083. lda #0 ;clear flag
  5084. sta botflag
  5085. jsr dosw ;read console sw
  5086. lda pauseon ;check pause mode
  5087. bne .loop ;wait more if paused
  5088. rts
  5089. ;
  5090. ; make background, plain-jane format
  5091. ;
  5092. mkbkg: ;left half
  5093. maketall plaintall
  5094. rts
  5095. ;
  5096. ; init cursor to center screen
  5097. ;
  5098. initcursor:
  5099. ldx #N_CURSOR
  5100. makeaniminit cursorinit
  5101. rts
  5102. ;
  5103. ; do cursor: show it on screen
  5104. ;
  5105. docursor:
  5106. lda idlemode ;if idle, exit
  5107. bne .exit
  5108. lda gun ;if light gun selected
  5109. beq .stick
  5110. jsr DOGUN ;call routine in lower fixed bank
  5111. bne .fire ;returns TRUE if fired
  5112. beq .nofire
  5113. .stick:
  5114. lda movsta+N_CURSOR ;see if firing allowed
  5115. and #S_STOPPED
  5116. bne .nofire
  5117. lda INPT4 ;check fire button
  5118. bmi .nofire
  5119. .fire:
  5120. lda movx+N_CURSOR ;if cursor pos
  5121. cmp #SCWP ;offscreen
  5122. bne .onscreen
  5123. makesound CUCKOO2 ;make cuckoo sound
  5124. .onscreen:
  5125. lda #S_STOPPED ;fire crossbow, forbid new fire
  5126. sta movsta+N_CURSOR
  5127. ldx #N_CURSOR
  5128. makeanim curseq2
  5129. .nofire:
  5130. ldx #N_CURSOR
  5131. jsr doanim
  5132. .exit:
  5133. rts
  5134. ;
  5135. ; setcursor
  5136. ;
  5137. setcursor:
  5138. lda idlemode ;if idle mode
  5139. bne .exit ;exit
  5140. lda gun ;if light gun selected,
  5141. bne .exit ;exit
  5142. ;
  5143. ; process joystick positioning of cursor (site)
  5144. ;
  5145. ;tryright
  5146. lda right ;if right
  5147. beq .tryleft ;false, try left
  5148. lda movx+N_CURSOR ;load curpos x
  5149. cmp #SCWP-4-2 ;going offscreen?
  5150. bcs .trydown ;if at edge, abort
  5151. inc movx+N_CURSOR ;else inc
  5152. inc movx+N_CURSOR ;else inc
  5153. jmp .trydown
  5154. .tryleft:
  5155. lda left ;if left
  5156. beq .trydown ;false, try down
  5157. lda movx+N_CURSOR ;load curpos x
  5158. cmp #2 ;going offscreen?
  5159. bcc .trydown ;if at left edge, abort
  5160. dec movx+N_CURSOR ;else dec
  5161. dec movx+N_CURSOR ;else dec
  5162. .trydown:
  5163. lda down ;if right
  5164. beq .tryup ;false, try up
  5165. lda movy+N_CURSOR ;load curpos y
  5166. cmp #2 ;check for limit
  5167. bcc .exit ;if at bottom, abort
  5168. lda movy+N_CURSOR ;else dec
  5169. sec
  5170. sbc #2
  5171. sta movy+N_CURSOR ;twice
  5172. jmp .exit
  5173. .tryup:
  5174. lda up ;if right
  5175. beq .exit ;false, try up
  5176. lda movy+N_CURSOR ;load curpos
  5177. cmp #SCHL-4-2 ;compare with top
  5178. bcs .exit ;if at bottom, abort
  5179. lda movy+N_CURSOR ;else inc
  5180. clc
  5181. adc #2
  5182. sta movy+N_CURSOR ;twice
  5183. .exit:
  5184. rts
  5185. ;
  5186. ; header management machine: call the following functions to create
  5187. ; headers in MARIA's display lists. The list may be cleared (clearsc),
  5188. ; background headers can be locked (lockbkg), foreground headers can
  5189. ; be cleared (clrmov), collections of headers can be made (tallobj),
  5190. ; vertical positions can be managed (vermov). The basic header-maker
  5191. ; is mkhdr.
  5192. ;
  5193. ; read headers
  5194. ; given addr of header list in addrl/h, calls mkhdr until all in place
  5195. ; data format: baddrh (hi nibble) zone (lo nibble), baddrl, palwid, hpos
  5196. ; end list = $FF in first byte
  5197. ; It is important to maintain this and readheaders2 together.
  5198. ;
  5199. readhdrs:
  5200. ldy #0
  5201. lda (addrl),y ;baddrh and curzon
  5202. cmp #$FF
  5203. beq .exit
  5204. tax
  5205. and #$0F
  5206. sta curzon
  5207. txa
  5208. and #$F0
  5209. sta baddrh
  5210. incw addrl
  5211. lda (addrl),y ;baddrl
  5212. sta baddrl
  5213. incw addrl
  5214. lda (addrl),y ;palwid
  5215. sta palwid
  5216. incw addrl
  5217. lda (addrl),y ;hpos
  5218. sta hpos
  5219. incw addrl
  5220. jsr mkhdr
  5221. jmp readhdrs ;loop
  5222. .exit: rts
  5223. ;
  5224. ; This special read header 2 is for use of the map screen to draw
  5225. ; connecting paths with different palettes, overriding the palette
  5226. ; in the header data
  5227. ; It is important to maintain this and readheaders together.
  5228. ;
  5229. readhdrs2:
  5230. ldy #0
  5231. lda (addrl),y ;baddrh and curzon
  5232. cmp #$FF
  5233. beq .exit
  5234. tax
  5235. and #$0F
  5236. sta curzon
  5237. txa
  5238. and #$F0
  5239. sta baddrh
  5240. incw addrl
  5241. lda (addrl),y ;baddrl
  5242. sta baddrl
  5243. incw addrl
  5244. lda (addrl),y ;palwid
  5245. and #%00011111 ;substitute palette
  5246. ora subpal
  5247. sta palwid
  5248. incw addrl
  5249. lda (addrl),y ;hpos
  5250. sta hpos
  5251. incw addrl
  5252. jsr mkhdr
  5253. jmp readhdrs2 ;loop
  5254. .exit: rts
  5255. ;
  5256. ; read tall .. reads data for a tall object or series of tall objects
  5257. ; calls tallobj. Clobbers x,y,a
  5258. ;
  5259. readtall:
  5260. ldy #0
  5261. lda (addrl),y ;baddrh and curzon
  5262. cmp #$FF
  5263. beq .exit
  5264. tax ;curzon
  5265. and #$0F
  5266. sta curzon
  5267. txa ;baddrh
  5268. and #$F0
  5269. sta baddrh
  5270. incw addrl
  5271. lda (addrl),y ;baddrl
  5272. sta baddrl
  5273. incw addrl
  5274. lda (addrl),y ;srcht
  5275. sta srcht
  5276. incw addrl
  5277. lda (addrl),y ;srcwid
  5278. sta srcw
  5279. incw addrl
  5280. lda (addrl),y ;hpos
  5281. sta hpos
  5282. incw addrl
  5283. lda (addrl),y ;destht
  5284. sta destht
  5285. incw addrl
  5286. lda (addrl),y ;palwid
  5287. sta palwid
  5288. incw addrl
  5289. jsr tallobj
  5290. jmp readtall ;loop
  5291. .exit: rts
  5292. ;
  5293. ; tall object
  5294. ; passes on mkhdr vars
  5295. ; also: dest height (destht) source height (srcht) source width (srcw)
  5296. tallobj:
  5297. save curzon ;save destructable vars
  5298. save destht
  5299. save baddrl
  5300. save baddrh
  5301. sta baddrhs
  5302. save srcht
  5303. sta srchts
  5304. .loop: jsr mkhdr
  5305. dec destht
  5306. bne .cont ;done?
  5307. restore srcht ;return
  5308. restore baddrh
  5309. restore baddrl
  5310. restore destht
  5311. restore curzon
  5312. rts
  5313. .cont:
  5314. ;setup next zone
  5315. inc curzon ;dest
  5316. dec srcht ;src height
  5317. bne .else ;wrap src?
  5318. lda srchts ;yes, wrap zone counter
  5319. sta srcht
  5320. lda baddrhs ;wrap baddrh
  5321. sta baddrh
  5322. lda baddrl ;advance baddrl
  5323. clc
  5324. adc srcw
  5325. sta baddrl
  5326. bne .loop ;branch always .. acc will never be zero
  5327. .else:
  5328. lda baddrh ;source
  5329. clc
  5330. adc #ZONEHL
  5331. sta baddrh
  5332. bne .loop ;branch always .. acc will never be zero
  5333. ;
  5334. ; fill region with same bitmap
  5335. ; passes on mkhdr vars
  5336. ; also: dest height (destht)
  5337. fillreg:
  5338. save curzon ;save destructable vars
  5339. save destht
  5340. .loop: jsr mkhdr ;make headers until done
  5341. inc curzon
  5342. dec destht
  5343. bne .loop
  5344. restore destht ;return
  5345. restore curzon
  5346. rts
  5347. ;
  5348. ; vertical moving object
  5349. ; extended
  5350. ; Some peculiar code follows. I need to know if the object is above
  5351. ; or below screen, or on screen. A vpos from 192 to 255 is NEGATIVE
  5352. ; (below the screen) in this context, but the 6502 sees numbers going
  5353. ; negative at 128. Therefore, a double test is needed to determine if
  5354. ; it is negative in THIS context, and the shift-lefts (divide by 16) must
  5355. ; be SIGN EXTENDED to work in this context.
  5356. ; Parameters: vpos, srcht, all mkhdr pars except curzon
  5357. xvermov:
  5358. lda vpos
  5359. lsr ;calc zone
  5360. lsr
  5361. lsr
  5362. lsr
  5363. tax
  5364. lda convzsign,x ;lookup proper zone sign
  5365. sta curzon
  5366. lda vpos ;calc address offset
  5367. and #$0f
  5368. beq .loop ;fraction of a zone?
  5369. sta vpos ;yes, store fractional vpos,
  5370. inc srcht ;increase vertical size,
  5371. lda baddrh ;adjust source addr
  5372. sec
  5373. sbc vpos
  5374. sta baddrh
  5375. .loop:
  5376. jsr mkhdr ;make
  5377. dec srcht
  5378. beq .break ;more height?
  5379. inc curzon ;...yes
  5380. lda #ZONEHL
  5381. clc
  5382. adc baddrh
  5383. sta baddrh
  5384. jmp .loop
  5385. .break:
  5386. rts
  5387. ;
  5388. ; clear screen
  5389. ;
  5390. clearsc:
  5391. jsr clrhdr
  5392. jsr lockbkg
  5393. jsr nullhdrs
  5394. rts
  5395. ;
  5396. ; lock background .. this function protects stationary background
  5397. ; headers by setting the header base addresses to right after them
  5398. ; Should be called after backgrounds are set up
  5399. ;
  5400. lockbkg:
  5401. ldx #(ZONECNT*2)-1 ;copy from hdrplst to hdrmlst
  5402. .loop: lda hdrplst,x
  5403. sta hdrmlst,x
  5404. dex
  5405. bpl .loop
  5406. rts
  5407. ;
  5408. ; clear moving objects from header lst
  5409. ; Copy locked header info to list
  5410. ; Should be called before moving objects are re-written
  5411. ;
  5412. waitclear:
  5413. jsr waitbot
  5414. clrmov:
  5415. ldx #(ZONECNT*2)-1 ;copy from hdrmlst to hdrplst
  5416. .loop: lda hdrmlst,x
  5417. sta hdrplst,x
  5418. dex
  5419. bpl .loop
  5420. jsr nullhdrs
  5421. rts
  5422. ;
  5423. ; clear headers completely for re-forming
  5424. ; copy rom-based header addresses to ram
  5425. ;
  5426. clrhdr:
  5427. ldx #(ZONECNT*2)-1 ;copy from rom to ram
  5428. .loop: lda hdradl,x
  5429. sta hdrplst,x
  5430. dex
  5431. bpl .loop
  5432. rts
  5433. nullhdrs:
  5434. ldx #(ZONECNT-1)<<1
  5435. ldy #1 ;point to second, palwid byte
  5436. .loop: lda hdrplst,x ;low byte
  5437. sta haddrl
  5438. lda hdrplst+1,x ;high byte
  5439. sta haddrh
  5440. lda #0 ;null the header
  5441. sta (haddrl),y
  5442. dex
  5443. dex
  5444. bpl .loop
  5445. rts
  5446. ;
  5447. ; make header
  5448. ;
  5449. ; parameters: baddrl/h, palwid, curzon, hpos
  5450. ; locals: haddrl/h
  5451. ; uses: a,x,y regs
  5452. mkhdr:
  5453. lda curzon ;return if off screen
  5454. bmi abort1
  5455. cmp #ZONECNT
  5456. bpl abort1
  5457. asl ;lookup header list address, store in haddrl/h
  5458. tax
  5459. lda hdrplst,x ;low byte, indirect addr
  5460. sta haddrl
  5461. clc ;point to next header
  5462. adc #4 ;notice only low address is incremented
  5463. sta hdrplst,x ;without carry, so a row of headers must be
  5464. ;spaced within one page
  5465. lda hdrplst+1,x ;high byte, indirect addr
  5466. sta haddrh
  5467. ldy #0
  5468. lda baddrl ;bitmap address low
  5469. sta (haddrl),y
  5470. iny ;pal width
  5471. lda palwid
  5472. sta (haddrl),y
  5473. iny ;bitmap address high
  5474. lda baddrh
  5475. sta (haddrl),y
  5476. iny ;hpos
  5477. lda hpos
  5478. sta (haddrl),y
  5479. ldy #5 ;null next header
  5480. lda #0
  5481. sta (haddrl),y
  5482. abort1:
  5483. rts
  5484. ;
  5485. ; init rand .. seed random number generator
  5486. ;
  5487. initrand:
  5488. lda #189 ;183: one survivor in town
  5489. sta seedtab
  5490. lda #202
  5491. sta seedtab+1
  5492. lda #215
  5493. sta seedtab+2
  5494. lda #2
  5495. sta rindex
  5496. rts
  5497. ;
  5498. ; init x to rand140, t1 to 0..256, jsr harder
  5499. ;
  5500. randxth:
  5501. jsr rand140x
  5502. jsr randt1
  5503. jsr harder
  5504. rts
  5505. ;
  5506. ; place a random number in movt1,x
  5507. ;
  5508. randt1:
  5509. jsr rand
  5510. sta movt1,x
  5511. rts
  5512. ;
  5513. ; return a random number from 13 .. 140, put it in movx,x
  5514. ;
  5515. rand140x:
  5516. jsr rand
  5517. and #%01111111
  5518. adc #(SCWP-128-6)/2 ;center range
  5519. sta movx,x
  5520. rts
  5521. ;
  5522. ; return a random number from 0 .. 63
  5523. ;
  5524. rand63:
  5525. jsr rand
  5526. and #%00111111
  5527. rts
  5528. ;
  5529. ; return random number from 0 .. 159
  5530. ;
  5531. rand160:
  5532. jsr rand
  5533. and #128-1
  5534. sta r160tmp
  5535. jsr rand
  5536. and #32-1
  5537. clc
  5538. adc r160tmp
  5539. rts
  5540. ;
  5541. ; random number generator (mod 256)
  5542. ; three values in a table are added together, the sum replaces each of
  5543. ; the values in successive calls
  5544. ; uses A, Y regs
  5545. ;
  5546. rand: ldy rindex ;load sum pointer
  5547. adc seedtab ;first value
  5548. adc seedtab+1 ;second value
  5549. adc seedtab+2 ;third value
  5550. sta seedtab,y ;store
  5551. dey ;dec sum pointer
  5552. bpl .fall ;no wrap?
  5553. ldy #2 ;wrap
  5554. .fall:
  5555. sty rindex ;store sum pointer
  5556. rts
  5557. ;
  5558. ; play sound
  5559. ; give it id in A reg
  5560. ; this func called from macro "makesound"
  5561. ; clobbers temp
  5562. playsound:
  5563. sta temp ;save regs
  5564. pushx
  5565. pushy
  5566. ldy temp ;sound table index
  5567. lda AUDADDR,y ;read table for data address
  5568. sta addrl
  5569. lda AUDADDR+1,y
  5570. sta addrh
  5571. ldy #0
  5572. lda (addrl),y ;read priority nibble
  5573. and #%01110000
  5574. sta temp
  5575. ;
  5576. ; if a channel is idle, choose it
  5577. ;
  5578. ldx #0
  5579. lda shistory
  5580. beq .replacesound
  5581. inx
  5582. lda shistory+1
  5583. beq .replacesound
  5584. ;
  5585. ; set x to channel with lowest priority
  5586. ; or longest history if pri same
  5587. ;
  5588. sec
  5589. lda spriority
  5590. sbc spriority+1
  5591. bne .pridiff
  5592. lda shistory ;pri same, choose channel playing longest
  5593. cmp shistory+1
  5594. rol ;carry bit becomes
  5595. and #1
  5596. tax ;chosen channel
  5597. jmp .prready
  5598. .pridiff:
  5599. rol ;carry
  5600. and #1 ;bit
  5601. tax ;becomes chosen channel
  5602. .prready:
  5603. ;
  5604. ; if new sound has higher priority than lowest pri channel
  5605. ; replace channel with new sound, else return
  5606. ;
  5607. lda temp ;if new sound has lower pri than
  5608. cmp spriority,x ;old sound,
  5609. bmi .exit ;exit
  5610. .replacesound:
  5611. lda addrl ;set saved address
  5612. sta saddrl,x
  5613. lda addrh
  5614. sta saddrh,x
  5615. lda temp ;set priority
  5616. sta spriority,x
  5617. ;
  5618. ; set these things to zero
  5619. ;
  5620. lda #0
  5621. tay
  5622. jsr setav
  5623. sta sptr,x
  5624. sta audvshadow,x
  5625. ;
  5626. ; set these things to 1
  5627. ;
  5628. lda #1
  5629. sta sptr,x ;point to after control byte
  5630. sta stime,x ;1st count, immediate update
  5631. lda #$FF
  5632. sta shistory,x
  5633. lda (addrl),y ;set control byte
  5634. sta AUDC0,x
  5635. .exit: popy
  5636. popx
  5637. rts
  5638. ;
  5639. ; do sound
  5640. ; looks at saddrh, if non-zero, takes saddrh/l, and starts interpreting
  5641. ; audio data (format in macro "audi" and "audend")
  5642. dosound:
  5643. ldx #0
  5644. jsr dochannel
  5645. ldx #1
  5646. jsr dochannel
  5647. rts
  5648. ;
  5649. ; do one channel of audio
  5650. ; channel in x reg
  5651. ;
  5652. dochannel:
  5653. lda shistory,x ;if no history, idle
  5654. bne .notidle
  5655. rts
  5656. .notidle:
  5657. cmp #1 ;if history > 1, dec
  5658. beq .nodec
  5659. dec shistory,x
  5660. .nodec:
  5661. dec stime,x ;if dec time not zero, exit
  5662. beq .update
  5663. rts
  5664. .update:
  5665. lda saddrl,x ;set indirect address
  5666. sta addrl
  5667. lda saddrh,x
  5668. sta addrh
  5669. ldy sptr,x ;set index pointer
  5670. lda (addrl),y ;read first byte
  5671. beq .stopchan ;if zero, stop channel
  5672. iny
  5673. lsr ;set time till next update
  5674. sta stime,x ;low bit of vol now in carry
  5675. lda (addrl),y ;second byte (freq, vol)
  5676. iny
  5677. pha ;save it
  5678. rol ;shift left, bringing back low bit from carry
  5679. and #%00001111
  5680. jsr setav
  5681. pla ;get freq
  5682. lsr ;shift in
  5683. lsr
  5684. lsr
  5685. sta AUDF0,x ;set freq
  5686. tya ;save index pointer
  5687. sta sptr,x
  5688. rts
  5689. .stopchan:
  5690. lda #0 ;channel becomes idle
  5691. sta shistory,x
  5692. jsr setav
  5693. rts
  5694. ;
  5695. ; set audio volume
  5696. ; shadow to audvshadow
  5697. ; using these subs is necessary to allow PAUSE to fully stop audio
  5698. ; and resume it exactly where it left off.
  5699. ; Call with volume in a reg, channel in x reg
  5700. setav: sta audvshadow,x
  5701. and soundon
  5702. sta AUDV0,x
  5703. rts
  5704. ;
  5705. ; Interrupt machine: an interrupt jump table is maintained, and at any
  5706. ; time, the global word "intjmp" is set so that an indirect jump will be
  5707. ; made at the next MARIA zone interrupt, performing the correct function.
  5708. ;
  5709. ; clear interrupt jump table
  5710. ; set them all to point to null function, except for the top and bottom of
  5711. ; screen, which sets background to sky color and black, respectively.
  5712. ;
  5713. clrijt:
  5714. jsr waitbot
  5715. clrijt1: ;for "internal" use
  5716. ldy #0
  5717. .loop: lda #(intnull & $FF)
  5718. sta intjt,y
  5719. iny
  5720. lda #(intnull >> 8)
  5721. sta intjt,y
  5722. iny
  5723. tya
  5724. cmp #(NUMBINT*2)
  5725. bne .loop
  5726. lda #(intsky & $FF) ;top of screen, PLUS first interrupt
  5727. sta intjt+INTZB
  5728. sta intjmp
  5729. lda #(intsky >> 8)
  5730. sta intjt+INTZB+1
  5731. sta intjmp+1
  5732. setijt INTBOT,intbot ;bottom of screen
  5733. lda #2 ;set ptr to next jmp addr
  5734. sta intptr
  5735. rts
  5736. ;
  5737. ; non-maskable interrupt handler (maria zones)
  5738. ;
  5739. inter: sta WSYNC
  5740. pha ;save regs
  5741. pushy
  5742. jmp (intjmp)
  5743. intsky: lda fadsky
  5744. sta WSYNC
  5745. sta BKGRND
  5746. jmp intret
  5747. intgrnd1:
  5748. lda fadgrnd1
  5749. sta WSYNC
  5750. sta BKGRND
  5751. jmp intret
  5752. intgrnd2:
  5753. lda fadgrnd2
  5754. sta WSYNC
  5755. sta BKGRND
  5756. jmp intret
  5757. intbot:
  5758. lda #BLACK
  5759. sta WSYNC
  5760. sta BKGRND
  5761. lda #1 ;set bottom flag
  5762. sta botflag
  5763. lda #0 ;clear interrupt count
  5764. sta intcnt
  5765. lda pauseon ;if not in pause, service clocks
  5766. bne intret
  5767. dec timer
  5768. dec clock
  5769. intnull:
  5770. intret:
  5771. ldy intptr ;setup next intjmp
  5772. lda intjt,y
  5773. sta intjmp
  5774. iny
  5775. lda intjt,y
  5776. sta intjmp+1
  5777. iny
  5778. tya ;check for overflow
  5779. cmp #(NUMBINT*2)
  5780. bne .nowrap
  5781. ldy #0 ;wrap
  5782. .nowrap:
  5783. sty intptr
  5784. popy ;restore regs
  5785. pla
  5786. rti
  5787. endcode:
  5788. ENDCODE equ endcode
  5789. ;
  5790. ; encryption area
  5791. ;
  5792. ; if the following fails, code has invaded top-of-ROM
  5793. .assert (* <= $FF7A) ;check end (codeend)
  5794. ;
  5795. ; encryption data
  5796. ;
  5797. .org $FF80
  5798. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5799. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5800. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5801. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5802. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5803. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5804. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5805. .dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  5806. ;
  5807. ;
  5808. ;
  5809. .assert (* <= $FFF8) ;check encryption end
  5810. .org $FFF8 ;region verification
  5811. .dc.b $FF
  5812. .org $FFF9 ;7800 cart identification
  5813. .dc.b ((FIXROM >> 8) | $7)
  5814. .org $FFFA ;interrupt and reset vectors
  5815. .dc.w inter ;NMI
  5816. .dc.w main ;RESET
  5817. .dc.w dummy ;IRQ
  5818. .end