home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / Stasis / StasisMod / Source < prev   
Encoding:
Text File  |  1995-01-10  |  16.3 KB  |  1,160 lines

  1. #type &ffa
  2. #name StasisMod
  3. #base 0
  4. #include ASMLib:Standard
  5. #include StasisMod:Header
  6. #include StasisMod:format
  7.  
  8. #set Service_StasisRate = &80313
  9.  
  10. #set startslot=80
  11. #set startchan=5
  12. #set status_fade    =1
  13. #set status_pending    =1<<1
  14.  
  15. struct v {
  16.   .ticker    DCD 0
  17.   .lastticker    DCD 0
  18.   .threaded    DCD 0
  19.   .status    DCD 0
  20.   .speed    DCD 0
  21.   .speedctr    DCD 0
  22.   .delay    DCD 0
  23.   .seqno    DCD 0
  24.   .patno    DCD 0
  25.   .noteno    DCD 0
  26.   .linkedadr    DCD 0
  27.   .linkedmod    DCD 0
  28.   .nextmod    DCD 0
  29.   .realtune    DCD 0
  30.   .filetype    DCD 0
  31.   .songtype    DCD 0
  32.   .pause    DCD 0
  33.   .voices    DCD 0
  34.   .textbuf    DBB 16
  35.   .chantab    DBB 8*ch_sizeof
  36.   .modtab    DBB 8*m_sizeof
  37.   .soundtab    DBB 48
  38.   .pattab    DBD 128
  39.   .sizeof
  40. }
  41. struct m {
  42.   .addr        DCD 0
  43.   .type        DCD 0
  44.   .samparea    DCD 0
  45.   .pattarea    DCD 0
  46.   .sizeof
  47.   }
  48.   
  49. #set m_sizeof=16
  50. #set m_shift =4
  51.  
  52. struct ch {
  53.   .stereo    DCD 0
  54.   .volume    DCD 0
  55.   .pitch    DCD 0
  56.   .lastslot    DCD 0
  57.   .sizeof   
  58. }
  59. #set ch_sizeof = 16
  60. #set h_shift = 4
  61.  
  62. .ModuleHeader
  63. DCD 0
  64. DCD init
  65. DCD final
  66. DCD service    ;service
  67. DCD title
  68. DCD help
  69. DCD helptable
  70. DCD 0
  71. DCD 0
  72. DCD 0
  73. DCD 0
  74. .title
  75. DCB  "StasisMod"
  76. DCB 0
  77. ALIGN
  78. .help
  79. DCB  "Stasis Module Player",9,"1.00 (16 Oct 1994)"
  80. DCB 0
  81. ALIGN
  82. .helptable
  83. DCB  "StasisMod"
  84. DCB 0
  85. ALIGN
  86. DCD 0
  87. DCD 0
  88. DCD 0
  89. DCD stasishelp
  90. DCB "PlayMod"
  91. DCB 0
  92. ALIGN
  93. DCD loadcom
  94. DCD &0002FF02
  95. DCD loadsyn
  96. DCD loadhelp
  97. DCB "PlayStop"
  98. DCB 0
  99. ALIGN
  100. DCD stopcom
  101. DCD &0000FF00
  102. DCD stopsyn
  103. DCD stophelp
  104.  
  105. DCB "PlayPause"
  106. DCB 0
  107. ALIGN
  108. DCD pausecom
  109. DCD &0001FF01
  110. DCD pausesyn
  111. DCD pausehelp
  112.  
  113. DCB "PlayVoices"
  114. DCB 0
  115. ALIGN
  116. DCD voicescom
  117. DCD &0001FF01
  118. DCD voicessyn
  119. DCD voiceshelp
  120.  
  121. DCD 0 ;           end marker
  122.  
  123. .stasishelp
  124. DCB "A module player for use with Stasis.  © Andy Southgate but use freely."
  125.  
  126. DCB 0
  127.  
  128. .loadhelp
  129. DCB 27
  130. DCB 0
  131. DCB  " loads and plays a module."
  132. DCB 13
  133. DCB 10
  134. .loadsyn
  135. DCB 27
  136. DCB 1
  137. DCB  " <slot> <filename>"
  138. DCB 0
  139. .stophelp
  140. DCB 27,0," stops a playing module.",13,10
  141. .stopsyn
  142. DCB  27,1,0
  143. .pausehelp
  144. DCB 27,0," pauses/restarts a playing module.",13,10
  145. .pausesyn
  146. DCB  27,1," <0|1>",0
  147. .voiceshelp
  148. DCB 27,0," informs the module of the number of voices.  If eight, the module will use channels 5-8.",13,10
  149. .voicessyn
  150. DCB  27,1," <voices>",0
  151. ALIGN
  152. .nullswi
  153. .nullcommand
  154. MOV PC,R14
  155.  
  156. .routine
  157. STMFD R13!,{R0-R11,R14}
  158. LDR R0,[R12,#v.ticker]
  159. ADD R0,R0,#1
  160. STR R0,[R12,#v.ticker]
  161. LDR R1,[R12,#v.lastticker]
  162. SUB R0,R0,R1
  163. CMP R0,#2
  164. LDMLTFD R13!,{R0-R11,PC}
  165. LDR R0,[R12,#v.pause]
  166. CMP R0,#1
  167. LDMEQFD R13!,{R0-R11,PC}
  168. LDR R0,[R12,#v.threaded]
  169. CMP R0,#0
  170. LDMNEFD R13!,{R0-R11,PC}
  171. MOV R0,#1
  172. STR R0,[R12,#v.threaded]
  173. MOV R0,PC
  174. ORR R0,R0,#3
  175. TEQP R0,#0  ;switch to SVC
  176. MOV R0,R0
  177. STMFD R13!,{R14}
  178. LDR R0,[R12,#v.speedctr]
  179. LDR R1,[R12,#v.speed]
  180. ADD R0,R0,#1
  181. CMP R0,R1
  182. MOVGE R0,#0
  183. STR R0,[R12,#v.speedctr]
  184. BLT nopatproc
  185.  
  186. .patproc
  187. LDR R0,[R12,#v.linkedmod]
  188. CMP R0,#0
  189. BLT notplaying
  190. get_m
  191. LDR R0,[R12,#v.linkedadr]
  192. LDR R1,[R10,#m.addr]
  193. CMP R0,R1
  194. BLNE swapin
  195. BLVS terminate
  196. BVS abort
  197. LDR R0,[R12,#v.linkedmod]
  198. CMP R0,#0
  199. BLT notplaying
  200. get_m
  201. LDR R0,[R12,#v.patno]
  202. ADD R11,R12,#v.pattab
  203. LDR R11,[R11,R0,LSL #2]
  204. LDR R0,[R12,#v.noteno]
  205. LDR R9,[R10,#m.addr]
  206. LDR R8,[R9,#mod.tracks]
  207. MUL R0,R8,R0
  208. ADD R11,R11,R0,LSL #2; R11 now points to the current note
  209. ADD R11,R11,R9
  210. MOV R8,#1
  211. .trackloop
  212. STMFD R13!,{R8}
  213. LDR R0,[R12,#v.voices]
  214. CMP R0,#8
  215. ADDEQ R8,R8,#4
  216. LDR R0,[R12,#v.delay]
  217. CMP R0,#0
  218. BLEQ processnote
  219. BL processeffect
  220. LDMFD R13!,{R8}
  221. ADD R11,R11,#4
  222. ADD R8,R8,#1
  223. LDR R0,[R9,#mod.tracks]
  224. AND R0,R0,#7
  225. CMP R8,R0
  226. BLE trackloop
  227.  
  228. LDR R1,[R12,#v.delay]
  229. SUBS R1,R1,#1
  230. STRPL R1,[R12,#v.delay]
  231. CMP R1,#0
  232. LDR R0,[R12,#v.noteno]
  233. ADDLE R0,R0,#1
  234. STRLE R0,[R12,#v.noteno]
  235.  
  236. LDR R0,[R12,#v.noteno]
  237. LDR R1,[R12,#v.patno]
  238. ADD R2,R9,#mod.patlen
  239. LDRB R3,[R2,R1]
  240. CMP R0,R3
  241. BLGE patadvance
  242. .nopatproc
  243. .notplaying
  244. .abort
  245. LDMFD R13!,{R14}
  246. MOV R0,PC
  247. ORR R0,R0,#2
  248. BIC R0,R0,#1
  249. TEQP R0,#0  ;switch to IRQ
  250. MOV R0,R0
  251. LDR R0,[R12,#v.ticker]
  252. STR R0,[R12,#v.lastticker]
  253. MOV R0,#0
  254. STR R0,[R12,#v.threaded]
  255. LDMFD R13!,{R0-R11,PC}^
  256.  
  257. .patadvance
  258. STMFD R13!,{R14}
  259. LDR R4,[R12,#v.seqno]
  260. ADD R4,R4,#1
  261. LDR R0,[R9,#mod.musiclen]
  262. CMP R4,R0
  263. MOVGE R4,R0,LSR #24
  264. AND R4,R4,#&7F
  265. STR R4,[R12,#v.seqno]
  266. BL patinit
  267. LDMFD R13!,{PC}
  268.  
  269. .patinit
  270. STMFD R13!,{R0-R11,R14}
  271. LDR R0,[R12,#v.linkedmod]
  272. CMP R0,#0
  273. LDMLTFD R13!,{R0-R11,PC}
  274. get_m
  275. LDR R9,[R10,#m.addr]
  276. LDR R4,[R12,#v.seqno]
  277. AND R4,R4,#&7F
  278. ADD R2,R9,#mod.sequence
  279. LDRB R2,[R2,R4]
  280. STR R2,[R12,#v.patno]
  281. MOV R0,#0
  282. STR R0,[R12,#v.noteno]
  283. LDMFD R13!,{R0-R11,PC}
  284.  
  285.  
  286. .processnote
  287. STMFD R13!,{R14}
  288. LDR R0,[R11]
  289. AND R1,R0,#&FFFF
  290. CMP R1,#&0300
  291. LDMEQFD R13!,{PC}
  292. AND R1,R0,#&FF00
  293. CMP R1,#&0300
  294. BEQ slidenote
  295. AND R1,R0,#&FF<<24
  296. MOV R1,R1,LSR #24
  297. AND R2,R0,#&FF<<16
  298. MOV R2,R2,LSR #16
  299. CMP R1,#0
  300. LDMEQFD R13!,{PC}
  301. MOV R4,#&155
  302. MUL R3,R4,R1
  303. ADD R3,R3,#&1eaa
  304. ADD R3,R3,R1,LSR #2
  305. ADD R3,R3,R1,LSR #4
  306. MOV R4,#0
  307. CMP R2,#0
  308. MOVEQ R4,#%1000001
  309. MOV R1,R2
  310. ADD R0,R12,#v.soundtab
  311. LDRB R2,[R0,R1]
  312. MOV R2,R2,LSR #1
  313. ADD R1,R1,#startslot-1
  314. MOV R0,R8
  315. SWI Stasis_Sound
  316. LDMFD R13!,{PC}
  317.  
  318. .slidenote
  319. LDR R0,[R11]
  320. AND R1,R0,#&FF<<24
  321. AND R2,R0,#&FF<<16
  322. MOV R1,R1,LSR #24
  323. CMP R1,#0
  324. LDMEQFD R13!,{PC}
  325. AND R0,R0,#&FF
  326. LDR R3,[R12,#v.realtune]
  327. MUL R3,R0,R3
  328. ADD R0,R12,#v.soundtab
  329. STMFD R13!,{R1}
  330. LDRB R1,[R0,R2,LSR #16]
  331. MOV R1,R1,LSR #1
  332. MOV R0,R8
  333. SWI Stasis_Volume
  334. LDMFD R13!,{R1}
  335.  
  336. MOV R4,#&155
  337. MUL R2,R4,R1
  338. ADD R2,R2,#&1eaa
  339. ADD R2,R2,R1,LSR #2
  340. ADD R2,R2,R1,LSR #4
  341. ORR R0,R8,#1<<29
  342. MOV R1,#1
  343. SWI Stasis_Slide
  344.  
  345. LDMFD R13!,{PC}
  346.  
  347. .processeffect
  348. STMFD R13!,{R14}
  349. ;get_ch R8,R7
  350. LDR R6,[R11]
  351. AND R6,R6,#&FFFF
  352. MOV R5,R6,LSR #8
  353. AND R6,R6,#&FF
  354. CMP R5,#&1
  355. BLEQ effpitchup
  356. CMP R5,#&2
  357. BLEQ effpitchdown
  358. CMP R5,#&0A
  359. BLEQ volslide
  360. CMP R5,#&12
  361. BLEQ effvolup
  362. CMP R5,#&11
  363. BLEQ effvoldown
  364. CMP R5,#&1C
  365. BLEQ effspeed
  366. CMP R5,#&B
  367. BLEQ effbreak
  368. CMP R5,#&13
  369. BLEQ effjump
  370. CMP R5,#&C
  371. BLEQ efflogvol
  372. CMP R5,#&1F
  373. BLEQ efflinvol
  374. CMP R5,#&E
  375. BLEQ effmisc
  376. CMP R5,#&19
  377. BLEQ effstereo
  378. LDMFD R13!,{PC}
  379.  
  380. .effvolup
  381. STMFD R13!,{R14}
  382. ADD R0,R8,#1<<29
  383. MOV R1,#0
  384. MOV R2,#&7f
  385. MOV R3,R6,LSL #6
  386. SWI Stasis_Slide
  387. LDMFD R13!,{PC}
  388.  
  389. .effvoldown
  390. STMFD R13!,{R14}
  391. ADD R0,R8,#1<<29
  392. MOV R1,#0
  393. MOV R2,#&0
  394. MOV R3,R6,LSL #6
  395. RSB R3,R3,#0
  396. SWI Stasis_Slide
  397. LDMFD R13!,{PC}
  398.  
  399. .volslide
  400.  
  401. STMFD R13!,{R14}
  402. ANDS R3,R6,#&F0
  403. BEQ volslideup
  404. ADD R0,R8,#1<<29
  405. MOV R1,#0
  406. MOV R2,#&7F
  407. MOV R3,R3,LSL #2
  408. SWI Stasis_Slide
  409. LDMFD R13!,{PC}
  410. .volslideup
  411. AND R3,R6,#&0F
  412. ADD R0,R8,#1<<29
  413. MOV R1,#0
  414. MOV R2,#&0
  415. MOV R3,R3,LSL #6
  416. RSB R3,R3,#0
  417. SWI Stasis_Slide
  418. LDMFD R13!,{PC}
  419.  
  420. .effpitchup
  421. STMFD R13!,{R14}
  422. ADD R0,R8,#1<<29
  423. MOV R1,#1
  424. MOV R2,#&6555
  425. LDR R3,[R12,#v.realtune]
  426. MUL R3,R6,R3
  427. SWI Stasis_Slide
  428. LDMFD R13!,{PC}
  429.  
  430. .effpitchdown
  431. STMFD R13!,{R14}
  432. ADD R0,R8,#1<<29
  433. MOV R1,#1
  434. MOV R2,#&0
  435. LDR R3,[R12,#v.realtune]
  436. MUL R3,R6,R3
  437. RSB R3,R3,#0
  438. SWI Stasis_Slide
  439. LDMFD R13!,{PC}
  440.  
  441. .effspeed
  442. AND R0,R6,#&1F
  443. STR R0,[R12,#v.speed]
  444. MOV PC,R14
  445.  
  446. .efflinvol
  447. STMFD R13!,{R14}
  448. MOV R0,R8
  449. MOV R1,R6,LSR #1
  450. SWI Stasis_Volume
  451. LDMFD R13!,{PC}
  452.  
  453. .efflogvol
  454. STMFD R13!,{R14}
  455. MOV R0,R8
  456. MOV R1,R6
  457. ADR R2,loglintab
  458. CMP R1,#&40
  459. MOVGT R1,#&40
  460. LDRB R3,[R2,R1]
  461. MOV R1,R3,LSR #1
  462. SWI Stasis_Volume
  463. LDMFD R13!,{PC}
  464.  
  465. .effbreak
  466. MOV R0,#&FF
  467. STR R0,[R12,#v.noteno]
  468. MOV PC,R14
  469.  
  470. .effjump
  471. STR R6,[R12,#v.patno]
  472. MOV R0,#&FF
  473. STR R0,[R12,#v.noteno]
  474. MOV PC,R14
  475.  
  476. .effstereo
  477. STMFD R13!,{R14}
  478. AND R6,R6,#7
  479. MOV R1,#0
  480. CMP R6,#1
  481. MOVEQ R1,#-96
  482. CMP R6,#2
  483. MOVEQ R1,#-64
  484. CMP R6,#3
  485. MOVEQ R1,#-32
  486.  
  487. CMP R6,#5
  488. MOVEQ R1,#32
  489. CMP R6,#6
  490. MOVEQ R1,#64
  491. CMP R6,#7
  492. MOVEQ R1,#96
  493. MOV R0,R8
  494. SWI Sound_Stereo
  495. LDMFD R13!,{PC}
  496.  
  497. .effmisc
  498. STMFD R13!,{R5,R14}
  499. AND R5,R6,#&F0
  500. AND R6,R6,#&F
  501. MOV R5,R5,LSR #4
  502. CMP R5,#&E
  503. BLEQ effdelay
  504. LDMFD R13!,{R5,PC}
  505.  
  506. .effdelay
  507. LDR R0,[R12,#v.delay]
  508. CMP R0,#0
  509. ADD R0,R6,#1
  510. STREQ R0,[R12,#v.delay]
  511. MOV PC,R14
  512.  
  513. .loglintab
  514. incbin StasisMod:LogLinTab
  515. .linlogtab
  516. incbin StasisMod:LinLog2
  517. ALIGN
  518. .terminate
  519. STMFD R13!,{R14}
  520. ADD R1,R0,#4
  521. ADR R0,message
  522. SWI OS_AddCallBack
  523.  
  524. MVN R0,#0
  525. STR R0,[R12,#v.linkedmod]
  526. ADR R0,message
  527. ADR R1,termtext
  528. SWI OS_AddCallBack
  529. LDMFD R13!,{PC}
  530. .termtext
  531. DCB 10,13,"StasisMod : Module play terminated by error",10,13,0
  532. ALIGN
  533.  
  534. .playstart
  535. STMFD R13!,{R1-R11,R14}
  536. ;MOV R0,#0
  537. MOV R9,R0
  538. get_m
  539. LDR R11,[R10,#m.addr]
  540. CMP R11,#0
  541. LDMEQFD R13!,{R1-R11,R14}
  542. BEQ nomoderr
  543. BL sortvoices
  544. LDR R0,[R12,#v.linkedmod]
  545. CMP R0,#0
  546. STR R9,[R12,#v.nextmod]
  547. STRLT R9,[R12,#v.linkedmod]
  548. LDR R0,[R12,#v.status]
  549. ORR R0,R0,#status_pending+status_fade
  550. STR R0,[R12,#v.status]
  551. LDMFD R13!,{R1-R11,PC}
  552.  
  553. .playinit
  554. STMFD R13!,{R14}
  555. MOV R0,#6
  556. STR R0,[R12,#v.speed]
  557. MOV R0,#0
  558. STR R0,[R12,#v.seqno]
  559. STR R0,[R12,#v.delay]
  560. BL patinit
  561. LDMFD R13!,{PC}
  562.  
  563. .sortvoices
  564. STMFD R13!,{R14}
  565.  
  566. MOV R0,#0
  567. MOV R1,#0
  568. MOV R2,#0
  569. MOV R3,#0
  570. MOV R4,#0
  571. SWI Sound_Configure
  572. MOV R4,R0
  573. CMP R0,#8
  574. MOV R3,#1
  575. MOVEQ R3,#5
  576. MOV R0,R3
  577. MOV R1,R3
  578. SWI Stasis_Attach
  579. ADD R3,R3,#1
  580. MOV R0,R3
  581. MOV R1,R3
  582. SWI Stasis_Attach
  583. ADD R3,R3,#1
  584. MOV R0,R3
  585. MOV R1,R3
  586. SWI Stasis_Attach
  587. ADD R3,R3,#1
  588. MOV R0,R3
  589. MOV R1,R3
  590. SWI Stasis_Attach
  591. CMP R4,#4
  592. LDMGEFD R13!,{PC}
  593. MOV R0,#4
  594. MOV R1,#0
  595. MOV R2,#0
  596. MOV R3,#0
  597. MOV R4,#0
  598. SWI Sound_Configure
  599. LDMFD R13!,{PC}
  600.  
  601. .swapin
  602. STMFD R13!,{R14}
  603. ;ADR R0,message
  604. ;ADR R1,swaptext
  605. ;SWI OS_AddCallBack
  606. BL unlinkmod
  607. LDR R0,[R12,#v.nextmod]
  608. BL linkmod
  609. LDMVSFD R13!,{PC}
  610. BL playinit
  611. LDMFD R13!,{PC}
  612. .swaptext
  613. DCB "StasisMod : Module swapped in",10,13,0
  614. ALIGN
  615.  
  616. .modrelease
  617. STMFD R13!,{R14}
  618. LDR R1,[R12,#v.linkedmod]
  619. CMP R0,R1
  620. BLEQ nukemod
  621. get_m
  622. LDR R9,[R10,#m.type]
  623. CMP R9,#type_rma
  624. BLEQ rmarelease
  625. CMP R9,#type_amnesia
  626. ;BLEQ amnesiarelease
  627. LDMFD R13!,{PC}
  628.  
  629.  
  630.  
  631. .message
  632. STMFD R13!,{R0,R14}
  633. MOV R0,R12
  634. SWI OS_Write0
  635. LDMFD R13!,{R0,PC}
  636.  
  637. .number
  638. STMFD R13!,{R0-R2,R14}
  639. MOV R0,R12
  640. ADR R1,buffer
  641. MOV R2,#16
  642. SWI OS_ConvertHex8
  643. SWI OS_Write0
  644. SWI OS_NewLine
  645. LDMFD R13!,{R0-R2,PC}
  646. .buffer
  647. DBB 16
  648.  
  649. .fadeall
  650. STMFD R13!,{R14}
  651. MOV R4,#0
  652. .fadeallloop
  653. LDR R0,[R12,#v.voices]
  654. CMP R0,#8
  655. MOV R0,R4
  656. ADDEQ R0,R0,#4
  657. MOV R1,#0
  658. MOV R2,#0
  659. MOV R3,#200
  660. SWI Stasis_Slide
  661. ADD R4,R4,#1
  662. CMP R4,#4
  663. BLT fadeallloop
  664. LDMFD R13!,{PC}
  665.  
  666. .stopcom
  667. STMFD R13!,{R14}
  668. LDR R12,[R12]        ;where's my workspace?
  669. BL stopswi
  670. LDMFD R13!,{PC}
  671.  
  672. .stopswi
  673. STMFD R13!,{R0-R11,R14}
  674. BL unlinkmod
  675. LDMFD R13!,{R0-R11,PC}
  676.  
  677. .voicescom
  678. STMFD R13!,{R14}
  679. LDR R12,[R12]
  680. MOV R1,R0
  681. MOV R0,#10
  682. SWI OS_ReadUnsigned
  683. MOV R0,R2
  684. BL voicesswi
  685. LDMFD R13!,{PC}
  686.  
  687. .voicesswi
  688. STR R0,[R12,#v.voices]
  689. MOV PC,R14
  690.  
  691. .pausecom
  692. STMFD R13!,{R14}
  693. LDR R12,[R12]
  694. MOV R1,R0
  695. MOV R0,#10
  696. SWI OS_ReadUnsigned
  697. MOV R0,R2
  698. BL pauseswi
  699. LDMFD R13!,{PC}
  700.  
  701. .pauseswi
  702. STMFD R13!,{R0,R14}
  703. CMP R0,#1
  704. MOVNE R0,#0
  705. STR R0,[R12,#v.pause]
  706. BL fadeall
  707. LDMFD R13!,{R0,PC}
  708.  
  709. .loadcom
  710. STMFD R13!,{R14}
  711. LDR R12,[R12]        ;where's my workspace?
  712. MOV R1,R0
  713. MOV R0,#10
  714. SWI OS_ReadUnsigned
  715. MOV R0,R2
  716. BL loadswi
  717. MOV R0,R2
  718. BL playstart
  719. LDMFD R13!,{PC}
  720.  
  721. .loadswi
  722. STMFD R13!,{R1-R9,R14}
  723. ;MOV R0,#0
  724. MOV R9,R0
  725. STMFD R13!,{R0-R1}
  726. BL modrelease
  727. LDMFD R13!,{R0-R1}
  728. get_m
  729. MOV R0,#5
  730. SWI XOS_File
  731. LDMVSFD R13!,{R1-R9,PC}
  732. MOV R4,R2,LSL #12
  733. MOV R4,R4,LSR #20
  734. CMP R0,#1
  735. LDMNEFD R13!,{R1-R9,R14}
  736. BNE notafileerr
  737. STR R4,[R12,#v.filetype]
  738. BL rmahamload
  739. LDMVSFD R13!,{R1-R9,PC}
  740. LDMFD R13!,{R1-R9,PC}
  741.  
  742. .rmarelease
  743. STMFD R13!,{R14}
  744. LDR R0,[R10,#m.addr]
  745. releaserma R0
  746. MOV R0,#type_empty
  747. STR R0,[R10,#m.type]
  748. LDMFD R13!,{PC}
  749.  
  750. ;.amnesiaload
  751. ;STMFD R13!,{R2,R14}
  752. ;ADD R0,R10,#m.addr
  753. ;MOV R2,#0
  754. ;SWI XAmnesia_LoadFile
  755. ;MOV R2,#type_amnesia
  756. ;MOVVS R2,#type_empty
  757. ;STR R2,[R10,#m.type]
  758. ;LDMFD R13!,{R2,PC}
  759.  
  760. .rmaload
  761. STMFD R13!,{R1-R2,R14}
  762. loadrma R1,R2
  763. LDMVSFD R13!,{R1-R2,PC}
  764. STR R2,[R10,#m.addr]
  765. MOV R2,#type_rma
  766. STR R2,[R10,#m.type]
  767. LDMFD R13!,{R1-R2,PC}
  768.  
  769. .rmahamload
  770. STMFD R13!,{R1-R2,R14}
  771. MOV R0,#0
  772. MOV R2,#0
  773. SWI XBlitz_HammerOp
  774. LDMVSFD R13!,{R1-R2,R14}
  775. BVS rmaload
  776. CMP R3,#0
  777. LDMEQFD R13!,{R1-R2,R14}
  778. BEQ rmaload
  779. claimrma R3,R3
  780. LDMVSFD R13!,{R1-R2,PC}
  781. MOV R0,#1
  782. SWI Blitz_HammerOp
  783. STR R3,[R10,#m.addr]
  784. MOV R2,#type_rma
  785. STR R2,[R10,#m.type]
  786. LDMFD R13!,{R1-R2,PC}
  787.  
  788. .unlinkmod
  789. STMFD R13!,{R0,R14}
  790. MVN R0,#0
  791. STR R0,[R12,#v.linkedmod]
  792. MOV R0,#0
  793. STR R0,[R12,#v.linkedadr]
  794. LDMFD R13!,{R0,R14}
  795.  
  796. .nukemod
  797. STMFD R13!,{R0-R11,R14}
  798. MVN R0,#0
  799. STR R0,[R12,#v.linkedmod]
  800. MOV R0,#0
  801. STR R0,[R12,#v.linkedadr]
  802. MOV R9,#startslot
  803. .nukeloop
  804. MOV R0,R9
  805. MOV R1,#0
  806. MOV R2,#0
  807. SWI Stasis_Sample
  808. ADD R9,R9,#1
  809. CMP R9,#startslot+48
  810. BLT nukeloop
  811. LDMFD R13!,{R0-R11,PC}
  812.  
  813. .ids
  814. DCB "MUSX","TINF","MVOX","STER","MNAM","ANAM","MLEN","PNUM"
  815. DCB "PLEN","SEQU"
  816. .songid
  817. DCB "SONG"
  818.  
  819. .linkmod
  820. STMFD R13!,{R0-R11,R14}
  821. STR R0,[R12,#v.linkedmod]
  822. MOV R9,#0
  823. STR R9,[R12,#v.songtype]
  824. get_m
  825. LDR R9,[R10,#m.addr]
  826. ADR R11,ids
  827. MOV R8,#0
  828. .linkloop
  829. LDR R0,[R9]
  830. LDR R1,[R11]
  831. CMP R0,R1
  832. BNE failmod
  833. .failins
  834. LDR R0,[R9,#4]
  835. CMP R8,#0
  836. MOVEQ R0,#0
  837. ADD R0,R0,#8
  838. ADD R9,R9,R0
  839. ADD R11,R11,#4
  840. ADD R8,R8,#1
  841. CMP R8,#10
  842. BLT linkloop
  843. LDR R0,[R10,#m.addr]
  844. SUB R9,R9,R0
  845. STR R9,[R10,#m.pattarea]
  846. BL getpatts
  847. BVS failmessage
  848. LDR R0,[R12,#v.songtype]
  849. CMP R0,#0
  850. BLEQ getsounds
  851. BVS failmessage
  852.  
  853. .linkend
  854. LDR R0,[R10,#m.addr]
  855. STR R0,[R12,#v.linkedadr]
  856.  
  857. LDMFD R13!,{R0-R11,R14}
  858. BIC R14,R14,#1<<28
  859. MOVS PC,R14
  860.  
  861. .failmod
  862. CMP R8,#0
  863. BNE failmessage
  864. LDR R1,songid
  865. CMP R1,R0
  866. BNE failmessage
  867. MOV R1,#1
  868. STR R1,[R12,#v.songtype]
  869. B failins
  870. .failmessage
  871. LDMFD R13!,{R0-R11,R14}
  872. ADR R0,failedmodtext
  873. ORR R14,R14,#1<<28
  874. MOVS PC,R14
  875. .failedmodtext
  876. DCD &666
  877. DCB "StasisMod : Unrecognised module type",0
  878. ALIGN
  879. .soundid
  880. DCB "SAMP"
  881. .pattid
  882. DCB "PATT"
  883.  
  884.  
  885. .getpatts
  886. STMFD R13!,{R14}
  887. ADD R5,R12,#v.pattab
  888. LDR R9,[R10,#m.pattarea]
  889. CMP R9,#0
  890. BEQ getpattsfail
  891. LDR R11,[R10,#m.addr]
  892. ADD R9,R11,R9
  893. LDR R8,[R11,#mod.patterns]
  894. AND R8,R8,#&7F
  895. MOV R7,#0
  896. .patloop
  897. LDR R0,[R9]
  898. LDR R1,pattid
  899. CMP R0,R1
  900. BNE getpattsfail
  901. SUB R0,R9,R11
  902. ADD R0,R0,#8
  903. STR R0,[R5],#4
  904. LDR R0,[R9,#4]
  905. ADD R0,R0,#8
  906. ADD R9,R9,R0
  907. ADD R7,R7,#1
  908. CMP R7,R8
  909. BLT patloop
  910. SUB R9,R9,R11
  911. STR R9,[R10,#m.samparea]
  912. LDMFD R13!,{R14}
  913. BIC R14,R14,#1<<28
  914. MOVS PC,R14
  915.  
  916. .getpattsfail
  917. MOV R0,R7
  918. ADR R1,getpattsnum
  919. MOV R2,#5
  920. SWI OS_ConvertHex2
  921. ADR R0,message
  922. ADR R1,getpattstext
  923. SWI OS_AddCallBack
  924. LDMFD R13!,{R14}
  925. ORR R14,R14,#1<<28
  926. MOVS PC,R14
  927. .getpattstext
  928. DCB "Pattern ID &"
  929. .getpattsnum
  930. DCB "   incorrect.",10,13,0
  931. ALIGN
  932.  
  933. .makesoundtab
  934. STMFD R13!,{R14}
  935. MOV R0,#1
  936. ADD R1,R12,#v.soundtab
  937. .soundtabloop
  938. STMFD R13!,{R0-R1}
  939. ADD R0,R0,#startslot-1
  940. SWI Stasis_GetSlotInfo
  941. LDMFD R13!,{R0-R1}
  942. STRB R7,[R1,R0]
  943. ADD R0,R0,#1
  944. CMP R0,#48
  945. BLT soundtabloop
  946. LDMFD R13!,{PC}
  947.  
  948. .getsounds
  949. STMFD R13!,{R14}
  950. LDR R11,[R10,#m.addr]
  951. LDR R9,[R10,#m.samparea]
  952. CMP R9,#0
  953. MOV R7,#0
  954. BEQ getsoundsfail
  955. ADD R9,R9,R11
  956. LDR R8,[R11,#mod.length]
  957. ADD R8,R8,R11
  958. MOV R7,#80
  959. .getloop
  960. CMP R9,R8
  961. BGE getsoundsend
  962. LDR R0,[R9]
  963. LDR R1,soundid
  964. CMP R0,R1
  965. BNE getsoundsfail
  966. LDR R0,[R9,#4]
  967. CMP R0,#64
  968. BLE emptysound
  969. MOV R0,R7
  970. MOV R1,R9
  971. MOV R2,#1
  972. SWI Stasis_MakeLink
  973. .emptysound
  974. LDR R0,[R9,#4]
  975. ADD R0,R0,#8
  976. ADD R9,R9,R0
  977. ADD R7,R7,#1
  978. CMP R7,#128
  979. BLT getloop
  980. .getsoundsend
  981. BL makesoundtab
  982. LDMFD R13!,{R14}
  983. BIC R14,R14,#1<<28
  984. MOVS PC,R14
  985.  
  986. .getsoundsfail
  987. MOV R0,R7
  988. ADR R1,getsoundsnum
  989. MOV R2,#5
  990. SWI OS_ConvertHex2
  991. ADR R0,message
  992. ADR R1,getsoundstext
  993. SWI OS_AddCallBack
  994. LDMFD R13!,{R14}
  995. ORR R14,R14,#1<<28
  996. MOVS PC,R14
  997.  
  998. .getsoundstext
  999. DCB "Pattern ID &"
  1000. .getsoundsnum
  1001. DCB "   incorrect.",10,13,0
  1002. ALIGN
  1003.  
  1004.  
  1005. .service
  1006. STMFD R13!,{R0}
  1007. MOV R0,#Service_StasisRate
  1008. CMP R1,R0
  1009. BEQ rateservice
  1010. MOV R0,#Service_PsychoDying
  1011. CMP R1,R0
  1012. BEQ dyingservice
  1013. LDMFD R13!,{R0}
  1014. MOVNES PC,R14
  1015. .rateservice
  1016. LDMFD R13!,{R0}
  1017. LDR R12,[R12]
  1018. STR R2,[R12,#v.realtune]
  1019. MOV PC,R14
  1020.  
  1021. .dyingservice
  1022. LDMFD R13!,{R0}
  1023. LDR R12,[R12]
  1024. STMFD R13!,{R0-R11,R14}
  1025. MVN R0,#0
  1026. STR R0,[R12,#v.linkedmod]
  1027. MOV R0,#0
  1028. STR R0,[R12,#v.linkedadr]
  1029. LDMFD R13!,{R0-R11,PC}
  1030.  
  1031. .readbaserate
  1032. STMFD R13!,{R14}
  1033. SWI XStasis_BaseRate
  1034. MOVVS R0,#48
  1035. STR R1,[R12,#v.realtune]
  1036. LDMFD R13!,{PC}
  1037.  
  1038. .init
  1039. STMFD R13!,{R7-R11,R14}
  1040. LDR R0,[R12]
  1041. CMP R0,#0
  1042. BNE clskip
  1043. MOV R3,#v.sizeof
  1044. claimrma R3,R2
  1045. LDMVSFD R13!,{R7-R11,R14} 
  1046. BVS noroomerr
  1047. STR R2,[R12]
  1048. .clskip
  1049. LDR R12,[R12]  ;real workspace
  1050. BL clearspace
  1051. MVN R0,#0
  1052. STR R0,[R12,#v.linkedmod]
  1053. STR R0,[R12,#v.linkedadr]
  1054. STR R0,[R12,#v.pause]
  1055. MOV R0,#4
  1056. STR R0,[R12,#v.voices]
  1057. BL readbaserate
  1058. BL claimvector
  1059.  
  1060. LDMFD R13!,{R7-R11,PC}
  1061.  
  1062. .claimvector
  1063. STMFD R13!,{R14}
  1064. MOV R0,#&1C
  1065. ADR R1,routine
  1066. MOV R2,R12
  1067. SWI OS_Claim
  1068. LDMFD R13!,{PC}
  1069.  
  1070. .releasevector
  1071. STMFD R13!,{R14}
  1072. MOV R0,#&1C
  1073. ADR R1,routine
  1074. MOV R2,R12
  1075. SWI OS_Release
  1076. LDMFD R13!,{PC}
  1077.  
  1078. .clearspace
  1079. STMFD R13!,{R14}
  1080. MOV R0,#0
  1081. MOV R1,#0
  1082. .clearloop
  1083. STR R0,[R12,R1]
  1084. ADD R1,R1,#4
  1085. CMP R1,#v.sizeof
  1086. BLT clearloop
  1087. LDMFD R13!,{PC}
  1088.  
  1089. .final
  1090. STMFD R13!,{R7-R11,R14}
  1091. LDR R12,[R12]
  1092. BL releasevector
  1093. MOV R0,#0
  1094. .releaseloop
  1095. STMFD R13!,{R0,R10}
  1096. BL modrelease
  1097. ADDVS R0,R0,#4
  1098. SWIVS OS_Write0
  1099. SWIVS OS_NewLine
  1100. LDMFD R13!,{R0,R10}
  1101. ADD R0,R0,#1
  1102. CMP R0,#8
  1103. BLT releaseloop
  1104.  
  1105. CMP R10,#0
  1106. BLNE releasespace
  1107. LDMFD R13!,{R7-R11,PC}^
  1108.  
  1109. .releasespace
  1110. STMFD R13!,{R1-R11,R14}
  1111. releaserma R12
  1112. LDMFD R13!,{R1-R11,PC}^
  1113.  
  1114. .err
  1115. ORR R14,R14,#1<<28
  1116. MOVS PC,R14
  1117.  
  1118. .notafileerr
  1119. STMFD R13!,{R14}
  1120. MOV R2,R0
  1121. MOV R0,#19
  1122. SWI XOS_File
  1123. LDMFD R13!,{R14}
  1124. B err
  1125.  
  1126. .noroomerr
  1127. ADR R0,noroomerrtext
  1128. B err
  1129. .noroomerrtext
  1130. DCD &666
  1131. DCB "StasisMod : No room in module area",0
  1132. ALIGN
  1133.  
  1134. .nomoderr
  1135. ADR R0,nomoderrtext
  1136. B err
  1137. .nomoderrtext
  1138. DCD &666
  1139. DCB "StasisMod : No module to play",0
  1140. ALIGN
  1141.  
  1142. .badswino
  1143. ADR R0,badswinotext
  1144. B err
  1145. .badswinotext
  1146. DCD &666
  1147. DCB "StasisMod : Bad SWI number",0
  1148. ALIGN
  1149. macro get_m {
  1150. AND R0,R0,#7
  1151. ADD R10,R12,#v.modtab
  1152. ADD R10,R10,R0,LSL #m_shift
  1153. }
  1154.  
  1155. macro get_ch m0,m1 {
  1156. SUB m0,m0,#1
  1157. ADD m1,R12,#v.chantab
  1158. ADD m1,m1,m0,LSL #h_shift
  1159. }
  1160.