home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Sources / Amnesia / AmSource
Encoding:
Text File  |  1995-08-24  |  53.5 KB  |  3,047 lines

  1.  
  2. #name Amnesia
  3. #type &ffa
  4. #base 0
  5.  
  6. #set Service_Amnesia=&80320
  7.  
  8. #set errorlim    = 100
  9. #set def_tables = 32
  10.  
  11. #set coordshift = 12
  12.  
  13. #set remoteID=&006E0000 ;must be present before a remote routine
  14.  
  15. #set BF_static        = 1
  16. #set BF_qwa        = 1<<1
  17. #set BF_intoff        = 1<<2
  18.  
  19. #set A_type_tidy    = 0
  20. #set A_type_messy    = 1
  21. #set A_type_static    = 2
  22.  
  23. #set R_skip_advance    = 1
  24. #set R_tst        = 1<<1
  25. #set R_alive        = 1<<31
  26.  
  27. #set PF_advance        = 1<<23
  28. #set PF_plot        = 1<<22
  29. #set PF_process        = 1<<21
  30.  
  31. #set Amf_plot        = 1<<0
  32. #set Amf_user_plot    = 1<<1
  33. #set Amf_velocity    = 1<<2
  34. #set Amf_gravity    = 1<<3
  35. #set Amf_use_plot_ofs    = 1<<4
  36. #set Amf_anim        = 1<<5
  37. #set Amf_make_objsize    = 1<<6
  38. #set Amf_colch        = 1<<7
  39. #set Amf_attn_timer    = 1<<8
  40. #set Amf_dest_timer    = 1<<9
  41. #set Amf_attn        = 1<<10
  42. #set Amf_timer2        = 1<<11
  43. #set Amf_zero_vec    = 1<<12
  44. #set Amf_game_horiz    = 1<<13
  45. #set Amf_game_vert    = 1<<14
  46. #set Amf_plot_window    = 1<<15
  47. #set Amf_kill_window    = 1<<16
  48. #set Amf_colch_window    = 1<<17
  49. #set Amf_save        = 1<<18
  50. #set Amf_remote        = 1<<19
  51. #set Amf_noleft        = 1<<20
  52. #set Amf_noright    = 1<<21
  53. #set Amf_noup        = 1<<22
  54. #set Amf_nodown        = 1<<23
  55.  
  56.  
  57. #set Amf_attn_mask    = &FF<<24
  58.  
  59. #set Amf_imask  = Amf_plot + Amf_velocity + Amf_gravity + Amf_use_plot_ofs + Amf_anim + Amf_make_objsize + Amf_colch + Amf_dest_timer + Amf_zero_vec + Amf_plot_window + Amf_save + Amf_colch_window + Amf_timer2 + Amf_remote
  60.  
  61. ;imask are the events which are never returned to the user
  62.  
  63. struct v {
  64.   .areastart    DCD 0
  65.   .areatype    DCD 0
  66.   .areasize    DCD 0
  67.   .gamewindow    DBD 4; 4 words
  68.   .plotwindow    DBD 4; 4 words
  69.   .killwindow    DBD 4; 4 words
  70.   .plotxofs     DCD 0
  71.   .plotyofs    DCD 0
  72.   .gravx    DCD 0
  73.   .gravy    DCD 0
  74.   .colch0    DCD 0
  75.   .colch1    DCD 0
  76.   .colch3    DCD 0
  77.   .colchsave    DBD 4; 4 words - save area for colch regs
  78.   .colchboxes    DBD 8; 8 words - store area for bounding boxes
  79.   .errorctr    DCD 0
  80.   .errorblock   DCD 0
  81.   .errortable   DCD 0
  82.   .remote    DCD 0
  83.   .remoteR12    DCD 0
  84.   .buffer     DBD 16 ; 16 words
  85.   .temp0      DCD 0
  86.   .temp1      DCD 0
  87.   .temp2      DCD 0
  88.   .sizeof
  89. }
  90.  
  91. struct b {
  92.   .id        DCD 0
  93.   .ptr      DCD 0
  94.   .name        DBB 8 ; 8 bytes
  95.   .size        DCD 0
  96.   .flags    DCD 0
  97.   .sizeof
  98. }
  99.  
  100. struct t {
  101.   .id        DCD 0
  102.   .ptr         DCD 0
  103.   .name        DBB 8 ; 8 bytes
  104.   .size        DCD 0
  105.   .flags    DCD 0
  106.   .objsize    DCD 0
  107.   .number    DCD 0
  108.   .tabflags    DCD 0
  109.   .next        DCD 0
  110.   .sizeof
  111. }
  112.  
  113. struct save {
  114.   .id        DCD 0
  115.   .name        DBB 8 ; 8 bytes
  116.   .objsize    DCD 0
  117.   .number    DCD 0
  118.   .gap        DCD 0
  119.   .sizeof
  120. }
  121.  
  122. struct h {
  123.   .id        DCD 0
  124.   .ptr        DCD 0
  125.   .name        DBB 8 ; 8 bytes
  126.   .size        DCD 0
  127.   .flags    DCD 0
  128.   .type        DCD 0
  129.   .areasize    DCD 0
  130.   .tlist    DCD 0
  131.   .sizeof
  132. }
  133.  
  134. struct o {
  135.   .type        DCD 0
  136.   .flags    DCD 0
  137.   .x        DCD 0
  138.   .y        DCD 0
  139.   .xvec        DCD 0
  140.   .yvec        DCD 0
  141.   .timer    DCD 0
  142.   .size        DCD 0
  143.   .timer2    DCD 0
  144.   .sizeof
  145. }
  146.  
  147. struct c {    
  148.   .id        DCD 0
  149.   .ptr        DCD 0
  150.   .name        DBB 8 ; 8 bytes
  151.   .size        DCD 0
  152.   .flags    DCD 0
  153.   .writeofs    DCD 0
  154.   .sizeof
  155. }
  156.   
  157. struct cent {
  158.   .ofs        DCD 0
  159.   .minx         DCD 0
  160.   .miny         DCD 0
  161.   .maxx         DCD 0
  162.   .maxy         DCD 0
  163.   .sizeof
  164.   
  165. struct tlist {
  166.   .number    DCD 0
  167.   .sizeof
  168. }
  169. .start
  170. DCD 0
  171. DCD init
  172. DCD final
  173. DCD service
  174. DCD title
  175. DCD help
  176. DCD commandtable
  177. DCD &49600
  178. DCD swicode
  179. DCD switab
  180. DCD 0
  181.  
  182. .title
  183. DCB "Amnesia"
  184. DCB 0
  185. .help
  186. DCB "Amnesia        1.50 (20 Apr 1995)"
  187. DCB 0
  188. ALIGN
  189. .commandtable
  190. DCB "Amnesia",0
  191. ALIGN
  192. DCD 0
  193. DCD 0
  194. DCD 0
  195. DCD amnesiahelp
  196.  
  197. DCB "Amnesia"
  198. DCB 0
  199. ALIGN
  200. DCD amscode
  201. DCD &000cff01
  202. DCD amssyntax
  203. DCD amshelp
  204.  
  205. DCB "AmnesiaFlags",0
  206. ALIGN
  207. DCD 0
  208. DCD 0
  209. DCD 0
  210. DCD flagshelp
  211. DCB "AmnesiaObjects",0
  212. ALIGN
  213. DCD 0
  214. DCD 0
  215. DCD 0
  216. DCD objectshelp
  217. DCB "AmnesiaSWIs",0
  218. ALIGN
  219. DCD 0
  220. DCD 0
  221. DCD 0
  222. DCD swishelp
  223.  
  224. DCD 0; *** END MARKER ***
  225.  
  226. .amnesiahelp
  227. DCB 27,0," is a module which provides memory allocation functions and handling routines for on-screen objects in a versatile form.  See the help files in the ",27,0," application for details.",10,13
  228. DCB "Copyright A.Southgate 1994 - may be used and distributed freely.",10,13
  229. DCB "Amnesia was written and is maintained by Andy Southgate - permanent address 5 Longview, Sutton, Cambs.",10,13
  230. DCB 0
  231. .amshelp
  232. DCB 27,0," issues an Amnesia SWI from the command line.  Its mainly used by me for testing.  The SWI tail means the letters after Amnesia_ .  If TO is appended register results are returned.  String parameters should be entered in SINGLE quotes ('These ones')",10,13
  233. .amssyntax
  234. DCB "Syntax : *Amnesia <SWI tail> [<R0> [<R1> [<R2> .... <R9>]]] [TO]",10,13
  235. DCB "Example: *Amnesia ClaimBlock 0 &800 'Aliens' 2_1101",0
  236. .flagshelp
  237. DCB "Amnesia area types area",10,13
  238. DCB "0 - Tidy mode",10,13
  239. DCB "1 - Messy mode",10,13
  240. DCB "2 - Static mode",10,13
  241. DCB "Amnesia block flags are (bit - action)",10,13
  242. DCB "0 - Block is static - must not be moved",10,13
  243. DCB "1 - Quad word align block",10,13
  244. DCB "2 - Disable interrupts while moving block",10,13
  245. DCB "Amnesia table flags are (bit - action)",10,13
  246. DCB "0 - Objects require collision checking facilities",10,13
  247.  
  248. DCB "Amnesia object flags are (bit - action)",10,13
  249. DCB "0 - FastSpr plot",10,13
  250. DCB "1 - User plot",10,13
  251. DCB "2 - Use velocity",10,13
  252. DCB "3 - Apply Gravity",10,13
  253. DCB "4 - Use plot offsets",10,13
  254. DCB "5 - Use timer for FastSpr animation",10,13
  255. DCB "6 - Make up the object size (from FastSpr file)",10,13
  256. DCB "7 - Collison check object",10,13
  257. DCB "8 - Generate attention request if timer expires",10,13
  258. DCB "9 - Destroy object if timer expires",10,13
  259. DCB "10 - Request attention always",10,13
  260. DCB "11 - Run timer 2",10,13
  261. DCB "12 - Zero velocity (and this bit) after first addition",10,13
  262. DCB "13 - Attention if outside game window (horizontal)",10,13
  263. DCB "14 - Attention if outside game window (vertical)",10,13
  264. DCB "15 - Use plot window",10,13
  265. DCB "16 - Use kill window",10,13
  266. DCB "17 - Add to the collision checking table only if object inside plot window",10,13
  267. DCB "18 - Object needs saving by Amnesia_TableSave",10,13
  268. DCB "19 - reserved",10,13
  269. DCB "Bits 20-23 are transient flags for the user.  They are zeroed on each process pass",10,13
  270. DCB "Bits 24-31 are the user attention trigger bits.  If a user attention request bit is set when calling Amnesia_SelectTable, then all of the objects with that bit set in their flags will return for attention.",10,13
  271.  
  272. DCB 0
  273. .objectshelp
  274. DCB "The structure of an amnesia object is as follows :",10,13
  275. DCB "base+0",9,"The object type.  If this is zero the object is ignored.  This number is passed to FastSpr as a sprite number when requested.",10,13
  276. DCB "base+4",9,"The flag word (see AmnesiaFlags)",10,13
  277. DCB "base+8",9,"The x coordinate (pixels per process pass << 12)",10,13
  278. DCB "base+12",9,"The y coordinate",10,13
  279. DCB "base+16",9,"The x velocity (added to the x coord every process pass",10,13
  280. DCB "base+20",9,"The y velocity",10,13
  281. DCB "base+24",9,"The timer.  Amnesia performs a SUB R0,R0,R0,LSL #16 to this value on each process pass",10,13
  282. DCB "base+28",9,"The object size [x size][y size] in pixels, 16 bit values",10,13
  283. DCB "base+32",9,"The second timer",10,13
  284. DCB "Only the first two entries are always required.  The rest may be required depending on the settings of the flag word",10,13
  285. DCB 0
  286.  
  287. .swishelp
  288. DCB "Amnesia supports the following SWIs.",10,13,10,13
  289. DCB 34,"Amnesia_Init",34,",start_address,size,area_type",10,13
  290. DCB 34,"Amnesia_ClaimBlock",34,",ptr_address,size,name,block_flags",10,13
  291. DCB 34,"Amnesia_ReleaseBlock",34,",block_address",10,13
  292. DCB 34,"Amnesia_ExtendBlock",34,",ptr_address,length",10,13
  293. DCB 34,"Amnesia_DescribeBlock",34,",block_address or block_number TO block_address,size,data_start,data_size,name,ptr_address,block_flags",10,13
  294. DCB 34,"Amnesia_ClaimTable",34,",table_number,table_flags,name,number_of_objects,object_size",10,13
  295. DCB 34,"Amnesia_ReleaseTable",34,",table_number",10,13
  296. DCB 34,"Amnesia_ExtendTable",34,",table_number,,number_of_objects",10,13
  297. DCB 34,"Amnesia_WipeTable",34,",table_number",10,13
  298. DCB 34,"Amnesia_CountObjects",34,",table_number TO number_of_objects",10,13
  299.  
  300. DCB 34,"Amnesia_Tidy",34,"",10,13
  301. DCB 34,"Amnesia_MakeObject",34,",table_number,object parameters in R1-R8",10,13
  302. DCB 34,"Amnesia_MakeObjectSpace",34,",table_number TO ,object_address",10,13
  303. DCB 34,"Amnesia_SelectTable",34,",table_number,process_type,plot TO R0,R1,R2",10,13
  304. DCB 34,"Amnesia_ProcessTable",34,",R0,R1,R2 (from above) TO R0,obj_address,reason code",10,13
  305. DCB 34,"Amnesia_DeleteObject",34,",,obj_address",10,13
  306. DCB 34,"Amnesia_SetWindow",34,",window_number,min_x,min_y,max_x,max_y",10,13
  307. DCB 34,"Amnesia_ReadWindow",34,",window_number TO ,min_x,min_y,max_x,max_y",10,13
  308. DCB 34,"Amnesia_SetPlotOffset",34,",x,y",10,13
  309. DCB 34,"Amnesia_ReadPlotOffset",34," TO x,y",10,13
  310. DCB 34,"Amnesia_CollisionCheck",34,",table_number,table_number TO object_address,object_address,R2,R3",10,13
  311. DCB 34,"Amnesia_GetColchBoxes",34," TO minx1,miny1,maxx1,maxy1,minx2,miny2,maxx2,maxy2",10,13
  312.  
  313. DCB 34,"Amnesia_LoadFile",34,",ptr_address,filename,pathname",10,13
  314. DCB 34,"Amnesia_SaveFile",34,",block_address,filename,filetype",10,13
  315. DCB 34,"Amnesia_LoadTable",34,",table_number,filename,pathname",10,13
  316. DCB 34,"Amnesia_SaveTable",34,",table_number,filename",10,13
  317. DCB 34,"Amnesia_GetTableAddress",34,",table_number TO table_address",10,13
  318. DCB 34,"Amnesia_Blocks",34,10,13
  319. DCB 0
  320.  
  321. ALIGN
  322. .r12temp
  323. DCD 0
  324. .amscode
  325. STMFD R13!,{R7-R11,R14}
  326. STR R12,r12temp
  327. LDR R12,[R12]
  328. ADR R3,switails
  329. STR R0,[R12,#v.temp0]  ;command tail
  330. STR R1,[R12,#v.temp1]  ;number of parms
  331. MOV R0,#0
  332. STR R0,[R12,#v.temp2]
  333. MOV R9,#0; swi name table entry counter
  334. .loop9
  335. LDR R2,[R12,#v.temp0]
  336.  
  337. ._loop
  338. LDRB R0,[R2]
  339. CMP R0,#" "
  340. ADDEQ R2,R2,#1
  341. BEQ _loop
  342. ._loop
  343. LDRB R0,[R2],#1
  344.  
  345. CMP R0,#"."
  346. BEQ amsfounddot
  347. CMP R0,#32
  348. BLE amsspace
  349. BIC R0,R0,#32
  350. LDRB R1,[R3],#1
  351. BIC R1,R1,#32
  352. CMP R1,R0
  353. BEQ _loop
  354. ._loop
  355. LDRB R1,[R3],#1
  356. CMP R1,#0
  357. BNE _loop
  358. LDRB R1,[R3]
  359. CMP R1,#0
  360. BEQ amsnomatch
  361. ADD R9,R9,#1
  362. .amsskip
  363. B loop9
  364. .amsspace
  365. LDRB R1,[R3]
  366. CMP R1,#0
  367. BEQ amsfound
  368. B amsskip
  369. .amsnomatch
  370. LDMFD R13!,{R7-R11,R14}
  371.  
  372. B amsnomatcherr
  373. .amsfounddot
  374. LDR R4,[R12,#v.temp1]; number of parms
  375. LDRB R0,[R2]
  376. CMP R0,#" "
  377. CMPNE R0,#&0D; end marker
  378. ADDNE R4,R4,#1
  379. STR R4,[R12,#v.temp1]
  380. B amsfound
  381.  
  382. .amsfound
  383. STR R2,[R12,#v.temp0]
  384. ADD R10,R12,#v.buffer
  385. MOV R1,#10
  386. MOV R0,#0;clear buffer
  387.  
  388. ._loop
  389. STR R0,[R10],#4
  390. SUBS R1,R1,#1
  391. BGT _loop
  392.  
  393. LDR R1,[R12,#v.temp0]; command string
  394. LDR R4,[R12,#v.temp1]; number of parms
  395. ADD R10,R12,#v.buffer;write address
  396. .loop3
  397. CMP R4,#1
  398. BLE amsreaddone
  399. .loop4
  400. LDRB R3,[R1]
  401. CMP R3,#"T"
  402. CMPNE R3,#"t"
  403. BEQ amsto
  404. CMP R3,#" "
  405. ADDEQ R1,R1,#1
  406. BEQ loop4
  407. CMP R3,#"'"; quotes character
  408. BEQ amsstring
  409. MOV R0,#&8000000A
  410. SWI XOS_ReadUnsigned
  411. BVS badnumber
  412. STR R2,[R10],#4
  413. .amsstringins
  414. SUB R4,R4,#1
  415. B loop3
  416. .amsstring
  417. STR R1,[R10],#4
  418. ADD R1,R1,#1
  419. ._loop
  420. LDRB R3,[R1]
  421. CMP R3,#32
  422. BLT amsstringins
  423. ADD R1,R1,#1
  424. CMP R3,#"'"; quotes
  425. BNE _loop
  426. B amsstringins
  427.  
  428. .amsreaddone
  429. MOV R11,R9; set swi modulo
  430. ADD R10,R12,#v.buffer
  431. LDMIA R10,{R0-R9}
  432. LDR R12,r12temp
  433. BL swicode
  434.  
  435. MOV R10,PC
  436. STMFD R13!,{PC}
  437. LDR R12,r12temp
  438. LDR R12,[R12]
  439. LDR R11,[R12,#v.temp2]
  440. CMP R11,#1
  441. BLEQ showregs
  442. LDMFD R13!,{R10}
  443. TEQP PC,R10
  444. LDMFD R13!,{R7-R11,PC}
  445.  
  446. .amsto
  447. MOV R0,#1
  448. STR R0,[R12,#v.temp2]
  449. B amsreaddone
  450.  
  451.  
  452. .showregs
  453. STMFD R13!,{R0,R14}
  454. STMFD R13!,{R10}
  455. ADD R10,R12,#v.buffer
  456. STMIA R10,{R0-R9}
  457. MOV R11,#0
  458. .loop5
  459. SWI 256+"R"
  460. ADD R0,R11,#"0"
  461. SWI OS_WriteC
  462. SWI OS_WriteS
  463. DCB "  = &",0
  464. ALIGN
  465. LDR R0,[R10],#4
  466. ADD R1,R12,#v.temp0
  467. MOV R2,#12
  468. SWI OS_ConvertHex8
  469. SWI OS_Write0
  470. SWI 256+" "
  471. CMP R11,#3
  472. CMPNE R11,#7
  473. SWIEQ OS_NewLine
  474. ADD R11,R11,#1
  475. CMP R11,#10
  476. BLT loop5
  477. SWI OS_NewLine
  478. LDMFD R13!,{R0}
  479. SWI OS_WriteS
  480. DCB "Mode ",0
  481. ALIGN
  482. AND R1,R0,#3
  483. CMP R1,#3
  484. SWIEQ 256+"S"
  485. SWIEQ 256+"V"
  486. SWIEQ 256+"C"
  487. CMP R1,#0
  488. SWIEQ 256+"U"
  489. SWIEQ 256+"S"
  490. SWIEQ 256+"R"
  491. SWI OS_WriteS
  492. DCB " flags set: ",0
  493. ALIGN
  494. TST R0,#1<<31
  495. SWIEQ 256+"n"
  496. SWINE 256+"N"
  497. TST R0,#1<<30
  498. SWIEQ 256+"z"
  499. SWINE 256+"Z"
  500. TST R0,#1<<29
  501. SWIEQ 256+"c"
  502. SWINE 256+"C"
  503. TST R0,#1<<28
  504. SWIEQ 256+"v"
  505. SWINE 256+"V"
  506. TST R0,#1<<27
  507. SWIEQ 256+"i"
  508. SWINE 256+"I"
  509. TST R0,#1<<26
  510. SWIEQ 256+"f"
  511. SWINE 256+"F"
  512. SWI OS_NewLine
  513. LDMFD R13!,{R0,PC}
  514.  
  515. .tidystr
  516. DCB "Tidy",0
  517. .messystr
  518. DCB "Messy",0
  519. .staticstr
  520. DCB "Static",0
  521. .unknownstr
  522. DCB "*Unknown*",0
  523. ALIGN
  524.  
  525. .blocksswi
  526. STMFD R13!,{R1-R9,R14}
  527. LDR R11,[R12,#v.areastart]
  528. MOV R0,#0
  529. STR R0,[R12,#v.errorctr]
  530.  
  531. SWI OS_WriteS
  532. DCB "Amnesia area - type : ",0
  533. ALIGN
  534. LDR R1,[R12,#v.areatype]
  535. AND R1,R1,#&FF
  536. ADR R0,unknownstr
  537. CMP R1,#A_type_tidy
  538. ADREQ R0,tidystr
  539. CMP R1,#A_type_messy
  540. ADREQ R0,messystr
  541. CMP R1,#A_type_static
  542. ADREQ R0,staticstr
  543. SWI OS_Write0
  544. SWI OS_WriteS
  545. DCB ".",10,13,"Address ",0
  546. ALIGN
  547.  
  548. MOV R0,R11
  549. BL writehex
  550. MOV R0,R11
  551. MOV R1,R0
  552. SWI OS_ValidateAddress
  553. LDMCSFD R13!,{R1-R9,R14}
  554. BCS badareaerr
  555.  
  556. SWI OS_WriteS
  557. DCB ", size ",0
  558. ALIGN
  559. LDR R0,[R11,#h.areasize]
  560. BL writehex
  561. CMP R0,#24
  562. LDMLTFD R13!,{R1-R9,R14}
  563. BLT badareaerr
  564.  
  565. MOV R0,R11
  566. LDR R1,[R11,#h.areasize]
  567. ADD R1,R0,R1
  568. SWI OS_ValidateAddress
  569. LDMCSFD R13!,{R1-R9,R14}
  570. BCS badareaerr
  571. SWI OS_WriteS
  572. DCB ", free ",0
  573. ALIGN
  574. BL getfreespace
  575. BLVS blocksbadfree
  576. BLVC writehex
  577. SWI OS_WriteS
  578. DCB ", available ",0
  579. ALIGN
  580. BL getavailablespace
  581. BLVS blocksbadfree
  582. BLVC writehex
  583. SWI OS_WriteS
  584. DCB ".",10,13,10,0
  585. ALIGN
  586. LDR R0,[R11,#h.areasize]
  587. ADD R11,R11,R0;point to end of block
  588.  
  589. MOV R8,#0
  590. .loop7
  591. SUB R10,R11,#8
  592. ._loop
  593. LDR R9,[R10],#-4
  594. CMP R9,#0
  595. BEQ _loop
  596. LDR R10,[R11,#-4]!
  597. CMP R10,#-1
  598. BEQ amsblocksend
  599. CMP R10,#0
  600. BLEQ noblockinfo
  601. BL blockinfo
  602. LDMVSFD R13!,{R1-R9,R14}
  603. BVS err
  604. .noblockinfo
  605. ADD R8,R8,#1
  606. LDR R0,[R12,#v.errorctr]
  607. CMP R0,#errorlim
  608. LDMGTFD R13!,{R1-R9,R14}
  609. BGT toomanyerr
  610. SWI OS_ReadEscapeState
  611. BCC loop7
  612. .amsblocksend
  613. LDR R0,[R12,#v.errortable]
  614. CMP R0,#-1
  615. BLNE printerrortable
  616. LDR R0,[R12,#v.errorblock]
  617. CMP R0,#-1
  618. BLNE printerrorblock
  619.  
  620. LDMFD R13!,{R1-R9,PC}
  621.  
  622. .printerrorblock
  623. STMFD R13!,{R14}
  624. SWI OS_WriteS
  625. DCB "Error occurred during attempt to access block at ",0
  626. ALIGN
  627. LDR R0,[R12,#v.errorblock]
  628. BL writehex
  629. SWI OS_WriteS
  630. DCB ".",10,13,0
  631. ALIGN
  632. MOV R0,#-1
  633. STR R0,[R12,#v.errorblock]
  634. LDMFD R13!,{PC}
  635.  
  636.  
  637.  
  638. .printerrortable
  639. STMFD R13!,{R14}
  640. SWI OS_WriteS
  641. DCB "Error occurred during access to table number ",0
  642. ALIGN
  643. LDR R0,[R12,#v.errortable]
  644. BIC R0,R0,#&FFFF<<16
  645. ADD R1,R12,#v.buffer
  646. MOV R2,#16
  647. SWI OS_ConvertCardinal4
  648. SWI OS_Write0
  649. SWI OS_WriteS
  650. DCB ".",10,13,0
  651. ALIGN
  652. MOV R0,#-1
  653. STR R0,[R12,#v.errortable]
  654. LDMFD R13!,{PC}
  655.  
  656. .blockstr
  657. DCB "Block  ",0
  658. .tablestr
  659. DCB "TBlock ",0
  660. ALIGN
  661.  
  662.  
  663. .blockinfo
  664. STMFD R13!,{R8-R11,R14}
  665. MOV R0,R8
  666. BL describeblockswi
  667. BVS blockinfoerr
  668. .blockinfoerrins
  669. STMFD R13!,{R0-R3}
  670. ADR R0,blockstr
  671. TST R6,#1<<31
  672. ADRNE R0,tablestr
  673. SWI OS_Write0
  674. MOV R0,R8
  675. ADD R1,R12,#v.temp0
  676. MOV R2,#12
  677. SWI OS_ConvertCardinal2
  678. SWI OS_Write0
  679. CMP R8,#10
  680. SWILT 256+" "
  681. CMP R8,#100
  682. SWILT 256+" "
  683. SWI OS_WriteS
  684. DCB "-",0
  685. ALIGN
  686. MOV R3,#8
  687. MOV R1,R4
  688. .loop8
  689. LDRB R0,[R1],#1
  690. CMP R0,#0
  691. MOVEQ R0,#32
  692. CMP R0,#32
  693. MOVLT R0,#"."
  694. SWI OS_WriteC
  695. SUBS R3,R3,#1
  696. BGT loop8
  697. LDMFD R13!,{R0-R3}
  698. SWI OS_WriteS
  699. DCB " ",0
  700. ALIGN
  701. MOV R0,R0
  702. BL writehex
  703. ;SWI OS_WriteS
  704. ;DCB " size ",0
  705. ;ALIGN
  706. ;MOV R0,R1
  707. ;BL writehex
  708.  
  709. SWI OS_WriteS
  710. DCB " data ",0
  711. ALIGN
  712. MOV R0,R2
  713. BL writehex
  714. SWI OS_WriteS
  715. DCB " space ",0
  716. ALIGN
  717. MOV R0,R3
  718. BL writehex
  719. SWI OS_WriteS
  720. DCB " ptr ",0
  721. ALIGN
  722. MOV R0,R5
  723. BL writehex
  724. ;SWI OS_WriteS
  725. ;DCB " flg ",0
  726. ;ALIGN
  727. ;MOV R0,R6
  728. ;BL writehex
  729. SWI OS_NewLine
  730. BL integcheck
  731. .blockinfoskip
  732. LDMFD R13!,{R8-R11,PC}
  733.  
  734. .blockinfoerr
  735. SWI OS_WriteS
  736. DCB "*** Cannot find reference to next block - table list corrupt",13,10,0
  737. ALIGN
  738. BL errorinc
  739. B blockinfoskip
  740.  
  741. .integcheck
  742. STMFD R13!,{R14}
  743. LDR R0,[R10,#b.id]
  744. LDR R1,blockid
  745. CMP R0,R1
  746. BLNE noblockid
  747. LDR R0,[R10,#b.size]
  748. ADD R1,R10,R0
  749. CMP R9,#-1
  750. CMPNE R1,R9
  751. BLNE badblocktable
  752. LDMFD R13!,{PC}
  753.  
  754. .noblockid
  755. STMFD R13!,{R14}
  756. SWI OS_WriteS
  757. DCB "*** Block corrupt : guard word is ",0
  758. ALIGN
  759. BL writehex
  760. SWI OS_WriteS
  761. DCB ", should be ",0
  762. ALIGN
  763. MOV R0,R1
  764. BL writehex
  765. SWI OS_WriteS
  766. DCB 10,13,0
  767. ALIGN
  768. BL errorinc
  769. LDMFD R13!,{PC}
  770.  
  771. .badblocktable
  772. STMFD R13!,{R14}
  773. SWI OS_WriteS
  774. DCB "Gap    ",0
  775. ALIGN
  776. SUB R0,R9,R1
  777. CMP R0,#12
  778. BLE notgapintidy
  779. LDR R0,[R12,#v.areatype]
  780. AND R0,R0,#&FF
  781. CMP R0,#A_type_tidy
  782. BNE notgapintidy
  783. SWI OS_WriteS
  784. DCB " *** IN TIDY HEAP *** size ",0
  785. ALIGN
  786. .notgapintidy
  787. SUB R0,R9,R1
  788. BL writehex
  789. SWI OS_WriteS
  790. DCB " bytes. ",10,13,0
  791. ALIGN
  792. CMP R0,#0
  793. LDMGEFD R13!,{PC}
  794. SWI OS_WriteS
  795. DCB "*** Negative Gap - area corrupt",10,13,0
  796. ALIGN
  797. BL errorinc
  798.  
  799. LDMFD R13!,{PC}
  800.  
  801. .errorinc
  802. LDR R0,[R12,#v.errorctr]
  803. ADD R0,R0,#1
  804. STR R0,[R12,#v.errorctr]
  805. MOV PC,R14
  806.  
  807. .blocksbadfree
  808. STMFD R13!,{R14}
  809. SWI OS_WriteS
  810. DCB "*Unknown*",0
  811. ALIGN
  812. LDMFD R13!,{PC}^;keep flags
  813.  
  814.  
  815.  
  816.  
  817. .writehex
  818. STMFD R13!,{R0-R2,R14}
  819. SWI 256+"&"
  820. ADD R1,R12,#v.temp0
  821. MOV R2,#12
  822. SWI OS_ConvertHex8
  823. SWI OS_Write0
  824. LDMFD R13!,{R0-R2,PC}
  825.  
  826. .switab
  827. DCB "Amnesia",0
  828. .switails
  829. DCB "Init",0
  830. DCB "ClaimBlock",0
  831. DCB "ReleaseBlock",0
  832. DCB "ClaimTable",0
  833. DCB "ReleaseTable",0
  834. DCB "Tidy",0
  835. DCB "SelectTable",0
  836. DCB "ProcessTable",0
  837. DCB "CollisionCheck",0
  838. DCB "GetColchBoxes",0
  839. DCB "SetPlotOffset",0
  840. DCB "ReadPlotOffset",0
  841.  
  842. DCB "SetWindow",0
  843. DCB "ReadWindow",0
  844. DCB "MakeObject",0
  845. DCB "MakeObjectSpace",0
  846. DCB "DeleteObject",0
  847.  
  848. DCB "LoadFile",0
  849. DCB "SaveFile",0
  850. DCB "ExtendBlock",0
  851. DCB "ExtendTable",0
  852. DCB "WipeTable",0
  853. DCB "CountObjects",0
  854. DCB "SetGravity",0
  855. DCB "ReadGravity",0
  856. DCB "DescribeBlock",0
  857. DCB "Blocks",0
  858. DCB "SaveTable",0
  859. DCB "LoadTable",0
  860. DCB "GetTableAddress",0
  861. DCB "LoadHammered",0
  862. DCB "Remote",0
  863. DCB 0; *** END MARKER ***
  864. #set swis = 32
  865. ALIGN
  866.  
  867. .swicode
  868. CMP R11,#swis
  869. BGE badswino
  870. LDR R12,[R12]
  871. LDR R10,[R12,#v.areastart]
  872. CMP R10,#0
  873. BEQ swinostart
  874. .swinostartins
  875. ADR R10,swiofstab
  876. LDR R10,[R10,R11,LSL #2]
  877. ADR R11,swiofstab
  878. ADD PC,R10,R11
  879. .swiofstab
  880. DCD initswi         - swiofstab
  881. DCD claimblockswi     - swiofstab
  882. DCD releaseblockswi     - swiofstab
  883. DCD claimtableswi     - swiofstab
  884. DCD releasetableswi     - swiofstab
  885. DCD tidyswi         - swiofstab
  886. DCD selecttableswi     - swiofstab
  887. DCD processtableswi    - swiofstab
  888. DCD colchswi        - swiofstab
  889. DCD colchboxesswi    - swiofstab
  890. DCD setplotofsswi    - swiofstab
  891. DCD readplotofsswi    - swiofstab
  892. DCD setwindowswi    - swiofstab
  893. DCD readwindowswi    - swiofstab
  894. DCD makeobjectswi     - swiofstab
  895. DCD makeobjectspaceswi    - swiofstab
  896. DCD deleteobjectswi     - swiofstab
  897. DCD loadfileswi        - swiofstab
  898. DCD savefileswi        - swiofstab
  899. DCD extendblockswi    - swiofstab
  900. DCD notyeterr        - swiofstab
  901. DCD wipetabswi        - swiofstab
  902. DCD countobjectsswi     - swiofstab
  903. DCD setgravityswi    - swiofstab
  904. DCD readgravityswi    - swiofstab
  905. DCD describeblockswi     - swiofstab
  906. DCD blocksswi         - swiofstab
  907. DCD savetableswi    - swiofstab
  908. DCD loadtableswi    - swiofstab
  909. DCD gettableaddrswi    - swiofstab
  910. DCD loadhammeredswi    - swiofstab
  911. DCD remoteswi        - swiofstab
  912. .badswino
  913. B unknownswi
  914.  
  915. .swinostart
  916. CMP R11,#0
  917. BEQ swinostartins
  918. B notiniterr
  919.  
  920. .initswi
  921. STMFD R13!,{R1-R9,R14}
  922. BL discardarea
  923. BIC R0,R0,#3
  924. ADD R1,R1,#3
  925. BIC R1,R1,#3
  926. CMP R1,#0
  927. LDMEQFD R13!,{R1-R9,PC}
  928. CMP R1,#h.sizeof+8
  929. LDMLTFD R13!,{R1-R9,R14}
  930. BLT noroomerr
  931. STR R0,[R12,#v.areastart]
  932. STR R1,[R12,#v.areasize]
  933. STR R2,[R12,#v.areatype]
  934. CMP R0,#0
  935. BLEQ getarearma
  936. BVS noarearma
  937. LDR R0,[R12,#v.areastart]
  938. LDR R1,[R12,#v.areasize]
  939. CMP R0,#0
  940. CMP R1,#0
  941. BEQ badinitswi
  942. ADD R1,R0,R1
  943. SWI OS_ValidateAddress
  944. BCS badinitswi
  945. BL initarea
  946. MOV R0,#-1
  947. STR R0,[R12,#v.errortable]
  948. STR R0,[R12,#v.errorblock]
  949. BL maketlist
  950. LDMVSFD R13!,{R1-R9,R14}
  951. BVS err
  952. LDMFD R13!,{R1-R9,PC}
  953. .badinitswi
  954. MOV R0,#0
  955. STR R0,[R12,#v.areastart]
  956. LDMFD R13!,{R1-R9,R14}
  957. MOV R1,#0
  958. B badblockerr
  959. .noarearma
  960. MOV R0,#0
  961. STR R0,[R12,#v.areastart]
  962. LDMFD R13!,{R1-R9,R14}
  963. MOV R1,#0
  964. B noroomrmaerr
  965.  
  966. .blockid
  967. DCB "AmBl"
  968. ALIGN
  969.  
  970. .initarea
  971. STMFD R13!,{R14}
  972. LDR R10,[R12,#v.areastart]
  973. ADR R0,blockid
  974. LDR R0,[R0]
  975. STR R0,[R10,#h.id]
  976. MOV R0,#0
  977. STR R0,[R10,#h.tlist]
  978. STR R0,[R10,#h.ptr]
  979. MOV R0,#&40000000
  980. STR R0,[R10,#h.flags]
  981. LDR R0,[R12,#v.areatype]
  982. STR R0,[R10,#h.type]
  983. LDR R0,[R12,#v.areasize]
  984. STR R0,[R10,#h.areasize]
  985. MOV R0,#h.sizeof
  986. STR R0,[R10,#h.size]
  987. ADD R0,R10,#h.name
  988. ADR R1,areanamestr
  989. MOV R2,#8
  990. BL strncpy
  991. LDR R0,[R12,#v.areasize]
  992. LDR R1,[R12,#v.areastart]
  993. ADD R1,R0,R1
  994. MOV R0,R10
  995. STR R0,[R1,#-4]
  996. MVN R0,#0
  997. STR R0,[R1,#-8]
  998. MVN R0,#&7F000000
  999. MOV R1,R0
  1000. MOV R2,#&7F000000
  1001. MOV R3,R0
  1002. ADD R4,R12,#v.gamewindow
  1003. STMIA R4!,{R0-R3}
  1004. STMIA R4!,{R0-R3}
  1005. STMIA R4!,{R0-R3}
  1006. LDMFD R13!,{PC}
  1007. .areanamestr
  1008. DCB "Header",0
  1009. ALIGN
  1010.  
  1011. .setwindowswi
  1012. STMFD R13!,{R0-R4,R14}
  1013. CMP R0,#2
  1014. LDMGTFD R13!,{R0-R4,R14}
  1015. BGT windownonerr
  1016. CMP R1,R3
  1017. CMPLE R2,R4
  1018. LDMGTFD R13!,{R0-R4,R14}
  1019. BGT windowdodgyerr
  1020. ADD R0,R12,R0,LSL #4
  1021. ADD R0,R0,#v.gamewindow
  1022. STMIA R0,{R1-R4}
  1023. LDMFD R13!,{R0-R4,PC}^
  1024.  
  1025. .readwindowswi
  1026. STMFD R13!,{R0,R14}
  1027. CMP R0,#2
  1028. LDMGTFD R13!,{R0,R14}
  1029. BGT windownonerr
  1030. ADD R0,R12,R0,LSL #4
  1031. ADD R0,R0,#v.gamewindow
  1032. LDMIA R0,{R1-R4}
  1033. LDMFD R13!,{R0,PC}^
  1034.  
  1035.  
  1036.  
  1037. .tidyswi
  1038. STMFD R13!,{R1-R9,R14}
  1039. MOV R5,#0    ;just do the pointers
  1040. BL tidyblocks
  1041. LDMVSFD R13!,{R1-R9,PC}
  1042. MOV R5,#1    ;now do the blocks
  1043. BL tidyblocks
  1044. LDMFD R13!,{R1-R9,PC}
  1045.  
  1046. .tidyblocks
  1047. STMFD R13!,{R14}
  1048. LDR R11,[R12,#v.areastart]
  1049. LDR R0,[R11,#h.areasize]
  1050. ADD R10,R11,R0 ;scan the blocks
  1051. MOV R6,R10; read from R10, write to R6
  1052. MOV R8,R11
  1053. .loop10
  1054. LDR R9,[R10,#-4]!
  1055. CMP R9,#0
  1056. BEQ loop10
  1057. SUB R6,R6,#4; writing to R6 removes zero entries from the
  1058.         ;block table
  1059. CMP R9,#-1
  1060. BEQ tidydone
  1061. CMP R8,R9
  1062. BGT tidyoverlap
  1063. LDR R4,[R9,#b.ptr]
  1064. CMP R4,#0
  1065. MOVEQ R8,R9; do not move if no pointer
  1066.  
  1067. LDR R4,[R9,#b.flags]
  1068. TST R4,#BF_static
  1069. MOVNE R8,R9; do not move if static
  1070. TST R4,#BF_qwa
  1071. BICNE R8,R8,#15
  1072. ADDNE R8,R8,#12  ;quad word align copy destination
  1073. CMP R8,R9
  1074. LDMGTFD R13!,{R14}
  1075. BGT qwaerr 
  1076.  
  1077. MOV R0,R8
  1078. MOV R1,R9
  1079. MOV R2,R5; update pointer or move flag
  1080. LDR R7,[R9,#b.size]
  1081. TST R4,#BF_intoff
  1082. CMPNE R5,#0; the real move
  1083. SWINE OS_IntOff
  1084. BL moveblock
  1085. LDMVSFD R13!,{PC}
  1086. TST R4,#BF_intoff
  1087. CMPNE R5,#0
  1088. SWINE OS_IntOn
  1089.  
  1090. CMP R5,#0
  1091. STRNE R8,[R6]; update the block table
  1092. ADD R8,R8,R7
  1093. B loop10
  1094. .tidydone
  1095. CMP R5,#0
  1096. MVN R0,#0
  1097. STRNE R0,[R6]
  1098. LDMFD R13!,{PC}
  1099.  
  1100. .tidyoverlap
  1101. LDMFD R13!,{R14}
  1102. B areacorrupterr
  1103.  
  1104. .moveblock
  1105. ; R0 = destination
  1106. ; R1 = address of entry in block table
  1107. ; R2 = update pointer(0) or move(1)
  1108.  
  1109. STMFD R13!,{R1-R9,R14}
  1110. LDR R4,blockid
  1111. LDR R5,[R1,#b.id]
  1112. CMP R5,R4
  1113. MOVNE R0,R1; for v.errorblock
  1114. LDMNEFD R13!,{R1-R9,R14}
  1115. BNE movenonblockerr
  1116. CMP R0,R1
  1117. LDMEQFD R13!,{R1-R9,PC}
  1118. LDR R4,[R1,#b.ptr]
  1119. LDR R5,[R4]
  1120. LDR R6,[R10]
  1121. ADD R6,R6,#b.sizeof;  The block table points to the start of the block
  1122.         ; whereas the user pointer points to the start of free space
  1123. CMP R5,R6
  1124. CMPNE R2,#1; do this test only on the first (R2=0) pass
  1125. BNE inconblock
  1126. ADD R6,R0,#b.sizeof
  1127. CMP R2,#0
  1128. STREQ R6,[R4]; replace the user pointer
  1129. LDMEQFD R13!,{R1-R9,PC}
  1130. LDR R2,[R1,#b.size]
  1131. .loop11
  1132. LDR R5,[R1],#4
  1133. STR R5,[R0],#4
  1134. SUBS R2,R2,#4
  1135. BGT loop11
  1136. LDMFD R13!,{R1-R9,PC}
  1137.  
  1138. .inconblock
  1139. STR R1,[R12,#v.errorblock]
  1140. LDMFD R13!,{R1-R9,R14}
  1141. B inconblockerr
  1142.  
  1143.  
  1144. .tlisttext
  1145. DCB "TableLst"
  1146. ALIGN
  1147.  
  1148. .maketlist
  1149. STMFD R13!,{R0-R3,R14}
  1150. MOV R0,#0
  1151. BL getblockaddr
  1152. LDMVSFD R13!,{R1-R4,PC};discard stacked R0-R3
  1153. MOV R11,R0
  1154. ADD R0,R11,#h.tlist
  1155. MOV R1,#tlist.sizeof+8*def_tables
  1156. ADR R2,tlisttext
  1157. MOV R3,#0
  1158. BL claimblockswi
  1159. LDMVSFD R13!,{R1-R4,R14}
  1160. BVS tlisterr
  1161. LDR R10,[R11,#h.tlist]
  1162. MOV R0,#def_tables
  1163. STR R0,[R10,#tlist.number]
  1164. LDMFD R13!,{R0-R3,PC}
  1165.  
  1166. .wipeblock
  1167. STMFD R13!,{R1-R2,R14}
  1168. LDR R1,[R0,#b.size]
  1169. ADD R0,R0,#b.sizeof
  1170. SUB R1,R1,#b.sizeof
  1171. MOV R2,#0
  1172. ._loop
  1173. STR R2,[R0],#4
  1174. SUBS R1,R1,#4
  1175. BGT _loop
  1176. LDMFD R13!,{R1-R2,PC}
  1177.  
  1178. .getblockaddr
  1179. STMFD R13!,{R1-R3,R14}
  1180. MOV R3,R0
  1181. LDR R1,[R12,#v.areastart]
  1182. LDR R2,[R12,#v.areasize]
  1183. ADD R1,R1,R2
  1184. ._loop
  1185. LDR R2,[R1,#-4]!
  1186. CMP R2,#-1
  1187. MOVEQ R0,R3
  1188. LDMEQFD R13!,{R1-R3,R14}
  1189. BEQ getblockerr
  1190. SUBS R0,R0,#1
  1191. BPL _loop
  1192. MOV R0,R2
  1193. LDMFD R13!,{R1-R3,PC}^
  1194.  
  1195. .claimtableswi
  1196. STMFD R13!,{R1-R10,R14}
  1197. MOV R6,R0
  1198. MOV R8,R1
  1199. MOV R7,R3
  1200. BL gettlistaddr
  1201. LDMVSFD R13!,{R1-R10,R14}
  1202. BVS err
  1203. MOV R10,R0
  1204. LDR R0,[R10]
  1205. CMP R0,#0
  1206. BEQ noprevtable
  1207. MOV R0,R6; original R0
  1208. BL releasetableswi
  1209. LDMVSFD R13!,{R1-R10,R14}
  1210. BVS err
  1211. .noprevtable
  1212. MOV R0,#0
  1213. STR R0,[R10,#4]; indicate no colch table
  1214. MUL R1,R3,R4
  1215. ADD R1,R1,#t.sizeof-b.sizeof
  1216.  
  1217. ;MOV R2,R2; name
  1218. MOV R3,#0
  1219. MOV R0,R10
  1220. BL claimblockswi
  1221. LDMVSFD R13!,{R1-R10,R14}
  1222. BVS err
  1223.  
  1224. SUB R9,R0,#b.sizeof
  1225. STR R8,[R9,#t.tabflags]; was R1
  1226. STR R7,[R9,#t.number]  ; was R3
  1227. STR R4,[R9,#t.objsize]
  1228. MOV R0,#0
  1229. STR R0,[R9,#t.next]
  1230. MOV R0,#&80000000
  1231. STR R0,[R9,#t.flags]
  1232. MOV R0,R7
  1233. TST R8,#1; is collision checking required?
  1234. BEQ noclaimcolch
  1235. BL claimcolchtab
  1236. LDMVSFD R13!,{R1-R10,PC}
  1237. .noclaimcolch
  1238. LDMFD R13!,{R1-R10,PC}^
  1239.  
  1240. .colchstr
  1241. DCB "ColChk",0,0
  1242. ALIGN
  1243.  
  1244. .claimcolchtab
  1245. STMFD R13!,{R8-R10,R14}
  1246. ADD R0,R12,#v.temp0
  1247. ADR R1,colchstr
  1248. LDMIA R1,{R2,R3}
  1249. STMIA R0,{R2,R3}
  1250. ADD R1,R0,#6
  1251. MOV R0,R6
  1252. MOV R2,#2
  1253. SWI XOS_ConvertCardinal1
  1254. CMP R0,R0; clear V
  1255. LDR R0,[R9,#t.number]
  1256. MOV R2,#cent.sizeof
  1257. MUL R1,R0,R2
  1258. ADD R1,R1,#c.sizeof - b.sizeof
  1259. ADD R0,R10,#4
  1260. ADD R2,R12,#v.temp0
  1261. MOV R3,#0
  1262. BL claimblockswi
  1263. LDMVSFD R13!,{R8-R10,PC}
  1264. LDR R8,[R10,#4]
  1265. SUB R8,R8,#b.sizeof
  1266. MOV R0,#c.sizeof
  1267. STR R0,[R8,#c.writeofs]
  1268. LDMFD R13!,{R8-R10,PC}^
  1269.  
  1270. .releasetableswi
  1271. STMFD R13!,{R10,R14}
  1272. BL gettlistaddr
  1273. LDMVSFD R13!,{R10,PC}
  1274. MOV R9,R0
  1275. LDR R0,[R0]
  1276. BL releaseblockswi
  1277. LDMVSFD R13!,{R10,PC}
  1278. LDR R0,[R9,#4]
  1279. CMP R0,#0
  1280. LDMEQFD R13!,{R10,PC}
  1281. BL releaseblockswi
  1282. LDMFD R13!,{R10,PC}; includes returning error
  1283.  
  1284. .wipetabswi
  1285. .wipetab
  1286. STMFD R13!,{R1-R5,R14}
  1287. BL gettableaddr
  1288. LDMVSFD R13!,{R1-R5,R14}
  1289. BVS err
  1290. SUB R0,R0,#b.sizeof
  1291. ADD R5,R0,#t.sizeof
  1292. LDR R3,[R0,#t.number]
  1293. LDR R4,[R0,#t.objsize]
  1294. MOV R1,#0
  1295. STR R1,[R0,#t.next]
  1296. MOV R0,#0
  1297.  
  1298. ._loop
  1299. STR R0,[R5],R4
  1300. SUBS R3,R3,#1
  1301. BGT _loop
  1302. LDMFD R13!,{R1-R5,PC}
  1303.  
  1304. .gettableaddrswi
  1305. .gettableaddr
  1306. STMFD R13!,{R1-R2,R14}
  1307. MOV R2,R0
  1308. BL gettlistaddr
  1309. LDMVSFD R13!,{R1-R2,PC}
  1310. LDR R1,[R0]
  1311. CMP R1,#0
  1312. MOVEQ R0,R2
  1313. LDMEQFD R13!,{R1-R2,R14}
  1314. BEQ notableerr
  1315. MOV R0,R1
  1316. LDMFD R13!,{R1-R2,PC}
  1317.  
  1318. .gettlistaddr
  1319. STMFD R13!,{R1-R2,R14}
  1320. BIC R0,R0,#&FF<<24
  1321. LDR R1,[R12,#v.areastart]
  1322. LDR R2,[R1,#h.tlist]
  1323. CMP R2,#0
  1324. LDMEQFD R13!,{R1-R2,R14}
  1325. BEQ notlisterr
  1326. LDR R1,[R2,#tlist.number]
  1327. CMP R0,#0
  1328. MOVLT R0,#&7F000000
  1329. CMP R0,R1
  1330. LDMGEFD R13!,{R1-R2,R14}
  1331. BGE tabletoohigherr
  1332. ADD R2,R2,#tlist.sizeof
  1333. ADD R0,R2,R0,LSL #3
  1334. LDMFD R13!,{R1-R2,PC}
  1335.  
  1336. .loadtableswi
  1337. STMFD R13!,{R1-R9,R14}
  1338. BL gettlistaddr
  1339. LDMVSFD R13!,{R1-R9,PC}
  1340. MOV R11,R0
  1341. LDR R11,[R11]
  1342. CMP R11,#0
  1343. LDMEQFD R13!,{R1-R9,R14}
  1344. BEQ notableerr
  1345. SUB R11,R11,#b.sizeof
  1346. LDR R9,[R11,#t.objsize]; table objsize
  1347. LDR R8,[R11,#t.number]
  1348. BL openloadfile
  1349. LDMVSFD R13!,{R1-R9,PC}
  1350. CMP R0,#0
  1351. LDMEQFD R13!,{R1-R9,R14}
  1352. MOVEQ R2,#0
  1353. BEQ notafileerr
  1354. MOV R7,R0; our file handle
  1355. MOV R0,#3
  1356. MOV R1,R7
  1357. ADD R10,R12,#v.buffer
  1358. MOV R2,R10
  1359. MOV R3,#save.sizeof
  1360. MOV R4,#0
  1361. SWI XOS_GBPB
  1362. LDMVSFD R13!,{R1-R9,PC}
  1363.  
  1364. LDR R6,[R10,#save.objsize]
  1365. CMP R6,R9
  1366. BLNE objsizewarn
  1367. ADD R0,R11,#t.name
  1368. ADD R1,R10,#save.name
  1369. LDMIA R0,{R2-R3}
  1370. LDMIA R1,{R4-R5}
  1371. CMP R2,R4
  1372. CMPEQ R3,R5
  1373. BLNE namematchwarn
  1374. LDR R5,[R10,#save.number]
  1375. ADD R10,R11,#t.sizeof
  1376. .loopg1
  1377. CMP R5,#0
  1378. BLE endloadtable
  1379. LDR R0,[R10]
  1380. CMP R0,#0
  1381. BNE loadtableskip
  1382. BL foundloadtable
  1383. LDMVSFD R13!,{R1-R9,PC}
  1384. .loadtableskip
  1385. ADD R10,R10,R9
  1386. SUBS R8,R8,#1
  1387. BGT loopg1
  1388. .endloadtable
  1389. BL closefile
  1390. MOV R0,R5
  1391. CMP R5,#0
  1392. LDMFD R13!,{R1-R9,R14}
  1393. BIC R14,R14,#1<<29; carry flag
  1394. ORRNE R14,R14,#1<<29
  1395. MOVS PC,R14
  1396.  
  1397. .foundloadtable
  1398. STMFD R13!,{R1-R6,R14}
  1399. MOV R0,#4
  1400. MOV R1,R7
  1401. MOV R2,R10
  1402. MOV R3,R6
  1403. SWI XOS_GBPB
  1404. SUB R5,R5,#1
  1405. LDMFD R13!,{R1-R6,PC}
  1406.  
  1407. .savetableswi
  1408. STMFD R13!,{R1-R9,R14}
  1409. BL gettlistaddr
  1410. LDMVSFD R13!,{R1-R9,PC}
  1411. MOV R11,R0
  1412. LDR R11,[R11]
  1413. CMP R11,#0
  1414. LDMEQFD R13!,{R1-R9,R14}
  1415. BEQ notableerr
  1416. SUB R11,R11,#b.sizeof
  1417. ADD R10,R11,#t.sizeof
  1418. LDR R9,[R11,#t.objsize]
  1419. LDR R8,[R11,#t.number]
  1420. MOV R6,#0
  1421. BL openfile
  1422. LDMVSFD R13!,{R1-R9,PC}
  1423. CMP R0,#0
  1424. LDMEQFD R13!,{R1-R9,PC}
  1425. BEQ badsaveerr
  1426. MOV R7,R0; our file handle
  1427. MOV R0,#18
  1428. MOV R2,#&FFD
  1429. SWI XOS_File
  1430. BLVS closefile
  1431. LDMVSFD R13!,{R1-R9,PC}
  1432. BL makesavetablehdr
  1433. BLVS closefile
  1434. LDMVSFD R13!,{R1-R9,PC}
  1435. .loopg0
  1436. LDR R0,[R10]
  1437. CMP R0,#0
  1438. BEQ dontsave
  1439. LDR R0,[R10,#o.flags]
  1440. TST R0,#Amf_save
  1441. BEQ dontsave ;Don't save if this bit is clear
  1442. MOV R0,#2
  1443. MOV R1,R7
  1444. MOV R2,R10
  1445. LDR R3,[R11,#t.objsize]
  1446. SWI XOS_GBPB
  1447. BLVS closefile
  1448. LDMVSFD R13!,{R1-R9,PC}
  1449. ADD R6,R6,#1
  1450. .dontsave
  1451. LDR R0,[R11,#t.objsize]
  1452. ADD R10,R10,R0
  1453. SUBS R8,R8,#1
  1454. BGT loopg0
  1455. STR R6,[R12,#v.temp0]
  1456. MOV R0,#1
  1457. MOV R1,R7
  1458. ADD R2,R12,#v.temp0
  1459. MOV R3,#4
  1460. MOV R4,#save.number
  1461. SWI XOS_GBPB
  1462. BLVS closefile
  1463. LDMVSFD R13!,{PC}
  1464. BL closefile
  1465. LDMFD R13!,{R1-R9,PC}
  1466.  
  1467. .openloadfile
  1468. STMFD R13!,{R1-R3,R14}
  1469. MOV R0,#&46
  1470. CMP R2,#0
  1471. MOVEQ R0,#&44
  1472. SWI XOS_Find
  1473. LDMFD R13!,{R1-R3,PC}
  1474.  
  1475. .openfile
  1476. STMFD R13!,{R1-R3,R14}
  1477. MOV R0,#&80
  1478. SWI XOS_Find
  1479. LDMFD R13!,{R1-R3,PC}
  1480.  
  1481. .closefile
  1482. STMFD R13!,{R0-R3,R14}
  1483. MOV R0,#&0
  1484. MOV R1,R7
  1485. SWI XOS_Find
  1486. LDMFD R13!,{R0-R3,PC}^
  1487.  
  1488. .savetableid
  1489. DCB "AmTb"
  1490. ALIGN
  1491. .makesavetablehdr
  1492. STMFD R13!,{R14}
  1493. MOV R0,#1
  1494. MOV R1,R7
  1495. ADR R2,savetableid
  1496. MOV R3,#4
  1497. MOV R4,#save.id
  1498. SWI XOS_GBPB
  1499. LDMVSFD R13!,{PC}
  1500. MOV R0,#1
  1501. MOV R1,R7
  1502. ADD R2,R11,#t.name
  1503. MOV R3,#8
  1504. MOV R4,#save.name
  1505. SWI XOS_GBPB
  1506. LDMVSFD R13!,{PC}
  1507. MOV R0,#1
  1508. MOV R1,R7
  1509. ADD R2,R11,#t.objsize
  1510. MOV R3,#4
  1511. MOV R4,#save.objsize
  1512. SWI XOS_GBPB
  1513. LDMVSFD R13!,{PC}
  1514. MOV R0,#1
  1515. MOV R1,R7
  1516. ADR R2,savetableid
  1517. MOV R3,#4
  1518. MOV R4,#save.gap ;set up pointer
  1519. SWI XOS_GBPB
  1520. LDMFD R13!,{PC}
  1521.  
  1522. .selecttableswi
  1523. STMFD R13!,{R3-R9,R14}
  1524. MOV R4,R0
  1525. CMP R2,#0
  1526. ORREQ R4,R4,#PF_plot
  1527. CMP R1,#0
  1528. ORREQ R4,R4,#PF_process
  1529. CMP R1,#2
  1530. ORREQ R2,R2,#R_tst
  1531. BIC R0,R0,#&FF<<24
  1532. BL gettlistaddr
  1533. LDMVSFD R13!,{R3-R9,PC}
  1534. MOV R10,R0
  1535. LDR R1,[R10]
  1536. CMP R1,#0
  1537. LDMEQFD R13!,{R3-R9,R14}
  1538. MOVEQ R0,R4
  1539. BEQ notableerr
  1540. LDR R1,[R10,#4]; colchtab ptr
  1541. CMP R1,#0
  1542. TSTNE R4,#PF_process
  1543. MOVNE R2,#c.sizeof
  1544. STRNE R2,[R1,#c.writeofs-b.sizeof]; wipes colch table
  1545. LDR R0,[R10]
  1546. SUB R0,R0,#b.sizeof
  1547. ADD R1,R0,#t.sizeof    ; first object
  1548. TST R4,#PF_process
  1549. MOVNE R2,#0
  1550. ORR R2,R2,#R_skip_advance
  1551. ORR R0,R4,#PF_advance
  1552. LDMFD R13!,{R3-R9,PC}^
  1553.  
  1554. .scantable
  1555. TST R2,#R_skip_advance
  1556. ADDEQ R10,R10,R9
  1557. BIC R2,R2,#R_alive+R_skip_advance
  1558. BIC R5,R2,#3
  1559. TST R2,#R_tst
  1560. BNE scantst
  1561. .scancmp
  1562. ._loop
  1563. #rept 8
  1564. CMP R10,R8
  1565. BGE scanfordone
  1566. LDR R0,[R10,R5]
  1567. BIC R0,R0,R4
  1568. CMP R0,R3
  1569. BEQ scanfound
  1570. ADD R10,R10,R9
  1571. #endr
  1572. B _loop
  1573. .scantst
  1574. CMP R10,R8
  1575. BGE scanfordone
  1576. CMP R3,#0
  1577. BEQ scanfound
  1578. ._loop
  1579. LDR R0,[R10,R5]
  1580. BIC R0,R0,R4
  1581. TST R0,R3
  1582. BNE scanfound
  1583. ADD R10,R10,R9
  1584. #rept 7
  1585. CMP R10,R8
  1586. BGE scanfordone
  1587. LDR R0,[R10,R5]
  1588. BIC R0,R0,R4
  1589. TST R0,R3
  1590. BNE scanfound
  1591. ADD R10,R10,R9
  1592. #endr
  1593. B _loop
  1594.  
  1595. .scanfordone
  1596. MOV R2,#0
  1597. LDMFD R13!,{R3-R9,PC}^
  1598. .scanfound
  1599. MOV R0,R11
  1600. MOV R1,R10
  1601. ORR R2,R2,#R_alive
  1602. LDMFD R13!,{R3-R9,PC}^
  1603.  
  1604. .processtableswi
  1605. ; receives and returns
  1606. ; R0 = table handle+flags
  1607. ; R1 = current object pointer
  1608. ; R2 = reason code
  1609. STMFD R13!,{R3-R9,R14}
  1610. MOV R11,R0
  1611. MOV R10,R1
  1612. BIC R0,R0,#&FFFF<<16
  1613. BL gettlistaddr
  1614. LDMVSFD R13!,{R3-R9,PC}
  1615. STR R0,[R12,#v.temp0]
  1616. LDR R0,[R0]; get tableaddr
  1617. SUB R7,R0,#b.sizeof
  1618. LDR R0,[R7,#t.size]
  1619. ADD R8,R7,R0
  1620. CMP R7,R10
  1621. CMPLT R10,R8
  1622. MOVGT R0,R11; for error report
  1623. LDMGTFD R13!,{R3-R9,R14}
  1624. BGT objectoutsideerr
  1625. LDR R9,[R7,#t.objsize]
  1626. TST R11,#PF_process
  1627. BEQ scantable
  1628. CMP R2,#R_skip_advance
  1629. BEQ skipadvance
  1630. TST R11,#PF_advance
  1631. BEQ noadvance 
  1632. .lookforobj
  1633. ADD R10,R10,R9; advance
  1634. .skipadvance
  1635.  
  1636. ;R8  = end of table in memory
  1637. ;R9  = [t.objsize]
  1638. ;R10 = address of next object to test
  1639.  
  1640. ._loop
  1641. #rept 8
  1642. CMP R10,R8
  1643. BGE lookfordone
  1644. LDR R0,[R10],R9
  1645. CMP R0,#0
  1646. BNE objfound
  1647. #endr
  1648. B _loop
  1649. .lookfordone
  1650. MOV R2,#0
  1651. LDMFD R13!,{R3-R9,PC}^
  1652.  
  1653. .objfound
  1654. SUB R10,R10,R9; R10 now points to the found object
  1655. STMFD R13!,{R7-R9}
  1656. ; we need for later
  1657. ; R7 as pointer to t struct
  1658. ; R8 as end address
  1659. ; R9 as object length
  1660.  
  1661. LDMIA R10,{R1-R8}
  1662. TST R2,#Amf_remote
  1663. BNE doremote
  1664. .remoteins0
  1665. BIC R2,R2,#%1111<<20
  1666. STR R2,[R10,#4]
  1667. AND R9,R11,#&FF<<24; R9 = the trigger mask
  1668. ORR R9,R9,#Amf_colch+Amf_attn+Amf_anim
  1669. TST R11,#PF_plot
  1670. ORRNE R9,R9,#Amf_plot+Amf_user_plot; request user plot if plots requested
  1671. TST R2,#Amf_use_plot_ofs
  1672. ORRNE R9,R9,#Amf_use_plot_ofs
  1673. TST R2,#Amf_velocity + Amf_attn_timer + Amf_dest_timer + Amf_anim
  1674. TSTEQ R2,#Amf_zero_vec + Amf_timer2
  1675. BEQ skipvelocity
  1676. TST R2,#Amf_velocity
  1677. ADDNE R3,R3,R5
  1678. ADDNE R4,R4,R6
  1679. TST R2,#Amf_zero_vec
  1680. MOVNE R5,#0
  1681. MOVNE R6,#0
  1682. TST R2,#Amf_gravity
  1683. BLNE addgravity
  1684. TST R2,#Amf_attn_timer + Amf_dest_timer + Amf_anim
  1685. SUBNE R7,R7,R7,LSL #16
  1686. CMP R7,#0; test for timer expiry
  1687. ORRLT R9,R9,#Amf_attn_timer + Amf_dest_timer
  1688. STMIA R10,{R1-R7}
  1689. TST R2,#Amf_timer2
  1690. BLNE runtimer2
  1691. .skipvelocity
  1692.  
  1693. TST R2,#Amf_game_horiz + Amf_game_vert + Amf_plot_window + Amf_kill_window
  1694. BEQ nowindows
  1695. STMFD R13!,{R2,R7}
  1696. MOV R14,R2       ;NOTE
  1697. MOV R5,R8,LSR #16
  1698. MOV R6,R8,LSL #16; R1 is <<16 its real value
  1699. ;        and don't forget the <<12 from pixels to coords
  1700. MOV R5,R5,LSL #16
  1701. SUB R1,R3,R5,LSR #17-coordshift
  1702. ADD R3,R3,R5,LSR #17-coordshift
  1703.  
  1704. SUB R2,R4,R6,LSR #17-coordshift
  1705. ADD R4,R4,R6,LSR #17-coordshift
  1706. TST R14,#Amf_game_horiz + Amf_game_vert
  1707. BEQ nogamewindow
  1708. ADD R0,R12,#v.gamewindow  ;the game window triggers when any part of the
  1709. ;             object    is outside of it
  1710.  
  1711. LDMIA R0,{R5-R8}
  1712. CMP R1,R5
  1713. CMPGE R7,R3
  1714. ORRLT R9,R9,#Amf_game_horiz
  1715. CMP R2,R6
  1716. CMPGE R8,R4
  1717. ORRLT R9,R9,#Amf_game_vert
  1718. .nogamewindow
  1719.  
  1720. TST R14,#Amf_kill_window
  1721. BEQ nokillwindow
  1722. ADD R0,R12,#v.killwindow
  1723. LDMIA R0,{R5-R8}       ;the kill window triggers if an object is entirely
  1724. ;            outside of it.
  1725. CMP R1,R7
  1726. CMPLE R5,R3
  1727. CMPLE R2,R8
  1728. CMPLE R6,R4
  1729. ORRGT R9,R9,#Amf_kill_window
  1730. .nokillwindow
  1731. TST R14,#Amf_plot_window
  1732. BEQ noplotwindow
  1733. TST R9,#Amf_use_plot_ofs
  1734. LDRNE R5,[R12,#v.plotxofs]
  1735. LDRNE R6,[R12,#v.plotyofs]
  1736. ADDNE R1,R1,R5
  1737. ADDNE R3,R3,R5
  1738. ADDNE R2,R2,R6
  1739. ADDNE R4,R4,R6
  1740. ADD R0,R12,#v.plotwindow
  1741. LDMIA R0,{R5-R8}       ;the plot window triggers if an object is entirely
  1742. ;            outside of it.
  1743. CMP R1,R7
  1744. CMPLT R5,R3
  1745. CMPLT R2,R8
  1746. CMPLT R6,R4
  1747. ORRGE R9,R9,#Amf_plot_window
  1748. TST R9,#Amf_plot_window
  1749. TSTNE R2,#Amf_colch_window
  1750. ORRNE R9,R9,#Amf_colch_window
  1751. .noplotwindow
  1752. LDMFD R13!,{R2,R7}
  1753. .nowindows
  1754.  
  1755. ; reset regs to return
  1756. BIC R0,R11,#PF_advance; signal that we havn't finished
  1757. MOV R1,R10
  1758. AND R2,R9,R2
  1759. TST R2,#Amf_plot_window
  1760. BICNE R2,R2,#Amf_plot + Amf_user_plot
  1761. BICS R9,R2,#Amf_imask
  1762. LDMFD R13!,{R7-R9}
  1763. LDMNEFD R13!,{R3-R9,PC}^ ; return if attention required
  1764. .noadvance
  1765. MOV R0,#0
  1766. TST R2,#Amf_kill_window
  1767. STRNE R0,[R10,#o.type]
  1768.  
  1769. TST R2,#Amf_dest_timer
  1770. BEQ nodesttimer
  1771. LDR R1,[R10,#o.timer]
  1772. CMP R1,#0
  1773. STRLT R0,[R10,#o.type]
  1774. .nodesttimer
  1775.  
  1776. LDR R0,[R10,#o.type]
  1777. CMP R0,#0
  1778. BEQ objectdead
  1779. TST R2,#Amf_plot
  1780. BLNE plotobj     ;uses previous R0
  1781.                 
  1782. TST R2,#Amf_colch
  1783. BEQ objectskip
  1784. TST R2,#Amf_colch_window
  1785. BNE objectskip
  1786. BL colchadd
  1787. LDMVSFD R13!,{R3-R9,PC}
  1788. .objectskip
  1789. .objectdead
  1790. ;SWI OS_ReadEscapeState
  1791. ;BCC lookforobj
  1792. B lookforobj
  1793. LDMFD R13!,{R3-R9,PC}
  1794.  
  1795. .runtimer2
  1796. STMFD R13!,{R0}
  1797. LDR R0,[R10,#o.timer2]
  1798. SUB R0,R0,R0,LSL #16
  1799. STR R0,[R10,#o.timer2]
  1800. CMP R0,#0
  1801. ORRGT R9,R9,#Amf_timer2
  1802. LDMFD R13!,{R0}
  1803. MOV PC,R14
  1804.  
  1805. .addgravity
  1806. LDR R0,[R12,#v.gravx]
  1807. ADD R5,R5,R0
  1808. LDR R0,[R12,#v.gravy]
  1809. ADD R6,R6,R0
  1810. MOV PC,R14
  1811.  
  1812. .plotobj
  1813. STMFD R13!,{R0-R3,R14}
  1814. TST R2,#Amf_anim
  1815. BLNE fastspranim
  1816. TST R2,#Amf_use_plot_ofs
  1817. LDRNE R3,[R12,#v.plotxofs]
  1818. LDR R1,[R10,#o.x]
  1819. ADDNE R1,R1,R3
  1820. LDRNE R3,[R12,#v.plotyofs]
  1821. LDR R2,[R10,#o.y]
  1822. ADDNE R2,R2,R3
  1823. MOV R1,R1,ASR #coordshift
  1824. MOV R2,R2,ASR #coordshift
  1825. SWI FastSpr_Plot
  1826. LDMFD R13!,{R0-R3,PC}
  1827.  
  1828. .fastspranim
  1829. TST R2,#Amf_timer2
  1830. LDREQ R1,[R10,#o.timer]
  1831. LDRNE R1,[R10,#o.timer2]
  1832. AND R1,R1,#&FF<<24
  1833. ORR R0,R0,R1,LSR #8
  1834. MOV PC,R14
  1835.  
  1836. .doremote
  1837. LDR R0,[R12,#v.remote]
  1838. CMP R0,#0
  1839. BEQ remoteins0
  1840. LDR R14,[R0,#-4]
  1841. SUBS R14,R14,#remoteID
  1842. BNE remoteins0
  1843. STMFD R13!,{R9-R12}
  1844. LDR R12,[R12,#v.remoteR12]
  1845. MOV R14,PC
  1846. MOV PC,R0
  1847. LDMFD R13!,{R9-R12}
  1848. LDMIA R10,{R1-R8}
  1849. B remoteins0
  1850.  
  1851. .colchadd
  1852. STMFD R13!,{R1-R9,R14}
  1853. LDR R0,[R12,#v.temp0]
  1854. LDR R9,[R0,#4]; get colchtab addr
  1855. CMP R9,#0
  1856. BEQ colchnotable
  1857. SUB R9,R9,#b.sizeof
  1858. LDR R1,[R9,#c.writeofs]
  1859. LDR R2,[R9,#c.size]
  1860. CMP R1,R2
  1861. BGE colchnoroom
  1862. SUB R0,R10,R7;offset within table
  1863. ADD R7,R9,R1; position to write to
  1864. LDR R3,[R10,#o.x]
  1865. LDR R4,[R10,#o.y]
  1866. LDR R8,[R10,#o.size]
  1867. MOV R5,R8,LSR #16
  1868. MOV R6,R8,LSL #16; R6 is <<16 its real value
  1869. MOV R5,R5,LSL #16; now so is R5
  1870. SUB R1,R3,R5,LSR #17-coordshift
  1871. ADD R3,R3,R5,LSR #17-coordshift
  1872. SUB R2,R4,R6,LSR #17-coordshift
  1873. ADD R4,R4,R6,LSR #17-coordshift
  1874. STMIA R7!,{R0-R4}
  1875. SUB R1,R7,R9; restore writeofs
  1876. STR R1,[R9,#c.writeofs]
  1877. LDMFD R13!,{R1-R9,PC}^
  1878. .colchnotable
  1879. LDMFD R13!,{R1-R9,R14}
  1880. B colchnotableerr
  1881.  
  1882. .colchnoroom
  1883. LDMFD R13!,{R1-R9,R14}
  1884. B colchnoroomerr
  1885.  
  1886. .colchswi
  1887. STMFD R13!,{R4-R9,R14}
  1888. CMP R0,#&8000
  1889. BLGE nofirstcolch
  1890. BL firstcolch
  1891. LDMVSFD R13!,{R4-R9,PC}
  1892. .nofirstcolch
  1893. ADD R4,R12,#v.colchsave
  1894. LDMIA R4,{R0-R3}
  1895.  
  1896. .loop13
  1897. CMP R2,R0
  1898. BGE colchend2
  1899. LDMIA R2,{R4-R7}
  1900. ADD R2,R2,#cent.sizeof
  1901.  
  1902. .loop12
  1903. #rept 4
  1904. CMP R3,R1
  1905. BGE colchend1
  1906. LDMIA R3,{R8-R11}
  1907. ADD R3,R3,#cent.sizeof
  1908. CMP R4,R10
  1909. CMPLE R8,R6
  1910. CMPLE R5,R11
  1911. CMPLE R9,R7
  1912. BLE contact
  1913. #endr
  1914. B loop12
  1915.  
  1916. .colchend1
  1917. CMP R0,R1 ;are we checking a table with itself?
  1918. ADDEQ R3,R2,#cent.sizeof
  1919. LDRNE R3,[R12,#v.colch3]; wind R3 back to start of table
  1920. B loop13
  1921.  
  1922. .colchend2
  1923. MOV R0,#0
  1924. LDMFD R13!,{R4-R9,PC}^
  1925.  
  1926. .contact
  1927. ADD R14,R12,#v.colchboxes
  1928. STMIA R14,{R4-R11}      ;R4 minx1, R5 miny1, R6  maxx1, R7  maxy1
  1929.             ;R8 minx2, R9 miny2, R10 maxx2, R11 maxy2
  1930. ADD R4,R12,#v.colchsave
  1931. STMIA R4,{R0-R3}
  1932. LDR R2,[R2,#-cent.sizeof-4]
  1933. LDR R3,[R3,#-cent.sizeof-4]
  1934. LDR R0,[R12,#v.colch0]
  1935. ADD R0,R0,R2
  1936. LDR R1,[R12,#v.colch1]
  1937. ADD R1,R1,R3
  1938. LDMFD R13!,{R4-R9,PC}^
  1939. ;returns object addresses in R0,R1
  1940.  
  1941. .firstcolch
  1942. STMFD R13!,{R14}
  1943. BL gettlistaddr
  1944. LDMVSFD R13!,{PC}
  1945. LDR R4,[R0,#4]
  1946. CMP R4,#0
  1947. SUB R4,R4,#b.sizeof
  1948. LDR R5,[R0]
  1949. SUB R5,R5,#b.sizeof
  1950. STR R5,[R12,#v.colch0]
  1951. LDMEQFD R13!,{R14}
  1952. BEQ colchnotableerr
  1953.  
  1954. MOV R0,R1
  1955. BL gettlistaddr
  1956. LDMVSFD R13!,{PC}
  1957. LDR R1,[R0,#4]
  1958. CMP R1,#0
  1959. SUB R1,R1,#b.sizeof
  1960. LDR R5,[R0]
  1961. SUB R5,R5,#b.sizeof
  1962. STR R5,[R12,#v.colch1]
  1963. LDMEQFD R13!,{R14}
  1964. BEQ colchnotableerr
  1965. MOV R0,R4
  1966. ADD R2,R0,#c.sizeof+4
  1967. ADD R3,R1,#c.sizeof+4
  1968. CMP R0,R1
  1969. ADDEQ R3,R3,#cent.sizeof; skip first object if R0=R1
  1970. LDR R4,[R0,#c.writeofs]
  1971. ADD R0,R0,R4
  1972. LDR R4,[R1,#c.writeofs]
  1973. ADD R1,R1,R4
  1974. STR R3,[R12,#v.colch3]
  1975. ADD R4,R12,#v.colchsave
  1976. STMIA R4,{R0-R3}
  1977. LDMFD R13!,{PC}^
  1978.  
  1979. .colchboxesswi
  1980. STMFD R13!,{R14}
  1981. ADD R14,R12,#v.colchboxes
  1982. LDMIA R14,{R0-R7}
  1983. LDMFD R13!,{PC}
  1984. ;R0 minx1, R1 miny1, R2 maxx1, R3 maxy2
  1985. ;R4 minx2, R5 miny2, R6 maxx2, R7 maxy2
  1986.  
  1987. .makeobjectswi
  1988. STMFD R13!,{R2-R8,R14}
  1989. BL makeobjectspaceswi
  1990. MOVCS R1,#0
  1991. MOVVS R1,#0
  1992. LDMVSFD R13!,{R2-R8,PC}
  1993. LDMCSFD R13!,{R2-R8,PC}
  1994. TST R2,#Amf_make_objsize
  1995. BLNE makeupsize
  1996. CMP R0,#&8000
  1997. LDMLTFD R13!,{R2-R8,R14}
  1998. BLT fatalerr
  1999. STMIA R0,{R1-R8}
  2000. MOV R1,R0
  2001. LDMFD R13!,{R2-R8,PC}
  2002.  
  2003. .makeupsize
  2004. STMFD R13!,{R0-R1,R14}
  2005. MOV R0,R1
  2006. SWI FastSpr_ReadSize
  2007. ORR R8,R1,R0,LSL #16
  2008. LDMFD R13!,{R0-R1,PC}
  2009.  
  2010. .makeobjectspaceswi
  2011. STMFD R13!,{R1-R9,R14}
  2012. BL gettableaddr
  2013. LDMVSFD R13!,{R1-R9,PC}
  2014. SUB R11,R0,#b.sizeof
  2015.  
  2016. LDR R0,[R11,#t.next]
  2017. LDR R1,[R11,#t.number]
  2018. BL scantablespace
  2019. BEQ objspacefound
  2020. MOV R0,#0
  2021. LDR R1,[R11,#t.next]
  2022. BL scantablespace
  2023. BEQ objspacefound
  2024. LDMFD R13!,{R1-R9,R14}
  2025. MOV R1,#0
  2026. MOV R0,#0
  2027. ORR R14,R14,#1<<29; set carry flag
  2028. MOVS PC,R14
  2029.  
  2030. .objspacefound
  2031. STR R0,[R11,#t.next]
  2032. LDMFD R13!,{R1-R9,R14}
  2033. MOV R0,R10
  2034. BIC R14,R14,#3<<28
  2035. MOVS PC,R14
  2036.  
  2037. .deleteobjectswi
  2038. STMFD R13!,{R0,R14}
  2039. MOV R0,#0
  2040. STR R0,[R1]
  2041. LDMFD R13!,{R0,PC}
  2042.  
  2043. .countobjectsswi
  2044. STMFD R13!,{R1-R9,R14}
  2045. BL gettableaddr
  2046. LDMVSFD R13!,{R1-R9,PC}
  2047. SUB R11,R0,#b.sizeof
  2048. ADD R10,R11,#t.sizeof
  2049. LDR R2,[R11,#t.objsize]
  2050. LDR R1,[R11,#t.number]
  2051. MOV R3,#0;counter
  2052. CMP R1,#8
  2053. BLT slowcount
  2054. .fastcountloop
  2055. #rept 8
  2056. LDR R4,[R10],R2
  2057. CMP R4,#0
  2058. ADDNE R3,R3,#1
  2059. #endr
  2060. SUB R1,R1,#8
  2061. CMP R1,#8
  2062. BGE fastcountloop
  2063. .slowcount
  2064. CMP R1,#0
  2065. BLE countskip
  2066. .slowcountloop
  2067. LDR R4,[R10],R2
  2068. CMP R4,#0
  2069. ADDNE R3,R3,#1
  2070. SUBS R1,R1,#1
  2071. BGT slowcountloop
  2072. .countskip
  2073. MOV R0,R3
  2074. LDMFD R13!,{R1-R9,PC}
  2075.  
  2076. .scantablespace
  2077. ADD R10,R11,#t.sizeof
  2078. LDR R2,[R11,#t.objsize]
  2079. MUL R3,R2,R0; R2 is considered smallest
  2080. ADD R10,R10,R3; R10 points to our object.
  2081. SUB R4,R1,R0
  2082. CMP R4,#8
  2083. BLT nofastscan
  2084. .fastscan
  2085. LDR R4,[R10],R2
  2086. CMP R4,#0
  2087. BEQ scanfoundspace
  2088. LDR R4,[R10],R2
  2089. CMP R4,#0
  2090. BEQ scanfoundspace
  2091. LDR R4,[R10],R2
  2092. CMP R4,#0
  2093. BEQ scanfoundspace
  2094. LDR R4,[R10],R2
  2095. CMP R4,#0
  2096. BEQ scanfoundspace
  2097. LDR R4,[R10],R2
  2098. CMP R4,#0
  2099. BEQ scanfoundspace
  2100. LDR R4,[R10],R2
  2101. CMP R4,#0
  2102. BEQ scanfoundspace
  2103. LDR R4,[R10],R2
  2104. CMP R4,#0
  2105. BEQ scanfoundspace
  2106. LDR R4,[R10],R2
  2107. CMP R4,#0
  2108. BEQ scanfoundspace
  2109. ADD R0,R0,#8
  2110. SUB R4,R1,R0
  2111. CMP R4,#8
  2112. BGE fastscan
  2113. .nofastscan
  2114. ._loop
  2115. CMP R0,R1
  2116. BGE scannospace
  2117. LDR R4,[R10],R2
  2118. CMP R4,#0
  2119. ADD R0,R0,#1
  2120. BNE _loop
  2121. .scanfoundspace
  2122. SUB R10,R10,R2; correct for overshoot
  2123. MOV PC,R14; EQ is already set
  2124. .scannospace
  2125. BIC R14,R14,#1<<30; flag non-zero
  2126. MOVS PC,R14
  2127.  
  2128. .setgravityswi
  2129. STR R0,[R12,#v.gravx]
  2130. STR R1,[R12,#v.gravy]
  2131. MOV PC,R14
  2132. .readgravityswi
  2133. LDR R0,[R12,#v.gravx]
  2134. LDR R1,[R12,#v.gravy]
  2135. MOV PC,R14
  2136.  
  2137. .remoteswi
  2138. STMFD R13!,{R1-R2,R14}
  2139. MOV R2,R1
  2140. CMP R0,#0
  2141. BEQ remoteok
  2142. MOV R1,R0
  2143. SWI OS_ValidateAddress
  2144. LDMCSFD R13!,{R1-R2,R14}
  2145. BCS badptrerr
  2146. LDR R1,[R0,#-4]
  2147. SUBS R1,R1,#remoteID
  2148. LDMNEFD R13!,{R1-R2,R14}
  2149. BNE remoteerr
  2150. .remoteok
  2151. STR R0,[R12,#v.remote]
  2152. STR R2,[R12,#v.remoteR12]
  2153. LDMFD R13!,{R1-R2,PC}
  2154.  
  2155. .claimblockswi
  2156. STMFD R13!,{R1-R11,R14}
  2157. ADD R1,R1,#3
  2158. BIC R1,R1,#3
  2159. ADD R1,R1,#b.sizeof
  2160. ADD R4,R12,#v.buffer
  2161. STMIA R4,{R0-R3} ;avoiding stack
  2162. CMP R0,#0
  2163. BEQ nomemcheck
  2164. MOV R1,R0
  2165. SWI OS_ValidateAddress
  2166. LDMCSFD R13!,{R1-R11,R14}
  2167. BCS badptrerr
  2168.  
  2169. .nomemcheck
  2170. ADD R4,R12,#v.buffer
  2171. LDMIA R4,{R0-R3}; No writeback
  2172. BL getavailablespace
  2173. LDMVSFD R13!,{R1-R11,PC}
  2174.  
  2175. ADD R8,R1,#b.sizeof+16; for block table entry
  2176. CMP R0,R8
  2177. BGE claimisok
  2178. LDR R0,[R12,#v.areatype]
  2179. AND R0,R0,#&FF
  2180. CMP R0,#A_type_messy
  2181. LDMNEFD R13!,{R1-R11,R14}
  2182. BNE noroomerr
  2183. BL tidyswi
  2184. LDMVSFD R13!,{R1-R11,PC}
  2185. ADD R4,R12,#v.buffer
  2186. LDMIA R4,{R0-R3}; No writeback
  2187. BL getavailablespace
  2188. LDMVSFD R13!,{R1-R11,PC}
  2189. ADD R8,R1,#b.sizeof+16; for block table entry including possible qwa
  2190. CMP R0,R8
  2191. LDMLTFD R13!,{R1-R11,R14}
  2192. BLT noroomerr
  2193.                    ;drops through
  2194. .claimisok
  2195. LDMIA R4,{R0-R3}
  2196. BL scanblocktable
  2197. LDMVSFD R13!,{R1-R11,PC}
  2198. TST R3,#BF_qwa
  2199. ADDNE R1,R1,#16
  2200. BICNE R1,R1,#15
  2201. SUBNE R1,R1,#4
  2202. MOV R10,R0
  2203. STR R1,[R10]
  2204. MVN R8,#0
  2205. STR R8,[R10,#-4]
  2206. ADD R4,R12,#v.buffer
  2207. LDMIA R4,{R0-R3}
  2208. BL initblock
  2209. LDR R4,[R10]
  2210. ADD R5,R4,#b.sizeof
  2211. CMP R0,#0
  2212. STRNE R5,[R0]
  2213. MOV R0,R4
  2214. BL wipeblock
  2215. MOV R0,R5
  2216. LDMFD R13!,{R1-R11,PC}^
  2217.  
  2218. .extendblockswi
  2219. STMFD R13!,{R1-R9,R14}
  2220. MOV R8,R1
  2221. CMP R0,#&8000
  2222. ADDGE R0,R0,#b.sizeof
  2223. BL findblockentry
  2224. LDMVSFD R13!,{R1-R9,PC}
  2225. LDR R10,[R0]
  2226. LDR R9,[R10,#b.size]
  2227. CMP R1,R9
  2228. BGT blockextend
  2229. STR R1,[R10,#b.size]
  2230. LDR R0,[R12,#v.areatype]
  2231. CMP R0,#A_type_tidy
  2232. BLEQ tidyswi
  2233. LDMFD R13!,{R1-R9,PC}
  2234.  
  2235. .blockextend
  2236. LDR R0,[R10,#b.ptr]
  2237. MOV R1,R8
  2238. ADD R2,R10,#b.name
  2239. LDR R3,[R10,#b.flags]
  2240. BL claimblockswi
  2241. LDMVSFD R13!,{R1-R9,PC}
  2242. ADD R1,R10,#b.sizeof
  2243. MOV R2,R8
  2244. BL copyblock
  2245. MOV R0,R10
  2246. BL releaseblockinternal
  2247. LDMVSFD R13!,{R1-R9,PC}
  2248. LDR R0,[R12,#v.areatype]
  2249. CMP R0,#A_type_tidy
  2250. BLEQ tidyswi
  2251. LDMFD R13!,{R1-R9,PC}
  2252.  
  2253. .copyblock
  2254. STMFD R13!,{R0-R3,R14}
  2255. .loop14
  2256. LDR R3,[R1],#4
  2257. STR R3,[R0],#4
  2258. SUBS R2,R2,#4
  2259. BGT loop14
  2260. LDMFD R13!,{R0-R3,PC}
  2261.  
  2262.  
  2263.  
  2264.  
  2265. .releaseblockinternal
  2266. STMFD R13!,{R1-R4,R14}
  2267. B releaseblockins
  2268.  
  2269.  
  2270. .releaseblockswi
  2271. STMFD R13!,{R1-R4,R14}
  2272. CMP R0,#0
  2273. LDMEQFD R13!,{R1-R4,R14}
  2274. BEQ discardarea
  2275.  
  2276. CMP R0,#&8000
  2277. SUBGE R0,R0,#b.sizeof
  2278. .releaseblockins
  2279. MOV R4,R0
  2280. BL findblockentry
  2281. BVS releasenofind
  2282. MOV R3,R0
  2283. LDR R2,[R3]
  2284. CMP R2,#0
  2285. BEQ releasenonblock
  2286. LDR R0,blockid
  2287. LDR R1,[R2,#b.id]
  2288. CMP R0,R1
  2289. BNE releasecorruptblock
  2290. LDR R1,[R2,#b.ptr]
  2291. CMP R1,#0
  2292. MOV R0,#0
  2293. STRNE R0,[R1]; set pointer to null
  2294. STR R0,[R2,#b.id]  ; delete ID word
  2295. .releasecorruptins
  2296. MOV R0,#0
  2297. STR R0,[R3]  ; zero entry in block list
  2298. .releasenofindins
  2299. LDR R0,[R12,#v.areatype]
  2300. AND R0,R0,#&FF
  2301. CMP R0,#A_type_tidy
  2302. BNE donttidy
  2303. BL tidyswi
  2304. LDMVSFD R13!,{R1-R4,PC}
  2305. .donttidy
  2306.  
  2307. LDMFD R13!,{R1-R4,PC}^
  2308.  
  2309. .releasenofind
  2310. STR R4,[R12,#v.errorblock]
  2311. SWI OS_WriteS
  2312. DCB "Amnesia : Release of non-existent block (failed to find) - continuing...",10,13,0
  2313. ALIGN
  2314. B releasenofindins
  2315.  
  2316. .releasecorruptblock
  2317. STR R4,[R12,#v.errorblock]
  2318. SWI OS_WriteS
  2319. DCB "Amnesia : Release of corrupt block (incorrect guard word) - continuing...",10,13,0
  2320. ALIGN
  2321. B releasecorruptins
  2322.  
  2323. .releasenonblock
  2324. STR R4,[R12,#v.errorblock]
  2325. SWI OS_WriteS
  2326. DCB "Amnesia : Release of non-existent block (zero entry) - continuing...",10,13,0
  2327. ALIGN
  2328. B releasecorruptins
  2329.  
  2330. .initblock
  2331. STMFD R13!,{R0-R4,R14}
  2332. LDR R4,[R10]
  2333. STR R0,[R4,#b.ptr]
  2334. STR R1,[R4,#b.size]
  2335. STR R3,[R4,#b.flags]
  2336. ADD R0,R4,#b.name
  2337. MOV R1,R2
  2338. CMP R1,#0
  2339. ADREQ R1,defaultname
  2340. MOV R2,#8
  2341. BL strncpy
  2342. LDR R0,blockid
  2343. STR R0,[R4,#b.id]
  2344. LDMFD R13!,{R0-R4,PC}^
  2345.  
  2346.  
  2347. .defaultname
  2348. DCB "None",0
  2349. ALIGN
  2350.  
  2351. .describeblockswi
  2352. STMFD R13!,{R7-R11,R14}
  2353. CMP R0,#&8000
  2354. SUBGE R0,R0,#b.sizeof
  2355. BL xfindblockentry
  2356. LDMVSFD R13!,{R7-R11,R14}
  2357. BVS err
  2358. LDR R0,[R0]
  2359. ;MOV R0,R0;block addr
  2360. LDR R1,[R0,#b.size];block size
  2361. ADD R2,R0,#b.sizeof;data addr
  2362. SUB R3,R1,#b.sizeof;data size
  2363. ADD R4,R0,#b.name;ptr to name
  2364. LDR R5,[R0,#b.ptr];ptr to ptr
  2365. LDR R6,[R0,#b.flags]
  2366. LDMFD R13!,{R7-R11,PC}
  2367.  
  2368. .scanblocktable
  2369. ;returns R0 pointing to the end marker of the block table
  2370. ;R1 pointing to the start of free space
  2371. ;R2 the number of blocks
  2372. STMFD R13!,{R3-R11,R14}
  2373. LDR R11,[R12,#v.areastart]
  2374. LDR R0,[R11,#h.areasize]
  2375. ADD R10,R11,R0 ;scan the blocks
  2376. LDR R7,blockid
  2377. MOV R5,#0; space counter
  2378. MOV R6,R11; header - last valid entry
  2379. .loopB
  2380. LDR R9,[R10,#-4]!
  2381. CMP R9,#0
  2382. BEQ loopB
  2383. CMP R9,#-1
  2384. BEQ scanblocktableend
  2385. MOV R6,R10
  2386. LDR R0,[R9]
  2387. CMP R0,R7
  2388. LDMNEFD R13!,{R3-R11,R14}
  2389. BNE scanbadblockerr
  2390. ADD R5,R5,#1
  2391. B loopB
  2392. .scanblocktableend
  2393. MOV R0,R10
  2394. LDR R2,[R6]
  2395. LDR R1,[R2,#b.size]
  2396. ADD R1,R2,R1
  2397. MOV R2,R5
  2398. LDMFD R13!,{R3-R11,PC}^
  2399.  
  2400. .xfindblockentry
  2401. STMFD R13!,{R7-R11,R14}
  2402. MOV R8,R0
  2403. LDR R11,[R12,#v.areastart]
  2404. LDR R10,[R11,#h.areasize]
  2405. ADD R10,R11,R10
  2406. CMP R8,#&8000
  2407. BLT xfindblockno
  2408. .loopE
  2409. LDR R9,[R10,#-4]!
  2410. CMP R9,#0
  2411. BEQ loopE
  2412. CMP R9,R8
  2413. BEQ foundblock
  2414. CMP R9,#-1
  2415. BEQ notfoundblock
  2416.  
  2417. B loopE
  2418.  
  2419.  
  2420. .findblockentry
  2421. STMFD R13!,{R7-R11,R14}
  2422. MOV R8,R0
  2423. LDR R11,[R12,#v.areastart]
  2424. LDR R10,[R11,#h.areasize]
  2425. ADD R10,R11,R10
  2426. LDR R7,blockid
  2427. CMP R8,#&8000
  2428. BLT findblockno
  2429. .loopC
  2430. LDR R9,[R10,#-4]!
  2431. CMP R9,#0
  2432. BEQ loopC
  2433. CMP R9,R8
  2434. BEQ foundblock
  2435. CMP R9,#-1
  2436. BEQ notfoundblock
  2437.  
  2438. LDR R0,[R9]
  2439. CMP R0,R7
  2440. LDMNEFD R13!,{R7-R11,R14}
  2441. BNE scanbadblockerr
  2442. B loopC
  2443. .foundblock
  2444. MOV R0,R10
  2445. LDMFD R13!,{R7-R11,PC}
  2446. .notfoundblock
  2447. MOV R0,R8
  2448. LDMFD R13!,{R7-R11,R14}
  2449. B notfoundblockerr
  2450.  
  2451. .xfindblockno
  2452. .loopF
  2453. LDR R9,[R10,#-4]!
  2454. CMP R9,#-1
  2455. BEQ notfoundblock
  2456. MOV R0,R9             ;check for amnesia block
  2457. MOV R1,R0
  2458. SWI OS_ValidateAddress
  2459. LDMCSFD R13!,{R7-R11,R14}
  2460. BCS areacorrupterr
  2461. SUBS R8,R8,#1
  2462. BPL loopF
  2463. B foundblock
  2464.  
  2465. .findblockno
  2466. .loopD
  2467. LDR R9,[R10,#-4]!
  2468. CMP R9,#-1
  2469. BEQ notfoundblock
  2470. CMP R9,#0
  2471. BEQ findblocknoskip
  2472. LDR R0,[R9]
  2473. CMP R0,R7
  2474. LDMNEFD R13!,{R7-R11,R14}
  2475. BNE scanbadblockerr
  2476. .findblocknoskip
  2477. SUBS R8,R8,#1
  2478. BPL loopD
  2479. B foundblock
  2480.  
  2481.  
  2482. .getfreespace
  2483. STMFD R13!,{R1-R2,R14}
  2484. BL getusedspace
  2485. LDMVSFD R13!,{R1-R2,PC}
  2486. LDR R1,[R12,#v.areastart]
  2487. LDR R1,[R1,#h.areasize]
  2488. SUB R0,R1,R0
  2489. LDMFD R13!,{R1-R2,PC}
  2490.  
  2491. .getavailablespace
  2492. STMFD R13!,{R1-R2,R14}
  2493. BL getusedspace
  2494. LDMVSFD R13!,{R1-R2,PC}
  2495. MOV R0,R1
  2496. LDMFD R13!,{R1-R2,PC}
  2497.  
  2498.  
  2499. .getusedspace
  2500. STMFD R13!,{R2-R11,R14}
  2501. LDR R11,[R12,#v.areastart]
  2502. LDR R0,[R11,#h.areasize]
  2503. ADD R10,R11,R0 ;let's count up the blocks
  2504. LDR R7,blockid
  2505. MOV R5,#0; space counter
  2506. MOV R4,R11
  2507. MOV R3,R10
  2508. .loopA
  2509. LDR R9,[R10,#-4]!
  2510. CMP R9,#-1
  2511. BEQ usedspaceend
  2512. MOV R0,R9
  2513. MOV R1,R0
  2514. SWI OS_ValidateAddress
  2515. LDMCSFD R13!,{R2-R11,R14}
  2516. BCS areacorrupterr
  2517. SUB R3,R3,#4
  2518. ADD R5,R5,#4;for block table entries
  2519. CMP R9,#0
  2520. BEQ loopA
  2521. LDR R0,[R9]
  2522. CMP R0,R7
  2523. LDMNEFD R13!,{R2-R11,R14}
  2524. BNE usedbadblockerr
  2525. LDR R2,[R9,#b.size]
  2526. ADD R5,R5,R2
  2527. ADD R4,R9,R2
  2528. B loopA
  2529. .usedspaceend
  2530. MOV R0,R5
  2531. SUB R1,R3,R4
  2532. LDMFD R13!,{R2-R11,PC}
  2533.  
  2534. .discardarea
  2535. STMFD R13!,{R0-R11,R14}
  2536. LDR R0,[R12,#v.areastart]
  2537. CMP R0,#0
  2538. LDMEQFD R13!,{R0-R11,PC}
  2539. STMFD R13!,{R0-R3}
  2540. ADR R0,start
  2541. MOV R1,#Service_Amnesia
  2542. MOV R2,R12
  2543. MOV R3,#0
  2544. SWI OS_ServiceCall
  2545. LDMFD R13!,{R0-R3}
  2546. LDR R0,[R12,#v.areatype]
  2547. TST R0,#1<<31
  2548. MOV R2,#v.areastart
  2549. BLNE releaserma
  2550. MOV R0,#0
  2551. STR R0,[R12,#v.areastart]
  2552. LDMFD R13!,{R0-R11,PC}
  2553.  
  2554. .newapplication
  2555. STMFD R13!,{R0,R14}
  2556. LDR R0,[R12,#v.areatype]
  2557. TST R0,#1<<31
  2558. BLEQ discardarea
  2559. LDMFD R13!,{R0,PC}
  2560.  
  2561. .getarearma
  2562. STMFD R13!,{R14}
  2563. LDR R0,[R12,#v.areatype]
  2564. ORR R0,R0,#1<<31        ;flag as 'in RMA'
  2565. STR R0,[R12,#v.areatype]
  2566. MOV R2,#v.areastart
  2567. LDR R3,[R12,#v.areasize]
  2568. BL claimrma
  2569. LDMFD R13!,{PC}
  2570.  
  2571. .setplotofsswi
  2572. STR R0,[R12,#v.plotxofs]
  2573. STR R1,[R12,#v.plotyofs]
  2574. MOV PC,R14
  2575.  
  2576. .readplotofsswi
  2577. LDR R0,[R12,#v.plotxofs]
  2578. LDR R1,[R12,#v.plotyofs]
  2579. MOV PC,R14
  2580.  
  2581. .defaultpath
  2582. DCB "File$Path",0
  2583. ALIGN
  2584.  
  2585. .loadfileswi
  2586. STMFD R13!,{R1-R9,R14}
  2587.          ; R1 = filename
  2588. MOV R3,R0; R3 = pointer address as supplied
  2589. MOV R4,R2; R4 = pathname
  2590. CMP R4,#0
  2591. ADREQ R4,defaultpath
  2592. MOV R0,#15
  2593. STMFD R13!,{R1-R4}
  2594. SWI XOS_File
  2595. MOV R6,R4; R6 = file length
  2596. LDMFD R13!,{R1-R4}
  2597. LDMVSFD R13!,{R1-R9,PC}
  2598. CMP R0,#1
  2599. LDMNEFD R13!,{R2-R10,R14} 
  2600. MOVNE R2,R0;for error report
  2601. BNE notafileerr
  2602.  
  2603. STMFD R13!,{R1-R4}
  2604. MOV R5,R1
  2605. ._loop
  2606. LDRB R0,[R5]
  2607. CMP R0,#32
  2608. ADDGT R5,R5,#1
  2609. BGT _loop
  2610. SUB R2,R5,#8
  2611. CMP R2,R1
  2612. MOVLT R2,R1
  2613. MOV R0,R3
  2614. MOV R1,R6
  2615. MOV R3,#2
  2616. BL claimblockswi
  2617. MOV R5,R0; R5 = block address
  2618. LDMFD R13!,{R1-R4}
  2619. LDMVSFD R13!,{R1-R9,PC}
  2620. STMFD R13!,{R1-R5}
  2621. MOV R0,#14
  2622. MOV R2,R5
  2623. MOV R3,#0 ; and R4 as preserved
  2624. SWI XOS_File
  2625. LDMFD R13!,{R1-R5}
  2626. LDMVSFD R13!,{R1-R9,PC}
  2627. MOV R0,R5
  2628. LDMFD R13!,{R1-R9,PC}^
  2629.  
  2630. .savefileswi
  2631. STMFD R13!,{R1-R9,R14}
  2632. STMFD R13!,{R1-R2}
  2633. BL describeblockswi
  2634. MOV R4,R2
  2635. ADD R5,R2,R3; end address
  2636. LDMFD R13!,{R1-R2}
  2637. LDMVSFD R13!,{R1-R9,PC}
  2638. MOV R0,#10
  2639. SWI XOS_File
  2640. LDMFD R13!,{R1-R9,PC} ;returns possible error from SWI
  2641.  
  2642. .loadhammeredswi
  2643. STMFD R13!,{R1-R9,R14}
  2644.         ; R1 = filename
  2645. MOV R7,R0; R7 = pointer address as supplied
  2646. CMP R2,#0
  2647. ADREQ R2,defaultpath
  2648. MOV R4,R2; R4 = pathname
  2649. MOV R0,#0
  2650. SWI XBlitz_HammerOp
  2651. LDMVSFD R13!,{R1-R9,PC}
  2652. MOV R6,R3
  2653. CMP R3,#0
  2654. MOVEQ R0,R7
  2655. LDMEQFD R13!,{R1-R9,R14}
  2656. BEQ loadfileswi
  2657.  
  2658. STMFD R13!,{R1-R4}
  2659. MOV R5,R1
  2660. ._loop
  2661. LDRB R0,[R5]
  2662. CMP R0,#32
  2663. ADDGT R5,R5,#1
  2664. BGT _loop
  2665. SUB R2,R5,#8
  2666. CMP R2,R1
  2667. MOVLT R2,R1
  2668. MOV R0,R7
  2669. MOV R1,R6
  2670. MOV R3,#2
  2671. BL claimblockswi
  2672. MOV R8,R0; R8 = block address
  2673. LDMFD R13!,{R1-R4}
  2674. LDMVSFD R13!,{R1-R9,PC}
  2675. MOV R0,#1
  2676. MOV R2,R4
  2677. MOV R3,R8
  2678. SWI XBlitz_HammerOp
  2679. LDMVSFD R13!,{R1-R9,PC}
  2680. MOV R0,R8
  2681. LDMFD R13!,{R1-R9,PC}^
  2682.  
  2683.  
  2684. .claimrma
  2685.  
  2686. ;on entry    r2=pointer to block is at r12+r2 block
  2687. ;        r3=requested size
  2688. ;sets V if error
  2689.  
  2690. STMFD R13!,{R0-R4,R14}
  2691. MOV R0,#6
  2692. MOV R4,R2
  2693. SWI XOS_Module
  2694. MOVVS R2,#0
  2695. STR R2,[R12,R4]
  2696. LDMFD R13!,{R0-R4,PC}
  2697.  
  2698. .releaserma
  2699. STMFD R13!,{R0-R4,R14}
  2700. MOV R0,#7
  2701. MOV R4,R2
  2702. LDR R2,[R12,R2]
  2703. SWI XOS_Module
  2704. BLVS releaseerr
  2705. MOV R2,#0
  2706. STR R2,[R12,R4]
  2707. LDMFD R13!,{R0-R4,PC}
  2708. .releaseerr
  2709. STMFD R13!,{R14}
  2710. ADD R0,R0,#4
  2711. SWI OS_Write0
  2712. SWI OS_NewLine
  2713. LDMFD R13!,{PC}
  2714.  
  2715. .strncpy
  2716. STMFD R13!,{R0-R4,R14}
  2717. MOV R4,#0
  2718. MOV R3,#1; ie not zero
  2719. .loop6
  2720. CMP R3,#0
  2721. LDRNEB R3,[R1],#1
  2722. CMP R3,#"'"
  2723. BLEQ strnquote
  2724. STRB R3,[R0],#1
  2725. SUBS R2,R2,#1
  2726. BGT loop6
  2727. LDMFD R13!,{R0-R4,PC}
  2728. .strnquote
  2729. CMP R4,#"'"
  2730. MOVEQ R3,#0
  2731. MOVEQ PC,R14
  2732. MOV R4,#"'"
  2733. LDRB R3,[R1],#1
  2734. CMP R3,#"'"
  2735. MOVEQ R3,#0
  2736. MOV PC,R14
  2737.  
  2738. .service
  2739. CMP R1,#&4E
  2740. MOVNES PC,R14
  2741. STMFD R13!,{R0-R12,R14}
  2742. LDR R12,[R12]
  2743. BL newapplication
  2744. LDMFD R13!,{R0-R12,PC}
  2745.  
  2746. .init
  2747. STMFD R13!,{R7-R12,R14}
  2748. MOV R0,#6
  2749. MOV R3,#v.sizeof
  2750. SWI XOS_Module
  2751. STR R2,[R12]
  2752. LDR R12,[R12]
  2753. BVS initabort
  2754. MOV R0,#0
  2755. STR R0,[R12,#v.areastart]
  2756. STR R0,[R12,#v.gravx]
  2757. STR R0,[R12,#v.gravy]
  2758. LDMFD R13!,{R7-R12,PC}
  2759.  
  2760. .final
  2761. STMFD R13!,{R7-R12,R14}
  2762. LDR R12,[R12]
  2763. BL discardarea
  2764. .initabort
  2765. MOV R0,#7
  2766. MOV R2,R12
  2767. SWI XOS_Module
  2768. LDMFD R13!,{R7-R12,PC}^
  2769.  
  2770. .badnumber
  2771. STMFD R13!,{R0}
  2772. ._loop
  2773. LDRB R0,[R1],#1
  2774. CMP R0,#" "
  2775. SWIGE OS_WriteC
  2776. BLGE _loop
  2777. SWI OS_WriteS
  2778. DCB 10,13,"!",10,13,0
  2779. ALIGN
  2780. LDMFD R13!,{R0}
  2781. SWI OS_GenerateError
  2782.  
  2783.  
  2784. .err
  2785. ORR R14,R14,#1<<28
  2786. MOVS PC,R14
  2787. .unknownswi
  2788. ADR R0,unknownswitext
  2789. B err
  2790. .unknownswitext
  2791. DCD &80C901
  2792. DCB "Amnesia : Unrecognised SWI",0
  2793. ALIGN
  2794. .amsnomatcherr
  2795. ADR R0,nomatcherrblock
  2796. B err
  2797. .nomatcherrblock
  2798. DCD &80C902
  2799. DCB "Amnesia : Unrecognised SWI tail",0
  2800. ALIGN
  2801. .badblockerr
  2802. ADR R0,badblocktext
  2803. B err
  2804. .badblocktext
  2805. DCD &80C903
  2806. DCB "Amnesia : Invalid memory block",0
  2807. ALIGN
  2808. .noroomrmaerr
  2809. ADR R0,noroomrmatext
  2810. B err
  2811. .noroomrmatext
  2812. DCD &80C904
  2813. DCB "Amnesia : Not enough memory in module area",0
  2814. ALIGN
  2815. .noroomerr
  2816. ADR R0,noroomtext
  2817. B err
  2818. .noroomtext
  2819. DCD &80C905
  2820. DCB "Amnesia : Not enough memory in Amnesia area",0
  2821. ALIGN
  2822. .notiniterr
  2823. ADR R0,notinittext
  2824. B err
  2825. .notinittext
  2826. DCD &80C906
  2827. DCB "Amnesia : Cannot perform operation - no area initialised",0
  2828. ALIGN
  2829. .toomanyerr
  2830. ADR R0,toomanytext
  2831. B err
  2832. .toomanytext
  2833. DCD &80C907
  2834. DCB "Amnesia : *** Aborting - Too many errors",0
  2835. ALIGN
  2836. .usedbadblockerr
  2837. ADR R0,usedbadblocktext
  2838. B err
  2839. .usedbadblocktext
  2840. DCD &80C908
  2841. DCB "Amnesia : Bad block detected when calculating used space",0
  2842. ALIGN
  2843. .scanbadblockerr
  2844. MOV R1,R0
  2845. ADR R0,scanbadblocktext
  2846. B err
  2847. .scanbadblocktext
  2848. DCD &80C909
  2849. DCB "Amnesia : Bad block detected when scanning block table",0
  2850. ALIGN
  2851. .badptrerr
  2852. ADR R0,badptrtext
  2853. B err
  2854. .badptrtext
  2855. DCD &80C90A
  2856. DCB "Amnesia : Supplied pointer address is not in valid memory",0
  2857. ALIGN
  2858. .tlisterr
  2859. STMFD R13!,{R14}
  2860. ADD R0,R0,#4
  2861. MOV R1,#0
  2862. MOV R2,#0
  2863. SWI OS_PrettyPrint
  2864. SWI OS_NewLine
  2865. LDMFD R13!,{R14}
  2866. ADR R0,tlisterrtext
  2867. B err
  2868. .tlisterrtext
  2869. DCD &80C90B
  2870. DCB "Amnesia : Failed to make a table list",0
  2871. ALIGN
  2872. .errbuf
  2873. DCD 0
  2874. .getblockerr
  2875. STR R0,[R12,#v.errorblock]
  2876. ADR R0,getblockerrtext
  2877. B err
  2878. .getblockerrtext
  2879. DCD &80C90C
  2880. DCB "Amnesia : Block does not exist",0
  2881. ALIGN
  2882. .notlisterr
  2883. ADR R0,notlisterrtext
  2884. B err
  2885. .notlisterrtext
  2886. DCD &80C90D
  2887. DCB "Amnesia : Cannot produce table - no internal table list",0
  2888. ALIGN
  2889. .tabletoohigherr
  2890. STR R0,[R12,#v.errortable]
  2891. ADR R0,tabletoohigherrtext
  2892. B err
  2893. .tabletoohigherrtext
  2894. DCD &80C90E
  2895. DCB "Amnesia : Table number is too high",0
  2896. ALIGN
  2897. .notableerr
  2898. STR R0,[R12,#v.errortable]
  2899. ADR R0,notableerrtext
  2900. B err
  2901. .notableerrtext
  2902. DCD &80C90F
  2903. DCB "Amnesia : Reference to table which does not exist",0
  2904. ALIGN
  2905. .notfoundblockerr
  2906. STR R0,[R12,#v.errorblock]
  2907. ADR R0,notfoundblockerrtext
  2908. B err
  2909. .notfoundblockerrtext
  2910. DCD &80C910
  2911. DCB "Amnesia : Cannot find requested block",0
  2912. ALIGN
  2913. .areacorrupterr
  2914. ADR R0,areacorrupterrtext
  2915. B err
  2916. .areacorrupterrtext
  2917. DCD &80C911
  2918. DCB "Amnesia : Area is corrupted.  Use *Ams Blocks",0
  2919. ALIGN
  2920. .badareaerr
  2921. STMFD R13!,{R14}
  2922. SWI OS_NewLine
  2923. LDMFD R13!,{R14}
  2924. ADR R0,badareaerrtext
  2925. B err
  2926. .badareaerrtext
  2927. DCD &80C912
  2928. DCB "Amnesia : Amnesia area is not consistent with normal operation",0
  2929. ALIGN
  2930. .movenonblockerr
  2931. STR R0,[R12,#v.errorblock]
  2932. ADR R0,movenonblockerrtext
  2933. B err
  2934. .movenonblockerrtext
  2935. DCD &80C913
  2936. DCB "Amnesia : Attempt to move a bad block",0
  2937. ALIGN
  2938.  
  2939. .inconblockerr
  2940. ADR R0,inconblockerrtext
  2941. B err
  2942. .inconblockerrtext
  2943. DCD &80C914
  2944. DCB "Amnesia : Block position and pointer to position do not agree",0
  2945. ALIGN
  2946. .needspaceerr
  2947. ADR R0,needspaceerrtext
  2948. B err
  2949. .needspaceerrtext
  2950. DCD &80C915
  2951. DCB "Amnesia : Abbreviated SWI tails with parameters must be followed by a space",0
  2952. ALIGN
  2953. .objectoutsideerr
  2954. STR R0,[R12,#v.errortable]
  2955. ADR R0,objectoutsideerrtext
  2956. B err
  2957. .objectoutsideerrtext
  2958. DCD &80C916
  2959. DCB "Amnesia : ProcessTable has received an object address outside of the table",0
  2960. ALIGN
  2961. .windownonerr
  2962. ADR R0,windownonerrtext
  2963. B err
  2964. .windownonerrtext
  2965. DCD &80C917
  2966. DCB "Amnesia : Bad window number - must be 0-2",0
  2967. ALIGN
  2968. .windowdodgyerr
  2969. ADR R0,windowdodgyerrtext
  2970. B err
  2971. .windowdodgyerrtext
  2972. DCD &80C918
  2973. DCB "Amnesia : Bad window - minimum greater than maximum",0
  2974. ALIGN
  2975. .colchnotableerr
  2976. ADR R0,colchnotableerrtext
  2977. B err
  2978. .colchnotableerrtext
  2979. DCD &80C919
  2980. DCB "Amnesia : Collision checking not requested when claiming table",0
  2981. ALIGN
  2982. .colchnoroomerr
  2983. ADR R0,colchnoroomerrtext
  2984. B err
  2985. .colchnoroomerrtext
  2986. DCD &80C920
  2987. DCB "Amnesia : No room in collision checking block",0
  2988. ALIGN
  2989. .notafileerr
  2990. STMFD R13!,{R14}
  2991. MOV R0,#19
  2992. SWI XOS_File
  2993. LDMFD R13!,{R14}
  2994. B err
  2995. .fatalerr
  2996. ADR R0,fatalerrtext
  2997. B err
  2998. .fatalerrtext
  2999. DCD &80C921
  3000. DCB "Amnesia : ***** Internal error ***** - please report any appearance of this error to the author, together with the circumstances in which the error occured.",0
  3001. ALIGN
  3002. .qwaerr
  3003. STR R0,[R12,#v.errorblock]
  3004. ADR R0,qwaerrtext
  3005. B err
  3006. .qwaerrtext
  3007. DCD &80C922
  3008. DCB "Amnesia : Area tidy would require a forward block shift.  Area corrupt?",0
  3009. ALIGN
  3010. .notyeterr
  3011. ADR R0,notyeterrtext
  3012. B err
  3013. .notyeterrtext
  3014. DCD &80C924
  3015. DCB "Amnesia : SWI not supported by this version",0
  3016. ALIGN
  3017. .badsaveerr
  3018. ADR R0,badsaveerrtext
  3019. B err
  3020. .badsaveerrtext
  3021. DCD &80C925
  3022. DCB "Amnesia : Failed to save",0
  3023. ALIGN
  3024.  
  3025. .remoteerr
  3026. ADR R0,remoteerrtext
  3027. B err
  3028. .remoteerrtext
  3029. DCD &80C926
  3030. DCB "Amnesia : Remote routine guard ID not present.  The word before the routine must be &006E0000.",0
  3031. ALIGN
  3032.  
  3033. .namematchwarn
  3034. STMFD R13!,{R14}
  3035. SWI OS_WriteS
  3036. DCB "Amnesia : LoadTable warning - The table name does not match that in the file",10,13,0
  3037. ALIGN
  3038. LDMFD R13!,{PC}
  3039.  
  3040. .objsizewarn
  3041. STMFD R13!,{R14}
  3042. SWI OS_WriteS
  3043. DCB "Amnesia : LoadTable warning - Object length does not match that in the file",10,13,0
  3044. ALIGN
  3045. LDMFD R13!,{PC}
  3046.