home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / Oddball / Source
Encoding:
Text File  |  1995-04-22  |  147.0 KB  |  9,989 lines

  1.  
  2. #name Code.Code
  3.  
  4. #type &ffd
  5. #include <Main$Path>Extasm.AsmLib.MYDIV
  6.  
  7. #set x=1
  8. #include <OddBall$Path>Sources.Structures
  9. #set x=1
  10. #include <OddBall$Path>Sources.Variables
  11. #set x=1
  12. .start
  13. STMFD R13!,{R14}
  14. BL setupvars    ;No use of R12 before this!
  15. BL loadfiles
  16. ADRVS R0,loadfailedtext
  17. SWIVS OS_GenerateError
  18. BL setup
  19. BL hackcheck
  20. BL setupplayer
  21. BL setupsounds
  22. BL configupdate
  23. BL modeactive
  24. BL demostart
  25. ADR R0,loadmes
  26. BL message
  27. BL mainloop
  28. LDMFD R13!,{PC}
  29.  
  30. .loadmes
  31. DCD (160+&180)<<12, 224<<12, -2<<12, 0, &01800001,0
  32. DCB "$ DIGITAL PSYCHOSIS 1995",0
  33. ALIGN
  34.  
  35. .mainloop
  36. STMFD R13!,{R14}
  37. ;BL releasedemo
  38. ;MVN R0,#1
  39. ;STR R0,[R12,#v.loadedlev]
  40. BL dograbs
  41. BL scangrab
  42. .lifeloop
  43. .reloadloop
  44. BL wipesoundtab
  45. MOV R0,#batstab
  46. SWI Amnesia_CountObjects
  47. CMP R0,#0
  48. BLEQ makebat
  49.  
  50. LDR R1,[R12,#v.demomode]
  51. CMP R1,#1
  52. MOV R0,#texttab
  53. SWINE Amnesia_WipeTable
  54. .loop
  55. BL setupcanvas
  56. LDR R0,[R12,#v.levelno]
  57. LDR R1,[R12,#v.loadedlev]
  58. CMP R1,R0
  59. BLNE levelswap
  60. MOV R0,#1
  61. STR R0,[R12,#v.masterplot]
  62. BL runclocks
  63. BL plmove
  64. BL redcheck
  65. BL goodycheck
  66. BL movecent
  67. BL processblocks
  68. BL processbat
  69. BL processballs
  70. BL processstars
  71. BL processbullets
  72. BL bateffects
  73. BL processdecor
  74. BL texthandler
  75. BL doreps
  76.  
  77. BL colchblockball
  78. BL colchbatball
  79. BL colchbatstars
  80. BL colchblocks
  81.  
  82. .mainloop2
  83. LDR R0,[R12,#v.levelno]
  84. LDR R1,[R12,#v.loadedlev]
  85. CMP R1,R0
  86. BLNE levelswap
  87. MOV R0,#0
  88. STR R0,[R12,#v.masterplot]
  89. BL scanset
  90. BL scanupdate
  91. BL setupcanvas
  92. BL runclocks
  93. BL plmove
  94. BL redcheck
  95. BL goodycheck
  96. BL movecent
  97. BL setplotoffset
  98.  
  99. BL plotbackdrop
  100. BL processedge
  101. BL processblocks
  102. BL processbat
  103.  
  104. BL processballs
  105. BL processstars
  106. BL processbullets
  107. BL bateffects
  108. BL processdecor
  109. BL texthandler
  110. BL doreps
  111. ;BL showrate
  112. ;BL showattn
  113. BL scoreupdate
  114. BL livesupdate
  115. BL ballsupdate
  116. BL goodyupdate
  117. BL setupcanvas
  118. BL scanwrite
  119.  
  120. BL colchblockball
  121. BL colchbatball
  122. BL colchbatstars
  123. BL colchblocks
  124. BL batsound
  125. BL makesounds
  126. BL deathfade
  127. LDR R0,[R12,#v.pending]
  128. CMP R0,#8
  129. MOV R0,#0
  130. MOVEQ R0,#4
  131. STR R0,[R12,#v.pending]
  132. MOV R0,#0
  133. STR R0,[R12,#v.exit]
  134. LDR R0,[R12,#v.demomode]
  135. CMP R0,#1
  136. BLEQ demomenu
  137. BL writebank
  138. LDR R0,[R12,#v.blocksleft]
  139. CMP R0,#0
  140. BNE nonoblocks
  141. LDR R0,[R12,#v.levelnet]
  142. LDR R0,[R0,#net.backdrop]
  143. TST R0,#1<<30
  144. BNE nonoblocks
  145. BLEQ noblocks
  146. .nonoblocks
  147. LDR R0,[R12,#v.newlevelctr]
  148. CMP R0,#0
  149. BGT newlevel
  150. .newlevelins
  151. BL keyscan
  152. BL escapetest
  153. LDR R0,[R12,#v.exit]
  154. CMP R0,#1
  155. BEQ exit
  156. CMP R0,#3
  157. BEQ reloadloop
  158. LDR R0,[R12,#v.dead]
  159. CMP R0,#200
  160. BGE handledeath
  161. .handledeathins
  162. LDR R0,[R12,#v.frameinc]
  163. CMP R0,#1
  164. BEQ mainloop2
  165. B loop
  166. .handledeath
  167. LDR R0,[R12,#v.demomode]
  168. CMP R0,#1
  169. BNE noskipdeath
  170. LDR R0,[R12,#v.dead]
  171. CMPGE R0,#500
  172. BLT handledeathins
  173. .noskipdeath
  174. MOV R0,#0
  175. STR R0,[R12,#v.dead]
  176. LDR R0,[R12,#v.demomode]
  177. CMP R0,#1
  178. BEQ demolife
  179. LDR R3,[R12,#v.ballxhome]
  180. LDR R4,[R12,#v.ballyhome]
  181. BL makeball
  182. BL homebat
  183. LDR R0,[R12,#v.levelno]
  184. TST R0,#&400
  185. BNE warpdead
  186.  
  187. LDR R0,[R12,#v.pllives]
  188. SUBS R0,R0,#1
  189. STR R0,[R12,#v.pllives]
  190. BPL lifeloop
  191. BL highscores
  192. BL demostart
  193. B lifeloop
  194. LDMFD R13!,{PC}
  195.  
  196. .warpdead
  197. B lifeloop
  198.  
  199. .demolife
  200. MVN R0,#0
  201. STR R0,[R12,#v.levelno]
  202. B lifeloop
  203.  
  204. .exit
  205. BL emptykeybuf
  206. MOV R0,#4
  207. MOV R1,#0
  208. SWI OS_Byte
  209. MOV R0,#124
  210. SWI OS_Byte
  211. BL defaultmouse
  212. LDMFD R13!,{PC}
  213.  
  214. .escapetest
  215. STMFD R13!,{R14}
  216. LDR R0,[R12,#v.demomode]
  217. CMP R0,#1
  218. CMPNE R0,#2
  219. BNE normaltest
  220. SWI OS_ReadEscapeState
  221. LDMCCFD R13!,{PC}
  222. MOV R0,#124
  223. SWI OS_Byte
  224. LDR R0,[R12,#v.menuno]
  225. CMP R0,#0
  226. MOV R0,#0
  227. STR R0,[R12,#v.menuno]
  228. LDMNEFD R13!,{PC}
  229. LDR R0,[R12,#v.menucsr]
  230. CMP R0,#6
  231. MOV R0,#6
  232. STR R0,[R12,#v.menucsr]
  233. LDMNEFD R13!,{PC}
  234. MOV R0,#1
  235. STR R0,[R12,#v.exit]
  236. #rept 7
  237. BL menufade
  238. BL menubank
  239. #endr
  240. LDMFD R13!,{PC}
  241.  
  242. .normaltest
  243. MOV R0,#-1
  244. STR R0,[R12,#v.lastmenu]
  245. MOV R3,#0
  246. SWI OS_ReadEscapeState
  247. BCS escapetrue
  248. BL gamenumberscan
  249. CMP R1,#137
  250. BLEQ emptykeybuf
  251. CMP R1,#137
  252. MOVEQ R3,#0
  253. BEQ escapetrue
  254. MOV R0,#0
  255. STR R0,[R12,#v.lastmenu]
  256.  
  257. CMP R3,#0
  258. LDMEQFD R13!,{PC}
  259. CMP R3,#6
  260. MOVEQ R3,#0
  261. .escapetrue
  262. STR R3,[R12,#v.menuno]
  263. LDR R0,[R12,#v.lastmenu]
  264. CMP R0,#0
  265. STRGE R3,[R12,#v.lastmenu]
  266. MOV R0,#1
  267. STR R0,[R12,#v.menucsr]
  268. MOV R0,#124
  269. SWI OS_Byte
  270. .escapeloop
  271. LDR R0,[R12,#v.lastmenu]
  272. CMP R0,#0
  273. LDR R0,[R12,#v.menuno]
  274. STRGE R0,[R12,#v.lastmenu]
  275. LDR R0,[R12,#v.menuno]
  276.  
  277. CMP R0,#2
  278. CMPNE R0,#3
  279. BNE slskip
  280. CMP R0,#2
  281. BLEQ escapesave
  282. CMP R0,#3
  283. BLEQ escapeload
  284. B slins
  285. .slskip
  286. BL menufade
  287.  
  288. BL demomenu
  289. BL menubank
  290. .slins
  291. LDR R0,[R12,#v.menuno]
  292. LDR R1,[R12,#v.lastmenu]
  293. CMP R0,R1
  294. LDMLTFD R13!,{PC}
  295. LDR R0,[R12,#v.loadedlev]
  296. CMP R0,#-1
  297. LDMEQFD R13!,{PC}
  298. SWI OS_ReadEscapeState
  299. BLCS escapeescape
  300. LDR R0,[R12,#v.exit]
  301. CMP R0,#1
  302. CMPNE R0,#2
  303. CMPNE R0,#3
  304. LDMEQFD R13!,{PC}
  305. B escapeloop
  306.  
  307. .escapeescape
  308. STMFD R13!,{R14}
  309. MOV R0,#0
  310. STR R0,[R12,#v.menuno]
  311. LDR R0,[R12,#v.menucsr]
  312. CMP R0,#6
  313. MOV R0,#6
  314. STRNE R0,[R12,#v.menucsr]
  315. MOV R0,#1
  316. STREQ R0,[R12,#v.exit]
  317. MOV R0,#124
  318. SWI OS_Byte
  319. LDMFD R13!,{PC}
  320.  
  321. .escapeload
  322. STMFD R13!,{R14}
  323. MOV R0,#1
  324. STR R0,[R12,#v.pending]
  325. MOV R0,#0
  326. STR R0,[R12,#v.menuno]
  327. LDR R0,[R12,#v.lastmenu]
  328. CMP R0,#0
  329. MOV R0,#3
  330. STRGE R0,[R12,#v.lastmenu]
  331. MOV R0,#3
  332. STR R0,[R12,#v.menucsr]
  333. MOV R0,#0
  334. BL loadmenu
  335. CMP R0,#"L"
  336. LDMNEFD R13!,{PC}
  337. MOV R0,#3
  338. STR R0,[R12,#v.exit]
  339. LDMFD R13!,{PC}
  340.  
  341. .escapesave
  342. STMFD R13!,{R14}
  343. LDR R0,[R12,#v.savestate]
  344. CMP R0,#1
  345. BEQ stopsave
  346. MOV R0,#3
  347. STR R0,[R12,#v.pending]
  348. LDR R0,[R12,#v.lastmenu]
  349. CMP R0,#0
  350. MOV R0,#2
  351. STRGE R0,[R12,#v.lastmenu]
  352. MOV R0,#0
  353. STR R0,[R12,#v.menuno]
  354. MOV R0,#2
  355. STR R0,[R12,#v.menucsr]
  356. BL savemenu
  357. LDMFD R13!,{PC}
  358.  
  359. .stopsave
  360. ADR R0,stopsavemes
  361. BL message
  362. BL message
  363. BL message
  364. MOV R0,#2
  365. STR R0,[R12,#v.exit]
  366. LDMFD R13!,{PC}
  367. .stopsavemes
  368. DCD 160<<12,108<<12,0,-1<<12,&00800001,0
  369. DCB "SAVE AVAILABLE",0
  370. ALIGN
  371. DCD 160<<12,128<<12,0,0,&00800001,0
  372. DCB "AT THE END OF",0
  373. ALIGN
  374. DCD 160<<12,148<<12,0,1<<12,&00800001,0
  375. DCB "THE LEVEL ONLY.",0
  376. ALIGN
  377.  
  378. .noblocks
  379. STMFD R13!,{R14}
  380. LDR R0,[R12,#v.levelno]
  381. TST R0,#&400
  382. LDMNEFD R13!,{PC}
  383. LDR R0,[R12,#v.newlevelctr]
  384. CMP R0,#0
  385. LDMGTFD R13!,{PC}
  386. MOV R0,#1
  387.  
  388. STR R0,[R12,#v.newlevelctr]
  389. BL newlevelmes
  390. LDMFD R13!,{PC}
  391.  
  392. .newlevel
  393. LDR R0,[R12,#v.newlevelctr]
  394. LDR R1,[R12,#v.frameinc]
  395. ADD R0,R0,R1
  396. STR R0,[R12,#v.newlevelctr]
  397. LDR R1,[R12,#v.levelno]
  398. TST R1,#&400
  399. MOV R1,#100
  400. MOVNE R1,#300
  401. CMP R0,R1
  402. BLT newlevelins
  403. MOV R0,#0
  404. STR R0,[R12,#v.newlevelctr]
  405. STR R0,[R12,#v.dead]
  406. LDR R0,[R12,#v.warped]
  407. BIC R0,R0,#1<<15
  408. CMP R0,#0
  409. BGT warplevel
  410. .warplevelins
  411. LDR R0,[R12,#v.levelno]
  412. BIC R0,R0,#&400
  413. ADD R0,R0,#1
  414. STR R0,[R12,#v.levelno]
  415. CMP R0,#42
  416. BLT lifeloop
  417. BL highscores
  418. BL demostart
  419. ADR R0,demendmes
  420. BL message
  421. B lifeloop
  422.  
  423. .warplevel
  424. LDR R0,[R12,#v.levelno]
  425. TST R0,#&400
  426. BNE warplevelins
  427. ORR R0,R0,#&400
  428. STR R0,[R12,#v.levelno]
  429. LDR R0,[R12,#v.warped]
  430. MOV R0,R0,LSR #16
  431. MOV R1,#250
  432. MUL R0,R1,R0
  433. STR R0,[R12,#v.warptime]
  434. B lifeloop
  435.  
  436. .demendmes
  437. DCD 160+&100<<12, 60<<12, -2<<12, 0, &01000001, 0
  438. DCB "GAME COMPLETED!",0
  439. ALIGN
  440.  
  441. .levelswap
  442. STMFD R13!,{R14}
  443. MOV R0,#ballstab
  444. SWI Amnesia_WipeTable
  445. MOV R0,#starstab
  446. SWI Amnesia_WipeTable
  447. MOV R0,#decortab
  448. SWI Amnesia_WipeTable
  449. LDR R1,[R12,#v.demomode]
  450. CMP R1,#1
  451. MOV R0,#texttab
  452. SWINE Amnesia_WipeTable
  453.  
  454.  
  455. BL loadlevel
  456. MOV R0,#ballstab
  457. SWI Amnesia_CountObjects
  458. CMP R0,#0
  459. BGT nomakeball
  460. LDR R3,[R12,#v.ballxhome]
  461. LDR R4,[R12,#v.ballyhome]
  462. BL makeball
  463. BL homebat
  464. .nomakeball
  465. LDR R1,[R12,#v.demomode]
  466. CMP R1,#1
  467. BLNE levstartmes
  468. LDR R0,[R12,#v.levelno]
  469. CMP R0,#1
  470. LDMEQFD R13!,{PC}
  471. LDR R1,[R12,#v.savestate]
  472. CMP R1,#1
  473. MOVEQ R1,#8
  474. STREQ R1,[R12,#v.pending] 
  475. LDMFD R13!,{PC}
  476.  
  477. .levstartmes
  478. LDR R0,[R12,#v.levelno]
  479. TST R0,#&400
  480. BNE warpstartmes
  481. STMFD R13!,{R14}
  482. BL intromes
  483. LDR R0,[R12,#v.levelno]
  484. CMP R0,#1
  485. BLEQ gamestartmes
  486. LDR R0,[R12,#v.levelno]
  487. ADR R1,levelnotext
  488. MOV R2,#8
  489. SWI XOS_ConvertCardinal2
  490. LDR R0,[R12,#v.blocksleft]
  491. ADR R1,blocknumtext
  492. MOV R2,#8
  493. SWI XOS_ConvertCardinal2
  494. LDR R0,[R12,#v.blocksleft]
  495. ADR R1,blocknumtext2
  496. MOV R2,#8
  497. SWI XOS_ConvertCardinal2
  498.  
  499. ADR R0,levstarttext
  500. BL message
  501. ADR R0,levstarttext2
  502. BL message
  503. ADR R0,levstarttext3
  504. BL message
  505. BL writeblocksleft
  506. LDMFD R13!,{PC}
  507.  
  508. .levstarttext
  509. DCD 160<<12,74<<12,0,0,&800001,0
  510. DCB "LEVEL "
  511. .levelnotext
  512. DBB 8
  513. DCB 0
  514. ALIGN
  515. .levstarttext2
  516. DCD 160<<12,128<<12,0,0,&800001,blocklinktext-levstarttext2
  517. .blocknumtext
  518. DBB 8
  519. DCB 0
  520. ALIGN
  521. .levstarttext3
  522. DCD 160<<12,148<<12,0,0,&800001,0
  523. DCB "BLOCKS TO HIT",0
  524. ALIGN
  525.  
  526. .blocklinktext
  527. DCD 160<<12,128<<12,-3<<12,13<<10,&1F0001,blockslefttext-blocklinktext
  528. .blocknumtext2
  529. DBB 8
  530. DCB 0
  531. ALIGN
  532.  
  533. .warpstartmes
  534. STMFD R13!,{R14}
  535. BL intromes
  536. LDR R0,[R12,#v.warptime]
  537. MOV R1,#250
  538. MYDIV R3,R0,R1
  539. MOV R0,R3
  540. ADR R1,warpnumtext
  541. MOV R2,#8
  542. SWI XOS_ConvertCardinal2
  543. MOV R0,R3
  544. ADR R1,warpnumtext2
  545. MOV R2,#8
  546. SWI XOS_ConvertCardinal2
  547. LDR R0,[R12,#v.warptime]
  548. MOV R1,#50
  549. MYDIV R3,R0,R1
  550. MOV R0,R3
  551. ADR R1,warptimetext
  552. MOV R2,#8
  553. SWI XOS_ConvertCardinal2
  554. MOV R0,R3
  555. ADR R1,warptimetext2
  556. MOV R2,#8
  557. SWI XOS_ConvertCardinal2
  558.  
  559. ADR R0,warpstarttext
  560. BL message
  561. BL message
  562. BL message
  563. ADR R0,warpstarttext3
  564. BL message
  565. BL message
  566.  
  567. ADR R0,warpstarttext2
  568. BL message
  569. BL writetimeleft
  570. LDMFD R13!,{PC}
  571.  
  572. .warpstarttext
  573. DCD 160<<12,70<<12,0,0,&400001,0
  574. DCB "BONUS LEVEL",0
  575. ALIGN
  576. DCD 160<<12,90<<12,0,0,&500001,0
  577. DCB "NUMBER OF BALLS",0
  578. ALIGN
  579. DCD 160<<12,130<<12,0,0,&700001,0
  580. DCB "TIME = 5 X "
  581. .warpnumtext2
  582. DBB 8
  583. DCB 0
  584. ALIGN
  585. .warpstarttext3
  586. DCD 160<<12,170<<12,0,0,&900001,0
  587. DCB "SECONDS",0
  588. ALIGN
  589. DCD 160<<12,110<<12,0,0,&600001,0
  590. DCB "WARPED = "
  591. .warpnumtext
  592. DBB 8
  593. DCB 0
  594. ALIGN
  595.  
  596.  
  597. .warpstarttext2
  598. DCD 160<<12,150<<12,0,0,&800001,warplinktext-warpstarttext2
  599. .warptimetext
  600. DBB 8
  601. DCB 0
  602. ALIGN
  603.  
  604. .warplinktext
  605. DCD 160<<12,150<<12,-3<<12,41<<8,&1F0001,timelefttext-warplinktext
  606. .warptimetext2
  607. DBB 8
  608. DCB 0
  609. ALIGN
  610.  
  611. .intromes
  612. STMFD R13!,{R14}
  613. LDR R11,[R12,#v.levelnet]
  614. ADD R10,R11,#net.text1
  615. ADR R9,introtext1mes
  616. MOV R8,#32
  617. .loop8d
  618. LDR R0,[R10],#4
  619. STR R0,[R9],#4
  620. SUBS R8,R8,#4
  621. BGT loop8d
  622. ADD R10,R11,#net.text2
  623. ADR R9,introtext2mes
  624. MOV R8,#32
  625. .loop8c
  626. LDR R0,[R10],#4
  627. STR R0,[R9],#4
  628. SUBS R8,R8,#4
  629. BGT loop8c
  630. ADR R0,introtext1
  631. BL message
  632. ADR R0,introtext2
  633. BL message
  634. LDMFD R13!,{PC}
  635. .introtext1
  636. DCD 160<<12,20<<12,0,0,&00800001,0
  637. .introtext1mes
  638. DBB 32
  639. DCB 0
  640. ALIGN
  641. .introtext2
  642. DCD 160<<12,40<<12,0,0,&00800001,0
  643. .introtext2mes
  644. DBB 32
  645. DCB 0
  646. ALIGN
  647.  
  648.  
  649.  
  650.  
  651. .gamestartmes
  652. STMFD R13!,{R14}
  653. LDR R1,[R12,#v.diff]
  654. ADR R0,levbeginner
  655. CMP R1,#2
  656. ADREQ R0,levexpert
  657. CMP R1,#3
  658. ADREQ R0,levpsychic
  659. BL message
  660. LDMFD R13!,{PC}
  661. .levbeginner
  662. DCD 160<<12,200<<12,0,0<<12,&800001,0
  663. DCB "LEVEL : BEGINNER",0
  664. ALIGN
  665. .levexpert
  666. DCD 160<<12,200<<12,0,0<<12,&800001,0
  667. DCB "LEVEL : EXPERT",0
  668. ALIGN
  669. .levpsychic
  670. DCD 160<<12,200<<12,0,0<<12,&800001,levpsychic2 - levpsychic
  671. DCB "LEVEL : PSYCHIC!",0
  672. ALIGN
  673. .levpsychic2
  674. DCD 160<<12,200<<12,0,0<<12,&400001,0
  675. DCB "GOOD LUCK!",0
  676. ALIGN
  677.  
  678. .newlevelmes
  679. STMFD R13!,{R14}
  680. ADR R0,newleveltext
  681. BL message
  682. LDMFD R13!,{PC}
  683.  
  684. .newleveltext
  685. DCD 160<<12,128<<12,0,0<<12,&400001,0
  686. DCB "LEVEL COMPLETE",0
  687. ALIGN
  688.  
  689. .warpendmes
  690. STMFD R13!,{R14}
  691. ADR R0,warpendtext
  692. BL message
  693. BL message
  694. LDMFD R13!,{PC}
  695.  
  696. .warpendtext
  697. DCD 160<<12,40<<12,0,0<<12,&400001,0
  698. DCB "OUT OF TIME",0
  699. ALIGN
  700. DCD 160<<12,220<<12,0,0<<12,&400001,0
  701. DCB "BONUS LEVEL OVER",0
  702. ALIGN
  703.  
  704. .warpdiemes
  705. STMFD R13!,{R14}
  706. ADR R0,warpdietext
  707. BL message
  708. LDMFD R13!,{PC}
  709.  
  710. .warpdietext
  711. DCD 160<<12,220<<12,0,0<<12,&400001,0
  712. DCB "BONUS LEVEL OVER",0
  713. ALIGN
  714.  
  715. .runclocks
  716. STMFD R13!,{R14}
  717. ADD R1,R12,#v.warptimer
  718. MOV R2,#7
  719. .loop83
  720. LDR R0,[R1]
  721. TST R0,#&100
  722. ADDEQ R0,R0,#16
  723. ADDNE R0,R0,#8
  724. STR R0,[R1],#4
  725. SUBS R2,R2,#1
  726. BGT loop83
  727. LDR R0,[R12,#v.levelno]
  728. TST R0,#&400
  729. LDMEQFD R13!,{PC}
  730. BL writetimeleft
  731. LDR R0,[R12,#v.warptime]
  732. SUB R0,R0,#1
  733. CMP R0,#0
  734. STRGE R0,[R12,#v.warptime]
  735. CMP R0,#1
  736. BLEQ warpendmes
  737. LDR R0,[R12,#v.dead]
  738. CMP R0,#1
  739. BLEQ endwarp
  740. CMP R0,#50
  741. BLEQ warpdiemes
  742. LDR R0,[R12,#v.newlevelctr]
  743. CMP R0,#20
  744. BLGE warpexithandler
  745.  
  746. LDR R0,[R12,#v.warptime]
  747. CMP R0,#0
  748. BLLE endwarp
  749. LDMFD R13!,{PC}
  750.  
  751. .endwarp
  752. STMFD R13!,{R0,R14}
  753. LDR R0,[R12,#v.newlevelctr]
  754. CMP R0,#0
  755. LDMNEFD R13!,{R0,PC}
  756. MOV R0,#1
  757. STR R0,[R12,#v.newlevelctr]
  758. LDMFD R13!,{R0,PC}
  759.  
  760. .warpexithandler
  761.  
  762. STMFD R13!,{R14}
  763. LDR R0,[R12,#v.warped]
  764. CMP R0,#1<<15
  765. LDMEQFD R13!,{PC}
  766. AND R0,R0,#&FF
  767. MOV R1,#500
  768. MUL R1,R0,R1
  769. MOV R6,R1
  770. LDR R2,[R12,#v.plscore]
  771. ADD R2,R2,R1
  772. STR R2,[R12,#v.plscore]
  773. MOV R0,R1
  774. ADR R1,warphannum2
  775. MOV R2,#8
  776. SWI XOS_ConvertCardinal4
  777. LDR R0,[R12,#v.warped]
  778. AND R0,R0,#&FF
  779. ADR R1,warphannum1
  780. MOV R2,#8
  781. SWI XOS_ConvertCardinal2
  782. ADR R0,warphantext
  783. BL message
  784. BL message
  785. BL message
  786. ADR R0,warphantext2
  787. BL message
  788. LDR R2,[R12,#v.warptime]
  789. MOV R1,#50
  790.  
  791. MYDIV R3,R2,R1
  792. MOV R1,#50
  793. MUL R1,R3,R1
  794. ADD R6,R6,R1
  795. LDR R2,[R12,#v.plscore]
  796. ADD R2,R2,R1
  797. STR R2,[R12,#v.plscore]
  798. MOV R0,R1
  799. ADR R1,warphantime2
  800. MOV R2,#8
  801. SWI XOS_ConvertCardinal4
  802. MOV R0,R3
  803. ADR R1,warphantime1
  804. MOV R2,#8
  805. SWI XOS_ConvertCardinal2
  806. ADR R0,timebonustext
  807. BL message
  808. BL message
  809. ADR R0,timebonustext2
  810. BL message
  811. LDR R5,[R12,#v.hinames]
  812. ADD R5,R5,#192
  813. LDR R0,[R12,#v.levelno]
  814. BICS R0,R0,#&400
  815. MOVMI R0,#0
  816. CMP R0,#50
  817. MOVGE R0,#0
  818. ADD R5,R5,R0,LSL #2
  819. LDR R7,[R5]
  820. CMP R6,R7
  821. STRGT R6,[R5]
  822. MOV R0,R6
  823. ADR R1,warptotal
  824. MOV R2,#8
  825. SWI XOS_ConvertCardinal4
  826. MOV R0,R7
  827. ADR R1,warprecord
  828. MOV R2,#8
  829. SWI XOS_ConvertCardinal4
  830. ADR R0,warptotaltext
  831. BL message
  832. ADR R0,warprecordtext
  833. BL message
  834. CMP R6,R7
  835. BLGT hisave
  836. MOV R0,#1<<15
  837. STR R0,[R12,#v.warped]
  838. LDMFD R13!,{PC}
  839.  
  840. .warphantext
  841. DCD 160<<12,80<<12,0,0,&800001,0
  842. DCB "BONUS FOR BALLS",0
  843. ALIGN
  844. DCD 160<<12,100<<12,0,0,&900001,0
  845. DCB "RETURNED",0
  846. ALIGN
  847. DCD 96<<12,120<<12,0,0,&A00001,0
  848. DCB "500 X "
  849. .warphannum1
  850. DBB 8
  851. DCB 0
  852. ALIGN
  853. .warphantext2
  854. DCD 224<<12,120<<12,0,0,&A00001,0
  855. DCB "= "
  856. .warphannum2
  857. DBB 8
  858. DCB 0
  859. ALIGN
  860. .timebonustext
  861. DCD 160<<12,140<<12,0,0,&B00001,0
  862. DCB "TIME BONUS",0
  863. ALIGN
  864. DCD 96<<12,160<<12,0,0,&C00001,0
  865. DCB "50 X "
  866. .warphantime1
  867. DBB 8
  868. DCB 0
  869. ALIGN
  870. .timebonustext2
  871. DCD 224<<12,160<<12,0,0,&C00001,0
  872. DCB "= "
  873. .warphantime2
  874. DBB 8
  875. DCB 0
  876. ALIGN
  877.  
  878.  
  879. .warptotaltext
  880. DCD 160<<12,180<<12,0,0,&D00001,0
  881. DCB "TOTAL BONUS ="
  882. .warptotal
  883. DBB 8
  884. DCB 0
  885. ALIGN
  886. .warprecordtext
  887. DCD 160<<12,200<<12,0,0,&E00001,0
  888. DCB "RECORD ="
  889. .warprecord
  890. DBB 8
  891. DCB 0
  892. ALIGN
  893.  
  894.  
  895. .plmove
  896. STMFD R13!,{R14}
  897. LDR R0,[R12,#v.buttons]
  898. STR R0,[R12,#v.lastbuttons]
  899. SWI OS_Mouse
  900. LDR R3,[R12,#v.demomode]
  901. CMP R3,#1
  902. BLEQ demoread
  903. LDR R3,[R12,#v.demomode]
  904. CMP R3,#2
  905. BLEQ demowrite
  906.  
  907. STR R2,[R12,#v.buttons]
  908. STMFD R13!,{R0,R1}
  909. SUB R3,R0,#640
  910. RSB R4,R1,#512
  911. LDR R0,[R12,#v.mousesens]
  912. MOV R3,R3,ASL R0
  913. MOV R4,R4,ASL R0
  914. LDR R1,[R12,#v.xpos]
  915. LDR R2,[R12,#v.ypos]
  916. ADD R5,R1,R3
  917. ADD R6,R2,R4
  918. LDR R7,[R12,#v.xlim]
  919. CMN R1,R7
  920. BLE xlowstop
  921. CMP R1,R7
  922. BGE xhighstop
  923. .xstopins
  924. LDR R7,[R12,#v.ylim]
  925. CMN R2,R7
  926. BLE ylowstop
  927. CMP R2,R7
  928. BGE yhighstop
  929. .ystopins
  930. ADD R1,R1,R3
  931. ADD R2,R2,R4
  932. STR R1,[R12,#v.xpos]
  933. STR R2,[R12,#v.ypos]
  934. MOV R2,#3<<24
  935. STR R2,[R12,#v.osblock0]
  936. LDMFD R13!,{R0,R1}
  937. LDR R2,[R12,#v.mousesens]
  938. MOV R5,R3
  939. CMP R5,#0
  940. RSBLT R5,R5,#0
  941. CMP R5,#1<<8
  942. MOVLE R0,#640
  943. BLE xmoveskip
  944. CMP R3,#0
  945. SUBGT R0,R0,R2,LSR #1
  946. ADDLT R0,R0,R2,LSR #1
  947. .xmoveskip
  948. MOV R5,R4
  949. CMP R5,#0
  950. RSBLT R5,R5,#0
  951. CMP R5,#1<<8
  952. MOVLE R1,#512
  953. BLE ymoveskip
  954. CMP R4,#0
  955. SUBLT R1,R1,R2,LSR #1
  956. ADDGT R1,R1,R2,LSR #1
  957. .ymoveskip
  958. LDR R2,[R12,#v.buttons]
  959. ORR R0,R0,R1,LSL #16
  960. STR R0,[R12,#v.osblock1]
  961. ADD R1,R12,#v.osblock0+3
  962. MOV R0,#21
  963. SWI OS_Word
  964.  
  965.  
  966. LDMFD R13!,{PC}
  967.  
  968. .xlowstop
  969. CMP R3,#0
  970. MOVLT R3,#0
  971. RSBLT R1,R7,#0
  972. B xstopins
  973. .xhighstop
  974. CMP R3,#0
  975. MOVGT R3,#0
  976. MOVGT R1,R7
  977. B xstopins
  978. .ylowstop
  979. CMP R4,#0
  980. MOVLT R4,#0
  981. RSBLT R2,R7,#0
  982. B ystopins
  983. .yhighstop
  984. CMP R4,#0
  985. MOVGT R4,#0
  986. MOVGT R2,R7
  987. B ystopins
  988.  
  989.  
  990. .demoread
  991. STMFD R13!,{R14}
  992. LDR R3,[R12,#v.demoadr]
  993. LDR R4,[R12,#v.democtr]
  994. LDR R5,[R3]
  995. CMP R4,R5
  996. BGE demoend
  997. LDR R0,[R3,R4]
  998. AND R1,R0,#&3FFF<<16
  999. MOV R1,R1,LSR #16
  1000. AND R2,R0,#3<<30
  1001. MOV R2,R2,LSR #29
  1002. AND R0,R0,#&3FFF
  1003. LDR R3,[R12,#v.democtr]
  1004. ADD R3,R3,#4
  1005. STR R3,[R12,#v.democtr]
  1006. MOV R3,#0
  1007. STR R3,[R12,#v.dead]
  1008. .demoreadins
  1009. LDMFD R13!,{PC}
  1010.  
  1011. .demoend
  1012. LDR R3,[R12,#v.dead]
  1013. ADD R3,R3,#1
  1014. STR R3,[R12,#v.dead]
  1015.  
  1016. MOV R0,#640
  1017. MOV R1,#496
  1018. MOV R2,#0
  1019. B demoreadins
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025. .demowrite
  1026. STMFD R13!,{R0-R2,R14}
  1027. LDR R3,[R12,#v.demoadr]
  1028. LDR R4,[R12,#v.democtr]
  1029. AND R0,R0,#&3FFF
  1030. AND R1,R1,#&3FFF
  1031. ORR R0,R0,R1,LSL #16
  1032. MOV R2,R2,LSR #1
  1033. ORR R0,R0,R2,LSL #30
  1034. STR R0,[R3,R4]
  1035. ADD R4,R4,#4
  1036. STR R4,[R12,#v.democtr]
  1037. CMP R4,#demolen
  1038. LDMLTFD R13!,{R0-R2,PC}
  1039. LDR R0,[R12,#v.demoadr]
  1040. ADR R1,demosavename
  1041. MOV R2,#&FFD
  1042. SWI Amnesia_SaveFile
  1043. LDR R0,[R12,#v.demoadr]
  1044. SWI Amnesia_ReleaseBlock
  1045. MOV R0,#0
  1046. STR R0,[R12,#v.demoadr]
  1047. STR R0,[R12,#v.demomode]
  1048. ADR R0,savedmessage
  1049. BL message
  1050. LDMFD R13!,{R0-R2,PC}
  1051.  
  1052. .demosavename
  1053. DCB "OddBall:Demo.Demo",0
  1054. ALIGN
  1055.  
  1056. .savedmessage
  1057. DCD 160<<12,128<<12,0,0,&01000001,0
  1058. DCB "DEMO SAVED",0
  1059. ALIGN
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065. .setplotoffset
  1066. STMFD R13!,{R14}
  1067. LDR R0,[R12,#v.plxcent]
  1068. LDR R1,[R12,#v.plycent]
  1069. SUB R0,R0,#plxcent
  1070. SUB R1,R1,#plycent
  1071. BIC R0,R0,#&FFF
  1072. BIC R1,R1,#&FFF
  1073. RSB R0,R0,#0
  1074. RSB R1,R1,#0
  1075. LDR R2,[R12,#v.plxcent]
  1076. ADD R0,R0,#((canvaswidth-windwidth)<<11)
  1077. STR R0,[R12,#v.xplotofs]
  1078. STR R1,[R12,#v.yplotofs]
  1079. BIC R0,R0,#&3FFF
  1080. SWI Amnesia_SetPlotOffset
  1081. LDR R0,[R12,#v.xplotofs]
  1082. MOV R0,R0,ASR #12
  1083. AND R0,R0,#3
  1084. RSB R0,R0,#3
  1085. STR R0,[R12,#v.plotnibble]
  1086. LDMFD R13!,{PC}
  1087.  
  1088. .movecent
  1089. STMFD R13!,{R14}
  1090. LDR R0,[R12,#v.dead]
  1091. CMP R0,#0
  1092. BEQ normalcent
  1093. LDR R0,[R12,#v.batpresent]
  1094. CMP R0,#0
  1095. LDMEQFD R13!,{PC}
  1096. .deadcent
  1097. LDR R1,[R12,#v.ballxpos]
  1098. LDR R0,[R12,#v.plxcent]
  1099. SUB R2,R0,R1
  1100. MOV R2,R2,ASR #3
  1101. CMP R2,#0
  1102. RSBLT R2,R2,#0
  1103. CMP R2,#32<<12
  1104. MOVGT R2,#32<<12
  1105. CMP R0,R1
  1106. SUBGT R0,R0,R2
  1107. ADDLT R0,R0,R2
  1108. BIC R0,R0,#&FFF
  1109. STR R0,[R12,#v.plxcent]
  1110.  
  1111. LDR R1,[R12,#v.ballypos]
  1112. LDR R0,[R12,#v.plycent]
  1113. SUB R2,R0,R1
  1114. MOV R2,R2,ASR #3
  1115. CMP R2,#0
  1116. RSBLT R2,R2,#0
  1117. CMP R2,#32<<12
  1118. MOVGT R2,#32<<12
  1119. CMP R0,R1
  1120. SUBGT R0,R0,R2
  1121. ADDLT R0,R0,R2
  1122. BIC R0,R0,#&FFF
  1123. STR R0,[R12,#v.plycent]
  1124. LDMFD R13!,{PC}
  1125.  
  1126. .normalcent
  1127. LDR R2,[R12,#v.xpos]
  1128. LDR R3,[R12,#v.ballxpos]
  1129. SUB R0,R3,R2
  1130. LDR R2,[R12,#v.ypos]
  1131. ADD R2,R2,#128<<12; for ball above bat
  1132. LDR R3,[R12,#v.ballypos]
  1133. SUB R1,R3,R2
  1134. MOV R0,R0,ASR #2
  1135. MOV R1,R1,ASR #2
  1136. MOV R2,#64<<12; max vector length
  1137. BL slideback
  1138. LDR R2,[R12,#v.xpos]
  1139. ADD R2,R2,R0
  1140. LDR R3,[R12,#v.plxcent]
  1141. SUB R4,R2,R3
  1142. LDR R2,[R12,#v.xvec]
  1143. SUB R4,R4,R2
  1144. CMP R4,#4<<12
  1145. MOVGT R4,#4<<12
  1146. CMP R4,#-4<<12
  1147. MOVLT R4,#-4<<12
  1148. ADD R4,R4,R2
  1149. ADD R3,R3,R4
  1150. STR R3,[R12,#v.plxcent]
  1151. LDR R2,[R12,#v.ypos]
  1152. ADD R2,R2,R1
  1153. LDR R3,[R12,#v.plycent]
  1154. SUB R4,R2,R3
  1155. LDR R2,[R12,#v.yvec]
  1156. SUB R4,R4,R2
  1157. CMP R4,#4<<12
  1158. MOVGT R4,#4<<12
  1159. CMP R4,#-4<<12
  1160. MOVLT R4,#-4<<12
  1161. ADD R4,R4,R2
  1162. ADD R3,R3,R4
  1163. STR R3,[R12,#v.plycent]
  1164. LDMFD R13!,{PC}
  1165.  
  1166. .justmovedbat
  1167. STMFD R13!,{R14}
  1168. MOV R0,#batstab
  1169. MOV R1,#0
  1170. MOV R2,#1
  1171. SWI Amnesia_SelectTable
  1172. .loop19
  1173. SWI Amnesia_ProcessTable
  1174. STMFD R13!,{R0-R1}
  1175. TST R2,#1<<10
  1176. BLNE sortbat
  1177. CMP R2,#0
  1178. LDMFD R13!,{R0-R1}
  1179. BNE loop19
  1180. LDMFD R13!,{PC}
  1181.  
  1182.  
  1183. .processbat
  1184. STMFD R13!,{R14}
  1185. MOV R0,#0
  1186. STR R0,[R12,#v.batpresent]
  1187. MOV R0,#batstab
  1188. MOV R1,#0
  1189. LDR R2,[R12,#v.masterplot]
  1190. SWI Amnesia_SelectTable
  1191. .loop5
  1192. SWI Amnesia_ProcessTable
  1193. STMFD R13!,{R0-R2}
  1194. TST R2,#1<<10
  1195. BLNE movebat
  1196. LDMFD R13!,{R0-R2}
  1197. CMP R2,#0
  1198. BNE loop5
  1199. LDR R0,[R12,#v.batpresent]
  1200. CMP R0,#0
  1201. LDMNEFD R13!,{PC}
  1202. LDR R0,[R12,#v.dead]
  1203. ADD R0,R0,#1
  1204. STR R0,[R12,#v.dead]
  1205. LDMFD R13!,{PC}
  1206.  
  1207. .movebat
  1208. STMFD R13!,{R0-R2,R14}
  1209. MOV R3,#1
  1210. STR R3,[R12,#v.batpresent]
  1211. MOV R3,#&FF
  1212. BL scanadd
  1213. MOV R2,R1
  1214. LDR R0,[R12,#v.xpos]
  1215. ;ADD R0,R0,#1<<12      ; for hardscrolling only.
  1216. ;BIC R0,R0,#1<<12      ;
  1217. LDR R1,[R2,#8]
  1218. SUB R3,R0,R1
  1219. STR R0,[R2,#8]
  1220. LDR R0,[R12,#v.ypos]
  1221. LDR R1,[R2,#12]
  1222. SUB R4,R0,R1
  1223. STR R0,[R2,#12]
  1224. STR R3,[R2,#16]
  1225. STR R3,[R12,#v.xvec]
  1226. STR R4,[R2,#20]
  1227. STR R4,[R12,#v.yvec]
  1228. LDMFD R13!,{R0-R2,PC}
  1229.  
  1230. .sortbat
  1231. STMFD R13!,{R0-R2,R14}
  1232. MOV R2,R1
  1233. LDR R0,[R12,#v.xpos]
  1234. ;ADD R0,R0,#1<<12      ; for hardscrolling only.
  1235. ;BIC R0,R0,#1<<12      ;
  1236. STR R0,[R2,#8]
  1237. LDR R0,[R12,#v.ypos]
  1238. STR R0,[R2,#12]
  1239. MOV R3,#0
  1240. STR R3,[R2,#16]
  1241. STR R3,[R12,#v.xvec]
  1242. STR R3,[R2,#20]
  1243. STR R3,[R12,#v.yvec]
  1244. LDMNEFD R13!,{R0-R2,PC}
  1245.  
  1246.  
  1247. .processblocks
  1248. STMFD R13!,{R14}
  1249. MOV R0,#blockstab
  1250. MOV R1,#0
  1251. LDR R2,[R12,#v.masterplot]
  1252. SWI Amnesia_SelectTable
  1253. MOV R3,#0
  1254. .loopf
  1255. SWI Amnesia_ProcessTable
  1256. TST R2,#1<<8
  1257. BLNE blocktimer
  1258. TST R2,#1<<10
  1259. BLNE blockattn
  1260. CMP R2,#0
  1261. BNE loopf
  1262. LDMFD R13!,{PC}
  1263.  
  1264. .blockattn
  1265. STMFD R13!,{R0-R3,R14}
  1266. LDR R3,[R1,#4]
  1267. TST R3,#1<<24
  1268. BNE vertblock
  1269. .horizblock
  1270. LDR R3,[R1,#8]
  1271. LDR R5,[R1,#32]
  1272. CMP R3,R5
  1273. BLLE blockrefright
  1274. LDR R5,[R1,#36]
  1275. CMP R3,R5
  1276. BLGE blockrefleft
  1277. .blockattnins
  1278. LDR R3,[R1,#4]
  1279. TST R3,#1<<20
  1280. TSTNE R3,#1<<25
  1281. BLNE remorph
  1282. LDR R3,[R12,#v.scanspeed]
  1283. CMP R3,#1
  1284. MOV R3,#&8F
  1285. BLGT scanadd
  1286.  
  1287. LDMFD R13!,{R0-R3,PC}
  1288.  
  1289. .vertblock
  1290. LDR R3,[R1,#12]
  1291. LDR R5,[R1,#32]
  1292. CMP R3,R5
  1293. BLLE blockrefdown
  1294. LDR R5,[R1,#36]
  1295. CMP R3,R5
  1296. BLGE blockrefup
  1297. B blockattnins
  1298. .blockrefright
  1299. LDR R4,[R1,#16]
  1300. RSBS R4,R4,#0
  1301. STRGT R4,[R1,#16]
  1302. LDRGT R4,[R1,#4]
  1303. ORRGT R4,R4,#1<<20
  1304. STRGT R4,[R1,#4]
  1305. MOV PC,R14
  1306. .blockrefleft
  1307. LDR R4,[R1,#16]
  1308. RSBS R4,R4,#0
  1309. STRLT R4,[R1,#16]
  1310. LDRLT R4,[R1,#4]
  1311. ORRLT R4,R4,#1<<20
  1312. STRLT R4,[R1,#4]
  1313. MOV PC,R14
  1314. .blockrefdown
  1315. LDR R4,[R1,#20]
  1316. RSBS R4,R4,#0
  1317. STRGT R4,[R1,#20]
  1318. LDRGT R4,[R1,#4]
  1319. ORRGT R4,R4,#1<<20
  1320. STRGT R4,[R1,#4]
  1321. MOV PC,R14
  1322. .blockrefup
  1323. LDR R4,[R1,#20]
  1324. RSBS R4,R4,#0
  1325. STRLT R4,[R1,#20]
  1326. LDRLT R4,[R1,#4]
  1327. ORRLT R4,R4,#1<<20
  1328. STRLT R4,[R1,#4]
  1329. MOV PC,R14
  1330.  
  1331.  
  1332. .blocktimer
  1333. MOV R3,#0
  1334. STR R3,[R1,#24]
  1335. LDR R3,[R1,#4]
  1336. ORR R3,R3,#1<<2
  1337. STR R3,[R1,#4]
  1338. MOV PC,R14
  1339.  
  1340. .remorph
  1341. STMFD R13!,{R0-R4,R9,R14}
  1342. MOV R9,R1
  1343. MOV R0,#&00020001
  1344. STR R0,[R9,#24]
  1345. MOV R0,#%1000010101
  1346. STR R0,[R9,#4]
  1347. MOV R0,#0
  1348. STR R0,[R9,#16]
  1349. STR R0,[R9,#20]
  1350. LDR R0,[R9,#8]
  1351. LDR R1,[R9,#12]
  1352. BL translate
  1353. LDMVSFD R13!,{R0-R4,R9,PC}
  1354. MOV R0,#&A0
  1355. STRB R0,[R4]
  1356. LDMFD R13!,{R0-R4,R9,PC}
  1357.  
  1358. .processstars
  1359. STMFD R13!,{R14}
  1360. MOV R0,#starstab
  1361. ORR R0,R0,#1<<31
  1362. MOV R1,#0
  1363. LDR R2,[R12,#v.masterplot]
  1364. SWI Amnesia_SelectTable
  1365. .loops
  1366. SWI Amnesia_ProcessTable
  1367. STMFD R13!,{R0-R1}
  1368. TST R2,#1<<31
  1369. BLNE stareffect
  1370. LDMFD R13!,{R0-R1}
  1371. CMP R2,#0
  1372. BNE loops
  1373. LDMFD R13!,{PC}
  1374.  
  1375. .stareffect
  1376. STMFD R13!,{R0-R2,R14}
  1377. MOV R3,#&78
  1378. BL scanadd
  1379. LDR R3,[R1,#20]
  1380. CMP R3,#2<<12
  1381. BLT staractive
  1382.  
  1383. SUB R3,R3,R3,ASR #4
  1384. STR R3,[R1,#20]
  1385. LDMFD R13!,{R0-R2,PC}
  1386. .staractive
  1387. LDR R3,[R1,#4]
  1388. ORR R3,R3,#1<<7
  1389. STR R3,[R1,#4]
  1390. BL starflash
  1391. LDMFD R13!,{R0-R2,PC}
  1392.  
  1393.  
  1394. .starflash
  1395. STMFD R13!,{R0-R2,R14}
  1396. LDR R3,[R1,#8]
  1397. LDR R4,[R1,#12]
  1398. BL random
  1399. AND R0,R0,#&3F000
  1400. SUB R0,R0,#&1F000
  1401. MOV R5,R0,ASR #3
  1402. ADD R3,R3,R0
  1403. BL random
  1404. AND R0,R0,#&3F000
  1405. SUB R0,R0,#&1F000
  1406. MOV R6,R0,ASR #3
  1407. ADD R4,R4,R0
  1408. LDR R1,[R1,#32]
  1409. AND R1,R1,#&F
  1410. BL gdecorate
  1411. LDMFD R13!,{R0-R2,PC}
  1412.  
  1413. .glintflash
  1414. STMFD R13!,{R0-R2,R14}
  1415. LDR R3,[R1,#8]
  1416. LDR R4,[R1,#12]
  1417. BL random
  1418. AND R0,R0,#&3F000
  1419. SUB R0,R0,#&1F000
  1420. ADD R3,R3,R0
  1421. BL random
  1422. AND R0,R0,#&3F000
  1423. SUB R0,R0,#&1F000
  1424. ADD R4,R4,R0
  1425. MOV R1,#2
  1426. BL decorate
  1427. LDMFD R13!,{R0-R2,PC}
  1428.  
  1429.  
  1430. .processdecor
  1431. STMFD R13!,{R14}
  1432. MOV R0,#decortab+(&0f<<24)
  1433. MOV R1,#0
  1434. LDR R2,[R12,#v.masterplot]
  1435. SWI Amnesia_SelectTable
  1436. .loopr
  1437. SWI Amnesia_ProcessTable
  1438. TST R2,#1<<8
  1439. BLNE turntoglint
  1440. TST R2,#1<<24
  1441. BLNE decorslow
  1442. CMP R2,#0
  1443. BNE loopr
  1444.  
  1445. LDMFD R13!,{PC}
  1446. .turntoglint
  1447. MOV R3,#0
  1448. STR R3,[R1,#16]
  1449. STR R3,[R1,#20]
  1450. LDR R3,[R1,#4]
  1451. BIC R3,R3,#1<<8
  1452. ORR R3,R3,#%1000100000
  1453.  
  1454. STR R3,[R1,#4]
  1455. MOV R3,#(decortab<<24)+2
  1456. STR R3,[R1,#0]
  1457. MOV R3,#&03000080
  1458. STR R3,[R1,#24]
  1459. MOV PC,R14
  1460.  
  1461. .decorslow
  1462. LDR R3,[R1,#16]
  1463. LDR R4,[R1,#32]
  1464. ADD R3,R3,R4
  1465. STR R3,[R1,#16]
  1466. LDR R3,[R1,#20]
  1467. LDR R4,[R1,#36]
  1468. ADD R3,R3,R4
  1469. STR R3,[R1,#20]
  1470. MOV PC,R14
  1471.  
  1472.  
  1473. .processedge
  1474. STMFD R13!,{R14}
  1475. BL stretchplotwindow
  1476. MOV R0,#edgetab
  1477. MOV R1,#0
  1478. LDR R2,[R12,#v.masterplot]
  1479. SWI Amnesia_SelectTable
  1480. .loop34
  1481. SWI Amnesia_ProcessTable
  1482. CMP R2,#0
  1483. BNE loop34
  1484. BL resetplotwindow
  1485. LDMFD R13!,{PC}
  1486.  
  1487. .processbullets
  1488. STMFD R13!,{R14}
  1489. MOV R0,#bulletstab
  1490. MOV R1,#0
  1491. LDR R2,[R12,#v.masterplot]
  1492. SWI Amnesia_SelectTable
  1493. .loop40
  1494. SWI Amnesia_ProcessTable
  1495. TST R2,#1<<10
  1496. BLNE bulletattn
  1497. CMP R2,#0
  1498. BNE loop40
  1499. LDMFD R13!,{PC}
  1500.  
  1501. .bulletattn
  1502. STMFD R13!,{R0-R2,R14}
  1503. MOV R9,R1
  1504. LDR R0,[R9,#8]
  1505. LDR R1,[R9,#12]
  1506. BL translate
  1507. BVS bulletattnend
  1508. LDR R0,[R4]
  1509. AND R0,R0,#&F0
  1510. CMP R0,#&90
  1511. CMPNE R0,#&A0
  1512. BEQ bulletstone
  1513. AND R0,R0,#&C0
  1514. CMP R0,#&40
  1515. BLNE bulletattnend
  1516. MOV R0,R4
  1517. BL blockdest
  1518. .bulletstone
  1519. BL bulletexplode
  1520. .bulletattnend
  1521. LDMFD R13!,{R0-R2,PC}
  1522.  
  1523. .bulletexplode
  1524. STMFD R13!,{R0-R1,R14}
  1525. LDR R0,[R9,#4]
  1526. MOV R0,#&05000000
  1527. MOV R1,#%1000001000110001
  1528. STMIA R9,{R0,R1}
  1529. MOV R0,#&07000080
  1530. STR R0,[R9,#24]
  1531. BL objectrange
  1532. BL explosound
  1533. LDMFD R13!,{R0-R1,PC}
  1534.  
  1535.  
  1536. .processballs
  1537. STMFD R13!,{R14}
  1538. MOV R0,#&7F000000
  1539. STR R0,[R12,#v.balldist]
  1540. MOV R0,#0
  1541. STR R0,[R12,#v.ballctr]
  1542. MOV R0,#ballstab
  1543. MOV R1,#0
  1544. LDR R2,[R12,#v.masterplot]
  1545. SWI Amnesia_SelectTable
  1546. .loop8
  1547. SWI Amnesia_ProcessTable
  1548. STMFD R13!,{R0-R1}
  1549. TST R2,#1<<10
  1550. BLNE ballattn
  1551. TST R2,#1<<8
  1552. BLNE balltimer
  1553. CMP R2,#0
  1554. LDMFD R13!,{R0-R1}
  1555. BNE loop8
  1556. LDR R0,[R12,#v.ballctr]
  1557. CMP R0,#0
  1558. BLEQ noballs
  1559. LDMFD R13!,{PC}
  1560.  
  1561. .ballattn
  1562. STMFD R13!,{R0-R2,R14}
  1563. MOV R9,R1
  1564. ADD R14,R9,#8
  1565. LDMIA R14,{R3-R6}
  1566. SUB R3,R3,R5    ;get old position
  1567. SUB R4,R4,R6
  1568. STR R3,[R9,#36]
  1569. STR R4,[R9,#40]
  1570. LDR R4,[R9,#4]
  1571. TST R4,#1<<29
  1572. MOV R3,#&7F
  1573. MOVNE R3,#&E0
  1574. TST R4,#1<<26
  1575. MOVNE R3,#&17
  1576. TST R4,#1<<30
  1577. BNE killballattn
  1578.  
  1579. BL scanadd
  1580. MOV R3,#0
  1581. LDR R4,[R12,#v.demomode]
  1582. CMP R4,#1
  1583. BEQ demskip2
  1584. .demskip2
  1585. LDR R4,[R9,#4]
  1586. TST R4,#1<<26 
  1587. LDREQ R3,[R12,#v.ballctr]
  1588. ADDEQ R3,R3,#1
  1589. STREQ R3,[R12,#v.ballctr]
  1590. BNE notthisball
  1591. .balladdskip
  1592. LDR R3,[R9,#8]
  1593. LDR R5,[R12,#v.xpos]
  1594. SUBS R5,R3,R5
  1595. RSBMI R5,R5,#0
  1596.  
  1597. LDR R4,[R9,#12]
  1598. LDR R6,[R12,#v.ypos]
  1599. SUBS R7,R4,R6
  1600. RSBMI R7,R7,#0
  1601.  
  1602. ADD R5,R5,R7
  1603. LDR R6,[R12,#v.balldist]
  1604. CMP R5,R6
  1605. BGT notthisball
  1606. STR R3,[R12,#v.ballxpos]
  1607. STR R4,[R12,#v.ballypos]
  1608. STR R5,[R12,#v.balldist]
  1609. .notthisball
  1610.  
  1611. LDR R3,[R9,#4]
  1612. TST R3,#1<<25
  1613. BLNE glintflash
  1614.  
  1615.  
  1616. TST R2,#1<<24; ball exploding
  1617. LDMNEFD R13!,{R0-R2,PC}
  1618.  
  1619. MOV R0,#256
  1620. STR R0,[R12,#v.windmax]
  1621. LDR R0,[R9,#8]
  1622. LDR R1,[R9,#12]
  1623. LDR R5,[R9,#28]
  1624. AND R6,R5,#&FFFF
  1625. MOV R5,R5,LSR #16
  1626. ADD R0,R0,R5,ASL #11
  1627. ADD R1,R1,R6,ASL #11
  1628. MOV R8,#0
  1629. BL translate
  1630. BVS balloffnet
  1631. LDR R4,[R12,#v.scanlock]
  1632. CMP R4,#1
  1633. BNE nolockcheck
  1634. STMFD R13!,{R0-R3}
  1635. LDR R1,[R12,#v.levelnet]
  1636. LDR R0,[R1,#net.xsize]
  1637. LDR R1,[R1,#net.ysize]
  1638. ADD R2,R2,R0,ASR #1
  1639. ADD R3,R3,R1,ASR #1
  1640. CMP R2,#32
  1641. CMPLE R3,#32
  1642. LDMFD R13!,{R0-R3}
  1643. BGT balloffnet
  1644. .nolockcheck
  1645. STMFD R13!,{R0-R3}
  1646. STR R0,[R12,#v.ballxnib]
  1647. STR R1,[R12,#v.ballynib]
  1648. CMP R0,R5,ASR #1
  1649. ADDLT R0,R0,#96
  1650. SUBLT R2,R2,#1
  1651. CMP R1,R6,ASR #1
  1652. ADDLT R1,R1,#96
  1653. SUBLT R3,R3,#1
  1654. BL ballgetheight
  1655. LDMFD R13!,{R0-R3}
  1656.  
  1657. STMFD R13!,{R2-R3}
  1658. BL ballattncheck
  1659. STR R4,[R12,#v.brball]
  1660. LDMFD R13,{R2-R3}; no writeback
  1661. SUB R2,R2,#1
  1662. CMP R0,R5
  1663. MOV R4,#256
  1664. BLLE ballattncheck
  1665. STR R4,[R12,#v.blball]
  1666. LDMFD R13,{R2-R3}; no writeback
  1667. SUB R3,R3,#1
  1668. CMP R1,R6
  1669. MOV R4,#256
  1670. BLLE ballattncheck
  1671. STR R4,[R12,#v.trball]
  1672. LDMFD R13!,{R2-R3}
  1673. SUB R2,R2,#1
  1674. SUB R3,R3,#1
  1675. CMP R0,R5
  1676. CMPLE R1,R6
  1677. MOV R4,#256
  1678. BLLE ballattncheck
  1679. STR R4,[R12,#v.tlball]
  1680.  
  1681. LDR R0,[R12,#v.windmax]
  1682. CMP R0,#256
  1683. BGE ballattnnocol
  1684. ADD R5,R12,#v.windbuf
  1685. LDMIA R5,{R0-R3}
  1686. ADD R5,R9,#8
  1687. STMIA R5,{R0-R3}
  1688. .ballattnnocol
  1689. .balloffnet
  1690. TST R8,#1
  1691. BEQ killball
  1692. .killballins
  1693. MOV R5,#0
  1694. LDR R3,[R9,#32]
  1695. CMP R3,#0
  1696. BEQ steponfloor
  1697. TST R8,#4
  1698. MOVNE R5,#1
  1699. .steponfloor
  1700. TST R8,#2
  1701. STREQ R5,[R9,#32]
  1702. LDR R3,[R9,#32]
  1703. LDR R4,[R9,#0]
  1704. BIC R4,R4,#&FF<<16
  1705. AND R3,R3,#&F
  1706. CMP R3,#2
  1707. ORREQ R4,R4,#10<<16
  1708. ORRNE R4,R4,#9<<16
  1709. STR R4,[R9,#0]
  1710.  
  1711. ;this section alters the ball velocity
  1712. ;ballnib is the position of the bottom right of the ball's bounding box
  1713. ;R5 is the ball height
  1714. ;v.brball is the slab at the bottom right of the ball footprint etc
  1715. ;These = 256 if no check has been made.  brball is always made.
  1716. .edgeeffect
  1717.  
  1718. LDR R3,[R9,#16]
  1719. LDR R4,[R9,#20]
  1720. LDR R5,[R9,#32]
  1721.  
  1722. CMP R5,#1
  1723. MOVEQ R5,#0
  1724. LDR R0,[R12,#v.ballxnib]
  1725. LDR R1,[R12,#v.ballynib]
  1726.  
  1727. LDR R6,[R9,#28]
  1728. AND R6,R6,#&FF
  1729. CMP R0,R6,LSR #1
  1730. BLLT rollleftcheck
  1731. CMP R0,R6,LSR #1
  1732. BLE norrcheck
  1733. CMP R0,R6
  1734. BLLT rollrightcheck
  1735. .norrcheck
  1736. CMP R1,R6,LSR #1
  1737. BLLT rollupcheck
  1738. CMP R1,R6,LSR #1
  1739. BLE nordcheck
  1740. CMP R1,R6
  1741. BLLT rolldowncheck
  1742. .nordcheck
  1743. LDR R0,[R12,#v.xgrav]
  1744. ADD R3,R3,R0
  1745. LDR R0,[R12,#v.ygrav]
  1746. ADD R4,R4,R0
  1747.  
  1748.  
  1749. MOV R8,R8,LSR #24
  1750. #set slope=1<<10
  1751. CMP R8,#&C8
  1752. SUBEQ R3,R3,#slope
  1753. CMP R8,#&C9
  1754. ADDEQ R3,R3,#slope
  1755. CMP R8,#&CA
  1756. SUBEQ R4,R4,#slope
  1757. CMP R8,#&CB
  1758. ADDEQ R4,R4,#slope
  1759. CMP R8,#&20
  1760. BLEQ blowleft
  1761. CMP R8,#&21
  1762. BLEQ blowright
  1763. CMP R8,#&22
  1764. BLEQ blowup
  1765. CMP R8,#&23
  1766. BLEQ blowdown
  1767. CMP R8,#&24
  1768. BLEQ speedup
  1769. CMP R8,#&25
  1770. BLEQ slowdown
  1771. CMP R8,#&2F
  1772. BLEQ hellexpand
  1773. CMP R8,#1
  1774. BLE notontel
  1775. CMP R8,#16
  1776. BGE notontel
  1777. CMP R8,#2
  1778. CMPNE R8,#5
  1779. CMPNE R8,#6
  1780. BEQ notontel
  1781. BL ontelep
  1782. B ontelins
  1783.  
  1784. .notontel
  1785. LDR R0,[R9,#4]
  1786. BIC R0,R0,#1<<27
  1787. STR R0,[R9,#4]
  1788.  
  1789. .ontelins
  1790.  
  1791. STR R3,[R9,#16]
  1792. STR R4,[R9,#20]
  1793.  
  1794. LDR R0,[R12,#v.magnet]
  1795. CMP R0,#0
  1796. BLGT ballpull
  1797. LDR R0,[R12,#v.ballfire]
  1798. CMP R0,#0
  1799. BLGT doballfire
  1800. LDR R0,[R12,#v.blueball]
  1801. CMP R0,#0
  1802. BLGT doblueball
  1803. LDR R0,[R12,#v.ballstops]
  1804. CMP R0,#0
  1805. BLGT doballstop
  1806. LDR R0,[R12,#v.bastard]
  1807. CMP R0,#0
  1808. BLGT dobastard
  1809.  
  1810.  
  1811. LDR R3,[R9,#16]
  1812. MOV R3,R3,ASR #10
  1813. MOV R5,R3
  1814. MUL R3,R5,R3
  1815.  
  1816. LDR R4,[R9,#20]
  1817. MOV R4,R4,ASR #10
  1818. MOV R5,R4
  1819. MUL R4,R5,R4
  1820.  
  1821. ADD R3,R3,R4
  1822. LDR R4,[R12,#v.ballmin]
  1823. CMP R3,R4
  1824. BLLT ballspeedup
  1825. ;check ball speed
  1826. LDR R3,[R9,#16]
  1827. LDR R4,[R9,#20]
  1828. BL limitballspeed
  1829.  
  1830. STR R3,[R9,#16]
  1831. STR R4,[R9,#20]
  1832. LDMFD R13!,{R0-R2,PC}
  1833. ;change killball if you change this stack instruction
  1834.  
  1835. .rollleftcheck
  1836. STMFD R13!,{R6,R14}
  1837. LDR R6,[R12,#v.blball]
  1838. CMP R6,#256
  1839. LDMGEFD R13!,{R6,PC}
  1840. MOV R7,#2
  1841. CMP R6,#&20
  1842. MOVLT R7,#-1
  1843. CMP R6,#&10
  1844. MOVLT R7,#0
  1845. CMP R7,R5
  1846. LDMGEFD R13!,{R6,PC}
  1847. LDR R6,[R12,#v.tlball]
  1848. CMP R6,#256
  1849. BGE rollleft
  1850. MOV R7,#2
  1851. CMP R6,#&20
  1852. MOVLT R7,#-1
  1853. CMP R6,#&10
  1854. MOVLT R7,#0
  1855. CMP R7,R5
  1856. LDMGEFD R13!,{R6,PC}
  1857. .rollleft
  1858. LDR R6,[R9,#28]
  1859. AND R6,R6,#&FF
  1860. RSB R6,R0,R6,ASR #1
  1861. LDR R7,[R12,#v.diff]
  1862. ADD R7,R7,#4
  1863. SUB R3,R3,R6,LSL R7
  1864. LDMFD R13!,{R6,PC}
  1865.  
  1866. .rollrightcheck
  1867. STMFD R13!,{R6,R14}
  1868. LDR R6,[R12,#v.brball]
  1869. MOV R7,#2
  1870. CMP R6,#&20
  1871. MOVLT R7,#-1
  1872. CMP R6,#&10
  1873. MOVLT R7,#0
  1874. CMP R7,R5
  1875. LDMGEFD R13!,{R6,PC}
  1876. LDR R6,[R12,#v.trball]
  1877. CMP R6,#256
  1878. BGE rollright
  1879. MOV R7,#2
  1880. CMP R6,#&20
  1881. MOVLT R7,#-1
  1882. CMP R6,#&10
  1883. MOVLT R7,#0
  1884. CMP R7,R5
  1885. LDMGEFD R13!,{R6,PC}
  1886. .rollright
  1887. LDR R6,[R9,#28]
  1888. AND R6,R6,#&FF
  1889. SUB R6,R0,R6,LSR #1
  1890. LDR R7,[R12,#v.diff]
  1891. ADD R7,R7,#4
  1892. ADD R3,R3,R6,LSL R7
  1893. LDMFD R13!,{R6,PC}
  1894.  
  1895. .rollupcheck
  1896. STMFD R13!,{R6,R14}
  1897. LDR R6,[R12,#v.trball]
  1898. CMP R6,#256
  1899. LDMGEFD R13!,{R6,PC}
  1900. MOV R7,#2
  1901. CMP R6,#&20
  1902. MOVLT R7,#-1
  1903. CMP R6,#&10
  1904. MOVLT R7,#0
  1905. CMP R7,R5
  1906. LDMGEFD R13!,{R6,PC}
  1907. LDR R6,[R12,#v.tlball]
  1908. CMP R6,#256
  1909. BGE rollup
  1910. MOV R7,#2
  1911. CMP R6,#&20
  1912. MOVLT R7,#-1
  1913. CMP R6,#&10
  1914. MOVLT R7,#0
  1915. CMP R7,R5
  1916. LDMGEFD R13!,{R6,PC}
  1917. .rollup
  1918. LDR R6,[R9,#28]
  1919. AND R6,R6,#&FF
  1920. RSB R6,R1,R6,LSR #1
  1921. LDR R7,[R12,#v.diff]
  1922. ADD R7,R7,#4
  1923. SUB R4,R4,R6,LSL R7
  1924. LDMFD R13!,{R6,PC}
  1925.  
  1926. .rolldowncheck
  1927. STMFD R13!,{R6,R14}
  1928. LDR R6,[R12,#v.brball]
  1929. MOV R7,#2
  1930. CMP R6,#&20
  1931. MOVLT R7,#-1
  1932. CMP R6,#&10
  1933. MOVLT R7,#0
  1934. CMP R7,R5
  1935. LDMGEFD R13!,{R6,PC}
  1936. LDR R6,[R12,#v.blball]
  1937. CMP R6,#256
  1938. BGE rolldown
  1939. MOV R7,#2
  1940. CMP R6,#&20
  1941. MOVLT R7,#-1
  1942. CMP R6,#&10
  1943. MOVLT R7,#0
  1944. CMP R7,R5
  1945. LDMGEFD R13!,{R6,PC}
  1946. .rolldown
  1947. LDR R6,[R9,#28]
  1948. AND R6,R6,#&FF
  1949. SUB R6,R1,R6,LSR #1
  1950. LDR R7,[R12,#v.diff]
  1951. ADD R7,R7,#4
  1952. ADD R4,R4,R1,LSL R7
  1953. LDMFD R13!,{R6,PC}
  1954.  
  1955. .limitballspeed
  1956. STMFD R13!,{R0,R14}
  1957. LDR R0,[R12,#v.ballspeedlim]
  1958. CMP R3,R0
  1959. MOVGT R3,R0
  1960. CMP R4,R0
  1961. MOVGT R4,R0
  1962. RSB R0,R0,#0
  1963. CMP R3,R0
  1964. MOVLT R3,R0
  1965. CMP R4,R0
  1966. MOVLT R4,R0
  1967. LDR R0,[R12,#v.demomode]
  1968. CMP R0,#1
  1969. LDMEQFD R13!,{R0,PC}
  1970. #set velmin=1<<4
  1971. CMP R3,#velmin
  1972. BGT nolimslowx
  1973. CMN R3,#velmin
  1974. MOVGT R3,#0
  1975. .nolimslowx
  1976. CMP R4,#velmin
  1977. BGT nolimslowy
  1978. CMN R4,#velmin
  1979. MOVGT R4,#0
  1980. .nolimslowy
  1981. LDMFD R13!,{R0,PC}
  1982.  
  1983. .doballfire
  1984. STMFD R13!,{R9-R10,R14}
  1985. LDR R0,[R12,#v.ballfire]
  1986. TST R0,#7
  1987. LDMNEFD R13!,{R9-R10,PC}
  1988. MOV R0,R0,ASL #4
  1989. AND R0,R0,#&7F8
  1990. ADR R10,circletab
  1991. ADD R10,R10,R0
  1992. MOV R1,#(decortab<<24)+0
  1993. MOV R2,#%1000011000111101+(1<<18)
  1994. LDR R3,[R9,#8]
  1995. LDR R4,[R9,#12]
  1996. LDR R5,[R9,#16]
  1997. LDR R6,[R9,#20]
  1998. LDR R0,[R10]
  1999. MOV R0,R0,ASR #16
  2000. ADD R5,R5,R0
  2001. LDR R0,[R10,#4]
  2002. MOV R0,R0,ASR #16
  2003. ADD R6,R6,R0
  2004. MOV R7,#&10000040
  2005. BL random
  2006. AND R0,R0,#&01FF0000
  2007. ORR R7,R7,R0
  2008. MOV R8,#0
  2009. MOV R0,#bulletstab
  2010. SWI Amnesia_MakeObject
  2011. LDR R0,[R12,#v.plxcent]
  2012. SUB R0,R3,R0
  2013. LDR R1,[R12,#v.plycent]
  2014. SUB R1,R4,R1
  2015. BL blamsound
  2016. LDMFD R13!,{R9-R10,PC}
  2017.  
  2018. .doblueball
  2019. STMFD R13!,{R9-R10,R14}
  2020. LDR R0,[R12,#v.blueball]
  2021. TST R0,#31
  2022. LDMNEFD R13!,{R9-R10,PC}
  2023. LDR R3,[R9,#4]
  2024. TST R3,#3<<8
  2025. LDMNEFD R13!,{R9-R10,PC}
  2026. LDR R3,[R9,#8]
  2027. LDR R4,[R9,#12]
  2028. BL makeblueball
  2029. LDR R0,[R12,#v.plxcent]
  2030. SUB R0,R3,R0
  2031. LDR R1,[R12,#v.plycent]
  2032. SUB R1,R4,R1
  2033. ;BL blamsound
  2034. LDMFD R13!,{R9-R10,PC}
  2035.  
  2036. .doballstop
  2037. MOV R0,#0
  2038. STR R0,[R9,#16]
  2039. STR R0,[R9,#20]
  2040. MOV PC,R14
  2041.  
  2042. .dobastard
  2043. LDR R0,[R9,#16]
  2044. ADD R0,R0,R0,ASR #6
  2045. STR R0,[R9,#16]
  2046. LDR R0,[R9,#20]
  2047. ADD R0,R0,R0,ASR #6
  2048.  
  2049. STR R0,[R9,#20]
  2050. MOV PC,R14
  2051.  
  2052. .ontelep
  2053. STMFD R13!,{R0-R10,R14}
  2054. LDR R0,[R12,#v.sparks]
  2055. CMP R0,#1
  2056. BNE nottelepspark
  2057. CMP R8,#12
  2058. BLT nottelepspark
  2059. BL ballexplode
  2060. LDMFD R13!,{R0-R10,PC}
  2061. .nottelepspark
  2062. LDR R0,[R9,#4]
  2063. TST R0,#1<<27
  2064. LDMNEFD R13!,{R0-R10,PC}
  2065. ORR R0,R0,#1<<27
  2066. STR R0,[R9,#4]
  2067. LDR R7,[R12,#v.levelnet]
  2068. LDR R5,[R12,#v.balladr]
  2069. TST R8,#1
  2070. EOR R8,R8,#1
  2071. BNE telright
  2072. ADD R6,R7,#net.data+1
  2073. .loop80
  2074. LDRB R0,[R5,#-1]!
  2075. CMP R0,R8
  2076. BEQ telfound
  2077. CMP R5,R6
  2078. BGT loop80
  2079. LDMFD R13!,{R0-R10,PC}
  2080. .telright
  2081. LDR R0,[R7,#net.xsize]
  2082. LDR R1,[R7,#net.ysize]
  2083. MUL R6,R1,R0
  2084. LDR R0,[R12,#v.scanlock]
  2085. CMP R0,#1
  2086. MOVEQ R6,#32*32
  2087. ADD R7,R7,#net.data
  2088. ADD R6,R6,R7
  2089. SUB R6,R6,#1
  2090. .loop81
  2091. LDRB R0,[R5,#1]!
  2092. CMP R0,R8
  2093. BEQ telfound
  2094. CMP R5,R6
  2095. BLT loop81
  2096. LDMFD R13!,{R0-R10,PC}
  2097.  
  2098. .telfound
  2099. BL teleff1
  2100. MOV R0,R5
  2101. BL backtranslate
  2102. LDMVSFD R13!,{R0-R10,PC}
  2103. STR R0,[R9,#8]
  2104. STR R1,[R9,#12]
  2105. BL teleff2
  2106. LDMFD R13!,{R0-R10,PC}
  2107.  
  2108. .teleff1
  2109. STMFD R13!,{R0-R9,R14}
  2110. LDR R0,[R12,#v.balladr]
  2111. BL backtranslate
  2112. MOV R3,R0
  2113. MOV R4,R1
  2114. MOV R0,#decortab
  2115. MOV R1,#(decortab<<24)+4
  2116. MOV R2,#%1000001001110001
  2117. MOV R7,#&03000040
  2118. SWI Amnesia_MakeObject
  2119. LDR R0,[R9,#4]
  2120. TST R0,#1<<29
  2121. LDMNEFD R13!,{R0-R9,PC}
  2122. LDR R5,[R9,#8]
  2123. LDR R6,[R9,#12]
  2124. SUB R5,R3,R5
  2125. SUB R6,R4,R6
  2126. MOV R5,R5,ASR #5
  2127. MOV R6,R6,ASR #5
  2128. LDR R3,[R9,#8]
  2129. LDR R4,[R9,#12]
  2130. MOV R0,#decortab
  2131. MOV R1,#(ballstab<<24)
  2132. MOV R2,#%1000001001110101
  2133. MOV R7,#&0A000050
  2134.  
  2135. SWI Amnesia_MakeObject
  2136. BL telepsound
  2137. LDMFD R13!,{R0-R9,PC}
  2138.  
  2139. .teleff2
  2140. STMFD R13!,{R9,R14}
  2141. MOV R0,#decortab
  2142. MOV R1,#(decortab<<24)+4
  2143. MOV R2,#%1000001001110001
  2144. LDR R3,[R9,#8]
  2145. LDR R4,[R9,#12]
  2146. MOV R7,#&03000040
  2147. SWI Amnesia_MakeObject
  2148. BL telepsound2
  2149. LDMFD R13!,{R9,PC}
  2150.  
  2151.  
  2152.  
  2153. .ballpull
  2154. STMFD R13!,{R14}
  2155. LDR R3,[R9,#4]
  2156. TST R3,#15<<20
  2157. LDMNEFD R13!,{PC}
  2158. LDR R3,[R9,#8]
  2159. LDR R4,[R9,#12]
  2160. LDR R5,[R12,#v.xpos]
  2161. LDR R6,[R12,#v.ypos]
  2162. SUB R5,R3,R5
  2163. SUB R6,R4,R6
  2164. STMFD R13!,{R5,R6}
  2165. MOV R5,R5,ASR #12
  2166. MOV R1,R5
  2167. MUL R1,R5,R1
  2168. MOV R6,R6,ASR #12
  2169. MOV R2,R6
  2170. MUL R2,R6,R2
  2171. ADD R0,R1,R2
  2172. LDMFD R13!,{R5,R6}
  2173. CMP R0,#1<<18
  2174. LDMGTFD R13!,{PC}
  2175. MOV R0,R0,ASR #5
  2176. CMP R0,#8
  2177. MOVLT R0,#8
  2178. LDR R3,[R12,#v.magpitch]
  2179. MOV R4,#&3D55
  2180. SUB R4,R4,R0,ASR #2
  2181. CMP R4,R3
  2182. STRGT R4,[R12,#v.magpitch]
  2183.  
  2184. MYDIV R3,R5,R0
  2185. MYDIV R4,R6,R0
  2186. LDR R0,[R9,#16]
  2187. SUB R0,R0,R3
  2188. STR R0,[R9,#16]
  2189. LDR R0,[R9,#20]
  2190. SUB R0,R0,R4
  2191. STR R0,[R9,#20]
  2192. LDMFD R13!,{PC}
  2193.  
  2194.  
  2195.  
  2196. .ballgetheight
  2197. STMFD R13!,{R0-R7,R10,R14}
  2198. BL transconv
  2199. BVS ballnoheight
  2200. MOV R10,R4
  2201. STR R10,[R12,#v.balladr]
  2202. LDRB R7,[R10]
  2203. ORR R8,R8,R7,LSL #24
  2204. CMP R7,#&C8
  2205. BLGE balllift
  2206. .ballnoheight
  2207. LDMFD R13!,{R0-R7,R10,PC}
  2208.  
  2209. .balllift
  2210. STMFD R13!,{R0,R14}
  2211. CMP R7,#&C8
  2212. BEQ leftlift
  2213. CMP R7,#&C9
  2214. BEQ rightlift
  2215. CMP R7,#&CA
  2216. BEQ uplift
  2217. CMP R7,#&CB
  2218. BEQ downlift
  2219. LDMFD R13!,{R0,PC}
  2220. .downlift
  2221. CMP R1,#80
  2222. BGT noliftball
  2223. B doliftball
  2224. .uplift
  2225. CMP R1,#16
  2226. BLT noliftball
  2227. B doliftball
  2228. .rightlift
  2229. CMP R0,#80
  2230. BGT noliftball
  2231. B doliftball
  2232. .leftlift
  2233. CMP R0,#16
  2234. BLT noliftball
  2235. B doliftball
  2236.  
  2237.  
  2238. .doliftball
  2239. MOV R0,#2
  2240. STR R0,[R9,#32]
  2241. LDMFD R13!,{R0,PC}
  2242. .noliftball
  2243. LDR R0,[R9,#32]
  2244. CMP R0,#0
  2245. MOVEQ R0,#1
  2246. STREQ R0,[R9,#32]
  2247. LDMFD R13!,{R0,PC}
  2248.  
  2249.  
  2250. .ballattncheck
  2251. STMFD R13!,{R0-R3,R5-R7,R10,R14}
  2252. BL transconv
  2253. BVS ballattnnocheck
  2254. MOV R10,R4
  2255. LDRB R7,[R10]
  2256. BIC R8,R8,#8+32
  2257. CMP R7,#&AB
  2258. BLT notsecret
  2259. CMP R7,#&B0
  2260. BGE notsecret
  2261. BL dosecret
  2262. .notsecret
  2263. CMP R7,#hellno+16
  2264. BGE skiphell
  2265. CMP R7,#hellno
  2266. BLT skiphell
  2267. CMP R7,#&1C
  2268. ORRGE R8,R8,#64
  2269. B skiphellins
  2270.  
  2271. .skiphell
  2272. ORR R8,R8,#1; prevent ball being killed
  2273. .skiphellins
  2274.  
  2275. CMP R7,#&C8
  2276. ORRGE R8,R8,#4
  2277. BGE nosupport
  2278. CMP R7,#&90
  2279. BGE nosupport
  2280. CMP R7,#&40
  2281. ORRGE R8,R8,#2
  2282. .nosupport
  2283. CMP R7,#&40
  2284. BLT ballattnnocheck
  2285. CMP R7,#&C8
  2286. ORRGE R8,R8,#8
  2287. CMP R7,#&A0
  2288. BLT nolightstone
  2289. CMP R7,#&BF
  2290. BLE lightstone
  2291. .nolightstone
  2292. LDR R6,[R9,#32]
  2293. CMP R6,#2
  2294. BGE ballover
  2295. .lightstone
  2296. BL stoneballcol
  2297. BCS ballattnnocheck
  2298. LDR R5,[R12,#v.windmax]
  2299. CMP R4,R5
  2300.  
  2301. BGE ballattnnocheck
  2302. STR R4,[R12,#v.windmax]
  2303. ADD R5,R12,#v.windbuf
  2304. STMIA R5,{R0-R3}
  2305. .ballover
  2306. LDR R0,[R9,#4]
  2307. TST R0,#1<<26
  2308. BNE ballattnnocheck
  2309. LDRB R0,[R10]
  2310. CMP R0,#&80
  2311. MOV R0,R10
  2312. BGE stonedest
  2313. BL blockdest
  2314. .ballattnnocheck
  2315. MOV R4,R7
  2316. LDMFD R13!,{R0-R3,R5-R7,R10,PC}
  2317. .stonedest
  2318. TST R8,#32
  2319. BEQ ballattnnocheck
  2320. LDRB R0,[R10]
  2321. AND R0,R0,#&F0
  2322. CMP R0,#&B0
  2323. BLEQ handlemorph
  2324. STMFD R13!,{R0-R2}
  2325. LDR R0,[R9,#8]
  2326. LDR R2,[R12,#v.plxcent]
  2327. SUB R0,R0,R2
  2328. LDR R1,[R9,#12]
  2329. LDR R2,[R12,#v.plycent]
  2330. SUB R1,R1,R2
  2331. BL chinksound
  2332. LDMFD R13!,{R0-R2}
  2333. MOV R7,#0
  2334. B ballattnnocheck
  2335.  
  2336.  
  2337. #set blow=1<<10
  2338. #set suck=1<<12
  2339. .blowleft
  2340. CMP R3,#0
  2341. SUBLE R3,R3,#blow
  2342. SUBGT R3,R3,#suck
  2343. SUB R4,R4,R4,ASR #4
  2344. MOV PC,R14
  2345. .blowright
  2346. CMP R3,#0
  2347. ADDGE R3,R3,#blow
  2348. ADDLT R3,R3,#suck
  2349. SUB R4,R4,R4,ASR #4
  2350. MOV PC,R14
  2351. .blowup
  2352. CMP R4,#0
  2353. SUBLE R4,R4,#blow
  2354. SUBGT R4,R4,#suck
  2355. SUB R3,R3,R3,ASR #4
  2356. MOV PC,R14
  2357. .blowdown
  2358. CMP R4,#0
  2359. ADDGE R4,R4,#blow
  2360. ADDLT R4,R4,#suck
  2361. SUB R3,R3,R3,ASR #4
  2362. MOV PC,R14
  2363.  
  2364. .slowdown
  2365. ADDS R0,R3,R4
  2366. RSBMI R0,R0,#0
  2367. CMP R0,#1<<8
  2368. MOVLT PC,R14
  2369. SUB R3,R3,R3,ASR #4
  2370. SUB R4,R4,R4,ASR #4
  2371. MOV PC,R14
  2372.  
  2373. .speedup
  2374. ADD R3,R3,R3,ASR #4
  2375. ADD R4,R4,R4,ASR #4
  2376. MOV PC,R14
  2377.  
  2378. .killballattn
  2379. LDR R4,[R12,#v.framectr]
  2380. TST R4,#1<<3
  2381. BLNE scanadd
  2382. LDR R3,[R9,#16]
  2383. SUB R3,R3,R3,ASR #4
  2384. CMP R3,#1<<8
  2385. MOVGT R3,#1<<8
  2386. CMN R3,#1<<8
  2387. MOVLT R3,#-1<<8 
  2388. STR R3,[R9,#16]
  2389. LDR R3,[R9,#20]
  2390. SUB R3,R3,R3,ASR #4
  2391. CMP R3,#1<<8
  2392. MOVGT R3,#1<<8
  2393. CMN R3,#1<<8
  2394. MOVLT R3,#-1<<8 
  2395. STR R3,[R9,#20]
  2396. LDMFD R13!,{R0-R2,PC}
  2397.  
  2398. .killball
  2399. LDR R3,[R9,#4]
  2400. TST R3,#1<<25
  2401. BNE killballins
  2402. TST R3,#3<<28
  2403. BNE notwarped
  2404.  
  2405. TST R8,#64
  2406. BEQ notwarped
  2407. LDR R3,[R12,#v.sparks]
  2408. CMP R3,#1
  2409. BEQ killblueball
  2410. STMFD R13!,{R14}
  2411. BL warpball
  2412. LDMFD R13!,{R14}
  2413. .notwarped
  2414. LDR R3,[R9,#0]
  2415. BIC R3,R3,#&FF<<16
  2416. STR R3,[R9,#0]
  2417. LDR R3,[R9,#4]
  2418. TST R3,#1<<28
  2419. BNE killblueball
  2420. BIC R3,R3,#%00010000000
  2421. ORR R3,R3,#%01000100000+(1<<30)
  2422. STR R3,[R9,#4]
  2423. LDR R3,[R9,#16]
  2424. MOV R3,R3,ASR #2
  2425. STR R3,[R9,#16]
  2426. LDR R3,[R9,#20]
  2427. MOV R3,R3,ASR #2
  2428. STR R3,[R9,#20]
  2429. MOV R3,#&09F00018
  2430. STR R3,[R9,#24]
  2431. BL fallsound
  2432. LDMFD R13!,{R0-R2,R14}
  2433. ORR R2,R2,#1<<5
  2434. BIC R2,R2,#1<<7
  2435. MOV PC,R14
  2436.  
  2437. .killblueball
  2438. BL ballexplode
  2439. LDMFD R13!,{R0-R2,PC}
  2440.  
  2441. .ballexplode
  2442. STMFD R13!,{R0-R2,R14}
  2443. LDR R2,[R9,#4]
  2444. TST R2,#1<<24
  2445. LDMNEFD R13!,{R0-R2,PC}
  2446. MOV R0,#&05000000
  2447. MOV R1,#%01000110001+(1<<24)
  2448. TST R2,#1<<29
  2449. ORRNE R1,R1,#1<<29
  2450. TST R2,#1<<26
  2451. ORRNE R1,R1,#1<<26
  2452. STMIA R9,{R0,R1}
  2453. MOV R0,#&07000080
  2454. STR R0,[R9,#24]
  2455. BL objectrange
  2456. BL explosound
  2457. LDMFD R13!,{R0-R2,PC}
  2458.  
  2459. .ballspeedup
  2460. LDR R3,[R9,#16]
  2461. ADD R3,R3,R3,ASR #4
  2462. STR R3,[R9,#16]
  2463. LDR R4,[R9,#20]
  2464. ADD R4,R4,R4,ASR #4
  2465. STR R4,[R9,#20]
  2466. MOV PC,R14
  2467.  
  2468. .noballs
  2469. STMFD R13!,{R14}
  2470. LDR R0,[R12,#v.newlevelctr]
  2471. CMP R0,#1
  2472. LDMGTFD R13!,{PC}
  2473. LDR R0,[R12,#v.dead]
  2474. ADD R0,R0,#1
  2475. STR R0,[R12,#v.dead]
  2476. LDR R1,[R12,#v.pllives]
  2477. CMP R1,#0
  2478. CMPEQ R0,#10
  2479. BLEQ gameovermes
  2480. LDR R0,[R12,#v.dead]
  2481. CMP R0,#1
  2482. LDMGTFD R13!,{PC}
  2483. LDR R0,[R12,#v.demomode]
  2484. CMP R0,#1
  2485. LDMEQFD R13!,{PC}
  2486. BL deathsound
  2487. LDMFD R13!,{PC}
  2488.  
  2489. .gameovermes
  2490. STMFD R13!,{R14}
  2491. ADR R0,gameovertext
  2492. BL message
  2493. LDMFD R13!,{PC}
  2494. .gameovertext
  2495. DCD 160<<12,128<<12,0,0,&01000001,0
  2496. DCB "GAME OVER",0
  2497. ALIGN
  2498.  
  2499.  
  2500.  
  2501. .balltimer
  2502. STMFD R13!,{R0-R2,R14}
  2503. MOV R9,R1
  2504. TST R2,#1<<24
  2505. LDMNEFD R13!,{R0-R2,PC}
  2506. LDR R0,[R9,#4]
  2507. TST R0,#1<<28
  2508. BNE expblueball
  2509. TST R0,#1<<29
  2510. MOV R3,#%1000010011011101+(1<<18)
  2511. MOVNE R3,#%1000010111011101+(3<<28)+(1<<18)
  2512. TST R0,#1<<26
  2513. ORRNE R3,R3,#1<<26
  2514. STR R3,[R9,#4]
  2515. TST R0,#1<<29
  2516. MOVNE R3,#&01000001
  2517. STRNE R3,[R9,#24]
  2518. BL makeballdecor
  2519. LDMFD R13!,{R0-R2,PC}
  2520. .expblueball
  2521. BL ballexplode
  2522. LDMFD R13!,{R0-R2,PC}
  2523.  
  2524. .blockdest
  2525. STMFD R13!,{R8,R14}
  2526.  
  2527. LDRB R1,[R0]
  2528. TST R1,#hitbit
  2529. LDMEQFD R13!,{R8,PC}
  2530. CMP R1,#hit1
  2531. CMPNE R1,#hit2
  2532. BLEQ blocksub
  2533. AND R5,R1,#&F0
  2534. CMP R5,#&50
  2535. CMPNE R5,#&70
  2536. BEQ starblockdest
  2537. CMP R1,#&4F
  2538. MOVEQ R5,#0
  2539. STREQ R5,[R12,#v.sparks]
  2540. CMP R1,#&4E
  2541. MOVEQ R5,#1
  2542. STREQ R5,[R12,#v.sparks]
  2543. CMP R1,#&4D
  2544. MOVEQ R5,#0
  2545. STREQ R5,[R12,#v.redball]
  2546. CMP R1,#&4C
  2547. MOVEQ R5,#1
  2548. STREQ R5,[R12,#v.redball]
  2549. MOV R1,#0
  2550. STRB R1,[R0]
  2551.  
  2552. STMFD R13!,{R0-R2}
  2553. BL backtranslate
  2554. MOV R3,R0
  2555. MOV R4,R1
  2556. BL addglint
  2557. BL addglint
  2558. LDR R2,[R12,#v.plxcent]
  2559. SUB R0,R0,R2
  2560. LDR R2,[R12,#v.plycent]
  2561. SUB R1,R1,R2
  2562. BL weirdsound
  2563. LDMFD R13!,{R0-R2}
  2564. LDR R1,[R12,#v.plscore]
  2565. ADD R1,R1,#10
  2566. STR R1,[R12,#v.plscore]
  2567. LDMFD R13!,{R8,PC}
  2568.  
  2569. .starblockdest
  2570. LDRB R5,[R0]
  2571. MOV R1,#0
  2572. STRB R1,[R0]
  2573. BL backtranslate
  2574. MOV R3,R0
  2575. MOV R4,R1
  2576. BL starmake
  2577. LDR R0,[R12,#v.plxcent]
  2578. SUB R0,R3,R0
  2579. LDR R1,[R12,#v.plycent]
  2580. SUB R1,R4,R1
  2581. BL bonussound
  2582. LDR R1,[R12,#v.plscore]
  2583. ADD R1,R1,#100
  2584. STR R1,[R12,#v.plscore]
  2585. LDMFD R13!,{R8,PC}
  2586.  
  2587. .blocksub
  2588. STMFD R13!,{R0,R14}
  2589. LDR R0,[R12,#v.blocksleft]
  2590. SUB R0,R0,#1
  2591. STR R0,[R12,#v.blocksleft]
  2592. BL writeblocksleft
  2593. LDMFD R13!,{R0,PC}
  2594.  
  2595. .dosecret
  2596. STMFD R13!,{R0-R11,R14}
  2597. MOV R0,#&A0
  2598.  
  2599. CMP R7,#&AF
  2600. MOVEQ R0,#0
  2601. CMP R7,#&AB
  2602. MOVEQ R0,#3
  2603. STRB R0,[R10]
  2604. CMP R7,#&AB
  2605. MOVEQ R0,#0
  2606. STREQ R0,[R12,#v.scanlock]
  2607. BL secretsound
  2608. LDR R9,[R12,#v.levelnet]
  2609. LDR R0,[R9,#net.xsize]
  2610. LDR R1,[R9,#net.ysize]
  2611. MUL R0,R1,R0
  2612. ADD R9,R9,#net.data
  2613. ADD R8,R9,R0
  2614. .loop86
  2615. LDRB R0,[R9]
  2616. CMP R0,#&11
  2617. CMPNE R0,#&12
  2618. CMPNE R0,#&13
  2619. CMPEQ R7,#&AC
  2620. BLEQ secretAC
  2621. CMP R0,#&A1
  2622. BLT notsec
  2623. CMP R0,#&B0
  2624. BGE notsec
  2625. CMP R7,#&AB
  2626. BLEQ secretAB
  2627. CMP R7,#&AC
  2628. BLEQ secretAC
  2629. CMP R7,#&AD
  2630. BLEQ secretAD
  2631. CMP R7,#&AE
  2632. BLEQ secretAE
  2633. .notsec
  2634.  
  2635. ADD R9,R9,#1
  2636. CMP R9,R8
  2637. BLT loop86
  2638. MOV R0,R10
  2639. BL backtranslate
  2640. MOV R3,R0
  2641. MOV R4,R1
  2642. MOV R9,#10
  2643. .loop87
  2644. BL addglint
  2645. SUBS R9,R9,#1
  2646. BGT loop87
  2647. LDMFD R13!,{R0-R11,PC}
  2648.  
  2649. .secretAB
  2650. CMP R0,#&AB
  2651. MOVEQ R1,#3
  2652. STREQB R1,[R9]
  2653. MOV PC,R14
  2654.  
  2655. .secretAC
  2656. CMP R0,#&AC
  2657. MOVEQ R1,#&A0
  2658. STREQB R1,[R9]
  2659. CMP R0,#&11
  2660. MOVEQ R1,#0
  2661. STREQB R1,[R9]
  2662. CMP R0,#&12
  2663. MOVEQ R1,#&80
  2664. STREQB R1,[R9]
  2665. CMP R0,#&13
  2666. MOVEQ R1,#&A0
  2667. STREQB R1,[R9]
  2668. CMP R0,#&A1
  2669. MOVEQ R1,#hellno
  2670. STREQB R1,[R9]
  2671. CMP R0,#&A2
  2672. MOVEQ R1,#0
  2673. STREQB R1,[R9]
  2674. CMP R0,#&A3
  2675. MOVEQ R1,#&80
  2676. STREQB R1,[R9]
  2677. B secretexit
  2678. .secretAD
  2679. CMP R0,#&AD
  2680. MOVEQ R1,#&A0
  2681. STREQB R1,[R9]
  2682. CMP R0,#&A4
  2683. MOVEQ R1,#4
  2684. STREQB R1,[R9]
  2685. CMP R0,#&A5
  2686. MOVEQ R1,#7
  2687. STREQB R1,[R9]
  2688. CMP R0,#&A6
  2689. MOVEQ R1,#&4F
  2690. STREQB R1,[R9]
  2691. CMP R0,#&A7
  2692. MOVEQ R1,#&71
  2693. STREQB R1,[R9]
  2694. B secretexit
  2695. .secretAE
  2696. CMP R0,#&AE
  2697. MOVEQ R1,#&A0
  2698. STREQB R1,[R9]
  2699. CMP R0,#&A8
  2700. MOVEQ R1,#&1C
  2701. STREQB R1,[R9]
  2702. CMP R0,#&A9
  2703. MOVEQ R1,#&1E
  2704. STREQB R1,[R9]
  2705. CMP R0,#&AA
  2706. MOVEQ R1,#&1F
  2707. STREQB R1,[R9]
  2708. B secretexit
  2709. .secretexit
  2710. MOV PC,R14
  2711.  
  2712. .nukeballs
  2713. STMFD R13!,{R0-R11,R14}
  2714. MOV R0,#ballstab
  2715. MOV R1,#2
  2716. MOV R2,#0
  2717. MOV R3,#0
  2718. MOV R4,#0
  2719. SWI Amnesia_SelectTable
  2720. .loop7a
  2721. SWI Amnesia_ProcessTable
  2722. CMP R2,#0
  2723. BEQ nukeballsend
  2724. STMFD R13!,{R0-R4}
  2725. MOV R9,R1
  2726. BL ballexplode
  2727. LDMFD R13!,{R0-R4}
  2728. B loop7a
  2729.  
  2730. .nukeballsend
  2731. LDMFD R13!,{R0-R11,PC}
  2732.  
  2733. .batexplode
  2734. STMFD R13!,{R0-R1,R14}
  2735. MOV R3,#20
  2736. .batexloop
  2737. STMFD R13!,{R3}
  2738. LDR R3,[R12,#v.xpos]
  2739. LDR R4,[R12,#v.ypos]
  2740. BL random
  2741. AND R0,R0,#&7FFFF
  2742. SUB R0,R0,#&3FFFF
  2743. ADD R3,R3,R0
  2744. BL random
  2745. AND R0,R0,#&1FFFF
  2746. SUB R0,R0,#&FFFF
  2747. ADD R4,R4,R0
  2748. MOV R7,#&07000020
  2749. BL random
  2750. AND R0,R0,#&3F
  2751. ADD R7,R7,R0
  2752. MOV R0,#decortab
  2753. MOV R1,#&05000000
  2754. MOV R2,#%11000110001+(1<<24)
  2755. SWI Amnesia_MakeObject
  2756. LDMFD R13!,{R3}
  2757. SUBS R3,R3,#1
  2758. BPL batexloop
  2759.  
  2760. LDMFD R13!,{R0-R1,PC}
  2761.  
  2762. .hellexpand
  2763. STMFD R13!,{R0-R11,R14}
  2764. LDR R11,[R12,#v.levelnet]
  2765. LDR R3,[R11,#net.xsize]
  2766. LDR R4,[R11,#net.ysize]
  2767. LDR R5,[R11,#net.xsize]
  2768. ADD R10,R11,#net.data
  2769. ADD R10,R10,R3
  2770. SUB R4,R4,#2
  2771. .heloop1
  2772. ADD R10,R10,#1
  2773. LDR R3,[R11,#net.xsize]
  2774. SUB R3,R3,#2
  2775. .heloop2
  2776. LDRB R0,[R10]
  2777. CMP R0,#&10
  2778. BNE nothe
  2779. LDRB R0,[R10,-R5]
  2780. CMP R0,#&2F
  2781. BEQ hefound
  2782. LDRB R0,[R10,#-1]
  2783. CMP R0,#&2F
  2784. BEQ hefound
  2785. LDRB R0,[R10,#1]
  2786. CMP R0,#&2F
  2787. BEQ hefound
  2788. LDRB R0,[R10,R5]
  2789. CMP R0,#&2F
  2790. BEQ hefound
  2791. .nothe
  2792. ADD R10,R10,#1
  2793. SUBS R3,R3,#1
  2794. BGT heloop2
  2795. ADD R10,R10,#1
  2796. SUBS R4,R4,#1
  2797. BGT heloop1
  2798. LDMFD R13!,{R0-R11,PC}
  2799. .hefound
  2800. MOV R0,#&2F
  2801. STRB R0,[R10]
  2802. B nothe
  2803.  
  2804.  
  2805. .writeblocksleft
  2806. STMFD R13!,{R0-R2,R14}
  2807. LDR R0,[R12,#v.blocksleft]
  2808. CMP R0,#0
  2809. MOVLT R0,#0
  2810. ADR R1,blocksleftinj
  2811. MOV R2,#8
  2812. SWI XOS_ConvertCardinal2
  2813. LDMFD R13!,{R0-R2,PC}
  2814.  
  2815. .blockslefttext
  2816. DCD 64<<12,232<<12,0,0,&400000,0
  2817. .blocksleftinj
  2818. DBB 8
  2819. DCB 0
  2820. ALIGN
  2821.  
  2822. .writetimeleft
  2823. STMFD R13!,{R0-R2,R14}
  2824. LDR R1,[R12,#v.warptime]
  2825. MOV R2,#50
  2826. MYDIV R0,R1,R2
  2827. CMP R0,#0
  2828. MOVLT R0,#0
  2829. ADR R1,timeleftinj
  2830. MOV R2,#8
  2831. SWI XOS_ConvertCardinal2
  2832. LDMFD R13!,{R0-R2,PC}
  2833.  
  2834. .timelefttext
  2835. DCD 64<<12,232<<12,0,0,&400000,0
  2836. .timeleftinj
  2837. DBB 8
  2838. DCB 0
  2839. ALIGN
  2840.  
  2841.  
  2842.  
  2843. .handlemorph
  2844. STMFD R13!,{R0-R10,R14}
  2845. MOV R3,#0
  2846. MOV R4,#0
  2847. LDRB R7,[R10]
  2848. AND R0,R7,#&3
  2849. CMP R0,#0
  2850. MOVEQ R3,#-1
  2851. CMP R0,#1
  2852. MOVEQ R3,#1
  2853. CMP R0,#2
  2854. MOVEQ R4,#-1
  2855. CMP R0,#3
  2856. MOVEQ R4,#1
  2857. MOV R0,R10
  2858. BL backtranslate
  2859. STMFD R13!,{R0-R1,R3-R4}
  2860.  
  2861. .findlimits
  2862. MOV R2,#&40
  2863. CMP R7,#&BC
  2864. MOVGE R2,#&90
  2865. CMP R3,#0
  2866. BEQ findvertlimits
  2867. .findhorizlimits
  2868. MOV R5,R0
  2869. MOV R6,R0
  2870. MOV R4,#256
  2871. MOV R1,R10
  2872. .loop58
  2873. LDRB R0,[R1,#-1]!
  2874. CMP R0,R2
  2875. BGE foundhoriz1
  2876. SUB R5,R5,#96<<12
  2877. SUBS R4,R4,#1
  2878. BGT loop58 
  2879. .foundhoriz1
  2880. MOV R4,#256
  2881. MOV R1,R10
  2882. .loop59
  2883. LDRB R0,[R1,#1]!
  2884. CMP R0,R2
  2885. BGE foundhoriz2
  2886. ADD R6,R6,#96<<12
  2887. SUBS R4,R4,#1
  2888. BGT loop59 
  2889. .foundhoriz2
  2890. B findlimitsend
  2891.  
  2892. .findvertlimits
  2893. MOV R5,R1
  2894. MOV R6,R1
  2895. LDR R3,[R12,#v.levelnet]
  2896. LDR R3,[R3,#net.xsize]
  2897. MOV R4,#256
  2898. MOV R1,R10
  2899. .loop5a
  2900. LDRB R0,[R1,-R3]!
  2901. CMP R0,R2
  2902. BGE foundvert1
  2903. SUB R5,R5,#96<<12
  2904. SUBS R4,R4,#1
  2905. BGT loop5a 
  2906. .foundvert1
  2907. MOV R4,#256
  2908. MOV R1,R10
  2909. .loop5b
  2910. LDRB R0,[R1,R3]!
  2911. CMP R0,R2
  2912. BGE foundvert2
  2913. ADD R6,R6,#96<<12
  2914. SUBS R4,R4,#1
  2915. BGT loop5b 
  2916. .foundvert2
  2917. .findlimitsend
  2918.  
  2919. LDMFD R13!,{R0-R3}
  2920. STMFD R13!,{R5-R6}
  2921. MOV R6,R3
  2922. MOV R5,R2
  2923. MOV R4,R1
  2924. MOV R3,R0
  2925.  
  2926. MOV R0,#blockstab
  2927. MOV R1,#(blockstab<<24)+0
  2928. MOV R2,#%1001000010110010101
  2929. CMP R5,#0
  2930. ORREQ R2,R2,#1<<24
  2931. LDRB R7,[R10]
  2932. CMP R7,#&B4
  2933. ORRGE R2,R2,#1<<25
  2934. MOV R5,R5,ASL #13
  2935. MOV R6,R6,ASL #13
  2936. MOV R7,#0
  2937. MOV R8,#&005E005E
  2938. SWI Amnesia_MakeObject
  2939. LDMFD R13!,{R5-R6}
  2940. CMP R1,#0
  2941. BEQ morphfailed
  2942. STR R5,[R1,#32]
  2943. STR R6,[R1,#36]
  2944. LDRB R1,[R10]
  2945. MOV R0,#&10
  2946. CMP R1,#&B0
  2947. CMPNE R1,#&B2
  2948. MOVEQ R0,#0
  2949. CMP R1,#&B1
  2950. CMPNE R1,#&B3
  2951. MOVEQ R0,#&80
  2952. CMP R1,#&B8
  2953. MOVGE R0,#&0
  2954. CMP R1,#&BC
  2955. MOVGE R0,#&80
  2956. STRB R0,[R10]
  2957. .morphfailed
  2958. LDMFD R13!,{R0-R10,PC}
  2959.  
  2960.  
  2961. .warpball
  2962. STMFD R13!,{R0-R5,R14}
  2963. LDR R3,[R12,#v.warped]
  2964. MOV R5,R3
  2965. LDR R4,[R12,#v.balladr]
  2966. LDRB R4,[R4]
  2967. CMP R4,#&1C
  2968. MOVEQ R4,#1
  2969. CMP R4,#&1D
  2970. MOVEQ R4,#2
  2971. CMP R4,#&1E
  2972. MOVEQ R4,#4
  2973. CMP R4,#&1F
  2974. MOVEQ R4,#8
  2975. CMP R4,#8
  2976. MOVGT R4,#1
  2977. CMP R4,#0
  2978. MOVLE R4,#1
  2979. ADD R3,R3,R4,LSL #16
  2980.  
  2981. ADD R3,R3,#1
  2982. STR R3,[R12,#v.warped]
  2983. LDR R3,[R12,#v.levelno]
  2984. TST R3,#&400
  2985. BLNE warpexitmes
  2986. LDR R3,[R12,#v.levelno]
  2987. TST R3,#&400
  2988. BLEQ warpedmes
  2989. LDR R0,[R12,#v.levelnet]
  2990. LDR R0,[R0,#net.backdrop]
  2991. TST R0,#1<<30
  2992. LDMEQFD R13!,{R0-R5,PC}
  2993. LDR R0,[R12,#v.warped]
  2994. AND R0,R0,#&FF
  2995. CMP R0,#20
  2996. BLGE noblocks
  2997. LDMFD R13!,{R0-R5,PC}
  2998. .warpedmes
  2999. STMFD R13!,{R3,R14}
  3000. AND R0,R4,#&FF
  3001. ADR R1,warpballadr2       
  3002. MOV R2,#8
  3003. SWI XOS_ConvertCardinal2
  3004. LDR R3,[R12,#v.warped]
  3005. AND R0,R3,#&FF
  3006. ADR R1,warpballadr1       
  3007. MOV R2,#8
  3008. SWI XOS_ConvertCardinal2
  3009.  
  3010. ADR R0,warpballmes
  3011. BL message
  3012. ADR R0,warpballmes2
  3013. BL message
  3014. LDMFD R13!,{R3,PC}
  3015.  
  3016. .warpexitmes
  3017. STMFD R13!,{R3,R14}
  3018. LDR R3,[R12,#v.warped]
  3019. AND R3,R3,#&FF
  3020. MOV R0,R3
  3021. ADR R1,warpballadr       
  3022. MOV R2,#8
  3023. SWI XOS_ConvertCardinal2
  3024. CMP R5,#0
  3025. ADR R0,warpexittext2
  3026. ADREQ R0,warpexittext
  3027. BL message
  3028. CMP R5,#0
  3029. BLEQ message
  3030. ADR R0,warpballnum
  3031. BL message
  3032. LDMFD R13!,{R3,PC}
  3033.  
  3034. .warpballmes
  3035. DCD 160<<12,20<<12,0,0,&600001,0
  3036. DCB "BALLS WARPED ="
  3037. .warpballadr1
  3038. DBB 8
  3039. DCB 0
  3040. ALIGN
  3041. .warpballmes2
  3042. DCD 160<<12,40<<12,0,0,&600001,0
  3043. DCB "MULTIPLIER = "
  3044. .warpballadr2
  3045. DBB 8
  3046. DCB 0
  3047. ALIGN
  3048.  
  3049. .warpexittext
  3050. DCD 160<<12,20<<12,0,0,&600001,0
  3051. DCB "BALLS RETURNED",0
  3052. ALIGN
  3053. DCD 160<<12,40<<12,0,0,&600001,0
  3054. DCB "TO LEVEL",0
  3055. ALIGN
  3056. .warpexittext2
  3057. DCD 160<<12,40<<12,0,0,&600001,0
  3058. DCB "TOTAL RETURNED",0
  3059. ALIGN
  3060. .warpballnum
  3061. DCD 160<<12,60<<12,0,0,&600001,0
  3062. .warpballadr
  3063. DBB 8
  3064. DCB 0
  3065. ALIGN
  3066.  
  3067.  
  3068. .colchblocks
  3069. STMFD R13!,{R14}
  3070. MOV R0,#blockstab
  3071. MOV R1,#blockstab
  3072. .loop54
  3073. SWI Amnesia_CollisionCheck
  3074. CMP R0,#0
  3075. LDMEQFD R13!,{PC}
  3076. LDR R4,[R0,#4]
  3077. LDR R5,[R1,#4]
  3078. TST R4,#1<<20
  3079. TSTEQ R5,#1<<20
  3080. BNE loop54
  3081. LDR R4,[R0,#16]
  3082. RSB R4,R4,#0
  3083. STR R4,[R0,#16]
  3084. LDR R4,[R1,#16]
  3085. RSB R4,R4,#0
  3086. STR R4,[R1,#16]
  3087. LDR R4,[R0,#20]
  3088. RSB R4,R4,#0
  3089. STR R4,[R0,#20]
  3090. LDR R4,[R1,#20]
  3091. RSB R4,R4,#0
  3092. STR R4,[R1,#20]
  3093. B loop54
  3094.  
  3095. .colchblockball
  3096. STMFD R13!,{R14}
  3097.  
  3098. MOV R0,#blockstab
  3099. MOV R1,#ballstab
  3100. .loopo
  3101. SWI Amnesia_CollisionCheck
  3102. CMP R0,#0
  3103. LDMEQFD R13!,{PC}
  3104. STMFD R13!,{R0-R3}
  3105. MOV R8,R0
  3106. MOV R9,R1
  3107. BL blockballcol
  3108. BCS ballblocknohit
  3109. LDR R0,[R8,#8]
  3110. LDR R2,[R12,#v.plxcent]
  3111. SUB R0,R0,R2
  3112. LDR R1,[R8,#12]
  3113. LDR R2,[R12,#v.plycent]
  3114. SUB R1,R1,R2
  3115. BL chinksound
  3116. .ballblocknohit
  3117. LDMFD R13!,{R0-R3}
  3118. B loopo
  3119.  
  3120.  
  3121. .stoneballcol
  3122. STMFD R13!,{R14}
  3123. MOV R5,#96<<12
  3124. MUL R4,R2,R5
  3125. MUL R5,R3,R5
  3126. MOV R6,#0
  3127. MOV R7,#0
  3128. STMFD R13!,{R4-R7}
  3129.  
  3130. ADD R14,R9,#8
  3131. LDMIA R14,{R0-R3}
  3132. SUB R0,R0,R4
  3133. SUB R1,R1,R5
  3134. SUB R2,R2,R6
  3135. SUB R3,R3,R7
  3136.  
  3137. MOV R4,#96
  3138. MOV R5,#96
  3139. LDR R6,[R9,#28]
  3140. MOV R6,R6,LSR #16
  3141. STMFD R13!,{R4-R6}
  3142. BL blockwindback
  3143. STR R4,[R12,#v.temp1]
  3144. CMP R4,#&1FC
  3145. LDMFD R13!,{R4-R6}
  3146. BGT stoneblockmiss
  3147. STMFD R13!,{R0-R1}
  3148. MOV R6,#0
  3149. MOV R7,#0
  3150. CMP R0,R4,ASL #11
  3151. SUBGE R6,R0,R4,ASL #11
  3152. CMN R0,R4,ASL #11
  3153. ADDLT R6,R0,R4,ASL #11
  3154. CMP R1,R5,ASL #11
  3155. SUBGE R7,R1,R5,ASL #11
  3156. CMN R1,R5,ASL #11
  3157. ADDLT R7,R1,R5,ASL #11
  3158. TST R8,#8
  3159. BLNE hitsteps
  3160. TST R8,#8
  3161. LDMNEFD R13!,{R0-R1}
  3162. BNE stoneblockmiss
  3163. MOV R0,R6
  3164. MOV R1,R7
  3165. CMP R0,#0
  3166. CMPEQ R1,#0
  3167. LDMEQFD R13!,{R0-R1}
  3168. BEQ whackprocess
  3169. LDR R2,[R9,#16]
  3170. LDR R3,[R9,#20]
  3171. BL vecreflect
  3172. LDMFD R13!,{R0-R1}
  3173. BCS stoneblockmiss
  3174. .whackins
  3175. ORR R8,R8,#32
  3176. STMFD R13!,{R4,R5}
  3177. LDR R4,[R9,#16]
  3178. LDR R5,[R9,#20]
  3179. SUBS R4,R4,R2
  3180. RSBMI R4,R4,#0
  3181. SUBS R5,R5,R3
  3182. RSBMI R5,R5,#0
  3183. ADD R4,R4,R5
  3184. MOV R4,R4,LSR #6
  3185. STR R4,[R12,#v.colpitch]
  3186. LDMFD R13!,{R4,R5}
  3187.  
  3188. LDR R5,[R9,#4]; set the collided flags
  3189. CMP R2,#0
  3190. ORRGT R5,R5,#1<<20
  3191. ORRLT R5,R5,#1<<21
  3192. CMP R3,#0
  3193. ORRGT R5,R5,#1<<22
  3194. ORRLT R5,R5,#1<<23
  3195. STR R5,[R9,#4]
  3196. LDMFD R13!,{R4-R7}
  3197. ADD R0,R0,R4
  3198. ADD R1,R1,R5
  3199. ADD R2,R2,R6
  3200. ADD R3,R3,R7
  3201. LDR R4,[R12,#v.temp1]
  3202. LDMFD R13!,{R14}
  3203. BIC R14,R14,#1<<29
  3204. MOVS PC,R14
  3205. .stoneblockmiss
  3206. LDMFD R13!,{R4-R7}
  3207. LDMFD R13!,{R14}
  3208. ORR R14,R14,#1<<29
  3209. MOVS PC,R14
  3210.  
  3211. .whackprocess
  3212. BL ballexplode
  3213. B whackins
  3214.  
  3215. .hitsteps
  3216. STMFD R13!,{R0,R14}
  3217. LDR R0,[R9,#32]
  3218. CMP R0,#0
  3219. LDMGTFD R13!,{R0,PC}
  3220. LDRB R0,[R10]
  3221. CMP R0,#&C8
  3222. BEQ stepsleft
  3223. CMP R0,#&C9
  3224. BEQ stepsright
  3225. CMP R0,#&CA
  3226. BEQ stepsup
  3227. CMP R0,#&CB
  3228. BEQ stepsdown
  3229. B stepsbounce
  3230. .stepsdown
  3231. CMP R7,#0
  3232. BLE stepsbounce
  3233. B stepmount
  3234. .stepsup
  3235. CMP R7,#0
  3236. BGE stepsbounce
  3237. B stepmount
  3238. .stepsright
  3239. CMP R6,#0
  3240. BLE stepsbounce
  3241. B stepmount
  3242. .stepsleft
  3243. CMP R6,#0
  3244. BGE stepsbounce
  3245. B stepmount
  3246. .stepsbounce
  3247. CMP R6,#0
  3248. CMPEQ R7,#0
  3249. BICNE R8,R8,#8
  3250. LDMFD R13!,{R0,PC}
  3251. .stepmount
  3252. LDMFD R13!,{R0,PC}
  3253.  
  3254.  
  3255. .blockballcol
  3256. STMFD R13!,{R14}
  3257.  
  3258. ADD R14,R8,#8
  3259. LDMIA R14,{R4-R7}
  3260. LDR R0,[R8,#4]
  3261. TST R0,#4
  3262.  
  3263. LDR R0,[R9,#8]
  3264. LDR R1,[R9,#12]
  3265. LDR R2,[R9,#36]
  3266. LDR R3,[R9,#40]
  3267. SUB R2,R0,R2 ;get historical velocity
  3268. SUB R3,R1,R3
  3269. SUB R0,R0,R4
  3270. SUB R1,R1,R5
  3271. SUBNE R2,R2,R6
  3272. SUBNE R3,R3,R7
  3273.  
  3274. LDR R4,[R8,#28];block size
  3275. AND R5,R4,#&FFFF;block y size
  3276. MOV R4,R4,LSR #16;block x size
  3277. LDR R6,[R9,#28]
  3278. MOV R6,R6,LSR #16
  3279. STMFD R13!,{R4-R6}
  3280. BL blockwindback
  3281. STR R4,[R12,#v.temp2]
  3282. CMP R4,#&1FC
  3283. LDMFD R13!,{R4-R6}
  3284. BGT ballblockmiss
  3285. STMFD R13!,{R0-R1}
  3286. MOV R6,#0
  3287. MOV R7,#0
  3288. CMP R0,R4,ASL #11
  3289. SUBGE R6,R0,R4,ASL #11
  3290. CMN R0,R4,ASL #11
  3291. ADDLT R6,R0,R4,ASL #11
  3292. CMP R1,R5,ASL #11
  3293. SUBGE R7,R1,R5,ASL #11
  3294. CMN R1,R5,ASL #11
  3295. ADDLT R7,R1,R5,ASL #11
  3296. MOV R0,R6
  3297. MOV R1,R7
  3298. CMP R0,#0
  3299. CMPEQ R1,#0
  3300. LDMEQFD R13!,{R0-R1}
  3301. BEQ blockwhack
  3302. LDR R2,[R8,#4]
  3303. TST R2,#4
  3304. LDR R2,[R9,#16]
  3305. LDR R14,[R8,#16]
  3306. SUBNE R2,R2,R14
  3307. LDR R3,[R9,#20]
  3308. LDR R14,[R8,#20]
  3309. SUBNE R3,R3,R14
  3310. BL vecreflect
  3311. LDMFD R13!,{R0-R1}
  3312. BCS ballblockmiss
  3313. .blockwhackins
  3314. STMFD R13!,{R4,R5}
  3315. LDR R4,[R9,#16]
  3316. LDR R5,[R9,#20]
  3317. SUBS R4,R4,R2
  3318. RSBMI R4,R4,#0
  3319. SUBS R5,R5,R3
  3320. RSBMI R5,R5,#0
  3321. ADD R4,R4,R5
  3322. MOV R4,R4,LSR #6
  3323. STR R4,[R12,#v.colpitch]
  3324. LDMFD R13!,{R4,R5}
  3325. LDR R5,[R9,#4]; set the collided flags
  3326. CMP R2,#0
  3327. ORRGT R5,R5,#1<<20
  3328. ORRLT R5,R5,#1<<21
  3329. CMP R3,#0
  3330. ORRGT R5,R5,#1<<22
  3331. ORRLT R5,R5,#1<<23
  3332. STR R5,[R9,#4]
  3333. ADD R14,R8,#8
  3334. LDMIA R14,{R4-R7}
  3335. LDR R14,[R8,#4]
  3336. TST R14,#4
  3337. ADD R0,R0,R4
  3338. ADD R1,R1,R5
  3339. ADDNE R2,R2,R6
  3340. ADDNE R3,R3,R7
  3341. BL limitballspeed
  3342. ADD R14,R9,#8
  3343. STMIA R14,{R0-R3}
  3344. LDR R4,[R8,#4]
  3345. ORR R4,R4,#4
  3346. STR R4,[R8,#4]
  3347. LDR R4,[R12,#v.temp2]
  3348. LDMFD R13!,{R14}
  3349. BIC R14,R14,#1<<29
  3350. MOVS PC,R14
  3351. .ballblockmiss
  3352. LDMFD R13!,{R14}
  3353. ORR R14,R14,#1<<29
  3354. MOVS PC,R14
  3355.  
  3356. .blockwhack
  3357. BL ballexplode
  3358. B blockwhackins
  3359.  
  3360.  
  3361. .blocktostar
  3362. STMFD R13!,{R0-R8,R14}
  3363. LDR R3,[R8,#8]
  3364. LDR R4,[R8,#12]
  3365. BL starmake
  3366. LDMFD R13!,{R0-R8,PC}
  3367.  
  3368. .colchbatball
  3369. STMFD R13!,{R14}
  3370.  
  3371. MOV R0,#batstab
  3372. MOV R1,#ballstab
  3373. .loopl
  3374. SWI Amnesia_CollisionCheck
  3375. CMP R0,#0
  3376. LDMEQFD R13!,{PC}
  3377. STMFD R13!,{R0-R3}
  3378. MOV R8,R0
  3379. MOV R9,R1
  3380. BL batballcol
  3381. CMP R4,#255
  3382. BGE nobatballcol
  3383. LDR R0,[R9,#4]
  3384. TST R0,#1<<26
  3385. BLNE destroybat
  3386. STMFD R13!,{R0-R1}
  3387. BL objectrange
  3388. BL cracksound
  3389. LDMFD R13!,{R0-R1}
  3390. .nobatballcol
  3391. LDMFD R13!,{R0-R3}
  3392. B loopl
  3393.  
  3394. .destroybat
  3395. STMFD R13!,{R9,R14}
  3396. MOV R0,#0
  3397. STR R0,[R8,#0]
  3398. BL batexplode
  3399.  
  3400. BL deathsound
  3401. LDR R0,[R12,#v.pllives]
  3402. CMP R0,#0
  3403. BLEQ gameovermes
  3404. LDMFD R13!,{R9,PC}
  3405.  
  3406.  
  3407. .batballcol
  3408. STMFD R13!,{R0-R3,R14}
  3409. LDR R0,[R9,#8]
  3410. LDR R1,[R9,#12]
  3411. LDR R2,[R9,#16]
  3412. LDR R3,[R9,#20]
  3413. LDR R4,[R12,#v.xpos]
  3414. LDR R5,[R12,#v.ypos]
  3415. LDR R6,[R12,#v.xvec]
  3416. LDR R7,[R12,#v.yvec]
  3417. SUB R0,R0,R4
  3418. SUB R1,R1,R5
  3419. SUB R2,R2,R6
  3420. SUB R3,R3,R7
  3421. STMFD R13!,{R4-R7}
  3422. MOV R4,#batwidth
  3423. MOV R5,#batheight
  3424. MOV R6,#ballsize
  3425. STMFD R13!,{R2-R3}
  3426. BL windback
  3427. LDMFD R13!,{R2-R3}
  3428. MOV R10,R4
  3429. CMP R10,#255
  3430. BEQ batballmiss
  3431.  
  3432. STMFD R13!,{R0-R1}
  3433. MOV R4,#(batwidth-batheight)<<11
  3434. MOV R5,#0
  3435. CMP R0,R4
  3436. SUBGE R5,R0,R4
  3437. CMN R0,R4
  3438. ADDLT R5,R0,R4
  3439. MOV R0,R5
  3440.  
  3441. ; Solving x=x-2(xu+yv)u/(u^2+v^2)
  3442. ;
  3443. ;R0=u
  3444. ;R1=v
  3445. ;R2=x
  3446. ;R3=y
  3447.  
  3448. BL vecreflect
  3449. LDMFD R13!,{R0-R1}
  3450. MOVCS R10,#255
  3451. BCS batballmiss
  3452. STMFD R13!,{R4,R5}
  3453. LDR R4,[R9,#16]
  3454. SUBS R4,R4,R2
  3455. RSBMI R4,R4,#0
  3456. LDR R5,[R9,#20]
  3457. SUBS R5,R5,R3
  3458. RSBMI R5,R5,#0
  3459. ADD R4,R4,R5
  3460. MOV R4,R4,LSR #9
  3461. RSBS R4,R4,#&6F
  3462. MOVMI R4,#0
  3463. STR R4,[R12,#v.colpitch]
  3464. LDMFD R13!,{R4,R5}
  3465.  
  3466.  
  3467. .batballmiss
  3468.  
  3469. LDMFD R13!,{R4-R7}
  3470. CMP R10,#255
  3471. BEQ batballmiss2
  3472.  
  3473. ADD R0,R0,R4
  3474. ADD R1,R1,R5
  3475. ADD R2,R2,R6
  3476. ADD R3,R3,R7
  3477. ; double collision checks
  3478. LDR R5,[R12,#v.magnet]
  3479. CMP R5,#0
  3480. BNE skipprobs
  3481. LDR R5,[R12,#v.bastmode]
  3482. CMP R5,#0
  3483. BNE skipprobs
  3484. LDR R5,[R9,#4]
  3485. TST R5,#1<<20; left bit
  3486. BEQ noleftprobs
  3487. CMP R2,#0
  3488. LDRLT R0,[R9,#8]
  3489. MOVLT R2,#0
  3490. .noleftprobs
  3491. TST R5,#1<<21; right bit
  3492. BEQ norightprobs
  3493. CMP R2,#0
  3494. LDRGT R0,[R9,#8]
  3495. MOVGT R2,#0
  3496. .norightprobs
  3497. TST R5,#1<<22; up bit
  3498. BEQ noupprobs
  3499. CMP R3,#0
  3500. LDRLT R1,[R9,#12]
  3501. MOVLT R3,#0
  3502. .noupprobs
  3503. TST R5,#1<<23; down bit
  3504. BEQ nodownprobs
  3505. CMP R3,#0
  3506. LDRGT R1,[R9,#12]
  3507. MOVGT R3,#0
  3508. .skipprobs
  3509. .nodownprobs
  3510.  
  3511. ;STR R0,[R9,#8]
  3512. ;STR R1,[R9,#12]
  3513. STR R2,[R9,#16]
  3514. STR R3,[R9,#20]
  3515. .batballmiss2
  3516.  
  3517. MOV R4,R10
  3518. LDMFD R13!,{R0-R3,PC}
  3519.  
  3520. .vecreflect
  3521. STMFD R13!,{R4-R7}
  3522. MOV R0,R0,ASR #4
  3523. MOV R1,R1,ASR #4
  3524. ;MOV R2,R2,ASR #4
  3525. ;MOV R3,R3,ASR #4
  3526.  
  3527. ;R0=u bp 8
  3528. ;R1=v bp 8
  3529. ;R2=x bp 8
  3530. ;R3=y bp 8
  3531. MUL R4,R0,R2
  3532. MUL R5,R1,R3
  3533. ADDS R5,R4,R5
  3534. BPL vecrefmiss
  3535. ;R5=(xu+yv) bin pt 20
  3536. MOV R7,R0
  3537. MUL R7,R0,R7
  3538. MOV R6,R1
  3539. MUL R6,R1,R6
  3540. ADD R6,R6,R7; R6 = (u^2+v^2) bin pt 16
  3541. MOVS R6,R6,ASR #8; bin pt 8
  3542. BEQ vecrefdiv0
  3543. MYDIV R4,R5,R6
  3544. CMP R4,#&70000000
  3545. MOVGT PC,#0
  3546. CMN R4,#&70000000
  3547. MOVLT PC,#0
  3548. ;R4=(xu+yv)/(u^2+v^2) bin pt 12
  3549. ;Now do -2(R4)u
  3550. MUL R5,R4,R0; bin pt 20
  3551. SUB R2,R2,R5,ASR #7; 2*R2 bin pt 12
  3552. MUL R5,R4,R1
  3553. SUB R3,R3,R5,ASR #7
  3554. BIC R14,R14,#1<<29; clear carry
  3555. .vecrefins
  3556. MOV R0,R0,ASL #4
  3557. MOV R1,R1,ASL #4
  3558. ;MOV R2,R2,ASL #4
  3559. ;MOV R3,R3,ASL #4
  3560. LDMFD R13!,{R4-R7}
  3561. MOVS PC,R14
  3562. .vecrefmiss
  3563. .vecrefdiv0
  3564. ORR R14,R14,#1<<29
  3565. B vecrefins
  3566.  
  3567.  
  3568. .colchbatstars
  3569. STMFD R13!,{R14}
  3570.  
  3571. MOV R0,#batstab
  3572. MOV R1,#starstab
  3573. .loopu
  3574. SWI Amnesia_CollisionCheck
  3575. CMP R0,#0
  3576. LDMEQFD R13!,{PC}
  3577. BL goodyget
  3578. B loopu
  3579.  
  3580. .goodyget
  3581. STMFD R13!,{R0-R3,R14}
  3582. MOV R8,R0
  3583. MOV R9,R1
  3584.  
  3585. LDR R7,[R9,#32]
  3586. AND R0,R7,#&F0
  3587. CMP R0,#&50
  3588. BEQ goodystore
  3589. MOV R0,#0
  3590. STR R0,[R9,#0]
  3591.  
  3592. LDR R0,[R9,#32]
  3593. AND R0,R0,#&F
  3594. MOV R1,R9
  3595. BL goodyuse
  3596. BL goodyuseeffect
  3597. .goodygetend
  3598. ADD R6,R12,#v.goodytab
  3599. #rept 4
  3600. LDR R0,[R6],#4
  3601. CMP R0,#11
  3602. BEQ radarok
  3603. #endr
  3604. MOV R0,#0
  3605. STR R0,[R12,#v.lineradar]
  3606. .radarok
  3607. BL objectrange
  3608. BL goodysound
  3609. LDMFD R13!,{R0-R3,PC}
  3610.  
  3611. .goodystore
  3612. ADD R6,R12,#v.goodytab
  3613. LDR R0,[R6]
  3614. CMP R0,#0
  3615. BEQ thisgoody
  3616. ADD R6,R6,#4
  3617. LDR R0,[R6]
  3618. CMP R0,#0
  3619. BEQ thisgoody
  3620. ADD R6,R6,#4
  3621. LDR R0,[R6]
  3622. CMP R0,#0
  3623. BEQ thisgoody
  3624. ADD R6,R6,#4
  3625. LDR R0,[R6]
  3626. CMP R0,#0
  3627. BEQ thisgoody
  3628. ADD R6,R12,#v.goodytab
  3629. LDR R0,[R12,#v.goodycsr]
  3630. AND R0,R0,#3
  3631. ADD R6,R6,R0,LSL #2
  3632. .thisgoody
  3633. MOV R1,R6
  3634. LDR R0,[R9,#32]
  3635. AND R0,R0,#&F
  3636. STR R0,[R6]
  3637. CMP R0,#11
  3638. MOVEQ R0,#1
  3639. STREQ R0,[R12,#v.lineradar]
  3640. MOV R0,#0
  3641. STR R0,[R9,#0]
  3642. BL goodystoreeffect
  3643. B goodygetend
  3644.  
  3645.  
  3646. .makebat
  3647. STMFD R13!,{R14}
  3648. MOV R0,#batstab
  3649. SWI Amnesia_WipeTable
  3650. MOV R0,#batstab
  3651. MOV R1,#&01000000
  3652. MOV R2,#%10011010001+(1<<18)
  3653. MOV R3,#128<<12
  3654. MOV R4,#128<<12
  3655. MOV R5,#0
  3656. MOV R6,#0
  3657. MOV R7,#0
  3658. MOV R8,#0
  3659. SWI Amnesia_MakeObject
  3660. BL homebat
  3661. LDMFD R13!,{PC}
  3662.  
  3663. .decormake
  3664. STMFD R13!,{R14}
  3665. BL random
  3666. AND R1,R0,#3
  3667. BL random
  3668. AND R0,R0,#&7FF000
  3669. SUB R0,R0,#&400000
  3670. MOV R3,R0
  3671. BL random
  3672. AND R0,R0,#&7FF000
  3673. SUB R0,R0,#&400000
  3674. MOV R4,R0
  3675. BL decorate
  3676. LDMFD R13!,{PC}
  3677.  
  3678. .balldecor
  3679. STMFD R13!,{R1-R8,R14}
  3680. LDR R3,[R9,#8]
  3681. LDR R4,[R9,#12]
  3682. LDR R5,[R9,#28]
  3683. AND R6,R5,#&FFFF
  3684. MOV R5,R5,LSR #16
  3685. TST R0,#2
  3686. SUBNE R3,R3,R5,LSL #11
  3687. TST R0,#1
  3688. ADDNE R3,R3,R5,LSL #11
  3689. TST R0,#8
  3690. SUBNE R4,R4,R6,LSL #11
  3691. TST R0,#4
  3692. ADDNE R4,R4,R6,LSL #11
  3693. MOV R1,#2
  3694. BL decorate
  3695. LDMFD R13!,{R1-R8,PC}
  3696.  
  3697.  
  3698. .decorate               ;R1 decor type
  3699.             ;R3,R4 coords
  3700. STMFD R13!,{R5-R8,R14}
  3701. MOV R2,#%1000001001110001
  3702. MOV R5,#0
  3703. MOV R6,#0
  3704. MOV R7,#&10000080
  3705. CMP R1,#2
  3706. MOV R7,#&03000080
  3707. MOV R8,#0
  3708. MOV R0,#decortab
  3709. ADD R1,R1,#(decortab)<<24
  3710. SWI Amnesia_MakeObject
  3711. LDMFD R13!,{R5-R8,PC}
  3712.  
  3713. .vdecorate               ;R1 decor type
  3714.             ;R3,R4 coords
  3715. STMFD R13!,{R5-R8,R14}
  3716. MOV R2,#%1000000100110101
  3717. MOV R7,#&10000080
  3718. CMP R1,#2
  3719. MOVEQ R7,#&03000080
  3720. MOV R8,#0
  3721. MOV R0,#decortab
  3722. ADD R1,R1,#(decortab)<<24
  3723. SWI Amnesia_MakeObject
  3724. LDMFD R13!,{R5-R8,PC}
  3725.  
  3726. .gdecorate               ;R1 decor type
  3727.             ;R3,R4 coords
  3728. STMFD R13!,{R5-R8,R14}
  3729. MOV R2,#%1000000100010101
  3730. MOV R7,#&10000080
  3731. MOV R8,#0
  3732. MOV R0,#decortab
  3733. ORR R1,R1,#(goodytab)<<24
  3734. SWI Amnesia_MakeObject
  3735. LDMFD R13!,{R5-R8,PC}
  3736.  
  3737.  
  3738.  
  3739. .bateffects
  3740. STMFD R13!,{R14}
  3741. LDR R0,[R12,#v.ballfire]
  3742. SUBS R0,R0,#1
  3743. STRPL R0,[R12,#v.ballfire]
  3744. LDR R0,[R12,#v.blueball]
  3745. SUBS R0,R0,#1
  3746. STRPL R0,[R12,#v.blueball]
  3747. LDR R0,[R12,#v.bastard]
  3748. SUBS R0,R0,#1
  3749. STRPL R0,[R12,#v.bastard]
  3750. CMP R0,#0
  3751. LDR R1,[R12,#v.ballspeed]
  3752. MOVGT R1,R1,ASL #1
  3753. CMP R1,#31<<12
  3754. MOVGT R1,#31<<12
  3755. STR R1,[R12,#v.ballspeedlim]
  3756. CMP R0,#0
  3757. LDR R1,[R12,#v.mousespeed]
  3758. ADDGT R1,R1,#1
  3759. STR R1,[R12,#v.mousesens]
  3760.  
  3761.  
  3762. LDR R0,[R12,#v.lineradar]
  3763. CMP R0,#1
  3764. BLGE lineradardecor
  3765. LDR R0,[R12,#v.framectr]
  3766. LDR R1,[R12,#v.bateffect]
  3767. SUBS R1,R0,R1
  3768. BMI dobateffect
  3769. CMP R1,#4
  3770. LDMLTFD R13!,{PC}
  3771. .dobateffect
  3772. STR R0,[R12,#v.bateffect]
  3773. LDR R3,[R12,#v.xpos]
  3774. LDR R4,[R12,#v.ypos]
  3775. LDR R0,[R12,#v.magnet]
  3776. CMP R0,#0
  3777. MOV R1,#2+(goodytab<<24)
  3778. BLGT batmagnetdecor
  3779. LDMFD R13!,{PC}
  3780.  
  3781. .batmagnetdecor
  3782. STMFD R13!,{R3-R4,R14}
  3783. BL random
  3784. AND R0,R0,#&7FF0
  3785. SUB R0,R0,#&4000
  3786. MOV R5,R0
  3787. BL random
  3788. AND R0,R0,#&7FF0
  3789. SUB R0,R0,#&4000
  3790. MOV R6,R0
  3791. STMFD R13!,{R5,R6}
  3792. LDR R0,[R12,#v.xvec]
  3793. ADD R5,R5,R0
  3794. LDR R0,[R12,#v.yvec]
  3795. ADD R6,R6,R0
  3796. MOV R2,#%1000000100010101+(1<<24)
  3797. MOV R7,#&03000010
  3798. MOV R8,#0
  3799. MOV R0,#decortab
  3800.  
  3801. SWI Amnesia_MakeObject
  3802. LDMFD R13!,{R5,R6}
  3803. RSB R5,R5,#0
  3804. RSB R6,R6,#0
  3805. MOV R5,R5,ASR #4
  3806. MOV R6,R6,ASR #4
  3807. STR R5,[R1,#32]
  3808. STR R6,[R1,#36]
  3809. LDMFD R13!,{R3-R4,PC}
  3810.  
  3811. .lineradardecor
  3812. STMFD R13!,{R14}
  3813. LDR R9,[R12,#v.framectr]
  3814. MOV R9,R9,ASR #2
  3815. LDR R3,[R12,#v.xpos]
  3816. LDR R4,[R12,#v.ypos]
  3817. LDR R5,[R12,#v.ballxpos]
  3818. LDR R6,[R12,#v.ballypos]
  3819. SUB R5,R5,R3
  3820. SUB R6,R6,R4
  3821. MOVS R0,R5
  3822. RSBMI R0,R5,#0
  3823. MOVS R1,R6
  3824. RSBMI R1,R6,#0
  3825. ADD R0,R0,R1
  3826. CMP R0,#128<<12
  3827. BLT lineradardecorend
  3828. MOV R5,R5,ASR #6
  3829. MOV R6,R6,ASR #6
  3830. #rept 8
  3831. ADD R3,R3,R5
  3832. ADD R4,R4,R6
  3833. BL radarobject
  3834. #endr
  3835. .lineradardecorend
  3836. LDMFD R13!,{PC}
  3837.  
  3838. .radarobject
  3839. STMFD R13!,{R3-R6,R14}
  3840. MOV R0,#decortab
  3841. MOV R1,#(decortab<<24)+1
  3842. AND R9,R9,#&F
  3843. ADD R1,R1,R9,LSL #16
  3844. ADD R9,R9,#1
  3845. MOV R2,#%1000001000010101
  3846. MOV R5,#0
  3847. MOV R6,#0
  3848. MOV R7,#&00010001
  3849. MOV R8,#0
  3850. SWI Amnesia_MakeObject
  3851. LDMFD R13!,{R3-R6,PC}
  3852.  
  3853.  
  3854.  
  3855. .makeball
  3856. STMFD R13!,{R14}
  3857. MOV R0,#0
  3858. STR R0,[R12,#v.dead]
  3859. MOV R1,#&03000000
  3860. MOV R2,#%10100000000+(1<<25)+(1<<18)
  3861. BL random
  3862. AND R5,R0,#&FFFF
  3863. SUB R5,R5,#&7FFF
  3864. BL random
  3865. AND R6,R0,#&7FFF
  3866. SUB R6,R6,#&9FFF
  3867. LDR R7,[R12,#v.demomode]
  3868. CMP R7,#1
  3869. CMPNE R7,#2
  3870. MOVEQ R5,#2<<12
  3871. MOVEQ R6,#2<<12
  3872. MOV R7,#&01000010
  3873. MOV R8,#&00200020
  3874. MOV R0,#ballstab
  3875. SWI Amnesia_MakeObject
  3876. MOV R0,#2
  3877. STR R0,[R1,#32]
  3878. LDMFD R13!,{PC}
  3879.  
  3880. .makeblueball
  3881. STMFD R13!,{R14}
  3882. MOV R1,#&03000001
  3883. MOV R2,#%10100000000+(1<<25)+(1<<29)+(1<<18)
  3884. BL random
  3885. AND R5,R0,#&3FFFF
  3886. SUB R5,R5,#&20000
  3887. BL random
  3888. AND R6,R0,#&3FFFF
  3889. SUB R6,R6,#&20000
  3890. MOV R7,#&01000010
  3891. MOV R8,#&00200020
  3892. MOV R0,#ballstab
  3893. SWI Amnesia_MakeObject
  3894. MOV R0,#2
  3895. STR R0,[R1,#32]
  3896. LDMFD R13!,{PC}
  3897.  
  3898. .makeredball
  3899. STMFD R13!,{R14}
  3900. MOV R1,#&03000002
  3901. MOV R2,#%10100000000+(1<<25)+(1<<26)+(1<<29)+(1<<18)
  3902. BL random
  3903. AND R5,R0,#&3FFFF
  3904. SUB R5,R5,#&20000
  3905. BL random
  3906. AND R6,R0,#&3FFFF
  3907. SUB R6,R6,#&20000
  3908. MOV R7,#&01000010
  3909. MOV R8,#&00200020
  3910. MOV R0,#ballstab
  3911. SWI Amnesia_MakeObject
  3912. MOV R0,#2
  3913. STR R0,[R1,#32]
  3914. LDMFD R13!,{PC}
  3915.  
  3916. .makeballdecor
  3917. STMFD R13!,{R14}
  3918. LDR R3,[R1,#8]
  3919. LDR R4,[R1,#12]
  3920. MOV R1,#1
  3921. MOV R2,#16
  3922. ADR R11,circletab
  3923. .loopt
  3924. STMFD R13!,{R1-R4,R11}
  3925. LDMIA R11,{R5,R6}
  3926. MOV R5,R5,ASR #16
  3927. MOV R6,R6,ASR #16
  3928. BL vdecorate
  3929. LDMFD R13!,{R1-R4,R11}
  3930. ADD R11,R11,#128
  3931. SUBS R2,R2,#1
  3932. BGT loopt
  3933. LDMFD R13!,{PC}
  3934.  
  3935. .makeblock
  3936. STMFD R13!,{R14}
  3937. MOV R1,#(blockstab<<24)+0
  3938. MOV R2,#%1000010111010101+(1<<18)
  3939. MOV R3,#0
  3940. MOV R4,#-256<<12
  3941. MOV R5,#0
  3942. MOV R6,#1<<12
  3943. MOV R7,#0
  3944. MOV R8,#0
  3945. MOV R0,#blockstab
  3946. SWI Amnesia_MakeObject
  3947. MVN R3,#96<<16
  3948. STR R3,[R1,#32]
  3949. MOV R3,#96<<16
  3950. STR R3,[R1,#36]
  3951. LDMFD R13!,{PC}
  3952.  
  3953. .starmake
  3954. STMFD R13!,{R14}
  3955. STMFD R13!,{R5}
  3956. MOV R0,#starstab
  3957. MOV R1,#&09000000
  3958. MOV R2,#%1000001000110101+(1<<31)+(1<<18)
  3959. MOV R5,#0
  3960. MOV R6,#32<<12
  3961. MOV R7,#&0000FFC0
  3962. MOV R8,#&00300030
  3963. SWI Amnesia_MakeObject
  3964. LDMFD R13!,{R5}
  3965. STR R5,[R1,#32]
  3966. LDMFD R13!,{PC}
  3967.  
  3968.  
  3969. .writebank
  3970. STMFD R13!,{R14}
  3971. .writebankloop
  3972. SWI Blitz_Time
  3973. MOV R3,R0
  3974. MOV R0,R0,LSR #1
  3975. CMP R0,#1
  3976. BGE goforwrites
  3977. SWI OS_ReadEscapeState
  3978. BCC writebankloop
  3979. .goforwrites
  3980. STR R0,[R12,#v.realrate]
  3981. CMP R0,#1
  3982. MOVNE R0,#2
  3983.  
  3984. STR R0,[R12,#v.frameinc]
  3985. LDR R1,[R12,#v.framectr]
  3986. ADD R1,R1,R0
  3987. STR R1,[R12,#v.framectr]
  3988. SUB R0,R3,R0,LSL #1
  3989. CMP R0,#2
  3990. MOVGT R0,#2
  3991. CMP R0,#0
  3992. MOVLT R0,#0
  3993. SWI Blitz_SetTime
  3994. BL softshift
  3995. LDMFD R13!,{PC}
  3996.  
  3997.  
  3998. #set demolen = &8000
  3999. .demomake
  4000. STMFD R13!,{R14}
  4001. LDR R0,[R12,#v.demomode]
  4002. CMP R0,#0
  4003. LDMNEFD R13!,{PC}
  4004. BL releasedemo
  4005. ADD R0,R12,#v.demoadr
  4006. MOV R1,#demolen
  4007. ADR R2,demoname
  4008. MOV R3,#0
  4009. SWI Amnesia_ClaimBlock
  4010. MOV R0,#demolen
  4011. LDR R1,[R12,#v.demoadr]
  4012. STR R0,[R1]
  4013. MOV R0,#4
  4014. STR R0,[R12,#v.democtr]
  4015. MOV R0,#2
  4016. STR R0,[R12,#v.demomode]
  4017. MOV R0,#0
  4018. STR R0,[R12,#v.rnseed]
  4019. BL savegame
  4020.  
  4021. ADR R0,demomakemes
  4022. BL message
  4023. LDMFD R13!,{PC}
  4024. .demomakemes
  4025. DCD 160<<12,128<<12,0,0,&00500001,0
  4026. DCB "DEMO RECORDING",0
  4027. ALIGN
  4028.  
  4029. .demoname
  4030. DCB "Demo",0
  4031. ALIGN
  4032.  
  4033. .demostart
  4034. STMFD R13!,{R14}
  4035. BL releasedemo
  4036. MOV R0,#texttab
  4037. SWI Amnesia_WipeTable
  4038. MOV R0,#1
  4039. STR R0,[R12,#v.demomode]
  4040. MVN R0,#0
  4041. STR R0,[R12,#v.loadedlev]
  4042. MOV R0,#0
  4043. STR R0,[R12,#v.menuno]
  4044. MOV R0,#1
  4045. STR R0,[R12,#v.menucsr]
  4046. MOV R0,#0
  4047. STR R0,[R12,#v.rnseed]
  4048. BL emptykeybuf
  4049. MOV R0,#0
  4050. STR R0,[R12,#v.bastmode]
  4051. LDMFD R13!,{PC}
  4052.  
  4053. .gamestart
  4054. STMFD R13!,{R14}
  4055. BL releasedemo
  4056. LDR R0,[R12,#v.singlesave]
  4057. STR R0,[R12,#v.savestate]
  4058. MOV R0,#0
  4059. STR R0,[R12,#v.demomode]
  4060. MVN R0,#0
  4061. STR R0,[R12,#v.loadedlev]
  4062. MOV R0,#0
  4063. STR R0,[R12,#v.menuno]
  4064. STR R0,[R12,#v.newlevelctr]
  4065. BL setupplayer
  4066. .gamehack
  4067. MOV R0,#0
  4068. STR R0,[R12,#v.bastmode]
  4069. LDMFD R13!,{PC}
  4070.  
  4071. .keyscan
  4072. STMFD R13!,{R14}
  4073. LDR R0,[R12,#v.demomode]
  4074. CMP R0,#1
  4075. CMPNE R0,#2
  4076. BEQ keyscanins
  4077. MOV R0,#129
  4078. MOV R1,#81 EOR &FF
  4079. MOV R2,#&FF
  4080. SWI OS_Byte
  4081. CMP R2,#&FF
  4082. LDR R0,[R12,#v.pending]
  4083. CMPNE R0,#4
  4084. BLEQ savemenu
  4085. MOV R0,#129
  4086. MOV R1,#50 EOR &FF
  4087. MOV R2,#&FF
  4088. SWI OS_Byte
  4089. CMP R2,#&FF
  4090. BLEQ demomake
  4091. MOV R0,#129
  4092. MOV R1,#51 EOR &FF
  4093. MOV R2,#&FF
  4094. SWI OS_Byte
  4095. CMP R2,#&FF
  4096. BLEQ demostart
  4097. MOV R0,#129
  4098. MOV R1,#98 EOR &FF
  4099. MOV R2,#&FF
  4100. SWI OS_Byte
  4101. CMP R2,#&FF
  4102. BLEQ screensave
  4103. MOV R0,#129
  4104. MOV R1,#86 EOR &FF
  4105. MOV R2,#&FF
  4106. SWI OS_Byte
  4107. CMP R2,#&FF
  4108. BEQ keyloadskip
  4109. .keyscanins
  4110. LDR R0,[R12,#v.pending]
  4111. CMP R0,#1
  4112. .keyloadskip
  4113. MOV R0,#0
  4114. BLEQ loadmenu; leave this last - needs R0=0
  4115.  
  4116. LDMFD R13!,{PC}
  4117.  
  4118. .realkeyscan
  4119. STMFD R13!,{R14}
  4120. LDR R0,[R12,#v.pending]
  4121. CMP R0,#4
  4122. BLEQ savemenu
  4123. LDR R0,[R12,#v.pending]
  4124. CMP R0,#1
  4125. MOV R0,#0
  4126. BLEQ loadmenu; leave this last - needs R0=0
  4127. LDMFD R13!,{PC}
  4128.  
  4129. .screensave
  4130. STMFD R13!,{R14}
  4131. ADR R0,screencom
  4132. SWI OS_CLI
  4133. LDMFD R13!,{PC}
  4134. .screencom
  4135. DCB "ScreenSave OddBall:^.Screen",0
  4136. ALIGN
  4137.  
  4138.  
  4139.  
  4140. .getnumber
  4141. STMFD R13!,{R14}
  4142. .getnumberloop
  4143. BL numberscan
  4144. MOV R4,R1
  4145. CMP R1,#0
  4146. LDMNEFD R13!,{PC}
  4147. BL getnumberloop
  4148.  
  4149. .numberscan
  4150. STMFD R13!,{R14}
  4151. BL getkey
  4152. MOVNE R1,#0
  4153. SUBS R3,R1,#"0"
  4154. MOVMI R3,#0
  4155. CMP R3,#9
  4156. MOVGT R3,#0
  4157.  
  4158. CMP R1,#13
  4159. CMPNE R1,#137
  4160. LDREQ R3,[R12,#v.menucsr]
  4161. LDMFD R13!,{PC}
  4162.  
  4163. .gamenumberscan
  4164. STMFD R13!,{R14}
  4165. BL getkey
  4166. MOVNE R1,#0
  4167. SUBS R3,R1,#"0"
  4168. MOVMI R3,#0
  4169. CMP R3,#9
  4170. MOVGT R3,#0
  4171. LDMFD R13!,{PC}
  4172.  
  4173. .demomenu
  4174. STMFD R13!,{R14}
  4175. BL setupcanvas
  4176. BL numberscan
  4177. MOV R4,R1
  4178. MOV R5,R2
  4179. LDR R0,[R12,#v.menuno]
  4180. STMFD R13!,{R0}
  4181. AND R0,R0,#7
  4182. ADR R1,menutab
  4183. LDR R2,[R1,R0,LSL #2]
  4184. MOV R14,PC
  4185. ADD PC,R1,R2
  4186. LDR R1,[R12,#v.menuno]
  4187. LDMFD R13!,{R0}
  4188. CMP R0,R1
  4189.  
  4190. MOVLT R0,#1
  4191. STRNE R0,[R12,#v.menucsr]
  4192. LDR R0,[R12,#v.menucsr]
  4193. MOV R2,R0,LSL #4
  4194. ADD R2,R2,R0,LSL #2
  4195. LDR R0,[R12,#v.genctr]
  4196. ADD R0,R0,#1<<16
  4197. STR R0,[R12,#v.genctr]
  4198.  
  4199. LDR R3,[R12,#v.menuno]
  4200. CMP R3,#5
  4201. CMPNE R3,#2
  4202. LDR R3,[R12,#v.demomode]
  4203. CMPEQ R3,#1
  4204. LDMEQFD R13!,{PC}
  4205. AND R0,R0,#&F<<16
  4206.  
  4207. ORR R0,R0,#(decortab<<24)+3
  4208. LDR R1,[R12,#v.plotnibble]
  4209. ADD R1,R1,#43
  4210. ADD R2,R2,#60
  4211. SWI FastSpr_Plot
  4212. LDMFD R13!,{PC}
  4213. .menutab
  4214. DCD menu0-menutab
  4215. DCD menu1-menutab
  4216. DCD menu2-menutab
  4217. DCD menu3-menutab
  4218. DCD menu4-menutab
  4219. DCD menu5-menutab
  4220. DCD menu6-menutab
  4221. DCD menu6-menutab
  4222.  
  4223.  
  4224.  
  4225. .menu0
  4226. STMFD R13!,{R14}
  4227. LDR R0,[R12,#v.demomode]
  4228. CMP R0,#1
  4229. CMPNE R0,#2
  4230. ADR R0,menu0text
  4231. ADREQ R0,menu0demotext
  4232. #rept 9
  4233. BL nibprint
  4234. #endr
  4235.  
  4236. MOV R0,#6
  4237. BL addmenucsr
  4238. CMP R4,#136
  4239. MOVEQ R0,#2
  4240. STREQ R0,[R12,#v.exit]
  4241. CMP R3,#0
  4242. LDMEQFD R13!,{PC}
  4243. LDR R6,[R12,#v.menuno]
  4244. CMP R3,#6
  4245. MOVLE R6,R3
  4246. STR R6,[R12,#v.menuno]
  4247. LDMFD R13!,{PC}
  4248. .menu0text
  4249. DCD 116,32
  4250. DCB "ODDBALL",0
  4251. ALIGN
  4252. DCD 48,80
  4253. DCB "1. NEW GAME",0
  4254. ALIGN
  4255. DCD 48,100
  4256. DCB "2. SAVE GAME",0
  4257. ALIGN
  4258. DCD 48,120
  4259. DCB "3. LOAD GAME",0
  4260. ALIGN
  4261. DCD 48,140
  4262. DCB "4. OPTIONS",0
  4263. ALIGN
  4264. DCD 48,160
  4265. DCB "5. KILL ALL BALLS",0
  4266. ALIGN
  4267. DCD 48,180
  4268. DCB "6. EXIT TO DESKTOP",0
  4269. ALIGN
  4270. DCD 40,200
  4271. DCB "USE b c a TO SELECT,",0
  4272. ALIGN
  4273. DCD 40,220
  4274. DCB "` TO RETURN TO GAME",0
  4275. ALIGN
  4276. .menu0demotext
  4277. DCD 116,32
  4278. DCB "ODDBALL",0
  4279. ALIGN
  4280. DCD 48,80
  4281. DCB "1. START GAME",0
  4282. ALIGN
  4283. DCD 48,100
  4284. DCB "2. HIGH SCORES",0
  4285. ALIGN
  4286. DCD 48,120
  4287. DCB "3. LOAD GAME",0
  4288. ALIGN
  4289. DCD 48,140
  4290. DCB "4. OPTIONS",0
  4291. ALIGN
  4292. DCD 48,160
  4293. DCB "5. INSTRUCTIONS",0
  4294. ALIGN
  4295. DCD 48,180
  4296. DCB "6. EXIT TO DESKTOP",0
  4297. ALIGN
  4298. DCD 42,200
  4299. DCB "USE b c a TO SELECT",0
  4300. ALIGN
  4301. DCD 48,220
  4302. DCB " ",0
  4303. ALIGN
  4304.  
  4305. .menu1
  4306. STMFD R13!,{R14}
  4307. ADR R0,menu1text
  4308. #rept 5
  4309. BL nibprint
  4310. #endr
  4311. ADR R0,menusubtext
  4312. BL nibprint
  4313. BL nibprint
  4314.  
  4315. LDR R1,[R12,#v.singlesave]
  4316. CMP R1,#1
  4317. ADR R0,freesave
  4318. ADREQ R0,singlesave
  4319. BL nibprint
  4320. CMP R4,#136
  4321. MOVEQ R0,#0
  4322. STREQ R0,[R12,#v.menuno]
  4323.  
  4324. MOV R0,#4
  4325. BL addmenucsr
  4326. CMP R3,#4
  4327. BLEQ saveflip
  4328. CMP R3,#1
  4329. CMPNE R3,#2
  4330. CMPNE R3,#3
  4331. LDMNEFD R13!,{PC}
  4332. STR R3,[R12,#v.diff]
  4333. BL gamestart
  4334. LDMFD R13!,{PC}
  4335. .saveflip
  4336. LDR R0,[R12,#v.singlesave]
  4337. CMP R0,#0
  4338. MOV R0,#0
  4339. MOVEQ R0,#1
  4340. STR R0,[R12,#v.singlesave]
  4341. MOV PC,R14
  4342. .menu1text
  4343. DCD 56,32
  4344. DCB "START A NEW GAME",0
  4345. ALIGN
  4346. DCD 48,52
  4347. DCB "SELECT DIFFICULTY",0
  4348. ALIGN
  4349. DCD 48,80
  4350. DCB "1. BEGINNER",0
  4351. ALIGN
  4352. DCD 48,100
  4353. DCB "2. EXPERT",0
  4354. ALIGN
  4355. DCD 48,120
  4356. DCB "3. PSYCHIC",0
  4357. ALIGN
  4358. .freesave
  4359. DCD 48,140
  4360. DCB "4. SAVE AT ANY TIME",0
  4361. ALIGN
  4362. .singlesave
  4363. DCD 48,140
  4364. DCB "4. ONE SAVE/LEVEL",0
  4365. ALIGN
  4366.  
  4367. .menu2
  4368. LDR R0,[R12,#v.demomode]
  4369. CMP R0,#1
  4370. BEQ menu2demo
  4371. STMFD R13!,{R14}
  4372. LDMFD R13!,{PC}
  4373.  
  4374. .menu2demo
  4375. STMFD R13!,{R14}
  4376. CMP R4,#136
  4377. MOV R0,#0
  4378. STREQ R0,[R12,#v.menuno]
  4379. ADR R0,hitext
  4380. BL nibprint
  4381. ADR R0,menusubtext2
  4382. BL nibprint
  4383. BL hiprint
  4384. LDMFD R13!,{PC}
  4385.  
  4386. .menu3
  4387. STMFD R13!,{R14}
  4388. MOV R0,#1
  4389. STR R0,[R12,#v.pending]
  4390. MOV R0,#0
  4391. STR R0,[R12,#v.menuno]
  4392. MOV R0,#3
  4393. STR R0,[R12,#v.menucsr]
  4394. LDMFD R13!,{PC}
  4395.  
  4396. .menu4
  4397. STMFD R13!,{R14}
  4398. ADR R0,menu4text
  4399. #rept 3
  4400. BL nibprint
  4401. #endr
  4402. MOV R0,#6
  4403. BL addmenucsr
  4404. LDR R0,[R12,#v.lineskip]
  4405. CMP R0,#1
  4406. ADR R0,mode13mes
  4407. ADREQ R0,mode49mes
  4408. BL nibprint
  4409. LDR R0,[R12,#v.music]
  4410. CMP R0,#1
  4411. ADR R0,musicoffmes
  4412. ADREQ R0,musiconmes
  4413. BL nibprint
  4414.  
  4415. ADR R0,soundoffmes
  4416. LDR R1,[R12,#v.soundvol]
  4417. CMP R1,#1
  4418. ADREQ R0,soundquietmes
  4419. CMP R1,#2
  4420. ADREQ R0,soundmedmes
  4421. CMP R1,#3
  4422. ADREQ R0,soundloadmes
  4423. BL nibprint
  4424. MOV R0,#0
  4425. SWI Sound_Speaker
  4426. CMP R0,#2
  4427. ADR R0,speoffmes
  4428. ADREQ R0,speonmes
  4429. BL nibprint
  4430. LDR R1,[R12,#v.quality]
  4431. ADR R0,lowqmes
  4432. CMP R1,#1
  4433. ADREQ R0,medqmes
  4434. CMP R1,#2
  4435. ADREQ R0,highqmes
  4436. BL nibprint
  4437. LDR R1,[R12,#v.mousestep]
  4438. ADR R0,slowmmes
  4439. CMP R1,#1
  4440. ADREQ R0,medmmes
  4441. CMP R1,#2
  4442. ADREQ R0,fastmmes
  4443. BL nibprint
  4444.  
  4445. CMP R3,#1
  4446. BLEQ modeflip
  4447. CMP R3,#2
  4448. BLEQ musicflip
  4449. CMP R3,#3
  4450. BLEQ soundflip
  4451. CMP R3,#4
  4452. BLEQ speakerflip
  4453. CMP R3,#5
  4454. BLEQ qualityflip
  4455. CMP R3,#6
  4456. BLEQ mousestepflip
  4457.  
  4458. CMP R4,#136
  4459. MOVEQ R0,#0
  4460. STREQ R0,[R12,#v.menuno]
  4461. LDMFD R13!,{PC}
  4462.  
  4463. .menu4text
  4464. DCD 108,32
  4465. DCB "OPTIONS",0
  4466. ALIGN
  4467. .menusubtext
  4468. DCD 72,204
  4469. DCB "USE b c a KEYS,",0
  4470. ALIGN
  4471. .menusubtext2
  4472. DCD 66,224
  4473. DCB "` FOR MAIN MENU.",0
  4474. ALIGN
  4475. .mode13mes
  4476. DCD 48,80
  4477. DCB "1. NORMAL TV SCREEN",0
  4478. ALIGN
  4479. .mode49mes
  4480. DCD 48,80
  4481. DCB "1. HIGH-RES MONITOR",0
  4482. ALIGN
  4483. .musiconmes
  4484. DCD 48,100
  4485. DCB "2. MUSIC ON",0
  4486. ALIGN
  4487. .musicoffmes
  4488. DCD 48,100
  4489. DCB "2. MUSIC OFF",0
  4490. ALIGN
  4491. .soundquietmes
  4492. DCD 48,120
  4493. DCB "3. QUIET SOUND",0
  4494. ALIGN
  4495. .soundmedmes
  4496. DCD 48,120
  4497. DCB "3. MEDIUM SOUND",0
  4498. ALIGN
  4499. .soundloadmes
  4500. DCD 48,120
  4501. DCB "3. LOUD SOUND",0
  4502. ALIGN
  4503. .soundoffmes
  4504. DCD 48,120
  4505. DCB "3. NO SOUND",0
  4506. ALIGN
  4507. .speonmes
  4508. DCD 48,140
  4509. DCB "4. SPEAKER ON",0
  4510. ALIGN
  4511. .speoffmes
  4512. DCD 48,140
  4513. DCB "4. SPEAKER OFF",0
  4514. ALIGN
  4515. .lowqmes
  4516. DCD 48,160
  4517. DCB "5. LOW-FI SOUND",0
  4518. ALIGN
  4519. .medqmes
  4520. DCD 48,160
  4521. DCB "5. NORMAL SOUND",0
  4522. ALIGN
  4523. .highqmes
  4524. DCD 48,160
  4525. DCB "5. HI-FI SOUND",0
  4526. ALIGN
  4527. .slowmmes
  4528. DCD 48,180
  4529. DCB "6. SLOW MOUSE",0
  4530. ALIGN
  4531. .medmmes
  4532. DCD 48,180
  4533. DCB "6. MEDIUM MOUSE",0
  4534. ALIGN
  4535. .fastmmes
  4536. DCD 48,180
  4537. DCB "6. FAST MOUSE",0
  4538. ALIGN
  4539.  
  4540. .menu5
  4541. LDR R0,[R12,#v.demomode]
  4542. CMP R0,#1
  4543. BEQ menu5demo
  4544. STMFD R13!,{R14}
  4545. ADR R0,menu5text
  4546. #rept 3
  4547. BL nibprint
  4548. #endr
  4549. ADR R0,menusubtext
  4550. BL nibprint
  4551. BL nibprint
  4552.  
  4553.  
  4554. MOV R0,#2
  4555. BL addmenucsr
  4556. CMP R4,#136
  4557. CMPNE R3,#2
  4558. MOVEQ R0,#5
  4559. STREQ R0,[R12,#v.menucsr]
  4560. MOVEQ R0,#0
  4561. STREQ R0,[R12,#v.menuno]
  4562. CMP R3,#0
  4563. LDMEQFD R13!,{PC}
  4564. CMP R3,#1
  4565. LDMNEFD R13!,{PC}
  4566. BL nukeballs
  4567. MOV R0,#5
  4568. STR R0,[R12,#v.menucsr]
  4569. MOV R0,#0
  4570. STR R0,[R12,#v.menuno]
  4571. LDMFD R13!,{PC}
  4572.  
  4573. .menu5demo 
  4574. STMFD R13!,{R14}
  4575.  
  4576. ADR R0,menu5demotext
  4577. #rept 8
  4578. BL nibprint
  4579. #endr
  4580. CMP R4,#136
  4581. MOV R0,#0
  4582. STREQ R0,[R12,#v.menuno]
  4583. CMP R3,#3
  4584. BLEQ cheatcheck
  4585. CMP R4,#136
  4586. MOV R0,#0
  4587. STREQ R0,[R12,#v.menuno]
  4588. BL cheatcheck2
  4589. LDMFD R13!,{PC}
  4590.  
  4591. .cheatcheck2
  4592. STMFD R13!,{R14}
  4593. .cheatmesstart
  4594. LDR R0,[R12,#v.menucsr]
  4595. CMP R4,#32
  4596. BICNE R4,R4,#32
  4597. SUBS R4,R4,#20
  4598. LDMMIFD R13!,{PC}
  4599. MOV R1,R0
  4600. CMP R0,#137
  4601. BEQ cheatskips
  4602. CMP R4,#"S"-20
  4603. MOVEQ R0,#129
  4604. .cheatskips
  4605. CMP R4,#"T"-20
  4606. CMPEQ R0,#129
  4607. ADDEQ R0,R0,#1
  4608. CMP R4,#"U"-20
  4609. CMPEQ R0,#130
  4610. ADDEQ R0,R0,#1
  4611. CMP R4,#"F"-20
  4612. CMPEQ R0,#131
  4613. ADDEQ R0,R0,#1
  4614. BEQ cheatjump
  4615. CMP R4,#"F"-20
  4616. CMPEQ R0,#132
  4617. ADDEQ R0,R0,#1
  4618. .cheatjump
  4619. CMP R4,#" "-20
  4620. CMPEQ R0,#133
  4621. ADDEQ R0,R0,#1
  4622. CMP R4,#"T"-20
  4623. CMPEQ R0,#134
  4624. ADDEQ R0,R0,#1
  4625. CMP R4,#"H"-20
  4626. CMPEQ R0,#135
  4627. ADDEQ R0,R0,#1
  4628. CMP R4,#"I"-20
  4629. CMPEQ R0,#136
  4630. ADDEQ R0,R0,#1
  4631. CMP R4,#"S"-20
  4632. CMPEQ R0,#137
  4633. ADDEQ R0,R0,#1
  4634. CMP R0,R1
  4635. MOVEQ R0,#0
  4636. STR R0,[R12,#v.menucsr]
  4637. CMP R0,#138
  4638. LDMNEFD R13!,{PC}
  4639. MOV R0,#5
  4640. STR R0,[R12,#v.menucsr]
  4641. MOV R0,#texttab
  4642. SWI Amnesia_WipeTable
  4643. LDR R0,[R12,#v.cheat]
  4644. RSB R0,R0,#1
  4645. STR R0,[R12,#v.cheat]
  4646. CMP R0,#1
  4647. ADR R0,fairmes
  4648. ADRNE R0,stuffmes
  4649. BL message
  4650. LDMFD R13!,{PC}
  4651.  
  4652.  
  4653. .cheatcheck
  4654. STMFD R13!,{R14}
  4655.  
  4656. BL getnumber
  4657. CMP R3,#2
  4658. LDMNEFD R13!,{PC}
  4659. BL getnumber
  4660. CMP R3,#9
  4661. LDMNEFD R13!,{PC}
  4662. BL getnumber
  4663. CMP R4,#48
  4664. LDMNEFD R13!,{PC}
  4665. BL getnumber
  4666. CMP R3,#7
  4667. LDMNEFD R13!,{PC}
  4668. BL getnumber
  4669. CMP R4,#48
  4670. LDMNEFD R13!,{PC}
  4671. ADR R0,clickmes
  4672. BL message
  4673. LDMFD R13!,{PC}
  4674. .clickmes
  4675. DCD 160<<12,200<<12,0,0,&00600001,0
  4676. DCB "SORRY, ENGAGED!",0
  4677. ALIGN
  4678. .fairmes
  4679. DCD 160<<12,200<<12,0,0,&00600001,fairmes2-fairmes
  4680. DCB "FAIR MINDED WORDS!",0
  4681. ALIGN
  4682. .fairmes2
  4683. DCD &280<<12,200<<12,-2<<12,0,&02800001,0
  4684. DCB "USE THE RIGHT MOUSE BUTTON TO SORT THINGS OUT...",0
  4685. ALIGN
  4686. .stuffmes
  4687. DCD &200<<12,200<<12,-2<<12,0,&02000001,0
  4688. DCB "THERE'S NO PLEASING SOME PEOPLE!",0
  4689. ALIGN
  4690.  
  4691. .cheatmesend
  4692. LDMFD R13!,{PC}
  4693. .menu5text
  4694. DCD 48,32
  4695. DCB "BALL DESTRUCTION",0
  4696. ALIGN
  4697. DCD 48,80
  4698. DCB "1. DESTROY BALLS",0
  4699. ALIGN
  4700. DCD 48,100
  4701. DCB "2. CANCEL",0
  4702. ALIGN
  4703.  
  4704. .menu5demotext
  4705. .hm1
  4706. DCD 59,40
  4707. DCB "USE THE MOUSE TO",0
  4708. ALIGN
  4709. DCD 57,60
  4710. DCB "MOVE THE BAT. HIT",0
  4711. ALIGN
  4712. DCD 54,80
  4713. DCB "THE BALL TOWARDS",0
  4714. ALIGN
  4715. DCD 40,100
  4716. DCB "THE BLOCKS. DESTROY",0
  4717. ALIGN
  4718. DCD 52,120
  4719. DCB "ALL OF THE BLOCKS",0
  4720. ALIGN
  4721. DCD 41,140
  4722. DCB "TO COMPLETE A LEVEL",0
  4723. ALIGN
  4724. DCD 72,180
  4725. DCB "WATCH THE DEMO!",0
  4726. DCD 66,220
  4727. DCB "` FOR MAIN MENU.",0
  4728. ALIGN
  4729.  
  4730. .menu6
  4731. STMFD R13!,{R14}
  4732. #rept 7
  4733. BL menufade
  4734. BL menubank
  4735. #endr
  4736. MOV R0,#1
  4737. STR R0,[R12,#v.exit]
  4738. LDMFD R13!,{PC}
  4739.  
  4740. .modeflip
  4741. STMFD R13!,{R3-R6,R14}
  4742. MOV R0,#49
  4743. SWI OS_CheckModeValid
  4744. BCS modenotvalid
  4745. LDR R0,[R12,#v.lineskip]
  4746. CMP R0,#1
  4747. MOVEQ R0,#0
  4748. MOVNE R0,#1
  4749. STR R0,[R12,#v.lineskip]
  4750. BL modeactive
  4751. .modeflipins
  4752. LDMFD R13!,{R3-R6,PC}
  4753.  
  4754. .musicflip
  4755. STMFD R13!,{R14}
  4756. LDR R0,[R12,#v.music]
  4757. RSB R0,R0,#1
  4758. STR R0,[R12,#v.music]
  4759. BL configupdate
  4760. LDMFD R13!,{PC}
  4761.  
  4762. .soundflip
  4763. STMFD R13!,{R14}
  4764. LDR R0,[R12,#v.soundvol]
  4765. ADD R0,R0,#1
  4766. CMP R0,#3
  4767. MOVGT R0,#0
  4768. STR R0,[R12,#v.soundvol]
  4769. BL configupdate
  4770. LDMFD R13!,{PC}
  4771.  
  4772. .speakerflip
  4773. STMFD R13!,{R14}
  4774. MOV R0,#0
  4775. SWI Sound_Speaker
  4776. RSB R0,R0,#3
  4777. SWI Sound_Speaker
  4778. LDMFD R13!,{PC}
  4779.  
  4780. .qualityflip
  4781. STMFD R13!,{R14}
  4782. LDR R0,[R12,#v.quality]
  4783. ADD R0,R0,#1
  4784. CMP R0,#2
  4785. MOVGT R0,#0
  4786. STR R0,[R12,#v.quality]
  4787. BL configupdate
  4788. LDMFD R13!,{PC}
  4789.  
  4790. .mousestepflip
  4791. STMFD R13!,{R14}
  4792. LDR R0,[R12,#v.mousestep]
  4793. ADD R0,R0,#1
  4794. CMP R0,#2
  4795. MOVGT R0,#0
  4796. STR R0,[R12,#v.mousestep]
  4797. BL configupdate
  4798. LDMFD R13!,{PC}
  4799.  
  4800. .configupdate
  4801. STMFD R13!,{R14}
  4802. LDR R0,[R12,#v.quality]
  4803. MOV R2,#64
  4804. CMP R0,#1
  4805. MOVEQ R2,#48
  4806. CMP R0,#2
  4807. MOVEQ R2,#24
  4808. MOV R0,#4
  4809. MOV R1,#0
  4810. MOV R3,#0
  4811. MOV R4,#0
  4812. SWI Sound_Configure
  4813. LDR R0,[R12,#v.music]
  4814. CMP R0,#1
  4815. MOV R0,#4
  4816. MOVEQ R0,#8
  4817. MOV R1,#0
  4818. MOV R2,#0
  4819. MOV R3,#0
  4820. MOV R4,#0
  4821. SWI Sound_Configure
  4822. LDR R1,[R12,#v.soundvol]
  4823. CMP R1,#0
  4824. MOV R0,#2
  4825. MOVEQ R0,#1
  4826. SWI Sound_Enable
  4827. MOV R0,#72
  4828. CMP R1,#2
  4829. MOVEQ R0,#100
  4830. CMP R1,#3
  4831. MOVEQ R0,#127
  4832. SWI Sound_Volume
  4833.  
  4834. LDR R0,[R12,#v.mousestep]
  4835. ADR R1,slowmouse
  4836. CMP R0,#1
  4837. ADREQ R1,medmouse
  4838. CMP R0,#2
  4839. ADREQ R1,fastmouse
  4840. MOV R0,#21
  4841. SWI OS_Word
  4842. LDMFD R13!,{PC}
  4843. .slowmouse
  4844. DCB 2,2,2
  4845. .medmouse
  4846. DCB 2,3,3
  4847. .fastmouse
  4848. DCB 2,4,4
  4849. ALIGN
  4850. .defaultmouse
  4851. STMFD R13!,{R14}
  4852. MOV R0,#161
  4853. MOV R1,#194
  4854. SWI OS_Byte
  4855. ADD R1,R12,#v.temp0
  4856. MOV R0,#2
  4857. STRB R0,[R1]
  4858. STRB R2,[R1,#1]
  4859. STRB R2,[R1,#2]
  4860. MOV R0,#21
  4861. SWI OS_Word
  4862. LDMFD R13!,{PC}
  4863.  
  4864. .modenotvalid
  4865. MOV R0,#texttab
  4866. SWI Amnesia_CountObjects
  4867. CMP R0,#1
  4868. ADR R0,notvalmes
  4869. BLLE message
  4870. B modeflipins
  4871.  
  4872. .notvalmes
  4873. DCD (160+&200)<<12,60<<12,-2<<12,0,&02000001,0
  4874. DCB "USE NORMAL SCREEN MODE ON THIS MONITOR - MODE 49 NOT AVAILABLE.",0
  4875. ALIGN
  4876.  
  4877. .modeactive
  4878. STMFD R13!,{R14}
  4879. MOV R0,#49
  4880. SWI OS_CheckModeValid
  4881. MOVCS R0,#0
  4882. STRCS R0,[R12,#v.lineskip]
  4883. LDR R0,[R12,#v.lineskip]
  4884. CMP R0,#0
  4885. MOVEQ R0,#13
  4886. MOVNE R0,#49
  4887. SWI 256+22
  4888. SWI OS_WriteC
  4889. SWI OS_RemoveCursors
  4890. SWI 256+28
  4891. SWI 256
  4892. SWI 256+24
  4893. SWI 256+29
  4894. SWI 256
  4895. BL vduread
  4896. LDR R0,[R12,#v.lineskip]
  4897. CMP R0,#0
  4898. LDR R0,[R12,#v.screenadr]
  4899. ADDEQ R0,R0,#320*8
  4900. STR R0,[R12,#v.screenuse]
  4901. BL loadsidepic
  4902. BL showsidepic
  4903. MOV R0,#1
  4904. STR R0,[R12,#v.scorechange]
  4905. STR R0,[R12,#v.ballschange]
  4906. STR R0,[R12,#v.liveschange]
  4907. STR R0,[R12,#v.goodychange]
  4908.  
  4909. LDMFD R13!,{PC}
  4910.  
  4911.  
  4912.  
  4913.  
  4914.  
  4915.  
  4916.  
  4917.  
  4918. .addmenucsr
  4919. LDR R1,[R12,#v.menucsr]
  4920. CMP R4,#139
  4921. SUBEQ R1,R1,#1
  4922. CMP R4,#138
  4923. ADDEQ R1,R1,#1
  4924. CMP R1,#1
  4925. MOVLT R1,#1
  4926. CMP R1,R0
  4927. MOVGT R1,R0
  4928. STR R1,[R12,#v.menucsr]
  4929. MOV PC,R14
  4930.  
  4931. .highscores
  4932. STMFD R13!,{R14}
  4933. MOV R3,#&FF
  4934. LDR R2,[R12,#v.plscore]
  4935. LDR R1,[R12,#v.hinames]
  4936. LDR R0,[R1,#&A0]
  4937. CMP R2,R0
  4938. MOVGE R3,#&A0
  4939. LDR R0,[R1,#&80]
  4940. CMP R2,R0
  4941. MOVGE R3,#&80
  4942. LDR R0,[R1,#&60]
  4943. CMP R2,R0
  4944. MOVGE R3,#&60
  4945. LDR R0,[R1,#&40]
  4946. CMP R2,R0
  4947. MOVGE R3,#&40
  4948. LDR R0,[R1,#&20]
  4949. CMP R2,R0
  4950. MOVGE R3,#&20
  4951. LDR R0,[R1,#&0]
  4952. CMP R2,R0
  4953. MOVGE R3,#&0
  4954. CMP R3,#&FF
  4955. LDMGEFD R13!,{PC}
  4956. STR R3,[R12,#v.hislot]
  4957. ADD R4,R1,R3
  4958. ADD R5,R1,#&BC
  4959. .loop74
  4960. SUB R0,R5,R4
  4961. CMP R0,#&20
  4962. BLT hishiftskip
  4963. MOV R2,#8
  4964. .loop75
  4965. LDR R0,[R5,#-&20]
  4966. STR R0,[R5]
  4967. SUB R5,R5,#4
  4968. SUBS R2,R2,#1
  4969. BGT loop75
  4970. B loop74
  4971. .hishiftskip
  4972. LDR R0,[R12,#v.plscore]
  4973. STR R0,[R4],#4
  4974. MOV R0,#&0
  4975. #rept 7
  4976. STR R0,[R4],#4
  4977. #endr
  4978.  
  4979. BL hiask
  4980. LDMFD R13!,{PC} 
  4981.  
  4982.  
  4983. .hiask
  4984. STMFD R13!,{R14}
  4985. BL emptykeybuf
  4986. MOV R0,#4
  4987. MOV R1,#1
  4988. SWI OS_Byte
  4989. .loop71
  4990. BL menufade
  4991. ADR R0,hitext
  4992. #rept 3
  4993. BL print
  4994. #endr
  4995. BL listhinames
  4996. BL menubank
  4997. BL hiedit
  4998. CMP R1,#13
  4999. ;CMPNE R1,#137
  5000. BEQ hisave
  5001. SWI OS_ReadEscapeState
  5002. BCC loop71
  5003. MOV R0,#124
  5004. SWI OS_Byte
  5005. LDMFD R13!,{PC}
  5006.  
  5007. .hiprint
  5008. STMFD R13!,{R14}
  5009. LDR R0,[R12,#v.hinames]
  5010. MOV R2,#70
  5011. MOV R3,#6
  5012. .loop7b
  5013. LDR R1,[R12,#v.plotnibble]
  5014. ADD R1,R1,#52
  5015. STMFD R13!,{R0-R3}
  5016. LDR R0,[R0]
  5017. BL printnumber
  5018. LDMFD R13!,{R0-R3}
  5019. ADD R0,R0,#4
  5020. LDR R1,[R12,#v.plotnibble]
  5021. ADD R1,R1,#136
  5022. STMFD R13!,{R0-R3}
  5023. MOV R3,#28
  5024. BL printstring
  5025. LDMFD R13!,{R0-R3}
  5026. ADD R2,R2,#20
  5027. ADD R0,R0,#32-4
  5028. SUBS R3,R3,#1
  5029. BGT loop7b
  5030. LDMFD R13!,{PC}
  5031.  
  5032. .listhinames
  5033. STMFD R13!,{R14}
  5034. BL seekhiend
  5035. LDR R1,[R12,#v.hislot]
  5036. AND R1,R1,#&FF
  5037. LDR R0,[R12,#v.hinames]
  5038. MOV R2,#95
  5039. STRB R2,[R0,R1]
  5040. MOV R2,#70
  5041. MOV R3,#6
  5042. .loop70
  5043. MOV R1,#52
  5044. STMFD R13!,{R0-R3}
  5045. LDR R0,[R0]
  5046. BL printnumber
  5047. LDMFD R13!,{R0-R3}
  5048. ADD R0,R0,#4
  5049. MOV R1,#136
  5050. STMFD R13!,{R0-R3}
  5051. MOV R3,#28
  5052. BL printstring
  5053. LDMFD R13!,{R0-R3}
  5054. ADD R2,R2,#20
  5055. ADD R0,R0,#32-4
  5056. SUBS R3,R3,#1
  5057. BGT loop70
  5058. LDR R1,[R12,#v.hislot]
  5059. AND R1,R1,#&FF
  5060. LDR R0,[R12,#v.hinames]
  5061. MOV R2,#0
  5062. STRB R2,[R0,R1]
  5063. AND R1,R1,#&E0
  5064. MOV R1,R1,LSR #5
  5065. MOV R0,#20
  5066. MUL R2,R0,R1
  5067. LDR R0,[R12,#v.genctr]
  5068. ADD R0,R0,#1<<16
  5069. STR R0,[R12,#v.genctr]
  5070. AND R0,R0,#&F<<16
  5071. ORR R0,R0,#(decortab<<24)+3
  5072. MOV R1,#43
  5073. ADD R2,R2,#70
  5074. SWI FastSpr_Plot
  5075. LDMFD R13!,{PC}
  5076.  
  5077. .seekhiend
  5078. LDR R1,[R12,#v.hinames]
  5079. LDR R2,[R12,#v.hislot]
  5080. AND R2,R2,#&E0
  5081. ORR R2,R2,#4
  5082. MOV R3,#31-4
  5083. .loop72
  5084. LDRB R0,[R1,R2]
  5085. CMP R0,#32
  5086. BLT foundhiend
  5087. ADD R2,R2,#1
  5088. SUBS R3,R3,#1
  5089. BGT loop72
  5090. .foundhiend
  5091. STR R2,[R12,#v.hislot]
  5092. MOV PC,R14
  5093.  
  5094. .hiedit
  5095. STMFD R13!,{R14}
  5096. BL getkey
  5097. MOVNE R1,#0
  5098. LDMNEFD R13!,{PC}
  5099. CMP R1,#136
  5100. CMPNE R1,#137
  5101. CMPNE R1,#13
  5102. CMPNE R1,#&1B
  5103. LDMEQFD R13!,{PC}
  5104. CMP R1,#8
  5105. CMPNE R1,#127
  5106. MOVEQ R1,#136
  5107. CMP R1,#136
  5108. BGE harrowkey
  5109. CMP R1,#64
  5110. BICGT R1,R1,#1<<5
  5111. CMP R1,#90
  5112. LDMGTFD R13!,{PC}
  5113. CMP R1,#32
  5114. LDMLTFD R13!,{PC}
  5115. LDR R2,[R12,#v.hinames]
  5116. LDR R0,[R12,#v.hislot]
  5117. AND R3,R0,#&1F
  5118. CMP R3,#4
  5119. BICLT R0,R0,#&1F
  5120. ORRLT R0,R0,#4
  5121. STRB R1,[R2,R0]
  5122. AND R2,R0,#&1F
  5123. CMP R2,#&1F
  5124. ADDNE R0,R0,#1
  5125. AND R0,R0,#&FF
  5126.  
  5127. STR R0,[R12,#v.hislot]
  5128. LDMFD R13!,{PC}
  5129.  
  5130. .hisave
  5131. STMFD R13!,{R14}
  5132. BL setsavepath
  5133. LDR R0,[R12,#v.hinames]
  5134. ADR R1,hinamesfullname
  5135. MOV R2,#&FFD
  5136. SWI XAmnesia_SaveFile
  5137. LDMFD R13!,{PC}
  5138.  
  5139. .hitext
  5140. DCD 88,40
  5141. DCB "HIGH SCORES",0
  5142. ALIGN
  5143. DCD 64,200
  5144. DCB "ENTER YOUR NAME",0
  5145. ALIGN
  5146. DCD 80,220
  5147. DCB "AND PRESS d.",0
  5148. ALIGN 
  5149.  
  5150. .savemenu
  5151. STMFD R13!,{R14}
  5152. BL setupcanvas
  5153. LDR R0,[R12,#v.pending]
  5154. CMP R0,#3
  5155. MOV R0,#0
  5156. STR R0,[R12,#v.pending]
  5157. BEQ saveask
  5158. .loop4c
  5159. BL menufade
  5160. ADR R0,savequestion
  5161. BL print
  5162. BL menubank
  5163. MOV R0,#68
  5164. BL getkey
  5165. CMP R1,#13
  5166. BIC R1,R1,#1<<5
  5167. CMPNE R1,#"Y"
  5168. BEQ saveask
  5169. CMP R1,#"N"
  5170. LDMEQFD R13!,{PC}
  5171. SWI OS_ReadEscapeState
  5172. BCC loop4c
  5173. MOV R0,#124
  5174. SWI OS_Byte
  5175. LDMFD R13!,{PC}
  5176.  
  5177. .emptykeybuf
  5178. STMFD R13!,{R0-R2,R14}
  5179. .loop4f
  5180. MOV R0,#129
  5181. MOV R1,#0
  5182. MOV R2,#0
  5183. SWI OS_Byte
  5184. CMP R2,#0
  5185. BEQ loop4f
  5186. LDMFD R13!,{R0-R2,PC}
  5187.  
  5188. .saveask
  5189. MOV R0,#4
  5190. MOV R1,#1
  5191. SWI OS_Byte
  5192. .loop4d
  5193. BL menufade
  5194. ADR R0,savetext2
  5195. #rept 4
  5196. BL print
  5197. #endr
  5198. BL listsavenames
  5199. BL menubank
  5200. BL namesedit
  5201. CMP R1,#136
  5202. LDMEQFD R13!,{PC}
  5203. CMP R1,#13
  5204. ;CMPNE R1,#137
  5205. BEQ dosave
  5206. SWI OS_ReadEscapeState
  5207. BCC loop4d
  5208. MOV R0,#124
  5209. SWI OS_Byte
  5210. LDMFD R13!,{PC}
  5211.  
  5212. .listsavenames
  5213. STMFD R13!,{R14}
  5214. BL seeknameend
  5215. LDR R1,[R12,#v.saveslot]
  5216. AND R1,R1,#&FF
  5217. LDR R0,[R12,#v.savenames]
  5218. MOV R2,#95
  5219. STRB R2,[R0,R1]
  5220. MOV R1,#52
  5221. MOV R2,#100
  5222. MOV R3,#6
  5223. .loop4e
  5224. STMFD R13!,{R0-R3}
  5225. MOV R3,#32
  5226. BL printstring
  5227. LDMFD R13!,{R0-R3}
  5228. ADD R2,R2,#20
  5229. ADD R0,R0,#32
  5230. SUBS R3,R3,#1
  5231. BGT loop4e
  5232. LDR R1,[R12,#v.saveslot]
  5233. AND R1,R1,#&FF
  5234. LDR R0,[R12,#v.savenames]
  5235. MOV R2,#0
  5236. STRB R2,[R0,R1]
  5237. AND R1,R1,#&E0
  5238. MOV R1,R1,LSR #5
  5239. MOV R0,#20
  5240. MUL R2,R0,R1
  5241. LDR R0,[R12,#v.genctr]
  5242. ADD R0,R0,#1<<16
  5243. STR R0,[R12,#v.genctr]
  5244. AND R0,R0,#&F<<16
  5245. ORR R0,R0,#(decortab<<24)+3
  5246. MOV R1,#43
  5247. ADD R2,R2,#100
  5248. SWI FastSpr_Plot
  5249. LDMFD R13!,{PC}
  5250.  
  5251. .seeknameend
  5252. LDR R1,[R12,#v.savenames]
  5253. LDR R2,[R12,#v.saveslot]
  5254. AND R2,R2,#&E0
  5255. MOV R3,#31
  5256. .loop50
  5257. LDRB R0,[R1,R2]
  5258. CMP R0,#32
  5259. BLT foundnameend
  5260. ADD R2,R2,#1
  5261. SUBS R3,R3,#1
  5262. BGT loop50
  5263. .foundnameend
  5264. STR R2,[R12,#v.saveslot]
  5265. MOV PC,R14
  5266.  
  5267. .namesedit
  5268. STMFD R13!,{R14}
  5269. BL getkey
  5270. MOVNE R1,#0
  5271. LDMNEFD R13!,{PC}
  5272. CMP R1,#136
  5273. CMPNE R1,#137
  5274. CMPNE R1,#13
  5275. CMPNE R1,#&1B
  5276. LDMEQFD R13!,{PC}
  5277. CMP R1,#8
  5278. CMPNE R1,#127
  5279. MOVEQ R1,#136
  5280. CMP R1,#136
  5281. BGE arrowkey
  5282. CMP R1,#64
  5283. BICGT R1,R1,#1<<5
  5284. CMP R1,#90
  5285. LDMGTFD R13!,{PC}
  5286. CMP R1,#32
  5287. LDMLTFD R13!,{PC}
  5288. LDR R2,[R12,#v.savenames]
  5289. LDR R0,[R12,#v.saveslot]
  5290. STRB R1,[R2,R0]
  5291. AND R2,R0,#&1F
  5292. CMP R2,#&1F
  5293. ADDNE R0,R0,#1
  5294. AND R0,R0,#&FF
  5295.  
  5296. STR R0,[R12,#v.saveslot]
  5297. LDMFD R13!,{PC}
  5298.  
  5299. .arrowkey
  5300. LDR R2,[R12,#v.saveslot]
  5301. CMP R1,#136
  5302. BEQ leftarrow
  5303. CMP R1,#138
  5304. BEQ downarrow
  5305. CMP R1,#139
  5306. BEQ uparrow
  5307. MOV R1,#0
  5308. LDMFD R13!,{PC}
  5309.  
  5310. .leftarrow
  5311. LDR R0,[R12,#v.saveslot]
  5312. TST R0,#&1F
  5313. MOV R1,#0
  5314. LDMEQFD R13!,{PC}
  5315. SUB R0,R0,#1
  5316. STR R0,[R12,#v.saveslot]
  5317. LDR R1,[R12,#v.savenames]
  5318. MOV R2,#0
  5319. STRB R2,[R1,R0]
  5320. MOV R1,#0
  5321. LDMFD R13!,{PC}
  5322.  
  5323. .uparrow
  5324. LDR R0,[R12,#v.saveslot]
  5325. SUBS R0,R0,#32
  5326. STRPL R0,[R12,#v.saveslot]
  5327. MOV R1,#0
  5328. LDMFD R13!,{PC}
  5329.  
  5330. .downarrow
  5331. LDR R0,[R12,#v.saveslot]
  5332. ADD R0,R0,#32
  5333. CMP R0,#192
  5334. STRLT R0,[R12,#v.saveslot]
  5335. MOV R1,#0
  5336. LDMFD R13!,{PC}
  5337.  
  5338. .harrowkey
  5339. LDR R2,[R12,#v.hislot]
  5340. CMP R1,#136
  5341. MOV R1,#0
  5342. LDMNEFD R13!,{PC}
  5343. .hleftarrow
  5344. LDR R0,[R12,#v.hislot]
  5345. AND R2,R0,#&1F
  5346. CMP R2,#4
  5347. LDMLEFD R13!,{PC}
  5348. SUB R0,R0,#1
  5349. STR R0,[R12,#v.hislot]
  5350. LDR R1,[R12,#v.hinames]
  5351. MOV R2,#0
  5352. STRB R2,[R1,R0]
  5353. LDMFD R13!,{PC}
  5354.  
  5355. .getkey
  5356. STMFD R13!,{R14}
  5357. MOV R0,#4
  5358. MOV R1,#1
  5359. SWI OS_Byte
  5360. MOV R0,#129
  5361. MOV R1,#0
  5362. MOV R2,#0
  5363. SWI OS_Byte
  5364. CMP R2,#0
  5365. LDMFD R13!,{PC}
  5366.  
  5367. .savequestion
  5368. DCD 80,128
  5369. DCB "SAVE GAME? Y/N",0
  5370. ALIGN
  5371. .savetext2
  5372. DCD 48,20
  5373. DCB "SELECT A SLOT TO",0
  5374. ALIGN
  5375. DCD 48,40
  5376. DCB "SAVE THE GAME INTO.",0
  5377. ALIGN
  5378. DCD 48,70
  5379. DCB "USE b c TO SELECT.",0
  5380. ALIGN
  5381. DCD 48,224
  5382. DCB "PRESS d TO SAVE.",0
  5383. ALIGN
  5384.  
  5385.  
  5386.  
  5387. .menubank
  5388. STMFD R13!,{R14}
  5389. MOV R0,#1
  5390. SWI Blitz_Wait
  5391. BL menushift
  5392. LDMFD R13!,{PC}
  5393.  
  5394. .dosave
  5395. BL savegame
  5396. LDMFD R13!,{PC}
  5397.  
  5398. .svlevelnet
  5399. DCB "<OddBall$FilePath>LevelNet",0
  5400. .svbatstab
  5401. DCB "<OddBall$FilePath>BatsTab",0
  5402. .svballstab
  5403. DCB "<OddBall$FilePath>BallsTab",0
  5404. .svblockstab
  5405. DCB "<OddBall$FilePath>BlocksTab",0
  5406. .svtexttab
  5407. DCB "<OddBall$FilePath>TextTab",0
  5408. .svstarstab
  5409. DCB "<OddBall$FilePath>StarsTab",0
  5410. .svvarsblock
  5411. DCB "<OddBall$FilePath>VarsBlock",0
  5412. ALIGN
  5413.  
  5414. .savegame
  5415. STMFD R13!,{R14}
  5416. BL setsavepath
  5417. LDR R0,[R12,#v.savenames]
  5418. ADR R1,savenamesfullname
  5419. MOV R2,#&FFF
  5420. SWI XAmnesia_SaveFile
  5421. BVS savefailed
  5422. BL setsavebin
  5423. MOV R0,#batstab
  5424. ADR R1,svbatstab
  5425. SWI XAmnesia_SaveTable
  5426. BVS savefailed
  5427. MOV R0,#ballstab
  5428. ADR R1,svballstab
  5429. SWI XAmnesia_SaveTable
  5430. BVS savefailed
  5431. MOV R0,#blockstab
  5432. ADR R1,svblockstab
  5433. SWI XAmnesia_SaveTable
  5434. BVS savefailed
  5435. MOV R0,#texttab
  5436. ADR R1,svtexttab
  5437. SWI XAmnesia_SaveTable
  5438. BVS savefailed
  5439. MOV R0,#starstab
  5440. ADR R1,svstarstab
  5441. SWI XAmnesia_SaveTable
  5442. BVS savefailed
  5443. LDR R0,[R12,#v.levelnet]
  5444. ADR R1,svlevelnet
  5445. MOV R2,#&FFD
  5446. SWI XAmnesia_SaveFile
  5447. BVS savefailed
  5448. MOV R0,#10
  5449. ADR R1,svvarsblock
  5450. MOV R2,#&FFD
  5451. ADD R4,R12,#v.savestart
  5452. ADD R5,R12,#v.saveend
  5453. SWI XOS_File
  5454. BVS savefailed
  5455. MOV R0,#2
  5456. STR R0,[R12,#v.exit]
  5457. LDMFD R13!,{PC}
  5458.  
  5459. .savefailed
  5460. MOV R1,#2
  5461. STR R1,[R12,#v.exit]
  5462. ADR R1,savefailedmes
  5463. BL writeerror
  5464. LDMFD R13!,{PC}
  5465. .savefailedmes
  5466. DCD 160<<12,108<<12,0,0,&01000001,0
  5467. DCB "SAVE FAILED:",0
  5468. ALIGN
  5469.  
  5470. .setsavebin
  5471. LDR R0,[R12,#v.demomode]
  5472. CMP R0,#0
  5473. BNE setdemosavebin
  5474. STMFD R13!,{R14}
  5475. ADR R0,setsavecom
  5476. SWI OS_CLI
  5477. LDR R0,[R12,#v.saveslot]
  5478. MOV R0,R0,LSR #5
  5479. AND R0,R0,#7
  5480. ADD R0,R0,#1
  5481. STR R0,[R12,#v.temp0]
  5482. ADR R0,levelname
  5483. ADD R1,R12,#v.temp0
  5484. MOV R2,#4
  5485. MOV R3,#0
  5486. MOV R4,#1
  5487. SWI OS_SetVarVal
  5488. LDMFD R13!,{PC}
  5489.  
  5490. .setsavepath
  5491. STMFD R13!,{R14}
  5492. ADR R0,setsavecom
  5493. SWI OS_CLI
  5494. LDMFD R13!,{PC}
  5495.  
  5496. .setdemosavebin
  5497. STMFD R13!,{R14}
  5498. ADR R0,setdemocom
  5499. SWI OS_CLI
  5500. LDMFD R13!,{PC}
  5501.  
  5502. .setsavecom
  5503. DCB "SetMacro OddBall$FilePath <OddBall$SavePath>",0
  5504. .setdemocom
  5505. DCB "SetMacro OddBall$FilePath <OddBall$DemoPath>",0
  5506. ALIGN
  5507.  
  5508. .doload
  5509. MOV R0,#0
  5510. STR R0,[R12,#v.demomode]
  5511. BL loadgame
  5512. LDMFD R13!,{PC}
  5513.  
  5514. .loadgame
  5515. STMFD R13!,{R14}
  5516. BL setsavebin
  5517. MOV R0,#batstab
  5518. SWI Amnesia_WipeTable
  5519. MOV R0,#ballstab
  5520. SWI Amnesia_WipeTable
  5521. MOV R0,#bulletstab
  5522. SWI Amnesia_WipeTable
  5523. MOV R0,#blockstab
  5524. SWI Amnesia_WipeTable
  5525.  
  5526. LDR R0,[R12,#v.demomode]
  5527. CMP R0,#1
  5528. MOV R0,#texttab
  5529. SWINE Amnesia_WipeTable
  5530. MOV R0,#starstab
  5531. SWI Amnesia_WipeTable
  5532. MOV R0,#decortab
  5533. SWI Amnesia_WipeTable
  5534.  
  5535. MOV R0,#batstab
  5536. ADR R1,svbatstab
  5537. SWI XAmnesia_LoadTable
  5538. BVS loadfailed
  5539. MOV R0,#ballstab
  5540. ADR R1,svballstab
  5541. SWI XAmnesia_LoadTable
  5542. BVS loadfailed
  5543.  
  5544. MOV R0,#blockstab
  5545. ADR R1,svblockstab
  5546. SWI XAmnesia_LoadTable
  5547. BVS loadfailed
  5548. MOV R0,#texttab
  5549. ADR R1,svtexttab
  5550. SWI XAmnesia_LoadTable
  5551. BVS loadfailed
  5552. MOV R0,#starstab
  5553. ADR R1,svstarstab
  5554. SWI XAmnesia_LoadTable
  5555. BVS loadfailed
  5556. ADD R0,R12,#v.levelnet
  5557. LDR R0,[R0]
  5558. CMP R0,#0
  5559. SWINE Amnesia_ReleaseBlock
  5560. ADD R0,R12,#v.levelnet
  5561. ADR R1,svlevelnet
  5562. MOV R2,#0
  5563. SWI XAmnesia_LoadHammered
  5564. BVS loadfailed
  5565. MOV R0,#255
  5566. ADR R1,svvarsblock
  5567. ADD R2,R12,#v.savestart
  5568. MOV R3,#0
  5569. SWI XOS_File
  5570. BVS loadfailed
  5571. BL backload
  5572. BL justmovedbat
  5573. BL vetlevel
  5574.  
  5575. LDR R0,[R12,#v.levelno]
  5576. STR R0,[R12,#v.loadedlev]
  5577. LDR R0,[R12,#v.demomode]
  5578. CMP R0,#1
  5579. BLEQ loaddemoinfo
  5580. BVS loadfailed
  5581. BL configupdate
  5582. MOV R0,#3
  5583. STR R0,[R12,#v.exit]
  5584. LDMFD R13!,{PC}
  5585.  
  5586. .loaddemoinfo
  5587. STMFD R13!,{R14}
  5588. BL releasedemo
  5589. ADD R0,R12,#v.demoadr
  5590. ADR R1,demosavename
  5591. MOV R2,#0
  5592. SWI Amnesia_LoadHammered
  5593. MOV R0,#4
  5594. STR R0,[R12,#v.democtr]
  5595. LDMFD R13!,{PC}
  5596.  
  5597. .loadfailed
  5598. STMFD R13!,{R0}
  5599. LDR R1,[R12,#v.demomode]
  5600. CMP R1,#1
  5601. BLNE demostart
  5602. LDMFD R13!,{R0}
  5603. LDR R1,[R0]
  5604. CMP R1,#214
  5605. ADREQ R0,notfounderr
  5606. MOV R1,#2
  5607. STR R1,[R12,#v.exit]
  5608. ADR R1,loadfailedmes
  5609. BL writeerror
  5610.  
  5611. LDMFD R13!,{PC}
  5612. .loadfailedmes
  5613. DCD 160<<12,60<<12,0,0,&01000001,0
  5614. DCB "LOAD FAILED:",0
  5615. ALIGN
  5616. .notfounderr
  5617. DCD &0
  5618. DCB "FILE NOT FOUND. IS A GAME SAVED IN THAT SLOT?",0
  5619. ALIGN
  5620.  
  5621.  
  5622. .releasedemo
  5623. STMFD R13!,{R14}
  5624. LDR R0,[R12,#v.demoadr]
  5625. CMP R0,#0
  5626. SWINE Amnesia_ReleaseBlock
  5627. MOV R0,#0
  5628. STR R0,[R12,#v.demoadr]
  5629. LDMFD R13!,{PC}
  5630.  
  5631. .loadmenu
  5632. STMFD R13!,{R14}
  5633. BL setupcanvas
  5634. LDR R0,[R12,#v.pending]
  5635. CMP R0,#1
  5636. BEQ loadask
  5637. .loop51
  5638. BL menufade
  5639. ADR R0,loadquestion
  5640. BL print
  5641. BL menubank
  5642. MOV R0,#68
  5643. BL getkey
  5644. CMP R1,#13
  5645. BIC R1,R1,#1<<5
  5646. CMPNE R1,#"Y"
  5647. BEQ loadask
  5648. CMP R1,#"N"
  5649. BEQ noload
  5650. SWI OS_ReadEscapeState
  5651. BCC loop51
  5652. .noload
  5653. MOV R0,#0
  5654. LDMFD R13!,{PC}
  5655.  
  5656. .loadask
  5657. MOV R0,#0
  5658. STR R0,[R12,#v.pending]
  5659. MOV R0,#4
  5660. MOV R1,#1
  5661. SWI OS_Byte
  5662. .loop52
  5663. BL menufade
  5664. ADR R0,loadtext2
  5665. #rept 4
  5666. BL print
  5667. #endr
  5668. BL listsavenames
  5669. BL menubank
  5670. BL namesedit
  5671. CMP R1,#136
  5672. LDMEQFD R13!,{PC}
  5673.  
  5674. ;CMP R1,#13
  5675. CMPNE R1,#137
  5676. BEQ doload
  5677. SWI OS_ReadEscapeState
  5678. BCC loop52
  5679. MOV R0,#124
  5680. SWI OS_Byte
  5681. MOV R0,#0
  5682. LDMFD R13!,{PC}
  5683. .loadquestion
  5684. DCD 80,128
  5685. DCB "LOAD GAME? Y/N",0
  5686. ALIGN
  5687.  
  5688. .loadtext2
  5689. DCD 48,20
  5690. DCB "SELECT A SLOT TO",0
  5691. ALIGN
  5692. DCD 48,40
  5693. DCB "LOAD A GAME FROM.",0
  5694. ALIGN
  5695. DCD 48,70
  5696. DCB "USE b c TO SELECT.",0
  5697. ALIGN
  5698. DCD 48,224
  5699. DCB "PRESS a TO LOAD.",0
  5700. ALIGN
  5701.  
  5702. .deathfade
  5703. STMFD R13!,{R14}
  5704. LDR R0,[R12,#v.demomode]
  5705. CMP R0,#1
  5706. MOV R0,#200
  5707. MOVEQ R0,#500
  5708. LDR R1,[R12,#v.dead]
  5709.  
  5710. RSBS R3,R1,R0
  5711. MOVMI R3,#0
  5712. CMP R3,#61
  5713. LDMGEFD R13!,{PC}
  5714. LDR R0,[R12,#v.canvasadr]
  5715. ADD R0,R0,#40
  5716. MOV R1,R0
  5717. MOV R2,#240*320
  5718. BL fade
  5719. LDMFD R13!,{PC}
  5720.  
  5721. .menufade
  5722. STMFD R13!,{R14}
  5723. LDR R0,[R12,#v.canvasadr]
  5724. ADD R0,R0,#40
  5725. MOV R1,R0
  5726. MOV R2,#240*320
  5727. MOV R3,#52
  5728. BL fade
  5729.  
  5730. LDMFD R13!,{PC}
  5731.  
  5732. .menushift
  5733. STMFD R13!,{R14}
  5734. LDR R11,[R12,#v.canvasadr]
  5735. LDR R10,[R12,#v.screenuse]
  5736. ADD R11,R11,#(canvaswidth-windwidth)/2
  5737. MOV R9,#240
  5738. LDR R0,[R12,#v.lineskip]
  5739. CMP R0,#1
  5740. BLEQ shift490
  5741. LDR R0,[R12,#v.lineskip]
  5742. CMP R0,#1
  5743. BLNE shift0
  5744. LDMFD R13!,{PC}
  5745.  
  5746. .softshift
  5747. STMFD R13!,{R14}
  5748. LDR R11,[R12,#v.canvasadr]
  5749. LDR R10,[R12,#v.screenuse]
  5750. ADD R11,R11,#(canvaswidth-windwidth)/2
  5751. MOV R9,#240
  5752. LDR R1,[R12,#v.xplotofs]
  5753. RSB R1,R1,#0
  5754. MOV R1,R1,ASR #12
  5755. AND R1,R1,#&5FFFFF
  5756. AND R0,R1,#3
  5757. LDR R1,[R12,#v.lineskip]
  5758. CMP R1,#1
  5759. BEQ softshift49
  5760. CMP R0,#1
  5761. BEQ shift0
  5762. CMP R0,#2
  5763. BEQ shift1
  5764. CMP R0,#3
  5765. BEQ shift2
  5766. CMP R0,#0
  5767. BEQ shift3
  5768. LDMFD R13!,{PC}
  5769.  
  5770. .softshift49
  5771. CMP R0,#1
  5772. BEQ shift490
  5773. CMP R0,#2
  5774. BEQ shift491
  5775. CMP R0,#3
  5776. BEQ shift492
  5777. CMP R0,#0
  5778. BEQ shift493
  5779. LDMFD R13!,{PC}
  5780.  
  5781.  
  5782. .shift0
  5783. .loopc
  5784. STMFD R13!,{R10-R11}
  5785. #rept 7
  5786. LDMIA R11!,{R0-R7}
  5787. MOV R0,R0
  5788. MOV R0,R0
  5789. MOV R0,R0
  5790. MOV R0,R0
  5791. MOV R0,R0
  5792. MOV R0,R0
  5793. MOV R0,R0
  5794. MOV R0,R0
  5795. MOV R0,R0
  5796. MOV R0,R0
  5797. MOV R0,R0
  5798. MOV R0,R0
  5799. MOV R0,R0
  5800. MOV R0,R0
  5801. MOV R0,R0
  5802. MOV R0,R0
  5803. STMIA R10!,{R0-R7}
  5804. #endr
  5805. LDMIA R11!,{R0-R3}
  5806. MOV R0,R0
  5807. MOV R0,R0
  5808. MOV R0,R0
  5809. MOV R0,R0
  5810. MOV R0,R0
  5811. MOV R0,R0
  5812. MOV R0,R0
  5813. MOV R0,R0
  5814. STMIA R10!,{R0-R3}
  5815. LDMFD R13!,{R10-R11}
  5816. ADD R10,R10,#canvaswidth
  5817. ADD R11,R11,#hbytes
  5818. SUBS R9,R9,#1
  5819. BGT loopc
  5820. LDMFD R13!,{PC}
  5821.  
  5822. .shift1
  5823. .loopb
  5824. STMFD R13!,{R10-R11}
  5825.  
  5826. #rept 7
  5827. LDMIA R11!,{R0-R8}
  5828. SUB R11,R11,#4
  5829. MOV R0,R0,LSR #8
  5830. ORR R0,R0,R1,LSL #24
  5831. MOV R1,R1,LSR #8
  5832. ORR R1,R1,R2,LSL #24
  5833. MOV R2,R2,LSR #8
  5834. ORR R2,R2,R3,LSL #24
  5835. MOV R3,R3,LSR #8
  5836. ORR R3,R3,R4,LSL #24
  5837. MOV R4,R4,LSR #8
  5838. ORR R4,R4,R5,LSL #24
  5839. MOV R5,R5,LSR #8
  5840. ORR R5,R5,R6,LSL #24
  5841. MOV R6,R6,LSR #8
  5842. ORR R6,R6,R7,LSL #24
  5843. MOV R7,R7,LSR #8
  5844. ORR R7,R7,R8,LSL #24
  5845. STMIA R10!,{R0-R7}
  5846. #endr
  5847.  
  5848. LDMIA R11!,{R0-R4}
  5849. SUB R11,R11,#4
  5850. MOV R0,R0,LSR #8
  5851. ORR R0,R0,R1,LSL #24
  5852. MOV R1,R1,LSR #8
  5853. ORR R1,R1,R2,LSL #24
  5854. MOV R2,R2,LSR #8
  5855. ORR R2,R2,R3,LSL #24
  5856. MOV R3,R3,LSR #8
  5857. ORR R3,R3,R4,LSL #24
  5858. STMIA R10!,{R0-R3}
  5859. LDMFD R13!,{R10-R11}
  5860. ADD R10,R10,#canvaswidth
  5861. ADD R11,R11,#hbytes
  5862. SUBS R9,R9,#1
  5863. BGT loopb
  5864. LDMFD R13!,{PC}
  5865.  
  5866. .shift2
  5867. .loopd
  5868. STMFD R13!,{R10-R11}
  5869.  
  5870. #rept 7
  5871. LDMIA R11!,{R0-R8}
  5872. SUB R11,R11,#4
  5873. MOV R0,R0,LSR #16
  5874. ORR R0,R0,R1,LSL #16
  5875. MOV R1,R1,LSR #16
  5876. ORR R1,R1,R2,LSL #16
  5877. MOV R2,R2,LSR #16
  5878. ORR R2,R2,R3,LSL #16
  5879. MOV R3,R3,LSR #16
  5880. ORR R3,R3,R4,LSL #16
  5881. MOV R4,R4,LSR #16
  5882. ORR R4,R4,R5,LSL #16
  5883. MOV R5,R5,LSR #16
  5884. ORR R5,R5,R6,LSL #16
  5885. MOV R6,R6,LSR #16
  5886. ORR R6,R6,R7,LSL #16
  5887. MOV R7,R7,LSR #16
  5888. ORR R7,R7,R8,LSL #16
  5889. STMIA R10!,{R0-R7}
  5890. #endr
  5891.  
  5892. LDMIA R11!,{R0-R4}
  5893. SUB R11,R11,#4
  5894. MOV R0,R0,LSR #16
  5895. ORR R0,R0,R1,LSL #16
  5896. MOV R1,R1,LSR #16
  5897. ORR R1,R1,R2,LSL #16
  5898. MOV R2,R2,LSR #16
  5899. ORR R2,R2,R3,LSL #16
  5900. MOV R3,R3,LSR #16
  5901. ORR R3,R3,R4,LSL #16
  5902. STMIA R10!,{R0-R3}
  5903. LDMFD R13!,{R10-R11}
  5904. ADD R10,R10,#canvaswidth
  5905. ADD R11,R11,#hbytes
  5906. SUBS R9,R9,#1
  5907. BGT loopd
  5908. LDMFD R13!,{PC}
  5909.  
  5910. .shift3
  5911. .loope
  5912. STMFD R13!,{R10-R11}
  5913.  
  5914. #rept 7
  5915. LDMIA R11!,{R0-R8}
  5916. SUB R11,R11,#4
  5917. MOV R0,R0,LSR #24
  5918. ORR R0,R0,R1,LSL #8
  5919. MOV R1,R1,LSR #24
  5920. ORR R1,R1,R2,LSL #8
  5921. MOV R2,R2,LSR #24
  5922. ORR R2,R2,R3,LSL #8
  5923. MOV R3,R3,LSR #24
  5924. ORR R3,R3,R4,LSL #8
  5925. MOV R4,R4,LSR #24
  5926. ORR R4,R4,R5,LSL #8
  5927. MOV R5,R5,LSR #24
  5928. ORR R5,R5,R6,LSL #8
  5929. MOV R6,R6,LSR #24
  5930. ORR R6,R6,R7,LSL #8
  5931. MOV R7,R7,LSR #24
  5932. ORR R7,R7,R8,LSL #8
  5933. STMIA R10!,{R0-R7}
  5934. #endr
  5935.  
  5936. LDMIA R11!,{R0-R4}
  5937. SUB R11,R11,#4
  5938. MOV R0,R0,LSR #24
  5939. ORR R0,R0,R1,LSL #8
  5940. MOV R1,R1,LSR #24
  5941. ORR R1,R1,R2,LSL #8
  5942. MOV R2,R2,LSR #24
  5943. ORR R2,R2,R3,LSL #8
  5944. MOV R3,R3,LSR #24
  5945. ORR R3,R3,R4,LSL #8
  5946. STMIA R10!,{R0-R3}
  5947. LDMFD R13!,{R10-R11}
  5948. ADD R10,R10,#canvaswidth
  5949. ADD R11,R11,#hbytes
  5950. SUBS R9,R9,#1
  5951. BGT loope
  5952. LDMFD R13!,{PC}
  5953.  
  5954. .shift490
  5955. .loop49c
  5956. STMFD R13!,{R9-R11}
  5957. ADD R9,R10,#320
  5958. #rept 7
  5959. LDMIA R11!,{R0-R7}
  5960. STMIA R10!,{R0-R7}
  5961. STMIA R9!,{R0-R7}
  5962. #endr
  5963. LDMIA R11!,{R0-R3}
  5964. STMIA R10!,{R0-R3}
  5965. STMIA R9!,{R0-R3}
  5966. LDMFD R13!,{R9-R11}
  5967. ADD R10,R10,#canvaswidth*2
  5968. ADD R11,R11,#hbytes
  5969. SUBS R9,R9,#1
  5970. BGT loop49c
  5971. LDMFD R13!,{PC}
  5972.  
  5973. .shift491
  5974. .loop49b
  5975. STMFD R13!,{R9-R11}
  5976. ADD R9,R10,#320
  5977. #rept 7
  5978. LDMIA R11!,{R0-R8}
  5979. SUB R11,R11,#4
  5980. MOV R0,R0,LSR #8
  5981. ORR R0,R0,R1,LSL #24
  5982. MOV R1,R1,LSR #8
  5983. ORR R1,R1,R2,LSL #24
  5984. MOV R2,R2,LSR #8
  5985. ORR R2,R2,R3,LSL #24
  5986. MOV R3,R3,LSR #8
  5987. ORR R3,R3,R4,LSL #24
  5988. MOV R4,R4,LSR #8
  5989. ORR R4,R4,R5,LSL #24
  5990. MOV R5,R5,LSR #8
  5991. ORR R5,R5,R6,LSL #24
  5992. MOV R6,R6,LSR #8
  5993. ORR R6,R6,R7,LSL #24
  5994. MOV R7,R7,LSR #8
  5995. ORR R7,R7,R8,LSL #24
  5996. STMIA R10!,{R0-R7}
  5997. STMIA R9!,{R0-R7}
  5998. #endr
  5999.  
  6000. LDMIA R11!,{R0-R4}
  6001. SUB R11,R11,#4
  6002. MOV R0,R0,LSR #8
  6003. ORR R0,R0,R1,LSL #24
  6004. MOV R1,R1,LSR #8
  6005. ORR R1,R1,R2,LSL #24
  6006. MOV R2,R2,LSR #8
  6007. ORR R2,R2,R3,LSL #24
  6008. MOV R3,R3,LSR #8
  6009. ORR R3,R3,R4,LSL #24
  6010. STMIA R10!,{R0-R3}
  6011. STMIA R9!,{R0-R3}
  6012. LDMFD R13!,{R9-R11}
  6013. ADD R10,R10,#canvaswidth*2
  6014. ADD R11,R11,#hbytes
  6015. SUBS R9,R9,#1
  6016. BGT loop49b
  6017. LDMFD R13!,{PC}
  6018.  
  6019. .shift492
  6020. .loop49d
  6021. STMFD R13!,{R9-R11}
  6022. ADD R9,R10,#320
  6023.  
  6024. #rept 7
  6025. LDMIA R11!,{R0-R8}
  6026. SUB R11,R11,#4
  6027. MOV R0,R0,LSR #16
  6028. ORR R0,R0,R1,LSL #16
  6029. MOV R1,R1,LSR #16
  6030. ORR R1,R1,R2,LSL #16
  6031. MOV R2,R2,LSR #16
  6032. ORR R2,R2,R3,LSL #16
  6033. MOV R3,R3,LSR #16
  6034. ORR R3,R3,R4,LSL #16
  6035. MOV R4,R4,LSR #16
  6036. ORR R4,R4,R5,LSL #16
  6037. MOV R5,R5,LSR #16
  6038. ORR R5,R5,R6,LSL #16
  6039. MOV R6,R6,LSR #16
  6040. ORR R6,R6,R7,LSL #16
  6041. MOV R7,R7,LSR #16
  6042. ORR R7,R7,R8,LSL #16
  6043. STMIA R10!,{R0-R7}
  6044. STMIA R9!,{R0-R7}
  6045. #endr
  6046.  
  6047. LDMIA R11!,{R0-R4}
  6048. SUB R11,R11,#4
  6049. MOV R0,R0,LSR #16
  6050. ORR R0,R0,R1,LSL #16
  6051. MOV R1,R1,LSR #16
  6052. ORR R1,R1,R2,LSL #16
  6053. MOV R2,R2,LSR #16
  6054. ORR R2,R2,R3,LSL #16
  6055. MOV R3,R3,LSR #16
  6056. ORR R3,R3,R4,LSL #16
  6057. STMIA R10!,{R0-R3}
  6058. STMIA R9!,{R0-R3}
  6059. LDMFD R13!,{R9-R11}
  6060. ADD R10,R10,#canvaswidth*2
  6061. ADD R11,R11,#hbytes
  6062. SUBS R9,R9,#1
  6063. BGT loop49d
  6064. LDMFD R13!,{PC}
  6065.  
  6066. .shift493
  6067. .loop49e
  6068. STMFD R13!,{R9-R11}
  6069. ADD R9,R10,#320
  6070.  
  6071. #rept 7
  6072. LDMIA R11!,{R0-R8}
  6073. SUB R11,R11,#4
  6074. MOV R0,R0,LSR #24
  6075. ORR R0,R0,R1,LSL #8
  6076. MOV R1,R1,LSR #24
  6077. ORR R1,R1,R2,LSL #8
  6078. MOV R2,R2,LSR #24
  6079. ORR R2,R2,R3,LSL #8
  6080. MOV R3,R3,LSR #24
  6081. ORR R3,R3,R4,LSL #8
  6082. MOV R4,R4,LSR #24
  6083. ORR R4,R4,R5,LSL #8
  6084. MOV R5,R5,LSR #24
  6085. ORR R5,R5,R6,LSL #8
  6086. MOV R6,R6,LSR #24
  6087. ORR R6,R6,R7,LSL #8
  6088. MOV R7,R7,LSR #24
  6089. ORR R7,R7,R8,LSL #8
  6090. STMIA R10!,{R0-R7}
  6091. STMIA R9!,{R0-R7}
  6092. #endr
  6093.  
  6094. LDMIA R11!,{R0-R4}
  6095. SUB R11,R11,#4
  6096. MOV R0,R0,LSR #24
  6097. ORR R0,R0,R1,LSL #8
  6098. MOV R1,R1,LSR #24
  6099. ORR R1,R1,R2,LSL #8
  6100. MOV R2,R2,LSR #24
  6101. ORR R2,R2,R3,LSL #8
  6102. MOV R3,R3,LSR #24
  6103. ORR R3,R3,R4,LSL #8
  6104. STMIA R10!,{R0-R3}
  6105. STMIA R9!,{R0-R3}
  6106. LDMFD R13!,{R9-R11}
  6107. ADD R10,R10,#canvaswidth*2
  6108. ADD R11,R11,#hbytes
  6109. SUBS R9,R9,#1
  6110. BGT loop49e
  6111. LDMFD R13!,{PC}
  6112.  
  6113. .plotbackdrop
  6114. STMFD R13!,{R14}
  6115. MOV R0,#edgetab
  6116. SWI Amnesia_WipeTable
  6117. BL updatescrollinc
  6118. LDR R0,[R12,#v.backdrop]
  6119. SUB R0,R0,#4
  6120. LDR R5,[R0,#4]
  6121. LDR R1,[R0,#8]
  6122. ADD R0,R0,R1;indirect to first sprite
  6123. ADD R9,R12,#v.backbuf2
  6124. MOV R6,#16
  6125. .loop21
  6126. LDR R1,[R0,#32]
  6127. ADD R11,R0,R1
  6128. STR R11,[R9],#4
  6129. CMP R5,#1
  6130. LDRGT R1,[R0]
  6131. ADDGT R0,R0,R1;indirect to next sprite
  6132. SUB R5,R5,#1
  6133. SUBS R6,R6,#1
  6134. BGT loop21
  6135.  
  6136. LDR R10,[R12,#v.canvasadr]
  6137. ADD R10,R10,#(canvaswidth-windwidth)/2
  6138.  
  6139. ADD R0,R10,#canvaswidth*canvasheight
  6140. STR R0,[R12,#v.canvasend]
  6141. LDR R9,[R12,#v.levelnet]
  6142.  
  6143. LDR R1,[R12,#v.xplotofs]
  6144. SUB R1,R1,#88<<12
  6145. RSB R1,R1,#0
  6146. MOV R1,R1,ASR #12
  6147. ;AND R1,R1,#&5FFFFF
  6148. ADD R1,R1,#3
  6149. MOV R2,#bkwidth
  6150. MYDIV R0,R1,R2
  6151. CMP R1,#0
  6152. ADDLT R1,R1,#96
  6153. SUBLT R0,R0,#1
  6154. LDR R5,[R9,#net.xsize]
  6155. ADD R0,R0,R5,LSR #1
  6156. STR R0,[R12,#v.netxpos]
  6157. MOV R3,R1  ;R3 is xplotofs MOD 96 in pixels
  6158. LDR R1,[R12,#v.yplotofs]
  6159. SUB R1,R1,#48<<12
  6160. RSB R1,R1,#0
  6161. MOV R1,R1,ASR #12
  6162. ;AND R1,R1,#&5FFFFF
  6163. MOV R2,#bkheight
  6164. MYDIV R0,R1,R2
  6165. CMP R1,#0
  6166. ADDLT R1,R1,#96
  6167. SUBLT R0,R0,#1
  6168. LDR R5,[R9,#net.ysize]
  6169. ADD R0,R0,R5,LSR #1
  6170. STR R0,[R12,#v.netypos]
  6171. MOV R4,R1  ;likewise R4 for yplotofs
  6172. CMP R3,#96
  6173. BGE diverror
  6174. CMP R3,#0
  6175. BLT diverror
  6176. BIC R0,R3,#3
  6177. ADR R1,linewrites
  6178. LDR R2,[R1,R0]
  6179. ADD R7,R2,R1
  6180. MOV R1,#bkwidth
  6181. MUL R8,R4,R1
  6182. ADD R9,R11,#bkwidth*bkheight
  6183. LDR R6,[R12,#v.canvasend]
  6184. BL backreload
  6185. .loopa
  6186. STMFD R13!,{R6-R12}
  6187. ADD R9,R12,#v.backbuf
  6188. LDR R11,[R9],#4
  6189. MOV R0,R8
  6190. LDR R1,[R12,#v.helltype]
  6191. CMP R1,#&1E
  6192. LDREQ R1,[R12,#v.vwarpinc]
  6193. LDRNE R1,[R12,#v.vscrollinc]
  6194. ADD R12,R0,R1
  6195. CMP R12,#bkwidth*bkheight
  6196. SUBGE R12,R12,#bkwidth*bkheight
  6197. TST R11,#1<<31
  6198. BIC R11,R11,#1<<31
  6199. ADDEQ R11,R11,R8
  6200. ADDNE R11,R11,R12
  6201. MOV R14,PC
  6202. MOV PC,R7
  6203. LDMFD R13!,{R6-R12}
  6204. ADD R8,R8,#bkwidth
  6205. CMP R8,#bkwidth*bkheight
  6206. BLGE backreloadinc
  6207. ADD R10,R10,#hbytes
  6208. CMP R10,R6
  6209. BLT loopa
  6210. LDMFD R13!,{PC}
  6211.  
  6212.  
  6213.  
  6214. .makehell
  6215. LDR R0,[R12,#v.helltype]
  6216. CMP R0,#&1E
  6217. BEQ makewarp
  6218. STMFD R13!,{R7-R11,R14}
  6219. LDR R6,[R12,#v.helltimer]
  6220. MOV R6,R6,ASL #4
  6221. ADR R1,circletab
  6222. LDR R11,[R12,#v.hellcont]
  6223. BIC R11,R11,#1<<31
  6224. LDR R10,[R12,#v.helladr]
  6225. MOV R8,#96
  6226. .loop24
  6227. ADD R6,R6,#21
  6228. AND R0,R6,#&7F8
  6229. ADR R1,circletab
  6230. LDR R1,[R1,R0]
  6231. LDR R9,[R12,#v.hscrollinc]
  6232. ADDS R9,R9,R1,ASR #28
  6233. ADDMI R9,R9,#96
  6234. CMP R9,#96
  6235. SUBGE R9,R9,#96
  6236. AND R0,R9,#3
  6237. BIC R9,R9,#3
  6238. ADR R1,hellshift
  6239. LDR R0,[R1,R0,LSL #2]
  6240. ADD R1,R1,R0
  6241. STMFD R13!,{R6-R8,R11}
  6242. MOV R14,PC
  6243. MOV PC,R1
  6244. LDMFD R13!,{R6-R8,R11}
  6245.  
  6246. ADD R11,R11,#96
  6247. SUBS R8,R8,#1
  6248. BGT loop24
  6249. LDMFD R13!,{R7-R11,PC}
  6250.  
  6251. .makewarp
  6252. STMFD R13!,{R7-R11,R14}
  6253. LDR R6,[R12,#v.helltimer]
  6254. MOV R6,R6,ASL #4
  6255. ADR R1,circletab
  6256. ADD R11,R12,#v.backbuf2
  6257. LDR R11,[R11,#12]
  6258. ADD R5,R11,#96*96
  6259. LDR R1,[R12,#v.vwarpinc]
  6260. RSB R1,R1,#96*96
  6261. LDR R0,[R12,#v.vscrollinc]
  6262. ADD R0,R0,R1
  6263. ADD R11,R11,R0
  6264. MOV R0,R0,LSL #12
  6265. DIV96 R0,R1
  6266. MOV R2,#21
  6267. MUL R0,R1,R2
  6268. ADD R6,R6,R0
  6269. LDR R10,[R12,#v.helladr]
  6270. ADD R10,R10,#96*96
  6271. MOV R8,#32
  6272. .loop78
  6273. CMP R11,R5
  6274. SUBGE R11,R11,#96*96
  6275. ADD R6,R6,#21
  6276. AND R0,R6,#&7F8
  6277. ADR R1,circletab
  6278. LDR R1,[R1,R0]
  6279. LDR R9,[R12,#v.hwarpinc]
  6280. RSB R9,R9,#95
  6281. LDR R2,[R12,#v.hscrollinc]
  6282. ADD R9,R9,R2
  6283. ADDS R9,R9,R1,ASR #28
  6284. ADDMI R9,R9,#96
  6285. CMP R9,#96
  6286. SUBGE R9,R9,#96
  6287. CMP R9,#0
  6288. ADDLT R9,R9,#96
  6289. CMP R9,#96
  6290. SUBGE R9,R9,#96
  6291.  
  6292. AND R0,R9,#3
  6293. BIC R9,R9,#3
  6294. ADR R1,hellshift
  6295. LDR R0,[R1,R0,LSL #2]
  6296. ADD R1,R1,R0
  6297. STMFD R13!,{R5-R8,R11}
  6298. MOV R14,PC
  6299. MOV PC,R1
  6300. LDMFD R13!,{R5-R8,R11}
  6301.  
  6302. ADD R11,R11,#96
  6303. SUBS R8,R8,#1
  6304. BGT loop78
  6305. LDR R10,[R12,#v.hellcont]
  6306. BIC R10,R10,#1<<31
  6307. LDR R11,[R12,#v.helladr]
  6308. ADD R11,R11,#96*96
  6309. MOV R9,#16
  6310. .loop76
  6311. ADD R10,R10,#16
  6312. ADD R11,R11,#16
  6313. LDMIA R11,{R0-R3}
  6314. STMIA R10,{R0-R3}
  6315. ADD R10,R10,#16*2
  6316. ADD R11,R11,#16*2
  6317. LDMIA R11,{R0-R7}
  6318. STMIA R10,{R0-R7}
  6319. ADD R10,R10,#16*3
  6320. ADD R11,R11,#16*3
  6321. SUBS R9,R9,#1
  6322. BGT loop76
  6323.  
  6324. MOV R9,#16
  6325. .loop77
  6326. ADD R10,R10,#16*3
  6327. ADD R11,R11,#16*3
  6328. LDMIA R11,{R0-R3}
  6329. STMIA R10,{R0-R3}
  6330. ADD R10,R10,#16*3
  6331. ADD R11,R11,#16*3
  6332. SUBS R9,R9,#1
  6333. BGT loop77
  6334.  
  6335. ;stage 2
  6336.  
  6337. LDR R11,[R12,#v.hellcont]
  6338. BIC R11,R11,#1<<31
  6339. LDR R10,[R12,#v.helladr]
  6340. MOV R8,#96
  6341. .loop79
  6342. LDR R9,[R12,#v.hwarpinc]
  6343. AND R0,R9,#3
  6344. BIC R9,R9,#3
  6345. ADR R1,hellshift
  6346. LDR R0,[R1,R0,LSL #2]
  6347. ADD R1,R1,R0
  6348. STMFD R13!,{R6-R8,R11}
  6349. MOV R14,PC
  6350. MOV PC,R1
  6351. LDMFD R13!,{R6-R8,R11}
  6352.  
  6353. ADD R11,R11,#96
  6354. SUBS R8,R8,#1
  6355. BGT loop79
  6356. LDMFD R13!,{R7-R11,PC}
  6357.  
  6358.  
  6359. .backreloadinc
  6360. LDR R0,[R12,#v.netypos]
  6361. ADD R0,R0,#1
  6362. STR R0,[R12,#v.netypos]
  6363. MOV R8,#0
  6364.  
  6365. .backreload
  6366. STMFD R13!,{R6-R10,R14}
  6367. MOV R0,#0
  6368. STR R0,[R12,#v.helltemp]
  6369. LDR R0,[R12,#v.levelnet]
  6370. LDR R1,[R12,#v.netxpos]
  6371. LDR R2,[R12,#v.netypos]
  6372. LDR R3,[R0,#net.xsize];x size
  6373. LDR R4,[R0,#net.ysize];y size
  6374. ADD R0,R0,#net.data
  6375. ADD R9,R12,#v.backbuf
  6376. ADD R8,R12,#v.backbuf2
  6377. CMN R2,#1
  6378. CMPGT R4,R2
  6379.  
  6380. MULGT R5,R3,R2
  6381. ADDGT R0,R0,R5
  6382. MOVLE R0,#0
  6383. LDR R5,[R12,#v.scanlock]
  6384. CMP R5,#1
  6385. BNE backlockskip
  6386. CMP R2,#32
  6387. MOVGE R0,#0
  6388. .backlockskip
  6389. MOV R5,#4
  6390.  
  6391. .loop20
  6392. STMFD R13!,{R0}
  6393. LDR R0,[R12,#v.scanlock]
  6394. CMP R0,#1
  6395. LDMFD R13!,{R0}
  6396. BNE backlockskip2
  6397. CMP R1,#32
  6398. MOVGE R0,#0
  6399. .backlockskip2
  6400. CMN R1,#1
  6401. CMPGT R3,R1
  6402. CMPGT R0,#0
  6403. MOV R7,#hellno
  6404. BLE backreloffnet
  6405. LDRB R7,[R0,R1]
  6406.  
  6407. CMP R7,#hellno
  6408. BLT noaddwarp
  6409. CMP R7,#hellno+16
  6410. BGE noaddwarp
  6411. BL edgehell
  6412. CMP R7,#&1C
  6413.  
  6414. BLGE addwarp
  6415.  
  6416. .noaddwarp
  6417. CMP R7,#&4F
  6418. BLEQ addsparkoff
  6419. CMP R7,#&4E
  6420. BLEQ addsparkon
  6421. CMP R7,#&4D
  6422. BLEQ addredoff
  6423. CMP R7,#&4C
  6424. BLEQ addredon
  6425.  
  6426. CMP R7,#12
  6427. BLLT noaddtelep
  6428. CMP R7,#16
  6429. BLLT addtelep
  6430. .noaddtelep
  6431. CMP R7,#&AB
  6432. BLT noaddsecret
  6433. CMP R7,#&B0
  6434. BGE noaddsecret
  6435. BL addsecret
  6436. .noaddsecret
  6437.  
  6438. CMP R7,#&20
  6439. BLT backreloffnet
  6440. CMP R7,#&2F
  6441. BLLT addarrow
  6442. .backreloffnet
  6443.  
  6444. ADR R6,stonetab
  6445. LDRB R7,[R6,R7]
  6446. CMP R7,#1
  6447. BLEQ phasetelep
  6448. AND R6,R7,#&0F
  6449.  
  6450. CMP R6,#16
  6451. MOVGT R6,#0
  6452. LDR R6,[R8,R6,LSL #2]
  6453. CMP R7,#&13
  6454. CMPNE R7,#&1E
  6455. STREQ R7,[R12,#v.helltype]
  6456. STREQ R6,[R12,#v.helltemp]
  6457. LDREQ R6,[R12,#v.helladr]
  6458. ORREQ R6,R6,#1<<31
  6459. STR R6,[R9],#4
  6460. ADD R1,R1,#1
  6461. SUBS R5,R5,#1
  6462. BGT loop20
  6463. LDR R0,[R12,#v.helltemp]
  6464. LDR R1,[R12,#v.hellcont]
  6465. CMP R0,#0
  6466. CMPNE R0,R1; maybe
  6467. LDMEQFD R13!,{R6-R10,PC}
  6468. STR R0,[R12,#v.hellcont]
  6469. BL makehell
  6470. LDMFD R13!,{R6-R10,PC}
  6471.  
  6472. .addarrow
  6473. STMFD R13!,{R0-R11,R14}
  6474. SUB R3,R1,R3,LSR #1
  6475. SUB R4,R2,R4,LSR #1
  6476. SUB R1,R7,#&20
  6477. MOV R7,#96<<12
  6478. MUL R3,R7,R3
  6479. MUL R4,R7,R4
  6480. BL arrowmake
  6481. LDMFD R13!,{R0-R11,PC}
  6482.  
  6483. .addsparkoff
  6484.  
  6485. STMFD R13!,{R0-R11,R14}
  6486. SUB R3,R1,R3,LSR #1
  6487. SUB R4,R2,R4,LSR #1
  6488. SUB R1,R7,#&20
  6489. MOV R7,#96<<12
  6490. MUL R3,R7,R3
  6491. MUL R4,R7,R4
  6492.  
  6493. MOV R0,#edgetab
  6494. MOV R1,#(decortab<<24)+4
  6495. MOV R2,#%1000000001010001
  6496. SWI Amnesia_MakeObject
  6497.  
  6498. MOV R0,#edgetab
  6499. MOV R1,#(texttab<<24)+"O"
  6500. MOV R2,#%1000000001010001
  6501. SUB R3,R3,#13<<12
  6502. SWI Amnesia_MakeObject
  6503.  
  6504. MOV R0,#edgetab
  6505. MOV R1,#(texttab<<24)+"F"
  6506. MOV R2,#%1000000001010001
  6507. ADD R3,R3,#13<<12
  6508. SWI Amnesia_MakeObject
  6509. MOV R0,#edgetab
  6510. MOV R1,#(texttab<<24)+"F"
  6511. MOV R2,#%1000000001010001
  6512. ADD R3,R3,#13<<12
  6513. SWI Amnesia_MakeObject
  6514.  
  6515. LDMFD R13!,{R0-R11,PC}
  6516.  
  6517. .addsparkon
  6518.  
  6519. STMFD R13!,{R0-R11,R14}
  6520. SUB R3,R1,R3,LSR #1
  6521. SUB R4,R2,R4,LSR #1
  6522. SUB R1,R7,#&20
  6523. MOV R7,#96<<12
  6524. MUL R3,R7,R3
  6525. MUL R4,R7,R4
  6526.  
  6527. MOV R0,#edgetab
  6528. MOV R1,#(decortab<<24)+4
  6529. MOV R2,#%1000000001010001
  6530. SWI Amnesia_MakeObject
  6531.  
  6532. MOV R0,#edgetab
  6533. MOV R1,#(texttab<<24)+"O"
  6534. MOV R2,#%1000000001010001
  6535. SUB R3,R3,#7<<12
  6536. SWI Amnesia_MakeObject
  6537.  
  6538. MOV R0,#edgetab
  6539. MOV R1,#(texttab<<24)+"N"
  6540. MOV R2,#%1000000001010001
  6541. ADD R3,R3,#13<<12
  6542. SWI Amnesia_MakeObject
  6543.  
  6544. LDMFD R13!,{R0-R11,PC}
  6545.  
  6546. .addredoff
  6547.  
  6548. STMFD R13!,{R0-R11,R14}
  6549. SUB R3,R1,R3,LSR #1
  6550. SUB R4,R2,R4,LSR #1
  6551. SUB R1,R7,#&20
  6552. MOV R7,#96<<12
  6553. MUL R3,R7,R3
  6554. MUL R4,R7,R4
  6555. SUB R4,R4,#16<<12
  6556. MOV R0,#edgetab
  6557. MOV R1,#(ballstab<<24)+2
  6558. MOV R2,#%1000000001010001
  6559. SWI Amnesia_MakeObject
  6560. ADD R4,R4,#40<<12
  6561. MOV R0,#edgetab
  6562. MOV R1,#(texttab<<24)+"O"
  6563. MOV R2,#%1000000001010001
  6564. SUB R3,R3,#13<<12
  6565. SWI Amnesia_MakeObject
  6566.  
  6567. MOV R0,#edgetab
  6568. MOV R1,#(texttab<<24)+"F"
  6569. MOV R2,#%1000000001010001
  6570. ADD R3,R3,#13<<12
  6571. SWI Amnesia_MakeObject
  6572. MOV R0,#edgetab
  6573. MOV R1,#(texttab<<24)+"F"
  6574. MOV R2,#%1000000001010001
  6575. ADD R3,R3,#13<<12
  6576. SWI Amnesia_MakeObject
  6577.  
  6578. LDMFD R13!,{R0-R11,PC}
  6579.  
  6580. .addredon
  6581.  
  6582. STMFD R13!,{R0-R11,R14}
  6583. SUB R3,R1,R3,LSR #1
  6584. SUB R4,R2,R4,LSR #1
  6585. SUB R1,R7,#&20
  6586. MOV R7,#96<<12
  6587. MUL R3,R7,R3
  6588. MUL R4,R7,R4
  6589. SUB R4,R4,#16<<12
  6590. MOV R0,#edgetab
  6591. MOV R1,#(ballstab<<24)+2
  6592. MOV R2,#%1000000001010001
  6593. SWI Amnesia_MakeObject
  6594. ADD R4,R4,#40<<12
  6595. MOV R0,#edgetab
  6596. MOV R1,#(texttab<<24)+"O"
  6597. MOV R2,#%1000000001010001
  6598. SUB R3,R3,#7<<12
  6599. SWI Amnesia_MakeObject
  6600.  
  6601. MOV R0,#edgetab
  6602. MOV R1,#(texttab<<24)+"N"
  6603. MOV R2,#%1000000001010001
  6604. ADD R3,R3,#13<<12
  6605. SWI Amnesia_MakeObject
  6606.  
  6607. LDMFD R13!,{R0-R11,PC}
  6608.  
  6609.  
  6610. .addtelep
  6611. STMFD R13!,{R0-R11,R14}
  6612. LDR R0,[R12,#v.sparks]
  6613. CMP R0,#1
  6614. LDMNEFD R13!,{R0-R11,PC}
  6615. SUB R3,R1,R3,LSR #1
  6616. SUB R4,R2,R4,LSR #1
  6617. MOV R7,#96<<12
  6618. MUL R3,R7,R3
  6619. MUL R4,R7,R4
  6620. BL random
  6621. AND R1,R0,#3<<16
  6622. ADD R1,R1,#(decortab<<24)+4
  6623. MOV R2,#%1000000001010001
  6624. MOV R0,#edgetab
  6625. SWI Amnesia_MakeObject
  6626. LDMFD R13!,{R0-R11,PC}
  6627.  
  6628. .addsecret
  6629. STMFD R13!,{R0-R11,R14}
  6630. SUB R3,R1,R3,LSR #1
  6631. SUB R4,R2,R4,LSR #1
  6632. MOV R7,#96<<12
  6633. MUL R3,R7,R3
  6634. MUL R4,R7,R4
  6635. LDR R1,[R12,#v.frameinc]
  6636. CMP R1,#1
  6637. MOV R1,#&1F
  6638. MOVLE R1,#&3F
  6639. BL random
  6640. TST R0,R1
  6641. BLEQ addglint
  6642.  
  6643. LDR R0,[R12,#v.scanspeed]
  6644. CMP R0,#5
  6645. LDMLTFD R13!,{R0-R11,PC}
  6646. LDR R0,[R12,#v.framectr]
  6647. TST R0,#&1C
  6648. LDMNEFD R13!,{R0-R11,PC}
  6649. MOV R0,R3
  6650. MOV R1,R4
  6651. MOV R3,#&FF
  6652. BL scanblockadd
  6653. LDMFD R13!,{R0-R11,PC}
  6654.  
  6655. .addwarp
  6656. STMFD R13!,{R0-R11,R14}
  6657. SUB R3,R1,R3,LSR #1
  6658. SUB R4,R2,R4,LSR #1
  6659. MOV R7,#96<<12
  6660. MUL R3,R7,R3
  6661. MUL R4,R7,R4
  6662. STMFD R13!,{R3,R4}
  6663. LDR R5,[R12,#v.levelno]
  6664. TST R5,#&400
  6665. BNE addbonuswarp
  6666. MOV R5,R3
  6667. MOV R6,R4
  6668. LDR R0,[R12,#v.hwarpinc]
  6669. SUB R3,R3,R0,ASL #12
  6670. LDR R0,[R12,#v.vwarpinc]
  6671. MOV R0,R0,ASL #12
  6672. DIV96 R0,R1
  6673. SUB R4,R4,R1,ASL #12
  6674. ADD R7,R12,#v.warptimer
  6675. LDR R8,[R12,#v.warped]
  6676. AND R8,R8,#&FF
  6677. CMP R8,#7
  6678. MOVGT R8,#7
  6679. .loop84
  6680. SUBS R8,R8,#1
  6681. BMI addwarpend
  6682. LDR R1,[R7],#4
  6683. STMFD R13!,{R3-R8}
  6684. ADD R1,R1,#&80
  6685. AND R1,R1,#&7F8
  6686. ADR R2,circletab
  6687.  
  6688. LDR R0,[R2,R1]!
  6689. MOV R0,R0,ASR #14
  6690. ADD R0,R0,R0,ASR #1
  6691. ADD R0,R0,R0,ASR #3
  6692. ADD R3,R3,R0
  6693.  
  6694. LDR R0,[R2,#4]
  6695. MOV R0,R0,ASR #14
  6696. ADD R0,R0,R0,ASR #1
  6697. ADD R0,R0,R0,ASR #3
  6698. ADD R4,R4,R0
  6699.  
  6700. ADD R4,R4,#40<<12
  6701. SUB R3,R3,#8<<12
  6702.  
  6703. SUB R0,R3,R5
  6704. CMP R0,#48<<12
  6705. SUBGE R3,R3,#96<<12
  6706. CMP R0,#-48<<12
  6707. ADDLE R3,R3,#96<<12
  6708. SUB R0,R3,R5
  6709. CMP R0,#-48<<12
  6710. ADDLE R3,R3,#96<<12
  6711. SUB R0,R4,R6
  6712. CMP R0,#48<<12
  6713. SUBGE R4,R4,#96<<12
  6714. CMP R0,#-48<<12
  6715. ADDLE R4,R4,#96<<12
  6716. MOV R1,#(ballstab<<24)+(1<<16)
  6717. MOV R2,#%10001
  6718. MOV R0,#edgetab
  6719. SWI Amnesia_MakeObject
  6720. LDMFD R13!,{R3-R8}
  6721. B loop84
  6722.  
  6723. .addwarpend
  6724.  
  6725. LDMFD R13!,{R3,R4}
  6726.  
  6727. LDR R0,[R12,#v.sparks]
  6728. CMP R0,#1
  6729. LDMNEFD R13!,{R0-R11,PC}
  6730.  
  6731. BL addglint
  6732. BL random
  6733. AND R1,R0,#3<<16
  6734. ADD R1,R1,#(decortab<<24)+4
  6735. MOV R2,#%1000000001010001
  6736. MOV R0,#edgetab
  6737. SWI Amnesia_MakeObject
  6738.  
  6739. LDMFD R13!,{R0-R11,PC}
  6740.  
  6741. .addbonuswarp
  6742.  
  6743. LDR R0,[R12,#v.sparks]
  6744. CMP R0,#1
  6745. BEQ addwarpend
  6746. LDR R0,[R12,#v.newlevelctr]
  6747. CMP R0,#0
  6748. BNE addwarpend
  6749. LDR R0,[R12,#v.framectr]
  6750. AND R0,R0,#&7F
  6751. CMP R0,#&40
  6752. RSBGT R0,R0,#&80
  6753. SUB R0,R0,#&20
  6754. ADD R4,R4,R0,ASL #12
  6755. SUB R3,R3,#18<<12
  6756. MOV R0,#edgetab
  6757. MOV R1,#(texttab<<24)+"E"
  6758. MOV R2,#%10001
  6759. SWI Amnesia_MakeObject
  6760. ADD R3,R3,#12<<12
  6761. MOV R0,#edgetab
  6762. MOV R1,#(texttab<<24)+"X"
  6763. MOV R2,#%10001
  6764. SWI Amnesia_MakeObject
  6765. ADD R3,R3,#12<<12
  6766. MOV R0,#edgetab
  6767. MOV R1,#(texttab<<24)+"I"
  6768. MOV R2,#%10001
  6769. SWI Amnesia_MakeObject
  6770. ADD R3,R3,#12<<12
  6771. MOV R0,#edgetab
  6772. MOV R1,#(texttab<<24)+"T"
  6773. MOV R2,#%10001
  6774. SWI Amnesia_MakeObject
  6775. ADD R3,R3,#12<<12
  6776. B addwarpend
  6777.  
  6778. .addglint
  6779. STMFD R13!,{R0-R4,R14}
  6780. BL random
  6781. AND R0,R0,#&3FFFF
  6782. ADD R0,R0,R0,LSR #1
  6783. SUB R0,R0,#48<<12
  6784. ADD R3,R3,R0
  6785. BL random
  6786. AND R0,R0,#&3FFFF
  6787. ADD R0,R0,R0,LSR #1
  6788. SUB R0,R0,#48<<12
  6789. ADD R4,R4,R0
  6790. MOV R1,#2
  6791. BL decorate
  6792. LDMFD R13!,{R0-R4,PC}
  6793.  
  6794.  
  6795.  
  6796.  
  6797. .phasetelep
  6798. LDR R7,[R12,#v.framectr]
  6799. MOV R7,R7,LSR #3
  6800. AND R7,R7,#3
  6801. CMP R7,#3
  6802. MOVEQ R7,#1
  6803. MOV PC,R14
  6804.  
  6805. .edgehell
  6806. STMFD R13!,{R0-R11,R14}
  6807. LDR R5,[R12,#v.scanlock]
  6808. CMP R5,#1
  6809. MOV R5,R3
  6810. MOV R6,R4
  6811. MOV R8,R3
  6812. MOVEQ R5,#32
  6813. MOVEQ R6,#32
  6814. SUB R3,R1,R3,LSR #1
  6815. SUB R4,R2,R4,LSR #1
  6816. MOV R7,#96<<12
  6817. MUL R3,R7,R3
  6818. MUL R4,R7,R4
  6819. ADD R0,R0,R1
  6820.  
  6821. SUB R6,R6,#1  ;do down first so we can lose R6
  6822. CMP R2,R6
  6823.  
  6824.  
  6825.  
  6826. LDRLTB R7,[R0,R8]
  6827. MOVGE R7,#256
  6828. CMP R7,#&2F
  6829. MOVEQ R7,#256
  6830. CMP R7,#hellno
  6831. BLT edins1
  6832. CMP R7,#hellno+16
  6833. MOVLT R7,#256
  6834. .edins1
  6835. CMP R7,#&80
  6836. BLLT edgedown
  6837.  
  6838. CMP R1,#0
  6839. LDRGTB R7,[R0,#-1]
  6840. MOVLE R7,#256
  6841. CMP R7,#&2F
  6842. MOVEQ R7,#256
  6843. CMP R7,#hellno
  6844. BLT edins2
  6845. CMP R7,#hellno+16
  6846. MOVLT R7,#256
  6847. .edins2
  6848. CMP R7,#&80
  6849. BLLT edgeleft
  6850.  
  6851. ADD R1,R1,#1
  6852. CMP R1,R5
  6853. LDRLTB R7,[R0,#1]
  6854. MOVGE R7,#256
  6855. CMP R7,#&2F
  6856. MOVEQ R7,#256
  6857. CMP R7,#hellno
  6858. BLT edins3
  6859. CMP R7,#hellno+16
  6860. MOVLT R7,#256
  6861. .edins3
  6862. CMP R7,#&80
  6863. BLLT edgeright
  6864.  
  6865. CMP R2,#0
  6866. LDRGTB R7,[R0,-R8]
  6867. MOVLE R7,#256
  6868. CMP R7,#&2F
  6869. MOVEQ R7,#256
  6870. CMP R7,#hellno
  6871. BLT edins4
  6872. CMP R7,#hellno+16
  6873. MOVLT R7,#256
  6874. .edins4
  6875. CMP R7,#&80
  6876. BLLT edgeup
  6877.  
  6878. LDMFD R13!,{R0-R11,PC}
  6879.  
  6880. .edgeleft
  6881. STMFD R13!,{R0-R8,R14}
  6882. MOV R0,#edgetab
  6883. MOV R1,#(edgetab<<24)+1
  6884. MOV R2,#%1000000001010001
  6885. SUB R3,R3,#40<<12
  6886. SWI Amnesia_MakeObject
  6887. LDMFD R13!,{R0-R8,PC}
  6888. .edgeright
  6889. STMFD R13!,{R0-R8,R14}
  6890. MOV R0,#edgetab
  6891. MOV R1,#(edgetab<<24)
  6892. MOV R2,#%1000000001010001
  6893. ADD R3,R3,#40<<12
  6894. SWI Amnesia_MakeObject
  6895. LDMFD R13!,{R0-R8,PC}
  6896. .edgeup
  6897. STMFD R13!,{R0-R8,R14}
  6898. MOV R0,#edgetab
  6899. MOV R1,#(edgetab<<24)+3
  6900. MOV R2,#%1000000001010001
  6901. SUB R4,R4,#40<<12
  6902. SWI Amnesia_MakeObject
  6903. LDMFD R13!,{R0-R8,PC}
  6904. .edgedown
  6905. STMFD R13!,{R0-R8,R14}
  6906. MOV R0,#edgetab
  6907. MOV R1,#(edgetab<<24)+2
  6908. MOV R2,#%1000000001010001
  6909. ADD R4,R4,#40<<12
  6910. SWI Amnesia_MakeObject
  6911. LDMFD R13!,{R0-R8,PC}
  6912.  
  6913. .arrowmake
  6914. STMFD R13!,{R14}
  6915. MOV R0,#edgetab
  6916. AND R1,R1,#&F
  6917. CMP R1,#8
  6918. BEQ redsourcemake
  6919. CMP R1,#5
  6920. MOVGT R1,#5
  6921. ADD R1,R1,#(arrowtab<<24)
  6922. MOV R2,#%1000000001010001
  6923. SWI Amnesia_MakeObject
  6924. LDMFD R13!,{PC}
  6925.  
  6926. .redsourcemake
  6927. LDR R0,[R12,#v.redball]
  6928. CMP R0,#1
  6929. LDMNEFD R13!,{PC}
  6930. BL random
  6931. AND R0,R0,#&3FFFF
  6932. SUB R0,R0,#&1FFFF
  6933. ADD R3,R3,R0
  6934. BL random
  6935. AND R0,R0,#&3FFFF
  6936. SUB R0,R0,#&1FFFF
  6937. ADD R4,R4,R0
  6938. MOV R0,#edgetab
  6939. MOV R1,#(decortab<<24)+(1<<16)+2
  6940. MOV R2,#%1000000001010001
  6941. SWI Amnesia_MakeObject
  6942. LDMFD R13!,{PC}
  6943.  
  6944.  
  6945. .updatescrollinc
  6946. LDR R0,[R12,#v.helltimer]
  6947. ADD R0,R0,#1
  6948. STR R0,[R12,#v.helltimer]
  6949. MOV R0,#0
  6950. STR R0,[R12,#v.hellcont]
  6951. MOV R3,#0
  6952. LDR R1,[R12,#v.xplotofs]
  6953. SUB R1,R1,R1,ASR #3
  6954. MOV R1,R1,ASR #12
  6955. CMP R1,#0
  6956. RSBLT R1,R1,#0
  6957. MOVLT R3,#1
  6958. MOV R2,#96
  6959. MYDIV R0,R1,R2
  6960. CMP R3,#1
  6961. RSBEQ R1,R1,#95
  6962. STR R1,[R12,#v.hscrollinc]
  6963. MOV R3,#0
  6964. LDR R1,[R12,#v.yplotofs]
  6965. SUB R1,R1,R1,ASR #3
  6966. MOV R1,R1,ASR #12
  6967. CMP R1,#0
  6968. RSBLT R1,R1,#0
  6969. MOVLT R3,#1
  6970. MOV R2,#96
  6971. MYDIV R0,R1,R2
  6972. CMP R3,#1
  6973. RSBEQ R1,R1,#95
  6974. MOV R2,#bkwidth
  6975. MUL R0,R2,R1
  6976. STR R0,[R12,#v.vscrollinc]
  6977.  
  6978.  
  6979. MOV R3,#0
  6980. LDR R1,[R12,#v.xplotofs]
  6981. SUB R1,R1,R1,ASR #5
  6982. MOV R1,R1,ASR #12
  6983. CMP R1,#0
  6984. RSBLT R1,R1,#0
  6985. MOVLT R3,#1
  6986. MOV R2,#96
  6987. MYDIV R0,R1,R2
  6988. CMP R3,#1
  6989. RSBEQ R1,R1,#95
  6990. STR R1,[R12,#v.hwarpinc]
  6991. MOV R3,#0
  6992. LDR R1,[R12,#v.yplotofs]
  6993. SUB R1,R1,R1,ASR #5
  6994. MOV R1,R1,ASR #12
  6995. CMP R1,#0
  6996. RSBLT R1,R1,#0
  6997. MOVLT R3,#1
  6998. MOV R2,#96
  6999. MYDIV R0,R1,R2
  7000. CMP R3,#1
  7001. RSBEQ R1,R1,#95
  7002. MOV R2,#bkwidth
  7003. MUL R0,R2,R1
  7004. STR R0,[R12,#v.vwarpinc]
  7005. MOV PC,R14
  7006.  
  7007.  
  7008.  
  7009. .showrate
  7010. STMFD R13!,{R14}
  7011. LDR R0,[R12,#v.realrate]
  7012. CMP R0,#9
  7013. MOVGT R0,#10
  7014. ADD R0,R0,#"0"
  7015. ADD R0,R0,#texttab<<24
  7016. MOV R1,#52
  7017. MOV R2,#12
  7018. SWI FastSpr_Plot
  7019. LDMFD R13!,{PC}
  7020.  
  7021. .showattn
  7022. STMFD R13!,{R14}
  7023. LDR R0,[R12,#v.attnctr]
  7024. CMP R0,#9
  7025. MOVGT R0,#10
  7026. ADD R0,R0,#"0"
  7027. ADD R0,R0,#texttab<<24
  7028. MOV R1,#52
  7029. MOV R2,#28
  7030. SWI FastSpr_Plot
  7031. LDMFD R13!,{PC}
  7032.  
  7033. .showsidepic
  7034. STMFD R13!,{R14}
  7035. BL loadsidepic
  7036. LDR R0,[R12,#v.canvasadr]
  7037. LDR R1,[R0,#4]
  7038. ADD R0,R0,R1;indirect to first sprite
  7039. LDR R1,[R0,#32]
  7040. ADD R1,R0,R1;indirect to sprite data
  7041. SUB R1,R1,#4
  7042. LDR R0,[R12,#v.screenuse]
  7043. ADD R0,R0,#240
  7044. MOV R2,#80
  7045. MOV R3,#240
  7046. MOV R4,#320
  7047. BL transfer
  7048. LDMFD R13!,{PC}
  7049.  
  7050. .scanblockadd
  7051. STMFD R13!,{R0-R2,R4-R8,R14}
  7052. MOV R8,R3
  7053. MOV R3,R0
  7054. MOV R4,R1
  7055. B scanaddins
  7056.  
  7057. .scanadd
  7058. STMFD R13!,{R0-R2,R4-R8,R14}
  7059. MOV R8,R3
  7060. LDR R3,[R1,#8]
  7061. LDR R4,[R1,#12]
  7062. .scanaddins
  7063. LDR R0,[R12,#v.scanspeed]
  7064. CMP R0,#0
  7065. LDMLEFD R13!,{R0-R2,R4-R8,PC}
  7066. MOV R7,R3,ASL #1
  7067. DIV96 R7,R3
  7068. MOV R7,R4,ASL #1
  7069. DIV96 R7,R4
  7070. LDR R6,[R12,#v.levelnet]
  7071. LDR R0,[R6,#net.xsize]
  7072. ADD R3,R3,R0
  7073. LDR R0,[R6,#net.ysize]
  7074. ADD R4,R4,R0
  7075.  
  7076. LDR R7,[R12,#v.scanxofs]
  7077. SUB R3,R3,R7,ASL #1
  7078. LDR R7,[R12,#v.scanyofs]
  7079. SUB R4,R4,R7,ASL #1
  7080.  
  7081. LDR R6,[R6,#net.xsize]
  7082. CMP R3,#0
  7083. CMPGE R4,#0
  7084. BLT scanmiss
  7085. CMP R3,#63
  7086. CMPLT R4,#63
  7087. BGE scanmiss
  7088.  
  7089. LDR R5,[R12,#v.scanadr]
  7090. ADD R5,R5,R4,LSL #6
  7091. STRB R8,[R5,R3]
  7092. ADD R3,R3,#1
  7093. STRB R8,[R5,R3]
  7094. ADD R3,R3,#64
  7095. STRB R8,[R5,R3]
  7096. SUB R3,R3,#1
  7097. STRB R8,[R5,R3]
  7098.  
  7099. .scanmiss
  7100. LDMFD R13!,{R0-R2,R4-R8,PC}
  7101.  
  7102.  
  7103. .scanupdate
  7104. STMFD R13!,{R14}
  7105. LDR R0,[R12,#v.scanspeed]
  7106. CMP R0,#2
  7107. BLT poorscan
  7108. LDR R11,[R12,#v.levelnet]
  7109. LDR R6,[R11,#net.xsize]
  7110. LDR R7,[R11,#net.ysize]
  7111. LDR R0,[R12,#v.scanxofs]
  7112. LDR R1,[R12,#v.scanyofs]
  7113. SUB R2,R6,R0
  7114. CMP R2,#32
  7115. MOVLT PC,#0
  7116. SUB R2,R7,R1
  7117. CMP R2,#32
  7118. MOVLT PC,#0
  7119. LDR R7,[R12,#v.scanadr]
  7120. LDR R0,[R11,#net.xsize]
  7121. SUB R0,R0,#32
  7122. STR R0,[R12,#v.scanxadd]
  7123. LDR R0,[R12,#v.scanctr]
  7124. LDR R1,[R12,#v.frameinc]
  7125. ADD R0,R0,R1
  7126. STR R0,[R12,#v.scanctr]
  7127. MOV R0,R0,LSR #1
  7128. AND R0,R0,#&3F
  7129. ADD R9,R7,#64*64
  7130. ADD R1,R9,#64*64
  7131. STR R1,[R12,#v.scanend]
  7132. ADD R9,R9,R0,LSL #6
  7133.  
  7134. LDR R0,[R12,#v.scanyofs]
  7135. LDR R1,[R11,#net.xsize]
  7136. MUL R0,R1,R0
  7137. ADD R11,R11,R0
  7138. LDR R0,[R12,#v.scanxofs]
  7139. ADR R3,scanwtab
  7140. AND R4,R0,#3
  7141. LDR R4,[R3,R4,LSL #2]
  7142. ADD R4,R3,R4
  7143. BIC R0,R0,#3
  7144. ADD R11,R11,R0
  7145. ADD R11,R11,#net.data
  7146. MOV R5,#32
  7147. LDR R0,[R12,#v.scanspeed]
  7148. MOV R14,#0
  7149. CMP R0,#2
  7150. ORRGE R14,R14,#&C0
  7151. CMP R0,#3
  7152. ORRGE R14,R14,#&10
  7153. CMP R0,#4
  7154. ORRGE R14,R14,#&20
  7155.  
  7156.  
  7157. ORR R14,R14,R14,LSL #8
  7158. ORR R14,R14,R14,LSL #16
  7159.  
  7160. ADD R10,R9,#64
  7161. ADD R8,R7,#64
  7162.  
  7163. .loop43
  7164. MOV R6,#64
  7165. LDR R1,[R12,#v.scanend]
  7166. CMP R9,R1
  7167. SUBGE R9,R9,#64*64
  7168. CMP R10,R1
  7169. SUBGE R10,R10,#64*64
  7170. STMFD R13!,{R4,R5}
  7171. MOV PC,R4
  7172. .scanins
  7173. LDMFD R13!,{R4,R5}
  7174. ADD R7,R7,#64
  7175. ADD R8,R8,#64
  7176. ADD R9,R9,#64
  7177. ADD R10,R10,#64
  7178. LDR R1,[R12,#v.scanxadd]
  7179. ADD R11,R11,R1
  7180. SUBS R5,R5,#1
  7181. BGT loop43
  7182. LDMFD R13!,{PC}
  7183.  
  7184. .scanwtab
  7185. DCD scanw0-scanwtab
  7186. DCD scanw1-scanwtab
  7187. DCD scanw2-scanwtab
  7188. DCD scanw3-scanwtab
  7189.  
  7190.  
  7191. .scanw0
  7192. .loop44
  7193. LDR R0,[R11],#4
  7194. ANDS R0,R0,R14
  7195. BEQ scan00zero
  7196. AND R4,R0,#&FF<<16
  7197. ORR R4,R4,R0,LSR #24
  7198. ORR R4,R4,R4,LSL #8
  7199. AND R5,R0,#&FF<<8
  7200. ORR R5,R5,R0,LSL #24
  7201. ORR R5,R5,R5,LSR #8
  7202.  
  7203. LDMIA R9!,{R0-R1}
  7204. LDMIA R10!,{R2-R3}
  7205. ORR R0,R0,R5,ROR #16
  7206. ORR R1,R1,R4,ROR #16
  7207. ORR R2,R2,R5,ROR #16
  7208. ORR R3,R3,R4,ROR #16
  7209.  
  7210. STMIA R7!,{R0-R1}
  7211. STMIA R8!,{R2-R3}
  7212. .scan00ins
  7213. LDR R0,[R11],#4
  7214. ANDS R0,R0,R14
  7215. BEQ scan01zero
  7216. AND R4,R0,#&FF<<16
  7217. ORR R4,R4,R0,LSR #24
  7218. ORR R4,R4,R4,LSL #8
  7219. AND R5,R0,#&FF<<8
  7220. ORR R5,R5,R0,LSL #24
  7221. ORR R5,R5,R5,LSR #8
  7222.  
  7223. LDMIA R9!,{R0-R1}
  7224. LDMIA R10!,{R2-R3}
  7225. ORR R0,R0,R5,ROR #16
  7226. ORR R1,R1,R4,ROR #16
  7227. ORR R2,R2,R5,ROR #16
  7228. ORR R3,R3,R4,ROR #16
  7229.  
  7230. STMIA R7!,{R0-R1}
  7231. STMIA R8!,{R2-R3}
  7232. .scan01ins
  7233. SUBS R6,R6,#16
  7234. BGT loop44
  7235. B scanins
  7236.  
  7237. .scan00zero
  7238. LDMIA R9!,{R0-R1}
  7239. LDMIA R10!,{R2-R3}
  7240. STMIA R7!,{R0-R1}
  7241. STMIA R8!,{R2-R3}
  7242. B scan00ins
  7243. .scan01zero
  7244. LDMIA R9!,{R0-R1}
  7245. LDMIA R10!,{R2-R3}
  7246. STMIA R7!,{R0-R1}
  7247. STMIA R8!,{R2-R3}
  7248. B scan01ins
  7249.  
  7250. .scanw1
  7251. .loop45
  7252. LDR R0,[R11]
  7253. LDR R1,[R11,#4]!
  7254. MOV R0,R0,LSR #8
  7255. ORR R0,R0,R1,LSL #24
  7256. ANDS R0,R0,R14
  7257. BEQ scan10zero
  7258. AND R4,R0,#&FF<<16
  7259. ORR R4,R4,R0,LSR #24
  7260. ORR R4,R4,R4,LSL #8
  7261. AND R5,R0,#&FF<<8
  7262. ORR R5,R5,R0,LSL #24
  7263. ORR R5,R5,R5,LSR #8
  7264.  
  7265. LDMIA R9!,{R0-R1}
  7266. LDMIA R10!,{R2-R3}
  7267. ORR R0,R0,R5,ROR #16
  7268. ORR R1,R1,R4,ROR #16
  7269. ORR R2,R2,R5,ROR #16
  7270. ORR R3,R3,R4,ROR #16
  7271.  
  7272. STMIA R7!,{R0-R1}
  7273. STMIA R8!,{R2-R3}
  7274. .scan10ins
  7275. LDR R0,[R11]
  7276. LDR R1,[R11,#4]!
  7277. MOV R0,R0,LSR #8
  7278. ORR R0,R0,R1,LSL #24
  7279. ANDS R0,R0,R14
  7280. BEQ scan11zero
  7281. AND R4,R0,#&FF<<16
  7282. ORR R4,R4,R0,LSR #24
  7283. ORR R4,R4,R4,LSL #8
  7284. AND R5,R0,#&FF<<8
  7285. ORR R5,R5,R0,LSL #24
  7286. ORR R5,R5,R5,LSR #8
  7287.  
  7288. LDMIA R9!,{R0-R1}
  7289. LDMIA R10!,{R2-R3}
  7290. ORR R0,R0,R5,ROR #16
  7291. ORR R1,R1,R4,ROR #16
  7292. ORR R2,R2,R5,ROR #16
  7293. ORR R3,R3,R4,ROR #16
  7294.  
  7295. STMIA R7!,{R0-R1}
  7296. STMIA R8!,{R2-R3}
  7297. .scan11ins
  7298. SUBS R6,R6,#16
  7299. BGT loop45
  7300. B scanins
  7301.  
  7302. .scan10zero
  7303. LDMIA R9!,{R0-R1}
  7304. LDMIA R10!,{R2-R3}
  7305. STMIA R7!,{R0-R1}
  7306. STMIA R8!,{R2-R3}
  7307. B scan10ins
  7308. .scan11zero
  7309. LDMIA R9!,{R0-R1}
  7310. LDMIA R10!,{R2-R3}
  7311. STMIA R7!,{R0-R1}
  7312. STMIA R8!,{R2-R3}
  7313. B scan11ins
  7314.  
  7315. .scanw2
  7316. .loop46
  7317. LDR R0,[R11]
  7318. LDR R1,[R11,#4]!
  7319. MOV R0,R0,LSR #16
  7320. ORR R0,R0,R1,LSL #16
  7321. ANDS R0,R0,R14
  7322. BEQ scan20zero
  7323. AND R4,R0,#&FF<<16
  7324. ORR R4,R4,R0,LSR #24
  7325. ORR R4,R4,R4,LSL #8
  7326. AND R5,R0,#&FF<<8
  7327. ORR R5,R5,R0,LSL #24
  7328. ORR R5,R5,R5,LSR #8
  7329.  
  7330. LDMIA R9!,{R0-R1}
  7331. LDMIA R10!,{R2-R3}
  7332. ORR R0,R0,R5,ROR #16
  7333. ORR R1,R1,R4,ROR #16
  7334. ORR R2,R2,R5,ROR #16
  7335. ORR R3,R3,R4,ROR #16
  7336.  
  7337. STMIA R7!,{R0-R1}
  7338. STMIA R8!,{R2-R3}
  7339. .scan20ins
  7340. LDR R0,[R11]
  7341. LDR R1,[R11,#4]!
  7342. MOV R0,R0,LSR #16
  7343. ORR R0,R0,R1,LSL #16
  7344. ANDS R0,R0,R14
  7345. BEQ scan21zero
  7346. AND R4,R0,#&FF<<16
  7347. ORR R4,R4,R0,LSR #24
  7348. ORR R4,R4,R4,LSL #8
  7349. AND R5,R0,#&FF<<8
  7350. ORR R5,R5,R0,LSL #24
  7351. ORR R5,R5,R5,LSR #8
  7352.  
  7353. LDMIA R9!,{R0-R1}
  7354. LDMIA R10!,{R2-R3}
  7355. ORR R0,R0,R5,ROR #16
  7356. ORR R1,R1,R4,ROR #16
  7357. ORR R2,R2,R5,ROR #16
  7358. ORR R3,R3,R4,ROR #16
  7359.  
  7360. STMIA R7!,{R0-R1}
  7361. STMIA R8!,{R2-R3}
  7362. .scan21ins
  7363. SUBS R6,R6,#16
  7364. BGT loop46
  7365. B scanins
  7366.  
  7367. .scan20zero
  7368. LDMIA R9!,{R0-R1}
  7369. LDMIA R10!,{R2-R3}
  7370. STMIA R7!,{R0-R1}
  7371. STMIA R8!,{R2-R3}
  7372. B scan20ins
  7373. .scan21zero
  7374. LDMIA R9!,{R0-R1}
  7375. LDMIA R10!,{R2-R3}
  7376. STMIA R7!,{R0-R1}
  7377. STMIA R8!,{R2-R3}
  7378. B scan21ins
  7379.  
  7380. .scanw3
  7381. .loop47
  7382. LDR R0,[R11]
  7383. LDR R1,[R11,#4]!
  7384. MOV R0,R0,LSR #24
  7385. ORR R0,R0,R1,LSL #8
  7386. ANDS R0,R0,R14
  7387. BEQ scan30zero
  7388. AND R4,R0,#&FF<<16
  7389. ORR R4,R4,R0,LSR #24
  7390. ORR R4,R4,R4,LSL #8
  7391. AND R5,R0,#&FF<<8
  7392. ORR R5,R5,R0,LSL #24
  7393. ORR R5,R5,R5,LSR #8
  7394.  
  7395. LDMIA R9!,{R0-R1}
  7396. LDMIA R10!,{R2-R3}
  7397. ORR R0,R0,R5,ROR #16
  7398. ORR R1,R1,R4,ROR #16
  7399. ORR R2,R2,R5,ROR #16
  7400. ORR R3,R3,R4,ROR #16
  7401.  
  7402. STMIA R7!,{R0-R1}
  7403. STMIA R8!,{R2-R3}
  7404. .scan30ins
  7405. LDR R0,[R11]
  7406. LDR R1,[R11,#4]!
  7407. MOV R0,R0,LSR #24
  7408. ORR R0,R0,R1,LSL #8
  7409. ANDS R0,R0,R14
  7410. BEQ scan31zero
  7411. AND R4,R0,#&FF<<16
  7412. ORR R4,R4,R0,LSR #24
  7413. ORR R4,R4,R4,LSL #8
  7414. AND R5,R0,#&FF<<8
  7415. ORR R5,R5,R0,LSL #24
  7416. ORR R5,R5,R5,LSR #8
  7417.  
  7418. LDMIA R9!,{R0-R1}
  7419. LDMIA R10!,{R2-R3}
  7420. ORR R0,R0,R5,ROR #16
  7421. ORR R1,R1,R4,ROR #16
  7422. ORR R2,R2,R5,ROR #16
  7423. ORR R3,R3,R4,ROR #16
  7424.  
  7425. STMIA R7!,{R0-R1}
  7426. STMIA R8!,{R2-R3}
  7427. .scan31ins
  7428. SUBS R6,R6,#16
  7429. BGT loop47
  7430. B scanins
  7431.  
  7432. .scan30zero
  7433. LDMIA R9!,{R0-R1}
  7434. LDMIA R10!,{R2-R3}
  7435. STMIA R7!,{R0-R1}
  7436. STMIA R8!,{R2-R3}
  7437. B scan30ins
  7438. .scan31zero
  7439. LDMIA R9!,{R0-R1}
  7440. LDMIA R10!,{R2-R3}
  7441. STMIA R7!,{R0-R1}
  7442. STMIA R8!,{R2-R3}
  7443. B scan31ins
  7444.  
  7445. .scanset
  7446. STMFD R13!,{R14}
  7447. LDR R0,[R12,#v.xpos]
  7448. LDR R1,[R12,#v.ypos]
  7449. LDR R11,[R12,#v.levelnet]
  7450. BIC R0,R0,#&FFF
  7451. BIC R1,R1,#&FFF
  7452.  
  7453. DIV96 R0,R4
  7454. DIV96 R1,R5
  7455. LDR R2,[R11,#net.xsize]
  7456. LDR R3,[R11,#net.ysize]
  7457. SUB R0,R2,#32
  7458. SUB R1,R3,#32
  7459. ADD R4,R4,R0,LSR #1
  7460. ADD R5,R5,R1,LSR #1
  7461.  
  7462. CMP R4,#0
  7463. MOVLT R4,#0
  7464. SUB R2,R2,#32
  7465. CMP R4,R2
  7466. MOVGT R4,R2
  7467. CMP R5,#0
  7468. MOVLT R5,#0
  7469. SUB R3,R3,#32
  7470. CMP R5,R3
  7471. MOVGT R5,R3
  7472.  
  7473. LDR R2,[R12,#v.scanlock]
  7474. CMP R2,#1
  7475. MOVEQ R4,#0
  7476. MOVEQ R5,#0
  7477. STR R4,[R12,#v.scanxofs]
  7478. STR R5,[R12,#v.scanyofs]
  7479. LDMFD R13!,{PC}
  7480.  
  7481. .poorscan
  7482. LDR R11,[R12,#v.scanadr]
  7483. ADD R10,R11,#64*64
  7484. MOV R9,#64*64
  7485. .loop48
  7486. #rept 4
  7487. LDMIA R10!,{R0-R7}
  7488. STMIA R11!,{R0-R7}
  7489. #endr
  7490. SUBS R9,R9,#128
  7491. BGT loop48
  7492. LDMFD R13!,{PC}
  7493.  
  7494.  
  7495.  
  7496. .scanwrite
  7497. STMFD R13!,{R14}
  7498. LDR R7,[R12,#v.lineskip]
  7499. CMP R7,#1
  7500. LDR R11,[R12,#v.scanadr]
  7501. LDR R0,[R12,#v.scanspeed]
  7502. CMP R0,#0
  7503. ADDEQ R11,R11,#64*64
  7504. LDR R10,[R12,#v.screenuse]
  7505. ADD R10,R10,#320*21+248
  7506. CMP R7,#1
  7507. ADDEQ R10,R10,#320*21
  7508. MOV R9,#64
  7509. LDR R8,[R12,#v.hbytes]
  7510. SUB R8,R8,#64
  7511. ADDEQ R8,R8,#320
  7512. BEQ scanwrite49
  7513. .loop1d
  7514. LDMIA R11!,{R0-R7}
  7515. STMIA R10!,{R0-R7}
  7516. LDMIA R11!,{R0-R7}
  7517. STMIA R10!,{R0-R7}
  7518. ADD R10,R10,R8
  7519. SUBS R9,R9,#1
  7520. BGT loop1d
  7521. LDMFD R13!,{PC}
  7522. .scanwrite49
  7523. .loop491d
  7524. ADD R14,R10,#320
  7525. LDMIA R11!,{R0-R7}
  7526. STMIA R10!,{R0-R7}
  7527. STMIA R14!,{R0-R7}
  7528. LDMIA R11!,{R0-R7}
  7529. STMIA R10!,{R0-R7}
  7530. STMIA R14!,{R0-R7}
  7531. ADD R10,R10,R8
  7532. SUBS R9,R9,#1
  7533. BGT loop491d
  7534. LDMFD R13!,{PC}
  7535.  
  7536.  
  7537. .scangrab
  7538. STMFD R13!,{R14}
  7539. LDR R7,[R12,#v.lineskip]
  7540. CMP R7,#1
  7541. LDR R11,[R12,#v.screenuse]
  7542. ADD R11,R11,#320*21+248
  7543. ADDEQ R11,R11,#320*21
  7544. LDR R10,[R12,#v.scanadr]
  7545. ADD R10,R10,#64*64
  7546. MOV R9,#64
  7547. LDR R8,[R12,#v.hbytes]
  7548. SUB R8,R8,#64
  7549. ADDEQ R8,R8,#320
  7550. .loop1f
  7551. LDMIA R11!,{R0-R7}
  7552. STMIA R10!,{R0-R7}
  7553. LDMIA R11!,{R0-R7}
  7554. STMIA R10!,{R0-R7}
  7555. ADD R11,R11,R8
  7556. SUBS R9,R9,#1
  7557. BGT loop1f
  7558. LDMFD R13!,{PC}
  7559.  
  7560. .redcheck
  7561. STMFD R13!,{R14}
  7562. LDR R0,[R12,#v.redball]
  7563. CMP R0,#1
  7564. LDMNEFD R13!,{PC}
  7565. MOV R0,#ballstab
  7566. SWI Amnesia_CountObjects
  7567. CMP R0,#36
  7568. LDMGTFD R13!,{PC}
  7569. LDR R3,[R12,#v.diff]
  7570. .redcheckloop
  7571. STMFD R13!,{R3}
  7572. LDR R9,[R12,#v.levelnet]
  7573. LDR R5,[R9,#net.xsize]
  7574. LDR R6,[R9,#net.ysize]
  7575. MUL R4,R5,R6
  7576. BL random
  7577. AND R0,R0,#&FFF
  7578. CMP R0,R4
  7579. BGE redcheckfail
  7580. ADD R9,R9,#net.data
  7581. ADD R9,R9,R0
  7582. LDRB R0,[R9]
  7583. CMP R0,#&28
  7584. BNE redcheckfail
  7585. MOV R0,R9
  7586. BL backtranslate
  7587. MOV R3,R0
  7588. MOV R4,R1
  7589. BLVC makeredball
  7590. .redcheckfail
  7591. LDMFD R13!,{R3}
  7592. SUBS R3,R3,#1
  7593. BPL redcheckloop
  7594. LDMFD R13!,{PC}
  7595.  
  7596. .bastardmes
  7597. .bm1
  7598. DCD 160<<12,120<<12,0,0,&00200001,bm2-bm1
  7599. DCB "SUICIDE MODE",0
  7600. ALIGN
  7601. .bm2
  7602. DCD 160<<12,120<<12,0,0,&00200001,bm3-bm2
  7603. DCB 0
  7604. ALIGN
  7605. .bm3
  7606. DCD 160<<12,120<<12,0,0,&00200001,bm4-bm3
  7607. DCB "SUICIDE MODE",0
  7608. ALIGN
  7609. .bm4
  7610. DCD 160<<12,120<<12,0,0,&00200001,bm5-bm4
  7611. DCB 0
  7612. ALIGN
  7613. .bm5
  7614. DCD 160<<12,120<<12,0,0,&00200001,0
  7615. DCB "SUICIDE MODE",0
  7616. ALIGN
  7617.  
  7618.  
  7619.  
  7620. .bastardmode
  7621. STMFD R13!,{R14}
  7622. LDR R0,[R12,#v.bastard]
  7623. CMP R0,#0
  7624. LDMNEFD R13!,{PC}
  7625. ADR R0,bastardmes
  7626. BL message
  7627. MOV R0,#500
  7628. STR R0,[R12,#v.bastard]
  7629. BL bastardsound
  7630. LDMFD R13!,{PC}
  7631.  
  7632. .goodycheck
  7633. STMFD R13!,{R14}
  7634. MOV R0,#0
  7635. STR R0,[R12,#v.magnet]
  7636. STR R0,[R12,#v.ballstops]
  7637. LDR R0,[R12,#v.buttons]
  7638. TST R0,#4
  7639. BLNE selectdown
  7640. LDR R0,[R12,#v.buttons]
  7641. TST R0,#1
  7642. BLNE adjustdown
  7643.  
  7644. LDR R0,[R12,#v.buttons]
  7645. TST R0,#2
  7646. BNE menudown
  7647. LDR R0,[R12,#v.goodycsr]
  7648. BIC R0,R0,#1<<31
  7649. STR R0,[R12,#v.goodycsr]
  7650. LDMFD R13!,{PC}
  7651. .menudown 
  7652. LDR R0,[R12,#v.goodycsr]
  7653. TST R0,#1<<31
  7654. LDMNEFD R13!,{PC}
  7655. ADD R0,R0,#1
  7656. AND R0,R0,#3
  7657. ORR R0,R0,#1<<31
  7658. STR R0,[R12,#v.goodycsr]
  7659. MOV R0,#1
  7660. STR R0,[R12,#v.goodychange]
  7661. LDMFD R13!,{PC}
  7662.  
  7663. .bastarddown
  7664. STMFD R13!,{R14}
  7665. BL bastardmode
  7666. LDMFD R13!,{PC}
  7667.  
  7668. .adjustdown
  7669. STMFD R13!,{R14}
  7670. .adjuststart
  7671. LDR R0,[R12,#v.lastbuttons]
  7672. TST R0,#1
  7673. LDMNEFD R13!,{PC}
  7674. LDR R0,[R12,#v.cheat]
  7675. CMP R0,#1
  7676. LDMNEFD R13!,{PC}
  7677. LDR R0,[R12,#v.goodycsr]
  7678. ADD R11,R12,#v.goodytab
  7679. AND R0,R0,#3
  7680. ADD R11,R11,R0,LSL #2
  7681. LDR R0,[R11]
  7682. ADD R0,R0,#1
  7683. AND R0,R0,#15
  7684. CMP R0,#14
  7685. MOVGE R0,#0
  7686. STR R0,[R11]
  7687. .adjustend
  7688. LDMFD R13!,{PC}
  7689.  
  7690. .selectdown
  7691. STMFD R13!,{R14}
  7692. LDR R0,[R12,#v.goodycsr]
  7693. ADD R11,R12,#v.goodytab
  7694. AND R0,R0,#3
  7695. ADD R11,R11,R0,LSL #2
  7696. MOV R1,R11
  7697. LDR R0,[R1]
  7698. BL goodyuse
  7699. LDMFD R13!,{PC}
  7700.  
  7701. .goodyuse
  7702. STMFD R13!,{R0-R11,R14}
  7703. MOV R11,R1
  7704. AND R0,R0,#15
  7705. CMP R0,#0
  7706. BLE goodyend
  7707. ADR R1,gjtab
  7708. LDR R2,[R1,R0,LSL #2]
  7709. ADD PC,R1,R2
  7710. .gjtab
  7711. DCD goodyend-gjtab
  7712. DCD goody1-gjtab
  7713. DCD goody2-gjtab
  7714. DCD goody3-gjtab
  7715. DCD goody4-gjtab
  7716. DCD goody5-gjtab
  7717. DCD goody6-gjtab
  7718. DCD goody7-gjtab
  7719. DCD goody8-gjtab
  7720. DCD goody9-gjtab
  7721. DCD goody10-gjtab
  7722. DCD goody11-gjtab
  7723. DCD goody12-gjtab
  7724. DCD goody13-gjtab
  7725. DCD goodyend-gjtab
  7726. DCD goodyend-gjtab
  7727. .goody1
  7728. MOV R0,#0
  7729. STR R0,[R11]
  7730. LDR R3,[R12,#v.xpos]
  7731. LDR R4,[R12.#v.ypos]
  7732. BL makeball
  7733. MOV R0,#1
  7734. BL goodyeffect
  7735. B goodyend
  7736.  
  7737. .goody2
  7738. MOV R0,#1
  7739. STR R0,[R12,#v.magnet]
  7740. BL magnetsound
  7741. MOV R0,#&3555
  7742. STR R0,[R12,#v.magpitch]
  7743. B goodyend
  7744. .goody3
  7745. MOV R0,#0
  7746. STR R0,[R11]
  7747. LDR R0,[R12,#v.scanspeed]
  7748. ADD R0,R0,#1
  7749. STR R0,[R12,#v.scanspeed]
  7750. ;add scan
  7751. B goodyend
  7752. .goody4
  7753. MOV R0,#0
  7754. STR R0,[R11]
  7755. ;set ball fire on
  7756. MOV R0,#500
  7757. STR R0,[R12,#v.ballfire]
  7758. MOV R0,#4
  7759. BL goodyeffect
  7760. B goodyend
  7761. .goody5
  7762. MOV R0,#0
  7763. STR R0,[R11]
  7764. MOV R0,#1
  7765. STR R0,[R12,#v.ballstops]
  7766. ;stop balls
  7767. MOV R0,#5
  7768. BL goodyeffect
  7769. B goodyend
  7770. .goody6
  7771. LDR R0,[R12,#v.xgrav]
  7772. LDR R1,[R12,#v.ygrav]
  7773. CMP R0,#0
  7774. CMPEQ R1,#0
  7775. BEQ goodyend
  7776. MOV R0,#0
  7777. STR R0,[R11]
  7778. MOV R0,#0
  7779. STR R0,[R12,#v.xgrav]
  7780. STR R0,[R12,#v.ygrav]
  7781. MOV R0,#6
  7782. BL goodyeffect
  7783. B goodyend
  7784. .goody7
  7785. ;extra life
  7786. MOV R0,#0
  7787. STR R0,[R11]
  7788. LDR R0,[R12,#v.pllives]
  7789. ADD R0,R0,#1
  7790. STR R0,[R12,#v.pllives]
  7791. ADR R0,exlifemes
  7792. BL message
  7793.  
  7794. B goodyend
  7795. .goody8
  7796. LDR R0,[R12,#v.levelno]
  7797. TST R0,#&400
  7798. BLEQ badgoody8
  7799. MOV R0,#0
  7800. STR R0,[R11]
  7801. LDR R0,[R12,#v.warptime]
  7802. ADD R0,R0,#60*50
  7803. STR R0,[R12,#v.warptime]
  7804. B goodyend
  7805. .goody9
  7806. ;bastard mode
  7807. MOV R0,#9
  7808. BL goodyeffect
  7809. BL bastardmode
  7810. B goodyend
  7811. .goody10
  7812. MOV R0,#0
  7813. STR R0,[R11]
  7814. MOV R0,#500
  7815. STR R0,[R12,#v.blueball]
  7816. ;blue ball
  7817. MOV R0,#10
  7818. BL goodyeffect
  7819. B goodyend
  7820. .goody11
  7821. ;line radar
  7822. LDR R0,[R12,#v.lastbuttons]
  7823. TST R0,#4
  7824. BNE goodyend
  7825. LDR R0,[R12,#v.lineradar]
  7826. RSB R0,R0,#1
  7827. STR R0,[R12,#v.lineradar]
  7828. BL lineradarstate
  7829. B goodyend
  7830.  
  7831. .goody12
  7832. MOV R0,#0
  7833. STR R0,[R11]
  7834. LDR R9,[R12,#v.levelnet]
  7835. LDR R0,[R9,#net.xsize]
  7836. LDR R1,[R9,#net.ysize]
  7837. MUL R0,R1,R0
  7838. ADD R9,R9,#net.data
  7839. ADD R8,R9,R0
  7840. .loop8a
  7841. LDRB R0,[R9]
  7842. CMP R0,#hit1
  7843. CMPNE R0,#hit2
  7844. BNE skip8a
  7845. MOV R0,#0
  7846. STMFD R13!,{R8-R9}
  7847. MOV R0,R9
  7848. BL blockdest
  7849. LDMFD R13!,{R8-R9}
  7850. .skip8a
  7851. ADD R9,R9,#1
  7852. CMP R9,R8
  7853. BLT loop8a
  7854. MOV R0,#0
  7855. STR R0,[R12,#v.blocksleft]
  7856. MOV R0,#12
  7857. BL goodyeffect
  7858. B goodyend
  7859.  
  7860. .goody13
  7861. LDR R0,[R12,#v.xpos]
  7862. LDR R1,[R12,#v.ypos]
  7863. BL translate
  7864. BVS nogoody13
  7865. LDR R9,[R12,#v.levelnet]
  7866. LDR R5,[R9,#net.xsize]
  7867. LDR R6,[R9,#net.ysize]
  7868. CMN R2,R5,LSR #1
  7869. BLE nogoody13
  7870. ADD R2,R2,#1
  7871. CMP R2,R5,LSR #1
  7872.  
  7873. BGE nogoody13
  7874. CMN R3,R6,LSR #1
  7875. BLE nogoody13
  7876. ADD R3,R3,#1
  7877. CMP R3,R6,LSR #1
  7878. BGE nogoody13
  7879. LDRB R0,[R4]
  7880. CMP R0,#0
  7881. MOV R0,#0
  7882. STRNEB R0,[R11]
  7883. MOV R0,R4
  7884. STMFD R13!,{R4,R11}
  7885. BL blockdest
  7886. LDMFD R13!,{R4,R11}
  7887. MOV R0,#0
  7888. STRB R0,[R4]
  7889. .nogoody13
  7890. B goodyend
  7891.  
  7892. .goodyend
  7893. LDMFD R13!,{R0-R11,PC}
  7894.  
  7895. .exlifemes
  7896. DCD 160<<12,80<<12,0,0,&00500001,exlifemes2-exlifemes
  7897. DCB "EXTRA LIFE",0
  7898. ALIGN           
  7899. .exlifemes2
  7900. DCD 160<<12,80<<12,0,-1<<12,&00500001,0
  7901. DCB "EXTRA LIFE",0
  7902. ALIGN           
  7903.  
  7904. .badgoody8
  7905. LDR R0,[R12,#v.lastbuttons]
  7906. TST R0,#4
  7907. BNE goodyend
  7908. ADR R0,badgoody8mes
  7909. BL message
  7910. BL message
  7911. B goodyend
  7912. .badgoody8mes
  7913. DCD 160<<12,80<<12,0,0,&00500001,0
  7914. DCB "USE EXTRA TIME ON",0
  7915. ALIGN           
  7916. DCD 160<<12,100<<12,0,0,&00500001,0
  7917. DCB "BONUS LEVELS ONLY",0
  7918. ALIGN
  7919.  
  7920. .lineradarstate
  7921. STMFD R13!,{R14}
  7922. LDR R1,[R12,#v.lineradar]
  7923. ADR R0,lineradaroff
  7924. CMP R1,#1
  7925. ADREQ R0,lineradaron
  7926. BL message
  7927. LDMFD R13!,{PC}
  7928.  
  7929. .lineradaroff
  7930. DCD 160<<12,140<<12,0,0,&00200001,0
  7931. DCB "LINE RADAR OFF",0
  7932. ALIGN    
  7933. .lineradaron       
  7934. DCD 160<<12,140<<12,0,0,&00200001,0
  7935. DCB "LINE RADAR ON",0
  7936. ALIGN
  7937.           
  7938.  
  7939.  
  7940. .goodyeffect
  7941. STMFD R13!,{R14}
  7942. LDR R3,[R12,#v.xpos]
  7943. LDR R4,[R12,#v.ypos]
  7944. MOV R1,R0
  7945. MOV R2,#8
  7946. ADR R11,circletab
  7947. .loop41
  7948. STMFD R13!,{R1-R4,R11}
  7949. LDMIA R11,{R5,R6}
  7950. MOV R5,R5,ASR #16
  7951. MOV R6,R6,ASR #16
  7952. ADD R3,R3,R5,ASL #2
  7953. ADD R4,R4,R6,ASL #2
  7954. LDR R0,[R12,#v.xvec]
  7955. ADD R5,R5,R0
  7956. LDR R0,[R12,#v.yvec]
  7957. ADD R6,R6,R0
  7958. BL goodymakedecor
  7959. LDMFD R13!,{R1-R4,R11}
  7960. ADD R11,R11,#256
  7961. SUBS R2,R2,#1
  7962. BGT loop41
  7963. LDMFD R13!,{PC}
  7964.  
  7965. .goodymakedecor         ;R1 decor type
  7966.             ;R3,R4 coords
  7967. STMFD R13!,{R5-R8,R14}
  7968. MOV R2,#%1000000100010101
  7969. MOV R7,#&08000080
  7970. MOV R8,#0
  7971. MOV R0,#decortab
  7972. ORR R1,R1,#(goodytab)<<24
  7973. SWI Amnesia_MakeObject
  7974. LDMFD R13!,{R5-R8,PC}
  7975.  
  7976. .goodystoreeffect
  7977. STMFD R13!,{R8-R9,R14}
  7978. MOV R0,#decortab
  7979. MOV R1,#1
  7980. MOV R2,#0
  7981. LDR R3,[R9,#32]
  7982. AND R3,R3,#&F
  7983. ADD R3,R3,#(goodytab<<24)
  7984. MOV R4,#0
  7985. SWI Amnesia_SelectTable
  7986. .loop4a
  7987. SWI Amnesia_ProcessTable
  7988. CMP R2,#0
  7989. BEQ storeeffectend
  7990. STMFD R13!,{R0-R4}
  7991. LDR R3,[R12,#v.xpos]
  7992. LDR R4,[R1,#8]
  7993. SUB R3,R3,R4
  7994. MOV R3,R3,ASR #4
  7995. LDR R4,[R12,#v.xvec]
  7996. ADD R3,R3,R4
  7997. STR R3,[R1,#16]
  7998.  
  7999. LDR R3,[R12,#v.ypos]
  8000. LDR R4,[R1,#12]
  8001. SUB R3,R3,R4
  8002. MOV R3,R3,ASR #4
  8003. LDR R4,[R12,#v.yvec]
  8004. ADD R3,R3,R4
  8005. STR R3,[R1,#20]
  8006. MOV R0,#&08000080
  8007. STR R0,[R1,#24]
  8008.  
  8009. LDMFD R13!,{R0-R4}
  8010. B loop4a
  8011.  
  8012. .storeeffectend
  8013. LDMFD R13!,{R8-R9,PC}
  8014.  
  8015. .goodyuseeffect
  8016. STMFD R13!,{R8-R9,R14}
  8017. MOV R0,#decortab
  8018. MOV R1,#1
  8019. MOV R2,#0
  8020. LDR R3,[R9,#32]
  8021. AND R3,R3,#&F
  8022. ADD R3,R3,#(goodytab<<24)
  8023. MOV R4,#0
  8024. SWI Amnesia_SelectTable
  8025. .loop4b
  8026. SWI Amnesia_ProcessTable
  8027. CMP R2,#0
  8028. BEQ storeeffectend
  8029. STMFD R13!,{R0-R4}
  8030. LDR R3,[R1,#16]
  8031. LDR R4,[R1,#20]
  8032. RSB R4,R4,#0
  8033. MOV R3,R3,ASL #1
  8034. MOV R4,R4,ASL #1
  8035.  
  8036. STR R4,[R1,#16]
  8037. STR R3,[R1,#20]
  8038. MOV R0,#&08000080
  8039. STR R0,[R1,#24]
  8040.  
  8041. LDMFD R13!,{R0-R4}
  8042. B loop4b
  8043.  
  8044. .useeffectend
  8045. LDMFD R13!,{R8-R9,PC}
  8046.  
  8047. .scoreupdate
  8048. LDR R0,[R12,#v.plscore]
  8049. LDR R1,[R12,#v.lastscore]
  8050. CMP R0,R1
  8051. MOVEQ PC,R14
  8052.  
  8053. STR R0,[R12,#v.lastscore]
  8054. STMFD R13!,{R14}
  8055. ;BL scorecheck
  8056. LDR R0,[R12,#v.scoreofs]
  8057. BL paperwipe
  8058. LDR R0,[R12,#v.scoreofs]
  8059. BL setuppaper
  8060. LDR R0,[R12,#v.plscore]
  8061. ADD R1,R12,#v.buffer
  8062. MOV R2,#16
  8063. SWI OS_ConvertCardinal4
  8064. SUB R0,R1,R0
  8065. MOV R1,#11
  8066. MUL R0,R1,R0
  8067. MOV R0,R0,ASR #1
  8068. RSB R1,R0,#38
  8069. ADD R3,R12,#v.buffer
  8070. .loop16
  8071. LDRB R0,[R3],#1
  8072. CMP R0,#32
  8073. BLT scoreupend
  8074. ADD R0,R0,#(texttab<<24)
  8075. MOV R2,#7
  8076. SWI FastSpr_Plot
  8077. ADD R1,R1,#11
  8078. B loop16
  8079. .scoreupend
  8080. MOV R0,#1
  8081. STR R0,[R12,#v.scorechange]
  8082. LDMFD R13!,{PC}
  8083.  
  8084.  
  8085. .livesupdate
  8086. LDR R0,[R12,#v.pllives]
  8087. LDR R1,[R12,#v.lastlives]
  8088. CMP R0,R1
  8089. MOVEQ PC,R14
  8090. STR R0,[R12,#v.lastlives]
  8091. STMFD R13!,{R14}
  8092. LDR R0,[R12,#v.livesofs]
  8093. BL paperwipe
  8094. LDR R0,[R12,#v.livesofs]
  8095. BL setuppaper
  8096. LDR R3,[R12,#v.pllives]
  8097. MOV R0,#(decortab<<24)+1
  8098. MOV R1,#32
  8099. MOV R2,#7
  8100. BL writenumber
  8101. MOV R0,#1
  8102. STR R0,[R12,#v.liveschange]
  8103. LDMFD R13!,{PC}
  8104.  
  8105. .ballsupdate
  8106. LDR R0,[R12,#v.ballctr]
  8107. LDR R1,[R12,#v.lastballs]
  8108. CMP R0,R1
  8109. MOVEQ PC,R14
  8110. STR R0,[R12,#v.lastballs]
  8111. STMFD R13!,{R14}
  8112. LDR R0,[R12,#v.ballsofs]
  8113. BL paperwipe
  8114. LDR R0,[R12,#v.ballsofs]
  8115. BL setuppaper
  8116. LDR R3,[R12,#v.ballctr]
  8117. MOV R0,#(decortab<<24)+(2<<16)+1
  8118. MOV R1,#32
  8119. MOV R2,#7
  8120. BL writenumber
  8121. MOV R0,#1
  8122. STR R0,[R12,#v.ballschange]
  8123. LDMFD R13!,{PC}
  8124.  
  8125. .goodyupdate
  8126. STMFD R13!,{R14}
  8127. ADD R9,R12,#v.goodytab
  8128. ADD R10,R12,#v.lastgoodytab
  8129. LDMIA R9,{R0-R3}
  8130. LDMIA R10,{R4-R7}
  8131. CMP R0,R4
  8132. CMPEQ R1,R5
  8133. CMPEQ R2,R6
  8134. CMPEQ R3,R7
  8135. BNE dogoodyupdate
  8136. LDR R0,[R12,#v.goodycsr]
  8137. LDR R1,[R12,#v.lastgoodycsr]
  8138. CMP R0,R1
  8139. BNE dogoodyupdate
  8140. LDMFD R13!,{PC}
  8141.  
  8142. .dogoodyupdate
  8143. LDMIA R9,{R0-R3}
  8144. STMIA R10,{R0-R3}
  8145. LDR R0,[R12,#v.goodycsr]
  8146. STR R0,[R12,#v.lastgoodycsr]
  8147. LDR R0,[R12,#v.goodyofs]
  8148. BL paperwipe
  8149. LDR R0,[R12,#v.goodyofs]
  8150. BL setuppaper
  8151. LDR R0,[R12,#v.goodycsr]
  8152. AND R0,R0,#3
  8153. MOV R1,R0,LSL #4
  8154. ADD R1,R1,R0,LSL #2
  8155. ADD R1,R1,#10
  8156. MOV R0,#(goodytab<<24)
  8157. MOV R2,#8
  8158. SWI FastSpr_Plot
  8159. MOV R3,#4
  8160. ADD R11,R12,#v.goodytab
  8161. MOV R4,#10
  8162. .goodloop
  8163. LDR R0,[R11],#4
  8164. AND R0,R0,#&FF
  8165. CMP R0,#maxgoody
  8166. MOVGT R0,#0
  8167. MOV R1,R4
  8168. MOV R2,#8
  8169. CMP R0,#0
  8170. ORR R0,R0,#(goodytab<<24)
  8171. SWINE FastSpr_Plot
  8172. ADD R4,R4,#20
  8173. SUBS R3,R3,#1
  8174. BGT goodloop
  8175. MOV R0,#1
  8176. STR R0,[R12,#v.goodychange]
  8177. LDMFD R13!,{PC}
  8178.  
  8179. .writenumber
  8180. STMFD R13!,{R14}
  8181. CMP R3,#0
  8182. LDMLEFD R13!,{PC}
  8183. CMP R3,#5
  8184. BGT shortnumber
  8185. STMFD R13!,{R0-R2}
  8186. SWI FastSpr_ReadSize
  8187. ADD R4,R0,#1
  8188. LDMFD R13!,{R0-R2}
  8189. MUL R5,R4,R3
  8190. SUB R5,R5,R4
  8191.  
  8192. SUB R1,R1,R5,ASR #1
  8193. .loop1a
  8194. STMFD R13!,{R0-R2}
  8195. SWI FastSpr_Plot
  8196. LDMFD R13!,{R0-R2}
  8197. ADD R1,R1,R4
  8198. SUBS R3,R3,#1
  8199. BGT loop1a
  8200. LDMFD R13!,{PC}
  8201.  
  8202. .shortnumber
  8203. STMFD R13!,{R0-R2}
  8204. MOV R0,R3
  8205. ADD R1,R12,#v.buffer
  8206. MOV R2,#16
  8207. SWI OS_ConvertCardinal4
  8208. SUB R0,R1,R0
  8209. ADD R0,R0,#1
  8210. MOV R1,#11
  8211. MUL R0,R1,R0
  8212. MOV R5,R0,ASR #1
  8213. LDMFD R13!,{R0-R2}
  8214. SUB R1,R1,R5
  8215. SWI FastSpr_Plot
  8216. ADD R1,R1,#11
  8217. MOV R0,#(texttab<<24)+"X"
  8218. SWI FastSpr_Plot
  8219. ADD R1,R1,#11
  8220. ADD R3,R12,#v.buffer
  8221.  
  8222. .loop1b
  8223. LDRB R0,[R3],#1
  8224. CMP R0,#32
  8225. BLT numberend
  8226. ADD R0,R0,#(texttab<<24)
  8227. MOV R2,#7
  8228. SWI FastSpr_Plot
  8229. ADD R1,R1,#11
  8230. B loop1b
  8231. .numberend
  8232. LDMFD R13!,{PC}
  8233.  
  8234. .doreps
  8235. STMFD R13!,{R14}
  8236. ADD R0,R12,#v.ballsofs
  8237. ADD R1,R12,#v.ballschange
  8238. BL repifnes
  8239. ADD R0,R12,#v.scoreofs
  8240. ADD R1,R12,#v.scorechange
  8241. BL repifnes
  8242. ADD R0,R12,#v.livesofs
  8243. ADD R1,R12,#v.liveschange
  8244. BL repifnes
  8245. ADD R0,R12,#v.goodyofs
  8246. ADD R1,R12,#v.goodychange
  8247. BL repifnes
  8248. LDMFD R13!,{PC}
  8249.  
  8250. .repifnes
  8251. STMFD R13!,{R14}
  8252. LDR R3,[R12,#v.paperadr]
  8253. LDR R2,[R1]
  8254. CMP R2,#0
  8255. MOV R2,#0
  8256. STR R2,[R1]
  8257. LDR R0,[R0]
  8258. ADD R0,R3,R0
  8259. BLNE replace
  8260. LDMFD R13!,{PC}
  8261.  
  8262. .dograbs
  8263. STMFD R13!,{R14}
  8264. MOV R0,#248
  8265. MOV R1,#108
  8266. MOV R2,#64
  8267. MOV R3,#14
  8268. LDR R4,[R12,#v.storesadr]
  8269. MOV R5,R4
  8270. SUB R6,R4,R5
  8271. STR R6,[R12,#v.ballsofs]
  8272. BL grab2
  8273. MOV R1,#145
  8274. SUB R6,R4,R5
  8275. STR R6,[R12,#v.scoreofs]
  8276. BL grab2
  8277. MOV R1,#183
  8278. SUB R6,R4,R5
  8279. STR R6,[R12,#v.livesofs]
  8280. BL grab2
  8281. MOV R0,#240
  8282. MOV R1,#221
  8283. MOV R2,#80
  8284. MOV R3,#16
  8285. SUB R6,R4,R5
  8286. STR R6,[R12,#v.goodyofs]
  8287. BL grab2
  8288. LDMFD R13!,{PC}
  8289.  
  8290. .grab2
  8291. STMFD R13!,{R14}
  8292. STMFD R13!,{R6}
  8293. BL grab
  8294. LDMFD R13!,{R6}
  8295. STMFD R13!,{R4}
  8296. LDR R4,[R12,#v.paperadr]
  8297. ADD R4,R4,R6
  8298. BL grab
  8299. LDMFD R13!,{R4}
  8300. LDMFD R13!,{PC}
  8301.  
  8302. .transfer
  8303. STMFD R13!,{R5-R6,R14}
  8304. LDR R5,[R12,#v.lineskip]
  8305. CMP R5,#1
  8306. BEQ transfer49
  8307. .loopv
  8308. STMFD R13!,{R0,R2}
  8309.  
  8310. .loopw
  8311. LDR R6,[R1],#4
  8312. STR R6,[R0],#4
  8313. SUBS R2,R2,#4
  8314. BGT loopw
  8315. LDMFD R13!,{R0,R2}
  8316. ADD R0,R0,R4
  8317. SUBS R3,R3,#1
  8318. BGT loopv
  8319. LDMFD R13!,{R5-R6,PC}
  8320.  
  8321. .transfer49
  8322. ADD R4,R4,#320
  8323. .loopv49
  8324. STMFD R13!,{R0,R2}
  8325. .loopw49
  8326. LDR R6,[R1],#4
  8327. STR R6,[R0,#320]
  8328. STR R6,[R0],#4
  8329. SUBS R2,R2,#4
  8330. BGT loopw49
  8331. LDMFD R13!,{R0,R2}
  8332. ADD R0,R0,R4
  8333. SUBS R3,R3,#1
  8334. BGT loopv49
  8335. LDMFD R13!,{R5-R6,PC}
  8336.  
  8337.  
  8338. .grab
  8339. STMFD R13!,{R0-R3,R14}
  8340. ; On entry, (R0,R1) are coord to grab from, (R2,R3) are width,height
  8341. ;R4 is address to write to.
  8342. MOV R10,R4
  8343. MOV R9,R2;for the return of R4
  8344. LDR R11,[R12,#v.screenuse]
  8345. LDR R6,[R12,#v.hbytes]
  8346. MUL R1,R6,R1
  8347. ADD R4,R6,R6,LSL #1
  8348. STR R1,[R10,R4]
  8349. MOV R4,R1
  8350. ADD R1,R1,R0
  8351. STR R1,[R10]
  8352. STR R2,[R10,R6]
  8353. STR R3,[R10,R6,LSL #1]
  8354. LDR R0,[R12,#v.lineskip]
  8355. CMP R0,#1
  8356. ADDEQ R11,R11,R4
  8357.  
  8358. ADD R10,R10,#4
  8359. ADD R9,R9,R10
  8360. ADD R11,R11,R1
  8361. .loop11
  8362. STMFD R13!,{R2,R10,R11}
  8363. .loop10
  8364. LDR R0,[R11],#4
  8365. STR R0,[R10],#4
  8366. SUBS R2,R2,#4
  8367. BGT loop10
  8368. LDMFD R13!,{R2,R10,R11}
  8369. LDR R0,[R12,#v.lineskip]
  8370. CMP R0,#1
  8371. ADDEQ R11,R11,R6
  8372. ADD R11,R11,R6
  8373. ADD R10,R10,R6
  8374. SUBS R3,R3,#1
  8375. BGT loop11
  8376. MOV R4,R9
  8377. LDMFD R13!,{R0-R3,PC}
  8378.  
  8379. .replace
  8380. STMFD R13!,{R0-R3,R14}
  8381. LDR R7,[R12,#v.lineskip]
  8382. CMP R7,#1
  8383. BEQ replace49
  8384. MOV R11,R0
  8385. LDR R10,[R12,#v.screenuse]
  8386. LDR R6,[R12,#v.hbytes]
  8387. LDR R1,[R11]
  8388. ADD R10,R10,R1
  8389. LDR R2,[R11,R6]
  8390. LDR R3,[R11,R6,LSL #1]
  8391. ADD R11,R11,#4
  8392. .loop13
  8393. STMFD R13!,{R2,R10-R11}
  8394. .loop12
  8395. LDR R0,[R11],#4
  8396. STR R0,[R10],#4
  8397. SUBS R2,R2,#4
  8398. BGT loop12
  8399. LDMFD R13!,{R2,R10-R11}
  8400. ADD R10,R10,R6
  8401. ADD R11,R11,R6
  8402. SUBS R3,R3,#1
  8403. BGT loop13
  8404. LDMFD R13!,{R0-R3,PC}
  8405.  
  8406. .replace49
  8407. MOV R11,R0
  8408. LDR R10,[R12,#v.screenuse]
  8409. LDR R6,[R12,#v.hbytes]
  8410. ADD R1,R6,R6,LSL #1
  8411. LDR R1,[R11,R1]
  8412. LDR R0,[R11]
  8413. ADD R1,R0,R1
  8414. ADD R10,R10,R1
  8415. LDR R2,[R11,R6]
  8416. LDR R3,[R11,R6,LSL #1]
  8417. ADD R11,R11,#4
  8418. .loop4913
  8419. STMFD R13!,{R2,R10-R11}
  8420. .loop4912
  8421. LDR R0,[R11],#4
  8422. STR R0,[R10,#320]
  8423. STR R0,[R10],#4
  8424. SUBS R2,R2,#4
  8425. BGT loop4912
  8426. LDMFD R13!,{R2,R10-R11}
  8427. ADD R10,R10,R6,LSL #1
  8428. ADD R11,R11,R6
  8429. SUBS R3,R3,#1
  8430. BGT loop4913
  8431. LDMFD R13!,{R0-R3,PC}
  8432.  
  8433. .sload1
  8434. MOV R0,#14
  8435. ADR R1,sidepicname
  8436. LDR R2,[R12,#v.canvasadr]
  8437. MOV R3,#0
  8438. ADR R4,pathname
  8439. SWI OS_File
  8440. B sload1ins
  8441.  
  8442. .sload2
  8443. MOV R0,#14
  8444. ADR R1,topdataname
  8445. LDR R2,[R12,#v.screenadr]
  8446. MOV R3,#0
  8447. ADR R4,pathname
  8448. SWI OS_File
  8449. B sload2ins
  8450.  
  8451. .loadsidepic
  8452. STMFD R13!,{R14}
  8453. MOV R0,#0
  8454. ADR R1,sidepicname
  8455. ADR R2,pathname
  8456. SWI Blitz_HammerOp
  8457. CMP R3,#0
  8458. BEQ sload1
  8459. MOV R0,#1
  8460. LDR R3,[R12,#v.canvasadr]
  8461. SWI Blitz_HammerOp
  8462. .sload1ins
  8463. LDR R0,[R12,#v.lineskip]
  8464. CMP R0,#0
  8465. LDMNEFD R13!,{PC}
  8466. MOV R0,#0
  8467. ADR R1,topdataname
  8468. ADR R2,pathname
  8469. SWI Blitz_HammerOp
  8470. CMP R3,#0
  8471. BEQ sload2
  8472. MOV R0,#1
  8473. LDR R3,[R12,#v.screenadr]
  8474. SWI Blitz_HammerOp
  8475. .sload2ins
  8476. LDR R0,[R12,#v.screenadr]
  8477. ADD R1,R0,#320*248
  8478. ADD R0,R0,#320*7
  8479. MOV R2,#&A00
  8480. .loadpicloop
  8481. #rept 10
  8482. LDMIA R0!,{R3-R10}
  8483. STMIA R1!,{R3-R10}
  8484. #endr
  8485. SUBS R2,R2,#320
  8486. SUB R0,R0,#640
  8487. BGT loadpicloop
  8488. LDMFD R13!,{PC}
  8489. LDMFD R13!,{PC}
  8490.  
  8491. .hackcheck
  8492. STMFD R13!,{R14}
  8493. .hackcheckstart
  8494. MOV R0,#0
  8495. STR R0,[R12,#v.bastmode]
  8496. ADR R0,deskhack
  8497. ADD R1,R12,#v.buffer
  8498. LDMIA R0,{R2-R5}
  8499. MVN R2,R2
  8500. MVN R3,R3
  8501. MVN R4,R4
  8502. MVN R5,R5
  8503. STMIA R1,{R2-R5}
  8504. MOV R0,#18
  8505. SWI XOS_Module
  8506. LDMVSFD R13!,{PC}
  8507. MOV R0,#1
  8508. STR R0,[R12,#v.bastmode]
  8509. MOV R0,#&E3A00001
  8510. STR R0,gamehack
  8511. ADR R1,cheatmesstart
  8512. ADD R2,R1,#cheatmesend-cheatmesstart
  8513. MOV R0,#&0
  8514. BL wipem
  8515. ADR R1,adjuststart
  8516. ADD R2,R1,#adjustend-adjuststart
  8517. MOV R0,#&0
  8518. BL wipem
  8519. ADR R1,hackcheckstart
  8520. ADD R2,R1,#hackcheckend-hackcheckstart
  8521. MOV R0,#&0
  8522. BL wipem
  8523.  
  8524.  
  8525. LDMFD R13!,{PC}
  8526. .deskhack
  8527. DCD &6B736544 EOR &FFFFFFFF
  8528. DCD &48706F74 EOR &FFFFFFFF
  8529. DCD &656B6361 EOR &FFFFFFFF
  8530. DCD &00000072 EOR &FFFFFFFF
  8531. ALIGN
  8532. .hackcheckend
  8533. LDMFD R13!,{PC}
  8534.  
  8535. .cracksound
  8536. STMFD R13!,{R0-R7,R14}
  8537. BL rangetovolume
  8538. LDR R3,[R12,#v.colpitch]
  8539. SUBS R2,R2,R3
  8540. LDMLTFD R13!,{R0-R7,PC}
  8541. CMP R2,#&5F
  8542. MOVGT R2,#&5F
  8543. MOV R0,#2
  8544. MOV R1,#6
  8545. MOV R3,#&3555
  8546. MOV R4,#0
  8547. MOV R5,#0
  8548. MOV R7,#10
  8549. BL bidforsound
  8550. LDMFD R13!,{R0-R7,PC}
  8551.  
  8552. .explosound
  8553. STMFD R13!,{R0-R3,R14}
  8554. BL rangetovolume
  8555. MOV R0,#4
  8556. MOV R1,#7
  8557. MOV R3,#&3555
  8558. MOV R4,#0
  8559. MOV R5,#0
  8560. MOV R7,#10
  8561. BL bidforsound
  8562. LDMFD R13!,{R0-R3,PC}
  8563.  
  8564. .bastardsound
  8565. STMFD R13!,{R0-R7,R14}
  8566. MOV R0,#4
  8567. MOV R1,#11
  8568. MOV R2,#&7F
  8569. MOV R3,#&2555
  8570. MOV R4,#&00000400
  8571. MOV R5,#&65550300
  8572. MOV R6,#127
  8573. MOV R7,#100
  8574. BL bidforsound
  8575. MOV R0,#3
  8576. MOV R1,#11
  8577. MOV R2,#&7F
  8578. MOV R3,#&2400
  8579. MOV R4,#&00000400
  8580. MOV R5,#&65550300
  8581. MOV R6,#-127
  8582. MOV R7,#100
  8583. BL bidforsound
  8584.  
  8585. LDMFD R13!,{R0-R7,PC}
  8586.  
  8587.  
  8588. .weirdsound
  8589. STMFD R13!,{R0-R7,R14}
  8590. BL rangetovolume
  8591. MOV R0,#2
  8592. MOV R1,#10
  8593. MOV R3,#&4555
  8594. MOV R4,#0
  8595. MOV R5,#0
  8596. MOV R7,#5
  8597. BL bidforsound
  8598. LDMFD R13!,{R0-R7,PC}
  8599.  
  8600. .secretsound
  8601. STMFD R13!,{R0-R7,R14}
  8602. BL objectrange
  8603. BL rangetovolume
  8604. MOV R0,#3
  8605. MOV R1,#3
  8606. MOV R3,#&3555
  8607. MOV R4,#0
  8608. MOV R5,#0
  8609. MOV R7,#5
  8610. BL bidforsound
  8611. LDMFD R13!,{R0-R7,PC}
  8612.  
  8613. .telepsound
  8614. STMFD R13!,{R0-R7,R14}
  8615. BL objectrange
  8616. BL rangetovolume
  8617. MOV R0,#3
  8618. MOV R1,#12
  8619. MOV R3,#&6555
  8620. MOV R4,#&00000180
  8621. MOV R5,#&15550100
  8622. MOV R7,#&20
  8623. BL bidforsound
  8624. LDMFD R13!,{R0-R7,PC}
  8625.  
  8626. .telepsound2
  8627. STMFD R13!,{R0-R7,R14}
  8628. BL objectrange
  8629. BL rangetovolume
  8630. MOV R0,#4
  8631. MOV R1,#12
  8632. MOV R3,#&1555
  8633. MOV R4,#&00000180
  8634. MOV R5,#&65550100
  8635. MOV R7,#&20
  8636. BL bidforsound
  8637. LDMFD R13!,{R0-R7,PC}
  8638.  
  8639. .goodysound
  8640. STMFD R13!,{R0-R7,R14}
  8641. BL rangetovolume
  8642. MOV R0,#4
  8643. MOV R1,#9
  8644. MOV R3,#&3555
  8645. MOV R4,#0
  8646. MOV R5,#0
  8647. MOV R7,#10
  8648. BL bidforsound
  8649. LDMFD R13!,{R0-R7,PC}
  8650.  
  8651. .blamsound
  8652. STMFD R13!,{R0-R7,R14}
  8653. BL rangetovolume
  8654. SUBS R2,R2,#&10
  8655. MOVMI R2,#0
  8656. MOV R0,#3
  8657. MOV R1,#2
  8658. MOV R3,#&3555
  8659. MOV R4,#0
  8660. MOV R5,#0
  8661. MOV R7,#3
  8662. BL bidforsound
  8663. LDMFD R13!,{R0-R7,PC}
  8664.  
  8665. .bonussound
  8666. STMFD R13!,{R0-R7,R14}
  8667. BL rangetovolume
  8668. MOV R0,#2
  8669. MOV R1,#4
  8670. MOV R3,#&3555
  8671. MOV R4,#0
  8672. MOV R5,#0
  8673. MOV R7,#10
  8674. BL bidforsound
  8675. LDMFD R13!,{R0-R7,PC}
  8676.  
  8677. .chinksound
  8678. STMFD R13!,{R0-R7,R14}
  8679. BL rangetovolume
  8680. MOV R0,#2
  8681. MOV R1,#5
  8682. LDR R3,[R12,#v.colpitch]
  8683. ADD R3,R3,#&6555
  8684. MOV R4,#0
  8685. MOV R5,#0
  8686. MOV R7,#10
  8687. BL bidforsound
  8688. LDMFD R13!,{R0-R7,PC}
  8689.  
  8690. .fallsound
  8691. STMFD R13!,{R0-R7,R14}
  8692. BL objectrange
  8693. BL rangetovolume
  8694. MOV R0,#4
  8695. MOV R1,#8
  8696. MOV R3,#&5555
  8697. MOV R4,#&00000180
  8698. MOV R5,#&35550100
  8699. MOV R7,#&20
  8700. BL bidforsound
  8701. LDMFD R13!,{R0-R7,PC}
  8702.  
  8703. .deathsound
  8704. STMFD R13!,{R0-R3,R14}
  8705. MOV R5,#1
  8706. .sinloop
  8707. MOV R0,R5
  8708. MOV R1,#8
  8709. MOV R2,#&7F
  8710. MOV R3,#&5555
  8711. ADD R3,R3,R5,LSL #8
  8712. MOV R4,#0
  8713. SWI Stasis_Sound
  8714. MOV R0,R5
  8715. MOV R1,#1
  8716. MOV R2,#&3555
  8717. MOV R3,#300
  8718. SWI Stasis_Slide
  8719. MOV R0,R5
  8720. MOV R1,#0
  8721. MOV R2,#0
  8722. MOV R3,#400
  8723. SWI Stasis_Slide
  8724. MOV R0,R5
  8725. MOV R1,#-64
  8726. CMP R5,#2
  8727. MOVEQ R1,#-32
  8728. CMP R5,#3
  8729. MOVEQ R1,#32
  8730. CMP R5,#4
  8731. MOVEQ R1,#64
  8732. SWI Sound_Stereo
  8733. ADD R5,R5,#1
  8734. CMP R5,#5
  8735. BLT sinloop
  8736.  
  8737. LDMFD R13!,{R0-R3,PC}
  8738.  
  8739. .objectrange
  8740. STMFD R13!,{R2,R14}
  8741. LDR R0,[R9,#8]
  8742. LDR R2,[R12,#v.plxcent]
  8743. SUB R0,R0,R2
  8744. LDR R1,[R9,#12]
  8745. LDR R2,[R12,#v.plycent]
  8746. SUB R1,R1,R2
  8747. LDMFD R13!,{R2,PC}
  8748.  
  8749. .rangetovolume
  8750. STMFD R13!,{R0-R1,R3,R14}
  8751. CMP R1,#0
  8752. RSBLT R1,R1,#0
  8753. MOV R3,R1
  8754. CMP R3,#128<<12
  8755. MOVLT R3,#128<<12
  8756. MOV R2,R0,ASL #6
  8757. MYDIV R6,R2,R3
  8758. CMP R6,#127
  8759. MOVGT R6,#127
  8760. CMP R6,#-127
  8761. MOVLT R6,#-127
  8762.  
  8763. CMP R0,#0
  8764. RSBLT R0,R0,#0
  8765.  
  8766.  
  8767. ADD R2,R0,R1
  8768. MOV R2,R2,LSR #17
  8769. RSB R2,R2,#&7F
  8770. CMP R2,#0
  8771. MOVLT R2,#0
  8772. CMP R2,#&7F
  8773. MOVGT R2,#&7F
  8774. LDMFD R13!,{R0-R1,R3,PC}
  8775.  
  8776. .bidforsound
  8777. STMFD R13!,{R0-R10,R14}
  8778. ADD R10,R12,#v.soundtab
  8779. SUB R0,R0,#1
  8780. AND R0,R0,#7
  8781. ADD R10,R10,R0,LSL #soundtabshift
  8782. LDR R0,[R10,#snd.ctr]
  8783. CMP R0,#0
  8784. BEQ soundclaim
  8785. LDR R0,[R10,#snd.vol]
  8786. CMP R0,R2
  8787. BLE soundclaim
  8788. LDMFD R13!,{R0-R10,PC}
  8789. .soundclaim
  8790. STR R1,[R10,#snd.sample]
  8791. STR R2,[R10,#snd.vol]
  8792. STR R3,[R10,#snd.pitch]
  8793. STR R4,[R10,#snd.volslide]
  8794. STR R5,[R10,#snd.pitchslide]
  8795. CMP R6,#127
  8796. MOVGT R6,#127
  8797. CMP R6,#-127
  8798. MOVLT R6,#-127
  8799. STR R6,[R10,#snd.stereo]
  8800. ORR R7,R7,#1<<31
  8801. STR R7,[R10,#snd.ctr]
  8802. LDMFD R13!,{R0-R10,PC}
  8803.  
  8804. .makesounds
  8805. STMFD R13!,{R14}
  8806. ADD R11,R12,#v.soundtab
  8807. ADD R11,R11,#snd.sizeof
  8808. MOV R6,#7
  8809. .makesoundloop
  8810. LDR R8,[R11,#snd.vol]
  8811. CMP R8,#0
  8812. BEQ soundskip
  8813. LDR R0,[R11,#snd.ctr]
  8814. TST R0,#1<<31
  8815. BEQ soundmade
  8816. BIC R0,R0,#1<<31
  8817. STR R0,[R11,#snd.ctr]
  8818. RSB R0,R6,#9
  8819. LDR R1,[R11,#snd.sample]
  8820. LDR R2,[R11,#snd.vol]
  8821. LDR R3,[R11,#snd.pitch]
  8822. MOV R4,#0
  8823. SWI Stasis_Sound
  8824. RSB R0,R6,#9
  8825. LDR R1,[R11,#snd.stereo]
  8826. SWI Sound_Stereo
  8827. LDR R0,[R11,#snd.volslide]
  8828. CMP R0,#0
  8829. BLNE setvolslide
  8830. LDR R0,[R11,#snd.pitchslide]
  8831. CMP R0,#0
  8832. BLNE setpitchslide
  8833. .soundmade
  8834. LDR R0,[R11,#snd.ctr]
  8835. LDR R1,[R12,#v.frameinc]
  8836. SUBS R0,R0,R1
  8837. MOVMI R0,#0
  8838. STR R0,[R11,#snd.ctr]
  8839. .soundskip
  8840. ADD R11,R11,#snd.sizeof
  8841. SUBS R6,R6,#1
  8842. BGT makesoundloop
  8843. LDMFD R13!,{PC}
  8844.  
  8845. .setvolslide
  8846. STMFD R13!,{R14}
  8847. RSB R0,R6,#9
  8848. MOV R1,#0
  8849. LDR R3,[R11,#snd.volslide]
  8850. MOV R2,R3,LSR #16
  8851. AND R3,R3,#&FFFF
  8852. SWI Stasis_Slide
  8853. LDMFD R13!,{PC}
  8854.  
  8855. .setpitchslide
  8856. STMFD R13!,{R14}
  8857. RSB R0,R6,#9
  8858. MOV R1,#1
  8859. LDR R3,[R11,#snd.pitchslide]
  8860. MOV R2,R3,LSR #16
  8861. AND R3,R3,#&FFFF
  8862. SWI Stasis_Slide
  8863. LDMFD R13!,{PC}
  8864.  
  8865. .wipesoundtab
  8866. STMFD R13!,{R14}
  8867. ADD R10,R12,#v.soundtab
  8868. MOV R3,#8
  8869. MOV R0,#0
  8870. .wipesoundtabloop
  8871. STR R0,[R10,#snd.vol]
  8872. STR R0,[R10,#snd.ctr]
  8873. ADD R10,R10,#snd.sizeof
  8874. SUBS R3,R3,#1
  8875. BGT wipesoundtabloop
  8876. LDMFD R13!,{PC}
  8877.  
  8878. .batsound
  8879. STMFD R13!,{R14}
  8880. LDR R0,[R12,#v.magnet]
  8881. CMP R0,#0
  8882. BGT batsoundend
  8883. .batsilence
  8884. MOV R0,#0
  8885. SWI Stasis_GetControlAddress
  8886. LDR R1,[R0,#28]
  8887. ORR R1,R1,#1
  8888. STR R1,[R0,#28]
  8889. .batsoundend
  8890. LDMFD R13!,{PC}
  8891.  
  8892. .magnetsound
  8893. STMFD R13!,{R14}
  8894. MOV R0,#0
  8895. SWI Stasis_GetControlAddress
  8896. LDR R0,[R0,#28]
  8897. TST R0,#1
  8898. BEQ notrigmag
  8899. LDR R2,[R12,#v.plxcent]
  8900. LDR R0,[R12,#v.xpos]
  8901. SUB R0,R0,R2
  8902. LDR R2,[R12,#v.plycent]
  8903. LDR R1,[R12,#v.ypos]
  8904. SUB R1,R1,R2
  8905. BL rangetovolume
  8906. MOV R5,R2
  8907. SUBS R2,R2,#&18
  8908. MOVLE R2,#1
  8909. MOV R0,#1
  8910. MOV R1,#11
  8911. MOV R3,#&3555
  8912. MOV R4,#0
  8913. SWI Stasis_Sound
  8914. MOV R0,#1
  8915. MOV R1,#0
  8916. MOV R2,R5
  8917. MOV R3,#300
  8918. SWI Stasis_Slide
  8919.  
  8920.  
  8921. .notrigmag
  8922. MOV R0,#1
  8923. MOV R1,#0
  8924. MOV R2,#0
  8925. LDR R3,[R12,#v.magpitch]
  8926. MOV R4,#%1011
  8927. SWI Stasis_Sound
  8928.  
  8929. LDMFD R13!,{PC}
  8930.  
  8931. .resetplotwindow
  8932. STMFD R13!,{R14}
  8933. MOV R0,#1
  8934. MOV R1,#((canvaswidth-windwidth)/2+4)<<12
  8935. MOV R2,#0
  8936. MOV R3,#(243+(canvaswidth-windwidth)/2)<<12
  8937. MOV R4,#240<<12
  8938. SWI Amnesia_SetWindow   ;setup the plot window
  8939. LDMFD R13!,{PC}
  8940.  
  8941. .stretchplotwindow
  8942. STMFD R13!,{R14}
  8943. MOV R0,#1
  8944. MOV R1,#((canvaswidth-windwidth)/2-4)<<12
  8945. MOV R2,#-8<<12
  8946. MOV R3,#(251+(canvaswidth-windwidth)/2)<<12
  8947. MOV R4,#248<<12
  8948. SWI Amnesia_SetWindow   ;setup the plot window
  8949. LDMFD R13!,{PC}
  8950.  
  8951. .setup
  8952. STMFD R13!,{R14}
  8953. ADD R0,R12,#v.helladr
  8954. MOV R1,#128*96
  8955. ADR R2,hellname
  8956. MOV R3,#0
  8957. SWI XAmnesia_ClaimBlock
  8958. BVS setupfailed
  8959. ADD R0,R12,#v.scanadr
  8960. MOV R1,#2*64*64
  8961. ADR R2,scanname
  8962. MOV R3,#0
  8963. SWI XAmnesia_ClaimBlock
  8964. BVS setupfailed
  8965. ADD R0,R12,#v.storesadr
  8966. MOV R1,#5120
  8967. ADR R2,storesname
  8968. MOV R3,#0
  8969. SWI XAmnesia_ClaimBlock
  8970. BVS setupfailed
  8971. ADD R0,R12,#v.paperadr
  8972. MOV R1,#5120
  8973. ADR R2,papername
  8974. MOV R3,#0
  8975. SWI XAmnesia_ClaimBlock
  8976. BVS setupfailed
  8977. ADD R0,R12,#v.canvasadr
  8978. MOV R1,#canvaswidth*canvasheight
  8979. ADR R2,canvasname
  8980. MOV R3,#0
  8981. SWI XAmnesia_ClaimBlock
  8982. BVS setupfailed
  8983. MOV R0,#batstab
  8984. MOV R1,#1
  8985. ADR R2,battablename
  8986. MOV R3,#8
  8987. MOV R4,#40
  8988. SWI XAmnesia_ClaimTable
  8989. BVS setupfailed
  8990. MOV R0,#blockstab
  8991. MOV R1,#1
  8992. ADR R2,blockstablename
  8993. MOV R3,#256
  8994. MOV R4,#40
  8995. SWI XAmnesia_ClaimTable
  8996. BVS setupfailed
  8997. MOV R0,#ballstab
  8998. MOV R1,#1
  8999. ADR R2,ballstablename
  9000. MOV R3,#48
  9001. MOV R4,#44
  9002. SWI XAmnesia_ClaimTable
  9003. BVS setupfailed
  9004. MOV R0,#bulletstab
  9005. MOV R1,#0
  9006. ADR R2,bulletstablename
  9007. MOV R3,#32
  9008. MOV R4,#32
  9009. SWI XAmnesia_ClaimTable
  9010. BVS setupfailed
  9011. MOV R0,#starstab
  9012. MOV R1,#1
  9013. ADR R2,starstablename
  9014. MOV R3,#8
  9015. MOV R4,#36
  9016. SWI XAmnesia_ClaimTable
  9017. BVS setupfailed
  9018. MOV R0,#edgetab
  9019. MOV R1,#0
  9020. ADR R2,edgetablename
  9021. MOV R3,#128
  9022. MOV R4,#36
  9023. SWI XAmnesia_ClaimTable
  9024. BVS setupfailed
  9025. MOV R0,#decortab
  9026. MOV R1,#0
  9027. ADR R2,decortablename
  9028. MOV R3,#128
  9029. MOV R4,#40
  9030. SWI XAmnesia_ClaimTable
  9031. BVS setupfailed
  9032. BL textsetup
  9033. BVS setupfailed
  9034. MOV R0,#0
  9035. MOV R1,#-1024<<12
  9036. MOV R2,#-1024<<12
  9037. MOV R3,#1024<<12
  9038. MOV R4,#1024<<12
  9039. SWI Amnesia_SetWindow   ;setup the game window
  9040.  
  9041. BL resetplotwindow
  9042. MOV R0,#0
  9043. STR R0,[R12,#v.exit]
  9044. STR R0,[R12,#v.framectr]
  9045. STR R0,[R12,#v.bateffect]
  9046. STR R0,[R12,#v.saveslot]
  9047. STR R0,[R12,#v.loadslot]
  9048. STR R0,[R12,#v.newlevelctr]
  9049. MOV R0,#-1
  9050. STR R0,[R12,#v.loadeddrop]
  9051. ADD R1,R12,#v.warptimer
  9052. MOV R2,#0
  9053. MOV R3,#7
  9054. .loop85
  9055. MOV R0,R2,ASR #8
  9056. STR R0,[R1],#4
  9057. ADD R2,R2,#3*&80000/7
  9058. SUBS R3,R3,#1
  9059. BGT loop85
  9060.  
  9061. MOV R0,#1
  9062. STR R0,[R12,#v.music]
  9063. STR R0,[R12,#v.quality]
  9064. STR R0,[R12,#v.mousestep]
  9065. MOV R0,#1
  9066. STR R0,[R12,#v.lineskip]
  9067. MOV R0,#0
  9068. SWI Sound_Volume
  9069. MOV R1,#0
  9070. CMP R0,#64
  9071. MOVGT R1,#1
  9072. CMP R0,#96
  9073. MOVGT R1,#2
  9074. CMP R0,#112
  9075. MOVGT R1,#3
  9076. MOV R0,#0
  9077. SWI Sound_Enable
  9078. CMP R0,#1
  9079. MOVEQ R1,#0
  9080. STR R1,[R12,#v.soundvol]
  9081. LDMFD R13!,{PC}
  9082. .setupfailed
  9083. ADR R0,setupfailedtext
  9084. SWI OS_GenerateError
  9085.  
  9086. .setupsounds
  9087. STMFD R13!,{R14}
  9088. MOV R0,#4
  9089. MOV R1,#0
  9090. MOV R2,#48
  9091. MOV R3,#0
  9092. MOV R4,#0
  9093. SWI Sound_Configure
  9094. MOV R0,#8
  9095. MOV R1,#0
  9096. MOV R2,#0
  9097. MOV R3,#0
  9098. MOV R4,#0
  9099. SWI Sound_Configure
  9100. ADR R0,soundcom1
  9101. SWI XOS_CLI
  9102. LDMFD R13!,{PC}
  9103. .soundcom1
  9104. DCB "PlayVoices 8",0
  9105. ALIGN
  9106.  
  9107. .setupcanvas
  9108. STMFD R13!,{R14}
  9109. LDR R0,[R12,#v.canvasadr]
  9110. SWI FastSpr_ScreenBank
  9111. MOV R0,#0
  9112. MOV R1,#0
  9113. MOV R2,#320
  9114. MOV R3,#240
  9115. SWI FastSpr_SetClipWindow
  9116. LDMFD R13!,{PC}
  9117.  
  9118. .setuppaper
  9119. STMFD R13!,{R14}
  9120. LDR R1,[R12,#v.paperadr]
  9121. ADD R0,R0,R1
  9122. STMFD R13!,{R0}
  9123. ADD R0,R0,#4
  9124. SWI FastSpr_ScreenBank
  9125. LDMFD R13!,{R4}
  9126. LDR R0,[R12,#v.hbytes]
  9127. LDR R2,[R4,R0]
  9128. LDR R3,[R4,R0,LSL #1]
  9129. MOV R0,#0
  9130. MOV R1,#0
  9131.  
  9132. SWI FastSpr_SetClipWindow
  9133. LDMFD R13!,{PC}
  9134.  
  9135. .setupvars
  9136. STMFD R13!,{R14}
  9137. MOV R0,#0
  9138. MOV R1,#v.sizeof
  9139. ADR R2,varsname
  9140. MOV R3,#1; static
  9141. SWI XAmnesia_ClaimBlock
  9142. BVS nomemory
  9143. MOV R12,R0
  9144. MOV R0,#1
  9145. STR R0,[R12,#v.bank]
  9146. MOV R0,#7
  9147. STR R0,[R12,#v.mousesens]
  9148. MOV R0,#0
  9149. STR R0,[R12,#v.backdrop]
  9150. STR R0,[R12,#v.levelnet]
  9151. SWI OS_ReadMonotonicTime
  9152. STR R0,[R12,#v.rnseed]
  9153. LDMFD R13!,{PC}
  9154.  
  9155. .bindmouse
  9156. STMFD R13!,{R14}
  9157. MOV R0,#21
  9158. ADR R1,bindblock
  9159. SWI OS_Word
  9160. LDMFD R13!,{PC}
  9161. .bindblock
  9162. DCB 1,0,0,0,0,0,5,0,4
  9163. ALIGN
  9164.  
  9165. .homebat
  9166. STMFD R13!,{R14}
  9167. LDR R0,[R12,#v.ballxhome]
  9168. STR R0,[R12,#v.xpos]
  9169. STR R0,[R12,#v.plxcent]
  9170. LDR R1,[R12,#v.ballyhome]
  9171. ADD R1,R1,#128<<12
  9172. STR R1,[R12,#v.ypos]
  9173. STR R1,[R12,#v.plycent]
  9174. MOV R0,#0
  9175. STR R0,[R12,#v.xvec]
  9176. STR R0,[R12,#v.yvec]
  9177. STR R0,[R12,#v.ballxpos]
  9178. STR R0,[R12,#v.ballypos]
  9179. BL justmovedbat
  9180. MOV R0,#21
  9181. ADR R1,mouseblock
  9182. SWI OS_Word
  9183. LDMFD R13!,{PC}
  9184. .mouseblock
  9185. DCB 3
  9186. DCB 128
  9187. DCB 2
  9188. DCB 0
  9189. DCB 2
  9190. ALIGN
  9191. .levelcheat
  9192. DCB "OddBallCheat",0
  9193. ALIGN
  9194.  
  9195. .setupplayer
  9196. STMFD R13!,{R14}
  9197. MOV R0,#ballstab
  9198. SWI Amnesia_WipeTable
  9199. MOV R3,#0
  9200. MOV R4,#0
  9201. BL makeball
  9202. BL homebat
  9203. LDR R3,[R12,#v.diff]
  9204. MOV R0,#16<<12
  9205. CMP R3,#1
  9206. MOVEQ R0,#4<<12
  9207. CMP R3,#2
  9208. MOVEQ R0,#8<<12
  9209. STR R0,[R12,#v.ballspeedlim]
  9210. STR R0,[R12,#v.ballspeed]
  9211. MOV R0,#0
  9212. CMP R3,#3
  9213. MOVEQ R0,#1<<5
  9214. CMP R3,#2
  9215. MOVEQ R0,#1<<2
  9216. STR R0,[R12,#v.ballmin]
  9217. MOV R0,#0
  9218. STR R0,[R12,#v.dead]
  9219. STR R0,[R12,#v.plscore]
  9220. STR R0,[R12,#v.helltimer]
  9221. MOV R0,#2
  9222. STR R0,[R12,#v.pllives]
  9223. MOV R0,#1
  9224. STR R0,[R12,#v.scorechange]
  9225. STR R0,[R12,#v.liveschange]
  9226. STR R0,[R12,#v.ballschange]
  9227. STR R0,[R12,#v.goodychange]
  9228. MOV R0,#-1
  9229. STR R0,[R12,#v.lastballs]
  9230. STR R0,[R12,#v.lastlives]
  9231. STR R0,[R12,#v.lastscore]
  9232. ADR R0,levelcheat
  9233. ADD R1,R12,#v.levelno
  9234. MOV R2,#4
  9235. MOV R3,#0
  9236. MOV R4,#1
  9237. SWI XOS_ReadVarVal
  9238.  
  9239. MOVVS R0,#1
  9240. STRVS R0,[R12,#v.levelno]
  9241. CMP R4,#1
  9242. MOVNE R0,#0
  9243. STRNE R0,[R12,#v.levelno]
  9244. LDR R0,[R12,#v.levelno]
  9245. CMP R0,#0
  9246. MOVEQ R0,#1
  9247. STREQ R0,[R12,#v.levelno]
  9248. MOV R0,#7
  9249. STR R0,[R12,#v.mousespeed]
  9250. MOV R0,#0
  9251. STR R0,[R12,#v.magnet]
  9252. STR R0,[R12,#v.blueball]
  9253. STR R0,[R12,#v.ballstops]
  9254. STR R0,[R12,#v.goodycsr]
  9255. LDR R0,[R12,#v.diff]
  9256. RSB R0,R0,#3
  9257. STR R0,[R12,#v.scanspeed]
  9258. LDR R0,[R12,#v.diff]
  9259. CMP R0,#3
  9260. MOV R0,#1
  9261. MOVGE R0,#0
  9262. STR R0,[R12,#v.lineradar]
  9263. LDR R0,[R12,#v.diff]
  9264. CMP R0,#2
  9265. MOV R0,#0
  9266. MOVLE R0,#11
  9267. STR R0,[R12,#v.good0]
  9268. LDR R0,[R12,#v.diff]
  9269. CMP R0,#1
  9270. MOV R0,#0
  9271. MOVLE R0,#5
  9272. STR R0,[R12,#v.good1]
  9273. MOV R0,#0
  9274. STR R0,[R12,#v.good2]
  9275. STR R0,[R12,#v.good3]
  9276. MOV R0,#&3555
  9277. STR R0,[R12,#v.magpitch]
  9278. LDMFD R13!,{PC}
  9279.  
  9280. .paperwipe
  9281. STMFD R13!,{R14}
  9282. LDR R10,[R12,#v.paperadr]
  9283. LDR R11,[R12,#v.storesadr]
  9284. ADD R11,R11,R0
  9285. ADD R10,R10,R0
  9286. LDR R14,[R12,#v.hbytes]
  9287. LDR R0,[R11,R14]
  9288. LDR R1,[R11,R14,LSL #1]
  9289. ADD R11,R11,#4
  9290. ADD R10,R10,#4
  9291. CMP R0,#80
  9292. BEQ wipe80
  9293. CMP R0,#64
  9294. BNE badwipe
  9295. .loop14
  9296. STMFD R13!,{R1,R10,R11}
  9297. LDMIA R11!,{R0-R7}
  9298. STMIA R10!,{R0-R7}
  9299. LDMIA R11!,{R0-R7}
  9300. STMIA R10!,{R0-R7}
  9301. LDMFD R13!,{R1,R10,R11}
  9302. ADD R10,R10,R14
  9303. ADD R11,R11,R14
  9304. SUBS R1,R1,#1
  9305. BGT loop14
  9306. LDMFD R13!,{PC}
  9307. .wipe80
  9308. .loop15
  9309. STMFD R13!,{R1,R10,R11}
  9310. LDMIA R11!,{R0-R9}
  9311. STMIA R10!,{R0-R9}
  9312. LDMIA R11!,{R0-R9}
  9313. STMIA R10!,{R0-R9}
  9314. LDMFD R13!,{R1,R10,R11}
  9315. ADD R10,R10,R14
  9316. ADD R11,R11,R14
  9317. SUBS R1,R1,#1
  9318. BGT loop15
  9319. LDMFD R13!,{PC}
  9320.  
  9321. .badwipe
  9322. SWI OS_WriteS
  9323. DCB "Non standard paperwipe",10,13,0
  9324. ALIGN
  9325. LDMFD R13!,{PC}
  9326.  
  9327. .setupscreen
  9328. STMFD R13!,{R14}
  9329. MOV R0,#0
  9330. SWI FastSpr_ScreenBank
  9331. MOV R0,#0
  9332. MOV R1,#0
  9333. MOV R2,#320
  9334. MOV R3,#256
  9335. SWI FastSpr_SetClipWindow
  9336. LDMFD R13!,{PC}
  9337.  
  9338. .vduread
  9339. STMFD R13!,{R14}
  9340. MOV R0,#113
  9341. MOV R1,#1
  9342. SWI OS_Byte
  9343. ADR R0,vdublock
  9344. ADD R1,R12,#v.screenadr
  9345. SWI OS_ReadVduVariables
  9346. LDR R0,[R12,#v.screenadr]
  9347. STR R0,[R12,#v.screenuse]
  9348. BL bindmouse
  9349. LDMFD R13!,{PC}
  9350. .vdublock
  9351. DCD 149;disp.hardware scr start
  9352. DCD 150;mode size
  9353. DCD 6
  9354. DCD -1
  9355.  
  9356.  
  9357. .backtranslate
  9358. STMFD R13!,{R4-R6,R14}
  9359. LDR R6,[R12,#v.levelnet]
  9360. LDR R4,[R6,#net.xsize]
  9361. LDR R5,[R6,#net.ysize]
  9362. SUB R0,R0,R6
  9363. SUB R0,R0,#net.data
  9364. MYDIV R1,R0,R4
  9365. CMP R0,R4
  9366. BGE backoffnet
  9367. CMP R1,R5
  9368. BGE backoffnet
  9369. SUB R0,R0,R4,ASR #1
  9370. SUB R1,R1,R5,ASR #1
  9371. MOV R0,R0,ASL #12
  9372. MOV R1,R1,ASL #12
  9373. MOV R4,#96
  9374. MUL R0,R4,R0
  9375. MUL R1,R4,R1
  9376. LDMFD R13!,{R4-R6,PC}
  9377. .backoffnet
  9378. MOV PC,#0; for the moment.
  9379.  
  9380.  
  9381. .translate
  9382. DIV96 R0,R2
  9383. DIV96 R1,R3
  9384. .transconv
  9385. STMFD R13!,{R2-R3,R5-R6}
  9386. LDR R6,[R12,#v.levelnet]
  9387. LDR R4,[R6,#net.xsize]
  9388. LDR R5,[R6,#net.ysize]
  9389. ADDS R2,R2,R4,ASR #1
  9390. BMI transout
  9391. CMP R2,R4
  9392. BGE transout
  9393. ADDS R3,R3,R5,ASR #1
  9394. BMI transout
  9395. CMP R3,R5
  9396. BGE transout
  9397. MUL R4,R3,R4; y coord
  9398. ADD R4,R4,R2
  9399. ADD R4,R4,R6
  9400. ADD R4,R4,#net.data
  9401. LDMFD R13!,{R2-R3,R5-R6}
  9402. BIC R14,R14,#1<<28
  9403. MOVS PC,R14
  9404. .transout
  9405. ADD R4,R6,#net.data
  9406. LDMFD R13!,{R2-R3,R5-R6}
  9407. MOV R2,#0
  9408. MOV R3,#0
  9409. ORR R14,R14,#1<<28
  9410. MOVS PC,R14
  9411.  
  9412.  
  9413. macro DIV96 m0,m1
  9414. {
  9415. MOV m0,m0,ASR #12
  9416. BIC R13,R13,#1
  9417. CMP m0,#0
  9418. RSBLT m0,m0,#0
  9419. ORRLT R13,R13,#1
  9420. ADD m0,m0,#48
  9421. MOV m1,#0
  9422. CMP m0,#3<<12
  9423. SUBGE m0,m0,#3<<12
  9424. ORRGE m1,m1,#1<<7
  9425. CMP m0,#3<<11
  9426. SUBGE m0,m0,#3<<11
  9427. ORRGE m1,m1,#1<<6
  9428. CMP m0,#3<<10
  9429. SUBGE m0,m0,#3<<10
  9430. ORRGE m1,m1,#1<<5
  9431. CMP m0,#3<<9
  9432. SUBGE m0,m0,#3<<9
  9433. ORRGE m1,m1,#1<<4
  9434. CMP m0,#3<<8
  9435. SUBGE m0,m0,#3<<8
  9436. ORRGE m1,m1,#1<<3
  9437. CMP m0,#3<<7
  9438. SUBGE m0,m0,#3<<7
  9439. ORRGE m1,m1,#1<<2
  9440. CMP m0,#3<<6
  9441. SUBGE m0,m0,#3<<6
  9442. ORRGE m1,m1,#1<<1
  9443. CMP m0,#3<<5
  9444. SUBGE m0,m0,#3<<5
  9445. ORRGE m1,m1,#1
  9446. TST R13,#1
  9447. RSBNE m1,m1,#0
  9448. RSBNE m0,m0,#95
  9449. BIC R13,R13,#3
  9450. }
  9451.  
  9452.  
  9453.  
  9454. .pathname
  9455. DCB "OddBall$Path",0
  9456. .levelpathname
  9457. DCB "OddBall$LevelPath",0
  9458. .savenamesfullname
  9459. DCB "<OddBall$FilePath>^.SaveNames",0
  9460. .savenamesname
  9461. DCB "SaveNames",0
  9462. .hinamesfullname
  9463. DCB "<OddBall$FilePath>^.HiScores",0
  9464. .hinamesname
  9465. DCB "HiScores",0
  9466. .hellname
  9467. DCB "Hell",0
  9468. .scanname
  9469. DCB "Scanner",0
  9470. .canvasname
  9471. DCB "Canvas",0
  9472. .storesname
  9473. DCB "Stores",0
  9474. .papername
  9475. DCB "Paper",0
  9476. .battablename
  9477. DCB "Bat",0
  9478. .ballstablename
  9479. DCB "Balls",0
  9480. .bulletstablename
  9481. DCB "Bullets",0
  9482. .blockstablename
  9483. DCB "Blocks",0
  9484. .starstablename
  9485. DCB "Stars",0
  9486. .decortablename
  9487. DCB "Decor",0
  9488. .edgetablename
  9489. DCB "Edges",0
  9490.  
  9491. .batname
  9492. DCB "Graphics.FSPbat",0
  9493. .ballsname
  9494. DCB "Graphics.FSPBalls",0
  9495. .blocksname
  9496. DCB "Graphics.FSPBlock<Oddball$BackNo>",0
  9497. .charsname
  9498. DCB "Graphics.FSPChars",0
  9499. .backdropname
  9500. DCB "Graphics.BackDrop<Oddball$BackNo>",0
  9501. .levelnetname
  9502. DCB "Levels<OddBall$Maze>",0
  9503. .starsname
  9504. DCB "Graphics.FSPStars",0
  9505. .decorname
  9506. DCB "Graphics.FSPDecor",0
  9507. .exploname
  9508. DCB "Graphics.FSPExplo",0
  9509. .edgename
  9510. DCB "Graphics.FSPEdge<OddBall$BackNo>",0
  9511. .goodiesname
  9512. DCB "Graphics.FSPGoodies",0
  9513. .arrowname
  9514. DCB "Graphics.FSPArrow",0
  9515. .sidepicname
  9516. DCB "Graphics.SideSpr",0
  9517. .topdataname
  9518. DCB "Graphics.TopData",0
  9519. ALIGN
  9520.  
  9521. .levelcount
  9522. STMFD R13!,{R14}
  9523. LDR R11,[R12,#v.levelnet]
  9524. LDR R0,[R11,#net.xsize]
  9525. LDR R1,[R11,#net.ysize]
  9526. MUL R9,R0,R1
  9527. CMP R9,#&100000
  9528. MOVGT R9,#0
  9529. ADD R10,R11,#net.data
  9530. MOV R8,#0
  9531. .levelcountloop
  9532. LDRB R0,[R10],#1
  9533. CMP R0,#&AB
  9534. MOVEQ R1,#1
  9535. STREQ R1,[R12,#v.scanlock]
  9536. CMP R0,#hit1
  9537. CMPNE R0,#hit2
  9538. ADDEQ R8,R8,#1
  9539.  
  9540. SUBS R9,R9,#1
  9541. BGT levelcountloop
  9542. STR R8,[R12,#v.blocknum]
  9543. STR R8,[R12,#v.blocksleft]
  9544. LDMFD R13!,{PC}
  9545.  
  9546. .startfind
  9547. STMFD R13!,{R14}
  9548. MOV R0,#0
  9549. STR R0,[R12,#v.ballxhome]
  9550. STR R0,[R12,#v.ballyhome]
  9551. LDR R11,[R12,#v.levelnet]
  9552. LDR R0,[R11,#net.xsize]
  9553. LDR R1,[R11,#net.ysize]
  9554. MUL R9,R0,R1
  9555. CMP R9,#&100000
  9556. MOVGT R9,#0
  9557. ADD R10,R11,#net.data
  9558. MOV R8,#0
  9559. .startfindloop
  9560. LDRB R0,[R10],#1
  9561. CMP R0,#&FF
  9562. BLEQ setballhome
  9563. SUBS R9,R9,#1
  9564. BGT startfindloop
  9565. LDMFD R13!,{PC}
  9566.  
  9567. .setballhome
  9568. STMFD R13!,{R14}
  9569. SUB R0,R10,#1
  9570. MOV R1,#0
  9571. STRB R1,[R0]
  9572. BL backtranslate
  9573. STR R0,[R12,#v.ballxhome]
  9574. STR R1,[R12,#v.ballyhome]
  9575. LDMFD R13!,{PC}
  9576.  
  9577.  
  9578.  
  9579.  
  9580. .levelname
  9581. DCB "OddBall$No",0
  9582. ALIGN
  9583.  
  9584.  
  9585. .vetlevel
  9586. STMFD R13!,{R14}
  9587. BL scanset
  9588. MOV R0,#0
  9589. STR R0,[R12,#v.scanlock]
  9590.  
  9591. LDR R0,[R12,#v.levelnet]
  9592. LDR R1,[R0,#net.xsize]
  9593. MOV R2,#96<<12
  9594. MUL R1,R2,R1
  9595. STR R1,[R12,#v.xlim]
  9596. LDR R1,[R0,#net.ysize]
  9597. MUL R1,R2,R1
  9598. STR R1,[R12,#v.ylim]
  9599. MOV R0,#0
  9600. MOV R1,#0
  9601. BL levelcount
  9602. BL backload
  9603. LDMFD R13!,{PC}
  9604.  
  9605. .loadlevel
  9606. LDR R0,[R12,#v.demomode]
  9607. CMP R0,#1
  9608. BEQ loadgame
  9609. STMFD R13!,{R14}
  9610. LDR R0,[R12,#v.levelno]
  9611. STR R0,[R12,#v.loadedlev]
  9612. MOV R0,#blockstab
  9613. SWI Amnesia_WipeTable
  9614.  
  9615. ADD R0,R12,#v.levelnet
  9616. LDR R0,[R0]
  9617. CMP R0,#0
  9618. SWINE Amnesia_ReleaseBlock
  9619. .badloadloop
  9620. MOV R0,#6
  9621. ADR R1,levelnetname
  9622. ADR R2,levelpathname
  9623. LDR R4,[R12,#v.levelno]
  9624. SUB R4,R4,#1
  9625. TST R4,#&400
  9626. AND R4,R4,#&FF
  9627. ADDNE R4,R4,#64
  9628. MOV R4,R4,LSL #3
  9629. SWI Blitz_HammerOp
  9630. CMP R4,#0
  9631. BNE dolevload 
  9632. LDR R1,[R12,#v.levelno]
  9633. ADD R1,R1,#1
  9634. STR R1,[R12,#v.levelno]
  9635. AND R1,R1,#&FF
  9636. CMP R1,#41
  9637. BLT badloadloop
  9638. B nolevelerr
  9639. .dolevload
  9640. MOV R0,#2
  9641. SWI Blitz_HammerOp
  9642. STMFD R13!,{R0-R4}
  9643. ADD R0,R12,#v.levelnet
  9644. MOV R1,R3
  9645. ADR R2,levelnetname
  9646. MOV R3,#0
  9647. SWI Amnesia_ClaimBlock
  9648. LDMFD R13!,{R0-R4}
  9649. LDR R3,[R12,#v.levelnet]
  9650. MOV R0,#3
  9651. SWI Blitz_HammerOp
  9652. .loadblockstab
  9653. MOV R0,#6
  9654. ADR R1,levelnetname
  9655. ADR R2,levelpathname
  9656. LDR R4,[R12,#v.levelno]
  9657. SUB R4,R4,#1
  9658. TST R4,#&400
  9659. AND R4,R4,#&FF
  9660. ADDNE R4,R4,#64
  9661. MOV R4,R4,LSL #3
  9662. ADD R4,R4,#4
  9663. SWI Blitz_HammerOp
  9664. CMP R4,#0
  9665. BEQ noblocktab 
  9666. MOV R0,#blockstab
  9667. SWI Amnesia_GetTableAddress
  9668. ADD R3,R0,#16
  9669. MOV R0,#3
  9670. SWI Blitz_HammerOp
  9671. .noblocktab
  9672. ;MOV R0,#blockstab
  9673. ;ADR R1,blockstabname
  9674. ;ADR R2,levelpathname
  9675. ;SWI XAmnesia_LoadTable
  9676. BL vetlevel
  9677. BL startfind
  9678. MOV R0,#1
  9679. STR R0,[R12,#v.sparks]
  9680. STR R0,[R12,#v.redball]
  9681. MOV R0,#0
  9682. STR R0,[R12,#v.warped]
  9683. LDR R1,[R12,#v.levelnet]
  9684. LDR R0,[R1,#net.xgrav]
  9685. STR R0,[R12,#v.xgrav]
  9686. LDR R0,[R1,#net.ygrav]
  9687. STR R0,[R12,#v.ygrav]
  9688. LDR R0,[R1.#net.backdrop]
  9689. TST R0,#1<<31
  9690. BLNE goodykill
  9691. LDMFD R13!,{PC}
  9692.  
  9693. .goodykill
  9694. MOV R0,#0
  9695. STR R0,[R12,#v.good0]
  9696. STR R0,[R12,#v.good1]
  9697. STR R0,[R12,#v.good2]
  9698. STR R0,[R12,#v.good3]
  9699. STR R0,[R12,#v.scanspeed]
  9700. STR R0,[R12,#v.lineradar]
  9701. MOV R0,#1
  9702. STR R0,[R12,#v.goodychange]
  9703. MOV PC,R14
  9704.  
  9705. .backload
  9706. STMFD R13!,{R14}
  9707. LDR R0,[R12,#v.loadeddrop]
  9708. LDR R1,[R12,#v.levelnet]
  9709. LDR R1,[R1,#net.backdrop]
  9710. AND R1,R1,#&FF
  9711. CMP R0,R1
  9712. LDMEQFD R13!,{PC}
  9713. .backabortins
  9714. BL setbackvar
  9715. ADD R0,R12,#v.backdrop
  9716. LDR R0,[R0]
  9717. CMP R0,#0
  9718. SWINE Amnesia_ReleaseBlock
  9719. ADD R0,R12,#v.backdrop
  9720. ADR R1,backdropname
  9721. ADR R2,pathname
  9722. SWI XAmnesia_LoadHammered
  9723. BVS backabort
  9724. MOV R0,#edgetab
  9725. SWI FastSpr_GetPointer
  9726. LDR R0,[R0]
  9727. CMP R0,#0
  9728. SWINE Amnesia_ReleaseBlock
  9729. MOV R0,#edgetab
  9730. SWI FastSpr_GetPointer
  9731. ADR R1,edgename
  9732. ADR R2,pathname
  9733. SWI XAmnesia_LoadHammered
  9734.  
  9735. MOV R0,#blockstab
  9736. SWI FastSpr_GetPointer
  9737. LDR R0,[R0]
  9738. CMP R0,#0
  9739. SWINE Amnesia_ReleaseBlock
  9740. MOV R0,#blockstab
  9741. SWI FastSpr_GetPointer
  9742. ADR R1,blocksname
  9743. ADR R2,pathname
  9744. SWI XAmnesia_LoadHammered
  9745.  
  9746. LDR R0,[R12,#v.levelnet]
  9747. LDR R0,[R0,#net.backdrop]
  9748. AND R0,R0,#&FF
  9749. STR R0,[R12,#v.loadeddrop]
  9750. LDMFD R13!,{PC}
  9751.  
  9752. .backabort
  9753. LDR R1,[R12,#v.levelnet]
  9754. ADD R1,R1,#net.backdrop
  9755. LDR R0,[R1]
  9756. MOV R2,R0
  9757. CMP R0,#0
  9758. MOVLE R0,#1
  9759. SUBGT R0,R0,#1
  9760. AND R0,R0,#&FF
  9761. BIC R2,R2,#&FF
  9762. ORR R0,R2,R0
  9763. STR R0,[R1]
  9764. B backabortins
  9765.  
  9766. .setbackvar
  9767. STMFD R13!,{R14}
  9768. LDR R0,[R12,#v.levelnet]
  9769. LDR R0,[R0,#net.backdrop]
  9770. AND R0,R0,#&FF
  9771. STR R0,[R12,#v.temp0]
  9772. ADR R0,backname
  9773. ADD R1,R12,#v.temp0
  9774. MOV R2,#4
  9775. MOV R3,#0
  9776. MOV R4,#1
  9777. SWI OS_SetVarVal
  9778. LDMFD R13!,{PC}
  9779.  
  9780. .backname
  9781. DCB "Oddball$BackNo",0
  9782. ALIGN
  9783.  
  9784.  
  9785. .loadfiles
  9786. STMFD R13!,{R14}
  9787. MOV R0,#edgetab
  9788. SWI FastSpr_GetPointer
  9789. MOV R1,#0
  9790. STR R1,[R0]
  9791. MOV R0,#blockstab
  9792. SWI FastSpr_GetPointer
  9793. MOV R1,#0
  9794. STR R1,[R0]
  9795.  
  9796. MOV R0,#batstab
  9797. SWI FastSpr_GetPointer
  9798. ADR R1,batname
  9799. ADR R2,pathname
  9800. SWI Amnesia_LoadHammered
  9801. MOV R0,#ballstab
  9802. SWI FastSpr_GetPointer
  9803. ADR R1,ballsname
  9804. ADR R2,pathname
  9805. SWI Amnesia_LoadHammered
  9806. MOV R0,#texttab
  9807. SWI FastSpr_GetPointer
  9808. ADR R1,charsname
  9809. ADR R2,pathname
  9810. SWI Amnesia_LoadHammered
  9811. MOV R0,#starstab
  9812. SWI FastSpr_GetPointer
  9813. ADR R1,starsname
  9814. ADR R2,pathname
  9815. SWI Amnesia_LoadHammered
  9816. MOV R0,#decortab
  9817. SWI FastSpr_GetPointer
  9818. ADR R1,decorname
  9819. ADR R2,pathname
  9820. SWI Amnesia_LoadHammered
  9821. MOV R0,#explotab
  9822. SWI FastSpr_GetPointer
  9823. ADR R1,exploname
  9824. ADR R2,pathname
  9825. SWI Amnesia_LoadHammered
  9826. MOV R0,#goodytab
  9827. SWI FastSpr_GetPointer
  9828. ADR R1,goodiesname
  9829. ADR R2,pathname
  9830. SWI Amnesia_LoadHammered
  9831. MOV R0,#arrowtab
  9832. SWI FastSpr_GetPointer
  9833. ADR R1,arrowname
  9834. ADR R2,pathname
  9835. SWI Amnesia_LoadHammered
  9836. BL setsavepath
  9837. ;load the savenames file
  9838. ADD R0,R12,#v.savenames
  9839. ADR R1,savenamesfullname
  9840. MOV R2,#0
  9841.  
  9842. SWI XAmnesia_LoadFile
  9843.  
  9844. ADD R0,R12,#v.savenames
  9845. LDR R1,[R0]
  9846. CMP R1,#0
  9847. MOV R1,#256
  9848. ADR R2,savenamesname
  9849. MOV R3,#0
  9850. SWIEQ Amnesia_ClaimBlock
  9851.  
  9852. ADD R0,R12,#v.hinames
  9853. ADR R1,hinamesfullname
  9854. MOV R2,#0
  9855.  
  9856. SWI XAmnesia_LoadFile
  9857.  
  9858. ADD R0,R12,#v.hinames
  9859. LDR R1,[R0]
  9860. CMP R1,#0
  9861. MOV R1,#392
  9862. ADR R2,hinamesname
  9863. MOV R3,#0
  9864. SWIEQ Amnesia_ClaimBlock
  9865. LDMFD R13!,{PC}
  9866.  
  9867. .wipem
  9868. .loop8b
  9869. STR R0,[R1],#4
  9870. CMP R1,R2
  9871. BLT loop8b
  9872. MOV PC,R14
  9873.  
  9874. .random
  9875. LDR R0,[R12,#v.rnseed]
  9876. ADD R0,R0,#137
  9877. EOR R0,R0,R0,ROR #13
  9878. STR R0,[R12,#v.rnseed]
  9879. MOV PC,R14
  9880.  
  9881. .writeerror
  9882. STMFD R13!,{R14}
  9883. ADD R5,R0,#4
  9884. MOV R0,R1
  9885. BL message
  9886. MOV R3,#255
  9887. ADR R4,errortext
  9888. .weloop
  9889. LDRB R0,[R5],#1
  9890. CMP R0,#32
  9891. BLT weskip
  9892. CMP R0,#123
  9893. MOVGE R0,#32
  9894. CMP R0,#96
  9895. BICGE R0,R0,#32
  9896. STRB R0,[R4],#1
  9897. SUBS R3,R3,#1
  9898. BGT weloop
  9899. .weskip
  9900. RSB R3,R3,#255
  9901. MOV R3,R3,LSL #15
  9902. ADD R3,R3,#160<<12
  9903. STR R3,errormes
  9904. MOV R0,#0
  9905. STRB R0,[R4]
  9906. ADR R0,errormes
  9907. BL message
  9908. LDMFD R13!,{PC}
  9909. .errormes
  9910. DCD 160<<12,220<<12,-2<<12,0,&02000001,0
  9911. .errortext
  9912. DBB 256
  9913. ALIGN
  9914.  
  9915. .stonetab
  9916. INCBIN <OddBall$Path>Object.StoneTab
  9917.  
  9918. ; ***** TEXT ENTRIES *****
  9919.  
  9920. .varsname
  9921. DCB "Vars",0
  9922.  
  9923. ALIGN
  9924. .diverror
  9925. ADR R0,diverrortext
  9926. SWI OS_GenerateError
  9927. .diverrortext
  9928. DCD &666
  9929. DCB "Division error",0
  9930. ALIGN
  9931. .nomemory
  9932. ADR R0,nomemerrtext
  9933. SWI OS_GenerateError
  9934. .nomemerrtext
  9935. DCD &666
  9936. DCB "Not enough memory to begin application",0
  9937. ALIGN
  9938. .loadfailedtext
  9939. DCD &666
  9940. DCB "Failed to load sprite file",0
  9941. ALIGN
  9942. .setupfailedtext
  9943. DCD &666
  9944. DCB "Failed to set up tables",0
  9945. ALIGN
  9946. .nolevelerr
  9947. ADR R0,noleveltext
  9948. SWI OS_GenerateError
  9949. .noleveltext
  9950. DCD &666
  9951. DCB "Cannot find level file",0
  9952.  
  9953.  
  9954. ALIGN
  9955. .hellshift
  9956. INCBIN <OddBall$Path>Object.HellShift
  9957. .linewrites
  9958. INCBIN <OddBall$Path>Object.LineWrites
  9959. ALIGN
  9960. .windback
  9961. INCBIN <OddBall$Path>Object.WindBack
  9962. .blockwindback
  9963. INCBIN <OddBall$Path>Object.BlockWind
  9964. .fade
  9965. INCBIN <OddBall$Path>Object.Fade
  9966. .nibprint
  9967. LDR R8,[R12,#v.plotnibble]
  9968. B printins
  9969. .print
  9970. MOV R8,#0
  9971. .printins
  9972. INCBIN <OddBall$Path>Object.Printer
  9973. .printnumber
  9974. INCBIN <OddBall$Path>Object.Number
  9975. .printstring
  9976. INCBIN <OddBall$Path>Object.String
  9977. .slideback
  9978. INCBIN <OddBall$Path>Object.SlideBack
  9979. .texthandler
  9980. LDR R8,[R12,#v.plotnibble]
  9981. INCBIN <OddBall$Path>Object.TextHandle
  9982. .message                           ;Do not separate these two INCBINs
  9983. INCBIN <OddBall$Path>Object.Message
  9984. .textsetup
  9985. INCBIN <OddBall$Path>Object.TextSetup
  9986. .circletab
  9987. INCBIN <OddBall$Path>Object.CircleTab
  9988. .progend
  9989.