home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / Stasis / Source
Encoding:
Text File  |  1995-03-05  |  56.5 KB  |  3,582 lines

  1. #type &ffa
  2. #name Stasis
  3. #base 0
  4. #include ASMLib:Standard
  5. #set Service_PsychoStarting=&80300
  6. #set Service_PsychoDying   =&80301
  7. #set Service_UKStasisFormat=&80310
  8. #set Service_StasisSave    =&80311
  9. #set Service_StasisIdentify=&80312
  10. #set Service_StasisRate    =&80313
  11. #set Service_Amnesia=&80320
  12. #set stasis_alien          =1
  13.  
  14. struct v {
  15.   .linktab    DBB 8  ; variables
  16.   .slot        DCD 0
  17.   .mastertune    DCD 0
  18.   .samprate    DCD 0
  19.   .newrate    DCD 0
  20.   .oldchan    DCD 0
  21.   .realtune    DCD 0
  22.   .timer    DCD 0
  23.   .logampadr    DCD 0
  24.   .filetype    DCD 0
  25.   .saveslot    DCD 0
  26.   .savename    DCD 0
  27.   .callbacks    DCD 0
  28.   .received    DCD 0
  29.   .textbuf    DBB 16
  30.   .contab       DBB 8*con.sizeof
  31.   .slottab    DBB entries*s.sizeof
  32.   .sizeof
  33. }
  34.  
  35. struct s {             ;data structure for slot table
  36.   .addr         DCD 0
  37.   .length       DCD 0
  38.   .type        DCD 0
  39.   .format    DCD 0
  40.   .alien        DCD 0
  41.   .spare    DBD 3
  42.   .sizeof
  43. }
  44.  
  45. struct sccb {
  46.   .volume    DCB 0
  47.   .index    DCB 0
  48.   .instance    DCB 0
  49.   .control    DCB 0
  50.   .pitch    DCD 0
  51.   .timbre    DCD 0
  52.   .duration    DCD 0
  53.   .sizeof
  54. }
  55.  
  56. struct alien {
  57.   .id        DCD 0
  58.   .getinfo    DCD 0
  59.   .putinfo    DCD 0
  60.   .release    DCD 0
  61.   .zero        DCD 0
  62.   .reserved1    DCD 0
  63.   .reserved2    DCD 0
  64.   .name        DCD 0
  65.   .formatname    DCD 0
  66.   .filetype    DCD 0
  67.   .modname    DCD 0
  68.   .sizeof
  69.   
  70. }
  71.  
  72. struct con {       
  73.   .buf1        DCD 0;don't touch the first few
  74.   .buf2        DCD 0;they're loaded by an LDM
  75.   .addr        DCD 0
  76.   .length    DCD 0
  77.   .acc        DCD 0
  78.   .replen    DCD 0
  79.   .pitch    DCD 0
  80.   .status    DCD 0
  81.   .repofs    DCD 0
  82.   .slot        DCD 0
  83.   .volume    DCD 0
  84.   .finetune    DCD 0
  85.   .lastbuf    DCD 0
  86.   .rawpitch    DCD 0
  87.   .logampadr    DCD 0
  88.   .slowbufs     DCD 0
  89.   .fastbufs    DCD 0
  90.   .flashbufs    DCD 0
  91.   .fixedbufs    DCD 0
  92.   .flushes    DCD 0
  93.   .kicks    DCD 0;intentional gap below
  94.   .slides
  95.   .volslide    DCD 0
  96.   .volrate    DCD 0
  97.   .pitchslide    DCD 0
  98.   .pitchrate    DCD 0
  99.   .ratechange    DCD 0
  100.   .states    DCD 0
  101.   .prevstate    DCD 0
  102.   .laststate    DCD 0
  103.   .samprate    DCD 0
  104.   .spare    DBD 2
  105.   .sizeof
  106. }
  107. ;output con.sizeof  
  108.  
  109. #set stac_shift=7    ;con_shift
  110.  
  111. #set s_shift=5
  112. #set status_gated = 1<<0
  113.  
  114. #set status_q1    = 1<<3
  115. #set status_q2    = 1<<4
  116. #set status_live  = 1<<5
  117. #set status_escape= 1<<6
  118. #set status_kick  = 1<<7
  119. #set status_off   = 1<<8
  120. #set status_fresh = 1<<9
  121. #set status_slide    = 1<<10
  122. #set status_volslide    = 1<<10
  123. #set status_pitchslide     = 1<<11
  124. #set status_resslide     = 1<<12
  125. #set status_resslide     = 1<<13
  126. #set status_safe    = 1<<14
  127. #set status_attached    = 1<<15
  128. #set status_qshift = 3
  129.  
  130. #set ig_slot    = 1<<0
  131. #set ig_volume    = 1<<1
  132. #set ig_pitch    = 1<<2
  133. #set ig_update  = 1<<3
  134. #set ig_rawpitch= 1<<4
  135. #set ig_escape  = 1<<5
  136. #set ig_retrig    = 1<<6
  137. #set ig_fromgate= 1<<31
  138. struct stasisform {    ;stasis format
  139.   .id           DCD 0
  140.   .name        DBB 20
  141.   .len        DCD 0
  142.   .repofs    DCD 0
  143.  
  144.   .replen    DCD 0
  145.   .finetune     DCD 0
  146.   .dataofs    DCD 0
  147.   .sizeof
  148. }
  149.  
  150. struct tffstart {   ; TFF (tracker) format
  151.           DCD 0; "SAMP"
  152.   .blocklen    DCD 0
  153.         DCD 0; "SNAM"
  154.   .namelen    DCD 20
  155.   .name        DBB 20;"Name of the voice   "
  156.   .sizeof
  157. }
  158. struct tffend {
  159.          DCD 0; "SVOL"
  160.         DCD 4
  161.   .finetune    DCD 255
  162.         DCD 0; "SLEN"
  163.         DCD 4
  164.   .len        DCD 0
  165.         DCD 0; "ROFS"
  166.         DCD 4
  167.   .repofs    DCD 0
  168.         DCD 0; "RLEN"
  169.         DCD 4
  170.   .replen    DCD 2
  171.         DCD 0;"SDAT"
  172.   .dataofs    DCD 0
  173.   .sizeof
  174. }
  175.  
  176. struct userform {   ;user format
  177.   .id        DCB "User"
  178.   .addr        DCD 0
  179.   .len        DCD 0
  180.   .repofs    DCD 0
  181.   .replen    DCD 0
  182.   .sizeof
  183. }
  184.   
  185. #set finetune_default=&4000
  186. #set finetune_shift=14
  187. #set tune_default=&4000
  188. #set tune_shift=12
  189.  
  190. #set entryshift=7
  191. #set entries=128
  192. #set namelen=20
  193. #set type_empty=0
  194. #set type_rma=1
  195. #set type_user=2
  196. #set type_amnesia=3
  197. #set type_link=4
  198. #set type_safelink=5
  199.  
  200. #set format_unknown=0
  201. #set format_stasis=1
  202. #set format_tracker=2
  203. #set format_user=3
  204. #set format_alien=4
  205.  
  206. #set filetype_stasis=&112
  207. #set filetype_tracker=&CB5
  208.  
  209. .ModuleHeader
  210. DCD 0
  211. DCD init
  212. DCD final
  213. DCD service
  214. DCD title
  215. DCD help
  216. DCD helptable
  217. DCD &47D40
  218. DCD swicode
  219. DCD switab
  220. DCD 0
  221. .title
  222. DCB  "Stasis"
  223. DCB 0
  224. ALIGN
  225. .help
  226. DCB  "Stasis Voices",9,"1.11 (5 March 1995)"
  227. DCB 0
  228. ALIGN
  229. .helptable
  230. DCB  "Stasis"
  231. DCB 0
  232. ALIGN
  233. DCD 0
  234. DCD 0
  235. DCD 0
  236. DCD stasishelp
  237. DCB "StasisSample"
  238. DCB 0
  239. ALIGN
  240. DCD sample
  241. DCD &0005FF03
  242. DCD samplesyn
  243. DCD samplehelp
  244. DCB  "StasisLoad"
  245. DCB 0
  246. ALIGN
  247. DCD sampleload
  248. DCD &0003FF02
  249. DCD loadsyn
  250. DCD loadhelp
  251. DCB  "StasisSave"
  252. DCB 0
  253. ALIGN
  254. DCD savecommand
  255. DCD &0003FF02
  256. DCD savesyn
  257. DCD savehelp
  258. DCB  "StasisLink"
  259. DCB 0
  260. ALIGN
  261. DCD samplelink
  262. DCD &0002FF02
  263. DCD linksyn
  264. DCD linkhelp
  265. DCB  "StasisTune"
  266. DCB 0
  267. ALIGN
  268. DCD tunecommand
  269. DCD &0001FF01
  270. DCD tunesyn
  271. DCD tunehelp
  272. DCB  "StasisCat"
  273. DCB 0
  274. ALIGN
  275. DCD samplecat
  276. DCD &0002FF00
  277. DCD catsyn
  278. DCD cathelp
  279. DCB  "StasisState"
  280. DCB 0
  281. ALIGN
  282. DCD statecom
  283. DCD &0001FF00
  284. DCD statesyn
  285. DCD statehelp
  286. DCB  "StasisInfo"
  287. DCB 0
  288. ALIGN
  289. DCD infocom
  290. DCD &0001FF00
  291. DCD infosyn
  292. DCD infohelp
  293.  
  294. DCB  "StasisFineTune"
  295. DCB 0
  296. ALIGN
  297. DCD setfinetune
  298. DCD &0002FF02
  299. DCD setfinetunesyn
  300. DCD setfinetunehelp
  301. DCB  "StasisName"
  302. DCB 0
  303. ALIGN
  304. DCD setname
  305. DCD &000CFF02
  306. DCD setnamesyn
  307. DCD setnamehelp
  308. DCB  "StasisRepeat"
  309. DCB 0
  310. ALIGN
  311. DCD setrepeat
  312. DCD &0003FF03
  313. DCD setrepeatsyn
  314. DCD setrepeathelp
  315. DCB  "StasisLength"
  316. DCB 0
  317. ALIGN
  318. DCD setlength
  319. DCD &0002FF02
  320. DCD setlengthsyn
  321. DCD setlengthhelp
  322. DCB  "StasisVolume"
  323. DCB 0
  324. ALIGN
  325. DCD setvolume
  326. DCD &0002FF02
  327. DCD setvolumesyn
  328. DCD setvolumehelp
  329.  
  330. DCB "StasisVolSlide",0
  331. ALIGN
  332. DCD volslidecom
  333. DCD &0003FF03
  334. DCD volslidesyn
  335. DCD volslidehelp
  336.  
  337. DCB "StasisPitchSlide",0
  338. ALIGN
  339. DCD pitchslidecom
  340. DCD &0003FF03
  341. DCD pitchslidesyn
  342. DCD pitchslidehelp
  343.  
  344.  
  345. DCB "StasisOverdrive"
  346. DCB 0
  347. ALIGN
  348. DCD nullcommand
  349. DCD &0001FF01
  350. DCD odrsyn
  351. DCD odrhelp
  352. DCB "StasisSound"
  353. DCB 0
  354. ALIGN
  355. DCD soundcommand
  356. DCD &0004FF04
  357. DCD soundsyn
  358. DCD soundhelp
  359. DCB  "StasisSWIs"
  360. DCB 0
  361. ALIGN
  362. DCD 0
  363. DCD 0
  364. DCD 0
  365. DCD swishelp
  366.  
  367. DCD 0 ;           end marker
  368.  
  369. .stasishelp
  370. DCB "A voice generator using samples. © Andy Southgate but use freely."
  371.  
  372. DCB 0
  373.  
  374. .samplehelp
  375. DCB 27
  376. DCB 0
  377. DCB  " sets details of a user defined sample."
  378. DCB 13
  379. DCB 10
  380. .samplesyn
  381. DCB 27
  382. DCB 1
  383. DCB  " <Slot> <Start> <Length> [<repeat offset> <repeat length>]"
  384. DCB 0
  385. .loadhelp
  386. DCB 27
  387. DCB 0
  388. DCB  " loads a sample into memory, in the specified slot."
  389. DCB 13
  390. DCB 10
  391. DCB  "The native file format is a compact header block, followed by 8 bit log scaled data."
  392. DCB 10
  393. DCB 13
  394. .loadsyn
  395. DCB 27
  396. DCB 1
  397. DCB  " <Slot> <Filename>"
  398. DCB 0
  399.  
  400. .savehelp
  401. DCB 27
  402. DCB 0
  403. DCB " saves a sample.  Either Stasis or Tracker format can be specified by using "
  404. DCB  "StasisSave S (or just StasisSave ) or StasisSave T.  Stasis format is a little shorter."
  405. DCB 10
  406. DCB 13
  407. .savesyn
  408. DCB 27
  409. DCB 1
  410. DCB  " [format] <Slot> <Filename>"
  411. DCB 0
  412.  
  413.  
  414. .linkhelp
  415. DCB 27
  416. DCB 0
  417. DCB  " attaches a channel to a sample slot."
  418. DCB 13
  419. DCB 10
  420. .linksyn
  421. DCB 27
  422. DCB 1
  423. DCB  " <channel> <slot> "
  424. DCB 0
  425. .tunehelp
  426. DCB 27,0," sets the master tuning of the sounds. The default value is &4000.",10,13
  427. .tunesyn
  428. DCB 27,1," <value>",0
  429. .cathelp
  430. DCB 27,0," displays information about the samples present. Default is samples 0-15.",10,13
  431. .catsyn
  432. DCB 27,1," [<start> [<finish>]]",0
  433. .statehelp
  434. DCB 27,0," displays information about the state of the sound playing on a channel.",10,13
  435. .statesyn
  436. DCB 27,1," [<channel>]",0
  437. .infohelp
  438. DCB 27,0," displays information the sample in the specified slot.",10,13
  439. .infosyn
  440. DCB 27,1," [<channel>]",0
  441. .setfinetunehelp
  442. DCB 27,0," sets the fine tune value for a sample.  The normal value is &4000.",10,13
  443. .setfinetunesyn
  444. DCB 27,1," <slot> <value>",0
  445. .setnamehelp
  446. DCB 27,0," sets the name of a sample to a string of up to 20 characters.",10,13
  447. .setnamesyn
  448. DCB 27,1," <slot> <name>",0
  449. .setrepeathelp
  450. DCB 27,0," sets the repeat loop of a sample.",10,13
  451. .setrepeatsyn
  452. DCB 27,1," <slot> <repeat offset> <repeat length>",0
  453. .setlengthhelp
  454. DCB 27,0," sets the length of the sample.  Simply rewrites the length - doesn’t change the memory allocation.",10,13
  455. .setlengthsyn
  456. DCB 27,1," <slot> <length>",0
  457. .setvolumehelp
  458. DCB 27,0," sets the volume of a sample in the range 0-&ff.",10,13
  459. .setvolumesyn
  460. DCB 27,1," <slot> <volume>",0
  461. .volslidehelp
  462. DCB 27,0," sets the volume slide for a channel.",10,13
  463. .volslidesyn
  464. DCB 27,1," <channel> <rate> <target>",0
  465. .pitchslidehelp
  466. DCB 27,0," sets the pitch slide for a channel.",10,13
  467. .pitchslidesyn
  468. DCB 27,1," <channel> <rate> <target>",0
  469. .odrhelp
  470. .odrsyn
  471. DCB 27,0," is no longer available on this module."
  472. .soundhelp
  473. DCB 27,0," makes a sound, in a similar way to the *Sound command.",10,13
  474. .soundsyn
  475. DCB 27,1," <channel> <slot> <volume> <pitch> [<duration>]",0
  476. .swishelp
  477. DCB "Stasis supports the following SWIs:",10,13
  478. DCB 34,"Stasis_Sample",34,",slot,start,length,repofs,replen",10,13
  479. DCB 34,"Stasis_Load",34,",slot,filename,storage_type",10,13
  480. DCB 34,"Stasis_Save",34,",slot,filename,save_type_string",10,13
  481. DCB 34,"Stasis_Link",34,",channel,slot",10,13
  482. DCB 34,"Stasis_Name",34,",slot,name",10,13
  483. DCB 34,"Stasis_FineTune",34,",slot,finetune",10,13
  484. DCB 34,"Stasis_Volume",34,",slot,volume",10,13
  485. DCB 34,"Stasis_Sound",34,",channel,slot,volume,pitch,ignore",10,13
  486. DCB 34,"Stasis_GetSlotInfo",34,",slot TO slot,name,pitch,finetune,repofs,replen,",10,13,"datastart,volume,formatstring",10,13
  487. DCB 34,"Stasis_PutSlotInfo",34,",slot,name,pitch,finetune,repofs,replen,",10,13,"datastart,volume,bitfield",10,13
  488. DCB 34,"Stasis_VolSlide",34,",channel,rate,target_volume",10,13
  489. DCB 34,"Stasis_PitchSlide",34,",channel,rate,target_pitch",10,13
  490. DCB 34,"Stasis_Slide",34,",channel,type,target,time",10,13
  491.  
  492. DCB 0
  493.  
  494. .switab
  495. DCB "Stasis",0
  496.  
  497. DCB "GetAddress",0
  498. DCB "Sample",0
  499. DCB "Load",0
  500. DCB "Save",0
  501. DCB "Link",0
  502. DCB "Name",0
  503. DCB "VolSlide",0
  504. DCB "PitchSlide",0
  505. DCB "Control",0
  506. DCB "FineTune",0
  507. DCB "Volume",0
  508. DCB "Sound",0
  509. DCB "GetSlotInfo",0
  510. DCB "PutSlotInfo",0
  511. DCB "Slide",0
  512. DCB "MakeLink",0
  513. DCB "Tune",0
  514. DCB "Attach",0
  515. DCB "BaseRate",0
  516. DCB "GetControlAddress",0
  517. DCB "GetSlotAddress",0
  518. DCB 0;end marker
  519. ALIGN
  520. #set swino=21
  521.  
  522. .swicode
  523. CMP R11,#swino
  524. BGE badswino
  525. LDR R12,[R12]
  526. ADR R10,swiofstab
  527. LDR R10,[R10,R11,LSL #2]
  528. ADR R11,swiofstab
  529. ADD PC,R10,R11
  530. .swiofstab
  531. DCD getaddressswi     - swiofstab
  532. DCD sampleswi         - swiofstab
  533. DCD loadswi         - swiofstab
  534. DCD saveswi        - swiofstab
  535. DCD linkswi         - swiofstab
  536. DCD nameswi         - swiofstab
  537. DCD volslideswi        - swiofstab
  538. DCD pitchslideswi     - swiofstab
  539. DCD nullswi         - swiofstab
  540. DCD nullswi         - swiofstab
  541. DCD volumeswi         - swiofstab
  542. DCD soundswi        - swiofstab
  543. DCD getslotinfo        - swiofstab
  544. DCD putslotinfo        - swiofstab
  545. DCD slideswi        - swiofstab
  546. DCD makelinkswi        - swiofstab
  547. DCD tuneswi        - swiofstab
  548. DCD attachswi        - swiofstab
  549. DCD baserateswi        - swiofstab
  550. DCD getcontrolswi    - swiofstab
  551. DCD getslotswi        - swiofstab
  552. ALIGN
  553. .nullswi
  554. .nullcommand
  555. MOV PC,R14
  556. .stasisformat
  557. .stasbeg
  558. DCB  "Sta1"
  559. .stas_name
  560. DCB  "Name of the voice   "
  561. DCD 0
  562. DCD 0
  563. DCD 0
  564. DCD 0
  565.  
  566. .trackerformat
  567. DCB  "SAMP"
  568. DCD 0
  569. DCB  "SNAM"
  570. DCD 20
  571. DCB  "Name of the voice   "
  572. DCB  "SVOL"
  573. DCD 4
  574. DCD 255
  575. DCB  "SLEN"
  576. DCD 4
  577. DCD 0
  578. DCB  "ROFS"
  579. DCD 4
  580. DCD 0
  581. DCB  "RLEN"
  582. DCD 4
  583. DCD 2
  584. DCB  "SDAT"
  585. DCD 0
  586. .userformat
  587. DCB "User"
  588. DCD 0
  589. DCD 0
  590. DCD 0
  591. DCD 0
  592.  
  593. .savecommand
  594. STMFD R13!,{R14}
  595. LDR R12,[R12]
  596. CMP R1,#3
  597. MOV R4,#0
  598. BLT nosavespec
  599. .savespaceloop
  600. LDRB R3,[R0]
  601. CMP R3,#&20
  602. ADDEQ R0,R0,#1
  603. BEQ savespaceloop
  604. MOV R4,R0
  605. .savenospaceloop
  606. LDRB R3,[R0],#1
  607. CMP R3,#&20
  608. BGT savenospaceloop
  609. .nosavespec
  610. MOV R1,R0
  611. MOV R0,#10
  612. SWI OS_ReadUnsigned 
  613. MOV R0,R2
  614. MOV R2,R4
  615. BL saveswi
  616. LDMFD R13!,{PC}
  617.  
  618. .saveswi
  619. STMFD R13!,{R4-R11,R14}
  620. MOV R11,R2
  621. MOV R10,R1
  622. STR R0,[R12,#v.saveslot]
  623. BL getslotinfo
  624. LDMVSFD R13!,{R4-R11,PC}
  625. MOV R8,R2;sample length
  626. CMP R6,#0
  627. LDMEQFD R13!,{R4-R11,R14}
  628. BEQ nosamperr
  629. MOV R0,#&84
  630. STMFD R13!,{R1}
  631. MOV R1,R10
  632. SWI XOS_Find
  633. LDMFD R13!,{R1}
  634. MOV R9,#0 
  635. BVS nosave
  636. MOV R9,R0      ;file handle
  637. CMP R11,#0
  638. BEQ savestasis
  639. STR R11,[R12,#v.savename]
  640. STMFD R13!,{R1}
  641. ADR R1,stasisname1
  642. BL namecheck
  643. ADRNE R1,stasisname2
  644. BLNE namecheck
  645. LDMFD R13!,{R1}
  646. BEQ savestasis
  647. STMFD R13!,{R1}
  648. ADR R1,trackername1
  649. BL namecheck
  650. ADRNE R1,trackername2
  651. BLNE namecheck
  652. LDMFD R13!,{R1}
  653. BEQ savetracker
  654. LDR R0,[R12,#v.saveslot]
  655. MOV R2,R10
  656. ADR R3,namecheck
  657. MOV R1,#Service_StasisSave
  658. SWI OS_ServiceCall
  659. CMP R1,#0
  660. BLNE closefile
  661. LDMNEFD R13!,{R4-R11,R14}
  662. BNE badsaveformaterr
  663. CMP R2,#0
  664. BEQ saveend
  665. MOV R11,R2
  666. MOV R1,R3
  667. MOV R2,R4
  668. B dosave
  669.  
  670. .savestasis
  671. ADR R11,stasisformat
  672. BL putstasisform
  673. B dosave
  674. .savetracker
  675. ADR R11,trackerformat
  676. BL puttrackerform
  677. B dosave
  678. ;returns
  679. ;R1=length of header
  680. ;R2=filetype to save
  681.  
  682. .dosave
  683. MOV R3,R1;header length
  684. STMFD R13!,{R1-R6}
  685. MOV R1,R10
  686. MOV R0,#&12 ; set filetype
  687. SWI XOS_File 
  688. LDMFD R13!,{R1-R6}
  689. STMFD R13!,{R1-R6}
  690. MOV R0,#&01     ;Write at R4
  691. MOV R1,R9       ;handle
  692. MOV R2,R11      ;from address R11
  693. ;R3 from above
  694. MOV R4,#0       ;at start of file
  695. SWI XOS_GBPB
  696. LDMFD R13!,{R1-R6}
  697. BVS nosave
  698. MOV R0,#&02 ;Write to current pointer
  699. MOV R1,R9
  700. MOV R3,R8
  701. MOV R2,R6
  702. SWI XOS_GBPB 
  703. BVS nosave
  704.  
  705. .saveend
  706. BL closefile
  707. LDMFD R13!,{R4-R11,PC}
  708.  
  709. .nosave
  710. STMFD R13!,{R0}
  711. BL closefile
  712. MOV R0,#6
  713. MOV R1,R10
  714. SWI XOS_File ; delete partial file
  715. LDMFD R13!,{R0}
  716. SWI XOS_WriteS 
  717. DCB  "Stasis : Save failed - "
  718. DCB 0
  719. ALIGN
  720. LDMFD R13!,{R4-R11,R14}
  721. B nosaveerr
  722.  
  723. .stasisname1
  724. DCB "S",0
  725. .stasisname2
  726. DCB "Stasis",0
  727. .trackername1
  728. DCB "T",0
  729. .trackername2
  730. DCB "Tracker",0
  731. ALIGN
  732.  
  733. .namecheck
  734. STMFD R13!,{R0-R3,R14}
  735. LDR R0,varstr
  736. LDR R0,[R0,#v.savename]
  737. .namecheckloop
  738. LDRB R2,[R0],#1
  739. LDRB R3,[R1],#1
  740. BIC R2,R2,#1<<5
  741. BIC R3,R3,#1<<5
  742. CMP R2,R3
  743. LDMNEFD R13!,{R0-R3,PC}
  744. CMP R2,#" "
  745. BLE namecheckend
  746. CMP R3,#0
  747. BEQ namecheckend
  748. B namecheckloop
  749. .namecheckend
  750. CMP R0,R0
  751. LDMFD R13!,{R0-R3,PC}
  752.  
  753. .putslotinfo
  754. ;on entry
  755. ;R0=slot no
  756. ;R1=name
  757. ;R2=length
  758. ;R3=finetune
  759. ;R4=repofs
  760. ;R5=replen
  761. ;R6=datastart
  762. ;R7=volume
  763. ;R8=bit field
  764.  
  765. STMFD R13!,{R1-R11,R14}
  766. getslotaddr R0,R10
  767. LDR R9,[R10,#s.type]
  768. CMP R9,#type_empty
  769. LDMEQFD R13!,{R1-R11,R14}
  770. BEQ nosamperr
  771. LDR R9,[R10,#s.format]
  772. LDR R11,[R10,#s.addr]
  773. CMP R9,#format_stasis
  774. BEQ putstasisinfo
  775. CMP R9,#format_tracker
  776. BEQ puttrackerinfo
  777. CMP R9,#format_alien
  778. BEQ putalieninfo
  779. CMP R9,#format_user
  780. BEQ putuserinfo
  781. MOV R6,R11
  782. LDMFD R13!,{R1-R11,R14}
  783. B badformaterr
  784.  
  785. .putstasisinfo
  786. TST R8,#1<<1
  787. ADDNE R0,R11,#stasisform.name
  788. STMFD R13!,{R5}
  789. MOV R5,#namelen
  790. BLNE namecopy
  791. LDMFD R13!,{R5}
  792. TST R8,#1<<2
  793. STRNE R2,[R11,#stasisform.len]
  794. TST R8,#1<<3
  795. STRNE R3,[R11,#stasisform.finetune]
  796. TST R8,#1<<4
  797. STRNE R4,[R11,#stasisform.repofs]
  798. TST R8,#1<<5
  799. STRNE R5,[R11,#stasisform.replen]
  800. TST R8,#1<<6
  801. SUBNE R6,R6,R11
  802. STRNE R6,[R11,#stasisform.dataofs]
  803. ANDS R0,R8,#1<<7
  804. LDMNEFD R13!,{R1-R11,R14}
  805. BNE puterr
  806. LDMFD R13!,{R1-R11,PC}
  807.  
  808. .puttrackerinfo
  809. TST R8,#1<<1
  810. ADDNE R0,R11,#tffstart.name
  811. STMFD R13!,{R5}
  812. LDR R5,[R11,#tffstart.namelen]
  813. BLNE namecopy
  814. LDMFD R13!,{R5}
  815.  
  816. TST R8,#1<<2
  817. LDR R0,[R11,#tffstart.namelen]
  818. ADD R0,R0,#tffstart.name
  819. ADD R10,R11,R0
  820. STRNE R2,[R10,#tffend.len]
  821. TST R8,#1<<3
  822. LDR R0,[R10,#tffend.finetune]
  823. SUBNE R3,R3,#finetune_default
  824. MOVNE R3,R3,LSL #24
  825. ANDNE R3,R3,#7<<28
  826. BICNE R0,R0,#7<<28
  827. ORRNE R0,R0,R3
  828. TST R8,#1<<7
  829. ANDNE R7,R7,#&FF
  830. BICNE R0,R0,#&FF
  831. ORRNE R0,R0,R7
  832. STR R0,[R10,#tffend.finetune]
  833. TST R8,#1<<4
  834. STRNE R4,[R10,#tffend.repofs]
  835. CMP R5,#2
  836. MOVLT R5,#2
  837. TST R8,#1<<5
  838. STRNE R5,[R10,#tffend.replen]
  839. ANDS R0,R8,#1<<6
  840. LDMNEFD R13!,{R1-R11,R14}
  841. BNE puterr
  842. LDMFD R13!,{R1-R11,PC}
  843.  
  844. .putuserinfo
  845. TST R8,#1<<2
  846. STRNE R2,[R11,#userform.len]
  847. TST R8,#1<<4
  848. STRNE R4,[R11,#userform.repofs]
  849. TST R8,#1<<5
  850. STRNE R5,[R11,#userform.replen]
  851. TST R8,#1<<6
  852. STRNE R6,[R11,#userform.addr]
  853. ANDS R0,R8,#%10001010
  854. LDMNEFD R13!,{R1-R11,R14}
  855. BNE puterr
  856. LDMFD R13!,{R1-R11,PC}
  857.  
  858. .putalieninfo
  859. MOV R0,#alien.putinfo
  860. BL alienjump
  861. LDMFD R13!,{R1-R11,R14}
  862. CMP R0,#0
  863. BNE puterr
  864. MOVS PC,R14
  865.  
  866. .getslotinfo
  867. ;returns
  868. ;R0=slot no
  869. ;R1=name
  870. ;R2=length
  871. ;R3=finetune
  872. ;R4=repofs
  873. ;R5=replen
  874. ;R6=datastart
  875. ;R7=volume
  876. ;R8=format name
  877.  
  878. STMFD R13!,{R10-R11,R14}
  879. getslotaddr R0,R10
  880. LDR R7,[R10,#s.type]
  881. CMP R7,#type_empty
  882. BEQ getemptyinfo
  883. LDR R8,[R10,#s.format]
  884.  
  885. LDR R11,[R10,#s.addr]
  886. CMP R8,#format_stasis
  887. BEQ getstasisinfo
  888. CMP R8,#format_tracker
  889. BEQ gettrackerinfo
  890. CMP R8,#format_alien
  891. BEQ getalieninfo
  892. CMP R8,#format_user
  893. BEQ getuserinfo
  894. MOV R6,R11
  895. B getunknowninfo
  896.  
  897. .getemptyinfo
  898. MOV R6,#0
  899. .getunknowninfo
  900. MOV R1,#0
  901. MOV R2,#0
  902. MOV R3,#0
  903. MOV R4,#0
  904. MOV R5,#0
  905. MOV R8,#0
  906. LDMFD R13!,{R10-R11,PC}
  907.  
  908. .getstasisinfo
  909. ADD R1,R11,#stasisform.name
  910. LDR R2,[R11,#stasisform.len]
  911. LDR R3,[R11,#stasisform.finetune]
  912. LDR R4,[R11,#stasisform.repofs]
  913. LDR R5,[R11,#stasisform.replen]
  914. LDR R6,[R11,#stasisform.dataofs]
  915. ADD R6,R11,R6
  916. MOV R7,#0
  917. MOV R8,#0
  918. LDMFD R13!,{R10-R11,PC}
  919.  
  920. .gettrackerinfo
  921. ADD R1,R11,#tffstart.name
  922. LDR R0,[R11,#tffstart.namelen]
  923. ADD R10,R1,R0
  924.  
  925. LDR R2,[R10,#tffend.len]
  926. LDR R3,[R10,#tffend.finetune]
  927. AND R7,R3,#&FF;volume entry
  928. MOV R3,R3,LSR #24
  929. ADD R3,R3,#finetune_default
  930. LDR R4,[R10,#tffend.repofs]
  931. LDR R5,[R10,#tffend.replen]
  932. ADD R6,R10,#tffend.sizeof
  933. MOV R8,#0
  934. LDMFD R13!,{R10-R11,PC}
  935.  
  936. .getuserinfo
  937. MOV R1,#0
  938. LDR R2,[R11,#userform.len]
  939. MOV R3,#0
  940. LDR R4,[R11,#userform.repofs]
  941. LDR R5,[R11,#userform.replen]
  942. LDR R6,[R11,#userform.addr]
  943. MOV R7,#0
  944. MOV R8,#0
  945. LDMFD R13!,{R10-R11,PC}
  946.  
  947. .alienid
  948. DCB "StAl"
  949. .getalieninfo
  950. MOV R0,#alien.getinfo
  951. STMFD R13!,{R9}
  952. BL alienjump
  953. LDMFD R13!,{R9}
  954. MOVVS R2,#0
  955. MOVVS R6,#0
  956. LDMFD R13!,{R10-R11,PC}
  957.  
  958. .alienjump
  959. STMFD R13!,{R14}
  960. STMFD R13!,{R0-R1}
  961. LDR R9,[R10,#s.alien]
  962. LDR R1,[R9,#alien.id]
  963. LDR R0,alienid
  964. CMP R0,R1
  965. LDMFD R13!,{R0-R1}
  966. LDMNEFD R13!,{R14}
  967. BNE badalienerr
  968. LDR R14,[R9,R0]
  969. CMP R14,#0
  970. LDMEQFD R13!,{PC}
  971. ADD R9,R9,R14
  972. MOV R0,R10
  973. MOV R1,R11
  974. STMFD R13!,{R10-R12}
  975. MOV R14,PC
  976. MOV PC,R9
  977. LDMFD R13!,{R10-R12}
  978. LDMFD R13!,{PC}
  979.  
  980. .getalienaddr
  981. STMFD R13!,{R1-R3,R14}
  982. LDR R3,[R10,#s.alien]
  983. LDR R1,[R3,#alien.id]
  984. LDR R2,alienid
  985. CMP R2,R1
  986. LDMNEFD R13!,{R1-R3,R14}
  987. BNE badalienerr
  988. ADD R0,R0,R3
  989. LDMFD R13!,{R1-R3,PC}
  990.  
  991. .getalienindirect
  992. STMFD R13!,{R1-R3,R14}
  993. LDR R3,[R10,#s.alien]
  994. LDR R1,[R3,#alien.id]
  995. LDR R2,alienid
  996. CMP R2,R1
  997. LDMNEFD R13!,{R1-R3,R14}
  998. BNE badalienerr
  999. LDR R0,[R3,R0]
  1000. CMP R0,#0
  1001. ADDNE R0,R0,R3
  1002. LDMFD R13!,{R1-R3,PC}
  1003.  
  1004.  
  1005. .putstasisform
  1006. STMFD R13!,{R3-R6,R10,R14}
  1007. CMP R1,#0
  1008. ADREQ R1,nullname
  1009. ADD R0,R11,#stasisform.name
  1010. STMFD R13!,{R5}
  1011. MOV R5,#namelen
  1012. BL namecopy
  1013. LDMFD R13!,{R5}
  1014. STR R2,[R11,#stasisform.len]
  1015. STR R3,[R11,#stasisform.finetune]
  1016. STR R4,[R11,#stasisform.repofs]
  1017. STR R5,[R11,#stasisform.replen]
  1018. MOV R6,#stasisform.sizeof
  1019. STR R6,[R11,#stasisform.dataofs]
  1020. MOV R1,#stasisform.sizeof
  1021. MOV R2,#filetype_stasis
  1022. LDMFD R13!,{R3-R6,R10,PC}
  1023.  
  1024. .puttrackerform
  1025. STMFD R13!,{R3-R6,R10,R14}
  1026. CMP R1,#0
  1027. ADREQ R1,nullname
  1028. ADD R0,R11,#tffstart.name
  1029. STMFD R13!,{R5}
  1030. MOV R5,#namelen
  1031. BL namecopy
  1032. LDMFD R13!,{R5}
  1033. ADD R10,R11,#tffstart.sizeof
  1034. STR R2,[R10,#tffend.len]
  1035. STR R2,[R10,#tffend.dataofs]
  1036. ADD R2,R2,#tffend.sizeof
  1037. SUB R2,R2,#5   ; (-8 +3)
  1038. BIC R2,R2,#3
  1039. STR R2,[R11,#tffstart.blocklen]
  1040. ORR R3,R3,#&FF
  1041. STR R3,[R10,#tffend.finetune]
  1042. STR R4,[R10,#tffend.repofs]
  1043. CMP R5,#2
  1044. MOVLT R5,#2
  1045. STR R5,[R10,#tffend.replen]
  1046.  
  1047. MOV R1,#tffstart.sizeof+tffend.sizeof
  1048. MOV R2,#filetype_tracker
  1049. LDMFD R13!,{R3-R6,R10,PC}
  1050. .ids
  1051. DCB "Sta1"
  1052. DCB "SAMP"
  1053. .userid
  1054. DCB "User"
  1055. ALIGN
  1056.  
  1057. .formatsample
  1058. STMFD R13!,{R0-R8,R14}
  1059. ADR R4,ids
  1060. LDMIA R4,{R1-R3}
  1061. LDR R0,[R10,#s.addr]
  1062. LDR R0,[R0]
  1063. MOV R4,#format_unknown
  1064. CMP R0,R1
  1065. MOVEQ R4,#format_stasis
  1066. CMP R0,R2
  1067. MOVEQ R4,#format_tracker
  1068. CMP R0,R3
  1069. MOVEQ R4,#format_user
  1070. CMP R4,#format_unknown
  1071. BLEQ vetunknown
  1072. STR R4,[R10,#s.format]
  1073. LDMFD R13!,{R0-R8,PC}
  1074.  
  1075. .vetunknown
  1076. STMFD R13!,{R14}
  1077. LDR R0,[R10,#s.addr]
  1078. LDR R2,[R12,#v.filetype]
  1079. LDR R3,[R10,#s.length]
  1080. MOV R1,#Service_UKStasisFormat
  1081. SWI OS_ServiceCall
  1082. CMP R1,#0
  1083. MOVNE R4,#format_unknown
  1084. LDMNEFD R13!,{PC}
  1085. STR R0,[R10,#s.alien]
  1086. MOV R4,#format_alien
  1087. LDMFD R13!,{PC}
  1088.  
  1089. .sampleload
  1090. STMFD R13!,{R14}
  1091. LDR R12,[R12]        ;where's my workspace?
  1092. MOV R4,R1
  1093. MOV R1,R0
  1094. MOV R0,#10
  1095. SWI OS_ReadUnsigned 
  1096. MOV R0,R2
  1097. MOV R2,#type_rma
  1098. CMP R4,#3
  1099. MOVEQ R2,#type_amnesia
  1100. ADD R1,R1,#1
  1101. BL loadswi
  1102. LDMFD R13!,{PC}
  1103.  
  1104. .weedslots
  1105. STMFD R13!,{R1-R11,R14}
  1106. MOV R4,R0
  1107. MOV R5,R1
  1108. ADD R11,R12,#v.slottab
  1109. MOV R3,#0
  1110. .weedloop
  1111. LDR R0,[R11,R4]
  1112. CMP R0,R5
  1113. BLEQ weedit
  1114. ADD R11,R11,#s.sizeof
  1115. ADD R3,R3,#1
  1116. CMP R3,#entries
  1117. BLT weedloop
  1118. LDMFD R13!,{R1-R11,PC}^
  1119.  
  1120. .weedit
  1121. STMFD R13!,{R14}
  1122. CMP R4,#s.type
  1123. CMPEQ R5,#type_amnesia
  1124. BEQ weedamnesia
  1125. MOV R0,R3
  1126. BL releaseslot
  1127. .weedins
  1128. LDMFD R13!,{PC}
  1129. .weedamnesia
  1130. MOV R0,R3
  1131. BL stopslot
  1132. MOV R0,#0
  1133. STR R0,[R11,#s.addr]
  1134. MOV R0,#type_empty
  1135. STR R0,[R11,#s.type]
  1136. B weedins
  1137.  
  1138. .loadswi
  1139. STMFD R13!,{R1-R9,R14}
  1140. STMFD R13!,{R0-R3}
  1141. MOV R0,#5
  1142. SWI XOS_File
  1143. LDMVSFD R13!,{R1-R4}
  1144. LDMVSFD R13!,{R1-R9,PC}
  1145. MOV R4,R2,LSL #12
  1146. MOV R4,R4,LSR #20
  1147. CMP R0,#1
  1148. MOVNE R14,R0
  1149. LDMFD R13!,{R0-R3}
  1150. MOVNE R0,R14
  1151. LDMNEFD R13!,{R1-R9,R14}
  1152. BNE notafileerr
  1153. STR R4,[R12,#v.filetype]
  1154. STMFD R13!,{R0-R3}
  1155. BL releaseslot
  1156. MOVVS R14,R0
  1157. LDMFD R13!,{R0-R3}
  1158. MOVVS R0,R14
  1159. LDMVSFD R13!,{R1-R9,PC}
  1160.  
  1161. getslotaddr R0,R10
  1162. TEQ R2,#type_amnesia
  1163. BLEQ amnesiaload
  1164. LDMVSFD R13!,{R1-R9,PC}
  1165. TEQ R2,#type_amnesia
  1166. BLNE rmaload
  1167. LDMVSFD R13!,{R1-R9,PC}
  1168. filelength R1,R0
  1169. MOVVS R0,#0
  1170. MOVNE R0,#0
  1171. STR R0,[R10,#s.length]
  1172. BL formatsample
  1173. LDMFD R13!,{R1-R9,PC}
  1174.  
  1175. .releaseslot
  1176. STMFD R13!,{R1-R10,R14}
  1177. getslotaddr R0,R10
  1178. BL stopslot
  1179. LDR R0,[R10,#s.type]
  1180. CMP R0,#type_empty
  1181. LDMEQFD R13!,{R1-R10,PC}
  1182. LDR R1,[R10,#s.format]
  1183. CMP R1,#format_alien
  1184. BLEQ alienrelease
  1185. LDR R0,[R10,#s.type]
  1186. CMP R0,#type_amnesia
  1187. BEQ amnesiarelease
  1188. CMP R0,#type_rma
  1189. BEQ rmarelease
  1190. CMP R0,#type_user
  1191. BEQ rmarelease ; Yes, this is correct
  1192. CMP R0,#type_link
  1193. CMPNE R0,#type_safelink
  1194. BEQ linkrelease
  1195. LDMFD R13!,{R1-R10,R14}
  1196. B releaseerr
  1197. .releaseslotins
  1198. LDMFD R13!,{R1-R10,PC}
  1199.  
  1200. .stopslot
  1201. STMFD R13!,{R1-R5,R14}
  1202. MOV R3,#0
  1203. .stoploop
  1204. getconaddr R3,R5
  1205. LDR R1,[R5,#con.slot]
  1206. CMP R1,R0
  1207. LDREQ R1,[R5,#con.status]
  1208. ORREQ R1,R1,#status_gated
  1209. STREQ R1,[R5,#con.status]
  1210. ADD R3,R3,#1
  1211. CMP R3,#8
  1212. BLT stoploop
  1213. LDMFD R13!,{R1-R5,PC}
  1214.  
  1215. .alienrelease
  1216. STMFD R13!,{R0-R1,R7-R11,R14}
  1217. LDR R11,[R10,#s.addr]
  1218. MOV R0,#alien.release
  1219. BL alienjump
  1220. ;MOV R0,#type_empty
  1221. ;STR R0,[R10,#s.type]
  1222. LDMFD R13!,{R0-R1,R7-R11,PC}
  1223.  
  1224. .amnesiarelease
  1225. LDR R0,[R10,#s.addr]
  1226. CMP R0,#&8000
  1227. SWIGE XAmnesia_ReleaseBlock
  1228. MOV R0,#type_empty
  1229. STR R0,[R10,#s.type]
  1230. B releaseslotins
  1231.  
  1232. .rmarelease
  1233. LDR R0,[R10]
  1234. releaserma R0
  1235. MOV R0,#type_empty
  1236. STR R0,[R10,#s.type]
  1237. B releaseslotins
  1238.  
  1239. .linkrelease
  1240. MOV R0,#type_empty
  1241. STR R0,[R10,#s.type]
  1242. B releaseslotins
  1243.  
  1244. .amnesiaload
  1245. STMFD R13!,{R2,R14}
  1246. ADD R0,R10,#s.addr
  1247. MOV R2,#0
  1248. SWI XAmnesia_LoadFile
  1249. MOV R2,#type_amnesia
  1250. MOVVS R2,#type_empty
  1251. STR R2,[R10,#s.type]
  1252. LDMFD R13!,{R2,PC}
  1253.  
  1254. .rmaload
  1255. STMFD R13!,{R1-R2,R14}
  1256. loadrma R1,R2
  1257. LDMVSFD R13!,{R1-R2,PC}
  1258. STR R2,[R10,#s.addr]
  1259. MOV R2,#type_rma
  1260. STR R2,[R10,#s.type]
  1261. LDMFD R13!,{R1-R2,PC}
  1262.  
  1263. .usercreate
  1264. STMFD R13!,{R1-R7,R14}
  1265. MOV R0,#userform.sizeof
  1266. claimrma R0,R2
  1267. LDMVSFD R13!,{R1-R7,R14}
  1268. BVS noroomerr
  1269. STR R2,[R10,#s.addr]
  1270. MOV R0,#type_user
  1271. STR R0,[R10,#s.type]
  1272. MOV R0,#format_user
  1273. STR R0,[R10,#s.format]
  1274. ADR R0,userid
  1275. LDR R0,[R0]
  1276. STR R0,[R2]
  1277. MOV R0,#0
  1278. STR R0,[R2,#4]
  1279. STR R0,[R2,#8]
  1280. STR R0,[R2,#12]
  1281. STR R0,[R2,#16]
  1282. LDMFD R13!,{R1-R7,PC}
  1283.  
  1284. .closefile
  1285. STMFD R13!,{R14}
  1286. MOV R0,#0
  1287. MOV R1,R9
  1288. CMP R1,#0
  1289. SWINE XOS_Find 
  1290. LDMFD R13!,{PC}^
  1291.  
  1292.  
  1293. .namecopy
  1294. STMFD R13!,{R0-R5,R14}
  1295. ;R5=namelen
  1296. MOV R4,#0
  1297. .loop10         ;Copy name
  1298. LDRB R2,[R1,R4]
  1299. CMP R2,#&20
  1300. BLT jumpout
  1301. STRB R2,[R0,R4]
  1302. ADD R4,R4,#1
  1303. CMP R4,R5
  1304. BLT loop10
  1305. LDMFD R13!,{R0-R5,PC}
  1306. .jumpout
  1307. MOV R2,#0
  1308. STRB R2,[R0,R4]
  1309. ADD R4,R4,#1
  1310. CMP R4,R5
  1311. BLT jumpout
  1312. LDMFD R13!,{R0-R5,PC}
  1313.  
  1314. .setname
  1315. STMFD R13!,{R14}
  1316. LDR R12,[R12]
  1317. MOV R1,R0
  1318. MOV R0,#10
  1319. SWI OS_ReadUnsigned 
  1320. MOV R0,R2
  1321. ADD R1,R1,#1
  1322. BL nameswi
  1323. LDMFD R13!,{PC}
  1324.  
  1325. .nameswi
  1326. STMFD R13!,{R8,R14}
  1327. MOV R8,#1<<1
  1328. BL putslotinfo
  1329. LDMFD R13!,{R8,PC}
  1330.  
  1331. .setfinetune
  1332. STMFD R13!,{R14}
  1333. LDR R12,[R12]
  1334. MOV R1,R0
  1335. MOV R0,#10
  1336. SWI OS_ReadUnsigned 
  1337. MOV R8,R2
  1338. MOV R0,#16
  1339. SWI OS_ReadUnsigned 
  1340. MOV R0,R8
  1341. MOV R3,R2
  1342. MOV R8,#1<<3
  1343. BL putslotinfo
  1344. LDMFD R13!,{PC}
  1345.  
  1346. .setrepeat
  1347. STMFD R13!,{R14}
  1348. LDR R12,[R12]
  1349. MOV R1,R0
  1350. MOV R0,#10
  1351. SWI OS_ReadUnsigned 
  1352. MOV R8,R2
  1353. MOV R0,#16
  1354. SWI OS_ReadUnsigned 
  1355. MOV R4,R2
  1356. MOV R0,#16
  1357. SWI OS_ReadUnsigned 
  1358. MOV R5,R2
  1359. MOV R0,R8
  1360. MOV R8,#3<<4
  1361. BL putslotinfo
  1362. LDMFD R13!,{PC}
  1363.  
  1364. .setlength
  1365. STMFD R13!,{R14}
  1366. LDR R12,[R12]
  1367. MOV R1,R0
  1368. MOV R0,#10
  1369. SWI OS_ReadUnsigned 
  1370. MOV R8,R2
  1371. MOV R0,#16
  1372. SWI OS_ReadUnsigned 
  1373. MOV R0,R8
  1374. MOV R8,#1<<2
  1375. BL putslotinfo
  1376. LDMFD R13!,{PC}
  1377.  
  1378. .setvolume
  1379. STMFD R13!,{R14}
  1380. LDR R12,[R12]
  1381. MOV R1,R0
  1382. MOV R0,#10
  1383. SWI OS_ReadUnsigned 
  1384. MOV R8,R2
  1385. MOV R0,#16
  1386. SWI OS_ReadUnsigned
  1387. MOV R7,R2 
  1388. MOV R0,R8
  1389. MOV R8,#1<<7
  1390. BL putslotinfo
  1391. LDMFD R13!,{PC}
  1392.  
  1393. .volslidecom
  1394. STMFD R13!,{R14}
  1395. LDR R12,[R12]
  1396. MOV R1,R0
  1397. MOV R0,#10
  1398. SWI OS_ReadUnsigned 
  1399. MOV R3,R2
  1400. MOV R0,#16
  1401. SWI OS_ReadUnsigned
  1402. MOV R4,R2 
  1403. MOV R0,#16
  1404. SWI OS_ReadUnsigned
  1405. MOV R0,R3
  1406. MOV R1,R4
  1407. BL volslideswi
  1408. LDMFD R13!,{PC}
  1409.  
  1410. .volslideswi
  1411. STMFD R13!,{R14}
  1412. MOV R3,R2
  1413. MOV R2,R1
  1414. MOV R1,#0
  1415. BL slideswi
  1416. LDMFD R13!,{PC}
  1417.  
  1418. .pitchslidecom
  1419. STMFD R13!,{R14}
  1420. LDR R12,[R12]
  1421. MOV R1,R0
  1422. MOV R0,#10
  1423. SWI OS_ReadUnsigned 
  1424. MOV R3,R2
  1425. MOV R0,#16
  1426. SWI OS_ReadUnsigned
  1427. MOV R4,R2 
  1428. MOV R0,#16
  1429. SWI OS_ReadUnsigned
  1430. MOV R0,R3
  1431. MOV R1,R4
  1432. BL pitchslideswi
  1433. LDMFD R13!,{PC}
  1434.  
  1435. .pitchslideswi
  1436. STMFD R13!,{R14}
  1437. MOV R3,R2
  1438. MOV R2,R1
  1439. MOV R1,#1
  1440. BL slideswi
  1441. LDMFD R13!,{PC}
  1442.  
  1443. .slideswi
  1444. STMFD R13!,{R1-R3,R14}
  1445. SUB R10,R0,#1
  1446. AND R10,R10,#7
  1447. getconaddr R10,R11
  1448. AND R1,R1,#3
  1449. CMP R1,#0
  1450. BLEQ slidevolconv
  1451. CMP R1,#1
  1452. BLEQ slidepitchconv
  1453. ADD R10,R11,#con.slides
  1454. ADD R10,R10,R1,LSL #3
  1455. TST R0,#1<<29   ;all of these perform the action if the bit is zero
  1456. BLEQ slidetimeconv
  1457. TST R0,#1<<29
  1458. BLNE sliderateconv
  1459. TST R0,#1<<31
  1460. STREQ R2,[R10]
  1461. TST R0,#1<<30
  1462. STREQ R3,[R10,#4]
  1463. LDR R0,[R11,#con.status]
  1464. MOV R3,#status_slide
  1465. ORR R0,R0,R3,LSL R1
  1466. STR R0,[R11,#con.status]
  1467. MOV R0,R2
  1468. LDMFD R13!,{R1-R3,PC}
  1469.  
  1470. .slidetimeconv
  1471. STMFD R13!,{R0-R1,R14}
  1472. CMP R1,#0
  1473. LDREQ R0,[R11,#con.volume]
  1474. CMP R1,#1
  1475. LDREQ R0,[R11,#con.pitch]
  1476. SUB R0,R2,R0
  1477. MYDIV R1,R0,R3
  1478. MOV R3,R1,ASL #1
  1479. LDMFD R13!,{R0-R1,PC}
  1480.  
  1481. .sliderateconv
  1482. STMFD R13!,{R0-R1,R14}
  1483. CMP R1,#0
  1484. LDREQ R0,[R11,#con.volume]
  1485. CMP R1,#1
  1486. LDREQ R0,[R11,#con.pitch]
  1487. SUBS R0,R2,R0
  1488. LDMPLFD R13!,{R0-R1,PC}
  1489. CMP R3,#0
  1490. RSBGT R3,R3,#0
  1491. LDMFD R13!,{R0-R1,PC}
  1492.  
  1493. .volumeswi
  1494. STMFD R13!,{R1-R4,R14}
  1495. MOV R2,R1
  1496. MOV R4,#ig_slot+ig_pitch+ig_update
  1497. BL soundswi
  1498. LDMFD R13!,{R1-R4,PC}
  1499.  
  1500. .odrcommand
  1501. STMFD R13!,{R14}
  1502. SWI OS_WriteS
  1503. DCB "Overdrive is no longer supported by this module",10,13,0
  1504. ALIGN
  1505. LDMFD R13!,{PC}
  1506.  
  1507. .getaddressswi
  1508. MOV R0,R12
  1509. MOV PC,R14
  1510.  
  1511. .statecom
  1512. STMFD R13!,{R14}
  1513. LDR R12,[R12]
  1514. MOV R3,R1
  1515. MOV R1,R0
  1516. MOV R0,#10
  1517. CMP R3,#0
  1518. MOV R2,#1
  1519. SWIGT OS_ReadUnsigned 
  1520. MOV R0,R2
  1521. CMP R0,#8
  1522. ANDGT R0,R0,#7
  1523. BL stateswi
  1524. LDMFD R13!,{PC}
  1525.  
  1526. .stateswi
  1527. STMFD R13!,{R1-R10,R14}
  1528. BL stateinfo
  1529. LDMFD R13!,{R1-R10,PC}
  1530.  
  1531. .stateinfo
  1532. MOV R3,R0
  1533. SUBS R0,R0,#1
  1534. AND R0,R0,#7
  1535. BPL channelinfo
  1536. STMFD R13!,{R14}
  1537. write
  1538. DCB "State of module"
  1539. DCB 10,13,"Workspace address &"
  1540. endwrite
  1541. MOV R0,R12
  1542. BL writehex8
  1543. write
  1544. DCB 10,13,"Sample rate       &"
  1545. endwrite
  1546. LDR R0,[R12,#v.samprate]
  1547. BL writehex4
  1548. write
  1549. DCB 10,13,"Master tuning     &"
  1550. endwrite
  1551. LDR R0,[R12,#v.mastertune]
  1552. BL writehex4
  1553. write
  1554. DCB 10,13,"Real tuning       &"
  1555. endwrite
  1556. LDR R0,[R12,#v.realtune]
  1557. BL writehex4
  1558. write
  1559. DCB 10,13,"100Hz timer       &"
  1560. endwrite
  1561. LDR R0,[R12,#v.timer]
  1562. BL writehex4
  1563. write
  1564. DCB 10,13,"Rate change callbacks sent     &"
  1565. endwrite
  1566. LDR R0,[R12,#v.callbacks]
  1567. BL writehex4
  1568. write
  1569. DCB 10,13,"Rate change callbacks received &"
  1570. endwrite
  1571. LDR R0,[R12,#v.received]
  1572. BL writehex4
  1573. SWI OS_NewLine
  1574. LDMFD R13!,{PC}
  1575.  
  1576.  
  1577. .channelinfo
  1578. STMFD R13!,{R14}
  1579. getconaddr R0,R11
  1580. write
  1581. DCB "State of channel "
  1582. endwrite
  1583. MOV R0,R3
  1584. BL writecard
  1585. write
  1586. DCB 10,13,"Last played slot "
  1587. endwrite
  1588. LDR R0,[R11,#con.slot]
  1589. BL writecard
  1590. write
  1591. DCB 10,13,"Control block address &"
  1592. endwrite
  1593. MOV R0,R11
  1594. BL writehex8
  1595. write
  1596. DCB 10,13,"Sample address &"
  1597. endwrite
  1598. LDR R0,[R11,#con.addr]
  1599. BL writehex8
  1600. write
  1601. DCB 10,13,"Sample length  &"
  1602. endwrite
  1603. LDR R0,[R11,#con.length]
  1604. BL writehex8
  1605. write
  1606. DCB 10,13,"Repeat offset  &"
  1607. endwrite
  1608. LDR R0,[R11,#con.repofs]
  1609. BL writehex4
  1610. write
  1611. DCB 10,13,"Repeat length  &"
  1612. endwrite
  1613. LDR R0,[R11,#con.replen]
  1614. BL writehex4
  1615. write
  1616. DCB 10,13,"Pitch (internal)  &"
  1617. endwrite
  1618. LDR R0,[R11,#con.pitch]
  1619. BL writehex8
  1620. write
  1621. DCB 10,13,"Raw pitch         &"
  1622. endwrite
  1623. LDR R0,[R11,#con.rawpitch]
  1624. BL writehex8
  1625. write
  1626. DCB 10,13,"Volume (internal) &"
  1627. endwrite
  1628. LDR R0,[R11,#con.volume]
  1629. BL writehex8
  1630. write
  1631. DCB 10,13,"Log amp table at  &"
  1632. endwrite
  1633. LDR R0,[R11,#con.logampadr]
  1634. BL writehex8
  1635. write
  1636. DCB 10,13,"Phase accumulator &"
  1637. endwrite
  1638. LDR R0,[R11,#con.acc]
  1639. BL writehex8
  1640. write
  1641. DCB 10,13,"State changes     &"
  1642. endwrite
  1643. LDR R0,[R11,#con.states]
  1644. BL writehex4
  1645. write
  1646. DCB 10,13,"Current state     &"
  1647. endwrite
  1648. LDR R0,[R11,#con.laststate]
  1649. BL writehex8
  1650. write
  1651. DCB 10,13,"Previous state    &"
  1652. endwrite
  1653. LDR R0,[R11,#con.prevstate]
  1654. BL writehex8
  1655. write
  1656. DCB 10,13,"Auto rate changes &"
  1657. endwrite
  1658. LDR R0,[R11,#con.ratechange]
  1659. BL writehex4
  1660. write
  1661. DCB 10,13,"Buffer 1 address  &"
  1662. endwrite
  1663. LDR R0,[R11,#con.buf1]
  1664. BL writehex8
  1665. write
  1666. DCB 10,13,"Buffer 2 address  &"
  1667. endwrite
  1668. LDR R0,[R11,#con.buf2]
  1669. BL writehex8
  1670. write
  1671. DCB 10,13,"Last buffer filled = "
  1672. endwrite
  1673. LDR R0,[R11,#con.lastbuf]
  1674. BL writecard
  1675. write
  1676. DCB 10,13,"Flash buffer fills &"
  1677. endwrite
  1678. LDR R0,[R11,#con.flashbufs]
  1679. BL writehex4
  1680. write
  1681. DCB 10,13,"Fast buffer fills  &"
  1682. endwrite
  1683. LDR R0,[R11,#con.fastbufs]
  1684. BL writehex4
  1685. write
  1686. DCB 10,13,"Slow buffer fills  &"
  1687. endwrite
  1688. LDR R0,[R11,#con.slowbufs]
  1689. BL writehex4
  1690. write
  1691. DCB 10,13,"Fixed pitch fills  &"
  1692. endwrite
  1693. LDR R0,[R11,#con.fixedbufs]
  1694. BL writehex4
  1695. write
  1696. DCB 10,13,"Buffer flushes     &"
  1697. endwrite
  1698. LDR R0,[R11,#con.flushes]
  1699. BL writehex4
  1700. write
  1701. DCB 10,13,"Kicks              &"
  1702. endwrite
  1703. LDR R0,[R11,#con.kicks]
  1704. BL writehex4
  1705. write
  1706. DCB 10,13,"Channel status :",10,13
  1707. endwrite
  1708. LDR R1,[R11,#con.status]
  1709. TST R1,#status_volslide
  1710. ADRNE R0,volslidetext
  1711. ADDNE R2,R11,#con.volslide
  1712. BLNE writeslide
  1713. TST R1,#status_pitchslide
  1714. ADRNE R0,pitchslidetext
  1715. ADDNE R2,R11,#con.pitchslide
  1716. BLNE writeslide
  1717.  
  1718. TST R1,#status_gated
  1719. ADRNE R0,gatedtext
  1720. SWINE OS_Write0
  1721. TST R1,#status_q1
  1722. ADRNE R0,q1text
  1723. SWINE OS_Write0
  1724. TST R1,#status_q2
  1725. ADRNE R0,q2text
  1726. SWINE OS_Write0
  1727. TST R1,#status_escape
  1728. ADRNE R0,escapetext
  1729. SWINE OS_Write0
  1730. TST R1,#status_kick
  1731. ADRNE R0,kicktext
  1732. SWINE OS_Write0
  1733. TST R1,#status_off
  1734. ADRNE R0,offtext
  1735. SWINE OS_Write0
  1736. TST R1,#status_fresh
  1737. ADRNE R0,freshtext
  1738. SWINE OS_Write0
  1739. TST R1,#status_safe
  1740. ADRNE R0,safetext
  1741. SWINE OS_Write0
  1742. TST R1,#status_attached
  1743. ADRNE R0,attachedtext
  1744. SWINE OS_Write0
  1745. TST R1,#status_live
  1746. ADRNE R0,livetext
  1747. SWINE OS_Write0
  1748. SWI OS_NewLine
  1749. LDMFD R13!,{PC}
  1750.  
  1751.  
  1752.  
  1753. .gatedtext
  1754. DCB "Gated off",10,13,0
  1755. .q1text
  1756. DCB "Buffer 1 flushed",10,13,0
  1757. .q2text
  1758. DCB "Buffer 2 flushed",10,13,0
  1759. .escapetext
  1760. DCB "Silenced by escape",10,13,0
  1761. .livetext
  1762. DCB "Live",10,13,0
  1763. .kicktext
  1764. DCB "Kick active",10,13,0
  1765. .offtext
  1766. DCB "Off",10,13,0
  1767. .freshtext
  1768. DCB "Fresh",10,13,0
  1769. .volslidetext
  1770. DCB "Volume slide,",0
  1771. .pitchslidetext
  1772. DCB "Pitch slide, ",0
  1773. .safetext
  1774. DCB "Safe",10,13,0
  1775. .attachedtext
  1776. DCB "Attached",10,13,0
  1777. ALIGN
  1778.  
  1779. .writeslide
  1780. STMFD R13!,{R0-R1,R14}
  1781. SWI OS_Write0
  1782. write
  1783. DCB " target &"
  1784. endwrite
  1785. LDR R0,[R2]
  1786. BL writehex8
  1787. write
  1788. DCB ", rate &"
  1789. endwrite
  1790. LDR R0,[R2,#4]
  1791. BL writehex8
  1792. write
  1793. DCB ".",10,13
  1794. endwrite
  1795. LDMFD R13!,{R0-R1,PC}
  1796.  
  1797.  
  1798.  
  1799. .infocom
  1800. STMFD R13!,{R14}
  1801. LDR R12,[R12]
  1802. MOV R3,R1
  1803. MOV R1,R0
  1804. MOV R0,#10
  1805. CMP R3,#0
  1806. MOV R2,#1
  1807. SWIGT OS_ReadUnsigned 
  1808. MOV R0,R2
  1809. ANDGT R0,R0,#entries-1
  1810. BL infoswi
  1811. LDMFD R13!,{PC}
  1812.  
  1813. .infoswi
  1814. STMFD R13!,{R1-R10,R14}
  1815. BL infoinfo
  1816. LDMFD R13!,{R1-R10,PC}
  1817.  
  1818. .infoinfo
  1819. STMFD R13!,{R14}
  1820. MOV R9,R0
  1821. getslotaddr R0,R10
  1822. write
  1823. DCB "Information held by Stasis on slot "
  1824. endwrite
  1825. MOV R0,R9
  1826. BL writecard
  1827. LDR R0,[R10,#s.type]
  1828. CMP R0,#type_empty
  1829. BEQ emptyinfo
  1830. write
  1831. DCB 10,13,"======================================="
  1832. DCB 10,10,13,"Address of sample              &"
  1833. endwrite
  1834. LDR R0,[R10,#s.addr]
  1835. BL writehex8
  1836. write
  1837. DCB 10,13,   "Length of file at that address &"
  1838. endwrite
  1839. LDR R0,[R10,#s.length]
  1840. BL writehex8
  1841. write
  1842. DCB 10,13,"Storage type "
  1843. endwrite
  1844. LDR R0,[R10,#s.type]
  1845. BL writecard
  1846. SWI 256+" "
  1847. SWI 256+":"
  1848. SWI 256+" "
  1849. LDR R0,[R10,#s.type]
  1850. BL writetype
  1851. write
  1852. DCB 10,13,"Sample format  : "
  1853. endwrite
  1854. LDR R0,[R10,#s.format]
  1855. BL writeformat
  1856. LDR R0,[R10,#s.format]
  1857. CMP R0,#format_alien
  1858. BLEQ writealien
  1859. write
  1860. DCB 10,10,13,"Information held by sample data"
  1861. DCB    10,13,"===============================",10,13
  1862. endwrite
  1863. MOV R0,R9
  1864. BL getslotinfo
  1865. LDMVSFD R13!,{PC}
  1866. write
  1867. DCB 10,13,"Sample name   : "
  1868. endwrite
  1869. MOV R0,R1
  1870. CMP R0,#0
  1871. ADREQ R0,nullname
  1872. BL writename
  1873. write
  1874. DCB 10,13,   "Sample format : "
  1875. endwrite
  1876. LDR R11,[R10,#s.addr]
  1877. BL writebigformat
  1878. write
  1879. DCB 10,13,"Sample data address  &"
  1880. endwrite
  1881. MOV R0,R6
  1882. BL writehex8
  1883. write
  1884. DCB 10,13,"Sample length        &"
  1885. endwrite
  1886. MOV R0,R2
  1887. BL writehex8
  1888. write
  1889. DCB 10,13,"Sample repeat offset &"
  1890. endwrite
  1891. MOV R0,R4
  1892. BL writehex4
  1893. write
  1894. DCB 10,13,"Sample repeat length &"
  1895. endwrite
  1896. MOV R0,R5
  1897. BL writehex4
  1898. write
  1899. DCB 10,13,"Sample finetune      &"
  1900. endwrite
  1901. MOV R0,R3
  1902. BL writehex4
  1903. write
  1904. DCB 10,13,"Sample volume        &"
  1905. endwrite
  1906. MOV R0,R7
  1907. BL writehex4
  1908. SWI OS_NewLine
  1909. LDMFD R13!,{PC}^
  1910. .emptyinfo
  1911. write
  1912. DCB 10,13,"There is no sample in this slot.",10,13
  1913. endwrite
  1914. LDMFD R13!,{PC}
  1915. .writealien
  1916. STMFD R13!,{R14}
  1917. write
  1918. DCB 10,13,"Alien format description routines at &"
  1919. endwrite
  1920. LDR R0,[R10,#s.alien]
  1921. BL writehex8
  1922. MOV R0,#alien.modname
  1923. BL getalienindirect
  1924. LDMVSFD R13!,{PC}
  1925. LDMEQFD R13!,{PC}
  1926. write
  1927. DCB " in module "
  1928. endwrite
  1929. SWI OS_Write0
  1930. LDMFD R13!,{PC}
  1931.  
  1932. .nullname
  1933. DCB "Sample has no name  ",0
  1934. .nullformat
  1935. DCB "Sample has no format description",0
  1936. ALIGN
  1937.  
  1938. .writebigformat
  1939. STMFD R13!,{R1,R14}
  1940. LDR R0,[R10,#s.format]
  1941. CMP R0,#format_alien
  1942. BEQ writealienformat
  1943. BL writeformat
  1944. MOV R1,#0
  1945. LDR R0,[R10,#s.format]
  1946. CMP R0,#format_stasis
  1947. MOVEQ R1,#filetype_stasis
  1948. CMP R0,#format_tracker
  1949. MOVEQ R1,#filetype_tracker
  1950. .writefiletype
  1951. CMP R1,#0
  1952. BEQ writefiletypeend
  1953. write
  1954. DCB " (filetype &"
  1955. endwrite
  1956. MOV R0,R1
  1957. BL writehex3
  1958. SWI 256+")"
  1959. .writefiletypeend
  1960. LDMFD R13!,{R1,PC}
  1961.  
  1962. .writealienformat
  1963. MOV R1,#0
  1964. MOV R0,#alien.formatname
  1965. BL getalienindirect
  1966. BVS writefiletype
  1967. SWINE OS_Write0
  1968. write 
  1969. DCB ", savename "
  1970. endwrite
  1971. MOV R0,#alien.name
  1972. BL getalienindirect
  1973. BVS writefiletype
  1974. SWINE OS_Write0
  1975. MOV R0,#alien.filetype
  1976. BL getalienaddr
  1977. BVS writefiletype
  1978. LDR R1,[R0]
  1979. B writefiletype
  1980.  
  1981. .writeformat
  1982. STMFD R13!,{R1,R14}
  1983. MOV R1,#0
  1984. CMP R0,#format_unknown
  1985. ADREQ R1,format_unknowntext
  1986. CMP R0,#format_stasis
  1987. ADREQ R1,format_stasistext
  1988. CMP R0,#format_tracker
  1989. ADREQ R1,format_trackertext
  1990. CMP R0,#format_user
  1991. ADREQ R1,format_usertext
  1992. CMP R0,#format_alien
  1993. ADREQ R1,format_alientext
  1994. CMP R1,#0
  1995. ADREQ R1,format_unidentifiedtext
  1996. MOV R0,R1
  1997. SWI OS_Write0
  1998. LDMFD R13!,{R1,PC}
  1999. .format_unknowntext
  2000. DCB "Unknown - checked but not matched to any known format",0
  2001. .format_stasistext
  2002. DCB "Stasis - native format",0
  2003. .format_trackertext
  2004. DCB "Tracker - TFF",0
  2005. .format_usertext
  2006. DCB "User - pointers to user specified memory",0
  2007. .format_alientext
  2008. DCB "Alien - supported by an external module",0
  2009. .format_unidentifiedtext
  2010. DCB "Unidentified - no attempt has been made",0
  2011. ALIGN
  2012.  
  2013.  
  2014. .writetype
  2015. STMFD R13!,{R1,R14}
  2016. MOV R1,#0
  2017. CMP R0,#type_empty
  2018. ADREQ R1,type_emptytext
  2019. CMP R0,#type_rma
  2020. ADREQ R1,type_rmatext
  2021. CMP R0,#type_amnesia
  2022. ADREQ R1,type_amnesiatext
  2023. CMP R0,#type_user
  2024. ADREQ R1,type_usertext
  2025. CMP R0,#type_link
  2026. ADREQ R1,type_linktext
  2027. CMP R0,#type_safelink
  2028. ADREQ R1,type_safelinktext
  2029. CMP R1,#0
  2030. ADREQ R1,type_unidentifiedtext
  2031. MOV R0,R1
  2032. SWI OS_Write0
  2033. LDMFD R13!,{R1,PC}
  2034. .type_emptytext
  2035. DCB "Empty - no sample in this slot",0
  2036. .type_rmatext
  2037. DCB "RMA - stored in the relocatable module area",0
  2038. .type_amnesiatext
  2039. DCB "Amnesia - stored in the current Amnesia area",0
  2040. .type_usertext
  2041. DCB "User - a block of pointers in the RMA point to user memory",0
  2042. .type_linktext
  2043. DCB "Link - a link to a sample in user memory",0
  2044. .type_safelinktext
  2045. DCB "Safe Link - a link to a sample in the RMA",0
  2046. .type_unidentifiedtext
  2047. DCB "Unidentified - storage type is not known - indicates an error",0
  2048. ALIGN
  2049.  
  2050. .samplecat
  2051. STMFD R13!,{R14}
  2052. LDR R12,[R12]
  2053. MOV R3,R1
  2054. MOV R1,R0
  2055. MOV R0,#10
  2056. CMP R3,#0
  2057. MVN R2,#0
  2058. SWIGT OS_ReadUnsigned 
  2059. MOV R4,R2
  2060. CMP R3,#1
  2061. MVN R2,#0
  2062. SWIGT OS_ReadUnsigned 
  2063. MOV R0,R4
  2064. MOV R1,R2
  2065. BL catswi
  2066. LDMFD R13!,{PC}
  2067.  
  2068. .catswi
  2069. STMFD R13!,{R14}
  2070. SWI 256+14; page mode on
  2071. SWI OS_WriteS 
  2072. DCB  " Channel  Slot      Sample Name        Where   Address   Length Repeat Repeat"
  2073. DCB 10
  2074. DCB 13
  2075. DCB  "                                                                Offset Length"
  2076. DCB 10
  2077. DCB 13
  2078. DCB  "=========|====|======================|=======|==========|======|======|======"
  2079. DCB 13
  2080. DCB 10
  2081. DCB 0
  2082. ALIGN
  2083.  
  2084. CMN R0,#1
  2085. MOVEQ R0,#0
  2086. MOVEQ R1,#16
  2087. CMN R1,#1
  2088. MOVEQ R1,R0
  2089. limit R0
  2090. limit R1
  2091. .loop12
  2092. BL sampleinfo
  2093. ADD R0,R0,#1
  2094. CMP R0,R1
  2095. BLE loop12
  2096. LDMFD R13!,{PC}
  2097.  
  2098. .sampleinfo
  2099. STMFD R13!,{R0-R4,R14}
  2100. MOV R5,R0
  2101. ADD R4,R12,#v.linktab
  2102. MOV R3,#0
  2103. .loop13
  2104. LDRB R0,[R4,R3]
  2105. CMP R0,R5
  2106. ADDEQ R0,R3,#"1"   
  2107. SWIEQ OS_WriteC 
  2108. SWINE &120
  2109. ADD R3,R3,#1
  2110. CMP R3,#8
  2111. BLT loop13
  2112.  
  2113. SWI OS_WriteS 
  2114. DCB  " | "
  2115. DCB 0
  2116. ALIGN
  2117. MOV R0,R5
  2118. CMP R0,#10
  2119. SWILT &120
  2120. ADD R1,R12,#v.textbuf
  2121. MOV R2,#16
  2122. SWI OS_ConvertCardinal1 
  2123. MOV R1,#2
  2124. SWI OS_Write0 
  2125. SWI OS_WriteS 
  2126. DCB  " | "
  2127. DCB 0
  2128. ALIGN
  2129. MOV R0,R5
  2130. getslotaddr R0,R7
  2131. LDR R7,[R7,#s.type]
  2132. STMFD R13!,{R7}
  2133. BL getslotinfo
  2134. LDMFD R13!,{R7}
  2135. LDMVSFD R13!,{R0-R4,PC}
  2136. STMFD R13!,{R0-R6}
  2137. MOV R0,R1
  2138. BL writename
  2139. SWI OS_WriteS 
  2140. DCB  " | "
  2141. DCB 0
  2142. ALIGN
  2143. LDMFD R13!,{R0-R6}
  2144.  
  2145. ADR R0,textnowhere
  2146. CMP R7,#type_rma
  2147. ADREQ R0,textrma
  2148. CMP R7,#type_user
  2149. ADREQ R0,textuser
  2150. CMP R7,#type_link
  2151. ADREQ R0,textlink
  2152. CMP R7,#type_safelink
  2153. ADREQ R0,textsafelink
  2154. CMP R7,#type_amnesia
  2155. ADREQ R0,textamnesia
  2156. MOV R1,#5
  2157. SWI OS_WriteN 
  2158. MOV R0,R6
  2159. BL printhex8
  2160. MOV R0,R2
  2161. BL printhex4
  2162. MOV R0,R4
  2163. BL printhex4
  2164. MOV R0,R5
  2165. BL printhex4
  2166. SWI OS_NewLine 
  2167. LDMFD R13!,{R0-R4,PC}
  2168.  
  2169. .printhex4
  2170. STMFD R13!,{R1-R3,R14}
  2171. SWI OS_WriteS 
  2172. DCB  " |"
  2173. DCB 0
  2174. ALIGN
  2175. CMP R0,#2
  2176. BLE printnone4
  2177. ADD R1,R12,#v.textbuf
  2178. MOV R2,#16
  2179. SWI OS_ConvertHex8 
  2180. LDRB R3,[R0,#3]
  2181. CMP R3,#"0"   
  2182. SWIEQ &120
  2183. MOVEQ R1,#4
  2184. ADDEQ R0,R0,#4
  2185. MOVNE R1,#5
  2186. ADDNE R0,R0,#3
  2187. SWI OS_WriteN
  2188. .print4ins 
  2189. LDMFD R13!,{R1-R3,PC}
  2190.  
  2191. .printhex8
  2192. STMFD R13!,{R1-R2,R14}
  2193. SWI OS_WriteS 
  2194. DCB  " | "
  2195. DCB 0
  2196. ALIGN
  2197. CMP R0,#0
  2198. BEQ printnone8
  2199. ADD R1,R12,#v.textbuf
  2200. MOV R2,#16
  2201. SWI OS_ConvertHex8 
  2202. MOV R1,#8
  2203. SWI OS_WriteN
  2204. .print8ins 
  2205. LDMFD R13!,{R1-R2,PC}
  2206.  
  2207. .printnone4
  2208. SWI OS_WriteS 
  2209. DCB  "  -- "
  2210. DCB 0
  2211. ALIGN
  2212. B print4ins
  2213.  
  2214. .printnone8
  2215. SWI OS_WriteS 
  2216. DCB  "  ----  "
  2217. DCB 0
  2218. ALIGN
  2219. B print8ins
  2220.  
  2221. .textnowhere
  2222. DCB  "Empty"
  2223. .textrma
  2224. DCB  " RMA "
  2225. .textuser
  2226. DCB  "User "
  2227. .textlink
  2228. DCB  "Link "
  2229. .textsafelink
  2230. DCB  "SLink"
  2231. .textamnesia
  2232. DCB "Amsia"
  2233. ALIGN
  2234.  
  2235. .writename
  2236. STMFD R13!,{R1-R2,R14}
  2237. MOV R2,R0
  2238. MOV R1,#0
  2239. .loop14
  2240. CMP R2,#0
  2241. LDRNEB R0,[R2,R1]
  2242. MOVEQ R0,#" "
  2243. CMP R0,#" "
  2244. MOVLT R0,#" "
  2245. MOVLT R2,#0
  2246. CMP R0,#&7F
  2247. MOVGE R0,#"?"   
  2248. SWI OS_WriteC 
  2249. ADD R1,R1,#1
  2250. CMP R1,#namelen
  2251. BLT loop14
  2252. LDMFD R13!,{R1-R2,PC}
  2253.  
  2254. .writehex8
  2255. STMFD R13!,{R1-R2,R14}
  2256. ADD R1,R12,#v.textbuf
  2257. MOV R2,#16
  2258. SWI OS_ConvertHex8 
  2259. SWI OS_Write0
  2260. LDMFD R13!,{R1-R2,PC}
  2261.  
  2262. .writehex4
  2263. STMFD R13!,{R1-R2,R14}
  2264. ADD R1,R12,#v.textbuf
  2265. MOV R2,#16
  2266. SWI OS_ConvertHex8
  2267. #rept 4
  2268. LDRB R1,[R0]
  2269. CMP R1,#"0"
  2270. ADDEQ R0,R0,#1
  2271. #endr 
  2272. SWI OS_Write0
  2273. LDMFD R13!,{R1-R2,PC}
  2274.  
  2275. .writehex3
  2276. STMFD R13!,{R1-R2,R14}
  2277. ADD R1,R12,#v.textbuf
  2278. MOV R2,#16
  2279. SWI OS_ConvertHex4
  2280. LDRB R1,[R0]
  2281. CMP R1,#"0"
  2282. ADDEQ R0,R0,#1
  2283. SWI OS_Write0
  2284. LDMFD R13!,{R1-R2,PC}
  2285.  
  2286. .writecard
  2287. STMFD R13!,{R1-R2,R14}
  2288. ADD R1,R12,#v.textbuf
  2289. MOV R2,#16
  2290. SWI OS_ConvertCardinal1
  2291. SWI OS_Write0
  2292. LDMFD R13!,{R1-R2,PC}
  2293.  
  2294. .sample
  2295. STMFD R13!,{R14}
  2296. LDR R12,[R12]
  2297. MOV R10,R1  ;no of params
  2298. MOV R1,R0
  2299. MOV R0,#10
  2300. SWI OS_ReadUnsigned 
  2301. MOV R5,R2
  2302. MOV R0,#16
  2303. SWI OS_ReadUnsigned 
  2304. MOV R6,R2
  2305. MOV R0,#16
  2306. SWI OS_ReadUnsigned 
  2307. MOV R7,R2
  2308. MOV R8,#0
  2309. MOV R9,#0
  2310. CMP R10,#5
  2311. BLT norepspec
  2312. MOV R0,#16
  2313. SWI OS_ReadUnsigned 
  2314. MOV R8,R2
  2315. MOV R0,#16
  2316. SWI OS_ReadUnsigned 
  2317. MOV R9,R2
  2318. .norepspec
  2319. MOV R0,R5
  2320. MOV R1,R6
  2321. MOV R2,R7
  2322. MOV R3,R8
  2323. MOV R4,R9
  2324. BL sampleswi
  2325. LDMFD R13!,{PC}
  2326.  
  2327. .sampleswi
  2328. STMFD R13!,{R1-R9,R14}
  2329. CMP R1,#0
  2330. BEQ samplerelease
  2331. getslotaddr R0,R10
  2332. LDR R9,[R10,#s.type]
  2333. CMP R9,#type_user
  2334. BEQ samplenorelease
  2335. STMFD R13!,{R0-R4}
  2336. BL releaseslot
  2337. MOVVS R14,R0
  2338. LDMFD R13!,{R0-R4}
  2339. MOVVS R0,R14
  2340. LDMVSFD R13!,{R1-R9,PC}
  2341. getslotaddr R0,R10
  2342. BL usercreate
  2343. LDMVSFD R13!,{R1-R9,PC}
  2344. .samplenorelease
  2345. LDR R10,[R10,#s.addr]
  2346. CMN R1,#1
  2347. STRNE R1,[R10,#userform.addr]
  2348. CMN R2,#1
  2349. STRNE R2,[R10,#userform.len]
  2350. CMN R3,#1
  2351. STRNE R3,[R10,#userform.repofs]
  2352. CMN R4,#1
  2353. STRNE R4,[R10,#userform.replen]
  2354. LDMFD R13!,{R1-R9,PC}
  2355. .samplerelease  
  2356. BL releaseslot
  2357. LDMFD R13!,{R1-R9,PC}
  2358.  
  2359. .makelinkswi
  2360. STMFD R13!,{R1-R9,R14}
  2361. getslotaddr R0,R10
  2362.  
  2363. STR R1,[R10,#s.addr]
  2364. CMP R2,#1
  2365. MOV R2,#type_link
  2366. MOVEQ R2,#type_safelink
  2367. STR R2,[R10,#s.type]
  2368. BL formatsample
  2369. LDMFD R13!,{R1-R9,PC}
  2370.  
  2371. .samplelink
  2372. STMFD R13!,{R9-R12,R14}
  2373. LDR R12,[R12]
  2374. MOV R1,R0
  2375. MOV R0,#10
  2376. SWI OS_ReadUnsigned 
  2377. MOV R4,R2
  2378. SWI OS_ReadUnsigned 
  2379. MOV R1,R2
  2380. MOV R0,R4
  2381. BL linkswi
  2382. ADD R0,R0,#1
  2383. BL attachswi
  2384. LDMFD R13!,{R9-R12,R14}
  2385. BVS attacherr
  2386. MOV PC,R14
  2387.  
  2388. .attachswi
  2389. STMFD R13!,{R1-R4,R14}
  2390. ADR R1,voicename
  2391. SWI XSound_AttachNamedVoice
  2392. LDMVSFD R13!,{R1-R4,PC}
  2393. MOV R1,#0
  2394. MOV R2,#0
  2395. MOV R3,#0
  2396. MOV R4,#0
  2397. BL soundswi
  2398. LDMFD R13!,{R1-R4,PC}
  2399.  
  2400. .linkswi
  2401. STMFD R13!,{R2,R14}
  2402. SUB R0,R0,#1
  2403. AND R0,R0,#7
  2404. ADD R2,R12,#v.linktab
  2405. AND R1,R1,#entries-1
  2406. STRB R1,[R2,R0]
  2407. LDMFD R13!,{R2,PC}
  2408.  
  2409. .tunecommand
  2410. STMFD R13!,{R14}
  2411. LDR R12,[R12]
  2412. MOV R1,R0
  2413. MOV R0,#16
  2414. SWI OS_ReadUnsigned
  2415. MOV R0,R2
  2416. BL tuneswi 
  2417. LDMFD R13!,{PC}
  2418.  
  2419. .tuneswi
  2420. STMFD R13!,{R0,R14}
  2421. CMP R0,#0
  2422. MOVEQ R0,#tune_default
  2423. STR R0,[R12,#v.mastertune]
  2424. BL rateupdate
  2425. LDMFD R13!,{R0,PC}
  2426.  
  2427. .service
  2428. CMP R1,#&46
  2429. BEQ modechange
  2430. CMP R1,#&4E
  2431. BEQ newapplication
  2432. STMFD R13!,{R0}
  2433. MOV R0,#Service_Amnesia
  2434. CMP R1,R0
  2435. LDMFD R13!,{R0}
  2436. MOVNES PC,R14
  2437. CMP R3,#0; Area discard
  2438. MOVNES PC,R14
  2439. STMFD R13!,{R0-R1,R14}
  2440. LDR R12,[R12]
  2441. MOV R0,#s.type
  2442. MOV R1,#type_amnesia
  2443. BL weedslots
  2444. LDMFD R13!,{R0-R1,PC}
  2445.  
  2446. .newapplication
  2447. STMFD R13!,{R0-R1,R14}
  2448. LDR R12,[R12]
  2449. MOV R0,#s.type
  2450. MOV R1,#type_link
  2451. BL weedslots
  2452. MOV R0,#s.type
  2453. MOV R1,#type_user
  2454. BL weedslots
  2455. LDMFD R13!,{R0-R1,PC}
  2456.  
  2457. .modechange
  2458. STMFD R13!,{R0-R11,R14}
  2459. MOV R0,#0
  2460. MOV R1,#0
  2461. MOV R2,#0
  2462. MOV R3,#0
  2463. MOV R4,#0
  2464. SWI Sound_Configure
  2465. MOV R5,R0
  2466. MOV R0,#1
  2467. MOV R1,#0
  2468. MOV R3,#0
  2469. MOV R4,#0
  2470. SWI Sound_Configure
  2471. MOV R0,R5
  2472. MOV R1,#0
  2473. MOV R2,#0
  2474. MOV R3,#0
  2475. MOV R4,#0
  2476. SWI Sound_Configure
  2477. LDMFD R13!,{R0-R11,PC}
  2478.  
  2479. .init
  2480. STMFD R13!,{R7-R11,R14}
  2481. LDR R0,[R12]
  2482. CMP R0,#0
  2483. BNE clskip
  2484. MOV R3,#v.sizeof
  2485. claimrma R3,R2
  2486. LDMVSFD R13!,{R7-R11,R14} 
  2487. BVS noroomerr
  2488. STR R2,[R12]
  2489. MOV R0,#0
  2490. MOV R1,#v.sizeof
  2491. .wloop1
  2492. STR R0,[R2],#4
  2493. SUBS R1,R1,#4
  2494. BGT wloop1
  2495. .clskip
  2496. LDR R12,[R12]  ;real workspace
  2497. STR R12,varstr
  2498. ADD R0,R12,#v.contab
  2499. STR R0,constr
  2500. ADR R1,waveinit
  2501. ADD R2,R12,#v.linktab
  2502. LDMIA R1,{R3,R4}
  2503. STMIA R2,{R3,R4};set up the link table
  2504. MOV R0,#tune_default
  2505. STR R0,[R12,#v.mastertune]
  2506. .gameloop
  2507. LDRB R1,[R10],#1
  2508. CMP R1,#32
  2509. BEQ gameloop
  2510. BIC R1,R1,#1<<5
  2511. CMP R1,#"G"   
  2512. BLEQ stasisgame
  2513. MOV R3,#entries
  2514. ADD R2,R12,#v.slottab
  2515. MOV R0,#type_empty
  2516. .loop2
  2517. STR R0,[R2,#s.type]
  2518. ADD R2,R2,#s.sizeof
  2519. SUBS R3,R3,#1
  2520. BGT loop2
  2521. ADD R2,R12,#v.contab
  2522. MOV R3,#con.sizeof*8
  2523. MOV R0,#0
  2524. .loop3
  2525. STR R0,[R2],#4
  2526. SUBS R3,R3,#4
  2527. BGT loop3
  2528. ADR R0,voicebase
  2529. MOV R1,#0
  2530. SWI XSound_InstallVoice
  2531. LDMVSFD R13!,{R7-R11,R14}
  2532. BVS attacherr
  2533. STR R1,[R12,#v.slot]
  2534. BL modechange
  2535. BL rateupdate
  2536. BL claimvector
  2537. MOV R1,#Service_PsychoStarting
  2538. MOV R0,#1
  2539. MOV R2,R12
  2540. SWI OS_ServiceCall
  2541. LDMFD R13!,{R7-R11,PC}
  2542.  
  2543. .stasisgame
  2544. STMFD R13!,{R14}
  2545. MOV R0,#0
  2546. MOV R1,#208
  2547. MOV R2,#48
  2548. MOV R3,#0
  2549. MOV R4,#0
  2550. SWI Sound_Configure 
  2551. LDMFD R13!,{PC}
  2552. .waveinit
  2553. DCD &04030201
  2554. DCD &08070605
  2555.  
  2556. .claimvector
  2557. STMFD R13!,{R14}
  2558. MOV R0,#&1C
  2559. ADR R1,ticker
  2560. MOV R2,R12
  2561. SWI OS_Claim
  2562. LDMFD R13!,{PC}
  2563.  
  2564. .releasevector
  2565. STMFD R13!,{R14}
  2566. MOV R0,#&1C
  2567. ADR R1,ticker
  2568. MOV R2,R12
  2569. SWI OS_Release
  2570. LDMFD R13!,{PC}
  2571.  
  2572. .final
  2573. STMFD R13!,{R7-R11,R14}
  2574. LDR R12,[R12]
  2575. MOV R1,#Service_PsychoDying
  2576. MOV R0,#1
  2577. MOV R2,R12
  2578. SWI OS_ServiceCall
  2579.  
  2580. BL releasevector
  2581. LDR R1,[R12,#v.slot]
  2582. SWI XSound_RemoveVoice 
  2583. ADDVS R0,R0,#4
  2584. SWIVS OS_Write0
  2585. CMP R10,#0
  2586. BLNE releasespace
  2587.  
  2588. LDMFD R13!,{R7-R11,PC}^
  2589.  
  2590. .releasespace
  2591. STMFD R13!,{R1-R11,R14}
  2592. MOV R1,#entries-1
  2593. .loop20
  2594. MOV R0,R1
  2595. BL releaseslot
  2596. ADDVS R0,R0,#4
  2597. SWIVS OS_Write0
  2598. SUBS R1,R1,#1
  2599. BPL loop20
  2600. releaserma R12
  2601. LDMFD R13!,{R1-R11,PC}^
  2602.  
  2603. .voicebase
  2604. B fill
  2605. B update
  2606. B gateon
  2607. B gateoff
  2608. B instance
  2609. B free
  2610. LDMFD R13!,{PC}
  2611. DCD voicename-voicebase
  2612. .voicename
  2613. DCB  "Stasis"
  2614. DCB 0
  2615. ALIGN
  2616. .workstr
  2617. DCD 0
  2618. ALIGN
  2619.  
  2620. .instance
  2621. STMFD R13!,{R0-R4,R12}
  2622. LDR R12,varstr
  2623. getconaddr R0,R1
  2624. MOV R0,#status_fresh+status_attached
  2625. STR R0,[R1,#con.status]
  2626. MOV R0,#0
  2627. MOV R1,#0
  2628. MOV R2,#0
  2629. MOV R3,#0
  2630. MOV R4,#0
  2631. SWI Sound_Configure 
  2632. LDR R0,[R3,#12]
  2633. STR R0,[R12,#v.logampadr]
  2634. LDMFD R13!,{R0-R4,R12,PC}
  2635.  
  2636. .free
  2637. STMFD R13!,{R0-R1,R12}
  2638. LDR R12,varstr
  2639. getconaddr R0,R1
  2640. MOV R0,#0
  2641. STR R0,[R1,#con.status]
  2642. LDMFD R13!,{R0-R1,R12,PC}
  2643.  
  2644.  
  2645. .soundcommand
  2646. STMFD R13!,{R9-R12,R14}
  2647. LDR R12,[R12]
  2648. MOV R1,R0
  2649. MOV R0,#10
  2650. SWI OS_ReadUnsigned 
  2651. MOV R4,R2
  2652. SWI OS_ReadUnsigned 
  2653. MOV R5,R2
  2654. SWI OS_ReadUnsigned 
  2655. MOV R6,R2
  2656. SWI OS_ReadUnsigned 
  2657. MOV R7,R2
  2658. MOV R0,R4
  2659. MOV R1,R5
  2660. MOV R2,R6
  2661. MOV R3,R7
  2662. MOV R4,#0
  2663. MOV R5,#0
  2664. BL soundswi
  2665. LDMFD R13!,{R9-R12,PC}
  2666.  
  2667. .soundswi
  2668. ;R0=channel
  2669. ;R1=slot
  2670. ;R2=volume
  2671. ;R3=pitch
  2672. ;R4=flags
  2673. ;R5=slide time (centiseconds)
  2674. STMFD R13!,{R1-R10,R14}
  2675. SUB R0,R0,#1
  2676. getconaddr R0,R10
  2677. LDR R9,[R10,#con.status]
  2678. TST R9,#status_kick
  2679. BNE kickit
  2680. TST R4,#ig_slot
  2681. BLEQ resetslot
  2682. TSTNE R4,#ig_retrig
  2683. BLNE retrigger
  2684. TST R4,#ig_volume
  2685. BLEQ resetvolume
  2686. TST R4,#ig_pitch
  2687. BLEQ resetpitch
  2688. TST R4,#ig_update
  2689. LDMNEFD R13!,{R1-R10,PC}
  2690. TST R9,#status_live
  2691. TSTEQ R4,#ig_fromgate
  2692. BEQ kickstart
  2693. .kickit
  2694. AND R5,R9,#status_attached
  2695. ORR R5,R5,#status_live
  2696. .kickins
  2697. TST R4,#ig_escape
  2698. ANDNE R5,R9,#status_attached
  2699. ORRNE R5,R5,#status_gated+status_escape
  2700.  
  2701. BIC R5,R5,#status_safe
  2702. TST R4,#ig_volume
  2703. BICEQ R5,R5,#status_volslide
  2704. TST R4,#ig_pitch
  2705. BICEQ R5,R5,#status_pitchslide
  2706. LDR R0,[R10,#con.addr]
  2707. CMP R0,#0
  2708. BEQ gitskip
  2709. .gitskip
  2710. STR R5,[R10,#con.status]
  2711. LDR R0,[R12,#v.samprate]
  2712. STR R0,[R10,#con.samprate]
  2713. LDR R0,[R12,#v.logampadr]
  2714. STR R0,[R10,#con.logampadr]
  2715. LDMFD R13!,{R1-R10,PC}
  2716.  
  2717. .resetslot
  2718. STMFD R13!,{R0-R4,R9,R14}
  2719. CMP R1,#0
  2720. STRNE R1,[R10,#con.slot]
  2721. LDREQ R1,[R10,#con.slot]
  2722. MOV R0,R1
  2723. BL getslotinfo
  2724. STR R2,[R10,#con.length]
  2725. STR R3,[R10,#con.finetune]
  2726. STR R4,[R10,#con.repofs]
  2727. STR R5,[R10,#con.replen]
  2728. STR R6,[R10,#con.addr]
  2729. MOV R0,#0
  2730. STR R0,[R10,#con.acc]
  2731. LDMFD R13!,{R0-R4,R9,R14}
  2732. ORRVS R4,R4,#ig_escape
  2733. MOV PC,R14
  2734.  
  2735. .retrigger
  2736. STMFD R13!,{R0,R14}
  2737. MOV R0,#0
  2738. STR R0,[R10,#con.acc]
  2739. LDMFD R13!,{R0,PC}
  2740.  
  2741. .resetvolume
  2742. STMFD R13!,{R2,R14}
  2743. MOV R2,R2,LSL #9
  2744. STR R2,[R10,#con.volume]
  2745. LDMFD R13!,{R2,PC}
  2746.  
  2747. .slidevolconv
  2748. MOV R2,R2,LSL #9
  2749. MOV PC,R14
  2750.  
  2751. .resetpitch
  2752. STMFD R13!,{R0,R1,R14}
  2753. TST R4,#ig_slot
  2754. BLNE resetfinetune
  2755. TST R4,#ig_rawpitch
  2756. MOV R0,R3
  2757. STR R0,[R10,#con.rawpitch]
  2758. SWIEQ Sound_Pitch
  2759. MOVEQ R0,R0,LSR #16
  2760. LDR R1,[R10,#con.finetune]
  2761. CMP R1,#0
  2762. MULNE R0,R1,R0
  2763. MOVEQ R0,R0,LSL #finetune_shift
  2764. LDR R1,[R12,#v.realtune]
  2765. MOV R0,R0,LSR #14
  2766. MUL R0,R1,R0
  2767. STR R0,[R10,#con.pitch]
  2768. LDMFD R13!,{R0,R1,PC}
  2769.  
  2770. .slidepitchconv
  2771. ;A mirror of above
  2772. STMFD R13!,{R0-R1,R14}
  2773. TST R0,#1<<28
  2774. MOV R0,R2
  2775. SWIEQ Sound_Pitch
  2776. MOVEQ R0,R0,LSR #16
  2777. LDR R1,[R11,#con.finetune]   ; note R11
  2778. CMP R1,#0
  2779. MULNE R0,R1,R0
  2780. MOVEQ R0,R0,LSL #finetune_shift
  2781. LDR R1,[R12,#v.realtune]
  2782. MOV R0,R0,LSR #14
  2783. MUL R0,R1,R0
  2784. MOV R2,R0
  2785. LDMFD R13!,{R0-R1,PC}
  2786.  
  2787.  
  2788. .resetfinetune
  2789. STMFD R13!,{R0-R8,R14}
  2790. BL getslotinfo
  2791. MOVVC R3,#0
  2792. STR R3,[R10,#con.finetune]
  2793. LDMFD R13!,{R0-R8,PC}
  2794.  
  2795. .getcontrolswi
  2796. getconaddr R0,R0
  2797. MOV PC,R14
  2798. .getslotswi
  2799. getslotaddr R0,R0
  2800. MOV PC,R14
  2801.  
  2802. .baserateswi
  2803. LDR R0,[R12,#v.samprate]
  2804. LDR R1,[R12,#v.realtune]
  2805. MOV PC,R14
  2806.  
  2807. .ratecallback
  2808. STMFD R13!,{R0}
  2809. LDR R0,[R12,#v.received]
  2810. ADD R0,R0,#1
  2811. STR R0,[R12,#v.received]
  2812. LDMFD R13!,{R0}
  2813.  
  2814. .rateupdate
  2815. STMFD R13!,{R0-R4,R14}
  2816. MOV R0,#0
  2817. MOV R1,#0
  2818. MOV R2,#0
  2819. MOV R3,#0
  2820. MOV R4,#0
  2821. SWI Sound_Configure
  2822. CMP R0,#1
  2823. MOVEQ R0,#0
  2824. CMP R0,#2
  2825. MOVEQ R0,#1
  2826. CMP R0,#4
  2827. MOVEQ R0,#2
  2828. CMP R0,#8
  2829. MOVEQ R0,#3
  2830.  
  2831. STR R0,[R12,#v.oldchan]
  2832. STR R2,[R12,#v.samprate]
  2833. STR R2,[R12,#v.newrate]
  2834. LDR R0,[R12,#v.mastertune]
  2835. MUL R0,R2,R0
  2836. MOV R2,#48
  2837. MYDIV R1,R0,R2
  2838. STR R1,[R12,#v.realtune]
  2839. MOV R1,#Service_StasisRate
  2840. LDR R0,[R12,#v.samprate]
  2841. LDR R2,[R12,#v.realtune]
  2842. SWI OS_ServiceCall
  2843. LDMFD R13!,{R0-R4,PC}
  2844.  
  2845. .reflush
  2846. STMFD R13!,{R0-R2,R14}
  2847. MOV R2,#0
  2848. .reflushloop
  2849. getconaddr R2,R1
  2850. LDR R0,[R1,#con.status]
  2851. BIC R0,R0,#status_q1+status_q2
  2852. STR R0,[R1,#con.status]
  2853. ADD R2,R2,#1
  2854. CMP R2,#8
  2855. BLT reflushloop
  2856. LDMFD R13!,{R0-R2,PC}
  2857.  
  2858. .kickstart
  2859. STMFD R13!,{R0-R4}
  2860. ADD R1,R0,#1
  2861. ADR R0,kickback
  2862. SWI OS_AddCallBack
  2863. AND R5,R9,#status_attached
  2864. ORR R5,R5,#status_kick
  2865. LDR R0,[R10,#con.kicks]
  2866. ADD R0,R0,#1
  2867. STR R0,[R10,#con.kicks]
  2868. LDMFD R13!,{R0-R4}
  2869. B kickins
  2870.  
  2871. .kickback
  2872. STMFD R13!,{R0-R4,R14}
  2873. MOV R0,R12
  2874. MOV R1,#&100
  2875. MOV R2,#2
  2876. MOV R3,#1
  2877. SWI Sound_Control
  2878. LDMFD R13!,{R0-R4,PC}
  2879.  
  2880. .varstr
  2881. DCD 0
  2882. .constr
  2883. DCD 0
  2884. .update
  2885. MOV R0,PC
  2886. ORR R0,R0,#3
  2887. TEQP R0,#0       ;switch to SVC
  2888. MOV R0,R0
  2889. STMFD R13!,{R7-R12,R14}
  2890. LDR R12,varstr
  2891.  
  2892. AND R7,R7,#7
  2893. ADD R0,R7,#1
  2894. MOV R1,#0
  2895. LDRB R2,[R9,#sccb.volume]
  2896. LDR R3,[R9,#sccb.duration]
  2897. BL slideswi
  2898.  
  2899. ADD R0,R7,#1
  2900. MOV R1,#1
  2901. LDR R2,[R9,#sccb.pitch]
  2902. LDR R3,[R9,#sccb.duration]
  2903. ORR R0,R0,#1<<28
  2904. BL slideswi
  2905.  
  2906. LDMFD R13!,{R7-R12,R14}
  2907. B fill
  2908.  
  2909. .gateon         ; ***GATE ON***
  2910. ;time to stuff IRQ mode
  2911. MOV R0,PC
  2912. ORR R0,R0,#3
  2913. TEQP R0,#0       ;switch to SVC
  2914. MOV R0,R0
  2915. STMFD R13!,{R12,R14}
  2916. LDR R12,varstr
  2917.  
  2918. AND R7,R7,#7
  2919. ADD R1,R12,#v.linktab
  2920. ADD R0,R7,#1
  2921. LDRB R1,[R1,R7]
  2922. LDRB R2,[R9,#sccb.volume]
  2923.  
  2924. AND R2,R2,#&7F
  2925. LDR R3,[R9,#sccb.pitch]
  2926. MOV R4,#ig_rawpitch+ig_fromgate
  2927. CMP R2,#1  ;trap for escape silencing
  2928. ORREQ R4,R4,#ig_escape
  2929. BL soundswi
  2930. LDMFD R13!,{R12,R14}
  2931.  
  2932. .fill
  2933. MOV R0,PC
  2934. ORR R0,R0,#3
  2935. TEQP R0,#0  ;switch to SVC
  2936. MOV R0,R0
  2937. STMFD R13!,{R14}
  2938. AND R7,R7,#7
  2939. LDR R0,constr
  2940. ADD R7,R0,R7,LSL #stac_shift
  2941. LDR R0,[R7,#con.status]
  2942. ORR R0,R0,#status_safe
  2943. STR R0,[R7,#con.status]
  2944. TST R8,#1<<31
  2945. BLNE ratechange
  2946. LDRB R0,[R9,#sccb.volume]
  2947. LDMIA R7,{R1-R6,R8-R9}
  2948. CMP R12,R1
  2949. MOVEQ R0,#1
  2950. CMP R12,R2
  2951. MOVEQ R0,#2
  2952. CMPNE R0,#1
  2953. BLNE sortbufs
  2954. STR R0,[R7,#con.lastbuf]
  2955. ;R1-R2 available
  2956.  
  2957. ;R3=addr
  2958. ;R4=len
  2959. ;R5=acc
  2960. ;R6=replen
  2961. ;R8=pitch
  2962. ;R9=status
  2963.  
  2964. CMP R3,#0
  2965. BLEQ adrzero
  2966. TST R9,#status_gated
  2967. BNE gatedoff
  2968. ;R0 now available
  2969. LDR R1,[R7,#con.volume]
  2970. AND R1,R1,#&FF00
  2971. LDR R2,[R7,#con.logampadr]
  2972. LDRB R2,[R2,R1,LSR #8]
  2973. RSB R2,R2,#&FF
  2974. BIC R2,R2,#1
  2975. CMP R6,#2
  2976. LDRGT R4,[R7,#con.repofs];if repeat, let our sample length
  2977. ADDGT R4,R4,R6           ;be the repeat trigger point
  2978. .nofillrep
  2979. SUB R1,R10,R12
  2980. CMP R11,#2
  2981. MOVEQ R1,R1,LSR #1
  2982. CMP R11,#4
  2983. MOVEQ R1,R1,LSR #2
  2984. CMP R11,#8
  2985. MOVEQ R1,R1,LSR #3
  2986. MOV R0,R8,LSR #16
  2987. MUL R0,R1,R0
  2988. ;R1 is the increment the accumulator will have at the end of the buffer bp 8
  2989. ADD R0,R0,R5,LSR #4;add to the accumulator bp 8
  2990. CMP R0,R4,LSL #8   ;compare bp 8
  2991. BGE slowfill
  2992.  
  2993. .fastfill
  2994. CMP R2,#0
  2995. BEQ flashfill
  2996. LDR R0,[R7,#con.fastbufs]    ;**
  2997. ADD R0,R0,#1             ;**
  2998. STR R0,[R7,#con.fastbufs]    ;**
  2999. CMP R8,#&01000000
  3000. BEQ fixedfastfill
  3001. CMP R8,#&00800000
  3002. BEQ halffastfill
  3003.  
  3004. .fastloop
  3005. #rept 16
  3006. LDRB R0,[R3,R5,LSR #12]
  3007. ADD R5,R5,R8,LSR #12
  3008. SUBS R0,R0,R2
  3009. MOVMI R0,#0
  3010. STRB R0,[R12],R11
  3011. #endr
  3012. CMP R12,R10
  3013. BLT fastloop
  3014. B endloop
  3015.  
  3016. .flashfill
  3017. LDR R0,[R7,#con.flashbufs]    ;**
  3018. ADD R0,R0,#1             ;**
  3019. STR R0,[R7,#con.flashbufs]    ;**
  3020. CMP R8,#&01000000
  3021. BEQ fixedflashfill
  3022. CMP R8,#&00800000
  3023. BEQ halfflashfill
  3024. .flashloop
  3025. #rept 16
  3026. LDRB R0,[R3,R5,LSR #12]
  3027. ADD R5,R5,R8,LSR #12
  3028. STRB R0,[R12],R11
  3029. #endr
  3030. CMP R12,R10
  3031. BLT flashloop
  3032. B endloop
  3033.  
  3034. .fixedflashfill
  3035. LDR R0,[R7,#con.fixedbufs]    ;**
  3036. ADD R0,R0,#1             ;**
  3037. STR R0,[R7,#con.fixedbufs]    ;**
  3038. BIC R5,R5,#3<<12
  3039. .fixedflashloop
  3040. #rept 4
  3041. LDR R0,[R3,R5,LSR #12]
  3042. ADD R5,R5,R8,LSR #10
  3043. STRB R0,[R12],R11
  3044. MOV R0,R0,LSR #8
  3045. STRB R0,[R12],R11
  3046. MOV R0,R0,LSR #8
  3047. STRB R0,[R12],R11
  3048. MOV R0,R0,LSR #8
  3049. STRB R0,[R12],R11
  3050. #endr
  3051. CMP R12,R10
  3052. BLT fixedflashloop
  3053. B endloop
  3054.  
  3055. .halfflashfill
  3056. LDR R0,[R7,#con.fixedbufs]    ;**
  3057. ADD R0,R0,#1             ;**
  3058. STR R0,[R7,#con.fixedbufs]    ;**
  3059. BIC R5,R5,#3<<12
  3060. .halfflashloop
  3061. #rept 2
  3062. LDR R0,[R3,R5,LSR #12]
  3063. ADD R5,R5,R8,LSR #9
  3064. STRB R0,[R12],R11
  3065. STRB R0,[R12],R11
  3066. MOV R0,R0,LSR #8
  3067. STRB R0,[R12],R11
  3068. STRB R0,[R12],R11
  3069. MOV R0,R0,LSR #8
  3070. STRB R0,[R12],R11
  3071. STRB R0,[R12],R11
  3072. MOV R0,R0,LSR #8
  3073. STRB R0,[R12],R11
  3074. STRB R0,[R12],R11
  3075. #endr
  3076. CMP R12,R10
  3077. BLT halfflashloop
  3078. B endloop
  3079.  
  3080. .fixedfastfill
  3081. LDR R0,[R7,#con.fixedbufs]    ;**
  3082. ADD R0,R0,#1             ;**
  3083. STR R0,[R7,#con.fixedbufs]    ;**
  3084. BIC R5,R5,#3<<12
  3085. .fixedfastloop
  3086. #rept 4
  3087. LDR R0,[R3,R5,LSR #12]
  3088. ADD R5,R5,R8,LSR #10
  3089. AND R1,R0,#&FF
  3090. RSBS R1,R2,R1
  3091. MOVMI R1,#0
  3092. STRB R1,[R12],R11
  3093. AND R1,R0,#&FF<<8
  3094. RSBS R1,R2,R1,LSR #8
  3095. MOVMI R1,#0
  3096. STRB R1,[R12],R11
  3097. AND R1,R0,#&FF<<16
  3098. RSBS R1,R2,R1,LSR #16
  3099. MOVMI R1,#0
  3100. STRB R1,[R12],R11
  3101. AND R1,R0,#&FF<<24
  3102. RSBS R1,R2,R1,LSR #24
  3103. MOVMI R1,#0
  3104. STRB R1,[R12],R11
  3105. #endr
  3106. CMP R12,R10
  3107. BLT fixedfastloop
  3108. B endloop
  3109.  
  3110. .halffastfill
  3111. LDR R0,[R7,#con.fixedbufs]    ;**
  3112. ADD R0,R0,#1             ;**
  3113. STR R0,[R7,#con.fixedbufs]    ;**
  3114. BIC R5,R5,#3<<12
  3115. .halffastloop
  3116. #rept 2
  3117. LDR R0,[R3,R5,LSR #12]
  3118. ADD R5,R5,R8,LSR #9
  3119. AND R1,R0,#&FF
  3120. RSBS R1,R2,R1
  3121. MOVMI R1,#0
  3122. STRB R1,[R12],R11
  3123. STRB R1,[R12],R11
  3124. AND R1,R0,#&FF<<8
  3125. RSBS R1,R2,R1,LSR #8
  3126. MOVMI R1,#0
  3127. STRB R1,[R12],R11
  3128. STRB R1,[R12],R11
  3129. AND R1,R0,#&FF<<16
  3130. RSBS R1,R2,R1,LSR #16
  3131. MOVMI R1,#0
  3132. STRB R1,[R12],R11
  3133. STRB R1,[R12],R11
  3134. AND R1,R0,#&FF<<24
  3135. RSBS R1,R2,R1,LSR #24
  3136. MOVMI R1,#0
  3137. STRB R1,[R12],R11
  3138. STRB R1,[R12],R11
  3139. #endr
  3140. CMP R12,R10
  3141. BLT halffastloop
  3142. B endloop
  3143.  
  3144.  
  3145. .slowfill
  3146. LDR R0,[R7,#con.slowbufs]    ;**
  3147. ADD R0,R0,#1             ;**
  3148. STR R0,[R7,#con.slowbufs]    ;**
  3149. CMP R6,#2
  3150. BGT repeatfill
  3151.  
  3152. .slowloop
  3153. #rept 4
  3154. LDRB R0,[R3,R5,LSR #12]
  3155. ADD R5,R5,R8,LSR #12
  3156. SUBS R0,R0,R2
  3157. MOVMI R0,#0
  3158. STRB R0,[R12],R11
  3159. CMP R5,R4,LSL #12
  3160. BGE endloop
  3161. #endr
  3162. CMP R12,R10
  3163. BLT slowloop
  3164. B endloop
  3165.  
  3166. .repeatfill
  3167. .repeatloop
  3168. #rept 4
  3169. LDRB R0,[R3,R5,LSR #12]
  3170. ADD R5,R5,R8,LSR #12
  3171. SUBS R0,R0,R2
  3172. MOVMI R0,#0
  3173. STRB R0,[R12],R11
  3174. CMP R5,R4,LSL #12
  3175. SUBGE R5,R5,R6,LSL #12
  3176. #endr
  3177. CMP R12,R10
  3178. BLT repeatloop
  3179.  
  3180. .endloop
  3181. LDR R9,[R7,#con.status]
  3182. TST R9,#status_safe
  3183. BEQ safeins
  3184. STR R5,[R7,#con.acc]
  3185. CMP R5,R4,LSL #12
  3186. BGE sampleend
  3187.  
  3188. .sampleendins
  3189. .fillend
  3190. .safeins
  3191. LDMFD R13!,{R14}
  3192. MOV R0,PC
  3193. ORR R0,R0,#2
  3194. BIC R0,R0,#1
  3195. TEQP R0,#0  ;switch to IRQ
  3196. MOV R0,#8
  3197. LDMFD R13!,{PC}
  3198.  
  3199.  
  3200. .sampleend
  3201. CMP R6,#2
  3202. BGT sampleendins
  3203. BL fineflush
  3204. BL samplekill
  3205. B fillend
  3206.  
  3207.  
  3208. .adrzero
  3209. LDR R9,[R7,#con.status]
  3210. ORR R9,R9,#status_gated
  3211. STR R9,[R7,#con.status]
  3212. MOV PC,R14
  3213.  
  3214.  
  3215. .samplekill
  3216. LDR R9,[R7,#con.status]
  3217. TST R9,#status_safe
  3218. ORRNE R9,R9,#status_gated
  3219. STRNE R9,[R7,#con.status]
  3220. MOV PC,R14
  3221.  
  3222. .gatedoff
  3223.  
  3224. TST R9,R0,LSL #status_qshift
  3225. BNE fillend
  3226. BL flush
  3227. LDR R1,[R7,#con.lastbuf]
  3228. ORR R9,R9,R1,LSL #status_qshift
  3229. STR R9,[R7,#con.status]
  3230. B fillend
  3231.  
  3232. .fineflush
  3233. MOV R0,#0
  3234. .fineflushloop
  3235. #rept 4
  3236. CMP R12,R10
  3237. STRLTB R0,[R12],R11
  3238. #endr
  3239. BLT fineflushloop
  3240. MOV PC,R14
  3241.  
  3242. .flush
  3243. LDR R0,[R7,#con.flushes]    ;**
  3244. ADD R0,R0,#1             ;**
  3245. STR R0,[R7,#con.flushes]    ;**
  3246. MOV R0,#0
  3247. .flushloop
  3248. #rept 16
  3249. STRB R0,[R12],R11
  3250. #endr
  3251. CMP R12,R10
  3252. BLT flushloop
  3253. MOV PC,R14
  3254.  
  3255. .sortbufs
  3256. CMP R1,#0
  3257. CMPEQ R2,#0
  3258. BEQ firstbuf
  3259. CMP R2,#0
  3260. BEQ secondbuf
  3261. .newbufs
  3262. .firstbuf
  3263. STR R12,[R7,#con.buf1]
  3264. MOV R1,#0
  3265. STR R1,[R7,#con.buf2]
  3266. MOV R0,#1
  3267. MOV PC,R14
  3268. .secondbuf
  3269. CMP R1,R12
  3270. STRGT R12,[R7,#con.buf1]
  3271. STRGT R1,[R7,#con.buf2]
  3272. STRLT R12,[R7,#con.buf2]
  3273. MOVLT R0,#1
  3274. MOVGT R0,#2
  3275. MOV PC,R14
  3276.  
  3277.  
  3278. .gateoff
  3279. MOV R0,#0
  3280. .loop1
  3281. STRB R0,[R12],R11
  3282. STRB R0,[R12],R11
  3283. STRB R0,[R12],R11
  3284. STRB R0,[R12],R11
  3285. CMP R12,R10
  3286. BLT loop1
  3287. MOV R0,#2
  3288. LDMFD R13!,{PC}
  3289.  
  3290. .doslides
  3291. LDR R9,[R7,#con.status]
  3292. TST R9,#status_safe
  3293. BEQ slideins
  3294. TST R9,#status_volslide
  3295. BNE dovolslide
  3296. .volslideins
  3297. TST R9,#status_pitchslide
  3298. BNE dopitchslide
  3299. B slideins
  3300.  
  3301. .dovolslide
  3302. LDR R0,[R7,#con.volume]
  3303. LDR R1,[R7,#con.volslide]; vol target
  3304. LDR R2,[R7,#con.volrate]
  3305. SUB R3,R1,R0
  3306. CMP R2,#0
  3307. RSBLT R3,R3,#0
  3308. CMP R3,#0
  3309. BLT killvolslide
  3310. ADDS R0,R0,R2
  3311. MOVMI R0,#0
  3312. STR R0,[R7,#con.volume]
  3313. B volslideins
  3314. .killvolslide
  3315. STR R1,[R7,#con.volume]
  3316. LDR R9,[R7,#con.status]
  3317. BIC R9,R9,#status_volslide
  3318. STR R9,[R7,#con.status]
  3319. B volslideins
  3320.  
  3321. .dopitchslide
  3322. LDR R0,[R7,#con.pitch]
  3323. LDR R1,[R7,#con.pitchslide]
  3324. LDR R2,[R7,#con.pitchrate]
  3325. SUB R3,R1,R0
  3326. CMP R2,#0
  3327. RSBLT R3,R3,#0
  3328. CMP R3,#0
  3329. BLT killpitchslide
  3330. ADD R0,R0,R2
  3331. STR R0,[R7,#con.pitch]
  3332. B slideins
  3333. .killpitchslide
  3334. STR R1,[R7,#con.pitch]
  3335. LDR R9,[R7,#con.status]
  3336. BIC R9,R9,#status_pitchslide
  3337. STR R9,[R7,#con.status]
  3338. B slideins
  3339.  
  3340. .ratechange
  3341. STMFD R13!,{R0-R12,R14}
  3342. LDR R12,varstr
  3343. LDR R0,[R7,#con.laststate]
  3344. STR R0,[R7,#con.prevstate]
  3345. STR R8,[R7,#con.laststate]
  3346. LDR R0,[R7,#con.states] ;***
  3347. ADD R0,R0,#1            ;***
  3348. STR R0,[R7,#con.states] ;***
  3349. AND R0,R8,#7<<24
  3350. MOV R0,R0,LSR #24
  3351. LDR R9,[R12,#v.oldchan]
  3352. CMP R0,R9
  3353. STR R0,[R12,#v.oldchan]
  3354. BLNE reflush
  3355.  
  3356. LDR R9,[R12,#v.newrate]
  3357. AND R8,R8,#&FF0000
  3358. MOV R8,R8,LSR #16
  3359. STR R8,[R12,#v.newrate]
  3360.  
  3361. CMP R8,R9
  3362. LDMEQFD R13!,{R0-R12,PC}
  3363. MOV R11,#0
  3364.  
  3365. .ratechangeloop
  3366. getconaddr R11,R10
  3367. LDR R9,[R10,#con.samprate]
  3368. CMP R8,R9
  3369. BEQ ratechskip
  3370. LDR R0,[R10,#con.ratechange] ;***
  3371. ADD R0,R0,#1                 ;***
  3372. STR R0,[R10,#con.ratechange] ;***
  3373. LDR R0,[R10,#con.pitch]
  3374. MOV R0,R0,LSR #8
  3375. MUL R1,R8,R0
  3376. BL div
  3377. MOV R0,R0,LSL #8
  3378. STR R0,[R10,#con.pitch]
  3379. LDR R0,[R10,#con.pitchslide]
  3380. MOV R0,R0,LSR #8
  3381. MUL R1,R8,R0
  3382. BL div
  3383. MOV R0,R0,LSL #8
  3384. STR R0,[R10,#con.pitchslide]
  3385. LDR R0,[R10,#con.pitchrate]
  3386. MOV R0,R0,LSR #8
  3387. MUL R1,R8,R0
  3388. BL div
  3389. MOV R0,R0,LSL #8
  3390. STR R0,[R10,#con.pitchrate]
  3391. STR R8,[R10,#con.samprate]
  3392. .ratechskip
  3393. ADD R11,R11,#1
  3394. CMP R11,#8
  3395. BLT ratechangeloop
  3396. LDR R0,[R12,#v.callbacks]
  3397. ADD R0,R0,#1
  3398. STR R0,[R12,#v.callbacks]
  3399. ADR R0,ratecallback
  3400. MOV R1,R12
  3401. SWI OS_AddCallBack
  3402. LDMFD R13!,{R0-R12,PC}
  3403.  
  3404. .div
  3405. MYDIV R0,R1,R9
  3406. MOV PC,R14
  3407.  
  3408. .ticker
  3409. STMFD R13!,{R0-R11,R14}
  3410. LDR R0,[R12,#v.timer]
  3411. ADD R0,R0,#1
  3412. STR R0,[R12,#v.timer]
  3413. MOV R11,#0
  3414. .tickerloop
  3415. getconaddr R11,R7
  3416. LDR R0,[R7,#con.status]
  3417. TST R0,#status_volslide+status_pitchslide
  3418. BNE doslides
  3419. .slideins
  3420. ADD R11,R11,#1
  3421. CMP R11,#8
  3422. BLT tickerloop
  3423. LDMFD R13!,{R0-R11,PC}
  3424.  
  3425. .err
  3426. ORR R14,R14,#1<<28
  3427. MOVS PC,R14
  3428.  
  3429. .nosaveerr
  3430. MOV R1,R10
  3431. ORR R14,R14,#1<<28
  3432. MOVS PC,R14
  3433.  
  3434. .nosamperr
  3435. ADR R0,nosamperrtext
  3436. B err
  3437. .nosamperrtext
  3438. DCD &809D06
  3439. DCB  "Stasis : No sample in that slot"
  3440. DCB 0
  3441. ALIGN
  3442.  
  3443. .attacherr
  3444. ADR R0,attacherrtext
  3445. B err
  3446. .attacherrtext
  3447. DCD &809D07
  3448. DCB  "Stasis : Voice attach/detach failure"
  3449. DCB 0
  3450. ALIGN
  3451. .noroomerr
  3452. ADR R0,noroomerrtext
  3453. B err
  3454. .noroomerrtext
  3455. DCD &809D08
  3456. DCB  "Stasis : No room in RMA"
  3457. DCB 0
  3458. ALIGN
  3459.  
  3460. .badswino
  3461. ADR R0,badswinotext
  3462. B err
  3463. .badswinotext
  3464. DCD &809D11
  3465. DCB  "Stasis : Unknown SWI"
  3466. DCB 0
  3467. ALIGN
  3468.  
  3469. .notafileerr
  3470. STMFD R13!,{R14}
  3471. MOV R2,R0
  3472. MOV R0,#19
  3473. SWI XOS_File
  3474. LDMFD R13!,{R14}
  3475. B err
  3476.  
  3477. .releaseerr
  3478. ADR R0,releaseerrtext
  3479. B err
  3480. .releaseerrtext
  3481. DCD &809D12
  3482. DCB "Stasis : Release of block of unknown type",0
  3483. ALIGN
  3484. .badsaveformaterr
  3485. .badformaterr
  3486. ADR R0,badsaveformaterrtext
  3487. B err
  3488. .badsaveformaterrtext
  3489. DCD &809D13
  3490. DCB "Stasis : Unknown sample format",0
  3491. ALIGN
  3492. .badalienerr
  3493. ADR R0,badalienerrtext
  3494. B err
  3495. .badalienerrtext
  3496. DCD &809D14
  3497. DCB "Stasis : Alien format handler guard word corrupt",0
  3498. ALIGN
  3499. .puterr
  3500. STMFD R13!,{R14}
  3501. write
  3502. DCB "Stasis : With reference to "
  3503. endwrite
  3504. MOV R1,R0
  3505. TST R1,#1<<1
  3506. ADRNE R0,putnameerr
  3507. SWINE OS_Write0
  3508. SWINE 256+","
  3509. TST R1,#1<<2
  3510. ADRNE R0,putlenerr
  3511. SWINE OS_Write0
  3512. SWINE 256+","
  3513. TST R1,#1<<3
  3514. ADRNE R0,putfinetuneerr
  3515. SWINE OS_Write0
  3516. SWINE 256+","
  3517. TST R1,#1<<4
  3518. ADRNE R0,putrepofserr
  3519. SWINE OS_Write0
  3520. SWINE 256+","
  3521. TST R1,#1<<5
  3522. ADRNE R0,putreplenerr
  3523. SWINE OS_Write0
  3524. SWINE 256+","
  3525. TST R1,#1<<6
  3526. ADRNE R0,putdataofserr
  3527. SWINE OS_Write0
  3528. SWINE 256+","
  3529. TST R1,#1<<7
  3530. ADRNE R0,putvolumeerr
  3531. SWINE OS_Write0
  3532. SWINE 256+","
  3533. SWI 256+8
  3534. SWI 256+";"
  3535. SWI OS_NewLine
  3536. LDMFD R13!,{R14}
  3537. ADR R0,puterrtext
  3538. B err
  3539. .puterrtext
  3540. DCD &809D15
  3541. DCB "Stasis : Cannot make requested alteration - sample format does not allow it",0
  3542. .putnameerr
  3543. DCB "name",0
  3544. .putlenerr
  3545. DCB "length",0
  3546. .putfinetuneerr
  3547. DCB "finetune",0
  3548. .putrepofserr
  3549. DCB "repeat offset",0
  3550. .putreplenerr
  3551. DCB "repeat length",0
  3552. .putdataofserr
  3553. DCB "sample data address",0
  3554. .putvolumeerr
  3555. DCB "volume",0
  3556.  
  3557. ALIGN
  3558.  
  3559. macro getslotaddr m0,m1 {
  3560. AND m1,m0,#entries-1
  3561. ADD m1,R12,m1,LSL #s_shift
  3562. ADD m1,m1,#v.slottab
  3563. }
  3564.  
  3565. macro getconaddr m0,m1 {
  3566. AND m1,m0,#7
  3567. ADD m1,R12,m1,LSL #stac_shift
  3568. ADD m1,m1,#v.contab
  3569. }
  3570.  
  3571. macro limit m0 {
  3572. AND m0,m0,#entries-1
  3573. }
  3574.  
  3575. macro write {
  3576. SWI OS_WriteS
  3577. }
  3578.  
  3579. macro endwrite {
  3580. DCB 0
  3581. ALIGN
  3582. }