home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / Blitz / BlzSource
Encoding:
Text File  |  1995-08-06  |  7.3 KB  |  539 lines

  1.  
  2. ;This is the Oddball version of Blitz.
  3.  
  4. #name Blitz
  5. #type &ffa
  6. #base 0
  7.  
  8. #set Service_Error        = &06
  9. #set Service_PreModeChange    = &4D
  10. #set Service_PreReset        = &45
  11.  
  12.  
  13. struct v {
  14.   .tickerctr    DCD 0
  15.   .prevctr    DCD 0
  16.   .waitcall    DCD 0
  17.   .workspace    DCD 0
  18.   .sizeof
  19. }
  20.  
  21. DCD 0
  22. DCD init
  23. DCD final
  24. DCD 0 ;service
  25. DCD title
  26. DCD help
  27. DCD commandtable
  28. DCD &49640
  29. DCD swicode
  30. DCD switab
  31. DCD 0
  32. .title
  33. DCB "Blitz",0
  34. .help
  35. DCB "Blitz        1.01 (01 Dec 1994) - OddBall",0
  36. ALIGN
  37. .commandtable
  38. DCB "Blitz",0
  39. ALIGN
  40. DCD 0
  41. DCD 0
  42. DCD 0
  43. DCD blitzhelp
  44.  
  45. DCD 0; *** END Marker ***
  46. .blitzhelp
  47. DCB 27,0,"This particular Blitz decompresses files in Hammer format and provides a timed waiting facility.",10,13
  48. DCB "© A.Southgate 1994",0
  49. ALIGN
  50.  
  51. .switab
  52. DCB "Blitz",0
  53. DCB "Wait",0
  54. DCB "Time",0
  55. DCB "SetTime",0
  56. DCB "WaitCall",0
  57. DCB "Spare1",0
  58. DCB "HammerOp",0
  59. DCB 0 ;*** END MARKER ***
  60. ALIGN
  61. .swicode
  62. LDR R12,[R12]
  63. CMP R11,#0
  64. BEQ waitswi
  65. CMP R11,#1
  66. BEQ timeswi
  67. CMP R11,#2
  68. BEQ settimeswi
  69. CMP R11,#5
  70. BEQ hammeropswi
  71. B unknownswierr
  72. LDMFD R13!,{PC}
  73.  
  74. .claimticker
  75. STMFD R13!,{R14}
  76. MOV R0,#&1C
  77. ADR R1,ticker
  78. MOV R2,R12
  79. SWI OS_Claim
  80. LDMFD R13!,{PC}
  81.  
  82. .releaseticker
  83. STMFD R13!,{R14}
  84. MOV R0,#&1C
  85. ADR R1,ticker
  86. MOV R2,R12
  87. SWI OS_Release
  88. LDMFD R13!,{PC}
  89.  
  90. .ticker
  91. STMFD R13!,{R0}
  92. LDR R0,[R12,#v.tickerctr]
  93. ADD R0,R0,#1
  94. STR R0,[R12,#v.tickerctr]
  95. LDR R0,[R12,#v.waitcall]
  96. CMP R0,#0
  97. LDMFD R13!,{R0}
  98. BNE dowaitcall
  99. MOVS PC,R14
  100.  
  101. .dowaitcall
  102. STMFD R13!,{R0-R1,R14}
  103. MOV R0,PC
  104. ORR R1,R0,#3
  105. TEQP R1,#0  ;switch to SVC
  106. MOV R0,R0
  107. STMFD R13!,{R0-R12,R14}
  108. LDR R1,[R12,#v.waitcall]
  109. MOV R0,#0
  110. STR R0,[R12,#v.waitcall]
  111. LDR R12,[R12,#v.workspace]
  112. MOV R14,PC
  113. MOV PC,R1
  114. LDMFD R13!,{R0-R12,R14}
  115. TEQP R0,#0  ;switch back to whatever
  116. MOV R0,R0
  117. LDMFD R13!,{R0-R1,PC}
  118.  
  119. .timeswi
  120. STMFD R13!,{R1,R14}
  121. LDR R0,[R12,#v.prevctr]
  122. LDR R1,[R12,#v.tickerctr]
  123. SUB R0,R1,R0
  124. LDMFD R13!,{R1,PC}
  125.  
  126. .settimeswi
  127. STMFD R13!,{R1,R14}
  128. LDR R1,[R12,#v.tickerctr]
  129. SUB R1,R1,R0
  130. STR R1,[R12,#v.prevctr]
  131. LDMFD R13!,{R1,PC}
  132.  
  133. .waitswi
  134. STMFD R13!,{R2,R14}
  135. LDR R1,[R12,#v.prevctr]
  136. ADD R1,R1,R0
  137. LDR R0,[R12,#v.tickerctr]
  138. SUB R2,R1,R0
  139. CMP R0,R1
  140. ADDGE R1,R0,#1
  141. MOV R3,#1<<24
  142. .waitloop
  143. SUBS R3,R3,#1
  144. BLT toolong
  145. LDR R0,[R12,#v.tickerctr]
  146. CMP R0,R1
  147. BLT waitloop
  148. LDR R1,[R12,#v.prevctr]
  149. STR R0,[R12,#v.prevctr]
  150. SUB R0,R0,R1
  151. MOV R1,R2
  152. LDMFD R13!,{R2,PC}
  153.  
  154. .toolong
  155. LDMFD R13!,{R2,R14}
  156. B toolongerr
  157.  
  158. .waitcall
  159. STR R0,[R12,#v.waitcall]
  160. STR R1,[R12,#v.workspace]
  161. MOV PC,R14
  162.  
  163. .removewaitcall
  164. STMFD R13!,{R14}
  165. MOV R0,#0
  166. STR R0,[R12,#v.waitcall]
  167. LDMFD R13!,{PC}
  168.  
  169.  
  170.  
  171. .hammeropswi
  172. ;on entry
  173. ;R0 = op type (0-size, 1-load, 2-ofs size, 3-ofs load)
  174. ;R1=filename
  175. ;R2=pathname
  176. ;R4=offset (if 2 or 3)
  177. ;on exit
  178. ;R0 corrupted
  179. ;R1,R2 preserved
  180. ;R3 = file length or 0 if not a hammer file
  181. TST R0,#4
  182. BNE hammerfind
  183. TST R0,#1
  184. BNE hammerload
  185.  
  186. .hammersize
  187. STMFD R13!,{R1-R2,R4-R7,R14}
  188. MOV R7,R1
  189. BL openfile
  190. LDMVSFD R13!,{R1-R2,R4-R7,PC}
  191. MOV R3,#0
  192. BL getword
  193. LDMCSFD R13!,{R1-R2,R4-R7,R14}
  194. BCS fileerr
  195. MOV R1,R0
  196. BL getword
  197. LDMCSFD R13!,{R1-R2,R4-R7,R14}
  198. BCS fileerr
  199. BL closefile
  200. BIC R1,R1,#&FFFF<<16
  201. LDR R2,hamidcode
  202. CMP R1,R2
  203. MOV R3,R0
  204. MOVNE R3,#0
  205. LDMFD R13!,{R1-R2,R4-R7,PC}  ;drops through via R3
  206. .hamidcode
  207. DCB "Hm",0,0
  208.  
  209. ;HammerOp 6
  210. ;R0=6
  211. ;R1=filename
  212. ;R2=pathname
  213. ;R4=offset into file
  214. ;returns
  215. ;R1,R2 as above
  216. ;R4 offset to file in question
  217. ;can be passed to HammerOp 2
  218.  
  219. .hammerfind
  220. STMFD R13!,{R1-R2,R5-R7,R14}
  221. BL openfile
  222. LDMVSFD R13!,{R1-R2,R5-R7,PC}
  223. BL getword
  224. LDMCSFD R13!,{R1-R2,R5-R7,R14}
  225. BCS fileerr
  226. BL closefile
  227. MOV R4,R0
  228. LDMFD R13!,{R1-R2,R5-R7,PC}
  229.  
  230. .hammerload
  231. ;R0=1 or 3
  232. ;R1=filename
  233. ;R2=pathname
  234. ;R3=load address
  235. ;R4=offset (if 3)
  236.  
  237. STMFD R13!,{R3-R11,R14}
  238. MOV R10,R3
  239. BL openfile
  240. LDMVSFD R13!,{R3-R11,PC}
  241. BL getword
  242. MOV R7,R0
  243. BL getword
  244. ADD R0,R0,#3
  245. BIC R0,R0,#3
  246. MOV R9,R0
  247. MOV R8,R0  ;used as a constant
  248. ADD R9,R10,R9; R9 is the end limit marker
  249. TST R7,#1<<24
  250. MOV R7,R10
  251. MOVEQ R7,#0
  252. SUB R10,R10,#1; align for putbyte
  253. SUB R9,R9,#1  ; likewise
  254. .loop1
  255. BL getbyte
  256. CMP R0,#&10
  257. BLT type1
  258. CMP R0,#&20
  259. BLT type2
  260. CMP R0,#&40
  261. BLT type3
  262. CMP R0,#&80
  263. BLT type4
  264. ;drops through
  265. .type5
  266. CMP R0,#&FF
  267. BEQ overrunerr
  268. MOV R1,R0
  269. BL getbyte
  270. AND R2,R1,#&78
  271. MOV R2,R2,LSR #3
  272. ADD R2,R2,#2
  273. AND R3,R1,#&7
  274. ADD R3,R0,R3,LSL #8
  275. SUB R3,R10,R3
  276. .loop7
  277. MOV R0,R3
  278. BL translate
  279. LDRB R0,[R0]
  280. BL putbyte
  281. ADD R3,R3,#1
  282. SUBS R2,R2,#1
  283. BGT loop7
  284. .typeins
  285. CMP R10,R9
  286. BLT loop1
  287. BLNE inconserr
  288. BL getbyte
  289. CMP R0,#&FF
  290. LDMNEFD R13!,{R3-R11,R14}
  291. BNE underrunerr
  292. .decompend
  293. BL closefile
  294. MOV R2,#&FFF
  295. .typeerr
  296. LDMFD R13!,{R3-R11,PC}
  297.  
  298.  
  299. .type1     ;&00-&0F
  300. MOV R2,R0
  301. CMP R2,#15
  302. ADDNE R2,R2,#2
  303. MOVEQ R2,#256
  304. BL getbyte
  305. BVS typeerr
  306. .loop2
  307. BL putbyte
  308. SUBS R2,R2,#1
  309. BGT loop2
  310. B typeins
  311.  
  312. .type2     ;&10-&1F
  313. MOV R2,R0
  314. AND R2,R2,#&F
  315. ADD R2,R2,#1
  316. .loop3
  317. BL getbyte
  318. BVS typeerr
  319. BL putbyte
  320. SUBS R2,R2,#1
  321. BGT loop3
  322. B typeins
  323.  
  324. .type3     ;&20-&3F
  325. MOV R1,R0
  326. BL getbyte
  327. BVS typeerr
  328. AND R2,R1,#&1C
  329. MOV R2,R2,LSR #2
  330. ADD R2,R2,#2
  331. AND R3,R1,#&3
  332. ADD R3,R0,R3,LSL #8
  333. SUB R3,R10,R3
  334. .loop5
  335. MOV R0,R3
  336. BL translate
  337. LDRB R0,[R0]
  338. BL putbyte
  339. SUB R3,R3,#1
  340. SUBS R2,R2,#1
  341. BGT loop5
  342. B typeins
  343.  
  344. .type4      ;&40-&7F
  345. MOV R1,R0
  346. BL getbyte
  347. BVS typeerr
  348. AND R2,R1,#&38
  349. MOV R2,R2,LSR #3
  350. ADD R2,R2,#2
  351. AND R4,R1,#&06
  352. MOV R4,R4,LSR #1
  353. CMP R4,#2
  354. ADDGE R4,R4,#1
  355.  
  356. AND R3,R1,#&1
  357. ADD R3,R0,R3,LSL #8
  358. SUB R5,R10,R3
  359.  
  360. MOV R1,#1
  361. MOV R4,R1,LSL R4
  362.  
  363. MOV R3,#0
  364. .loop6
  365. ADD R0,R5,R3,ASR #2
  366. BL translate
  367. LDRB R0,[R0]
  368. BL putbyte
  369. ADD R3,R3,R4
  370. SUBS R2,R2,#1
  371. BGT loop6
  372. B typeins
  373.  
  374. .getbyte
  375. STMFD R13!,{R1,R14}
  376. MOV R1,R6
  377. SWI XOS_BGet
  378. LDMFD R13!,{R1,R14}
  379. BCS overrunerr
  380. MOV PC,R14
  381.  
  382. .putbyte
  383. STMFD R13!,{R0,R14}
  384. ADD R10,R10,#1
  385. MOV R0,R10
  386. BL translate
  387. MOV R1,R0
  388. LDMFD R13!,{R0,R14}
  389. STRB R0,[R1]
  390. MOV PC,R14
  391.  
  392. .translate
  393. CMP R7,#0
  394. MOVEQ PC,R14
  395. SUB R0,R0,R7
  396. MOV R1,R0,LSL #2
  397. SUBS R0,R0,R8,LSR #2
  398. ADDPL R1,R1,#1
  399. SUBPL R1,R1,R8
  400. SUBS R0,R0,R8,LSR #2
  401. ADDPL R1,R1,#1
  402. SUBPL R1,R1,R8
  403. SUBS R0,R0,R8,LSR #2
  404. ADDPL R1,R1,#1
  405. SUBPL R1,R1,R8
  406. MOV R0,R1
  407. ADD R0,R0,R7
  408. MOV PC,R14
  409.  
  410. .getword
  411. STMFD R13!,{R1-R2,R14}
  412. MOV R2,#0
  413. MOV R1,R6
  414. SWI XOS_BGet
  415. ORRCC R2,R2,R0
  416. SWICC XOS_BGet
  417. ORRCC R2,R2,R0,LSL #8
  418. SWICC XOS_BGet
  419. ORRCC R2,R2,R0,LSL #16
  420. SWICC XOS_BGet
  421. ORRCC R0,R2,R0,LSL #24
  422.  
  423. LDMFD R13!,{R1-R2,R14}
  424. BCS overrunerr
  425. MOV PC,R14
  426.  
  427. .openfile
  428. STMFD R13!,{R1-R4,R14}
  429. MOV R3,R0
  430. MOV R0,#&4C
  431. CMP R2,#0
  432. ORRNE R0,R0,#2
  433. SWI XOS_Find
  434. MOV R6,R0
  435. MOVVS R6,#0
  436. LDMVSFD R13!,{R1-R4,PC}
  437. TST R3,#2
  438. LDMEQFD R13!,{R1-R4,PC}
  439. MOV R0,#1
  440. MOV R1,R6
  441. MOV R2,R4
  442. SWI OS_Args
  443. LDMFD R13!,{R1-R4,PC}
  444.  
  445.  
  446. .closefile
  447. STMFD R13!,{R0-R1,R14}
  448. MOV R0,#0
  449. MOV R1,R6
  450. CMP R6,#0
  451. SWINE XOS_Find
  452. MOV R6,#0
  453. LDMFD R13!,{R0-R1,PC}^
  454.  
  455.  
  456. .init
  457. STMFD R13!,{R7-R11,R14}
  458. MOV R0,#6
  459. MOV R3,#v.sizeof
  460. SWI XOS_Module
  461. LDMVSFD R13!,{R7-R11,R14}
  462. BVS initerr
  463. STR R2,[R12]
  464. LDR R12,[R12]
  465. MOV R0,#0
  466. STR R0,[R12,#v.tickerctr]
  467. STR R0,[R12,#v.prevctr]
  468. STR R0,[R12,#v.waitcall]
  469. BL claimticker
  470. LDMFD R13!,{R7-R11,PC}
  471.  
  472. .final
  473. STMFD R13!,{R7-R11,R14}
  474. LDR R12,[R12]
  475. BL releaseticker
  476. MOV R0,#7
  477. MOV R2,R12
  478. SWI XOS_Module
  479. LDMFD R13!,{R7-R11,PC}
  480.  
  481. .err
  482. ORR R14,R14,#1<<28
  483. MOVS PC,R14
  484.  
  485. .fileerr
  486. STMFD R13!,{R0,R14}
  487. BL closefile
  488. LDMFD R13!,{R0,R14}
  489. ADR R0,fileerrtext
  490. B err
  491. .inconserr
  492. STMFD R13!,{R14}
  493. SWI OS_WriteS
  494. DCB "Blitz : Hammer file length inconsistency",0
  495. ALIGN
  496. LDMFD R13!,{PC}
  497. .underrunerr
  498.  
  499. ADR R0,underrunerrtext
  500. B err
  501. .overrunerr
  502. ADR R0,overrunerrtext
  503. B err
  504. .initerr
  505. ADR R0,initerrtext
  506. B err
  507. .unknownswierr
  508. ADR R0,unknownswitext
  509. B err
  510. .toolongerr
  511. ADR R0,toolongtext
  512. B err
  513.  
  514. .initerrtext
  515. DCD &80c980
  516. DCB "Blitz : Failed to initialise",0
  517. ALIGN
  518. .unknownswitext
  519. DCD &80C981
  520. DCB "Blitz : Unknown SWI",0
  521. ALIGN
  522. .toolongtext
  523. DCD &80C982
  524. DCB "Blitz : Excessive timer wait.",0
  525. ALIGN
  526. .underrunerrtext
  527. DCD &80C983
  528. DCB "Blitz : Hammer file underrun",0
  529. ALIGN
  530. .overrunerrtext
  531. DCD &80C984
  532. DCB "Blitz : Hammer file overrun",0
  533. .fileerrtext
  534. DCD &80C985
  535. DCB "Blitz : File error",0
  536. ALIGN
  537.  
  538.  
  539.