home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Examples / BolMaster / !BolMaster / Source < prev    next >
Encoding:
Text File  |  1995-08-14  |  32.0 KB  |  1,969 lines

  1. #name Code.Code
  2. #type &ffd
  3.  
  4. #include <Bolmaster$Path>Sources.Structures
  5. #include <Bolmaster$Path>Sources.Variables
  6. #include <Bolmaster$Path>Sources.Macros
  7. #include <Main$Path>Extasm.AsmLib.MYDIV
  8. #set canvaswidth=320
  9. #set hbytes=320
  10. STMFD R13!,{R14}
  11. BL setupvars
  12. LDMVSFD R13!,{PC}
  13. STR R13,[R12,#v.basicstack]
  14. ;OK, now you can do what you like
  15. BL setup
  16. BL getfiles
  17. BVS err
  18. BL vetlevel
  19. BVS err
  20. BL readback
  21. BVS err
  22. BL sortscreen
  23. BL setupmaster
  24. BL mainloop
  25. B exit
  26.  
  27.  
  28. .mainloop
  29. STMFD R13!,{R14}
  30. LDR R0,[R12,#v.startxpos]
  31. LDR R1,[R12,#v.startypos]
  32. STR R0,[R12,#v.plxpos]
  33. STR R1,[R12,#v.plypos]
  34. .loop
  35. MOV R0,#1
  36. STR R0,[R12,#v.masterplot]
  37. BL runclocks
  38. BL runexplomap
  39. BL setupcanvas
  40. BL getmotion
  41. BL processmaster
  42. BL movecent
  43. BL processedge
  44. BL processbul
  45. BL plotplayer
  46. BL processexplo
  47. BL processspecial
  48. BL colchmaster
  49. MOV R0,#0
  50. STR R0,[R12,#v.masterplot]
  51. BL runclocks
  52. BL runexplomap
  53. BL setupcanvas
  54. BL processmaster
  55. BL movecent
  56. BL plotbackdrop
  57. BL processedge
  58. BL processbul
  59. BL plotplayer
  60. BL processexplo
  61. BL processspecial
  62. BL colchmaster
  63. BL updatehealth
  64. BL writescreen
  65. SWI OS_ReadEscapeState
  66. BCC loop
  67. LDMFD R13!,{PC}
  68.  
  69. .makemaster
  70. STMFD R13!,{R14}
  71. MOV R0,#mastertab
  72. MOV R1,#mastertab<<24
  73. MOV R2,#%10010010000+(3<<18)
  74. MOV R3,#160<<12
  75. MOV R4,#96<<12
  76. MOV R5,#0
  77. MOV R6,#0
  78. MOV R7,#0
  79. MOV R8,#&0010001E
  80. SWI Amnesia_MakeObject
  81. LDMFD R13!,{PC}
  82.  
  83. .runclocks
  84. LDR R0,[R12,#v.timer]
  85. ADD R0,R0,#1
  86. STR R0,[R12,#v.timer]
  87. LDR R0,[R12,#v.weptimer]
  88. CMP R0,#0
  89. ADD R0,R0,#1
  90. STRGE R0,[R12,#v.weptimer]
  91. MOV PC,R14
  92.  
  93. .getmotion
  94. STMFD R13!,{R14}
  95. MOV R3,#0
  96. MOV R0,#129
  97. MOV R1,#97 EOR &FF
  98. MOV R2,#&FF
  99. SWI OS_Byte
  100. CMP R2,#&FF
  101. EOREQ R3,R3,#1
  102. MOV R0,#129
  103. MOV R1,#66 EOR &FF
  104. MOV R2,#&FF
  105. SWI OS_Byte
  106. CMP R2,#&FF
  107. EOREQ R3,R3,#1<<1
  108. MOV R0,#129
  109. MOV R1,#79 EOR &FF
  110. MOV R2,#&FF
  111. SWI OS_Byte
  112. CMP R2,#&FF
  113. EOREQ R3,R3,#1<<2
  114. MOV R0,#129
  115. MOV R1,#104 EOR &FF
  116. MOV R2,#&FF
  117. SWI OS_Byte
  118. CMP R2,#&FF
  119. EOREQ R3,R3,#1<<3
  120. MOV R0,#129
  121. MOV R1,#73 EOR &FF
  122. MOV R2,#&FF
  123. SWI OS_Byte
  124. CMP R2,#&FF
  125. EOREQ R3,R3,#1<<4
  126. STR R3,[R12,#v.keys1]
  127. LDMFD R13!,{PC}
  128.  
  129. .processmaster
  130. STMFD R13!,{R14}
  131. ADR R0,masterremote
  132. MOV R1,R12
  133. SWI Amnesia_Remote
  134. MOV R0,#mastertab
  135. MOV R1,#0
  136. LDR R2,[R12,#v.masterplot]
  137. SWI Amnesia_SelectTable
  138. MOV R5,#0
  139. .loop1
  140. SWI Amnesia_ProcessTable
  141. ADD R5,R5,#1
  142. CMP R2,#0
  143. BNE loop1
  144. CMP R5,#1
  145. BEQ setupmaster
  146. LDMFD R13!,{PC}
  147.  
  148. DCD &006E0000; this is here for a reason - see Amnesia_Remote
  149. .masterremote
  150. STMFD R13!,{R1-R8,R14}
  151. STR R10,[R12,#v.plobj]
  152. LDR R3,[R12,#v.plxpos]
  153. LDR R4,[R12,#v.plypos]
  154. STR R3,[R10,#8]
  155. STR R4,[R10,#12]
  156. LDR R5,[R10,#28]
  157. MOV R6,R5,LSL #16
  158. MOV R6,R6,LSR #16
  159. MOV R5,R5,LSR #16
  160.  
  161. ADD R4,R4,R6,LSL #11
  162. SUB R3,R3,R5,LSL #11
  163. ADD R4,R4,#1<<12; one pixel
  164. transnet R9,R3,R4
  165. LDRB R2,[R9]
  166. ADD R3,R3,R5,LSL #11
  167. transnet R9,R3,R4
  168. LDRB R0,[R9]
  169. ORR R2,R2,R0
  170. ADD R3,R3,R5,LSL #11
  171. SUB R3,R3,#1<<12
  172. transnet R9,R3,R4
  173. LDRB R0,[R9]
  174. ORR R2,R2,R0
  175. LDR R3,[R10,#8]
  176. LDR R4,[R10,#12]
  177. LDR R0,[R10,#32]
  178. ORR R1,R0,#3<<1
  179. TST R2,#1<<7
  180. STRNE R1,[R10,#32]
  181. BNE masteronfloor
  182. TST R0,#1<<1
  183. BIC R0,R0,#1<<1
  184. STR R0,[R10,#32]
  185. BNE masteronfloor
  186. TST R0,#1<<2
  187. BIC R0,R0,#1<<2
  188. STR R0,[R10,#32]
  189. BNE masteronfloor
  190.  
  191. ;master in empty space
  192. LDR R1,[R12,#v.keys1]
  193. LDR R5,[R10,#16]
  194. LDR R6,[R10,#20]
  195. SUB R5,R5,R5,ASR #5
  196. ADD R6,R6,#2<<11
  197. TST R1,#1
  198. BEQ flynoleft
  199. CMP R5,#0
  200. SUB R5,R5,#1<<10
  201. SUBGT R5,R5,#1<<10
  202. .flynoleft
  203. TST R1,#1<<1
  204. BEQ flynoright
  205. CMP R5,#0
  206. ADD R5,R5,#1<<10
  207. ADDLT R5,R5,#1<<10
  208. .flynoright
  209. .masterflyins
  210. BL speedlim
  211. STR R5,[R10,#16]
  212. STR R6,[R10,#20]
  213. LDR R0,[R10,#32]
  214. LDR R1,[R12,#v.keys1]
  215. TST R1,#1
  216. BICNE R0,R0,#1
  217. TST R1,#1<<1
  218. ORRNE R0,R0,#1
  219. STR R0,[R10,#32]
  220.  
  221. BL bcheck
  222. BL speedlim
  223. STR R5,[R10,#16]
  224. STR R6,[R10,#20]
  225.  
  226. ADD R0,R10,#8
  227. LDMIA R0,{R3-R6}
  228. ADD R3,R3,R5
  229. ADD R4,R4,R6
  230. STR R3,[R10,#8]
  231. STR R4,[R10,#12]
  232. STR R3,[R12,#v.plxpos]
  233. STR R4,[R12,#v.plypos]
  234.  
  235. LDR R1,[R12,#v.keys1]
  236. TST R1,#1<<4
  237. BEQ noheadwep
  238. LDR R0,[R12,#v.weptimer]
  239. CMP R0,#0
  240. BGE noheadwep
  241. MOV R0,#0
  242. STR R0,[R12,#v.weptimer]
  243. MOV R0,#1
  244. STR R0,[R12,#v.weptype]
  245. .noheadwep
  246. LDMFD R13!,{R1-R8,PC}
  247.  
  248. .masteronfloor
  249. LDR R1,[R12,#v.keys1]
  250. LDR R5,[R10,#16]
  251. LDR R6,[R10,#20]
  252. TST R1,#3
  253. SUBEQ R5,R5,R5,ASR #1
  254. SUBNE R5,R5,R5,ASR #4
  255. TST R1,#1
  256. BEQ floornoleft
  257. SUB R5,R5,#1<<11
  258. CMP R5,#0
  259. MOVGT R5,#0
  260. .floornoleft
  261. TST R1,#1<<1
  262. BEQ floornoright
  263. ADD R5,R5,#1<<11
  264. CMP R5,#0
  265. MOVLT R5,#0
  266. .floornoright
  267. TST R1,#1<<2
  268. BEQ nojump
  269. MOV R6,#-14<<12
  270. TST R1,#1<<3
  271. MOVNE R6,#-8<<12
  272. LDR R0,[R10,#32]
  273. BIC R0,R0,#3<<1
  274. STR R0,[R10,#32]
  275. .nojump
  276. B masterflyins
  277.  
  278. .speedlim
  279. LDR R0,[R10,#28]
  280. MOV R1,R0,LSL #15
  281. MOV R1,R1,LSR #16
  282. MOV R0,R0,LSR #16
  283. ADD R0,R0,#7
  284. ADD R1,R1,#7
  285. MOV R0,R0,LSL #12
  286. MOV R1,R1,LSL #12
  287. CMP R5,R0
  288. MOVGT R5,R0
  289. CMN R5,R0
  290. RSBLT R5,R0,#0
  291. CMP R6,R1
  292. MOVGT R6,R1
  293. CMN R6,R1
  294. RSBLT R6,R1,#0
  295. MOV PC,R14
  296.  
  297. .plotplayer
  298. STMFD R13!,{R14}
  299. MOV R0,#0
  300. STR R0,[R12,#v.nutbmog]
  301. LDR R10,[R12,#v.plobj]
  302. LDR R9,[R10,#32]
  303. AND R9,R9,#1
  304. MOVS R8,R9
  305. MOVEQ R8,#-1
  306.  
  307. LDR R1,[R12,#v.plxpos]
  308. LDR R2,[R12,#v.plypos]
  309. LDR R3,[R12,#v.xplotofs]
  310. LDR R4,[R12,#v.yplotofs]
  311. ADD R1,R1,R3
  312. ADD R2,R2,R4
  313. MOV R5,R1,ASR #12
  314. MOV R6,R2,ASR #12
  315. SUB R6,R6,#1
  316. LDR R4,[R12,#v.weptimer]
  317. CMP R4,#0
  318. BGE wepactive
  319. .wepactiveins
  320. LDR R0,[R12,#v.masterplot]
  321. CMP R0,#0
  322. BNE plotplayerskip
  323. ADD R0,R9,#mastertab<<24
  324. MOV R1,R5
  325. MOV R2,R6
  326. SWI FastSpr_Plot
  327. LDR R0,[R10,#8]
  328. MOV R0,R0,LSR #16
  329. AND R0,R0,#3
  330. CMP R0,#3
  331. MOVEQ R0,#1
  332. CMP R0,#0
  333. SUBEQ R1,R1,R8
  334. CMP R0,#2
  335. ;ADDEQ R1,R1,R8
  336. CMP R0,#1
  337. SUBNE R2,R2,#1
  338. MOV R0,R0,LSL #16
  339. ADD R0,R0,#(mastertab<<24)+2
  340. ADD R0,R0,R9
  341. SWI FastSpr_Plot
  342. .plotplayerskip
  343. LDMFD R13!,{PC}
  344.  
  345. .nutsprtab
  346. DCD &010000
  347. DCD &010000
  348. DCD &020000
  349. DCD &020000
  350. DCD &020000
  351. DCD &020000
  352. DCD &010000
  353. DCD &000000
  354. DCD &030000
  355. DCD &040000
  356. DCD &040000
  357. DCD &040000
  358. DCD &040000
  359. DCD &040000
  360. DCD &040000
  361. DCD &030000
  362.  
  363. .nutarmtab
  364. DCB 1,1,0,0,0,0,1,2,3,4,5,5,5,5,4,3
  365. .nutarmspr
  366. DCB 0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,0
  367.  
  368. .wepactive
  369. MOV R4,R4,LSR #1
  370. CMP R4,#16
  371. BGE wepactivend
  372. ADR R1,nutsprtab
  373. LDR R0,[R1,R4,LSL #2]
  374. ADD R0,R0,R9
  375. ADD R0,R0,#mastertab<<24
  376. MOV R1,R5
  377. MOV R2,R6
  378. SWI FastSpr_Plot
  379. ADR R3,nutarmtab
  380. LDRB R0,[R3,R4]
  381. SUB R0,R0,#2
  382. CMP R8,#1
  383. ADDEQ R1,R5,R0
  384. SUBNE R1,R5,R0
  385. ADR R3,nutarmspr
  386. LDRB R0,[R3,R4]
  387.  
  388. CMP R0,#1
  389. SUBNE R2,R2,#1
  390. MOV R0,R0,LSL #16
  391. ADD R0,R0,#(mastertab<<24)+2
  392. ADD R0,R0,R9
  393. SWI FastSpr_Plot
  394. LDR R4,[R12,#v.weptimer]
  395. CMP R4,#20
  396. BLEQ nutimpact
  397. LDMFD R13!,{PC}
  398.  
  399. .nutimpact
  400. STMFD R13!,{R14}
  401. LDR R3,[R10,#8]
  402. LDR R4,[R10,#12]
  403. ADD R3,R3,R8,ASL #15
  404. ADD R3,R3,R8,ASL #14
  405. SUB R4,R4,#8<<12
  406. BL dodamage
  407. LDMFD R13!,{PC}
  408.  
  409. .wepactivend
  410. MOV R0,#-1
  411. STR R0,[R12,#v.weptimer]
  412. B wepactiveins
  413.  
  414.  
  415. .makeexplo
  416. ; Make an explosion object
  417. STMFD R13!,{R0-R7,R14}
  418.  
  419. LDR R0,[R12,#v.rnseed]
  420. ADD R0,R0,#13
  421. EOR R0,R0,R0,ROR #9
  422. MOV R7,R0
  423. ADD R0,R0,#13
  424. EOR R0,R0,R0,ROR #9
  425. MOV R5,R0
  426. ADD R0,R0,#13
  427. EOR R0,R0,R0,ROR #9
  428. MOV R6,R0
  429. ADD R0,R0,#13
  430. EOR R0,R0,R0,ROR #9
  431.  
  432. STR R0,[R12,#v.rnseed]
  433. AND R1,R0,#3
  434. CMP R1,#3
  435. MOVEQ R1,#2
  436. MOV R0,#explotab
  437.  
  438. ADD R1,R1,#explotab<<24
  439. MOV R2,#%1000110101
  440. ANDS R5,R5,#3
  441. ADDEQ R3,R3,#4<<12
  442. CMP R5,#2
  443. SUBEQ R3,R3,#4<<12
  444. AND R6,R6,#7<<12
  445. ADD R4,R4,R6
  446. SUB R4,R4,#7<<11
  447. MOV R5,#0
  448. MOV R6,#0
  449. AND R7,R7,#&7F
  450. ADD R7,R7,#&06000020
  451. SWI Amnesia_MakeObject
  452. LDMFD R13!,{R0-R7,PC}
  453.  
  454. .processexplo
  455. ;process the explosion table
  456. STMFD R13!,{R14}
  457. MOV R0,#0
  458. MOV R1,R12
  459. SWI Amnesia_Remote
  460. MOV R0,#explotab
  461. MOV R1,#0
  462. LDR R2,[R12,#v.masterplot]
  463. SWI Amnesia_SelectTable
  464.  
  465. .loopb
  466. SWI Amnesia_ProcessTable
  467. CMP R2,#0
  468. BNE loopb
  469. LDMFD R13!,{PC}
  470.  
  471. .processspecial
  472. LDR PC,[R12,#v.specialadr]
  473. .runexplomap
  474. ;Produce the large explosions seen in the game.  It lets one explosion
  475. ;set off any of it's nearest neighbours.  The currently active
  476. ;explosions are stored in a list called the explomap.  Explosions
  477. ;are 'active' for the first frame after their creation
  478. ;explomap entries are offsets from the levelnet, not addresses
  479.  
  480. STMFD R13!,{R14}
  481. LDR R0,[R12,#v.timer]
  482. TST R0,#&1
  483. LDMNEFD R13!,{PC}
  484. LDR R0,[R12,#v.explomap]
  485. STR R0,[R12,#v.explomap]
  486. CMP R0,#0
  487. LDR R11,[R12,#v.levelnet]
  488. LDREQ R10,[R12,#v.explomap1]
  489. LDRNE R10,[R12,#v.explomap2]
  490. MOV R9,#explomaplen
  491. LDR R7,[R12,#v.netxsize]
  492. LDR R8,[R12,#v.netysize]
  493. MOV R7,R7,LSL #2
  494. MOV R8,R8,LSL #2
  495. .loope
  496. #rept 8
  497. LDR R6,[R10],#4
  498. CMP R6,#0
  499. BLNE domap
  500. #endr
  501. SUBS R9,R9,#8
  502. BGT loope
  503. LDMFD R13!,{PC}
  504.  
  505. .domap
  506. STMFD R13!,{R14}
  507. MOV R0,#0
  508. STR R0,[R10,#-4]
  509. ;test for data area erase
  510. AND R0,R6,#3
  511. CMP R0,#1
  512. CMPNE R0,#2
  513. BNE nomaperase
  514. LDR R2,[R12,#v.levelshift]
  515. ADD R2,R2,#netshift
  516. MOV R0,R6,LSR R2
  517. AND R0,R0,#3
  518. CMP R0,#1
  519. CMPNE R0,#2
  520. BNE nomaperase
  521. ADD R2,R2,#2
  522. MOV R1,R6,LSR R2
  523.  
  524. SUB R2,R2,#netshift+2
  525. MOV R1,R1,LSL R2
  526. SUB R0,R7,#1
  527. AND R2,R6,R0
  528. ADD R1,R1,R2,LSR #2
  529. MOV R0,#0
  530. LDR R2,[R12,#v.leveldata]
  531. STRB R0,[R2,R1]
  532.  
  533. .nomaperase
  534.  
  535. ;test left
  536. SUB R5,R7,#1
  537. TST R6,R5
  538. SUB R0,R6,#1
  539. BLNE domaptest
  540.  
  541. ;test right
  542. SUB R5,R7,#1
  543. ADD R0,R6,#1
  544. TST R6,R5
  545. BLNE domaptest
  546.  
  547. ;test up
  548. SUBS R0,R6,R7
  549. BLGE domaptest
  550.  
  551. ADD R0,R6,R7
  552. MUL R1,R7,R8
  553. CMP R0,R1
  554. BLLT domaptest
  555. MOV R0,#0
  556. STRB R0,[R11,R6];wipe the current object fron the micronet
  557. LDMFD R13!,{PC} 
  558.  
  559. .domaptest
  560. LDRB R2,[R11,R6]
  561. LDRB R1,[R11,R0]
  562. TST R1,#1       ;have we blown this one up already
  563. MOVNE PC,R14
  564. TST R2,#&20     ;if this block is an E explosion
  565. TSTNE R1,#&30   ;and the adjacent block is any explosive
  566. BNE maptesttrue ;blow it up
  567. TST R2,#&10     ;if this block is an H explosion
  568. TSTNE R1,#&10   ;and the adjacent block is an H explosive
  569. BNE maptesttrue ;blow it up
  570. MOV PC,R14
  571.  
  572. .maptesttrue
  573. STMFD R13!,{R14}
  574. ADD R0,R11,R0
  575. BL addexplomap
  576. LDMFD R13!,{PC}
  577.  
  578. .addexplomap
  579. ;add an entry to the explomap
  580. STMFD R13!,{R0-R4,R14}
  581. MOV R4,R0
  582. LDRB R1,[R0]
  583. ORR R1,R1,#1
  584. STRB R1,[R0]
  585.  
  586. LDR R2,[R12,#v.levelnet]
  587. SUB R0,R0,R2
  588. LDR R2,[R12,#v.explomap]
  589. RSB R2,R2,#1
  590. CMP R2,#0
  591. LDREQ R2,[R12,#v.explomap2]
  592. LDRNE R2,[R12,#v.explomap1]
  593. LDR R3,[R12,#v.exploptr]
  594. STR R0,[R2,R3]
  595. ADD R3,R3,#12;a bit of interleaving
  596. CMP R3,#explomaplen*4
  597. SUBGE R3,R3,#explomaplen*4
  598. STR R3,[R12,#v.exploptr]
  599. backtransnet R4
  600. MOV R3,R0
  601. MOV R4,R1
  602. BL makeexplo
  603. LDMFD R13!,{R0-R4,PC}
  604.  
  605. .dodamage
  606. ;'damage' a block - normally causes it to explode
  607. STMFD R13!,{R5-R6,R14}
  608. LDR R5,[R12,#v.netxsize]
  609. LDR R6,[R12,#v.netysize]
  610. CMP R3,R5,LSL #5+12
  611. BGE dodamoff
  612. CMP R4,R6,LSL #5+12
  613. BGE dodamoff
  614. CMP R3,#0
  615. BLT dodamoff
  616. CMP R4,#0
  617. BLT dodamoff
  618. transnet R0,R3,R4
  619. LDRB R5,[R0]
  620. TST R5,#&10 ;the high explosive bit
  621. BEQ damnotexplo
  622. STMFD R13!,{R3-R5}
  623. BL addexplomap
  624. LDMFD R13!,{R3-R5}
  625. .damnotexplo
  626. TST R5,#&0C
  627. BLNE writenutbmog
  628.  
  629. .dodamoff
  630. LDMFD R13!,{R5-R6,PC}
  631.  
  632. .writenutbmog
  633. STMFD R13!,{R14}
  634. transdata R0,R3,R4
  635. STR R0,[R12,#v.nutbmog]
  636. LDMFD R13!,{PC}
  637.  
  638. .movecent
  639. ;move Amnesia's plot offset to keep the master in the centre of the
  640. ;screen.  The 'plotnibble' is to do with the shifting of the screen
  641. ;to the left when it is written from the canvas to the screen.
  642. STMFD R13!,{R14}
  643. LDR R0,[R12,#v.plxpos]
  644. MOV R0,R0,ASR #12
  645. SUB R0,R0,#160
  646. STR R0,[R12,#v.xofs]
  647. LDR R1,[R12,#v.plypos]
  648. MOV R1,R1,ASR #12
  649. SUB R1,R1,#96
  650. STR R1,[R12,#v.yofs]
  651. LDR R2,[R12,#v.xofs]
  652. AND R2,R2,#3
  653. STR R2,[R12,#v.plotnibble]
  654.  
  655. RSB R0,R0,#0
  656. RSB R1,R1,#0
  657. ADD R0,R0,R2
  658. MOV R0,R0,ASL #12
  659. MOV R1,R1,ASL #12
  660. STR R0,[R12,#v.xplotofs]
  661. STR R1,[R12,#v.yplotofs]
  662. SWI Amnesia_SetPlotOffset
  663.  
  664. LDMFD R13!,{PC}
  665.  
  666. .processedge
  667. ;process the edge table.  This plots the 3D bits to the platforms and 
  668. ;any other part of the backdrop that needs plotting as a sprite.
  669. STMFD R13!,{R14}
  670. MOV R0,#0
  671. SWI Amnesia_Remote
  672. MOV R0,#backtab
  673. MOV R1,#0
  674. LDR R2,[R12,#v.masterplot]
  675. SWI Amnesia_SelectTable
  676. .loopa
  677. SWI Amnesia_ProcessTable
  678. CMP R2,#0
  679. BNE loopa
  680. LDMFD R13!,{PC}
  681.  
  682.  
  683. .processbul
  684. ;process the dalek's bullets
  685. STMFD R13!,{R14}
  686. ADR R0,bulremote
  687. MOV R1,R12
  688. SWI Amnesia_Remote
  689. MOV R0,#bultab
  690. MOV R1,#0
  691. LDR R2,[R12,#v.masterplot]
  692. SWI Amnesia_SelectTable
  693. .loopg
  694. SWI Amnesia_ProcessTable
  695. CMP R2,#0
  696. BNE loopg
  697. LDMFD R13!,{PC}
  698.  
  699. DCD &006E0000; this is here for a reason - see Amnesia_Remote
  700. .bulremote
  701. STMFD R13!,{R1-R8,R14}
  702. transnet R9,R3,R4
  703. LDRB R2,[R9]
  704. TST R2,#1<<6
  705. MOVNE R0,#0
  706. STRNE R0,[R10];delete object
  707. LDMFD R13!,{R1-R8,PC}
  708.  
  709.  
  710. .colchmaster
  711. ;check if the player has been hit by any bullets
  712. STMFD R13!,{R14}
  713. MOV R0,#mastertab
  714. MOV R1,#bultab
  715. .loopi
  716. SWI Amnesia_CollisionCheck
  717. CMP R0,#0
  718. BEQ colchmasterend
  719. LDR R4,[R12,#v.health]
  720. SUB R4,R4,#1
  721. STR R4,[R12,#v.health]
  722. CMP R4,#0
  723. MOV R4,#0
  724. STRLT R4,[R0]
  725. STR R4,[R1]
  726. B loopi
  727. .colchmasterend
  728. LDMFD R13!,{PC}
  729.  
  730. .updatehealth
  731. STMFD R13!,{R14}
  732. LDR R0,[R12,#v.health]
  733. LDR R1,[R12,#v.lasthealth]
  734. CMP R0,R1
  735. LDMEQFD R13!,{PC}
  736. BL setupscreen
  737. LDR R3,[R12,#v.health]
  738. CMP R3,#8
  739. MOVGT R3,#8
  740. MOV R1,#48
  741. MOV R2,#224
  742. MOV R4,#8
  743. .loopj
  744. CMP R3,#0
  745. MOV R0,#(generaltab<<24)+1
  746. MOVLE R0,#(generaltab<<24)
  747. SWI FastSpr_Plot
  748. ADD R1,R1,#32
  749. SUB R3,R3,#1
  750. SUBS R4,R4,#1
  751. BGT loopj
  752. LDR R0,[R12,#v.health]
  753. STR R0,[R12,#v.lasthealth]
  754. BL setupcanvas
  755. LDMFD R13!,{PC}
  756.  
  757.  
  758.  
  759. .writescreen
  760. ;an optimised routine to write out the canvas to the screen with a shift
  761. ;left of 0,1,2 or 3 pixels.
  762. ;
  763. ;Here, incidentally, is where you can add support for mode 49.
  764.  
  765. STMFD R13!,{R14}
  766. MOV R0,#1
  767. SWI Blitz_Wait
  768. LDR R10,[R12,#v.screenadr]
  769. ADD R10,R10,#320*8
  770. ADD R10,R10,#4
  771. LDR R11,[R12,#v.canvas]
  772. MOV R9,#192
  773. LDR R2,[R12,#v.gminx]
  774. AND R2,R2,#3
  775. ADR R1,shifttab
  776. LDR R0,[R1,R2,LSL #2]
  777. ADD R0,R0,R1
  778. MOV PC,R0
  779.  
  780. .shifttab
  781. DCD shift0-shifttab
  782. DCD shift1-shifttab
  783. DCD shift2-shifttab
  784. DCD shift3-shifttab
  785.  
  786. .shift0
  787. .sloopc
  788. STMFD R13!,{R10-R11}
  789. #rept 9
  790. LDMIA R11!,{R0-R7}
  791. MOV R0,R0
  792. MOV R0,R0
  793. MOV R0,R0
  794. MOV R0,R0
  795. MOV R0,R0
  796. MOV R0,R0
  797. MOV R0,R0
  798. MOV R0,R0
  799. MOV R0,R0
  800. MOV R0,R0
  801. MOV R0,R0
  802. MOV R0,R0
  803. MOV R0,R0
  804. MOV R0,R0
  805. MOV R0,R0
  806. MOV R0,R0
  807. STMIA R10!,{R0-R7}
  808. #endr
  809. LDMIA R11!,{R0-R5}
  810. MOV R0,R0
  811. MOV R0,R0
  812. MOV R0,R0
  813. MOV R0,R0
  814. MOV R0,R0
  815. MOV R0,R0
  816. MOV R0,R0
  817. MOV R0,R0
  818. MOV R0,R0
  819. MOV R0,R0
  820. MOV R0,R0
  821. MOV R0,R0
  822. STMIA R10!,{R0-R5}
  823. LDMFD R13!,{R10-R11}
  824. ADD R10,R10,#canvaswidth
  825. ADD R11,R11,#hbytes
  826. SUBS R9,R9,#1
  827. BGT sloopc
  828. LDMFD R13!,{PC}
  829.  
  830. .shift1
  831. .sloopb
  832. STMFD R13!,{R10-R11}
  833.  
  834. #rept 9
  835. LDMIA R11!,{R0-R8}
  836. SUB R11,R11,#4
  837. MOV R0,R0,LSR #8
  838. ORR R0,R0,R1,LSL #24
  839. MOV R1,R1,LSR #8
  840. ORR R1,R1,R2,LSL #24
  841. MOV R2,R2,LSR #8
  842. ORR R2,R2,R3,LSL #24
  843. MOV R3,R3,LSR #8
  844. ORR R3,R3,R4,LSL #24
  845. MOV R4,R4,LSR #8
  846. ORR R4,R4,R5,LSL #24
  847. MOV R5,R5,LSR #8
  848. ORR R5,R5,R6,LSL #24
  849. MOV R6,R6,LSR #8
  850. ORR R6,R6,R7,LSL #24
  851. MOV R7,R7,LSR #8
  852. ORR R7,R7,R8,LSL #24
  853. STMIA R10!,{R0-R7}
  854. #endr
  855. LDMIA R11!,{R0-R6}
  856. SUB R11,R11,#4
  857. MOV R0,R0,LSR #8
  858. ORR R0,R0,R1,LSL #24
  859. MOV R1,R1,LSR #8
  860. ORR R1,R1,R2,LSL #24
  861. MOV R2,R2,LSR #8
  862. ORR R2,R2,R3,LSL #24
  863. MOV R3,R3,LSR #8
  864. ORR R3,R3,R4,LSL #24
  865. MOV R4,R4,LSR #8
  866. ORR R4,R4,R5,LSL #24
  867. MOV R5,R5,LSR #8
  868. ORR R5,R5,R6,LSL #24
  869. STMIA R10!,{R0-R5}
  870.  
  871. LDMFD R13!,{R10-R11}
  872. ADD R10,R10,#canvaswidth
  873. ADD R11,R11,#hbytes
  874. SUBS R9,R9,#1
  875. BGT sloopb
  876. LDMFD R13!,{PC}
  877.  
  878. .shift2
  879. .sloopd
  880. STMFD R13!,{R10-R11}
  881.  
  882. #rept 9
  883. LDMIA R11!,{R0-R8}
  884. SUB R11,R11,#4
  885. MOV R0,R0,LSR #16
  886. ORR R0,R0,R1,LSL #16
  887. MOV R1,R1,LSR #16
  888. ORR R1,R1,R2,LSL #16
  889. MOV R2,R2,LSR #16
  890. ORR R2,R2,R3,LSL #16
  891. MOV R3,R3,LSR #16
  892. ORR R3,R3,R4,LSL #16
  893. MOV R4,R4,LSR #16
  894. ORR R4,R4,R5,LSL #16
  895. MOV R5,R5,LSR #16
  896. ORR R5,R5,R6,LSL #16
  897. MOV R6,R6,LSR #16
  898. ORR R6,R6,R7,LSL #16
  899. MOV R7,R7,LSR #16
  900. ORR R7,R7,R8,LSL #16
  901. STMIA R10!,{R0-R7}
  902. #endr
  903. LDMIA R11!,{R0-R6}
  904. SUB R11,R11,#4
  905. MOV R0,R0,LSR #16
  906. ORR R0,R0,R1,LSL #16
  907. MOV R1,R1,LSR #16
  908. ORR R1,R1,R2,LSL #16
  909. MOV R2,R2,LSR #16
  910. ORR R2,R2,R3,LSL #16
  911. MOV R3,R3,LSR #16
  912. ORR R3,R3,R4,LSL #16
  913. MOV R4,R4,LSR #16
  914. ORR R4,R4,R5,LSL #16
  915. MOV R5,R5,LSR #16
  916. ORR R5,R5,R6,LSL #16
  917. STMIA R10!,{R0-R5}
  918.  
  919. LDMFD R13!,{R10-R11}
  920. ADD R10,R10,#canvaswidth
  921. ADD R11,R11,#hbytes
  922. SUBS R9,R9,#1
  923. BGT sloopd
  924. LDMFD R13!,{PC}
  925.  
  926. .shift3
  927. .sloope
  928. STMFD R13!,{R10-R11}
  929.  
  930. #rept 9
  931. LDMIA R11!,{R0-R8}
  932. SUB R11,R11,#4
  933. MOV R0,R0,LSR #24
  934. ORR R0,R0,R1,LSL #8
  935. MOV R1,R1,LSR #24
  936. ORR R1,R1,R2,LSL #8
  937. MOV R2,R2,LSR #24
  938. ORR R2,R2,R3,LSL #8
  939. MOV R3,R3,LSR #24
  940. ORR R3,R3,R4,LSL #8
  941. MOV R4,R4,LSR #24
  942. ORR R4,R4,R5,LSL #8
  943. MOV R5,R5,LSR #24
  944. ORR R5,R5,R6,LSL #8
  945. MOV R6,R6,LSR #24
  946. ORR R6,R6,R7,LSL #8
  947. MOV R7,R7,LSR #24
  948. ORR R7,R7,R8,LSL #8
  949. STMIA R10!,{R0-R7}
  950. #endr
  951. LDMIA R11!,{R0-R6}
  952. SUB R11,R11,#4
  953. MOV R0,R0,LSR #24
  954. ORR R0,R0,R1,LSL #8
  955. MOV R1,R1,LSR #24
  956. ORR R1,R1,R2,LSL #8
  957. MOV R2,R2,LSR #24
  958. ORR R2,R2,R3,LSL #8
  959. MOV R3,R3,LSR #24
  960. ORR R3,R3,R4,LSL #8
  961. MOV R4,R4,LSR #24
  962. ORR R4,R4,R5,LSL #8
  963. MOV R5,R5,LSR #24
  964. ORR R5,R5,R6,LSL #8
  965. STMIA R10!,{R0-R5}
  966.  
  967. LDMFD R13!,{R10-R11}
  968. ADD R10,R10,#canvaswidth
  969. ADD R11,R11,#hbytes
  970. SUBS R9,R9,#1
  971. BGT sloope
  972. LDMFD R13!,{PC}
  973.  
  974. .wipecanvas
  975. ;This is for testing - it doesn't get called anymore
  976. STMFD R13!,{R14}
  977. LDR R11,[R12,#v.canvas]
  978. MOV R0,#&40404040
  979. MOV R1,R0
  980. MOV R2,R0
  981. MOV R3,R0
  982. MOV R4,R0
  983. MOV R5,R0
  984. MOV R6,R0
  985. MOV R7,R0
  986. MOV R9,#240
  987. .loop3
  988. #rept 10
  989. STMIA R11!,{R0-R7}
  990. #endr
  991. SUBS R9,R9,#1
  992. BGT loop3
  993. LDMFD R13!,{PC}
  994.  
  995. .plotbackdrop
  996. ;overwrites the canvas with the backdrop pattern and the bits of the
  997. ;foreground which have transparency.  It's a bit of black magic,
  998. ;this...
  999. ;A lot more is plotted on top of this backdrop by the sprite plotter
  1000. ;as part of the ProcessTables
  1001. STMFD R13!,{R14}
  1002. MOV R0,#backtab
  1003. SWI Amnesia_WipeTable
  1004. MOV R0,#backtab
  1005. SWI Amnesia_GetTableAddress
  1006. ADD R0,R0,#16
  1007. STR R0,[R12,#v.backtablim]
  1008. ADD R0,R0,#32*backtablen
  1009. SUB R0,R0,#backtablen
  1010. STR R0,[R12,#v.backtabptr]
  1011.  
  1012. LDR R3,[R12,#v.xofs]
  1013. LDR R4,[R12,#v.yofs]
  1014. STR R3,[R12,#v.gminx]
  1015. STR R4,[R12,#v.gminy]
  1016. ADD R0,R3,#320
  1017. STR R0,[R12,#v.gmaxx]
  1018. ADD R0,R4,#192
  1019. STR R0,[R12,#v.gmaxy]
  1020. LDR R0,[R12,#v.gminy]
  1021. STR R0,[R12,#v.gy]
  1022. BL updatescrollinc
  1023. BL makehell
  1024. LDR R10,[R12,#v.canvas]
  1025. .plotbackloop
  1026. BL backreload
  1027.  
  1028. .writeline
  1029. ;outputs one line of graphics to the canvas
  1030. LDR R8,[R12,#v.gy]
  1031. LDR R1,[R12,#v.gmaxy]
  1032. SUB R1,R1,R8
  1033. CMP R1,#32
  1034. MOVGT R1,#32
  1035. STR R1,[R12,#v.gbreak]
  1036. AND R8,R8,#31
  1037. LDR R2,[R12,#v.gminx]
  1038. AND R2,R2,#&1C
  1039. ADR R1,lwtab
  1040. LDR R0,[R1,R2]
  1041. ADD R0,R0,R1
  1042. MOV PC,R0
  1043. .lwtab
  1044. DCD lwloop0-lwtab
  1045. DCD lwloop1-lwtab
  1046. DCD lwloop2-lwtab
  1047. DCD lwloop3-lwtab
  1048. DCD lwloop4-lwtab
  1049. DCD lwloop5-lwtab
  1050. DCD lwloop6-lwtab
  1051. DCD lwloop7-lwtab
  1052.  
  1053. ;each of these routines writes a line fron the sprite file levpix to the
  1054. ;canvas.  lwloop0 is a straight plot, lwloop1 shifts the graphics left 4
  1055. ;pixels, lwloop2 by 8 pixels, etc.  Then .writescreen will take care of
  1056. ;the final 0,1,2 or 3 pixel shift to get the horizontal position right.
  1057.  
  1058. .lwloop0
  1059. ADD R9,R12,#v.backbuf
  1060. #rept 10
  1061. LDR R11,[R9],#4
  1062. ADD R11,R11,R8,LSL #5
  1063. LDMIA R11,{R0-R7}
  1064. STMIA R10!,{R0-R7}
  1065. #endr
  1066. ADD R8,R8,#1
  1067. LDR R1,[R12,#v.gbreak]
  1068. CMP R8,R1
  1069. BLT lwloop0
  1070. B lwins
  1071.  
  1072. .lwloop1
  1073. ADD R9,R12,#v.backbuf
  1074. LDR R11,[R9],#4
  1075. ADD R11,R11,R8,LSL #5
  1076. ADD R11,R11,#4
  1077. LDMIA R11,{R1-R7}
  1078. STMIA R10!,{R1-R7}
  1079. #rept 9
  1080. LDR R11,[R9],#4
  1081. ADD R11,R11,R8,LSL #5
  1082. LDMIA R11,{R0-R7}
  1083. STMIA R10!,{R0-R7}
  1084. #endr
  1085. LDR R11,[R9],#4
  1086. ADD R11,R11,R8,LSL #5
  1087. LDMIA R11,{R0}
  1088. STMIA R10!,{R0}
  1089. ADD R8,R8,#1
  1090. LDR R1,[R12,#v.gbreak]
  1091. CMP R8,R1
  1092. BLT lwloop1
  1093. B lwins
  1094. .lwloop2
  1095. ADD R9,R12,#v.backbuf
  1096. LDR R11,[R9],#4
  1097. ADD R11,R11,R8,LSL #5
  1098. ADD R11,R11,#8
  1099. LDMIA R11,{R2-R7}
  1100. STMIA R10!,{R2-R7}
  1101. #rept 9
  1102. LDR R11,[R9],#4
  1103. ADD R11,R11,R8,LSL #5
  1104. LDMIA R11,{R0-R7}
  1105. STMIA R10!,{R0-R7}
  1106. #endr
  1107. LDR R11,[R9],#4
  1108. ADD R11,R11,R8,LSL #5
  1109. LDMIA R11,{R0-R1}
  1110. STMIA R10!,{R0-R1}
  1111. ADD R8,R8,#1
  1112. LDR R1,[R12,#v.gbreak]
  1113. CMP R8,R1
  1114. BLT lwloop2
  1115. B lwins
  1116. .lwloop3
  1117. ADD R9,R12,#v.backbuf
  1118. LDR R11,[R9],#4
  1119. ADD R11,R11,R8,LSL #5
  1120. ADD R11,R11,#12
  1121. LDMIA R11,{R3-R7}
  1122. STMIA R10!,{R3-R7}
  1123. #rept 9
  1124. LDR R11,[R9],#4
  1125. ADD R11,R11,R8,LSL #5
  1126. LDMIA R11,{R0-R7}
  1127. STMIA R10!,{R0-R7}
  1128. #endr
  1129. LDR R11,[R9],#4
  1130. ADD R11,R11,R8,LSL #5
  1131. LDMIA R11,{R0-R2}
  1132. STMIA R10!,{R0-R2}
  1133. ADD R8,R8,#1
  1134. LDR R1,[R12,#v.gbreak]
  1135. CMP R8,R1
  1136. BLT lwloop3
  1137. B lwins
  1138. .lwloop4
  1139. ADD R9,R12,#v.backbuf
  1140. LDR R11,[R9],#4
  1141. ADD R11,R11,R8,LSL #5
  1142. ADD R11,R11,#16
  1143. LDMIA R11,{R4-R7}
  1144. STMIA R10!,{R4-R7}
  1145. #rept 9
  1146. LDR R11,[R9],#4
  1147. ADD R11,R11,R8,LSL #5
  1148. LDMIA R11,{R0-R7}
  1149. STMIA R10!,{R0-R7}
  1150. #endr
  1151. LDR R11,[R9],#4
  1152. ADD R11,R11,R8,LSL #5
  1153. LDMIA R11,{R0-R3}
  1154. STMIA R10!,{R0-R3}
  1155. ADD R8,R8,#1
  1156. LDR R1,[R12,#v.gbreak]
  1157. CMP R8,R1
  1158. BLT lwloop4
  1159. B lwins
  1160. .lwloop5
  1161. ADD R9,R12,#v.backbuf
  1162. LDR R11,[R9],#4
  1163. ADD R11,R11,R8,LSL #5
  1164. ADD R11,R11,#20
  1165. LDMIA R11,{R5-R7}
  1166. STMIA R10!,{R5-R7}
  1167. #rept 9
  1168. LDR R11,[R9],#4
  1169. ADD R11,R11,R8,LSL #5
  1170. LDMIA R11,{R0-R7}
  1171. STMIA R10!,{R0-R7}
  1172. #endr
  1173. LDR R11,[R9],#4
  1174. ADD R11,R11,R8,LSL #5
  1175. LDMIA R11,{R0-R4}
  1176. STMIA R10!,{R0-R4}
  1177. ADD R8,R8,#1
  1178. LDR R1,[R12,#v.gbreak]
  1179. CMP R8,R1
  1180. BLT lwloop5
  1181. B lwins
  1182. .lwloop6
  1183. ADD R9,R12,#v.backbuf
  1184. LDR R11,[R9],#4
  1185. ADD R11,R11,R8,LSL #5
  1186. ADD R11,R11,#24
  1187. LDMIA R11,{R6-R7}
  1188. STMIA R10!,{R6-R7}
  1189. #rept 9
  1190. LDR R11,[R9],#4
  1191. ADD R11,R11,R8,LSL #5
  1192. LDMIA R11,{R0-R7}
  1193. STMIA R10!,{R0-R7}
  1194. #endr
  1195. LDR R11,[R9],#4
  1196. ADD R11,R11,R8,LSL #5
  1197. LDMIA R11,{R0-R5}
  1198. STMIA R10!,{R0-R5}
  1199. ADD R8,R8,#1
  1200. LDR R1,[R12,#v.gbreak]
  1201. CMP R8,R1
  1202. BLT lwloop6
  1203. B lwins
  1204. .lwloop7
  1205. ADD R9,R12,#v.backbuf
  1206. LDR R11,[R9],#4
  1207. ADD R11,R11,R8,LSL #5
  1208. ADD R11,R11,#28
  1209. LDMIA R11,{R7}
  1210. STMIA R10!,{R7}
  1211. #rept 9
  1212. LDR R11,[R9],#4
  1213. ADD R11,R11,R8,LSL #5
  1214. LDMIA R11,{R0-R7}
  1215. STMIA R10!,{R0-R7}
  1216. #endr
  1217. LDR R11,[R9],#4
  1218. ADD R11,R11,R8,LSL #5
  1219. LDMIA R11,{R0-R6}
  1220. STMIA R10!,{R0-R6}
  1221. ADD R8,R8,#1
  1222. LDR R1,[R12,#v.gbreak]
  1223. CMP R8,R1
  1224. BLT lwloop7
  1225. B lwins
  1226. .lwins
  1227. LDR R8,[R12,#v.gy]
  1228. ADD R8,R8,#32
  1229. BIC R8,R8,#31
  1230. STR R8,[R12,#v.gy]
  1231. LDR R0,[R12,#v.gmaxy]
  1232. CMP R8,R0
  1233. BLT plotbackloop
  1234.  
  1235.  
  1236. LDMFD R13!,{PC}
  1237.  
  1238.  
  1239.  
  1240. .backreload
  1241. ;get the next line of blocks from the leveldata, so we know what to
  1242. ;plot where.  We scan from right to left.
  1243. STMFD R13!,{R8-R11,R14}
  1244. LDR R5,[R12,#v.netxsize]
  1245. LDR R6,[R12,#v.netysize]
  1246. LDR R3,[R12,#v.gmaxx]
  1247. LDR R7,[R12,#v.gminx]
  1248. LDR R4,[R12,#v.gy]
  1249. MOV R3,R3,ASR #5
  1250. MOV R4,R4,ASR #5
  1251. MOV R7,R7,ASR #5
  1252. ADD R9,R12,#v.backbuf
  1253. SUB R9,R9,#4
  1254. ADD R11,R12,#v.backtab
  1255. MOV R8,#12
  1256. ADD R9,R9,R8,LSL #2
  1257. .loop5
  1258. CMP R3,#0
  1259. BLT backreloff
  1260. CMP R4,#0
  1261. BLT backreloff
  1262. CMP R3,R5
  1263. BGE backreloff
  1264. CMP R4,R6
  1265. BGE backreloff
  1266.  
  1267. LDR R10,[R12,#v.leveldata]
  1268. CMP R10,#0
  1269. BEQ backreloff
  1270. MUL R2,R4,R5
  1271. ADD R10,R10,R3
  1272. ADD R10,R10,R2
  1273.  
  1274. LDRB R0,[R10]
  1275. B backrelins
  1276. .backreloff
  1277. MOV R0,#128
  1278. .backrelins
  1279. AND R0,R0,#&FF
  1280. LDR R2,[R12,#v.bmogtabadr]
  1281. LDR R1,[R2,R0,LSL #2]
  1282. CMP R1,#0
  1283. BEQ nobmogentry
  1284. ADD R1,R1,R2
  1285. LDR R0,[R1,#bmog.pix]
  1286.  
  1287. LDR R2,[R1,#bmog.objflags]
  1288. CMP R2,#0
  1289. BLNE bmoggen
  1290. .nobmogentry
  1291. CMP R0,#0
  1292. BNE backnotrans
  1293. ADD R0,R3,#24
  1294. rem3 R0
  1295. ADD R1,R4,#24
  1296. rem3 R1
  1297. CMP R0,#3
  1298. CMPLT R1,#4
  1299. MOVGE PC,#0
  1300. ADD R0,R0,R0,LSL #1
  1301. ADD R0,R0,R1
  1302.  
  1303. .backnotrans
  1304. LDR R1,[R11,R0,LSL #2]
  1305. STR R1,[R9,#-4]!
  1306. SUBS R8,R8,#1
  1307. BLE backrelerr
  1308. SUB R3,R3,#1
  1309. CMP R3,R7
  1310. BGE loop5
  1311. LDMFD R13!,{R8-R11,PC}
  1312.  
  1313. .bmoggen
  1314. ; the object generator.  Makes all of the objects associated with the
  1315. ; backdrop.  Uses the BMOG table.
  1316. ;bits:
  1317. ;1<<31 - plot always
  1318. ;1<<30 - use the timer
  1319. ;1<<29 }-perimeter check to left,right,up or down (0,1,2, or 3<<28)
  1320. ;1<<28 }
  1321. ;1<<27 - don't make if greater than
  1322. ;1<<26 - don't make if less than
  1323. ;1<<25 - don't make if not equal
  1324. ;1<<24 - don't make if equal to objdata
  1325. ;1<<23 - make object if nutted type 2
  1326. ;1<<22 - make object if nutted type 1
  1327.  
  1328. STMFD R13!,{R0-R11,R14}
  1329. ADD R11,R1,#bmog.objflags
  1330. .bmoggenloop
  1331. LDR R8,[R11]
  1332. LDR R9,[R11,#4]
  1333. TST R8,#1<<30
  1334. BNE bmogtimed
  1335. .bmogtimedins
  1336. TST R8,#1<<31
  1337. BNE dobmoggen
  1338. TST R8,#&F<<24
  1339. BEQ bmognoperim
  1340. ;If you think about it, the 3D bits of the platforms may or may not need
  1341. ;to be plotted, depending on what's around them.  This routine checks
  1342. ;the perimeter against the flag entry in the BMOG table.
  1343. BL bmoggetperim
  1344. AND R0,R8,#3<<28
  1345. MOV R1,#0
  1346. CMP R0,#0
  1347. LDREQ R1,[R12,#v.bleft]
  1348. CMP R0,#1<<28
  1349. LDREQ R1,[R12,#v.bright]
  1350. CMP R0,#2<<28
  1351. LDREQ R1,[R12,#v.bup]
  1352. CMP R0,#3<<28
  1353. LDREQ R1,[R12,#v.bdown]
  1354. CMP R1,#0
  1355. BEQ bmognoperim
  1356. LDRB R2,[R1]
  1357. TST R8,#1<<24
  1358. BLNE bmognotifequal
  1359. TST R8,#1<<25
  1360. BLNE bmogifequal
  1361. TST R8,#1<<26
  1362. BLNE bmognotiflt
  1363. TST R8,#1<<27
  1364. BLNE bmognotifgt
  1365. B bmognoperim
  1366. .bmognotifequal
  1367. CMP R2,R9
  1368. BEQ bmoggenend
  1369. MOV PC,R14
  1370. .bmogifequal
  1371. CMP R2,R9
  1372. BNE bmoggenend
  1373. MOV PC,R14
  1374. .bmognotiflt
  1375. CMP R2,R9
  1376. BLT bmoggenend
  1377. MOV PC,R14
  1378. .bmognotifgt
  1379. CMP R2,R9
  1380. BGT bmoggenend
  1381. MOV PC,R14
  1382.  
  1383. .bmogtimed
  1384. LDR R0,[R12,#v.timer]
  1385. TST R0,R9
  1386. BEQ bmogtimedins
  1387. B bmoggenend
  1388.  
  1389. .bmognoperim
  1390. TST R8,#3<<22
  1391. BEQ bmognonut
  1392. LDR R0,[R12,#v.nutbmog]
  1393. CMP R0,R10
  1394. BNE bmoggenend
  1395. .bmognonut
  1396.  
  1397. .dobmoggen
  1398. backtransdata R10
  1399. MOV R8,R0
  1400. MOV R9,R1
  1401.  
  1402. ADD R11,R11,#8
  1403. LDMIA R11,{R0-R7}
  1404. SUB R11,R11,#8
  1405. ADD R3,R3,R8
  1406. ADD R4,R4,R9
  1407. ;CMP R3,#&900<<12
  1408. ;MOVGT PC,#0
  1409. ;CMP R4,#&900<<12
  1410. ;MOVGT PC,#0
  1411. ;CMP R3,#0
  1412. ;MOVLT PC,#0
  1413. ;CMP R4,#0
  1414. ;MOVLT PC,#0
  1415.  
  1416. CMP R0,#backtab
  1417. BNE bmogrealmake
  1418. ;this bit fakes a MakeObject in a faster way
  1419. LDR R8,[R12,#v.backtabptr]
  1420. LDR R9,[R12,#v.backtablim]
  1421. SUB R8,R8,#32
  1422. CMP R8,R9
  1423. BLT bmogfull
  1424. STMIA R8,{R1-R7}
  1425. STR R8,[R12,#v.backtabptr]
  1426. .bmogfull
  1427. .bmoggenend
  1428. ADD R11,R11,#sizeof_bmog
  1429. LDR R0,[R11]
  1430. CMP R0,#0
  1431. BNE bmoggenloop
  1432. .bmoggenexit
  1433. LDMFD R13!,{R0-R11,PC}
  1434. .bmogrealmake
  1435. STMFD R13!,{R0}
  1436. SWI Amnesia_MakeObject
  1437. LDMFD R13!,{R0}
  1438. CMP R0,#specialtab
  1439. BNE bmoggenend
  1440. CMP R1,#0
  1441. BEQ bmoggenend
  1442. LDR R0,[R11,#32+8]
  1443. STR R0,[R1,#32]
  1444. B bmoggenend
  1445.  
  1446. .bmoggetperim
  1447. STMFD R13!,{R5-R6,R14}
  1448. LDR R5,[R12,#v.netxsize]
  1449. LDR R6,[R12,#v.netysize]
  1450. CMP R3,#0
  1451. MOVLE R0,#0
  1452. SUBGT R0,R10,#1
  1453. STR R0,[R12,#v.bleft]
  1454.  
  1455. CMP R3,R5
  1456. MOVGE R0,#0
  1457. ADDLT R0,R10,#1
  1458. STR R0,[R12,#v.bright]
  1459.  
  1460. CMP R4,#0
  1461. MOVLE R0,#0
  1462. SUBGT R0,R10,R5
  1463. STR R0,[R12,#v.bup]
  1464.  
  1465. CMP R4,R6
  1466. MOVGE R0,#0
  1467. ADDLT R0,R10,R5
  1468. STR R0,[R12,#v.bdown]
  1469. LDMFD R13!,{R5-R6,PC}
  1470.  
  1471.  
  1472.  
  1473.  
  1474. .makehell
  1475. ;'hell' is the backdrop behind the platforms.  This routine sets up
  1476. ;blocks with the right amount of shifting so that the parallax works.
  1477. STMFD R13!,{R14}
  1478. ADD R11,R12,#v.backpixtab
  1479. LDR R11,[R11]
  1480. ADD R0,R11,#96*96
  1481. STR R0,[R12,#v.hellend]
  1482. LDR R0,[R12,#v.vscrollinc]
  1483. MOV R1,#96
  1484. MUL R0,R1,R0
  1485. ADD R11,R11,R0
  1486.  
  1487. LDR R10,[R12,#v.hellcache]
  1488. MOV R8,#96
  1489. .loopd
  1490. LDR R9,[R12,#v.hscrollinc]
  1491. AND R0,R9,#3
  1492. BIC R9,R9,#3
  1493. ADR R1,hellshift
  1494. LDR R0,[R1,R0,LSL #2]
  1495. ADD R1,R1,R0
  1496. STMFD R13!,{R8-R11}
  1497. ADD R10,R12,#v.linecache
  1498. MOV R14,PC
  1499. MOV PC,R1
  1500. LDMFD R13!,{R8-R11}
  1501.  
  1502. ADD R9,R12,#v.linecache
  1503. LDMIA R9!,{R0-R7}
  1504. STMIA R10,{R0-R7}
  1505. ADD R10,R10,#32*96
  1506. LDMIA R9!,{R0-R7}
  1507. STMIA R10,{R0-R7}
  1508. ADD R10,R10,#32*96
  1509. LDMIA R9!,{R0-R7}
  1510. STMIA R10,{R0-R7}
  1511. SUB R10,R10,#64*96
  1512. ADD R10,R10,#32
  1513. ADD R11,R11,#96
  1514. LDR R0,[R12,#v.hellend]
  1515. CMP R11,R0
  1516. SUBGE R11,R11,#96*96
  1517. SUBS R8,R8,#1
  1518. BGT loopd
  1519. LDMFD R13!,{PC}
  1520.  
  1521. .updatescrollinc
  1522. ;updates the scrollincs to make the parallax look effective.  You can get
  1523. ;some strange effects if you mess about with this!
  1524. STMFD R13!,{R14}
  1525. MOV R3,#0
  1526. LDR R1,[R12,#v.xofs]
  1527. CMP R1,#0
  1528. RSBLT R1,R1,#0
  1529. MOVLT R3,#1
  1530. SUB R1,R1,R1,ASR #1
  1531. DIV96 R0,R1
  1532. MOV R2,#96
  1533. CMP R3,#1
  1534. RSBNE R1,R1,#95
  1535. STR R1,[R12,#v.hscrollinc]
  1536. MOV R3,#0
  1537. LDR R1,[R12,#v.yofs]
  1538. CMP R1,#0
  1539. RSBLT R1,R1,#0
  1540. MOVLT R3,#1
  1541. SUB R1,R1,R1,ASR #1
  1542. DIV96 R0,R1
  1543. MOV R2,#96
  1544. CMP R3,#1
  1545. RSBNE R1,R1,#95
  1546. STR R1,[R12,#v.vscrollinc]
  1547. LDMFD R13!,{PC}
  1548.  
  1549. .vetlevel
  1550. ;checks that a level is OK and sets up values such as its size.  The level
  1551. ;file at [R12,#v.leveladr] is a 256 colour sprite.  the variable leveldata
  1552. ;is set to point to the sprite data.
  1553.  
  1554. STMFD R13!,{R14}
  1555. LDR R11,[R12,#v.leveladr]
  1556. CMP R11,#0
  1557. BEQ vetlevelerr
  1558. SUB R11,R11,#4
  1559. LDR R1,[R11,#8]
  1560. CMP R1,#128
  1561. BGT vetlevelerr
  1562. CMP R1,#0
  1563. BLT vetlevelerr
  1564. ADD R11,R11,R1;indirect to first sprite
  1565. LDR R0,[R11,#16];level width in words -1
  1566. ADD R0,R0,#1
  1567. MOV R0,R0,LSL #2
  1568. STR R0,[R12,#v.netxsize]
  1569. LDR R0,[R11,#20];level height -1
  1570. ADD R0,R0,#1
  1571. STR R0,[R12,#v.netysize]
  1572. LDR R0,[R11,#32];indirect to sprite data
  1573. ADD R11,R11,R0
  1574. STR R11,[R12,#v.leveldata]
  1575.  
  1576. ADD R0,R12,#v.levelnet
  1577. BL checkdiscard
  1578. LDR R0,[R12,#v.netxsize]
  1579. LDR R1,[R12,#v.netysize]
  1580. MUL R1,R0,R1
  1581. MOV R1,R1,LSL #4;multiply by 16
  1582. ADD R0,R12,#v.levelnet
  1583. ADR R2,levelnetname
  1584. MOV R3,#0
  1585. SWI Amnesia_ClaimBlock
  1586. BL buildlevelnet
  1587.  
  1588. LDR R0,[R12,#v.netxsize]
  1589. MOV R1,#0
  1590. CMP R0,#16
  1591. MOVEQ R1,#4
  1592. CMP R0,#32
  1593. MOVEQ R1,#5
  1594. CMP R0,#64
  1595. MOVEQ R1,#6
  1596. CMP R0,#128
  1597. MOVEQ R1,#7
  1598. CMP R0,#256
  1599. MOVEQ R1,#8
  1600. CMP R1,#0
  1601. BEQ netwidtherr
  1602. STR R1,[R12,#v.levelshift]
  1603. LDR R7,[R12,#v.levelshift]
  1604. LDR R8,[R12,#v.netysize]
  1605. LDR R9,[R12,#v.netysize]
  1606. LDR R10,[R12,#v.leveldata]
  1607. MOV R6,#0
  1608. .loop10
  1609. MOV R5,#0
  1610. .loop11
  1611. ADD R4,R5,R6,LSL R7
  1612. ADD R4,R4,R10
  1613. LDRB R0,[R4]
  1614. CMP R0,#255
  1615. BLEQ foundstart
  1616. ADD R5,R5,#1
  1617. CMP R5,R8
  1618. BLT loop11
  1619. ADD R6,R6,#1
  1620. CMP R6,R9
  1621. BLT loop10
  1622. LDMFD R13!,{PC}
  1623.  
  1624. .foundstart
  1625. ;the player start position is marked by colour 255 in the level sprite
  1626. STMFD R13!,{R5-R10,R14}
  1627. MOV R0,#0
  1628. STRB R0,[R4]
  1629. backtransdata R4
  1630. STR R0,[R12,#v.startxpos]
  1631. STR R1,[R12,#v.startypos]
  1632. LDMFD R13!,{R5-R10,PC}
  1633.  
  1634.  
  1635. .levelnetname
  1636. DCB "LevelNet",0
  1637. ALIGN
  1638.  
  1639. .buildlevelnet
  1640. ;The level data is stored in 2 bits.  The bit at leveldata is the sprite
  1641. ;as loaded, and contains the graphics data.  Let's say for example it's
  1642. ;32x32.  The 'levelnet' is built from this sprite by looking at the
  1643. ;micronets in the BMOG table, and is 4 times as dense (128x128 in the
  1644. ;example case).  The levelnet is used for collision checking and to
  1645. ;work the explosions.
  1646.  
  1647. STMFD R13!,{R14}
  1648. MOV R9,#0;y coord
  1649.  
  1650. .loop9
  1651. LDR R0,[R12,#v.netysize]
  1652. CMP R9,R0
  1653. BGE done9
  1654. MOV R8,#0;x coord in net data
  1655. .loop8
  1656. LDR R0,[R12,#v.netxsize]
  1657. CMP R8,R0
  1658. BGE done8
  1659. LDR R11,[R12,#v.leveldata]
  1660. ADD R11,R11,R8;move x
  1661. LDR R0,[R12,#v.netxsize]
  1662. MUL R0,R9,R0
  1663. ADD R11,R11,R0;move y
  1664.  
  1665. LDR R10,[R12,#v.levelnet]
  1666. ADD R10,R10,R8,LSL #2
  1667. LDR R0,[R12,#v.netxsize]
  1668. MUL R0,R9,R0
  1669. ADD R10,R10,R0,LSL #4
  1670.  
  1671. ;R11 points to leveldata point
  1672. ;R10 points to levelnet point
  1673.  
  1674. LDRB R4,[R11]
  1675. LDR R5,[R12,#v.bmogtabadr]
  1676. LDR R6,[R5,R4,LSL #2];get bmogtable entry
  1677. MOV R0,#1
  1678. MOV R1,#2
  1679. MOV R2,#3
  1680. MOV R3,#4
  1681.  
  1682. CMP R6,#0
  1683. ADDNE R5,R5,R6;get entry address
  1684. LDRNE R0,[R5,#bmog.micronet0]
  1685. LDRNE R1,[R5,#bmog.micronet1]
  1686. LDRNE R2,[R5,#bmog.micronet2]
  1687. LDRNE R3,[R5,#bmog.micronet3]
  1688.  
  1689. LDR R6,[R12,#v.netxsize]
  1690. STR R0,[R10],R6,LSL #netshift
  1691. STR R1,[R10],R6,LSL #netshift
  1692. STR R2,[R10],R6,LSL #netshift
  1693. STR R3,[R10],R6,LSL #netshift
  1694. ADD R8,R8,#1
  1695. B loop8
  1696. .done8
  1697. ADD R9,R9,#1
  1698. B loop9
  1699. .done9
  1700. LDMFD R13!,{PC}
  1701.  
  1702.  
  1703.  
  1704. .exit
  1705. LDMVSFD R13!,{PC}
  1706. LDR R1,[R12,#v.basicstack]
  1707. CMP R1,R13
  1708. BNE stackerr
  1709. LDMFD R13!,{PC}
  1710.  
  1711. .setup
  1712. ;claim all the blocks and tables...
  1713. STMFD R13!,{R14}
  1714. ADD R0,R12,#v.canvas
  1715. MOV R1,#320*256
  1716. ADR R2,canvasname
  1717. MOV R3,#0
  1718. SWI Amnesia_ClaimBlock
  1719.  
  1720. ADD R0,R12,#v.hellcache
  1721. MOV R1,#32*32*18
  1722. ADR R2,hellcachename
  1723. MOV R3,#0
  1724. SWI Amnesia_ClaimBlock
  1725.  
  1726. ADD R0,R12,#v.explomap1
  1727. MOV R1,#explomaplen*4
  1728. ADR R2,explomapname
  1729. MOV R3,#0
  1730. SWI Amnesia_ClaimBlock
  1731.  
  1732. ADD R0,R12,#v.explomap2
  1733. MOV R1,#explomaplen*4
  1734. ADR R2,explomapname
  1735. MOV R3,#0
  1736. SWI Amnesia_ClaimBlock
  1737.  
  1738. MOV R0,#mastertab
  1739. MOV R1,#1
  1740. ADR R2,mastertabname
  1741. MOV R3,#2
  1742. MOV R4,#32
  1743. SWI Amnesia_ClaimTable
  1744.  
  1745. MOV R0,#backtab
  1746. MOV R1,#0
  1747. ADR R2,backtabname
  1748. MOV R3,#backtablen
  1749. MOV R4,#32
  1750. SWI Amnesia_ClaimTable
  1751.  
  1752. MOV R0,#explotab
  1753. MOV R1,#0
  1754. ADR R2,explotabname
  1755. MOV R3,#256
  1756. MOV R4,#32
  1757. SWI Amnesia_ClaimTable
  1758.  
  1759. MOV R0,#bultab
  1760. MOV R1,#1
  1761. ADR R2,bultabname
  1762. MOV R3,#256
  1763. MOV R4,#32
  1764. SWI Amnesia_ClaimTable
  1765.  
  1766. MOV R0,#specialtab
  1767. MOV R1,#1
  1768. ADR R2,specialtabname
  1769. MOV R3,#64
  1770. MOV R4,#36
  1771. SWI Amnesia_ClaimTable
  1772.  
  1773. MOV R0,#-1
  1774. STR R0,[R12,#v.loadedmaster]
  1775. STR R0,[R12,#v.loadedbackdrop]
  1776. STR R0,[R12,#v.loadedmode]
  1777. STR R0,[R12,#v.loadedlevel]
  1778. STR R0,[R12,#v.loadedbackpix]
  1779. STR R0,[R12,#v.loadeddalek]
  1780. STR R0,[R12,#v.loadedspecial]
  1781. STR R0,[R12,#v.nutbmog]
  1782. MOV R0,#13
  1783. STR R0,[R12,#v.mode]
  1784. BL setupexplomap
  1785. LDMFD R13!,{PC}
  1786. .canvasname
  1787. DCB "Canvas",0
  1788. .hellcachename
  1789. DCB "HelCache",0
  1790. .mastertabname
  1791. DCB "Master",0
  1792. .backtabname
  1793. DCB "Back",0
  1794. .explotabname
  1795. DCB "Explo",0
  1796. .bultabname
  1797. DCB "Bullets",0
  1798. .specialtabname
  1799. DCB "Special",0
  1800. .explomapname
  1801. DCB "ExploMap",0
  1802. ALIGN
  1803.  
  1804.  
  1805.  
  1806. .setupcanvas
  1807. ;tell FastSpr to write to our canvas, not the screen
  1808. STMFD R13!,{R14}
  1809. LDR R0,[R12,#v.canvas]
  1810. SWI FastSpr_ScreenBank
  1811. MOV R0,#0
  1812. MOV R1,#0
  1813. MOV R2,#320
  1814. MOV R3,#192
  1815. SWI FastSpr_SetClipWindow
  1816. LDMFD R13!,{PC}
  1817.  
  1818. .setupscreen
  1819. ;tell FastSpr to write to the screen
  1820. STMFD R13!,{R14}
  1821. MOV R0,#0
  1822. SWI FastSpr_ScreenBank
  1823. MOV R0,#0
  1824. MOV R1,#0
  1825. MOV R2,#320
  1826. MOV R3,#240
  1827. SWI FastSpr_SetClipWindow
  1828. LDMFD R13!,{PC}
  1829.  
  1830. .setupmaster
  1831. ;set up the player stuff
  1832. STMFD R13!,{R14}
  1833. MOV R0,#1
  1834. STR R0,[R12,#v.master]
  1835. LDR R0,[R12,#v.startxpos]
  1836. STR R0,[R12,#v.plxpos]
  1837. LDR R0,[R12,#v.startypos]
  1838. STR R0,[R12,#v.plypos]
  1839. MOV R0,#-1
  1840. STR R0,[R12,#v.weptimer]
  1841. MOV R0,#0
  1842. STR R0,[R12,#v.weptype]
  1843. MOV R0,#8
  1844. STR R0,[R12,#v.health]
  1845. MOV R0,#-1
  1846. STR R0,[R12,#v.lasthealth]
  1847. MOV R0,#mastertab
  1848. SWI Amnesia_WipeTable
  1849. BL makemaster
  1850. LDMFD R13!,{PC}
  1851.  
  1852. .setupexplomap
  1853. ;wipe the explosion map
  1854. LDR R1,[R12,#v.explomap1]
  1855. MOV R0,#0
  1856. MOV R2,#explomaplen
  1857. .loopc
  1858. STR R0,[R1],#4
  1859. SUBS R2,R2,#1
  1860. BGT loopc
  1861. LDR R1,[R12,#v.explomap2]
  1862. MOV R0,#0
  1863. MOV R2,#explomaplen
  1864. .loopf
  1865. STR R0,[R1],#4
  1866. SUBS R2,R2,#1
  1867. BGT loopf
  1868. MOV R0,#0
  1869. STR R0,[R12,#v.exploptr]
  1870. STR R0,[R12,#v.explomap]
  1871. MOV PC,R14
  1872.  
  1873.  
  1874. .checkdiscard
  1875. STMFD R13!,{R0-R1,R14}
  1876. MOV R1,R0
  1877. LDR R0,[R0]
  1878. CMP R0,#0
  1879. SWINE Amnesia_ReleaseBlock
  1880. MOV R0,#0
  1881. STR R0,[R1]
  1882. LDMFD R13!,{R0-R1,PC}
  1883.  
  1884. .varsname
  1885. DCB "Vars",0
  1886. ALIGN
  1887. .setupvars
  1888. ;claims block of memory for the game variables and points R12 to it.
  1889. ;R12 never changes after this.
  1890. STMFD R13!,{R14}
  1891. MOV R0,#0
  1892. MOV R1,#v.sizeof
  1893. ADR R2,varsname
  1894. MOV R3,#1; static
  1895. SWI XAmnesia_ClaimBlock
  1896. BVS nomemoryerr
  1897. MOV R12,R0
  1898. MOV R0,#0
  1899. STR R0,[R12,#v.backdrop]
  1900. STR R0,[R12,#v.levelnet]
  1901. SWI OS_ReadMonotonicTime
  1902. STR R0,[R12,#v.rnseed]
  1903. LDMFD R13!,{PC}
  1904. ;Good grief! Error handling.
  1905. .err
  1906. LDR R13,[R12,#v.basicstack]
  1907. .earlyerr
  1908. LDMFD R13!,{R14}
  1909. ORR R14,R14,#1<<28
  1910. MOVS PC,R14
  1911. .nomemoryerr
  1912. ADR R0,nomemorytext
  1913. B earlyerr
  1914. .nomemorytext
  1915. DCD &666001
  1916. DCB "Insufficient memory in Amnesia area",0
  1917. ALIGN
  1918. .stackerr
  1919. ADR R0,stackerrtext
  1920. B err
  1921. .stackerrtext
  1922. DCD &666002
  1923. DCB "Stack mismatch on exit",0
  1924. ALIGN
  1925. .backrelerr
  1926. ADR R0,backrelerrtext
  1927. B err
  1928. .backrelerrtext
  1929. DCD &666
  1930. DCB "Back reload error",0
  1931. ALIGN
  1932. .netwidtherr
  1933. ADR R0,netwidtherrtext
  1934. B err
  1935. .netwidtherrtext
  1936. DCD &666
  1937. DCB "Unsupported level net width.  use 16,32,64,128 or 256.",0
  1938. ALIGN
  1939. .vetlevelerr
  1940. ADR R0,vetlevelerrtext
  1941. B err
  1942. .vetlevelerrtext
  1943. DCD &666
  1944. DCB "Failed to vet level file",0
  1945. ALIGN
  1946. ;These include the precopiled bits in the 'Objects' directory, which
  1947. ;are created from the files in the 'Sources' directory.
  1948. .getfiles
  1949. STMFD R13!,{R14}
  1950. INCBIN "<Bolmaster$Path>Object.GetFiles"
  1951. LDMFD R13!,{PC}
  1952.  
  1953. .sortscreen
  1954. STMFD R13!,{R14}
  1955. INCBIN "<Bolmaster$Path>Object.SortScreen"
  1956. LDMFD R13!,{PC}
  1957.  
  1958. .readback
  1959. STMFD R13!,{R14}
  1960. INCBIN "<Bolmaster$Path>Object.ReadBack"
  1961. LDMFD R13!,{PC}
  1962.  
  1963. .hellshift
  1964. INCBIN "<Bolmaster$Path>Object.HellShift"
  1965.  
  1966. .bcheck
  1967. INCBIN "<Bolmaster$Path>Object.BCheck"
  1968.  
  1969.