Home » Archimedes archive » Micro User » MU 1992-06.adf » PD » !FunkyDemo/!RunMain
!FunkyDemo/!RunMain
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Micro User » MU 1992-06.adf » PD |
Filename: | !FunkyDemo/!RunMain |
Read OK: | ✔ |
File size: | 1250F bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM > !FunkyDemo.!RunMain 20REM (C) JSG 1992 30 40IF FALSE THEN 50 VOICES 8 60 MODE12 70 COLOUR 4,0,0,0 80 COLOUR 4+128 90 CLS 100 *SPEAKER OFF 110 *KEY 1 " |MTWINO8|M" 120 VDU 19,0,24,32,32,32 130ENDIF 140 150DIM code 32768 160DIM sprites 81920 170DIM plotspriteacode(7,3) 180DIM rgval(2),bval(2) 190 200rgval(0)=0 210rgval(1)=0.6 220rgval(2)=1 230bval(0)=0 240bval(1)=0.3 250bval(2)=0.5 260xorigin=320 270yorigin=64 280 290cos%=32768*COS(0.12)+0.5 300sin%=32768*SIN(0.12)+0.5 310 320PROCassemble 330 340OSCLI"LOAD <Funky$Dir>.Sprites "+STR$~sprites 350SYS"Tracker_TuneInfo" TO A 360IF A=0 THEN 370 *RMAFree 300K 380 SYS"Tracker_Load","<Funky$Dir>.GtRdyFrThs" 390ENDIF 400 410COLOUR 3,255,255,255 420GCOL 0 430FOR N%=0 TO 127 440 A%=startab!(N%<<2) 450 POINT (A% MOD 320)*4,1023-(A% DIV 320)*4 460 POINT (A% MOD 320)*4+2,1023-(A% DIV 320)*4 470NEXT 480 490FOR N=0 TO 15 500 COLOUR 7,192-N*12,192-N*12,192-N*12 510 COLOUR 0,0,0,N*12 520 COLOUR 3,192-N*12,192-N*12,192-N*12 530 *FX 19 540 *FX 19 550 *FX 19 560NEXT N 570 580!curplotbank=1 590COLOUR 0,0,0,192 600COLOUR 1,192,0,0 610COLOUR 2,192,96,0 620COLOUR 3,64,128,48 630FOR C2%=1 TO 2 640 COLOUR 12+C2%,127*bval(C2%),127*bval(C2%),255*bval(C2%) 650NEXT 660COLOUR 15,255,255,255 670COLOUR 15 680PROCsetpalette(B0%,B1%) 690 700FOR N%=0 TO 31 710 SYS"Tracker_ReadSampleTable",N%+1 TO ,,,,,,sampleaddrtab!(N%<<2) 720NEXT 730SYS"Tracker_Stereo",1 740 750A%=torsotrans:B%=spin1:C%=torsotrans 760CALL multiply:CALL multiply:CALL multiply 770CALL multiply 780A%=torsotrans:B%=spin3:C%=torsotrans 790CALL multiply:CALL multiply:CALL multiply 800 810E%=0 820COLOUR 15 830 840*FX 176,2,0 850SYS"Tracker_SetPos",0,0 860SYS"Tracker_Play" 870 880REPEAT 890 CALL changeframe 900 CALL clearscreen 910 CALL control 920 CALL update 930 CALL drawgraphs 940 CALL drawperson 950 IF RND(12)=1 THEN !curcol1=RND(10)-1:!curcol2=RND(10)-1 960 IF RND(6)=1 THEN graphpostab!(RND(4)*48-48+45)=RND(6)-1 970 MOUSE X%,Y%,B% 980 IF B% AND 2 THEN 990 *PLAYPAUSE 1000 REPEAT:MOUSE X%,Y%,B%:UNTIL (B% AND 2)=0 1010 REPEAT:MOUSE X%,Y%,B%:UNTIL (B% AND 2)=2 1020 REPEAT:MOUSE X%,Y%,B%:UNTIL (B% AND 2)=0 1030 *PLAYSTART 1040 ENDIF 1050UNTIL B% AND 4 1060 1070SYS"Tracker_Pause" 1080MODE0 1090END 1100 1110DEF PROCsetpalette(B0%,B1%) 1120 FOR C1%=0 TO 2 1130 FOR C0%=0 TO 2 1140 BR%=(B0%*rgval(C0%)+B1%*rgval(C1%))/2 1150 COLOUR 4+3*C1%+C0%,BR%,BR%,BR% 1160 NEXT 1170 NEXT 1180ENDPROC 1190 1200DEF FNROUND(A) 1210=A+0.5*SGN(A) 1220 1230DEF PROCassemble 1240 FOR pass%=0 TO 2 STEP 2 1250 P%=code 1260 [OPT pass% 1270 1280 .currepqind 1290 EQUD currepq-P% 1300 1310 .plotscreenind0 1320 EQUD plotscreenbase-P% 1330 1340 \ Plot Sprite size a (32*n mode 12) with implicit mask but no clipping 1350 \ Value 0 -> no plot 1360 \ 1-3 -> (illegal do not use) 1370 \ 4-15 -> plot pixel 1380 \ R0 = X pos of centre (internal) 1390 \ R1 = Y pos of centre (internal) 1400 \ R2 = number of lines in sprite (n) 1410 \ R3 = address of sprite data (word aligned) 1420 .plotspritea 1430 STMFD R13!,{R0-R12,R14} 1440 1450 ADR R10,currepqind 1460 LDR R12,[R10] 1470 LDR R10,[R12,R10] 1480 CMP R10,#1 1490 BEQ psa1 1500 CMP R10,#2 1510 BEQ psa2 1520 CMP R10,#3 1530 BEQ psa3 1540 1550 MOV R10,R3 \ R10 = address of sprite data 1560 1570 MOV R11,R2 \ R11 = number of lines 1580 1590 SUB R0,R0,#16 1600 SUB R1,R1,R11,ASR #1 \ get top left corner 1610 1620 CMN R0,#1 1630 CMNGT R1,R11 1640 LDMLEFD R13!,{R0-R12,PC}^ 1650 CMP R0,#640-32 1660 CMPLE R1,#256-1 1670 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites 1680 1690 CMP R1,#0 1700 ADDLT R11,R11,R1 1710 SUBLT R10,R10,R1,LSL #4 1720 MOVLT R1,#0 \ trim top 1730 1740 RSB R4,R1,#256 1750 CMP R11,R4 1760 MOVGT R11,R4 \ trim bottom 1770 1780 ADR R9,plotscreenind0 1790 LDR R12,[R9] 1800 LDR R9,[R9,R12] 1810 ADD R9,R9,R1,LSL #8 1820 ADD R9,R9,R1,LSL #6 1830 BIC R1,R0,#7 1840 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting 1850 1860 MOV R12,#%1000 1870 ORR R12,R12,R12,LSL #16 1880 ORR R12,R12,R12,LSL #8 1890 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit 1900 1910 AND R1,R0,#7 1920 ADR R0,caselist 1930 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case 1940 ADR R1,base 1950 ADD PC,R0,R1 1960 1970 .caselist 1980 ] 1990 FOR N%=0 TO 7 2000 [OPT pass% 2010 EQUD plotspriteacode(N%,0)-base 2020 ] 2030 NEXT N% 2040 [OPT pass% 2050 .base 2060 ] 2070 FOR N%=0 TO 7 2080 shiftleft = N%*4 2090 shiftright = 32-N%*4 2100 [OPT pass% \ do 8 compilations 2110 2120 .plotspriteacode(N%,0) \ doubles as loop start 2130 LDMIA R10!,{R0-R3} 2140 2150 LDMIA R9,{R4-R8} 2160 2170 ] 2180 FOR M%=0 TO 3 2190 Rdata = M% 2200 Rcurword = M%+4 2210 Rnextword = M%+5 2220 [OPT pass% \ for four words... 2230 2240 ORR R14,Rdata,Rdata,LSL #1 2250 AND R14,R12,R14 2260 ORR R14,R14,R14,LSR #2 2270 ORR R14,R14,R14,LSR #1 2280 BIC Rcurword,Rcurword,R14,LSL #shiftleft 2290 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft 2300 BIC Rnextword,Rnextword,R14,LSR #shiftright 2310 ORR Rnextword,Rnextword,Rdata,LSR #shiftright 2320 ] 2330 NEXT M% 2340 [OPT pass% 2350 2360 STMIA R9,{R4-R8} 2370 ADD R9,R9,#320 2380 2390 SUBS R11,R11,#1 2400 BGT plotspriteacode(N%,0) 2410 2420 LDMFD R13!,{R0-R12,PC}^ 2430 2440 ] 2450 NEXT N% 2460 [OPT pass% 2470 2480 .plotscreenind1 2490 EQUD plotscreenbase-P% 2500 2510 .psa1 2520 MOV R10,R3 \ R10 = address of sprite data 2530 2540 MOV R11,R2,ASR #1 \ R11 = number of lines 2550 2560 SUB R0,R0,#16 2570 MOV R1,R1,ASR #1 2580 SUB R1,R1,R11,ASR #1 \ get top left corner 2590 2600 CMN R0,#1 2610 CMNGT R1,R11 2620 LDMLEFD R13!,{R0-R12,PC}^ 2630 CMP R0,#640-32 2640 CMPLE R1,#256-1 2650 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites 2660 2670 CMP R1,#0 2680 ADDLT R11,R11,R1 2690 SUBLT R10,R10,R1,LSL #4 2700 MOVLT R1,#0 \ trim top 2710 2720 RSB R4,R1,#256 2730 CMP R11,R4 2740 MOVGT R11,R4 \ trim bottom 2750 2760 ADR R9,plotscreenind1 2770 LDR R12,[R9] 2780 LDR R9,[R9,R12] 2790 ADD R9,R9,R1,LSL #8 2800 ADD R9,R9,R1,LSL #6 2810 BIC R1,R0,#7 2820 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting 2830 2840 MOV R12,#%1000 2850 ORR R12,R12,R12,LSL #16 2860 ORR R12,R12,R12,LSL #8 2870 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit 2880 2890 AND R1,R0,#7 2900 ADR R0,caselist1 2910 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case 2920 ADR R1,base1 2930 ADD PC,R0,R1 2940 2950 .caselist1 2960 ] 2970 FOR N%=0 TO 7 2980 [OPT pass% 2990 EQUD plotspriteacode(N%,1)-base1 3000 ] 3010 NEXT N% 3020 [OPT pass% 3030 .base1 3040 ] 3050 FOR N%=0 TO 7 3060 shiftleft = N%*4 3070 shiftright = 32-N%*4 3080 [OPT pass% \ do 8 compilations 3090 3100 .plotspriteacode(N%,1) \ doubles as loop start 3110 LDMIA R10,{R0-R3} 3120 ADD R10,R10,#32 3130 3140 LDMIA R9,{R4-R8} 3150 3160 ] 3170 FOR M%=0 TO 3 3180 Rdata = M% 3190 Rcurword = M%+4 3200 Rnextword = M%+5 3210 [OPT pass% \ for four words... 3220 3230 ORR R14,Rdata,Rdata,LSL #1 3240 AND R14,R12,R14 3250 ORR R14,R14,R14,LSR #2 3260 ORR R14,R14,R14,LSR #1 3270 BIC Rcurword,Rcurword,R14,LSL #shiftleft 3280 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft 3290 BIC Rnextword,Rnextword,R14,LSR #shiftright 3300 ORR Rnextword,Rnextword,Rdata,LSR #shiftright 3310 ] 3320 NEXT M% 3330 [OPT pass% 3340 3350 STMIA R9,{R4-R8} 3360 ADD R9,R9,#320 3370 3380 SUBS R11,R11,#1 3390 BGT plotspriteacode(N%,1) 3400 3410 LDMFD R13!,{R0-R12,PC}^ 3420 3430 ] 3440 NEXT N% 3450 [OPT pass% 3460 3470 .plotscreenind 3480 EQUD plotscreenbase-P% 3490 3500 .psa2 3510 MOV R10,R3 \ R10 = address of sprite data 3520 3530 MOV R11,R2,ASR #2 \ R11 = number of lines 3540 3550 SUB R0,R0,#16 3560 SUB R0,R0,#160 3570 MOV R1,R1,ASR #2 3580 SUB R1,R1,R11,ASR #1 \ get top left corner 3590 3600 CMN R0,#1 3610 CMNGT R1,R11 3620 LDMLEFD R13!,{R0-R12,PC}^ 3630 CMP R0,#640-32 3640 CMPLE R1,#256-1 3650 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites 3660 3670 CMP R1,#0 3680 ADDLT R11,R11,R1 3690 SUBLT R10,R10,R1,LSL #4 3700 MOVLT R1,#0 \ trim top 3710 3720 RSB R4,R1,#256 3730 CMP R11,R4 3740 MOVGT R11,R4 \ trim bottom 3750 3760 ADR R9,plotscreenind 3770 LDR R12,[R9] 3780 LDR R9,[R9,R12] 3790 ADD R9,R9,R1,LSL #8 3800 ADD R9,R9,R1,LSL #6 3810 BIC R1,R0,#7 3820 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting 3830 3840 MOV R12,#%1000 3850 ORR R12,R12,R12,LSL #16 3860 ORR R12,R12,R12,LSL #8 3870 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit 3880 3890 AND R1,R0,#7 3900 ADR R0,caselist2 3910 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case 3920 ADR R1,base2 3930 ADD PC,R0,R1 3940 3950 .caselist2 3960 ] 3970 FOR N%=0 TO 7 3980 [OPT pass% 3990 EQUD plotspriteacode(N%,2)-base2 4000 ] 4010 NEXT N% 4020 [OPT pass% 4030 .base2 4040 ] 4050 FOR N%=0 TO 7 4060 shiftleft = N%*4 4070 shiftright = 32-N%*4 4080 [OPT pass% \ do 8 compilations 4090 4100 .plotspriteacode(N%,2) \ doubles as loop start 4110 LDMIA R10,{R0-R3} 4120 ADD R10,R10,#64 4130 LDMIA R9,{R4-R8} 4140 4150 ] 4160 FOR M%=0 TO 3 4170 Rdata = M% 4180 Rcurword = M%+4 4190 Rnextword = M%+5 4200 [OPT pass% \ for four words... 4210 4220 ORR R14,Rdata,Rdata,LSL #1 4230 AND R14,R12,R14 4240 ORR R14,R14,R14,LSR #2 4250 ORR R14,R14,R14,LSR #1 4260 BIC Rcurword,Rcurword,R14,LSL #shiftleft 4270 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft 4280 BIC Rnextword,Rnextword,R14,LSR #shiftright 4290 ORR Rnextword,Rnextword,Rdata,LSR #shiftright 4300 ] 4310 NEXT M% 4320 [OPT pass% 4330 4340 STMIA R9,{R4-R8} 4350 ADD R9,R9,#320 4360 4370 SUBS R11,R11,#1 4380 BGT plotspriteacode(N%,2) 4390 4400 LDMFD R13!,{R0-R12,PC}^ 4410 4420 ] 4430 NEXT N% 4440 [OPT pass% 4450 4460 .psa3 4470 MOV R10,R3 \ R10 = address of sprite data 4480 4490 MOV R11,R2,ASR #3 \ R11 = number of lines 4500 4510 SUB R0,R0,#16 4520 SUB R0,R0,#160 4530 MOV R0,R0,ASR #1 4540 MOV R1,R1,ASR #3 4550 SUB R1,R1,R11,ASR #1 \ get top left corner 4560 4570 CMN R0,#1 4580 CMNGT R1,R11 4590 LDMLEFD R13!,{R0-R12,PC}^ 4600 CMP R0,#640-32 4610 CMPLE R1,#256-1 4620 LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites 4630 4640 CMP R1,#0 4650 ADDLT R11,R11,R1 4660 SUBLT R10,R10,R1,LSL #4 4670 MOVLT R1,#0 \ trim top 4680 4690 RSB R4,R1,#256 4700 CMP R11,R4 4710 MOVGT R11,R4 \ trim bottom 4720 4730 LDR R9,plotscreenbase 4740 ADD R9,R9,R1,LSL #8 4750 ADD R9,R9,R1,LSL #6 4760 BIC R1,R0,#7 4770 ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting 4780 4790 MOV R12,#%1000 4800 ORR R12,R12,R12,LSL #16 4810 ORR R12,R12,R12,LSL #8 4820 ORR R12,R12,R12,LSL #4 \ R12 = OR mask to isolate 'no plot' bit 4830 4840 AND R1,R0,#7 4850 ADR R0,caselist3 4860 LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case 4870 ADR R1,base3 4880 ADD PC,R0,R1 4890 4900 .caselist3 4910 ] 4920 FOR N%=0 TO 7 4930 [OPT pass% 4940 EQUD plotspriteacode(N%,3)-base3 4950 ] 4960 NEXT N% 4970 [OPT pass% 4980 .base3 4990 ] 5000 FOR N%=0 TO 7 5010 shiftleft = N%*4 5020 shiftright = 32-N%*4 5030 [OPT pass% \ do 8 compilations 5040 5050 .plotspriteacode(N%,3) \ doubles as loop start 5060 LDMIA R10,{R0-R3} 5070 ADD R10,R10,#128 5080 LDMIA R9,{R4-R8} 5090 5100 ] 5110 FOR M%=0 TO 1 5120 Rdata = M%*2 5130 Rcurword = M%+4 5140 Rnextword = M%+5 5150 [OPT pass% \ for four words... 5160 5170 ORR R14,Rdata,Rdata,LSL #1 5180 AND R14,R12,R14 5190 ORR R14,R14,R14,LSR #2 5200 ORR R14,R14,R14,LSR #1 5210 BIC Rcurword,Rcurword,R14,LSL #shiftleft 5220 ORR Rcurword,Rcurword,Rdata,LSL #shiftleft 5230 BIC Rnextword,Rnextword,R14,LSR #shiftright 5240 ORR Rnextword,Rnextword,Rdata,LSR #shiftright 5250 ] 5260 NEXT M% 5270 [OPT pass% 5280 5290 STMIA R9,{R4-R8} 5300 ADD R9,R9,#320 5310 5320 SUBS R11,R11,#1 5330 BGT plotspriteacode(N%,3) 5340 5350 LDMFD R13!,{R0-R12,PC}^ 5360 5370 ] 5380 NEXT N% 5390 [OPT pass% 5400 5410 .plotscreenbase 5420 EQUD 0 5430 5440 .spritefilebase 5450 EQUD 0 5460 5470 \ Empty routine for timing test purposes 5480 .null 5490 MOV PC,R14 5500 5510 5520 \ Fill screen area with colour bands etc 5530 .clearscreen 5540 STMFD R13!,{R0-R3,R14} 5550 5560 MOV R0,#4 5570 MOV R1,#0 5580 LDR R3,currepq 5590 5600 CMP R3,#0 5610 MOVEQ R2,#256 5620 BLEQ fillsection 5630 CMP R3,#1 5640 MOVEQ R2,#128 5650 BLEQ fillsection 5660 CMP R3,#2 5670 MOVEQ R2,#64 5680 BLEQ fillsectionhalf 5690 CMP R3,#3 5700 MOVEQ R2,#32 5710 BLEQ fillsectionquarter 5720 5730 LDMFD R13!,{R0-R3,PC}^ 5740 5750 .currepq 5760 EQUD 0 5770 5780 \ Fill screen area with lots of sprites 5790 .repeatdata 5800 STMFD R13!,{R0-R12,R14} 5810 5820 MOV R0,#4 5830 MOV R1,#0 5840 LDR R3,currepq 5850 5860 CMP R3,#1 5870 BEQ rep1 5880 CMP R3,#2 5890 BEQ rep2 5900 CMP R3,#3 5910 BEQ rep3 5920 5930 LDMFD R13!,{R0-R12,PC}^ 5940 5950 5960 \ Fill section of screen with given nibble 5970 \ R0 = Word to insert 5980 \ R1 = Line to start at 5990 \ R2 = Number of lines 6000 .fillsection 6010 STMFD R13!,{R0-R12,R14} 6020 STR R13,r13sto \ save R13 6030 6040 MOV R14,R2 6050 6060 LDR R13,plotscreenbase 6070 ADD R13,R13,R1,LSL #8 6080 ADD R13,R13,R1,LSL #6 \ address (in screen) to start at 6090 6100 AND R0,R0,#%1111 6110 ORR R0,R0,R0,LSL #4 6120 ORR R0,R0,R0,LSL #8 6130 ORR R0,R0,R0,LSL #16 \ expand into word 6140 6150 MOV R1,R0 6160 MOV R2,R0 6170 MOV R3,R0 6180 MOV R4,R0 6190 MOV R5,R0 6200 MOV R6,R0 6210 MOV R7,R0 6220 MOV R8,R0 6230 MOV R9,R0 6240 MOV R10,R0 6250 MOV R11,R0 \ set registers for fill 6260 6270 .fsloop 6280 STMIA R13!,{R0-R11} \ 48 bytes 6290 STMIA R13!,{R0-R11} \ 48 bytes 6300 STMIA R13!,{R0-R11} \ 48 bytes 6310 STMIA R13!,{R0-R11} \ 48 bytes 6320 STMIA R13!,{R0-R11} \ 48 bytes 6330 STMIA R13!,{R0-R11} \ 48 bytes 6340 STMIA R13!,{R0-R7} \ 32 bytes 6350 6360 SUBS R14,R14,#1 6370 BGT fsloop 6380 6390 LDR R13,r13sto \ recover R13 6400 LDMFD R13!,{R0-R12,PC}^ 6410 6420 \ Fill half section of screen with given nibble 6430 \ R0 = Word to insert 6440 \ R1 = Line to start at 6450 \ R2 = Number of lines 6460 .fillsectionhalf 6470 STMFD R13!,{R0-R12,R14} 6480 STR R13,r13sto \ save R13 6490 6500 MOV R14,R2 6510 6520 LDR R13,plotscreenbase 6530 ADD R13,R13,R1,LSL #8 6540 ADD R13,R13,R1,LSL #6 \ address (in screen) to start at 6550 6560 AND R0,R0,#%1111 6570 ORR R0,R0,R0,LSL #4 6580 ORR R0,R0,R0,LSL #8 6590 ORR R0,R0,R0,LSL #16 \ expand into word 6600 6610 MOV R1,R0 6620 MOV R2,R0 6630 MOV R3,R0 6640 MOV R4,R0 6650 MOV R5,R0 6660 MOV R6,R0 6670 MOV R7,R0 6680 MOV R8,R0 6690 MOV R9,R0 6700 MOV R10,R0 6710 MOV R11,R0 \ set registers for fill 6720 6730 .fsloop1 6740 STMIA R13!,{R0-R11} \ 48 bytes 6750 STMIA R13!,{R0-R11} \ 48 bytes 6760 STMIA R13!,{R0-R11} \ 48 bytes 6770 STMIA R13!,{R0-R3} \ 16 bytes 6780 6790 ADD R13,R13,#160 6800 SUBS R14,R14,#1 6810 BGT fsloop1 6820 6830 LDR R13,r13sto \ recover R13 6840 LDMFD R13!,{R0-R12,PC}^ 6850 6860 \ Fill quarter section of screen with given nibble 6870 \ R0 = Word to insert 6880 \ R1 = Line to start at 6890 \ R2 = Number of lines 6900 .fillsectionquarter 6910 STMFD R13!,{R0-R12,R14} 6920 STR R13,r13sto \ save R13 6930 6940 MOV R14,R2 6950 6960 LDR R13,plotscreenbase 6970 ADD R13,R13,R1,LSL #8 6980 ADD R13,R13,R1,LSL #6 \ address (in screen) to start at 6990 7000 AND R0,R0,#%1111 7010 ORR R0,R0,R0,LSL #4 7020 ORR R0,R0,R0,LSL #8 7030 ORR R0,R0,R0,LSL #16 \ expand into word 7040 7050 MOV R1,R0 7060 MOV R2,R0 7070 MOV R3,R0 7080 MOV R4,R0 7090 MOV R5,R0 7100 MOV R6,R0 7110 MOV R7,R0 7120 MOV R8,R0 7130 MOV R9,R0 7140 MOV R10,R0 7150 MOV R11,R0 \ set registers for fill 7160 7170 .fsloop2 7180 STMIA R13!,{R0-R11} \ 48 bytes 7190 STMIA R13!,{R0-R7} \ 32 bytes 7200 7210 ADD R13,R13,#240 7220 SUBS R14,R14,#1 7230 BGT fsloop2 7240 7250 LDR R13,r13sto \ recover R13 7260 LDMFD R13!,{R0-R12,PC}^ 7270 7280 .rep1 7290 STR R13,r13sto 7300 7310 LDR R13,plotscreenbase 7320 ADD R12,R13,#128*320 7330 MOV R14,#128 7340 7350 .reploop1 7360 LDMIA R13!,{R0-R11} 7370 STMIA R12!,{R0-R11} 7380 LDMIA R13!,{R0-R11} 7390 STMIA R12!,{R0-R11} 7400 LDMIA R13!,{R0-R11} 7410 STMIA R12!,{R0-R11} 7420 LDMIA R13!,{R0-R11} 7430 STMIA R12!,{R0-R11} 7440 LDMIA R13!,{R0-R11} 7450 STMIA R12!,{R0-R11} 7460 LDMIA R13!,{R0-R11} 7470 STMIA R12!,{R0-R11} 7480 LDMIA R13!,{R0-R7} 7490 STMIA R12!,{R0-R7} 7500 SUBS R14,R14,#1 7510 BGT reploop1 7520 7530 LDR R13,r13sto 7540 LDMFD R13!,{R0-R12,PC}^ 7550 7560 .rep2 7570 STR R13,r13sto 7580 7590 LDR R13,plotscreenbase 7600 MOV R14,#64 7610 7620 .reploop2 7630 LDMIA R13!,{R0-R11} 7640 ADD R12,R13,#160-48 7650 STMIA R12,{R0-R11} 7660 ADD R12,R12,#320*64 7670 STMIA R12,{R0-R11} 7680 ADD R12,R12,#320*64 7690 STMIA R12,{R0-R11} 7700 ADD R12,R12,#320*64 7710 STMIA R12,{R0-R11} 7720 SUB R12,R12,#160 7730 STMIA R12,{R0-R11} 7740 SUB R12,R12,#320*64 7750 STMIA R12,{R0-R11} 7760 SUB R12,R12,#320*64 7770 STMIA R12,{R0-R11} 7780 LDMIA R13!,{R0-R11} 7790 ADD R12,R13,#160-48 7800 STMIA R12,{R0-R11} 7810 ADD R12,R12,#320*64 7820 STMIA R12,{R0-R11} 7830 ADD R12,R12,#320*64 7840 STMIA R12,{R0-R11} 7850 ADD R12,R12,#320*64 7860 STMIA R12,{R0-R11} 7870 SUB R12,R12,#160 7880 STMIA R12,{R0-R11} 7890 SUB R12,R12,#320*64 7900 STMIA R12,{R0-R11} 7910 SUB R12,R12,#320*64 7920 STMIA R12,{R0-R11} 7930 LDMIA R13!,{R0-R11} 7940 ADD R12,R13,#160-48 7950 STMIA R12,{R0-R11} 7960 ADD R12,R12,#320*64 7970 STMIA R12,{R0-R11} 7980 ADD R12,R12,#320*64 7990 STMIA R12,{R0-R11} 8000 ADD R12,R12,#320*64 8010 STMIA R12,{R0-R11} 8020 SUB R12,R12,#160 8030 STMIA R12,{R0-R11} 8040 SUB R12,R12,#320*64 8050 STMIA R12,{R0-R11} 8060 SUB R12,R12,#320*64 8070 STMIA R12,{R0-R11} 8080 LDMIA R13!,{R0-R3} 8090 ADD R12,R13,#160-16 8100 STMIA R12,{R0-R3} 8110 ADD R12,R12,#320*64 8120 STMIA R12,{R0-R3} 8130 ADD R12,R12,#320*64 8140 STMIA R12,{R0-R3} 8150 ADD R12,R12,#320*64 8160 STMIA R12,{R0-R3} 8170 SUB R12,R12,#160 8180 STMIA R12,{R0-R3} 8190 SUB R12,R12,#320*64 8200 STMIA R12,{R0-R3} 8210 SUB R12,R12,#320*64 8220 STMIA R12,{R0-R3} 8230 8240 ADD R13,R13,#160 8250 SUBS R14,R14,#1 8260 BGT reploop2 8270 LDR R13,r13sto 8280 LDMFD R13!,{R0-R12,PC}^ 8290 8300 .rep3 8310 STR R13,r13sto 8320 8330 LDR R13,plotscreenbase 8340 MOV R14,#32 8350 8360 .reploop3 8370 LDMIA R13!,{R0-R11} 8380 ADD R12,R13,#80-48:STMIA R12,{R0-R11} 8390 ADD R12,R12,#80:STMIA R12,{R0-R11} 8400 ADD R12,R12,#80:STMIA R12,{R0-R11} 8410 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8420 SUB R12,R12,#80:STMIA R12,{R0-R11} 8430 SUB R12,R12,#80:STMIA R12,{R0-R11} 8440 SUB R12,R12,#80:STMIA R12,{R0-R11} 8450 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8460 ADD R12,R12,#80:STMIA R12,{R0-R11} 8470 ADD R12,R12,#80:STMIA R12,{R0-R11} 8480 ADD R12,R12,#80:STMIA R12,{R0-R11} 8490 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8500 SUB R12,R12,#80:STMIA R12,{R0-R11} 8510 SUB R12,R12,#80:STMIA R12,{R0-R11} 8520 SUB R12,R12,#80:STMIA R12,{R0-R11} 8530 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8540 ADD R12,R12,#80:STMIA R12,{R0-R11} 8550 ADD R12,R12,#80:STMIA R12,{R0-R11} 8560 ADD R12,R12,#80:STMIA R12,{R0-R11} 8570 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8580 SUB R12,R12,#80:STMIA R12,{R0-R11} 8590 SUB R12,R12,#80:STMIA R12,{R0-R11} 8600 SUB R12,R12,#80:STMIA R12,{R0-R11} 8610 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8620 ADD R12,R12,#80:STMIA R12,{R0-R11} 8630 ADD R12,R12,#80:STMIA R12,{R0-R11} 8640 ADD R12,R12,#80:STMIA R12,{R0-R11} 8650 ADD R12,R12,#320*32:STMIA R12,{R0-R11} 8660 SUB R12,R12,#80:STMIA R12,{R0-R11} 8670 SUB R12,R12,#80:STMIA R12,{R0-R11} 8680 SUB R12,R12,#80:STMIA R12,{R0-R11} 8690 LDMIA R13!,{R0-R7} 8700 ADD R12,R13,#80-32:STMIA R12,{R0-R7} 8710 ADD R12,R12,#80:STMIA R12,{R0-R7} 8720 ADD R12,R12,#80:STMIA R12,{R0-R7} 8730 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8740 SUB R12,R12,#80:STMIA R12,{R0-R7} 8750 SUB R12,R12,#80:STMIA R12,{R0-R7} 8760 SUB R12,R12,#80:STMIA R12,{R0-R7} 8770 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8780 ADD R12,R12,#80:STMIA R12,{R0-R7} 8790 ADD R12,R12,#80:STMIA R12,{R0-R7} 8800 ADD R12,R12,#80:STMIA R12,{R0-R7} 8810 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8820 SUB R12,R12,#80:STMIA R12,{R0-R7} 8830 SUB R12,R12,#80:STMIA R12,{R0-R7} 8840 SUB R12,R12,#80:STMIA R12,{R0-R7} 8850 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8860 ADD R12,R12,#80:STMIA R12,{R0-R7} 8870 ADD R12,R12,#80:STMIA R12,{R0-R7} 8880 ADD R12,R12,#80:STMIA R12,{R0-R7} 8890 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8900 SUB R12,R12,#80:STMIA R12,{R0-R7} 8910 SUB R12,R12,#80:STMIA R12,{R0-R7} 8920 SUB R12,R12,#80:STMIA R12,{R0-R7} 8930 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8940 ADD R12,R12,#80:STMIA R12,{R0-R7} 8950 ADD R12,R12,#80:STMIA R12,{R0-R7} 8960 ADD R12,R12,#80:STMIA R12,{R0-R7} 8970 ADD R12,R12,#320*32:STMIA R12,{R0-R7} 8980 SUB R12,R12,#80:STMIA R12,{R0-R7} 8990 SUB R12,R12,#80:STMIA R12,{R0-R7} 9000 SUB R12,R12,#80:STMIA R12,{R0-R7} 9010 ADD R13,R13,#240 9020 SUBS R14,R14,#1 9030 BGT reploop3 9040 LDR R13,r13sto 9050 LDMFD R13!,{R0-R12,PC}^ 9060 9070 9080 .r13sto 9090 EQUD 0 9100 9110 \ Routine to plot any sphere in normal range 9120 \ R0 points to pos vector, size (0-13) 9130 .gensphere 9140 STMFD R13!,{R0-R12,R14} 9150 9160 LDMIA R0,{R0-R3} 9170 9180 CMP R3,#1 9190 LDMLEFD R13!,{R0-R12,PC}^ 9200 9210 MOV R0,R0,ASR #7 9220 ADD R0,R0,#xorigin \ Translate X 9230 9240 ADD R1,R1,R1,ASR #3 9250 MOV R1,R1,ASR #8 9260 RSB R1,R1,#yorigin \ Translate Y 9270 9280 MOV R2,#18 \ height 18 9290 9300 LDR R5,spritefilebase 9310 MOV R4,#288 9320 SUB R3,R3,#2 9330 MLA R3,R4,R3,R5 \ point to appropriate sphere 9340 9350 BL plotspritea \ plot 9360 9370 LDMFD R13!,{R0-R12,PC}^ 9380 9390 \ Routine to plot head 9400 \ R0 points to pos vector, expression 9410 .head 9420 STMFD R13!,{R0-R12,R14} 9430 9440 LDMIA R0,{R0-R3} 9450 9460 MOV R0,R0,ASR #7 9470 ADD R0,R0,#xorigin-16 \ Translate X 9480 9490 ADD R1,R1,R1,ASR #3 9500 MOV R1,R1,ASR #8 9510 RSB R1,R1,#yorigin \ Translate Y 9520 9530 MOV R2,#36 \ height 36 9540 9550 LDR R5,spritefilebase 9560 MOV R4,#288 9570 ADD R3,R3,R3,LSL #3 9580 ADD R3,R3,#268 9590 MLA R3,R4,R3,R5 \ point to appropriate sprite 9600 9610 BL plotspritea \ plot left 9620 9630 ADD R3,R3,#288*2 9640 ADD R0,R0,#32 9650 BL plotspritea \ plot right 9660 9670 LDMFD R13!,{R0-R12,PC}^ 9680 9690 \ Bungie line routine draws line with a sphere size 10 at far end 9700 \ R0 points to vector A, vector B, length as in table 9710 .bungieline 9720 STMFD R13!,{R0-R12,R14} 9730 9740 MOV R12,R0 9750 LDMIA R0,{R0-R6} 9760 9770 MLA R0,R3,R6,R0 9780 MLA R1,R4,R6,R1 9790 MLA R2,R5,R6,R2 \ Go to far end 9800 9810 MOV R0,R0,ASR #7 9820 ADD R0,R0,#xorigin \ Translate X 9830 9840 ADD R1,R1,R1,ASR #3 9850 MOV R1,R1,ASR #8 9860 RSB R1,R1,#yorigin \ Translate Y 9870 9880 MOV R2,#18 \ height 18 9890 9900 LDR R5,spritefilebase 9910 MOV R4,#288 9920 MOV R3,#10-2 9930 MLA R3,R4,R3,R5 \ point to appropriate sphere 9940 9950 BL plotspritea \ plot 9960 9970 MOV R0,R12 9980 B linesideentry 9990 10000 \ Routine to put line stating at A, dir B in 3d 10010 \ R0 points to vector A, vector B, length as in table 10020 .line 10030 STMFD R13!,{R0-R12,R14} 10040 10050 .linesideentry 10060 10070 LDMIA R0,{R4-R10} 10080 10090 CMP R10,#0 10100 LDMEQFD R13!,{R0-R12,PC}^ 10110 RSBLT R7,R7,#0 10120 RSBLT R8,R8,#0 10130 RSBLT R9,R9,#0 10140 RSBLT R10,R10,#0 10150 10160 CMP R9,#0 10170 BLE lineforwards 10180 MLA R4,R7,R10,R4 10190 MLA R5,R8,R10,R5 10200 RSB R7,R7,#0 10210 RSB R8,R8,#0 \ ensure line goes toward viewer 10220 .lineforwards 10230 10240 ADD R4,R4,R7,ASR #1 10250 ADD R5,R5,R8,ASR #1 \ add half a unit to pos 10260 10270 LDR R1,mulconst 10280 10290 RSB R11,R7,#2560+160 10300 MUL R11,R1,R11 10310 MOV R11,R11,ASR #25 \ column 10320 10330 ADD R12,R8,#2560+160 10340 MUL R12,R1,R12 10350 MOV R12,R12,ASR #25 \ row 10360 10370 ORR R0,R11,R12 10380 TST R0,#16 10390 RSBNE R11,R11,#16 10400 RSBNE R12,R12,#16 \ if either go above 15 wrap round by inverting BOTH 10410 10420 LDR R14,linetype 10430 CMP R14,#0 10440 ADDEQ R3,R11,#12 10450 ADDEQ R3,R3,R12,LSL #4 10460 MOVNE R3,#8 10470 LDR R0,spritefilebase 10480 MOV R1,#288 10490 MLA R3,R1,R3,R0 \ point to appropriate line section 10500 MOV R2,#18 \ height 18 10510 10520 .lloop 10530 MOV R0,R4,ASR #7 10540 ADD R0,R0,#xorigin \ Translate X 10550 10560 ADD R1,R5,R5,ASR #3 10570 MOV R1,R1,ASR #8 10580 RSB R1,R1,#yorigin \ Translate Y 10590 10600 BL plotspritea \ plot 10610 10620 ADD R4,R4,R7 10630 ADD R5,R5,R8 \ add unit to pos 10640 10650 SUBS R10,R10,#1 10660 BGT lloop 10670 10680 LDMFD R13!,{R0-R12,PC}^ 10690 10700 .mulconst 10710 EQUD 104858 10720 10730 .plottabqind 10740 EQUD plottabq 10750 10760 \ Routine to draw funky dancer 10770 .drawperson 10780 STMFD R13!,{R0-R12,R14} 10790 10800 MOV R0,#0 10810 LDR R1,plottabqind 10820 STR R0,[R1] 10830 10840 ADR R0,torsopos 10850 ADR R1,torsotrans 10860 ADR R2,realpos 10870 BL transform 10880 10890 ADR R0,vectemp 10900 ADR R1,torsotrans 10910 ADR R2,minusunitvec 10920 BL transform 10930 ADR R0,temppos 10940 ADR R1,vectemp 10950 MOV R2,#752 10960 ADR R3,torsopos 10970 BL vectormla 10980 ADR R1,vectemp 10990 ADR R0,temppos 11000 MOV R2,#1 11010 BL logline 11020 ADR R0,temppos 11030 ADR R1,vectemp 11040 MOV R2,#1*1024 11050 ADD R2,R2,#752+1504 11060 ADR R3,torsopos 11070 BL vectormla \ neck 11080 11090 ADR R0,temppos 11100 MOV R1,#0 11110 BL loghead 11120 11130 ADR R0,vectemp 11140 ADR R1,torsotrans 11150 ADR R2,sidewaysvec 11160 BL transform 11170 ADR R0,temppos 11180 ADR R1,vectemp 11190 MVN R2,#1328 11200 ADR R3,torsopos 11210 BL vectormla 11220 ADR R0,mattemp1 11230 ADR R1,lshouldertrans 11240 ADR R2,torsotrans 11250 BL multiply \ left shoulder 11260 11270 ADR R0,vectemp 11280 ADR R1,mattemp1 11290 ADR R2,unitvec 11300 BL transform 11310 ADR R0,temppos 11320 ADR R1,vectemp 11330 MOV R2,#5*1024 11340 ADR R3,temppos \ left upper arm 11350 BL vectormla 11360 ADR R0,temppos 11370 ADR R1,vectemp 11380 MVN R2,#NOT (-5) 11390 BL logbungieline 11400 11410 ADR R0,mattemp2 11420 ADR R1,lelbowtrans 11430 ADR R2,mattemp1 11440 BL multiply \ left elbow 11450 11460 ADR R0,vectemp 11470 ADR R1,mattemp2 11480 ADR R2,unitvec 11490 BL transform 11500 ADR R0,temppos 11510 ADR R1,vectemp 11520 MOV R2,#5 11530 BL logbungieline \ left lower arm 11540 11550 ADR R0,vectemp 11560 ADR R1,torsotrans 11570 ADR R2,sidewaysvec 11580 BL transform 11590 ADR R0,temppos 11600 ADR R1,vectemp 11610 MOV R2,#1328 11620 ADR R3,torsopos 11630 BL vectormla 11640 ADR R0,mattemp1 11650 ADR R1,rshouldertrans 11660 ADR R2,torsotrans 11670 BL multiply \ right shoulder 11680 11690 ADR R0,vectemp 11700 ADR R1,mattemp1 11710 ADR R2,unitvec 11720 BL transform 11730 ADR R0,temppos 11740 ADR R1,vectemp 11750 MOV R2,#5*1024 11760 ADR R3,temppos \ right upper arm 11770 BL vectormla 11780 ADR R0,temppos 11790 ADR R1,vectemp 11800 MVN R2,#NOT (-5) 11810 BL logbungieline 11820 11830 ADR R0,mattemp2 11840 ADR R1,relbowtrans 11850 ADR R2,mattemp1 11860 BL multiply \ right elbow 11870 11880 ADR R0,vectemp 11890 ADR R1,mattemp2 11900 ADR R2,unitvec 11910 BL transform 11920 ADR R0,temppos 11930 ADR R1,vectemp 11940 MOV R2,#5 11950 BL logbungieline \ right lower arm 11960 11970 ADR R0,vectemp 11980 ADR R1,torsotrans 11990 ADR R2,unitvec 12000 BL transform 12010 ADR R0,temppos 12020 ADR R1,vectemp 12030 MOV R2,#752 12040 ADR R3,torsopos 12050 BL vectormla 12060 ADR R1,vectemp 12070 ADR R0,temppos 12080 MOV R2,#4 12090 BL logline 12100 ADR R0,bumpos 12110 ADR R1,vectemp 12120 MOV R2,#4*1024 12130 ADD R2,R2,#2*752 12140 ADR R3,torsopos 12150 BL vectormla \ torso 12160 12170 ADR R0,vectemp 12180 ADR R1,torsotrans 12190 ADR R2,sidewaysvec 12200 BL transform 12210 ADR R0,temppos 12220 ADR R1,vectemp 12230 MVN R2,#1328 12240 ADR R3,bumpos 12250 BL vectormla 12260 ADR R0,mattemp1 12270 ADR R1,lhiptrans 12280 ADR R2,torsotrans 12290 BL multiply \ left hip 12300 12310 ADR R0,vectemp 12320 ADR R1,mattemp1 12330 ADR R2,unitvec 12340 BL transform 12350 ADR R0,temppos 12360 ADR R1,vectemp 12370 MOV R2,#5*1024 12380 ADR R3,temppos 12390 BL vectormla \ left thigh 12400 ADR R1,vectemp 12410 ADR R0,temppos 12420 MVN R2,#NOT (-5) 12430 BL logbungieline 12440 12450 ADR R0,mattemp2 12460 ADR R1,lkneetrans 12470 ADR R2,mattemp1 12480 BL multiply \ left knee 12490 12500 ADR R0,vectemp 12510 ADR R1,mattemp2 12520 ADR R2,unitvec 12530 BL transform 12540 ADR R1,vectemp 12550 ADR R0,temppos 12560 MOV R2,#5 12570 BL logbungieline \ left calf 12580 12590 ADR R0,vectemp 12600 ADR R1,torsotrans 12610 ADR R2,sidewaysvec 12620 BL transform 12630 ADR R0,temppos 12640 ADR R1,vectemp 12650 MOV R2,#1328 12660 ADR R3,bumpos 12670 BL vectormla 12680 ADR R0,mattemp1 12690 ADR R1,rhiptrans 12700 ADR R2,torsotrans 12710 BL multiply \ right hip 12720 12730 ADR R0,vectemp 12740 ADR R1,mattemp1 12750 ADR R2,unitvec 12760 BL transform 12770 ADR R0,temppos 12780 ADR R1,vectemp 12790 MOV R2,#5*1024 12800 ADR R3,temppos 12810 BL vectormla \ right thigh 12820 ADR R1,vectemp 12830 ADR R0,temppos 12840 MVN R2,#NOT (-5) 12850 BL logbungieline 12860 12870 ADR R0,mattemp2 12880 ADR R1,rkneetrans 12890 ADR R2,mattemp1 12900 BL multiply \ right knee 12910 12920 ADR R0,vectemp 12930 ADR R1,mattemp2 12940 ADR R2,unitvec 12950 BL transform 12960 ADR R1,vectemp 12970 ADR R0,temppos 12980 MOV R2,#5 12990 BL logbungieline \ right calf 13000 13010 ADR R0,torsopos 13020 MOV R1,#13 13030 BL logsphere 13040 13050 ADR R0,bumpos 13060 MOV R1,#13 13070 BL logsphere 13080 13090 BL spinningspheres 13100 BL display 13110 BL repeatdata 13120 13130 LDMFD R13!,{R0-R12,PC}^ 13140 13150 .vectemp 13160 EQUD 0 :EQUD 0 :EQUD 0 13170 13180 .temppos 13190 EQUD 0 :EQUD 0 :EQUD 0 13200 13210 .mattemp1 13220 EQUD 0 :EQUD 0 :EQUD 0 13230 EQUD 0 :EQUD 0 :EQUD 0 13240 EQUD 0 :EQUD 0 :EQUD 0 13250 13260 .mattemp2 13270 EQUD 0 :EQUD 0 :EQUD 0 13280 EQUD 0 :EQUD 0 :EQUD 0 13290 EQUD 0 :EQUD 0 :EQUD 0 13300 13310 .unitvec \ transform this vector to get direction of line 13320 EQUD 0 :EQUD 2560 :EQUD 0 13330 13340 .minusunitvec \ transform this vector to get opposite to direction of line 13350 EQUD 0 :EQUD -2560 :EQUD 0 13360 13370 .sidewaysvec \ transform this vector to get a sideways directon 13380 EQUD 2560 :EQUD 0 :EQUD 0 13390 13400 .torsopos 13410 EQUD 0 :EQUD 0 :EQUD 0 13420 13430 .bumpos 13440 EQUD 0 :EQUD 0 :EQUD 0 13450 13460 .changeabledata 13470 .realpos 13480 EQUD 0 :EQUD 0 :EQUD 0 \set 13490 13500 .torsotrans 13510 EQUD 0 :EQUD -32768:EQUD 0 \set 13520 EQUD -32768:EQUD 0 :EQUD 0 13530 EQUD 0 :EQUD 0 :EQUD 32768 13540 13550 .lshouldertrans 13560 EQUD 28596 :EQUD 16000 :EQUD 0 \set 13570 EQUD -16000:EQUD 28596 :EQUD 0 13580 EQUD 0 :EQUD 0 :EQUD 32768 13590 13600 .lelbowtrans 13610 EQUD 31776 :EQUD -8000 :EQUD 0 \set 13620 EQUD 8000 :EQUD 31776 :EQUD 0 13630 EQUD 0 :EQUD 0 :EQUD 32768 13640 13650 .rshouldertrans 13660 EQUD 28596 :EQUD -16000:EQUD 0 \set 13670 EQUD 16000 :EQUD 28596 :EQUD 0 13680 EQUD 0 :EQUD 0 :EQUD 32768 13690 13700 .relbowtrans 13710 EQUD 31776 :EQUD 8000 :EQUD 0 \set 13720 EQUD -8000 :EQUD 31776 :EQUD 0 13730 EQUD 0 :EQUD 0 :EQUD 32768 13740 13750 .lhiptrans 13760 EQUD 31776 :EQUD 8000 :EQUD 0 \set 13770 EQUD -8000 :EQUD 31776 :EQUD 0 13780 EQUD 0 :EQUD 0 :EQUD 32768 13790 13800 .lkneetrans 13810 EQUD 32768 :EQUD 0 :EQUD 0 \set 13820 EQUD 0 :EQUD 32768 :EQUD 0 13830 EQUD 0 :EQUD 0 :EQUD 32768 13840 13850 .rhiptrans 13860 EQUD 31776 :EQUD -8000 :EQUD 0 \set 13870 EQUD 8000 :EQUD 31776 :EQUD 0 13880 EQUD 0 :EQUD 0 :EQUD 32768 13890 13900 .rkneetrans 13910 EQUD 32768 :EQUD 0 :EQUD 0 \set 13920 EQUD 0 :EQUD 32768 :EQUD 0 13930 EQUD 0 :EQUD 0 :EQUD 32768 13940 13950 .identity 13960 EQUD 32768 :EQUD 0 :EQUD 0 13970 EQUD 0 :EQUD 32768 :EQUD 0 13980 EQUD 0 :EQUD 0 :EQUD 32768 13990 14000 .spin1 14010 EQUD cos% :EQUD 0 :EQUD -sin% 14020 EQUD 0 :EQUD 32768 :EQUD 0 14030 EQUD sin% :EQUD 0 :EQUD cos% 14040 14050 .spin2 14060 EQUD cos% :EQUD -sin% :EQUD 0 14070 EQUD sin% :EQUD cos% :EQUD 0 14080 EQUD 0 :EQUD 0 :EQUD 32768 14090 14100 .spin3 14110 EQUD 32768 :EQUD 0 :EQUD 0 14120 EQUD 0 :EQUD cos% :EQUD -sin% 14130 EQUD 0 :EQUD sin% :EQUD cos% 14140 14150 .spin1b 14160 EQUD cos% :EQUD 0 :EQUD sin% 14170 EQUD 0 :EQUD 32768 :EQUD 0 14180 EQUD -sin% :EQUD 0 :EQUD cos% 14190 14200 .spin2b 14210 EQUD cos% :EQUD sin% :EQUD 0 14220 EQUD -sin% :EQUD cos% :EQUD 0 14230 EQUD 0 :EQUD 0 :EQUD 32768 14240 14250 .spin3b 14260 EQUD 32768 :EQUD 0 :EQUD 0 14270 EQUD 0 :EQUD cos% :EQUD sin% 14280 EQUD 0 :EQUD -sin% :EQUD cos% 14290 14300 .angletab0 \ normal prone position 14310 EQUB 0 \ sideways 14320 EQUB 0 \ height realpos 14330 EQUB 10 \ tilt 14340 EQUB 0 \ rot torsotrans 14350 EQUB 20 \ tilt 14360 EQUB 248 \ rot lshouldertrans 14370 EQUB 34 \ tilt 14380 EQUB 73 \ rot lelbowtrans 14390 EQUB 20 \ tilt 14400 EQUB 120 \ rot rshouldertrans 14410 EQUB 222 \ tilt 14420 EQUB 73 \ rot relbowtrans 14430 EQUB 24 \ tilt 14440 EQUB 36 \ rot lhiptrans 14450 EQUB 24 \ tilt 14460 EQUB 128 \ rot lkneetrans 14470 EQUB 24 \ tilt 14480 EQUB 92 \ rot rhiptrans 14490 EQUB 24 \ tilt 14500 EQUB 128 \ rot rkneetrans 14510 14520 .angletab1 \ 'getting down' 14530 EQUB 0 \ sideways 14540 EQUB 84 \ height realpos 14550 EQUB 10 \ tilt 14560 EQUB 0 \ rot torsotrans 14570 EQUB 38 \ tilt 14580 EQUB 248 \ rot lshouldertrans 14590 EQUB 84 \ tilt 14600 EQUB 73 \ rot lelbowtrans 14610 EQUB 38 \ tilt 14620 EQUB 120 \ rot rshouldertrans 14630 EQUB 172 \ tilt 14640 EQUB 73 \ rot relbowtrans 14650 EQUB 52 \ tilt 14660 EQUB 36 \ rot lhiptrans 14670 EQUB 80 \ tilt 14680 EQUB 128 \ rot lkneetrans 14690 EQUB 52 \ tilt 14700 EQUB 92 \ rot rhiptrans 14710 EQUB 80 \ tilt 14720 EQUB 128 \ rot rkneetrans 14730 14740 .angletab2 \ yeh 14750 EQUB 0 \ sideways 14760 EQUB 84 \ height realpos 14770 EQUB 10 \ tilt 14780 EQUB 0 \ rot torsotrans 14790 EQUB 38 \ tilt 14800 EQUB 248 \ rot lshouldertrans 14810 EQUB 84 \ tilt 14820 EQUB 73 \ rot lelbowtrans 14830 EQUB 120 \ tilt 14840 EQUB 120 \ rot rshouldertrans 14850 EQUB 224 \ tilt 14860 EQUB 180 \ rot relbowtrans 14870 EQUB 52 \ tilt 14880 EQUB 36 \ rot lhiptrans 14890 EQUB 80 \ tilt 14900 EQUB 128 \ rot lkneetrans 14910 EQUB 52 \ tilt 14920 EQUB 92 \ rot rhiptrans 14930 EQUB 80 \ tilt 14940 EQUB 128 \ rot rkneetrans 14950 14960 .angletab3 \ foot raised 14970 EQUB 0 \ sideways 14980 EQUB 0 \ height realpos 14990 EQUB 10 \ tilt 15000 EQUB 0 \ rot torsotrans 15010 EQUB 20 \ tilt 15020 EQUB 248 \ rot lshouldertrans 15030 EQUB 34 \ tilt 15040 EQUB 73 \ rot lelbowtrans 15050 EQUB 20 \ tilt 15060 EQUB 120 \ rot rshouldertrans 15070 EQUB 222 \ tilt 15080 EQUB 73 \ rot relbowtrans 15090 EQUB 30 \ tilt 15100 EQUB 36 \ rot lhiptrans 15110 EQUB 36 \ tilt 15120 EQUB 128 \ rot lkneetrans 15130 EQUB 24 \ tilt 15140 EQUB 92 \ rot rhiptrans 15150 EQUB 24 \ tilt 15160 EQUB 128 \ rot rkneetrans 15170 15180 .angletab4 \ foot raised 15190 EQUB 0 \ sideways 15200 EQUB 0 \ height realpos 15210 EQUB 10 \ tilt 15220 EQUB 0 \ rot torsotrans 15230 EQUB 38 \ tilt 15240 EQUB 248 \ rot lshouldertrans 15250 EQUB 84 \ tilt 15260 EQUB 73 \ rot lelbowtrans 15270 EQUB 38 \ tilt 15280 EQUB 120 \ rot rshouldertrans 15290 EQUB 172 \ tilt 15300 EQUB 73 \ rot relbowtrans 15310 EQUB 30 \ tilt 15320 EQUB 36 \ rot lhiptrans 15330 EQUB 36 \ tilt 15340 EQUB 128 \ rot lkneetrans 15350 EQUB 24 \ tilt 15360 EQUB 92 \ rot rhiptrans 15370 EQUB 24 \ tilt 15380 EQUB 128 \ rot rkneetrans 15390 15400 .angletab5 \ hands in front 15410 EQUB 0 \ sideways 15420 EQUB 0 \ height realpos 15430 EQUB 10 \ tilt 15440 EQUB 0 \ rot torsotrans 15450 EQUB 50 \ tilt 15460 EQUB 48 \ rot lshouldertrans 15470 EQUB 78 \ tilt 15480 EQUB 0 \ rot lelbowtrans 15490 EQUB 50 \ tilt 15500 EQUB 80 \ rot rshouldertrans 15510 EQUB 178 \ tilt 15520 EQUB 128 \ rot relbowtrans 15530 EQUB 24 \ tilt 15540 EQUB 36 \ rot lhiptrans 15550 EQUB 24 \ tilt 15560 EQUB 128 \ rot lkneetrans 15570 EQUB 24 \ tilt 15580 EQUB 92 \ rot rhiptrans 15590 EQUB 24 \ tilt 15600 EQUB 128 \ rot rkneetrans 15610 15620 .angletab6 \ hands behind 15630 EQUB 0 \ sideways 15640 EQUB 84 \ height realpos 15650 EQUB 10 \ tilt 15660 EQUB 0 \ rot torsotrans 15670 EQUB 96 \ tilt 15680 EQUB 48 \ rot lshouldertrans 15690 EQUB 78 \ tilt 15700 EQUB 0 \ rot lelbowtrans 15710 EQUB 96 \ tilt 15720 EQUB 80 \ rot rshouldertrans 15730 EQUB 178 \ tilt 15740 EQUB 128 \ rot relbowtrans 15750 EQUB 52 \ tilt 15760 EQUB 36 \ rot lhiptrans 15770 EQUB 80 \ tilt 15780 EQUB 128 \ rot lkneetrans 15790 EQUB 52 \ tilt 15800 EQUB 92 \ rot rhiptrans 15810 EQUB 80 \ tilt 15820 EQUB 128 \ rot rkneetrans 15830 15840 .angletab7 \ hands crossed 1 15850 EQUB 0 \ sideways 15860 EQUB 84 \ height realpos 15870 EQUB 10 \ tilt 15880 EQUB 0 \ rot torsotrans 15890 EQUB 50 \ tilt 15900 EQUB 56 \ rot lshouldertrans 15910 EQUB 62 \ tilt 15920 EQUB 32 \ rot lelbowtrans 15930 EQUB 50 \ tilt 15940 EQUB 72 \ rot rshouldertrans 15950 EQUB 162 \ tilt 15960 EQUB 96 \ rot relbowtrans 15970 EQUB 52 \ tilt 15980 EQUB 36 \ rot lhiptrans 15990 EQUB 80 \ tilt 16000 EQUB 128 \ rot lkneetrans 16010 EQUB 52 \ tilt 16020 EQUB 92 \ rot rhiptrans 16030 EQUB 80 \ tilt 16040 EQUB 128 \ rot rkneetrans 16050 16060 .angletab8 \ hands crossed 1 16070 EQUB 0 \ sideways 16080 EQUB 84 \ height realpos 16090 EQUB 10 \ tilt 16100 EQUB 0 \ rot torsotrans 16110 EQUB 50 \ tilt 16120 EQUB 56 \ rot lshouldertrans 16130 EQUB 94 \ tilt 16140 EQUB 32 \ rot lelbowtrans 16150 EQUB 50 \ tilt 16160 EQUB 72 \ rot rshouldertrans 16170 EQUB 194 \ tilt 16180 EQUB 96 \ rot relbowtrans 16190 EQUB 52 \ tilt 16200 EQUB 36 \ rot lhiptrans 16210 EQUB 80 \ tilt 16220 EQUB 128 \ rot lkneetrans 16230 EQUB 52 \ tilt 16240 EQUB 92 \ rot rhiptrans 16250 EQUB 80 \ tilt 16260 EQUB 128 \ rot rkneetrans 16270 16280 .angletab9 \ the splits 16290 EQUB 0 \ sideways 16300 EQUB 150 \ height realpos 16310 EQUB 10 \ tilt 16320 EQUB 0 \ rot torsotrans 16330 EQUB 116 \ tilt 16340 EQUB 248 \ rot lshouldertrans 16350 EQUB 5 \ tilt 16360 EQUB 73 \ rot lelbowtrans 16370 EQUB 116 \ tilt 16380 EQUB 120 \ rot rshouldertrans 16390 EQUB 251 \ tilt 16400 EQUB 73 \ rot relbowtrans 16410 EQUB 80 \ tilt 16420 EQUB 0 \ rot lhiptrans 16430 EQUB 10 \ tilt 16440 EQUB 128 \ rot lkneetrans 16450 EQUB 80 \ tilt 16460 EQUB 128 \ rot rhiptrans 16470 EQUB 10 \ tilt 16480 EQUB 128 \ rot rkneetrans 16490 16500 .angletabcur 16510 EQUD 0 16520 EQUD 0 16530 EQUD 0 16540 EQUD 0 16550 EQUD 0 16560 16570 .mconst 16580 EQUD 65536/6+0.5 16590 16600 .sincostabind 16610 EQUD sincostab 16620 16630 .changeabledataind 16640 EQUD changeabledata 16650 16660 .plotscreeninda 16670 EQUD plotscreenbase 16680 16690 \ Update movements 16700 .update 16710 STMFD R13!,{R0-R12,R14} 16720 16730 LDR R2,mstore 16740 LDR R1,nstore 16750 LDR R0,kstore \ get position in track 16760 16770 ADR R4,angletab0 16780 16790 CMP R0,#7 16800 CMPNE R0,#8 16810 CMPNE R0,#16 16820 CMPNE R0,#17 16830 BNE noyeh 16840 TST R1,#2 16850 ADRNE R4,angletab1 16860 16870 MOV R6,R1,LSR #1 16880 AND R6,R6,#7 16890 MOV R7,R1,LSR #4 16900 AND R7,R7,#3 16910 CMP R6,#5 16920 ADREQ R4,angletab2 16930 CMP R7,#3 16940 BNE noyeh1 16950 CMP R6,#3 16960 ADREQ R4,angletab2 16970 .noyeh1 16980 CMP R0,#7 16990 CMPNE R0,#16 17000 BEQ noyeh 17010 CMP R6,#1 17020 ADREQ R4,angletab9 17030 .noyeh 17040 17050 CMP R0,#10 17060 CMPNE R0,#11 17070 CMPNE R0,#12 17080 CMPNE R0,#13 17090 BNE nocross 17100 TST R1,#4 17110 ADRNE R4,angletab7 17120 ADREQ R4,angletab8 17130 TST R1,#2 17140 ADREQ R4,angletab5 17150 .nocross 17160 17170 CMP R0,#5 17180 CMPNE R0,#6 17190 CMPNE R0,#14 17200 CMPNE R0,#15 17210 CMPNE R0,#18 17220 CMPNE R0,#19 17230 BNE noother 17240 TST R1,#2 17250 ADRNE R4,angletab6 17260 ADREQ R4,angletab5 17270 .noother 17280 17290 CMP R0,#2 17300 BNE nofooty 17310 TST R1,#2 17320 ADREQ R4,angletab3 17330 .nofooty 17340 17350 CMP R0,#3 17360 BNE nofooty1 17370 TST R1,#2 17380 ADREQ R4,angletab4 17390 .nofooty1 17400 17410 LDR R5,lasttablepos 17420 AND R6,R1,#1 17430 CMP R6,#1 17440 CMPEQ R2,#2 17450 STREQ R4,lasttablepos 17460 AND R1,R1,#1 17470 ADD R2,R2,R1,LSL #0 17480 ADD R2,R2,R1,LSL #1 \ 0..5 17490 LDR R6,mconst 17500 MUL R2,R6,R2 \ 0..65535 17510 RSB R3,R2,#65536 \ R3+R2=65536 17520 17530 ADR R14,angletabcur 17540 MOV R6,#20 17550 .udintloop 17560 LDRB R0,[R4],#1 17570 LDRB R1,[R5],#1 17580 MUL R0,R2,R0 17590 MLA R0,R3,R1,R0 17600 MOV R0,R0,ASR #16 17610 STRB R0,[R14],#1 17620 SUBS R6,R6,#1 17630 BGT udintloop 17640 17650 ADR R14,angletabcur 17660 LDR R2,mstore 17670 LDR R1,nstore 17680 LDR R0,kstore \ get position in track (again) 17690 17700 CMP R0,#10 17710 BLT noturn 17720 CMP R0,#14 17730 BGE noturn 17740 ADD R4,R2,R1,LSL #0 17750 ADD R4,R4,R1,LSL #1 17760 LDR R3,mconst 17770 MUL R4,R3,R4 17780 MOV R4,R4,ASR #21-8 17790 STRB R4,[R14,#3] 17800 MOV R4,#40 17810 STRB R4,[R14,#2] 17820 CMP R0,#10 17830 BNE noturn 17840 CMP R1,#20 17850 BGE noturn 17860 ADD R4,R2,R1,LSL #0 17870 ADD R4,R4,R1,LSL #1 17880 MOV R4,R4,ASR #1 17890 ADD R4,R4,#10 17900 STRB R4,[R14,#2] 17910 .noturn \ turning in musical bit 17920 17930 LDR R12,changeabledataind 17940 LDR R10,sincostabind 17950 ADD R11,R10,#1024 17960 MOV R9,#0 17970 17980 LDRB R0,[R14],#1 17990 LDRB R1,[R14],#1 18000 MOV R0,R0,LSL #7 18010 MOV R1,R1,LSL #7 18020 STR R0,[R12],#4 18030 STR R1,[R12],#8 \ convert realpos 18040 18050 LDRB R4,[R14],#1 \ get tilt 18060 LDR R0,[R10,R4,LSL #2] \ tilt sin s 18070 LDR R1,[R11,R4,LSL #2] \ tilt cos c 18080 LDRB R4,[R14],#1 \ get rot 18090 LDR R2,[R10,R4,LSL #2] \ rot sin S 18100 LDR R3,[R11,R4,LSL #2] \ rot cos C 18110 18120 STR R3,[R12],#4 \ C 18130 STR R9,[R12],#4 \ 0 18140 SUB R4,R9,R2 18150 STR R4,[R12],#4 \ -S 18160 MUL R4,R0,R2 18170 ADD R4,R9,R4,ASR #15 18180 STR R4,[R12],#4 \ Ss 18190 SUB R4,R9,R1 18200 STR R4,[R12],#4 \ -c 18210 MUL R4,R0,R3 18220 ADD R4,R9,R4,ASR #15 18230 STR R4,[R12],#4 \ Cs 18240 MUL R4,R1,R2 18250 ADD R4,R9,R4,ASR #15 18260 STR R4,[R12],#4 \ Sc 18270 STR R0,[R12],#4 \ s 18280 MUL R4,R1,R3 18290 ADD R4,R9,R4,ASR #15 18300 STR R4,[R12],#4 \ Cc 18310 18320 MOV R8,#8 18330 .udconvertloop 18340 18350 LDRB R4,[R14],#1 \ get tilt 18360 LDR R0,[R10,R4,LSL #2] \ tilt sin s 18370 LDR R1,[R11,R4,LSL #2] \ tilt cos c 18380 LDRB R4,[R14],#1 \ get rot 18390 LDR R2,[R10,R4,LSL #2] \ rot sin S 18400 LDR R3,[R11,R4,LSL #2] \ rot cos C 18410 18420 MUL R4,R1,R3 18430 ADD R4,R9,R4,ASR #15 18440 STR R4,[R12],#4 \ Cc 18450 MUL R4,R0,R3 18460 SUB R4,R9,R4,ASR #15 18470 STR R4,[R12],#4 \ -Cs 18480 SUB R4,R9,R2 18490 STR R4,[R12],#4 \ -S 18500 STR R0,[R12],#4 \ s 18510 STR R1,[R12],#4 \ c 18520 STR R9,[R12],#4 \ 0 18530 MUL R4,R1,R2 18540 ADD R4,R9,R4,ASR #15 18550 STR R4,[R12],#4 \ Sc 18560 MUL R4,R0,R2 18570 SUB R4,R9,R4,ASR #15 18580 STR R4,[R12],#4 \ -Ss 18590 STR R3,[R12],#4 \ C 18600 18610 SUBS R8,R8,#1 18620 BGT udconvertloop 18630 18640 LDR R0,counter 18650 18660 CMP R0,#50 18670 RSBLE R1,R0,#50 18680 MOVLE R1,R1,LSL #10 18690 STRLE R1,realpos+4 \ make him float up at start 18700 18710 ADD R0,R0,#1 18720 STR R0,counter 18730 18740 LDR R0,startabind 18750 LDR R1,plotscreeninda 18760 LDR R1,[R1] 18770 MOV R2,#&00 \ two pixels 18780 MOV R3,#127 18790 18800 LDR R5,curseq 18810 CMP R5,#0 18820 BEQ noseq 18830 LDR R6,staroffset 18840 LDR R5,[R5,R6,LSL #2] 18850 ADD R6,R6,#1 18860 CMP R6,#24 18870 SUBGE R6,R6,#24 18880 STR R6,staroffset \ read offset from table 18890 STR R5,lastoffset 18900 .noseq 18910 LDR R5,lastoffset 18920 18930 CMP R5,#0 18940 ADDLT R5,R5,#81920 18950 .starloop 18960 LDR R4,[R0,R3,LSL #2] 18970 SUBS R4,R4,R5 18980 ADDLT R4,R4,#81920 18990 STRB R2,[R1,R4] 19000 SUB R3,R3,#1 19010 LDR R4,[R0,R3,LSL #2] 19020 SUBS R4,R4,R5 19030 ADDLT R4,R4,#81920 19040 STRB R2,[R1,R4] 19050 SUBS R3,R3,#1 19060 BGT starloop 19070 19080 LDMFD R13!,{R0-R12,PC}^ 19090 19100 .lasttablepos 19110 EQUD angletab0 19120 19130 .curseq 19140 EQUD 0 19150 19160 .lastoffset 19170 EQUD 0 19180 19190 .staroffset 19200 EQUD 0 19210 19220 .startabind 19230 EQUD startab 19240 19250 .counter 19260 EQUD 0 19270 19280 .curspin 19290 EQUD identity 19300 19310 .cctab 19320 EQUD rgval(0)*256+0.5 19330 EQUD rgval(1)*256+0.5 19340 EQUD rgval(2)*256+0.5 19350 19360 \ Set new colour into given light record 19370 \ R2 = base addr of record 19380 \ R3 = colour number 19390 .newcolour 19400 STMFD R13!,{R0,R1,R14} 19410 ADR R1,coltemplates 19420 ADD R1,R1,R3,ASL #0 19430 ADD R1,R1,R3,ASL #1 19440 LDRB R0,[R1],#1 19450 STR R0,[R2,#0] 19460 LDRB R0,[R1],#1 19470 STR R0,[R2,#4] 19480 LDRB R0,[R1],#1 19490 STR R0,[R2,#8] 19500 LDMFD R13!,{R0,R1,PC}^ 19510 19520 \ Flash given light record 19530 \ R2 = base addr of record 19540 .flash 19550 STMFD R13!,{R0,R14} 19560 MOV R0,#65536 19570 STR R0,[R2,#12] 19580 LDMFD R13!,{R0,PC}^ 19590 19600 \ Turn off all light records 19610 .turnoff 19620 STMFD R13!,{R0,R1,R14} 19630 MOV R0,#0 19640 ADR R1,col1 19650 STR R0,[R1,#12] 19660 ADR R1,col2 19670 STR R0,[R1,#12] 19680 LDMFD R13!,{R0,R1,PC}^ 19690 19700 \ Set dim red glow in record 19710 \ R2 = base addr of record 19720 .dimglow 19730 STMFD R13!,{R0,R3-R6,R14} 19740 ADR R0,dimglowtemplate 19750 LDMIA R0,{R3-R6} 19760 STMIA R2,{R3-R6} 19770 LDMFD R13!,{R0,R3-R6,PC}^ 19780 19790 .dimglowtemplate 19800 EQUD 112 19810 EQUD 32 19820 EQUD 0 19830 EQUD 65536 19840 19850 .linetype 19860 EQUD 0 19870 19880 .coltemplates 19890 :=255 := 255 := 255 \ white 19900 :=255 := 0 := 32 \ red 19910 :=255 := 128 := 0 \ orange 19920 :=192 := 255 := 0 \ yellow 19930 :=0 := 255 := 0 \ green 19940 :=0 := 208 := 192 \ cyan 19950 :=0 := 32 := 255 \ blue 19960 :=192 := 0 := 255 \ purple 19970 :=255 := 128 := 128 \ pink 19980 :=128 := 128 := 255 \ pale blue 19990 20000 ALIGN 20010 20020 .nstore 20030 EQUD -1 20040 .kstore 20050 EQUD 0 20060 .mstore 20070 EQUD 0 20080 20090 \ transform a vector through a matrix 20100 \ R0 points to result vector 20110 \ R1 points to matrix 20120 \ R2 points to vector 20130 .transform 20140 STMFD R13!,{R0-R12,R14} 20150 20160 MOV R12,R0 20170 20180 LDMIA R2,{R9-R11} 20190 LDMIA R1,{R0-R8} 20200 20210 MUL R0,R9,R0 20220 MLA R0,R10,R1,R0 20230 MLA R0,R11,R2,R0 20240 MUL R1,R9,R3 20250 MLA R1,R10,R4,R1 20260 MLA R1,R11,R5,R1 20270 MUL R2,R9,R6 20280 MLA R2,R10,R7,R2 20290 MLA R2,R11,R8,R2 20300 20310 MOV R0,R0,ASR #15 20320 MOV R1,R1,ASR #15 20330 MOV R2,R2,ASR #15 20340 20350 STMIA R12,{R0-R2} 20360 20370 LDMFD R13!,{R0-R12,PC}^ 20380 20390 \ multiply two matrices 20400 \ R0 points to result matrix 20410 \ R1 points to pre-transforming matrix 20420 \ R2 points to initial matrix 20430 .multiply 20440 STMFD R13!,{R0-R12,R14} 20450 STR R13,r13sto 20460 20470 LDMIA R2,{R3-R11} 20480 STMIA R0,{R3-R11} 20490 20500 MOV R12,R0 20510 LDMIA R1,{R0-R8} 20520 20530 MOV R14,#3 20540 .multloop 20550 20560 LDMIA R12,{R9-R11} 20570 20580 MUL R13,R9,R0 20590 MLA R13,R10,R3,R13 20600 MLA R13,R11,R6,R13 20610 MOV R13,R13,ASR #15 20620 STR R13,[R12],#4 20630 20640 MUL R13,R9,R1 20650 MLA R13,R10,R4,R13 20660 MLA R13,R11,R7,R13 20670 MOV R13,R13,ASR #15 20680 STR R13,[R12],#4 20690 20700 MUL R13,R9,R2 20710 MLA R13,R10,R5,R13 20720 MLA R13,R11,R8,R13 20730 MOV R13,R13,ASR #15 20740 STR R13,[R12],#4 20750 20760 SUBS R14,R14,#1 20770 BGT multloop 20780 20790 LDR R13,r13sto 20800 LDMFD R13!,{R0-R12,PC}^ 20810 20820 \ Vector multiply with accumulate 20830 \ R0 points to output vector 20840 \ R1 points to multiplying vector 20850 \ R2 is multiplying scalar * 1024 20860 \ R3 points to initial vector 20870 .vectormla 20880 STMFD R13!,{R0-R12,R14} 20890 20900 LDMIA R3,{R3-R5} 20910 LDMIA R1,{R6-R8} 20920 20930 MUL R9,R2,R6 20940 ADD R3,R3,R9,ASR #10 20950 MUL R9,R2,R7 20960 ADD R4,R4,R9,ASR #10 20970 MUL R9,R2,R8 20980 ADD R5,R5,R9,ASR #10 20990 21000 STMIA R0,{R3-R5} 21010 21020 LDMFD R13!,{R0-R12,PC}^ 21030 21040 .readvduinput 21050 EQUD 148 \ screen start - vdu drivers 21060 EQUD -1 21070 21080 .readvduoutput 21090 EQUD 0 21100 21110 .curplotbank 21120 EQUD 0 21130 21140 REM wait for vsync then swap over screens and note new plot address 21150 .changeframe 21160 STMFD R13!,{R0-R12,R14} 21170 21180 MOV R0,#&B0 21190 MOV R1,#0 21200 MOV R2,#&FF 21210 SWI "OS_Byte" 21220 CMP R1,#255-2 21230 BLE overload 21240 21250 .idleloop 21260 MOV R0,#&B0 21270 MOV R1,#0 21280 MOV R2,#&FF 21290 SWI "OS_Byte" 21300 CMP R1,#255-2 21310 BNE idleloop \ wait for vsync when counter crosses 255-2 ie 2 frames 21320 21330 .overload 21340 21350 MOV R0,#&B0 21360 MOV R1,#255 21370 MOV R2,#0 21380 SWI "OS_Byte" 21390 21400 LDR R3,curplotbank 21410 MOV R1,R3 21420 MOV R0,#&71 21430 SWI "OS_Byte" 21440 RSB R1,R3,#3 21450 STR R1,curplotbank 21460 MOV R0,#&70 21470 SWI "OS_Byte" \ swap screens 21480 21490 ADR R0,readvduinput 21500 ADR R1,readvduoutput 21510 SWI "OS_ReadVduVariables" 21520 LDR R0,readvduoutput 21530 LDR R1,plotscreenindfs 21540 STR R0,[R1] \ get plot address 21550 21560 LDR R8,colfade 21570 ADR R14,col1 21580 LDR R7,[R14,#12] 21590 MUL R7,R8,R7 21600 MOV R7,R7,ASR #8 21610 STR R7,[R14,#12] 21620 MOV R7,R7,ASR #8 21630 LDMIA R14,{R1-R3} 21640 MUL R1,R7,R1 21650 MUL R2,R7,R2 21660 MUL R3,R7,R3 \ colour 1 21670 21680 ADR R14,col2 21690 LDR R7,[R14,#12] 21700 MUL R7,R8,R7 21710 MOV R7,R7,ASR #8 21720 STR R7,[R14,#12] 21730 MOV R7,R7,ASR #8 21740 LDMIA R14,{R4-R6} 21750 MUL R4,R7,R4 21760 MUL R5,R7,R5 21770 MUL R6,R7,R6 \ colour 2 21780 21790 ADR R12,cctab 21800 MOV R11,#5 21810 MOV R8,#0 21820 .udouter 21830 LDR R10,[R12,R8,LSL #2] 21840 CMP R8,#0 21850 MOVNE R7,#0 21860 MOVEQ R7,#1 21870 .udinner 21880 LDR R9,[R12,R7,LSL #2] 21890 21900 SWI &100+19 \ VDU 19, 21910 21920 MOV R0,R11 21930 SWI "OS_WriteC" \ n, 21940 21950 SWI &100+16 \ 16, 21960 21970 MUL R0,R1,R9 21980 MLA R0,R4,R10,R0 21990 MOV R0,R0,ASR #16 22000 SWI "OS_WriteC" \ red, 22010 22020 MUL R0,R2,R9 22030 MLA R0,R5,R10,R0 22040 MOV R0,R0,ASR #16 22050 SWI "OS_WriteC" \ green, 22060 22070 MUL R0,R3,R9 22080 MLA R0,R6,R10,R0 22090 MOV R0,R0,ASR #16 22100 SWI "OS_WriteC" \ blue 22110 22120 ADD R11,R11,#1 22130 ADD R7,R7,#1 22140 CMP R7,#3 22150 BLT udinner 22160 ADD R8,R8,#1 22170 CMP R8,#3 22180 BLT udouter 22190 22200 LDMFD R13!,{R0-R12,PC}^ 22210 22220 .plotscreenindfs 22230 EQUD plotscreenbase 22240 22250 .colfade 22260 EQUD 256 \ rate of fade*256 22270 22280 .col1 22290 EQUD 0 \ red 22300 EQUD 0 \ green 22310 EQUD 0 \ blue 22320 EQUD 0 \ brightness 22330 22340 .col2 22350 EQUD 0 \ red 22360 EQUD 0 \ green 22370 EQUD 0 \ blue 22380 EQUD 0 \ brightness 22390 22400 \ dancing and lighting control routine 22410 .control 22420 STMFD R13!,{R0-R12,R14} 22430 22440 LDR R2,mstore 22450 ADD R2,R2,#1 22460 STR R2,mstore 22470 22480 LDR R3,nstore 22490 SWI "Tracker_ReadPos" 22500 STR R1,nstore \ R0=K, R1=N 22510 22520 CMP R0,#14 22530 BLEQ turnoff 22540 22550 CMP R1,R3 22560 LDMEQFD R13!,{R0-R12,PC} \ no new event 22570 22580 STR R0,kstore 22590 22600 MOV R2,#0 22610 STR R2,mstore 22620 22630 CMP R0,#1 22640 CMPEQ R1,#0 22650 ADREQ R2,col1 22660 BLEQ dimglow 22670 22680 CMP R0,#1 22690 CMPEQ R1,#56 22700 MOVEQ R2,#240 22710 STREQ R2,colfade 22720 22730 CMP R0,#0 22740 MOVEQ R2,#256 22750 STREQ R2,colfade 22760 22770 CMP R0,#20 22780 MOVEQ R2,#253 22790 STREQ R2,colfade 22800 22810 CMP R0,#2 22820 LDMLTFD R13!,{R0-R12,PC}^ \ K<2 22830 22840 CMP R0,#5 22850 CMPNE R0,#6 22860 CMPNE R0,#14 22870 CMPNE R0,#15 22880 CMPNE R0,#18 22890 CMPNE R0,#19 22900 TSTEQ R1,#15 22910 ADREQ R2,sseq2 22920 STREQ R2,curseq 22930 MOVEQ R2,#3 22940 STREQ R2,staroffset \ circle stars 22950 22960 CMP R0,#7 22970 CMPNE R0,#8 22980 CMPNE R0,#16 22990 CMPNE R0,#17 23000 TSTEQ R1,#15 23010 ADREQ R2,sseq1 23020 STREQ R2,curseq 23030 MOVEQ R2,#3 23040 STREQ R2,staroffset \ bouncy stars 23050 23060 CMP R0,#0 23070 CMPNE R0,#9 23080 CMPNE R0,#20 23090 TSTEQ R1,#15 23100 MOVEQ R2,#0 23110 STREQ R2,curseq \ stationary 23120 23130 CMP R0,#20 23140 LDMEQFD R13!,{R0-R12,PC}^ \ K=20 23150 23160 CMP R0,#14 23170 BNE nostrobe 23180 LDR R6,mstore 23190 MOV R3,#0 23200 ADR R2,col1 23210 BL newcolour 23220 CMP R6,#0 23230 BLEQ flash 23240 ADR R2,col2 23250 BL newcolour 23260 CMP R6,#0 23270 BLEQ flash 23280 B strobe 23290 .nostrobe 23300 23310 AND R2,R1,#3 23320 CMP R2,#0 23330 ADREQ R2,col1 23340 LDR R3,curcol1 23350 BLEQ newcolour 23360 BLEQ flash 23370 23380 AND R2,R1,#3 23390 CMP R2,#2 23400 ANDNE R2,R1,#7 23410 CMPNE R2,#0 23420 ADREQ R2,col2 23430 LDR R3,curcol2 23440 BLEQ newcolour 23450 BLEQ flash 23460 23470 .strobe 23480 23490 CMP R0,#11 23500 CMPNE R0,#13 23510 BNE norepeat 23520 ADD R2,R1,#1 23530 TST R2,#15 23540 BNE norepeat 23550 MOV R2,R2,ASR #4 23560 AND R2,R2,#3 23570 ADR R3,currepqcind 23580 LDR R4,[R3] 23590 STR R2,[R3,R4] 23600 .norepeat \ multiple images 23610 23620 CMP R0,#12 23630 CMPNE R0,#13 23640 MOVNE R2,#0 23650 MOVEQ R2,#1 23660 STR R2,linetype 23670 23680 LDMFD R13!,{R0-R12,PC}^ 23690 23700 .currepqcind 23710 EQUD currepq-P% 23720 23730 .curcol1 23740 EQUD 0 23750 23760 .curcol2 23770 EQUD 1 23780 23790 .sseq1 23800 EQUD INT(32*COS(0*PI/12))+INT(24*SIN(0*PI/12))*320 23810 EQUD INT(32*COS(1*PI/12))+INT(24*SIN(1*PI/12))*320 23820 EQUD INT(32*COS(2*PI/12))+INT(24*SIN(2*PI/12))*320 23830 EQUD INT(32*COS(3*PI/12))+INT(24*SIN(3*PI/12))*320 23840 EQUD INT(32*COS(4*PI/12))+INT(24*SIN(4*PI/12))*320 23850 EQUD INT(32*COS(5*PI/12))+INT(24*SIN(5*PI/12))*320 23860 EQUD INT(32*COS(6*PI/12))+INT(24*SIN(6*PI/12))*320 23870 EQUD INT(32*COS(7*PI/12))+INT(24*SIN(7*PI/12))*320 23880 EQUD INT(32*COS(8*PI/12))+INT(24*SIN(8*PI/12))*320 23890 EQUD INT(32*COS(9*PI/12))+INT(24*SIN(9*PI/12))*320 23900 EQUD INT(32*COS(10*PI/12))+INT(24*SIN(10*PI/12))*320 23910 EQUD INT(32*COS(11*PI/12))+INT(24*SIN(11*PI/12))*320 23920 EQUD INT(32*COS(12*PI/12))+INT(24*SIN(12*PI/12))*320 23930 EQUD INT(32*COS(11*PI/12))+INT(24*SIN(11*PI/12))*320 23940 EQUD INT(32*COS(10*PI/12))+INT(24*SIN(10*PI/12))*320 23950 EQUD INT(32*COS(9*PI/12))+INT(24*SIN(9*PI/12))*320 23960 EQUD INT(32*COS(8*PI/12))+INT(24*SIN(8*PI/12))*320 23970 EQUD INT(32*COS(7*PI/12))+INT(24*SIN(7*PI/12))*320 23980 EQUD INT(32*COS(6*PI/12))+INT(24*SIN(6*PI/12))*320 23990 EQUD INT(32*COS(5*PI/12))+INT(24*SIN(5*PI/12))*320 24000 EQUD INT(32*COS(4*PI/12))+INT(24*SIN(4*PI/12))*320 24010 EQUD INT(32*COS(3*PI/12))+INT(24*SIN(3*PI/12))*320 24020 EQUD INT(32*COS(2*PI/12))+INT(24*SIN(2*PI/12))*320 24030 EQUD INT(32*COS(1*PI/12))+INT(24*SIN(1*PI/12))*320 24040 24050 .sseq2 24060 EQUD INT(10*COS(0*PI/6))+INT(11*SIN(0*PI/6))*320 24070 EQUD INT(10*COS(1*PI/6))+INT(11*SIN(1*PI/6))*320 24080 EQUD INT(10*COS(2*PI/6))+INT(11*SIN(2*PI/6))*320 24090 EQUD INT(10*COS(3*PI/6))+INT(11*SIN(3*PI/6))*320 24100 EQUD INT(10*COS(4*PI/6))+INT(11*SIN(4*PI/6))*320 24110 EQUD INT(10*COS(5*PI/6))+INT(11*SIN(5*PI/6))*320 24120 EQUD INT(10*COS(6*PI/6))+INT(11*SIN(6*PI/6))*320 24130 EQUD INT(10*COS(7*PI/6))+INT(11*SIN(7*PI/6))*320 24140 EQUD INT(10*COS(8*PI/6))+INT(11*SIN(8*PI/6))*320 24150 EQUD INT(10*COS(9*PI/6))+INT(11*SIN(9*PI/6))*320 24160 EQUD INT(10*COS(10*PI/6))+INT(11*SIN(10*PI/6))*320 24170 EQUD INT(10*COS(11*PI/6))+INT(11*SIN(11*PI/6))*320 24180 EQUD INT(10*COS(0*PI/6))+INT(11*SIN(0*PI/6))*320 24190 EQUD INT(10*COS(1*PI/6))+INT(11*SIN(1*PI/6))*320 24200 EQUD INT(10*COS(2*PI/6))+INT(11*SIN(2*PI/6))*320 24210 EQUD INT(10*COS(3*PI/6))+INT(11*SIN(3*PI/6))*320 24220 EQUD INT(10*COS(4*PI/6))+INT(11*SIN(4*PI/6))*320 24230 EQUD INT(10*COS(5*PI/6))+INT(11*SIN(5*PI/6))*320 24240 EQUD INT(10*COS(6*PI/6))+INT(11*SIN(6*PI/6))*320 24250 EQUD INT(10*COS(7*PI/6))+INT(11*SIN(7*PI/6))*320 24260 EQUD INT(10*COS(8*PI/6))+INT(11*SIN(8*PI/6))*320 24270 EQUD INT(10*COS(9*PI/6))+INT(11*SIN(9*PI/6))*320 24280 EQUD INT(10*COS(10*PI/6))+INT(11*SIN(10*PI/6))*320 24290 EQUD INT(10*COS(11*PI/6))+INT(11*SIN(11*PI/6))*320 24300 24310 .plottabind 24320 EQUD plottab 24330 24340 \ Log line in the plot list 24350 \ R0 points to A 24360 \ R1 points to direction 24370 \ R2 = length 24380 .logline 24390 STMFD R13!,{R0-R12,R14} 24400 24410 LDR R11,plottabq 24420 LDR R12,plottabind 24430 ADD R12,R12,R11,LSL #6 \ get pos in table 24440 24450 MOV R3,#0 \ line 24460 LDMIA R0,{R4-R6} \ A 24470 LDMIA R1,{R7-R9} \ direction 24480 MOV R10,R2 \ length 24490 MUL R2,R9,R10 24500 ADD R2,R6,R2,ASR #1 \ average z 24510 SUB R2,R2,#1280 \ minus half a unit 24520 STMIA R12,{R2-R10} \ store whole lot 24530 24540 ADD R11,R11,#1 24550 STR R11,plottabq \ store new quantity 24560 24570 LDMFD R13!,{R0-R12,PC}^ 24580 24590 \ Log bungie line in the plot list 24600 \ R0 points to A 24610 \ R1 points to direction 24620 \ R2 = length 24630 .logbungieline 24640 STMFD R13!,{R0-R12,R14} 24650 24660 LDR R11,plottabq 24670 LDR R12,plottabind 24680 ADD R12,R12,R11,LSL #6 \ get pos in table 24690 24700 MOV R3,#2 \ bungie line 24710 LDMIA R0,{R4-R6} \ A 24720 LDMIA R1,{R7-R9} \ direction 24730 MOV R10,R2 \ length 24740 MUL R2,R9,R10 24750 ADD R2,R6,R2,ASR #1 \ average z 24760 STMIA R12,{R2-R10} \ store whole lot 24770 24780 ADD R11,R11,#1 24790 STR R11,plottabq \ store new quantity 24800 24810 LDMFD R13!,{R0-R12,PC}^ 24820 24830 \ Log sphere in the plot list 24840 \ R0 points to position 24850 \ R1 = size (0-13) 24860 .logsphere 24870 STMFD R13!,{R0-R12,R14} 24880 24890 LDR R11,plottabq 24900 LDR R12,plottabind 24910 ADD R12,R12,R11,LSL #6 \ get pos in table 24920 24930 MOV R3,#1 \ sphere 24940 LDMIA R0,{R4-R6} \ position 24950 MOV R7,R1 \ size 24960 MOV R2,R6 24970 STMIA R12,{R2-R7} \ store whole lot 24980 24990 ADD R11,R11,#1 25000 STR R11,plottabq \ store new quantity 25010 25020 LDMFD R13!,{R0-R12,PC}^ 25030 25040 \ Log head in the plot list 25050 \ R0 points to position 25060 \ R1 = expression 25070 .loghead 25080 STMFD R13!,{R0-R12,R14} 25090 25100 LDR R11,plottabq 25110 LDR R12,plottabind 25120 ADD R12,R12,R11,LSL #6 \ get pos in table 25130 25140 MOV R3,#3 \ head 25150 LDMIA R0,{R4-R6} \ position 25160 MOV R7,R1 \ expression 25170 MOV R2,R6 25180 STMIA R12,{R2-R7} \ store whole lot 25190 25200 ADD R11,R11,#1 25210 STR R11,plottabq \ store new quantity 25220 25230 LDMFD R13!,{R0-R12,PC}^ 25240 25250 \ display contents of plot list in revese order of distance 25260 .display 25270 STMFD R13!,{R0-R12,R14} 25280 25290 LDR R10,plottabq 25300 25310 .douter 25320 LDR R12,plottabind 25330 LDR R11,plottabq 25340 MVN R9,#NOT (-&1000001) 25350 25360 .dinner 25370 LDR R0,[R12],#64 25380 CMP R0,R9 25390 MOVGE R9,R0 25400 SUBGE R8,R12,#64 25410 SUBS R11,R11,#1 25420 BGT dinner \ loop to find farthest away item 25430 25440 LDR R9,[R8,#4] 25450 ADD R0,R8,#8 25460 25470 CMP R9,#0 25480 BLEQ line \ draw line 25490 25500 CMP R9,#1 25510 BLEQ gensphere \ draw sphere 25520 25530 CMP R9,#2 25540 BLEQ bungieline \ draw line with sphere at end point 25550 25560 CMP R9,#3 25570 BLEQ head \ draw big sphere 25580 25590 MVN R0,#NOT (-&1000001) 25600 STR R0,[R8,#0] \ set big negative value in distance to prevent 25610 \ item being plotted again 25620 SUBS R10,R10,#1 25630 BGT douter 25640 25650 LDMFD R13!,{R0-R12,PC}^ 25660 25670 .plottabq 25680 EQUD 0 25690 25700 .sincostabind 25710 EQUD sincostab 25720 25730 .spinningspheres 25740 STMFD R13!,{R14} 25750 25760 LDR R11,sincostabind 25770 ADD R12,R11,#1024 25780 ADR R9,tempvector 25790 25800 LDR R6,sphereheight+0 25810 LDR R1,sphereheight+4 25820 ADD R6,R6,R1 25830 CMP R6,#32768 25840 MVNGE R1,R1 25850 CMP R6,#0 25860 MVNLT R1,R1 25870 STR R6,sphereheight+0 25880 STR R1,sphereheight+4 25890 25900 ADR R8,spheredata 25910 MOV R7,#6 25920 25930 .spinningloop 25940 LDR R10,[R8,#0] 25950 SUB R10,R10,#1 25960 STR R10,[R8,#0] 25970 AND R10,R10,#255 25980 LDR R0,[R11,R10,LSL #2] 25990 SUB R0,R0,R0,ASR #2 26000 CMP R7,#3 26010 MOVGT R1,R6 26020 RSBLE R1,R6,#32768 26030 LDR R2,[R12,R10,LSL #2] 26040 SUB R2,R2,R2,ASR #2 26050 STMIA R9,{R0-R2} 26060 26070 MOV R0,R9 26080 LDR R1,torsotransind 26090 MOV R2,R9 26100 BL transform 26110 26120 LDR R1,[R8,#4] 26130 LDR R2,[R8,#8] 26140 ADD R1,R1,R2 26150 CMP R1,#13 26160 MOVEQ R1,#11 26170 MVNEQ R2,#NOT -1 26180 CMP R1,#2 26190 MOVEQ R1,#4 26200 MOVEQ R2,#+1 26210 STR R1,[R8,#4] 26220 STR R2,[R8,#8] 26230 BL logsphere 26240 26250 ADD R8,R8,#12 26260 SUBS R7,R7,#1 26270 BGT spinningloop 26280 26290 LDMFD R13!,{PC}^ 26300 26310 .sphereheight 26320 EQUD 0 26330 EQUD 300 26340 26350 .spheredata 26360 EQUD 0 \ angle 26370 EQUD 3 \ size 26380 EQUD +1 \ increment 26390 26400 EQUD 85 \ angle 26410 EQUD 9 \ size 26420 EQUD +1 \ increment 26430 26440 EQUD 170 \ angle 26450 EQUD 9 \ size 26460 EQUD -1 \ increment 26470 26480 EQUD 43 \ angle 26490 EQUD 3 \ size 26500 EQUD -1 \ increment 26510 26520 EQUD 128 \ angle 26530 EQUD 9 \ size 26540 EQUD -1 \ increment 26550 26560 EQUD 213 \ angle 26570 EQUD 9 \ size 26580 EQUD +1 \ increment 26590 26600 .torsotransind 26610 EQUD torsotrans 26620 26630 .tempvector 26640 EQUD 0 26650 EQUD 0 26660 EQUD 0 26670 26680 .gplotscreenind 26690 EQUD plotscreenbase 26700 26710 \ Draw digital waveform graph 26720 \ R0 = base address of sample 26730 \ R1 = offset into sample*65536 26740 \ R2 = phase increment*65536 26750 \ R3 = pointer to graph orientation and screen position 26760 .graph 26770 STMFD R13!,{R0-R12,R14} 26780 26790 MOV R14,R3 26800 ADD R0,R0,R1,LSR #16 \ address of data to plot 26810 LDR R1,[R14,#36] 26820 MOV R12,R1,LSL #23 26830 LDR R1,[R14,#40] 26840 SUB R12,R12,R1,LSL #8 \ position of origin ( -> time axis) 26850 LDR R5,gplotscreenind 26860 LDR R5,[R5] \ address of screen 26870 MOV R6,#&11 \ byte for axes 26880 MOV R7,#&22 \ byte for points 26890 LDR R1,[R14,#0] 26900 MOV R1,R1,ASR #8 26910 MOV R8,R1,LSL #16 26920 LDR R1,[R14,#12] 26930 SUB R8,R8,R1,ASR #7 \ time axis increment 26940 SUB R12,R12,R8,LSL #5 26950 SUB R12,R12,R8,LSL #4 26960 LDR R1,[R14,#4] 26970 SUB R1,R1,R1,ASR #2 26980 MOV R1,R1,ASR #8 26990 MOV R9,R1,LSL #16 27000 LDR R1,[R14,#16] 27010 SUB R9,R9,R1,ASR #7 \ volume axis increment 27020 SUB R12,R12,R9,LSL #4 27030 SUB R12,R12,R9,LSL #3 27040 MOV R11,#96 \ number of points 27050 MOV R3,#&3F \ mask for sample bit isolation 27060 MOV R4,R12 27070 27080 .gloop 27090 LDR R1,[R0],#4 27100 AND R2,R4,#&FF00 27110 ADD R2,R2,R2,LSR #2 27120 ADD R2,R2,R4,LSR #23 27130 STRB R6,[R5,R2] 27140 AND R2,R3,R1,LSR #2 27150 MLA R10,R9,R2,R4 27160 AND R2,R10,#&FF00 27170 ADD R2,R2,R2,LSR #2 27180 ADD R2,R2,R10,LSR #23 27190 STRB R7,[R5,R2] 27200 ADD R4,R4,R8 27210 AND R2,R4,#&FF00 27220 ADD R2,R2,R2,LSR #2 27230 ADD R2,R2,R4,LSR #23 27240 STRB R6,[R5,R2] 27250 AND R2,R3,R1,LSR #10 27260 MLA R10,R9,R2,R4 27270 AND R2,R10,#&FF00 27280 ADD R2,R2,R2,LSR #2 27290 ADD R2,R2,R10,LSR #23 27300 STRB R7,[R5,R2] 27310 ADD R4,R4,R8 27320 AND R2,R4,#&FF00 27330 ADD R2,R2,R2,LSR #2 27340 ADD R2,R2,R4,LSR #23 27350 STRB R6,[R5,R2] 27360 AND R2,R3,R1,LSR #18 27370 MLA R10,R9,R2,R4 27380 AND R2,R10,#&FF00 27390 ADD R2,R2,R2,LSR #2 27400 ADD R2,R2,R10,LSR #23 27410 STRB R7,[R5,R2] 27420 ADD R4,R4,R8 27430 AND R2,R4,#&FF00 27440 ADD R2,R2,R2,LSR #2 27450 ADD R2,R2,R4,LSR #23 27460 STRB R6,[R5,R2] 27470 AND R2,R3,R1,LSR #26 27480 MLA R10,R9,R2,R4 27490 AND R2,R10,#&FF00 27500 ADD R2,R2,R2,LSR #2 27510 ADD R2,R2,R10,LSR #23 27520 STRB R7,[R5,R2] 27530 ADD R4,R4,R8 27540 SUBS R11,R11,#4 27550 BGT gloop 27560 27570 MOV R4,R12 \ position of origin ( -> time axis) 27580 MOV R11,#64 \ number of points 27590 27600 .gloop0 27610 AND R2,R4,#&FF00 27620 ADD R2,R2,R2,LSR #2 27630 ADD R2,R2,R4,LSR #23 27640 STRB R6,[R5,R2] 27650 ADD R4,R4,R9 27660 AND R2,R4,#&FF00 27670 ADD R2,R2,R2,LSR #2 27680 ADD R2,R2,R4,LSR #23 27690 STRB R6,[R5,R2] 27700 ADD R4,R4,R9 27710 SUBS R11,R11,#2 27720 BGT gloop0 27730 27740 27750 LDMFD R13!,{R0-R12,PC}^ 27760 27770 .drawgraphs 27780 STMFD R13!,{R0-R12,R14} 27790 27800 LDR R8,kstore 27810 CMP R8,#2 27820 LDMLTFD R13!,{R0-R12,PC}^ 27830 CMP R8,#10 27840 BLT notmusical 27850 CMP R8,#14 27860 LDMLTFD R13!,{R0-R12,PC}^ 27870 .notmusical 27880 27890 ADR R12,soundinfotab 27900 MOV R0,R12 27910 SWI "Tracker_SoundInfo" 27920 MOV R11,#4 27930 ADR R3,graphpostab 27940 LDR R9,sincostabind 27950 ADD R10,R9,#1024 27960 ADR R7,spinlist 27970 27980 .dgloop 27990 LDRB R0,[R3,#44] 28000 LDR R1,[R9,R0,LSL #2] 28010 MOV R2,#104 28020 MUL R1,R2,R1 28030 MOV R1,R1,ASR #15 28040 ADD R1,R1,#160 28050 STR R1,[R3,#36] 28060 LDR R1,[R10,R0,LSL #2] 28070 MOV R2,#70 28080 MUL R1,R2,R1 28090 MOV R1,R1,ASR #15 28100 ADD R1,R1,#128 28110 STR R1,[R3,#40] 28120 ADD R0,R0,#3 28130 STRB R0,[R3,#44] 28140 28150 CMP R8,#5 28160 BLT nofunkyrot 28170 28180 MOV R0,R3 28190 LDRB R1,[R3,#45] 28200 LDR R1,[R7,R1,LSL #2] 28210 MOV R2,R3 28220 BL multiply 28230 .nofunkyrot 28240 28250 CMP R8,#2 28260 LDREQ R0,identityind 28270 STMEQFD R13!,{R4-R9} 28280 LDMEQIA R0,{R0-R2,R4-R9} 28290 STMEQIA R3,{R0-R2,R4-R9} 28300 LDMEQFD R13!,{R4-R9} 28310 28320 LDR R0,[R12,#16] 28330 CMP R0,#0 28340 BEQ nullsample 28350 SUB R0,R0,#1 28360 ADR R1,sampleaddrtab 28370 LDR R0,[R1,R0,LSL #2] 28380 LDMIA R12,{R1,R2} 28390 LDR R4,[R12,#24] 28400 CMP R4,#0 28410 BGT oksample 28420 .nullsample 28430 LDR R0,nullsampletabind 28440 MOV R1,#0 28450 MOV R2,#0 28460 .oksample 28470 BL graph 28480 ADD R3,R3,#48 28490 ADD R12,R12,#32 28500 SUBS R11,R11,#1 28510 BGT dgloop 28520 28530 LDMFD R13!,{R0-R12,PC}^ 28540 28550 .spinlist 28560 EQUD spin1 28570 EQUD spin2 28580 EQUD spin3 28590 EQUD spin1b 28600 EQUD spin2b 28610 EQUD spin3b 28620 28630 .nullsampletabind 28640 EQUD nullsampletab 28650 28660 .identityind 28670 EQUD identity 28680 28690 .graphpostab 28700 EQUD 32768:EQUD 0:EQUD 0 28710 EQUD 0:EQUD 32768:EQUD 0 28720 EQUD 0:EQUD 0:EQUD 32768 28730 EQUD 160:EQUD 64:EQUB 0 28740 EQUB 0:ALIGN 28750 28760 EQUD 32768:EQUD 0:EQUD 0 28770 EQUD 0:EQUD 32768:EQUD 0 28780 EQUD 0:EQUD 0:EQUD 32768 28790 EQUD 240:EQUD 128:EQUB 64 28800 EQUB 0:ALIGN 28810 28820 EQUD 32768:EQUD 0:EQUD 0 28830 EQUD 0:EQUD 32768:EQUD 0 28840 EQUD 0:EQUD 0:EQUD 32768 28850 EQUD 160:EQUD 192:EQUB 128 28860 EQUB 0:ALIGN 28870 28880 EQUD 32768:EQUD 0:EQUD 0 28890 EQUD 0:EQUD 32768:EQUD 0 28900 EQUD 0:EQUD 0:EQUD 32768 28910 EQUD 80:EQUD 128 :EQUB 192 28920 EQUB 0:ALIGN 28930 28940 ] 28950 28960 sampleaddrtab=P% 28970 P%+=128 28980 28990 soundinfotab=P% 29000 P%+=256 29010 29020 plottab=P% 29030 P%+=2048 29040 REM type line sphere bline head 29050 REM base+0 = effective average distance for all types 29060 REM base+4 = 0 1 2 3 29070 REM base+8 = xA x xA x 29080 REM base+12 = yA y yA y 29090 REM base+16 = zA z zA z 29100 REM base+20 = xx size xx expr. 29110 REM base+24 = yy yy 29120 REM base+28 = zz zz 29130 REM base+32 = length length 29140 29150 startab=P% 29160 P%+=512 29170 29180 sincostab=P% 29190 P%+=2048 29200 29210 nullsampletab=P% 29220 P%+=128 29230 29240 NEXT pass% 29250 29260 FOR N%=0 TO 511 STEP 4 29270 startab!N%=RND(81920)-1 29280 NEXT 29290 29300 FOR N%=0 TO 1023 STEP 4 29310 sincostab!(N%+0)=32768*SIN(N%*2*PI/1024) 29320 sincostab!(N%+1024)=32768*COS(N%*2*PI/1024) 29330 NEXT 29340 29350 FOR N%=0 TO 127 29360 nullsampletab?N%=128 29370 NEXT 29380 29390 !spritefilebase=sprites 29400ENDPROC 29410
� > !FunkyDemo.!RunMain � (C) JSG 1992 ( � � � 2 È 8 < �12 F � 4,0,0,0 P � 4+128 Z � d *SPEAKER OFF n *KEY 1 " |MTWINO8|M" x � 19,0,24,32,32,32 �� � �� code 32768 �� sprites 81920 �� plotspriteacode(7,3) �� rgval(2),bval(2) � �rgval(0)=0 �rgval(1)=0.6 �rgval(2)=1 � bval(0)=0 �bval(1)=0.3 �bval(2)=0.5 xorigin=320 yorigin=64 "cos%=32768*�(0.12)+0.5 ,sin%=32768*�(0.12)+0.5 6 @ �assemble J T*�"LOAD <Funky$Dir>.Sprites "+�~sprites ^È™"Tracker_TuneInfo" � A h� A=0 � r *RMAFree 300K |/ È™"Tracker_Load","<Funky$Dir>.GtRdyFrThs" �� � �� 3,255,255,255 �� 0 �� N%=0 � 127 � A%=startab!(N%<<2) �' È’ (A% � 320)*4,1023-(A% � 320)*4 �) È’ (A% � 320)*4+2,1023-(A% � 320)*4 �� � �� N=0 � 15 �$ � 7,192-N*12,192-N*12,192-N*12 � � 0,0,0,N*12 $ � 3,192-N*12,192-N*12,192-N*12 *FX 19 *FX 19 & *FX 19 0� N : D!curplotbank=1 N� 0,0,0,192 X� 1,192,0,0 b� 2,192,96,0 l� 3,64,128,48 v� C2%=1 � 2 �8 � 12+C2%,127*bval(C2%),127*bval(C2%),255*bval(C2%) �� �� 15,255,255,255 �� 15 ��setpalette(B0%,B1%) � �� N%=0 � 31 �D È™"Tracker_ReadSampleTable",N%+1 � ,,,,,,sampleaddrtab!(N%<<2) �� �ș"Tracker_Stereo",1 � �(A%=torsotrans:B%=spin1:C%=torsotrans �$� multiply:� multiply:� multiply � multiply (A%=torsotrans:B%=spin3:C%=torsotrans $� multiply:� multiply:� multiply *E%=0 4� 15 > H*FX 176,2,0 RÈ™"Tracker_SetPos",0,0 \È™"Tracker_Play" f p� z � changeframe � � clearscreen � � control � � update � � drawgraphs � � drawperson �3 � �(12)=1 � !curcol1=�(10)-1:!curcol2=�(10)-1 �3 � �(6)=1 � graphpostab!(�(4)*48-48+45)=�(6)-1 � È— X%,Y%,B% � � B% � 2 � � *PLAYPAUSE �" �:È— X%,Y%,B%:� (B% � 2)=0 �" �:È— X%,Y%,B%:� (B% � 2)=2 �" �:È— X%,Y%,B%:� (B% � 2)=0 *PLAYSTART � � B% � 4 $ .È™"Tracker_Pause" 8�0 B� L V� �setpalette(B0%,B1%) ` � C1%=0 � 2 j � C0%=0 � 2 t/ BR%=(B0%*rgval(C0%)+B1%*rgval(C1%))/2 ~# � 4+3*C1%+C0%,BR%,BR%,BR% � � � � �� � �� �ROUND(A) �=A+0.5*�(A) � �� �assemble � � pass%=0 � 2 � 2 � P%=code � [OPT pass% � .currepqind EQUD currepq-P% .plotscreenind0 ( EQUD plotscreenbase-P% 2 <L \ Plot Sprite size a (32*n mode 12) with implicit mask but no clipping F \ Value 0 -> no plot P* \ 1-3 -> (illegal do not use) Z \ 4-15 -> plot pixel d' \ R0 = X pos of centre (internal) n' \ R1 = Y pos of centre (internal) x* \ R2 = number of lines in sprite (n) �2 \ R3 = address of sprite data (word aligned) � .plotspritea � STMFD R13!,{R0-R12,R14} � � ADR R10,currepqind � LDR R12,[R10] � LDR R10,[R12,R10] � CMP R10,#1 � BEQ psa1 � CMP R10,#2 � BEQ psa2 � CMP R10,#3 � BEQ psa3 @ MOV R10,R3 \ R10 = address of sprite data "9 MOV R11,R2 \ R11 = number of lines , 6 SUB R0,R0,#16 @7 SUB R1,R1,R11,ASR #1 \ get top left corner J T CMN R0,#1 ^ CMNGT R1,R11 h LDMLEFD R13!,{R0-R12,PC}^ r CMP R0,#640-32 | CMPLE R1,#256-1 �@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites � � CMP R1,#0 � ADDLT R11,R11,R1 � SUBLT R10,R10,R1,LSL #4 �, MOVLT R1,#0 \ trim top � � RSB R4,R1,#256 � CMP R11,R4 �/ MOVGT R11,R4 \ trim bottom � � ADR R9,plotscreenind0 � LDR R12,[R9] LDR R9,[R9,R12] ADD R9,R9,R1,LSL #8 ADD R9,R9,R1,LSL #6 & BIC R1,R0,#7 0N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting : D MOV R12,#%1000 N �R R12,R12,R12,LSL #16 X �R R12,R12,R12,LSL #8 bH �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit l v � R1,R0,#7 � ADR R0,caselist �R LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case � ADR R1,base � ADD PC,R0,R1 � � .caselist � ] � � N%=0 � 7 � [OPT pass% �* EQUD plotspriteacode(N%,0)-base � ] � � N% � [OPT pass% .base ] � N%=0 � 7 shiftleft = N%*4 * shiftright = 32-N%*4 45 [OPT pass% \ do 8 compilations > H; .plotspriteacode(N%,0) \ doubles as loop start R LDMIA R10!,{R0-R3} \ f LDMIA R9,{R4-R8} p z ] � � M%=0 � 3 � Rdata = M% � Rcurword = M%+4 � Rnextword = M%+5 �5 [OPT pass% \ for four words... � �' �R R14,Rdata,Rdata,LSL #1 � � R14,R12,R14 �# �R R14,R14,R14,LSR #2 �# �R R14,R14,R14,LSR #1 �6 BIC Rcurword,Rcurword,R14,LSL #shiftleft �7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft �9 BIC Rnextword,Rnextword,R14,LSR #shiftright : �R Rnextword,Rnextword,Rdata,LSR #shiftright ] � M% $ [OPT pass% . 8 STMIA R9,{R4-R8} B ADD R9,R9,#320 L V SUBS R11,R11,#1 `% BGT plotspriteacode(N%,0) j t! LDMFD R13!,{R0-R12,PC}^ ~ � ] � � N% � [OPT pass% � � .plotscreenind1 � EQUD plotscreenbase-P% � � .psa1 �@ MOV R10,R3 \ R10 = address of sprite data � �9 MOV R11,R2,ASR #1 \ R11 = number of lines � SUB R0,R0,#16 MOV R1,R1,ASR #1 7 SUB R1,R1,R11,ASR #1 \ get top left corner ( CMN R0,#1 2 CMNGT R1,R11 < LDMLEFD R13!,{R0-R12,PC}^ F CMP R0,#640-32 P CMPLE R1,#256-1 Z@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites d n CMP R1,#0 x ADDLT R11,R11,R1 � SUBLT R10,R10,R1,LSL #4 �, MOVLT R1,#0 \ trim top � � RSB R4,R1,#256 � CMP R11,R4 �/ MOVGT R11,R4 \ trim bottom � � ADR R9,plotscreenind1 � LDR R12,[R9] � LDR R9,[R9,R12] � ADD R9,R9,R1,LSL #8 � ADD R9,R9,R1,LSL #6 � BIC R1,R0,#7 N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting MOV R12,#%1000 " �R R12,R12,R12,LSL #16 , �R R12,R12,R12,LSL #8 6H �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit @ J � R1,R0,#7 T ADR R0,caselist1 ^R LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case h ADR R1,base1 r ADD PC,R0,R1 | � .caselist1 � ] � � N%=0 � 7 � [OPT pass% �+ EQUD plotspriteacode(N%,1)-base1 � ] � � N% � [OPT pass% � .base1 � ] � � N%=0 � 7 � shiftleft = N%*4 � shiftright = 32-N%*4 5 [OPT pass% \ do 8 compilations 9 .plotspriteacode(N%,1) \ doubles as loop start & LDMIA R10,{R0-R3} 0 ADD R10,R10,#32 : D LDMIA R9,{R4-R8} N X ] b � M%=0 � 3 l Rdata = M% v Rcurword = M%+4 � Rnextword = M%+5 �5 [OPT pass% \ for four words... � �' �R R14,Rdata,Rdata,LSL #1 � � R14,R12,R14 �# �R R14,R14,R14,LSR #2 �# �R R14,R14,R14,LSR #1 �6 BIC Rcurword,Rcurword,R14,LSL #shiftleft �7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft �9 BIC Rnextword,Rnextword,R14,LSR #shiftright �: �R Rnextword,Rnextword,Rdata,LSR #shiftright � ] � � M% [OPT pass% STMIA R9,{R4-R8} ADD R9,R9,#320 * 4 SUBS R11,R11,#1 >% BGT plotspriteacode(N%,1) H R! LDMFD R13!,{R0-R12,PC}^ \ f ] p � N% z [OPT pass% � � .plotscreenind � EQUD plotscreenbase-P% � � .psa2 �@ MOV R10,R3 \ R10 = address of sprite data � �9 MOV R11,R2,ASR #2 \ R11 = number of lines � � SUB R0,R0,#16 � SUB R0,R0,#160 � MOV R1,R1,ASR #2 �7 SUB R1,R1,R11,ASR #1 \ get top left corner CMN R0,#1 CMNGT R1,R11 $ LDMLEFD R13!,{R0-R12,PC}^ . CMP R0,#640-32 8 CMPLE R1,#256-1 B@ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites L V CMP R1,#0 ` ADDLT R11,R11,R1 j SUBLT R10,R10,R1,LSL #4 t, MOVLT R1,#0 \ trim top ~ � RSB R4,R1,#256 � CMP R11,R4 �/ MOVGT R11,R4 \ trim bottom � � ADR R9,plotscreenind � LDR R12,[R9] � LDR R9,[R9,R12] � ADD R9,R9,R1,LSL #8 � ADD R9,R9,R1,LSL #6 � BIC R1,R0,#7 �N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting � MOV R12,#%1000 �R R12,R12,R12,LSL #16 �R R12,R12,R12,LSL #8 H �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit ( 2 � R1,R0,#7 < ADR R0,caselist2 FR LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case P ADR R1,base2 Z ADD PC,R0,R1 d n .caselist2 x ] � � N%=0 � 7 � [OPT pass% �+ EQUD plotspriteacode(N%,2)-base2 � ] � � N% � [OPT pass% � .base2 � ] � � N%=0 � 7 � shiftleft = N%*4 � shiftright = 32-N%*4 �5 [OPT pass% \ do 8 compilations � 9 .plotspriteacode(N%,2) \ doubles as loop start LDMIA R10,{R0-R3} ADD R10,R10,#64 " LDMIA R9,{R4-R8} , 6 ] @ � M%=0 � 3 J Rdata = M% T Rcurword = M%+4 ^ Rnextword = M%+5 h5 [OPT pass% \ for four words... r |' �R R14,Rdata,Rdata,LSL #1 � � R14,R12,R14 �# �R R14,R14,R14,LSR #2 �# �R R14,R14,R14,LSR #1 �6 BIC Rcurword,Rcurword,R14,LSL #shiftleft �7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft �9 BIC Rnextword,Rnextword,R14,LSR #shiftright �: �R Rnextword,Rnextword,Rdata,LSR #shiftright � ] � � M% � [OPT pass% � � STMIA R9,{R4-R8} � ADD R9,R9,#320 SUBS R11,R11,#1 % BGT plotspriteacode(N%,2) & 0! LDMFD R13!,{R0-R12,PC}^ : D ] N � N% X [OPT pass% b l .psa3 v@ MOV R10,R3 \ R10 = address of sprite data � �9 MOV R11,R2,ASR #3 \ R11 = number of lines � � SUB R0,R0,#16 � SUB R0,R0,#160 � MOV R0,R0,ASR #1 � MOV R1,R1,ASR #3 �7 SUB R1,R1,R11,ASR #1 \ get top left corner � � CMN R0,#1 � CMNGT R1,R11 � LDMLEFD R13!,{R0-R12,PC}^ � CMP R0,#640-32 CMPLE R1,#256-1 @ LDMGTFD R13!,{R0-R12,PC}^ \ discard out of range sprites CMP R1,#0 * ADDLT R11,R11,R1 4 SUBLT R10,R10,R1,LSL #4 >, MOVLT R1,#0 \ trim top H R RSB R4,R1,#256 \ CMP R11,R4 f/ MOVGT R11,R4 \ trim bottom p z LDR R9,plotscreenbase � ADD R9,R9,R1,LSL #8 � ADD R9,R9,R1,LSL #6 � BIC R1,R0,#7 �N ADD R9,R9,R1,LSR #1 \ R9 = address (in screen) to begin plotting � � MOV R12,#%1000 � �R R12,R12,R12,LSL #16 � �R R12,R12,R12,LSL #8 �H �R R12,R12,R12,LSL #4 \ R12 = � mask to isolate 'no plot' bit � � � R1,R0,#7 � ADR R0,caselist3 �R LDR R0,[R0,R1,LSL #2] \ R0 = address of code for particular shift case ADR R1,base3 ADD PC,R0,R1 $ .caselist3 . ] 8 � N%=0 � 7 B [OPT pass% L+ EQUD plotspriteacode(N%,3)-base3 V ] ` � N% j [OPT pass% t .base3 ~ ] � � N%=0 � 7 � shiftleft = N%*4 � shiftright = 32-N%*4 �5 [OPT pass% \ do 8 compilations � �9 .plotspriteacode(N%,3) \ doubles as loop start � LDMIA R10,{R0-R3} � ADD R10,R10,#128 � LDMIA R9,{R4-R8} � � ] � � M%=0 � 1 Rdata = M%*2 Rcurword = M%+4 Rnextword = M%+5 5 [OPT pass% \ for four words... ( 2' �R R14,Rdata,Rdata,LSL #1 < � R14,R12,R14 F# �R R14,R14,R14,LSR #2 P# �R R14,R14,R14,LSR #1 Z6 BIC Rcurword,Rcurword,R14,LSL #shiftleft d7 �R Rcurword,Rcurword,Rdata,LSL #shiftleft n9 BIC Rnextword,Rnextword,R14,LSR #shiftright x: �R Rnextword,Rnextword,Rdata,LSR #shiftright � ] � � M% � [OPT pass% � � STMIA R9,{R4-R8} � ADD R9,R9,#320 � � SUBS R11,R11,#1 �% BGT plotspriteacode(N%,3) � �! LDMFD R13!,{R0-R12,PC}^ � � ] � N% [OPT pass% " .plotscreenbase , EQUD 0 6 @ .spritefilebase J EQUD 0 T ^. \ Empty routine for timing test purposes h .null r MOV PC,R14 | � �. \ Fill screen area with colour bands etc � .clearscreen � STMFD R13!,{R0-R3,R14} � � MOV R0,#4 � MOV R1,#0 � LDR R3,currepq � � CMP R3,#0 � �Q R2,#256 � BLEQ fillsection � CMP R3,#1 �Q R2,#128 BLEQ fillsection CMP R3,#2 & �Q R2,#64 0 BLEQ fillsectionhalf : CMP R3,#3 D �Q R2,#32 N BLEQ fillsectionquarter X b LDMFD R13!,{R0-R3,PC}^ l v .currepq � EQUD 0 � �- \ Fill screen area with lots of sprites � .repeatdata � STMFD R13!,{R0-R12,R14} � � MOV R0,#4 � MOV R1,#0 � LDR R3,currepq � � CMP R3,#1 � BEQ rep1 � CMP R3,#2 BEQ rep2 CMP R3,#3 BEQ rep3 * LDMFD R13!,{R0-R12,PC}^ 4 > H0 \ Fill section of screen with given nibble R \ R0 = Word to insert \ \ R1 = Line to start at f \ R2 = Number of lines p .fillsection z STMFD R13!,{R0-R12,R14} �1 STR R13,r13sto \ save R13 � � MOV R14,R2 � � LDR R13,plotscreenbase � ADD R13,R13,R1,LSL #8 �H ADD R13,R13,R1,LSL #6 \ address (in screen) to start at � � � R0,R0,#%1111 � �R R0,R0,R0,LSL #4 � �R R0,R0,R0,LSL #8 �8 �R R0,R0,R0,LSL #16 \ expand into word � MOV R1,R0 MOV R2,R0 MOV R3,R0 $ MOV R4,R0 . MOV R5,R0 8 MOV R6,R0 B MOV R7,R0 L MOV R8,R0 V MOV R9,R0 ` MOV R10,R0 j? MOV R11,R0 \ set registers for fill t ~ .fsloop �1 STMIA R13!,{R0-R11} \ 48 bytes �1 STMIA R13!,{R0-R11} \ 48 bytes �1 STMIA R13!,{R0-R11} \ 48 bytes �1 STMIA R13!,{R0-R11} \ 48 bytes �1 STMIA R13!,{R0-R11} \ 48 bytes �1 STMIA R13!,{R0-R11} \ 48 bytes �1 STMIA R13!,{R0-R7} \ 32 bytes � � SUBS R14,R14,#1 � BGT fsloop � �4 LDR R13,r13sto \ recover R13 LDMFD R13!,{R0-R12,PC}^ 5 \ Fill half section of screen with given nibble \ R0 = Word to insert ( \ R1 = Line to start at 2 \ R2 = Number of lines < .fillsectionhalf F STMFD R13!,{R0-R12,R14} P1 STR R13,r13sto \ save R13 Z d MOV R14,R2 n x LDR R13,plotscreenbase � ADD R13,R13,R1,LSL #8 �H ADD R13,R13,R1,LSL #6 \ address (in screen) to start at � � � R0,R0,#%1111 � �R R0,R0,R0,LSL #4 � �R R0,R0,R0,LSL #8 �8 �R R0,R0,R0,LSL #16 \ expand into word � � MOV R1,R0 � MOV R2,R0 � MOV R3,R0 � MOV R4,R0 � MOV R5,R0 MOV R6,R0 MOV R7,R0 MOV R8,R0 " MOV R9,R0 , MOV R10,R0 6? MOV R11,R0 \ set registers for fill @ J .fsloop1 T1 STMIA R13!,{R0-R11} \ 48 bytes ^1 STMIA R13!,{R0-R11} \ 48 bytes h1 STMIA R13!,{R0-R11} \ 48 bytes r1 STMIA R13!,{R0-R3} \ 16 bytes | � ADD R13,R13,#160 � SUBS R14,R14,#1 � BGT fsloop1 � �4 LDR R13,r13sto \ recover R13 � LDMFD R13!,{R0-R12,PC}^ � �8 \ Fill quarter section of screen with given nibble � \ R0 = Word to insert � \ R1 = Line to start at � \ R2 = Number of lines � .fillsectionquarter � STMFD R13!,{R0-R12,R14} 1 STR R13,r13sto \ save R13 MOV R14,R2 & 0 LDR R13,plotscreenbase : ADD R13,R13,R1,LSL #8 DH ADD R13,R13,R1,LSL #6 \ address (in screen) to start at N X � R0,R0,#%1111 b �R R0,R0,R0,LSL #4 l �R R0,R0,R0,LSL #8 v8 �R R0,R0,R0,LSL #16 \ expand into word � � MOV R1,R0 � MOV R2,R0 � MOV R3,R0 � MOV R4,R0 � MOV R5,R0 � MOV R6,R0 � MOV R7,R0 � MOV R8,R0 � MOV R9,R0 � MOV R10,R0 �? MOV R11,R0 \ set registers for fill � .fsloop2 1 STMIA R13!,{R0-R11} \ 48 bytes 1 STMIA R13!,{R0-R7} \ 32 bytes * ADD R13,R13,#240 4 SUBS R14,R14,#1 > BGT fsloop2 H R4 LDR R13,r13sto \ recover R13 \ LDMFD R13!,{R0-R12,PC}^ f p .rep1 z STR R13,r13sto � � LDR R13,plotscreenbase � ADD R12,R13,#128*320 � MOV R14,#128 � � .reploop1 � LDMIA R13!,{R0-R11} � STMIA R12!,{R0-R11} � LDMIA R13!,{R0-R11} � STMIA R12!,{R0-R11} � LDMIA R13!,{R0-R11} � STMIA R12!,{R0-R11} � LDMIA R13!,{R0-R11} STMIA R12!,{R0-R11} LDMIA R13!,{R0-R11} STMIA R12!,{R0-R11} $ LDMIA R13!,{R0-R11} . STMIA R12!,{R0-R11} 8 LDMIA R13!,{R0-R7} B STMIA R12!,{R0-R7} L SUBS R14,R14,#1 V BGT reploop1 ` j LDR R13,r13sto t LDMFD R13!,{R0-R12,PC}^ ~ � .rep2 � STR R13,r13sto � � LDR R13,plotscreenbase � MOV R14,#64 � � .reploop2 � LDMIA R13!,{R0-R11} � ADD R12,R13,#160-48 � STMIA R12,{R0-R11} � ADD R12,R12,#320*64 � STMIA R12,{R0-R11} ADD R12,R12,#320*64 STMIA R12,{R0-R11} ADD R12,R12,#320*64 STMIA R12,{R0-R11} ( SUB R12,R12,#160 2 STMIA R12,{R0-R11} < SUB R12,R12,#320*64 F STMIA R12,{R0-R11} P SUB R12,R12,#320*64 Z STMIA R12,{R0-R11} d LDMIA R13!,{R0-R11} n ADD R12,R13,#160-48 x STMIA R12,{R0-R11} � ADD R12,R12,#320*64 � STMIA R12,{R0-R11} � ADD R12,R12,#320*64 � STMIA R12,{R0-R11} � ADD R12,R12,#320*64 � STMIA R12,{R0-R11} � SUB R12,R12,#160 � STMIA R12,{R0-R11} � SUB R12,R12,#320*64 � STMIA R12,{R0-R11} � SUB R12,R12,#320*64 � STMIA R12,{R0-R11} � LDMIA R13!,{R0-R11} ADD R12,R13,#160-48 STMIA R12,{R0-R11} ADD R12,R12,#320*64 " STMIA R12,{R0-R11} , ADD R12,R12,#320*64 6 STMIA R12,{R0-R11} @ ADD R12,R12,#320*64 J STMIA R12,{R0-R11} T SUB R12,R12,#160 ^ STMIA R12,{R0-R11} h SUB R12,R12,#320*64 r STMIA R12,{R0-R11} | SUB R12,R12,#320*64 � STMIA R12,{R0-R11} � LDMIA R13!,{R0-R3} � ADD R12,R13,#160-16 � STMIA R12,{R0-R3} � ADD R12,R12,#320*64 � STMIA R12,{R0-R3} � ADD R12,R12,#320*64 � STMIA R12,{R0-R3} � ADD R12,R12,#320*64 � STMIA R12,{R0-R3} � SUB R12,R12,#160 � STMIA R12,{R0-R3} � SUB R12,R12,#320*64 STMIA R12,{R0-R3} SUB R12,R12,#320*64 STMIA R12,{R0-R3} & 0 ADD R13,R13,#160 : SUBS R14,R14,#1 D BGT reploop2 N LDR R13,r13sto X LDMFD R13!,{R0-R12,PC}^ b l .rep3 v STR R13,r13sto � � LDR R13,plotscreenbase � MOV R14,#32 � � .reploop3 � LDMIA R13!,{R0-R11} �4 ADD R12,R13,#80-48:STMIA R12,{R0-R11} �1 ADD R12,R12,#80:STMIA R12,{R0-R11} �1 ADD R12,R12,#80:STMIA R12,{R0-R11} �5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} �1 SUB R12,R12,#80:STMIA R12,{R0-R11} �1 SUB R12,R12,#80:STMIA R12,{R0-R11} �1 SUB R12,R12,#80:STMIA R12,{R0-R11} !5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} !1 ADD R12,R12,#80:STMIA R12,{R0-R11} !1 ADD R12,R12,#80:STMIA R12,{R0-R11} ! 1 ADD R12,R12,#80:STMIA R12,{R0-R11} !*5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} !41 SUB R12,R12,#80:STMIA R12,{R0-R11} !>1 SUB R12,R12,#80:STMIA R12,{R0-R11} !H1 SUB R12,R12,#80:STMIA R12,{R0-R11} !R5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} !\1 ADD R12,R12,#80:STMIA R12,{R0-R11} !f1 ADD R12,R12,#80:STMIA R12,{R0-R11} !p1 ADD R12,R12,#80:STMIA R12,{R0-R11} !z5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} !�1 SUB R12,R12,#80:STMIA R12,{R0-R11} !�1 SUB R12,R12,#80:STMIA R12,{R0-R11} !�1 SUB R12,R12,#80:STMIA R12,{R0-R11} !�5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} !�1 ADD R12,R12,#80:STMIA R12,{R0-R11} !�1 ADD R12,R12,#80:STMIA R12,{R0-R11} !�1 ADD R12,R12,#80:STMIA R12,{R0-R11} !�5 ADD R12,R12,#320*32:STMIA R12,{R0-R11} !�1 SUB R12,R12,#80:STMIA R12,{R0-R11} !�1 SUB R12,R12,#80:STMIA R12,{R0-R11} !�1 SUB R12,R12,#80:STMIA R12,{R0-R11} !� LDMIA R13!,{R0-R7} !�3 ADD R12,R13,#80-32:STMIA R12,{R0-R7} "0 ADD R12,R12,#80:STMIA R12,{R0-R7} "0 ADD R12,R12,#80:STMIA R12,{R0-R7} "4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} "$0 SUB R12,R12,#80:STMIA R12,{R0-R7} ".0 SUB R12,R12,#80:STMIA R12,{R0-R7} "80 SUB R12,R12,#80:STMIA R12,{R0-R7} "B4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} "L0 ADD R12,R12,#80:STMIA R12,{R0-R7} "V0 ADD R12,R12,#80:STMIA R12,{R0-R7} "`0 ADD R12,R12,#80:STMIA R12,{R0-R7} "j4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} "t0 SUB R12,R12,#80:STMIA R12,{R0-R7} "~0 SUB R12,R12,#80:STMIA R12,{R0-R7} "�0 SUB R12,R12,#80:STMIA R12,{R0-R7} "�4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} "�0 ADD R12,R12,#80:STMIA R12,{R0-R7} "�0 ADD R12,R12,#80:STMIA R12,{R0-R7} "�0 ADD R12,R12,#80:STMIA R12,{R0-R7} "�4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} "�0 SUB R12,R12,#80:STMIA R12,{R0-R7} "�0 SUB R12,R12,#80:STMIA R12,{R0-R7} "�0 SUB R12,R12,#80:STMIA R12,{R0-R7} "�4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} "�0 ADD R12,R12,#80:STMIA R12,{R0-R7} "�0 ADD R12,R12,#80:STMIA R12,{R0-R7} # 0 ADD R12,R12,#80:STMIA R12,{R0-R7} # 4 ADD R12,R12,#320*32:STMIA R12,{R0-R7} #0 SUB R12,R12,#80:STMIA R12,{R0-R7} #0 SUB R12,R12,#80:STMIA R12,{R0-R7} #(0 SUB R12,R12,#80:STMIA R12,{R0-R7} #2 ADD R13,R13,#240 #< SUBS R14,R14,#1 #F BGT reploop3 #P LDR R13,r13sto #Z LDMFD R13!,{R0-R12,PC}^ #d #n #x .r13sto #� EQUD 0 #� #�2 \ Routine to plot any sphere in normal range #�, \ R0 points to pos vector, size (0-13) #� .gensphere #� STMFD R13!,{R0-R12,R14} #� #� LDMIA R0,{R0-R3} #� #� CMP R3,#1 #� LDMLEFD R13!,{R0-R12,PC}^ #� #� MOV R0,R0,ASR #7 $2 ADD R0,R0,#xorigin \ Translate X $ $ ADD R1,R1,R1,ASR #3 $" MOV R1,R1,ASR #8 $,2 RSB R1,R1,#yorigin \ Translate Y $6 $@, MOV R2,#18 \ height 18 $J $T LDR R5,spritefilebase $^ MOV R4,#288 $h SUB R3,R3,#2 $r> MLA R3,R4,R3,R5 \ point to appropriate sphere $| $�' BL plotspritea \ plot $� $� LDMFD R13!,{R0-R12,PC}^ $� $� \ Routine to plot head $�+ \ R0 points to pos vector, expression $� .head $� STMFD R13!,{R0-R12,R14} $� $� LDMIA R0,{R0-R3} $� $� MOV R0,R0,ASR #7 $�2 ADD R0,R0,#xorigin-16 \ Translate X % % ADD R1,R1,R1,ASR #3 % MOV R1,R1,ASR #8 %&2 RSB R1,R1,#yorigin \ Translate Y %0 %:, MOV R2,#36 \ height 36 %D %N LDR R5,spritefilebase %X MOV R4,#288 %b ADD R3,R3,R3,LSL #3 %l ADD R3,R3,#268 %v> MLA R3,R4,R3,R5 \ point to appropriate sprite %� %�, BL plotspritea \ plot left %� %� ADD R3,R3,#288*2 %� ADD R0,R0,#32 %�- BL plotspritea \ plot right %� %� LDMFD R13!,{R0-R12,PC}^ %� %�G \ Bungie line routine draws line with a sphere size 10 at far end %�; \ R0 points to vector A, vector B, length as in table %� .bungieline %� STMFD R13!,{R0-R12,R14} & & MOV R12,R0 & LDMIA R0,{R0-R6} & &* MLA R0,R3,R6,R0 &4 MLA R1,R4,R6,R1 &>0 MLA R2,R5,R6,R2 \ Go to far end &H &R MOV R0,R0,ASR #7 &\2 ADD R0,R0,#xorigin \ Translate X &f &p ADD R1,R1,R1,ASR #3 &z MOV R1,R1,ASR #8 &�2 RSB R1,R1,#yorigin \ Translate Y &� &�, MOV R2,#18 \ height 18 &� &� LDR R5,spritefilebase &� MOV R4,#288 &� MOV R3,#10-2 &�> MLA R3,R4,R3,R5 \ point to appropriate sphere &� &�' BL plotspritea \ plot &� &� MOV R0,R12 &� B linesideentry ' '5 \ Routine to put line stating at A, dir B in 3d '; \ R0 points to vector A, vector B, length as in table '$ .line '. STMFD R13!,{R0-R12,R14} '8 'B .linesideentry 'L 'V LDMIA R0,{R4-R10} '` 'j CMP R10,#0 't LDMEQFD R13!,{R0-R12,PC}^ '~ RSBLT R7,R7,#0 '� RSBLT R8,R8,#0 '� RSBLT R9,R9,#0 '� RSBLT R10,R10,#0 '� '� CMP R9,#0 '� BLE lineforwards '� MLA R4,R7,R10,R4 '� MLA R5,R8,R10,R5 '� RSB R7,R7,#0 '�A RSB R8,R8,#0 \ ensure line goes toward viewer '� .lineforwards '� ( ADD R4,R4,R7,ASR #1 ( 9 ADD R5,R5,R8,ASR #1 \ add half a unit to pos ( ( LDR R1,mulconst (( (2 RSB R11,R7,#2560+160 (< MUL R11,R1,R11 (F( MOV R11,R11,ASR #25 \ column (P (Z ADD R12,R8,#2560+160 (d MUL R12,R1,R12 (n% MOV R12,R12,ASR #25 \ row (x (� �R R0,R11,R12 (� TST R0,#16 (� RSBNE R11,R11,#16 (�R RSBNE R12,R12,#16 \ if either go above 15 wrap round by inverting BOTH (� (� LDR R14,linetype (� CMP R14,#0 (� ADDEQ R3,R11,#12 (� ADDEQ R3,R3,R12,LSL #4 (� MOVNE R3,#8 (� LDR R0,spritefilebase (� MOV R1,#288 (�D MLA R3,R1,R3,R0 \ point to appropriate line section ), MOV R2,#18 \ height 18 ) ) .lloop )" MOV R0,R4,ASR #7 ),4 ADD R0,R0,#xorigin \ Translate X )6 )@ ADD R1,R5,R5,ASR #3 )J MOV R1,R1,ASR #8 )T4 RSB R1,R1,#yorigin \ Translate Y )^ )h) BL plotspritea \ plot )r )| ADD R4,R4,R7 )�4 ADD R5,R5,R8 \ add unit to pos )� )� SUBS R10,R10,#1 )� BGT lloop )� )� LDMFD R13!,{R0-R12,PC}^ )� )� .mulconst )� EQUD 104858 )� )� .plottabqind )� EQUD plottabq )� *$ \ Routine to draw funky dancer * .drawperson * STMFD R13!,{R0-R12,R14} *& *0 MOV R0,#0 *: LDR R1,plottabqind *D STR R0,[R1] *N *X ADR R0,torsopos *b ADR R1,torsotrans *l ADR R2,realpos *v BL transform *� *� ADR R0,vectemp *� ADR R1,torsotrans *� ADR R2,minusunitvec *� BL transform *� ADR R0,temppos *� ADR R1,vectemp *� MOV R2,#752 *� ADR R3,torsopos *� BL vectormla *� ADR R1,vectemp *� ADR R0,temppos *� MOV R2,#1 + BL logline + ADR R0,temppos + ADR R1,vectemp + MOV R2,#1*1024 +* ADD R2,R2,#752+1504 +4 ADR R3,torsopos +>( BL vectormla \ neck +H +R ADR R0,temppos +\ MOV R1,#0 +f BL loghead +p +z ADR R0,vectemp +� ADR R1,torsotrans +� ADR R2,sidewaysvec +� BL transform +� ADR R0,temppos +� ADR R1,vectemp +� MVN R2,#1328 +� ADR R3,torsopos +� BL vectormla +� ADR R0,mattemp1 +� ADR R1,lshouldertrans +� ADR R2,torsotrans +�. BL multiply \ left shoulder +� , ADR R0,vectemp , ADR R1,mattemp1 , ADR R2,unitvec ,$ BL transform ,. ADR R0,temppos ,8 ADR R1,vectemp ,B MOV R2,#5*1024 ,L. ADR R3,temppos \ left upper arm ,V BL vectormla ,` ADR R0,temppos ,j ADR R1,vectemp ,t MVN R2,#� (-5) ,~ BL logbungieline ,� ,� ADR R0,mattemp2 ,� ADR R1,lelbowtrans ,� ADR R2,mattemp1 ,�+ BL multiply \ left elbow ,� ,� ADR R0,vectemp ,� ADR R1,mattemp2 ,� ADR R2,unitvec ,� BL transform ,� ADR R0,temppos ,� ADR R1,vectemp - MOV R2,#5 - . BL logbungieline \ left lower arm - - ADR R0,vectemp -( ADR R1,torsotrans -2 ADR R2,sidewaysvec -< BL transform -F ADR R0,temppos -P ADR R1,vectemp -Z MOV R2,#1328 -d ADR R3,torsopos -n BL vectormla -x ADR R0,mattemp1 -� ADR R1,rshouldertrans -� ADR R2,torsotrans -�/ BL multiply \ right shoulder -� -� ADR R0,vectemp -� ADR R1,mattemp1 -� ADR R2,unitvec -� BL transform -� ADR R0,temppos -� ADR R1,vectemp -� MOV R2,#5*1024 -�/ ADR R3,temppos \ right upper arm -� BL vectormla . ADR R0,temppos . ADR R1,vectemp . MVN R2,#� (-5) ." BL logbungieline ., .6 ADR R0,mattemp2 .@ ADR R1,relbowtrans .J ADR R2,mattemp1 .T, BL multiply \ right elbow .^ .h ADR R0,vectemp .r ADR R1,mattemp2 .| ADR R2,unitvec .� BL transform .� ADR R0,temppos .� ADR R1,vectemp .� MOV R2,#5 .�0 BL logbungieline \ right lower arm .� .� ADR R0,vectemp .� ADR R1,torsotrans .� ADR R2,unitvec .� BL transform .� ADR R0,temppos .� ADR R1,vectemp .� MOV R2,#752 / ADR R3,torsopos / BL vectormla / ADR R1,vectemp /& ADR R0,temppos /0 MOV R2,#4 /: BL logline /D ADR R0,bumpos /N ADR R1,vectemp /X MOV R2,#4*1024 /b ADD R2,R2,#2*752 /l ADR R3,torsopos /v) BL vectormla \ torso /� /� ADR R0,vectemp /� ADR R1,torsotrans /� ADR R2,sidewaysvec /� BL transform /� ADR R0,temppos /� ADR R1,vectemp /� MVN R2,#1328 /� ADR R3,bumpos /� BL vectormla /� ADR R0,mattemp1 /� ADR R1,lhiptrans /� ADR R2,torsotrans 0, BL multiply \ left hip 0 0 ADR R0,vectemp 0 ADR R1,mattemp1 0* ADR R2,unitvec 04 BL transform 0> ADR R0,temppos 0H ADR R1,vectemp 0R MOV R2,#5*1024 0\ ADR R3,temppos 0f- BL vectormla \ left thigh 0p ADR R1,vectemp 0z ADR R0,temppos 0� MVN R2,#� (-5) 0� BL logbungieline 0� 0� ADR R0,mattemp2 0� ADR R1,lkneetrans 0� ADR R2,mattemp1 0�- BL multiply \ left knee 0� 0� ADR R0,vectemp 0� ADR R1,mattemp2 0� ADR R2,unitvec 0� BL transform 0� ADR R1,vectemp 1 ADR R0,temppos 1 MOV R2,#5 1, BL logbungieline \ left calf 1$ 1. ADR R0,vectemp 18 ADR R1,torsotrans 1B ADR R2,sidewaysvec 1L BL transform 1V ADR R0,temppos 1` ADR R1,vectemp 1j MOV R2,#1328 1t ADR R3,bumpos 1~ BL vectormla 1� ADR R0,mattemp1 1� ADR R1,rhiptrans 1� ADR R2,torsotrans 1�- BL multiply \ right hip 1� 1� ADR R0,vectemp 1� ADR R1,mattemp1 1� ADR R2,unitvec 1� BL transform 1� ADR R0,temppos 1� ADR R1,vectemp 1� MOV R2,#5*1024 2 ADR R3,temppos 2 / BL vectormla \ right thigh 2 ADR R1,vectemp 2 ADR R0,temppos 2( MVN R2,#� (-5) 22 BL logbungieline 2< 2F ADR R0,mattemp2 2P ADR R1,rkneetrans 2Z ADR R2,mattemp1 2d. BL multiply \ right knee 2n 2x ADR R0,vectemp 2� ADR R1,mattemp2 2� ADR R2,unitvec 2� BL transform 2� ADR R1,vectemp 2� ADR R0,temppos 2� MOV R2,#5 2�. BL logbungieline \ right calf 2� 2� ADR R0,torsopos 2� MOV R1,#13 2� BL logsphere 2� 2� ADR R0,bumpos 3 MOV R1,#13 3 BL logsphere 3 3" BL spinningspheres 3, BL display 36 BL repeatdata 3@ 3J LDMFD R13!,{R0-R12,PC}^ 3T 3^ .vectemp 3h- EQUD 0 :EQUD 0 :EQUD 0 3r 3| .temppos 3�- EQUD 0 :EQUD 0 :EQUD 0 3� 3� .mattemp1 3�- EQUD 0 :EQUD 0 :EQUD 0 3�- EQUD 0 :EQUD 0 :EQUD 0 3�- EQUD 0 :EQUD 0 :EQUD 0 3� 3� .mattemp2 3�- EQUD 0 :EQUD 0 :EQUD 0 3�- EQUD 0 :EQUD 0 :EQUD 0 3�- EQUD 0 :EQUD 0 :EQUD 0 3� 3�F .unitvec \ transform this vector to get direction of line 4- EQUD 0 :EQUD 2560 :EQUD 0 4 4R .minusunitvec \ transform this vector to get opposite to direction of line 4&- EQUD 0 :EQUD -2560 :EQUD 0 40 4:H .sidewaysvec \ transform this vector to get a sideways directon 4D- EQUD 2560 :EQUD 0 :EQUD 0 4N 4X .torsopos 4b- EQUD 0 :EQUD 0 :EQUD 0 4l 4v .bumpos 4�- EQUD 0 :EQUD 0 :EQUD 0 4� 4� .changeabledata 4� .realpos 4�7 EQUD 0 :EQUD 0 :EQUD 0 \set 4� 4� .torsotrans 4�7 EQUD 0 :EQUD -32768:EQUD 0 \set 4�- EQUD -32768:EQUD 0 :EQUD 0 4�1 EQUD 0 :EQUD 0 :EQUD 32768 4� 4� .lshouldertrans 4�7 EQUD 28596 :EQUD 16000 :EQUD 0 \set 5- EQUD -16000:EQUD 28596 :EQUD 0 51 EQUD 0 :EQUD 0 :EQUD 32768 5 5 .lelbowtrans 5*7 EQUD 31776 :EQUD -8000 :EQUD 0 \set 54- EQUD 8000 :EQUD 31776 :EQUD 0 5>1 EQUD 0 :EQUD 0 :EQUD 32768 5H 5R .rshouldertrans 5\7 EQUD 28596 :EQUD -16000:EQUD 0 \set 5f- EQUD 16000 :EQUD 28596 :EQUD 0 5p1 EQUD 0 :EQUD 0 :EQUD 32768 5z 5� .relbowtrans 5�7 EQUD 31776 :EQUD 8000 :EQUD 0 \set 5�- EQUD -8000 :EQUD 31776 :EQUD 0 5�1 EQUD 0 :EQUD 0 :EQUD 32768 5� 5� .lhiptrans 5�7 EQUD 31776 :EQUD 8000 :EQUD 0 \set 5�- EQUD -8000 :EQUD 31776 :EQUD 0 5�1 EQUD 0 :EQUD 0 :EQUD 32768 5� 5� .lkneetrans 5�7 EQUD 32768 :EQUD 0 :EQUD 0 \set 5�- EQUD 0 :EQUD 32768 :EQUD 0 61 EQUD 0 :EQUD 0 :EQUD 32768 6 6 .rhiptrans 6$7 EQUD 31776 :EQUD -8000 :EQUD 0 \set 6.- EQUD 8000 :EQUD 31776 :EQUD 0 681 EQUD 0 :EQUD 0 :EQUD 32768 6B 6L .rkneetrans 6V7 EQUD 32768 :EQUD 0 :EQUD 0 \set 6`- EQUD 0 :EQUD 32768 :EQUD 0 6j1 EQUD 0 :EQUD 0 :EQUD 32768 6t 6~ .identity 6�- EQUD 32768 :EQUD 0 :EQUD 0 6�- EQUD 0 :EQUD 32768 :EQUD 0 6�1 EQUD 0 :EQUD 0 :EQUD 32768 6� 6� .spin1 6�1 EQUD cos% :EQUD 0 :EQUD -sin% 6�- EQUD 0 :EQUD 32768 :EQUD 0 6�0 EQUD sin% :EQUD 0 :EQUD cos% 6� 6� .spin2 6�- EQUD cos% :EQUD -sin% :EQUD 0 6�- EQUD sin% :EQUD cos% :EQUD 0 7 1 EQUD 0 :EQUD 0 :EQUD 32768 7 7 .spin3 7- EQUD 32768 :EQUD 0 :EQUD 0 7(1 EQUD 0 :EQUD cos% :EQUD -sin% 720 EQUD 0 :EQUD sin% :EQUD cos% 7< 7F .spin1b 7P0 EQUD cos% :EQUD 0 :EQUD sin% 7Z- EQUD 0 :EQUD 32768 :EQUD 0 7d0 EQUD -sin% :EQUD 0 :EQUD cos% 7n 7x .spin2b 7�- EQUD cos% :EQUD sin% :EQUD 0 7�- EQUD -sin% :EQUD cos% :EQUD 0 7�1 EQUD 0 :EQUD 0 :EQUD 32768 7� 7� .spin3b 7�- EQUD 32768 :EQUD 0 :EQUD 0 7�0 EQUD 0 :EQUD cos% :EQUD sin% 7�0 EQUD 0 :EQUD -sin% :EQUD cos% 7� 7�3 .angletab0 \ normal prone position 7� EQUB 0 \ sideways 7�' EQUB 0 \ height realpos 7� EQUB 10 \ tilt 8* EQUB 0 \ rot torsotrans 8 EQUB 20 \ tilt 8. EQUB 248 \ rot lshouldertrans 8" EQUB 34 \ tilt 8,+ EQUB 73 \ rot lelbowtrans 86 EQUB 20 \ tilt 8@. EQUB 120 \ rot rshouldertrans 8J EQUB 222 \ tilt 8T+ EQUB 73 \ rot relbowtrans 8^ EQUB 24 \ tilt 8h) EQUB 36 \ rot lhiptrans 8r EQUB 24 \ tilt 8|* EQUB 128 \ rot lkneetrans 8� EQUB 24 \ tilt 8�) EQUB 92 \ rot rhiptrans 8� EQUB 24 \ tilt 8�* EQUB 128 \ rot rkneetrans 8� 8�, .angletab1 \ 'getting down' 8� EQUB 0 \ sideways 8�' EQUB 84 \ height realpos 8� EQUB 10 \ tilt 8�* EQUB 0 \ rot torsotrans 8� EQUB 38 \ tilt 8�. EQUB 248 \ rot lshouldertrans 8� EQUB 84 \ tilt 9+ EQUB 73 \ rot lelbowtrans 9 EQUB 38 \ tilt 9. EQUB 120 \ rot rshouldertrans 9& EQUB 172 \ tilt 90+ EQUB 73 \ rot relbowtrans 9: EQUB 52 \ tilt 9D) EQUB 36 \ rot lhiptrans 9N EQUB 80 \ tilt 9X* EQUB 128 \ rot lkneetrans 9b EQUB 52 \ tilt 9l) EQUB 92 \ rot rhiptrans 9v EQUB 80 \ tilt 9�* EQUB 128 \ rot rkneetrans 9� 9�! .angletab2 \ yeh 9� EQUB 0 \ sideways 9�' EQUB 84 \ height realpos 9� EQUB 10 \ tilt 9�* EQUB 0 \ rot torsotrans 9� EQUB 38 \ tilt 9�. EQUB 248 \ rot lshouldertrans 9� EQUB 84 \ tilt 9�+ EQUB 73 \ rot lelbowtrans 9� EQUB 120 \ tilt 9�. EQUB 120 \ rot rshouldertrans : EQUB 224 \ tilt :+ EQUB 180 \ rot relbowtrans : EQUB 52 \ tilt : ) EQUB 36 \ rot lhiptrans :* EQUB 80 \ tilt :4* EQUB 128 \ rot lkneetrans :> EQUB 52 \ tilt :H) EQUB 92 \ rot rhiptrans :R EQUB 80 \ tilt :\* EQUB 128 \ rot rkneetrans :f :p) .angletab3 \ foot raised :z EQUB 0 \ sideways :�' EQUB 0 \ height realpos :� EQUB 10 \ tilt :�* EQUB 0 \ rot torsotrans :� EQUB 20 \ tilt :�. EQUB 248 \ rot lshouldertrans :� EQUB 34 \ tilt :�+ EQUB 73 \ rot lelbowtrans :� EQUB 20 \ tilt :�. EQUB 120 \ rot rshouldertrans :� EQUB 222 \ tilt :�+ EQUB 73 \ rot relbowtrans :� EQUB 30 \ tilt :�) EQUB 36 \ rot lhiptrans ; EQUB 36 \ tilt ;* EQUB 128 \ rot lkneetrans ; EQUB 24 \ tilt ;$) EQUB 92 \ rot rhiptrans ;. EQUB 24 \ tilt ;8* EQUB 128 \ rot rkneetrans ;B ;L) .angletab4 \ foot raised ;V EQUB 0 \ sideways ;`' EQUB 0 \ height realpos ;j EQUB 10 \ tilt ;t* EQUB 0 \ rot torsotrans ;~ EQUB 38 \ tilt ;�. EQUB 248 \ rot lshouldertrans ;� EQUB 84 \ tilt ;�+ EQUB 73 \ rot lelbowtrans ;� EQUB 38 \ tilt ;�. EQUB 120 \ rot rshouldertrans ;� EQUB 172 \ tilt ;�+ EQUB 73 \ rot relbowtrans ;� EQUB 30 \ tilt ;�) EQUB 36 \ rot lhiptrans ;� EQUB 36 \ tilt ;�* EQUB 128 \ rot lkneetrans ;� EQUB 24 \ tilt <