   10REM > H3D
   20LIBRARY "FNDEFS"
   30StepA      = 2
   40StepB      = 3
   50StepC      = 5
   60Distance   = &300
   70LowX  = &000
   80HighX = &140
   90LowY  = &000
  100HighY = &100
  110LineWidth = &A0
  120R0  =  0 : R1  =  1 : R2  =  2 : R3  =  3
  130R4  =  4 : R5  =  5 : R6  =  6 : R7  =  7
  140R8  =  8 : R9  =  9 : R10 = 10 : R11 = 11
  150R12 = 12 : R13 = 13 : R14 = 14 : R15 = 15
  160VP  = R12
  170SP  = R13
  180LK  = R14
  190PC  = R15
  200Vflag = 1<<28
  210Cflag = 1<<29
  220Zflag = 1<<30
  230Nflag = 1<<31
  240EQ% = &0<<28     :REM Z
  250NE% = &1<<28     :REM ~Z
  260CS% = &2<<28     :REM C
  270CC% = &3<<28     :REM ~C
  280MI% = &4<<28     :REM N
  290PL% = &5<<28     :REM ~N
  300VS% = &6<<28     :REM V
  310VC% = &7<<28     :REM ~V
  320HI% = &8<<28     :REM C & ~Z
  330LS% = &9<<28     :REM ~C | Z
  340GE% = &A<<28     :REM (N &  V) | (~N & ~V)
  350LT% = &B<<28     :REM (N & ~V) | (~N &  V)
  360GT% = &C<<28     :REM (N & V & ~Z) | (~N & ~V & ~Z)
  370LE% = &D<<28     :REM (N & ~V) | (~N &  V) | Z
  380AL% = &E<<28     :REM 1
  390NV% = &F<<28     :REM 0
  400HS% = CS% : LO% = CC%
  410P_EndPath = 0
  420P_MoveTo  = 2
  430P_LineTo  = 8
  440RS%=0
  450CT_DX     = FN_RSW
  460CT_Yend   = FN_RSW
  470CT_Ystart = FN_RSW
  480CT_Xinit  = FN_RSW
  490CT_Size   = RS%
  500                                    : Temp  = R0
  510LinePtr    = R1  : FreeSpace  = R1
  520                 : ETindex    = R2  : Temp0 = R2 : LastMask  = R2
  530Left       = R3  : ClipLeftX  = R3  : Temp1 = R3 : FirstMask = R3
  540Right      = R4  : ClipRightX = R4  : Temp2 = R4 : Width     = R4
  550LeftX      = R5                     : Temp3 = R5
  560RightX     = R6
  570Colour     = R7
  580Ptr        = R8  : minx       = R8
  590LPtr       = R9  : maxx       = R9
  600CurrY      = R10 : miny       = R10
  610BottY      = R11 : maxy       = R11
  620FPtr       = R12
  630OS_WriteI = &100
  640Sort_Buffer      = &4000
  650Sort_BufferEnd   = &5000
  660OS_Buffer        = &5000
  670OS_BufferEnd     = &8000
  680Path             = OS_Buffer
  690RS%=0
  700AngleA           = FN_RSW
  710AngleB           = FN_RSW
  720AngleC           = FN_RSW
  730Bank             = FN_RSB
  740Path_End         = FN_RSW
  750Sort_End         = FN_RSW
  760ScreenStart      = FN_RSD
  770RR_SolidColour   = FN_RSW
  780RR_FirstScanline = FN_RSW
  790RR_FreeSpace     = FN_RSW
  800RR_ETindex       = FN_RSW
  810RR_Xmin          = FN_RSW
  820RR_Xmax          = FN_RSW
  830RR_Ymin          = FN_RSW
  840RR_Ymax          = FN_RSW
  850VarsLength = RS%
  860DIM Code% &10000
  870L%=Code%+&10000
  880FOR Pass=8 TO 10 STEP 2
  890P%=Code%
  900[ OPT Pass
  910        DCD     EnableEvent - Code%
  920        DCD     Rotate - Code%
  930        DCD     DisableEvent - Code%
  940.Vertices     DCD 0
  950.VerticesSize DCD 0
  960.Faces        DCD 0
  970.NewVertices  DCD 0
  975        DCD     WaitCount - Code%
  980]
  990REM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 1000VarBlock = P%
 1010P%+=VarsLength
 1020REM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 1030[ OPT Pass
 1040.Rotate STMFD   SP !,{LK}
 1050        FN_ADR( VP,VarBlock )
 1060        MOV     R0,#&79
 1070        MOV     R1,#&81
 1080        SWI     "OS_Byte"
 1090        TEQ     R1,#&FF
 1100        BNE     nowait
 1110        MOV     R3,#20
 1120.loop       MOV     R0,#&13
 1130            SWI     "OS_Byte"
 1140            SUBS    R3,R3,#1
 1150            BNE     loop
 1160.nowait MOV     R0,#&79
 1170.loop       MOV     R1,#&80
 1180            SWI     "OS_Byte"
 1190            TEQ     R1,#&FF
 1200            BEQ     loop
 1210        LDR     R0,WaitCount
 1220        STR     R0,EventCount
 1230.repeat FN_ADR( R11,CosTable )
 1240        ADD     LK,VP,#AngleA
 1250        LDMIA   LK,{R0-R2}
 1260        LDR     R4,[R11,R0,LSL#2]       ; 00.16 COS A
 1270        LDR     R5,[R11,R1,LSL#2]       ; 00.16 COS B
 1280        LDR     R6,[R11,R2,LSL#2]       ; 00.16 COS C
 1290        SUBS    R7,R0,#90*4             ; 90-A
 1300        ADDMI   R7,R7,#360*4
 1310        SUBS    R8,R1,#90*4             ; 90-B
 1320        ADDMI   R8,R8,#360*4
 1330        SUBS    R9,R2,#90*4             ; 90-C
 1340        ADDMI   R9,R9,#360*4
 1350        LDR     R7,[R11,R7,LSL#2]       ; 00.16 SIN A = COS(90-A)
 1360        LDR     R8,[R11,R8,LSL#2]       ; 00.16 SIN B = COS(90-B)
 1370        LDR     R9,[R11,R9,LSL#2]       ; 00.16 SIN C = COS(90-C)
 1380        SUBS    R0,R0,#StepA
 1390        ADDMI   R0,R0,#360*4
 1400        SUBS    R1,R1,#StepB
 1410        ADDMI   R1,R1,#360*4
 1420        SUBS    R2,R2,#StepC
 1430        ADDMI   R2,R2,#360*4
 1440        STMIA   LK,{R0-R2}
 1450        STMFD   SP !,{VP}
 1460        LDR     R10, Vertices     ;ADR     R10,Vertices
 1470        LDR     R11, NewVertices  ;FN_ADR( R11,NewVertices )
 1480        LDR     R12, VerticesSize ;MOV     R12,    #EndVertices-Vertices AND &00FF
 1490                                  ;ORR     R12,R12,#EndVertices-Vertices AND &FF00
 1500.loop       LDMIA   R10!,{R0-R2}        ; 10.00 X,Y,Z
 1510            MOV     R0,R0,ASL#6         ; 10.06
 1520            MOV     R1,R1,ASL#6         ; 10.06
 1530            MOV     R2,R2,ASL#6         ; 10.06
 1540            MUL     R3,R0,R4            ; 10.22 X.CA
 1550            MUL     LK,R1,R7            ; 10.22 Y.SA
 1560            SUB     R3,R3,LK            ; 10.22 X.CA-Y.SA
 1570            MUL     LK,R0,R7            ; 10.22 X.SA
 1580            MLA     LK,R1,R4,LK         ; 10.22 X.SA+Y.CA
 1590            MOV     R0,R3,ASR#16        ; 10.06 X=X.CA-Y.SA
 1600            MOV     R1,LK,ASR#16        ; 10.06 Y=X.SA+Y.CA
 1610            MUL     R3,R1,R5            ; 10.22 Y.CB
 1620            MUL     LK,R2,R8            ; 10.22 Z.SB
 1630            SUB     R3,R3,LK            ; 10.22 Y.CB-Z.SB
 1640            MUL     LK,R1,R8            ; 10.22 Y.SB
 1650            MLA     LK,R2,R5,LK         ; 10.22 Y.SB+Z.CB
 1660            MOV     R1,R3,ASR#16        ; 10.06 Y=Y.CB-Z.SB
 1670            MOV     R2,LK,ASR#16        ; 10.06 Z=Y.SB+Z.CB
 1680            MUL     R3,R2,R6            ; 10.22 Z.CC
 1690            MUL     LK,R0,R9            ; 10.22 X.SC
 1700            SUB     R3,R3,LK            ; 10.22 Z.CC-X.SC
 1710            MUL     LK,R2,R9            ; 10.22 Z.SC
 1720            MLA     LK,R0,R6,LK         ; 10.22 Z.SC+X.CC
 1730            MOV     R2,R3,ASR#16        ; 10.06 Z=Z.SC+X.CC
 1740            MOV     R0,LK,ASR#16        ; 10.06 X=Z.CC-X.SC
 1750            ADD     R2,R2,#Distance<<6
 1760            MUL     R0,R2,R0            ; 20.12
 1770            MUL     R1,R2,R1            ; 20.12
 1780            SUB     R2,R2,#Distance<<6
 1790            MOV     R0,R0,ASR#6         ; 16.16
 1800            MOV     R1,R1,ASR#6         ; 16.16
 1810            MOV     R2,R2,ASL#10-2      ; 16.16
 1820            ADD     R0,R0,#160<<16
 1830            RSB     R1,R1,#128<<16
 1840            STMIA   R11!,{R0-R2,LK}
 1850            SUBS    R12,R12,#12
 1860            BNE     loop
 1870        LDMFD   SP !,{VP}
 1880        MOV     R0,#&13
 1890        SWI     "OS_Byte"
 1900        MOV     R0,#&71
 1910        LDRB    R1,[VP,#Bank]
 1920        SWI     "OS_Byte"
 1930        MOV     R0,#&70
 1940        LDRB    R1,[VP,#Bank]
 1950        EOR     R1,R1,#3
 1960        STRB    R1,[VP,#Bank]
 1970        SWI     "OS_Byte"
 1980        SWI     OS_WriteI+&0C
 1990        ADR     R0,Iblock
 2000        ADD     R1,VP,#ScreenStart
 2010        SWI     "OS_ReadVduVariables"
 2020        MOV     R8,#Sort_Buffer
 2030        STR     R8,[VP,#Sort_End]
 2040        LDR     R9, NewVertices ;FN_ADR( R9,NewVertices )
 2050        LDR     R10, Faces      ;FN_ADR( R10,Faces )
 2060        LDRB    R11,[R10]
 2070.next       LDRB    R0,[R10,#1]
 2080            LDRB    R3,[R10,#2]
 2090            LDRB    R6,[R10,#3]
 2100            ADD     R0,R9,R0,ASL#4
 2110            ADD     R3,R9,R3,ASL#4
 2120            ADD     R6,R9,R6,ASL#4
 2130            LDMIA   R0,{R0-R2}                  ; X1,Y1,Z1
 2140            LDMIA   R3,{R3-R5}                  ; X2,Y2,Z2
 2150            LDMIA   R6,{R6-R8}                  ; X3,Y3,Z3
 2160            MOV     R3,R3,ASR#9
 2170            MOV     R4,R4,ASR#9
 2180            MOV     R5,R5,ASR#9
 2190            RSB     R0,R3,R0,ASR#9              ; X1=X1-X2
 2200            RSB     R1,R4,R1,ASR#9              ; Y1=Y1-Y2
 2210            RSB     R2,R5,R2,ASR#9              ; Z1=Z1-Z2
 2220            RSB     R3,R3,R6,ASR#9              ; X2=X3-X2
 2230            RSB     R4,R4,R7,ASR#9              ; Y2=Y3-Y2
 2240            RSB     R5,R5,R8,ASR#9              ; Z2=Z3-Z2
 2250            MUL     R8,R0,R4                    ; X1.Y2
 2260            MUL     LK,R3,R1                    ; X2.Y1
 2270            SUBS    R8,R8,LK                    ; Z=X1.Y2-X2.Y1
 2280            BLE     skip
 2290            MUL     R6,R1,R5                    ; Y1.Z2
 2300            MUL     LK,R4,R2                    ; Y2.Z1
 2310            SUB     R6,R6,LK                    ; X=Y1.Z2-Y2.Z1
 2320            MUL     R7,R0,R5                    ; X1.Z2
 2330            MUL     LK,R3,R2                    ; X2.Z1
 2340            RSB     R7,R7,LK                    ; X=-X2.Z1+X1.Z2
 2350            MOV     R6,R6,ASR#16
 2360            MOV     R7,R7,ASR#16
 2370            MOV     R8,R8,ASR#16
 2380            MUL     R0,R6,R6                    ; X^2
 2390            MLA     R0,R7,R7,R0                 ; X^2+Y^2
 2400            MLA     R0,R8,R8,R0                 ; X^2+Y^2+Z^2
 2410            ADD     R0,R0,R0,ASL#1              ; 3*(X^2+Y^2+Z^2)
 2420            MOV     R0,R0,LSL#1                 ; 6*(X^2+Y^2+Z^2)
 2430            SUB     LK,R6,R7                    ; X+Y
 2440            ADDS    LK,LK,R8,LSL#1              ; X+Y+2Z
 2450            STMFD   SP !,{R10-R11}
 2460            MUL     R10,LK,LK                   ; (X+Y+2Z)^2
 2470            BL      DivideR10byR0               ; (X+Y+2Z)^2/[6*(X^2+Y^2+Z^2)]
 2480            LDMFD   SP !,{R10-R11}
 2490            RSBMI   R0,R0,#0
 2500            ADD     R0,R0,#1<<15
 2510            CMP     R0,#2<<16
 2520            MVNHS   R1,#NOT-1
 2530            BHS     setcolour
 2540            MOVS    R1,R0,LSR#12+1
 2550            BEQ     setcolour
 2560            AND     R2,R11,#&40
 2570            SUBS    R1,R1,R2,LSR#6
 2580            MOVLT   R1,#0
 2590            BLE     setcolour
 2600                ORR     R1,R1,R1,LSL#4
 2610                TST     R0,#1<<12
 2620                SUBEQ   R1,R1,#1<<4
 2630                ORR     R1,R1,R1,LSL#8
 2640                TST     R0,#1<<11
 2650                SUBEQ   R1,R1,#1<<8
 2660                ORR     R1,R1,R1,LSL#16
 2670                TST     R0,#1<<10
 2680                SUBEQ   R1,R1,#1<<16
 2690.setcolour  STR     R1,[VP,#RR_SolidColour]
 2700            ADD     R9,R9,#8
 2710            BIC     R7,R11,#&C0
 2720            LDRB    R0,[R10,R7]
 2730            LDR     R0,[R9,R0,LSL#4]
 2740            SUB     R7,R7,#1
 2750.again          LDRB    R1,[R10,R7]
 2760                LDR     R1,[R9,R1,LSL#4]
 2770                ADD     R0,R0,R1
 2780                SUBS    R7,R7,#1
 2790                BNE     again
 2800            BIC     R7,R11,#&C0
 2810            SUB     R9,R9,#8
 2820            STMFD   SP !,{R10-R11}
 2830            MOV     R10,R0
 2840            MOV     R0,R7,LSL#16
 2850            BL      DivideR10byR0
 2860            LDMFD   SP !,{R10-R11}
 2870            LDR     R1,[VP,#RR_SolidColour]
 2880            LDR     R8,[VP,#Sort_End]
 2890            STMIA   R8!,{R0,R1,R10}
 2900            STR     R8,[VP,#Sort_End]
 2910.skip           TST     R11,#&80
 2920                BIC     R7,R11,#&C0
 2930                ADD     R10,R10,R7
 2940                LDRB    R11,[R10,#1]!
 2950                BNE     skip
 2960            TEQ     R11,#0
 2970            BNE     next
 2980        BL      SortZ
 2990        LDR     R9, NewVertices ;FN_ADR( R9,NewVertices )
 3000.loop       LDR     R8,[VP,#Sort_End]
 3010            TEQ     R8,#Sort_Buffer
 3020            BEQ     wait
 3030            LDMDB   R8!,{R0,R1,R10}
 3040            STR     R8,[VP,#Sort_End]
 3050            STR     R1,[VP,#RR_SolidColour]
 3060            MOV     R8,#Path
 3070            LDRB    R11,[R10]
 3080.next           MOV     LK,#P_MoveTo
 3090                STMIA   R8,{LK}
 3100                MOV     LK,#P_LineTo
 3110                BIC     R7,R11,#&C0
 3120.again              LDRB    R0,[R10,R7]
 3130                    ADD     R0,R9,R0,ASL#4
 3140                    LDMIA   R0,{R0-R1}
 3150                    STMIB   R8!,{R0-R1,LK}
 3160                    SUBS    R7,R7,#1
 3170                    BNE     again
 3180                TST     R11,#&80
 3190                BICNE   R7,R11,#&C0
 3200                ADDNE   R10,R10,R7
 3210                LDRNEB  R11,[R10,#1]!
 3220                BNE     next
 3230            MOV     LK,#P_EndPath
 3240            STMIA   R8!,{LK}
 3250            STR     R8,[VP,#Path_End]
 3260            BL      GenETtable
 3270            BLCC    Render_PathFill
 3280            B       loop
 3290.wait       LDR     R0,EventCount
 3300            CMP     R0,#0
 3310            BGT     wait
 3320        LDRLT   R0,WaitCount
 3330        ADDLT   R0,R0,#1
 3340        STRLT   R0,WaitCount
 3350        LDMFD   SP !,{PC}^
 3360.Iblock
 3370    DCD &94
 3380    DCD -1
 3390\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 3400.EnableEvent
 3410        MOV     R0,#&10
 3420        ADR     R1,EventHandler
 3430        MOV     R2,#0
 3440        SWI     "OS_Claim"
 3450        MOV     R0,#&0E
 3460        MOV     R1,#&04
 3470        SWI     "OS_Byte"
 3480        MOVS    PC,LK
 3490.DisableEvent
 3500        MOV     R0,#&0D
 3510        MOV     R1,#&04
 3520        SWI     "OS_Byte"
 3530        MOV     R0,#&10
 3540        ADR     R1,EventHandler
 3550        MOV     R2,#0
 3560        SWI     "OS_Release"
 3570        MOVS    PC,LK
 3580.EventHandler
 3590        TEQ     R0,#&04
 3600        MOVNES  PC,LK
 3610        LDR     R0,EventCount
 3620        SUB     R0,R0,#1
 3630        STR     R0,EventCount
 3640        LDMFD   SP !,{PC}
 3650.WaitCount  DCD 0
 3660.EventCount DCD 0
 3670\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 3680]
 3690CosTable    = P%
 3700FOR I%=0 TO 360*4-1
 3710  !P%=&00010000*COS RAD(I%/4)+0.5
 3720  P%+=4
 3730NEXT
 3740[ OPT Pass
 3750\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 3760.WindowLimits
 3770    DCD LowX
 3780    DCD HighX
 3790    DCD LowY
 3800    DCD HighY
 3810.Render_PathFill
 3820        STMFD   SP !,{R0-R11,VP,LK}
 3830        ADR     LK,WindowLimits
 3840        LDMIA   LK,{Temp0-Temp3}
 3850        ADD     LK,VP,#RR_Xmin
 3860        LDMIA   LK,{minx,maxx,miny,maxy}
 3870        CMP     Temp0,maxx                      ; Is this correct ?
 3880        CMPLT   Temp2,maxy
 3890        CMPLT   minx,Temp1
 3900        CMPLT   miny,Temp3
 3910        LDMGEFD SP !,{R0-R11,VP,PC}^
 3920        CMP     miny,Temp2
 3930        STRLT   Temp2,[VP,#RR_Ymin]
 3940        CMP     maxy,Temp3
 3950        STRGT   Temp3,[VP,#RR_Ymax]
 3960        BL      CSortYScanlines
 3970        ADR     LK,WindowLimits
 3980        LDMIA   LK,{Temp0-Temp3}
 3990        ADD     LK,VP,#RR_Xmin
 4000        LDMIA   LK,{minx,maxx,miny,maxy}        ; miny = CurrY , maxy = BottY
 4010        CMP     Temp0,minx
 4020        CMPLE   maxx,Temp1
 4030        BGT     slowfill
 4040.fastfill
 4050        LDR     Temp0,[VP,#ScreenStart]
 4060        MOV     Temp1,#LineWidth
 4070        MLA     LinePtr,CurrY,Temp1,Temp0
 4080        LDR     Colour,[VP,#RR_SolidColour]
 4090        LDR     FPtr,[VP,#RR_FirstScanline]
 4100.repeat     BL      CSortScanlines
 4110            MOV     Ptr,FPtr
 4120            LDMIA   Ptr !,{R0,Left,R4,RightX,R9}
 4130            TEQ     R0,#0
 4140            BMI     ff_next
 4150.loop           MOVS    ClipLeftX,Left,ASR#16
 4160                ADDCS   ClipLeftX,ClipLeftX,#1
 4170                MOVS    ClipRightX,RightX,ASR#16
 4180                SUBCC   ClipRightX,ClipRightX,#1
 4190                CMP     ClipLeftX,ClipRightX
 4200                BGT     ff_skip
 4210; Use LK for temp - one spare register.
 4220                MVN     LastMask,Right                        ; 1   1
 4230                MOV     R6,Left,ASR#3                         ; 1   2
 4240                ADD     R5,LinePtr,R6,LSL#2                   ; 1   3
 4250                RSBS    Width,R6,Right,ASR#3                  ; 1   4
 4260                MOV     Temp,#%11100                          ; 1   5
 4270                AND     FirstMask,Temp,Left,LSL#2             ; 1   6
 4280                AND     LastMask,Temp,LastMask,LSL#2          ; 1   7
 4290                MVN     Temp,#NOT&FFFFFFFF                    ; 1   8
 4300                MOV     FirstMask,Temp,LSL FirstMask          ; 2   10
 4310                ANDEQ   FirstMask,FirstMask,Temp,LSR LastMask ; 1 + 11   2   12
 4320                LDMIA   R5,{R6}                               ; 4   15   4   16
 4330                BIC     R6,R6,FirstMask                       ; 1   16   1   17
 4340                AND     FirstMask,Colour,FirstMask            ; 1   17   1   18
 4350                ORR     R6,R6,FirstMask                       ; 1   18   1   19
 4360                STMIA   R5 !,{R6}                             ; 4   22   4   23
 4370                BEQ     ff_skip                               ; 4   26   1 + 24
 4380                MOV     LastMask,Temp,LSR LastMask            ; 2   25
 4390                SUBS    Width,Width,#1                        ; 1   26
 4400                LDR     R6,[R5,Width,LSL#2]                   ; 4   30
 4410                BIC     R6,R6,LastMask                        ; 1   31
 4420                AND     FirstMask,Colour,LastMask             ; 1   32
 4430                ORR     R6,R6,FirstMask                       ; 1   33
 4440                STR     R6,[R5,Width,LSL#2]                   ; 4   37
 4450                BEQ     ff_skip                               ; 4   41   1 + 38
 4460                MOV     R6,Colour           ; 1   39
 4470                MOVS    Width,Width,LSR#1   ; 1   40
 4480                STMCSIA R5 !,{Colour}       ; 4   44   1 + 41   4   44   1 + 41
 4490                MOVS    Width,Width,LSR#1   ; 1   45   1   42   1   45   1   42
 4500                STMCSIA R5 !,{Colour,R6}    ; 1 + 46   5   47   5 + 50   1 + 43
 4510                BNE     ff_slow             ; 1 + 47   1 + 48   1 + 51   4   47
 4520.ff_skip        TEQ     R9,#0
 4530                LDMPLIA Ptr !,{Left,R4,RightX,R9}
 4540                BPL     loop
 4550.ff_next    ADD     LinePtr,LinePtr,#LineWidth
 4560            MOV     Colour,Colour,ROR#12
 4570            ADD     CurrY,CurrY,#1
 4580            TEQ     CurrY,BottY
 4590            BNE     repeat
 4600        LDMFD   SP !,{R0-R11,VP,PC}^
 4610.ff_slow         MOV     FirstMask,Colour                    ; 1   48   1   51
 4620                 MOV     Temp,Colour                         ; 1   49   1   52
 4630                 MOVS    Width,Width,LSR#1                   ; 1   50   1   53
 4640                 STMCSIA R5 !,{Colour,FirstMask,Temp,R6}     ; 7   57   7   60
 4650.again               STMNEIA R5 !,{Colour,FirstMask,Temp,R6} ; 1 + 58   1 + 61
 4660                     STMNEIA R5 !,{Colour,FirstMask,Temp,R6} ; 1 + 59   1 + 62
 4670                     SUBNES  Width,Width,#1                  ; 1 + 60   1 + 63
 4680                     BNE     again                           ; 1 + 61   1 + 64
 4690                TEQ     R9,#0
 4700                LDMPLIA Ptr !,{Left,R4,RightX,R9}
 4710                BPL     loop
 4720            ADD     LinePtr,LinePtr,#LineWidth
 4730            MOV     Colour,Colour,ROR#12
 4740            ADD     CurrY,CurrY,#1
 4750            TEQ     CurrY,BottY
 4760            BNE     repeat
 4770        LDMFD   SP !,{R0-R11,VP,PC}^
 4780.slowfill
 4790        LDR     Temp0,[VP,#ScreenStart]
 4800        MOV     Temp1,#LineWidth
 4810        MLA     LinePtr,CurrY,Temp1,Temp0
 4820        LDR     Colour,[VP,#RR_SolidColour]
 4830        LDR     FPtr,[VP,#RR_FirstScanline]
 4840.repeat     BL      CSortScanlines
 4850            MOV     Ptr,FPtr
 4860.loop           LDMIA   Ptr !,{R0,Left,R4,RightX}
 4870                TEQ     R0,#0
 4880                BMI     sf_next
 4890                MOVS    LeftX,Left,ASR#16
 4900                ADDCS   LeftX,LeftX,#1
 4910                MOVS    RightX,RightX,ASR#16
 4920                SUBCC   RightX,RightX,#1
 4930                MOV     ClipLeftX,#LowX
 4940                MOV     ClipRightX,#HighX
 4950                CMP     ClipLeftX,LeftX
 4960                MOVLT   ClipLeftX,LeftX
 4970                SUB     ClipRightX,ClipRightX,#1
 4980                CMP     ClipRightX,RightX
 4990                MOVGE   ClipRightX,RightX
 5000                ADRGE   LK,loop
 5010                ADRLT   LK,sf_next
 5020                CMP     ClipLeftX,ClipRightX
 5030                BLE     Solid4
 5040                MOV     PC,LK
 5050.sf_next    ADD     LinePtr,LinePtr,#LineWidth
 5060            MOV     Colour,Colour,ROR#12
 5070            ADD     CurrY,CurrY,#1
 5080            TEQ     CurrY,BottY
 5090            BNE     repeat
 5100        LDMFD   SP !,{R0-R11,VP,PC}^
 5110\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 5120\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 5130;
 5140; GenETtable
 5150;
 5160; Generates edge table.
 5170;
 5180; C is set on exit if the edge table is empty.
 5190;
 5200]
 5210PathPtr = R0
 5220Closed  = R3
 5230x1      = R4
 5240y1      = R5
 5250x2      = R6
 5260y2      = R7
 5270Command = LK
 5280[ OPT Pass
 5290.GenETtable
 5300        BIC     LK,LK,#Cflag
 5310        STMFD   SP !,{R0-R11,LK}
 5320        MOV     PathPtr,#OS_Buffer
 5330        MOV     FreeSpace,#OS_BufferEnd
 5340        MVN     minx,#NOT&7FFFFFFF
 5350        MOV     maxx,#&80000000
 5360        MVN     miny,#NOT&7FFFFFFF
 5370        MOV     maxy,#&80000000
 5380        STMFD   SP !,{x2-y2}
 5390        MOV     Closed,#2                       ; Closed = TRUE
 5400        LDMIA   PathPtr !,{Command}
 5410        TEQ     Command,#P_MoveTo
 5420        BNE     FEndPath
 5430.FMoveTo    TST     Closed,#3
 5440            BLEQ    ClosePath
 5450            LDMIA   PathPtr !,{x2-y2}
 5460            STMIA   SP,{x2-y2}
 5470            BIC     Closed,Closed,#2            ; Closed = FALSE
 5480            LDMIA   PathPtr !,{Command}
 5490            TEQ     Command,#P_MoveTo
 5500            BEQ     FMoveTo
 5510            TEQ     Command,#P_LineTo
 5520            BNE     FEndPath
 5530.FLineTo        MOV     x1,x2
 5540                MOV     y1,y2
 5550                LDMIA   PathPtr !,{x2-y2}
 5560                BL      InsertET                ; Insert edge
 5570                BIC     Closed,Closed,#2        ; Closed = FALSE
 5580                LDMIA   PathPtr !,{Command}
 5590                TEQ     Command,#P_LineTo
 5600                BEQ     FLineTo
 5610                TEQ     Command,#P_MoveTo
 5620                BEQ     FMoveTo
 5630.FEndPath
 5640        TST     Closed,#3
 5650        BLEQ    ClosePath
 5660        ADD     SP,SP,#8
 5670        MOVS    minx,minx,ASR#16
 5680        ADDCS   minx,minx,#1
 5690        MOVS    miny,miny,ASR#16
 5700        ADDCS   miny,miny,#1
 5710        MOVS    maxx,maxx,ASR#16
 5720        ADDCS   maxx,maxx,#1
 5730        MOVS    maxy,maxy,ASR#16
 5740        ADDCS   maxy,maxy,#1
 5750        TEQ     FreeSpace,#OS_BufferEnd
 5760        LDMEQFD SP !,{R0-R11,LK}
 5770        ORREQS  PC,LK,#Cflag
 5780        MOV     ETindex,FreeSpace
 5790        MVN     LK,#NOT-1
 5800        STMDB   ETindex !,{LK}
 5810        MOV     R6,#OS_BufferEnd
 5820.loop       SUB     R6,R6,#CT_Size
 5830            STR     R6,[ETindex,#-8]!
 5840            TEQ     R6,FreeSpace
 5850            SUBNE   R6,R6,#CT_Size
 5860            STRNE   R6,[ETindex,#-8]!
 5870            TEQNE   R6,FreeSpace
 5880            BNE     loop
 5890        STR     LK,[ETindex,#-8]
 5900        SUB     FreeSpace,FreeSpace,#4
 5910        ADD     LK,VP,#RR_FreeSpace
 5920        STMIA   LK,{FreeSpace,ETindex,minx,maxx,miny,maxy}
 5930        LDMFD   SP !,{R0-R11,PC}^
 5940\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 5950]
 5960dx    = R0
 5970absdx = R3
 5980dy    = R8
 5990tL    = R9
 6000tH    = R10
 6010xinit = R11
 6020[ OPT Pass
 6030.ClosePath
 6040        MOV     x1,x2
 6050        MOV     y1,y2
 6060        LDMFD   SP,{x2-y2}
 6070;
 6080; On entry :
 6090;   x1,y1 - Start of line
 6100;   x2,y2 - End of line
 6110;   miny,maxy
 6120;   minx,maxx
 6130;   FreeSpace - Pointer to next free space in buffer
 6140;
 6150.InsertET
 6160        TEQ     x1,x2
 6170        TEQEQ   y1,y2
 6180        MOVEQS  PC,LK
 6190        CMP     maxx,x1
 6200        MOVLT   maxx,x1
 6210        CMP     minx,x1
 6220        MOVGT   minx,x1
 6230        CMP     maxy,y1
 6240        MOVLT   maxy,y1
 6250        CMP     miny,y1
 6260        MOVGT   miny,y1
 6270        CMP     maxx,x2
 6280        MOVLT   maxx,x2
 6290        CMP     minx,x2
 6300        MOVGT   minx,x2
 6310        CMP     maxy,y2
 6320        MOVLT   maxy,y2
 6330        CMP     miny,y2
 6340        MOVGT   miny,y2
 6350        STMFD   SP !,{PathPtr,Closed,x1,y1,x2,y2,minx,maxx,miny,maxy,LK}
 6360        SUBS    dy,y2,y1
 6370        BPL     iet
 6380            FN_SWP( x1,x2 )
 6390            FN_SWP( y1,y2 )
 6400.iet    SUB     R10,x2,x1
 6410        SUBS    R0 ,y2,y1
 6420        SUBEQ   dx,x2,x1
 6430        BLNE    DivideR10byR0
 6440        MOVS    absdx,dx
 6450        RSBMI   absdx,absdx,#0
 6460        MOV     LK,y1,LSL#16
 6470        MOV     LK,LK,LSR#16
 6480        MOV     tH,absdx,LSR#16
 6490        BIC     tL,absdx,tH,LSL#16
 6500        MUL     tH,LK,tH
 6510        MUL     tL,LK,tL
 6520        MOVS    tL,tL,LSR#16
 6530        ADC     tH,tH,tL
 6540        TEQ     dx,#0
 6550        SUBPL   xinit,x1,tH
 6560        ADDMI   xinit,x1,tH
 6570        ADD     xinit,xinit,dx,ASR#1
 6580        MOVS    y1,y1,ASR#16
 6590        ADDCS   y1,y1,#1
 6600        ADDCS   xinit,xinit,dx
 6610        MOVS    y2,y2,ASR#16
 6620        SUBCC   y2,y2,#1
 6630        CMP     y1,y2
 6640        MOVLE   tL,y1
 6650        STMLEDB FreeSpace !,{dx,y2,tL,xinit}
 6660        LDMFD   SP !,{PathPtr,Closed,x1,y1,x2,y2,minx,maxx,miny,maxy,PC}^
 6670\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 6680;
 6690; CSortScanlines
 6700;
 6710; On exit :
 6720;   FPtr -> First scan line.
 6730;
 6740; (1) If CurrY>YE then invalidate lines else update lines.
 6750; (1) If CurrY>=YS then add lines. If CurrY>YE then invalidate lines.
 6760; (3) Sort scanline by left X values.
 6770; (4) Remove invalid lines.
 6780;
 6790.CSortScanlines
 6800        LDMIA   FPtr,{R0,R2,R3,R4,R5}                   ; 8   8
 6810        TEQ     R0,#0                                   ; 1   9
 6820        BMI     SS_skip                                 ; 1 + 10
 6830        ADD     LPtr,FPtr,#4*4                          ; 1   11
 6840.loop       LDMIA   R0,{R0,R6}          ; DX,YE         ; 5   16
 6850            CMP     CurrY,R6                            ; 1   17
 6860            BGT     SS_cut1                             ; 1 + 18
 6870            ADD     R2,R2,R0                            ; 1   19
 6880            LDMIA   R3,{R0,R6}          ; DX,YE         ; 5   24
 6890            CMP     CurrY,R6                            ; 1   25
 6900            BGT     SS_cut2                             ; 1 + 26
 6910            ADD     R4,R4,R0                            ; 1   27
 6920            STMDB   LPtr,{R2,R3,R4}                     ; 6   33
 6930            MOVS    R0,R5                               ; 1   34
 6940            LDMPLIB LPtr !,{R2,R3,R4,R5}                ; 1 + 35
 6950            BPL     loop                                ; 1 + 36
 6960        LDR     R0,[FPtr,#-8]                           ; 4   40
 6970        CMP     R0,#0                                   ; 1   41
 6980        MOVLTS  PC,LK                                   ; 4   45
 6990        LDMIA   R0,{R2,R4,R5,R6}        ; DX,YE,YS,XI
 7000        SUBS    R5,CurrY,R5
 7010        MOVLTS  PC,LK
 7020        B       SS_add
 7030.loop       LDMIA   R0,{R0,R6}          ; DX,YE
 7040            CMP     CurrY,R6
 7050.SS_cut1    MVNGT   R2,#NOT&7FFFFFFF
 7060            ADDLE   R2,R2,R0
 7070            LDMIA   R3,{R0,R6}          ; DX,YE
 7080            CMP     CurrY,R6
 7090.SS_cut2    MVNGT   R4,#NOT&7FFFFFFF
 7100            ADDLE   R4,R4,R0
 7110            STMDB   LPtr,{R2,R3,R4}
 7120            MOVS    R0,R5
 7130            LDMPLIB LPtr !,{R2,R3,R4,R5}
 7140            BPL     loop
 7150        LDR     R0,[FPtr,#-8]
 7160        CMP     R0,#0
 7170        LDMGEIA R0,{R2,R4,R5,R6}        ; DX,YE,YS,XI
 7180        SUBGES  R5,CurrY,R5
 7190        BGE     SS_add
 7200.SS_exit1
 7210        MOV     R0,FPtr
 7220        LDMIA   R0!,{R2-R3,R5-R6}
 7230        CMP     R3,R6
 7240        BGT     SS_shuffleA
 7250        TEQ     R0,LPtr
 7260        BNE     SS_skip3
 7270.SS_exit2
 7280        LDMDB   LPtr,{R5}
 7290        CMN     R5,#-&7FFFFFFF
 7300        MOVNES  PC,LK
 7310        MVN     R0,#NOT-1
 7320.loop       SUB     LPtr,LPtr,#8
 7330            TEQ     FPtr,LPtr
 7340            STREQ   R0,[LPtr]
 7350            MOVEQS  PC,LK
 7360            LDMDB   LPtr,{R5}
 7370            CMN     R5,#-&7FFFFFFF
 7380            BEQ     loop
 7390        STR     R0,[LPtr]
 7400        MOVS    PC,LK
 7410.SS_skip
 7420        LDR     R0,[FPtr,#-8]
 7430        CMP     R0,#0
 7440        LDMGEIA R0,{R2,R4,R5,R6}
 7450        SUBGES  R5,CurrY,R5
 7460        MOVLTS  PC,LK
 7470        MOV     LPtr,FPtr
 7480.SS_add     CMP     CurrY,R4
 7490            MVNGT   R6,#NOT&7FFFFFFF
 7500            MLALE   R6,R2,R5,R6
 7510            STMDB   FPtr !,{R0,R6}
 7520            LDR     R0,[FPtr,#-8]
 7530            CMP     R0,#0
 7540            LDMGEIA R0,{R2,R4,R5,R6}    ; DX,YE,YS,XI
 7550            SUBGES  R5,CurrY,R5
 7560            BGE     SS_add
 7570        B       SS_exit1
 7580.SS_shuffleA
 7590            SUB     R4,R0,#8
 7600.loop           STMIA   R4,{R2-R3}
 7610                SUB     R4,R4,#8
 7620                TEQ     R4,FPtr
 7630                LDMNEDB R4,{R2-R3}
 7640                CMPNE   R3,R6
 7650                BGT     loop
 7660            STMIA   R4,{R5-R6}
 7670            TEQ     R0,LPtr
 7680            BEQ     SS_exit2
 7690            SUB     R0,R0,#8
 7700            LDMIA   R0!,{R2-R3,R5-R6}
 7710.repeat     CMP     R3,R6
 7720            BGT     SS_shuffleA
 7730            TEQ     R0,LPtr
 7740            BEQ     SS_exit2
 7750.SS_skip3   LDMIA   R0!,{R2-R3}
 7760            CMP     R6,R3
 7770            BGT     SS_shuffleB
 7780            TEQ     R0,LPtr
 7790            LDMNEIA R0!,{R5-R6}
 7800            BNE     repeat
 7810        B       SS_exit2
 7820.SS_shuffleB
 7830            SUB     R4,R0,#8
 7840.loop           STMIA   R4,{R5-R6}
 7850                SUB     R4,R4,#8
 7860                TEQ     R4,FPtr
 7870                LDMNEDB R4,{R5-R6}
 7880                CMPNE   R6,R3
 7890                BGT     loop
 7900            STMIA   R4,{R2-R3}
 7910            TEQ     R0,LPtr
 7920            BEQ     SS_exit2
 7930            SUB     R0,R0,#8
 7940            LDMIA   R0!,{R2-R3,R5-R6}
 7950.repeat     CMP     R3,R6
 7960            BGT     SS_shuffleA
 7970            TEQ     R0,LPtr
 7980            BEQ     SS_exit2
 7990            LDMIA   R0!,{R2-R3}
 8000            CMP     R6,R3
 8010            BGT     SS_shuffleB
 8020            TEQ     R0,LPtr
 8030            LDMNEIA R0!,{R5-R6}
 8040            BNE     repeat
 8050        B       SS_exit2
 8060\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 8070.CSortYScanlines
 8080        LDR     R10,[VP,#RR_ETindex]
 8090        LDR     R11,[VP,#RR_FreeSpace]
 8100        STR     R11,[VP,#RR_FirstScanline]
 8110        SUB     R11,R11,#8
 8120.QSort  SUBS    R0,R11,R10
 8130        TEQ     R0,#8*2-8
 8140        BNE     not2
 8150            LDMIA   R10,{R0-R1,R2}
 8160            LDR     R1,[R0,#CT_Ystart]
 8170            LDR     R3,[R2,#CT_Ystart]
 8180            CMP     R1,R3
 8190            MOVLT   R4,R0
 8200            STMLTIA R10,{R2-R3,R4}
 8210            MOVS    PC,LK
 8220.not2   TEQ     R0,#8*3-8
 8230        BNE     not3
 8240            LDMIA   R10,{R0-R1,R2-R3,R4}
 8250            LDR     R1,[R0,#CT_Ystart]
 8260            LDR     R3,[R2,#CT_Ystart]
 8270            LDR     R5,[R4,#CT_Ystart]
 8280            CMP     R1,R3
 8290            FN_SWPcc(LT%,R0,R2)
 8300            FN_SWPcc(LT%,R1,R3)
 8310            CMP     R3,R5
 8320            FN_SWPcc(LT%,R2,R4)
 8330            MOVLT   R3,R5
 8340            CMP     R1,R3
 8350            FN_SWPcc(LT%,R0,R2)
 8360            STMIA   R10,{R0-R1,R2-R3,R4}
 8370            MOVS    PC,LK
 8380.not3   TEQ     R0,#8*4-8
 8390        BNE     not4
 8400            LDMIA   R10,{R0-R1,R2-R3,R4-R5,R6}
 8410            LDR     R1,[R0,#CT_Ystart]
 8420            LDR     R3,[R2,#CT_Ystart]
 8430            LDR     R5,[R4,#CT_Ystart]
 8440            LDR     R7,[R6,#CT_Ystart]
 8450            CMP     R1,R3
 8460            FN_SWPcc(LT%,R0,R2)
 8470            FN_SWPcc(LT%,R1,R3)
 8480            CMP     R5,R7
 8490            FN_SWPcc(LT%,R4,R6)
 8500            FN_SWPcc(LT%,R5,R7)
 8510            CMP     R1,R5
 8520            FN_SWPcc(LT%,R0,R4)
 8530            MOVLT   R5,R1
 8540            CMP     R3,R7
 8550            FN_SWPcc(LT%,R2,R6)
 8560            MOVLT   R3,R7
 8570            CMP     R3,R5
 8580            FN_SWPcc(LT%,R2,R4)
 8590            STMIA   R10,{R0-R1,R2-R3,R4-R5,R6}
 8600            MOVS    PC,LK
 8610.not4   TEQ     R0,#8*5-8
 8620        BNE     not5
 8630            LDMIA   R10,{R0-R1,R2-R3,R4-R5,R6-R7,R8}
 8640            LDR     R1,[R0,#CT_Ystart]
 8650            LDR     R3,[R2,#CT_Ystart]
 8660            LDR     R5,[R4,#CT_Ystart]
 8670            LDR     R7,[R6,#CT_Ystart]
 8680            LDR     R9,[R8,#CT_Ystart]
 8690            CMP     R1,R9
 8700            FN_SWPcc(LT%,R0,R8)
 8710            FN_SWPcc(LT%,R1,R9)
 8720            CMP     R1,R5
 8730            FN_SWPcc(LT%,R0,R4)
 8740            FN_SWPcc(LT%,R1,R5)
 8750            CMP     R3,R7
 8760            FN_SWPcc(LT%,R2,R6)
 8770            FN_SWPcc(LT%,R3,R7)
 8780            CMP     R5,R9
 8790            FN_SWPcc(LT%,R4,R8)
 8800            FN_SWPcc(LT%,R5,R9)
 8810            CMP     R1,R3
 8820            FN_SWPcc(LT%,R0,R2)
 8830            MOVLT   R3,R1
 8840            CMP     R5,R7
 8850            FN_SWPcc(LT%,R4,R6)
 8860            FN_SWPcc(LT%,R5,R7)
 8870            CMP     R3,R9
 8880            FN_SWPcc(LT%,R2,R8)
 8890            FN_SWPcc(LT%,R3,R9)
 8900            CMP     R3,R5
 8910            FN_SWPcc(LT%,R2,R4)
 8920            CMP     R7,R9
 8930            FN_SWPcc(LT%,R6,R8)
 8940            STMIA   R10,{R0-R1,R2-R3,R4-R5,R6-R7,R8}
 8950            MOVS    PC,LK
 8960.not5   MOV     R0,R10
 8970        ADD     R1,R11,#8
 8980        LDR     R2,[R0]
 8990        LDR     R3,[R2,#CT_Ystart]
 9000.repeat         LDR     R4,[R1,#-8]!
 9010                TEQ     R0,R1
 9020                BEQ     done
 9030                LDR     R5,[R4,#CT_Ystart]
 9040                CMP     R3,R5
 9050                BGE     repeat
 9060            STR     R4,[R0]
 9070.loop           LDR     R4,[R0,#+8]!
 9080                TEQ     R0,R1
 9090                BEQ     done
 9100                LDR     R5,[R4,#CT_Ystart]
 9110                CMP     R3,R5
 9120                BLE     loop
 9130            STR     R4,[R1]
 9140            B       repeat
 9150.done   STR     R2,[R0],#-8
 9160        CMP     R0,R10
 9170        STMGTFD SP !,{R0,R11,LK}
 9180        MOVGT   R11,R0
 9190        BLGT    QSort
 9200        LDMGTFD SP !,{R0,R11,LK}
 9210        ADD     R10,R0,#8*2
 9220        CMP     R10,R11
 9230        BLT     QSort
 9240        MOVS    PC,LK
 9250;        LDR     R10,[VP,#RR_ETindex]
 9260;        LDR     R11,[VP,#RR_FreeSpace]
 9270;        STR     R11,[VP,#RR_FirstScanline]
 9280;        MOV     R0,R10
 9290;.loop   LDMIA   R0!,{R1-R2,R5-R6}
 9300;        LDR     R4,[R1,#CT_Ystart]
 9310;.repeat     LDR     R8,[R5,#CT_Ystart]
 9320;            CMP     R8,R4
 9330;            BGT     CSY_shuffleA
 9340;            TEQ     R0,R11
 9350;            MOVEQS  PC,LK
 9360;            LDR     R1,[R0],#8
 9370;            LDR     R4,[R1,#CT_Ystart]
 9380;            CMP     R4,R8
 9390;            BGT     CSY_shuffleB
 9400;            TEQ     R0,R11
 9410;            LDRNE   R5,[R0],#8
 9420;            BNE     repeat
 9430;        MOVS    PC,LK
 9440;
 9450;
 9460;.CSY_shuffleA
 9470;            SUB     R9,R0,#8
 9480;.repeat         STR     R1,[R9],#-8
 9490;                TEQ     R9,R10
 9500;                LDRNE   R1,[R9,#-8]
 9510;                LDRNE   R4,[R1,#CT_Ystart]
 9520;                CMPNE   R8,R4
 9530;                BGT     repeat
 9540;            STR     R5,[R9]
 9550;            TEQ     R0,R11
 9560;            SUBNE   R0,R0,#8
 9570;            BNE     loop
 9580;        MOVS    PC,LK
 9590;
 9600;.CSY_shuffleB
 9610;            SUB     R9,R0,#8
 9620;.repeat         STR     R5,[R9],#-8
 9630;                TEQ     R9,R10
 9640;                LDRNE   R5,[R9,#-8]
 9650;                LDRNE   R8,[R5,#CT_Ystart]
 9660;                CMPNE   R4,R8
 9670;                BGT     repeat
 9680;            STR     R1,[R9]
 9690;            TEQ     R0,R11
 9700;            SUBNE   R0,R0,#8
 9710;            BNE     loop
 9720;        MOVS    PC,LK
 9730\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 9740\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 9750]
 9760Den    = R0
 9770Result = Den
 9780Sign   = R2
 9790Count  = R3
 9800Num    = R10
 9810Scrap  = R11
 9820[ OPT Pass
 9830;
 9840; DivideR10byR0
 9850;
 9860; On entry :
 9870;   R0  - Unsigned fixed point denominator.
 9880;   R10 - Signed fixed point numerator.
 9890; On exit :
 9900;   R0 - Signed fixed point result = R10/R0.
 9910;   R2-R3,R10,R11 - Corrupted.
 9920;
 9930; If R0>=R10 then takes 68 cycles
 9940; else takes between 95 and 134 cycles.
 9950;
 9960; Accuracy should probably be improved.
 9970;
 9980.DivideR10byR0
 9990        MOVS    Sign,Num
10000        MOVEQ   Result,#0
10010        MOVEQS  PC,LK
10020        RSBMI   Num,Num,#0
10030        CMP     Den,Num
10040        MOVHS   Count,#0
10050        BHS     D_skip
10060        MOV     Count,#17*3
10070        CMP     Den,Num,LSR#16
10080        BLS     DivError
10090        CMP     Den,Num,LSR#8
10100        MOVLS   Den,Den,LSL#8
10110        ADDLS   Count,Count,#8*3
10120        CMP     Den,Num,LSR#4
10130        MOVLS   Den,Den,LSL#4
10140        ADDLS   Count,Count,#4*3
10150        CMP     Den,Num,LSR#2
10160        MOVLS   Den,Den,LSL#2
10170        ADDLS   Count,Count,#2*3
10180        CMP     Den,Num,LSR#1
10190        MOVLS   Den,Den,LSL#1
10200        ADDLS   Count,Count,#1*3
10210        CMP     Count,#31*3
10220        BHI     DivError
10230.loop       SUBS    Count,Count,#17*3
10240            SUBMI   PC,PC,Count,LSL#2
10250.D_skip     MOV     Scrap,#0
10260            RSBS    Num,Den,Num         ; 17
10270            ADDLO   Num,Num,Den
10280            ADC     Scrap,Scrap,Scrap
10290            RSBS    Num,Den,Num,LSL#1   ; 16
10300            ADDLO   Num,Num,Den
10310            ADC     Scrap,Scrap,Scrap
10320            RSBS    Num,Den,Num,LSL#1   ; 15
10330            ADDLO   Num,Num,Den
10340            ADC     Scrap,Scrap,Scrap
10350            RSBS    Num,Den,Num,LSL#1   ; 14/31
10360            ADDLO   Num,Num,Den
10370            ADC     Scrap,Scrap,Scrap
10380            RSBS    Num,Den,Num,LSL#1   ; 13/30
10390            ADDLO   Num,Num,Den
10400            ADC     Scrap,Scrap,Scrap
10410            RSBS    Num,Den,Num,LSL#1   ; 12/29
10420            ADDLO   Num,Num,Den
10430            ADC     Scrap,Scrap,Scrap
10440            RSBS    Num,Den,Num,LSL#1   ; 11/28
10450            ADDLO   Num,Num,Den
10460            ADC     Scrap,Scrap,Scrap
10470            RSBS    Num,Den,Num,LSL#1   ; 10/27
10480            ADDLO   Num,Num,Den
10490            ADC     Scrap,Scrap,Scrap
10500            RSBS    Num,Den,Num,LSL#1   ; 9/26
10510            ADDLO   Num,Num,Den
10520            ADC     Scrap,Scrap,Scrap
10530            RSBS    Num,Den,Num,LSL#1   ; 8/25
10540            ADDLO   Num,Num,Den
10550            ADC     Scrap,Scrap,Scrap
10560            RSBS    Num,Den,Num,LSL#1   ; 7/24
10570            ADDLO   Num,Num,Den
10580            ADC     Scrap,Scrap,Scrap
10590            RSBS    Num,Den,Num,LSL#1   ; 6/23
10600            ADDLO   Num,Num,Den
10610            ADC     Scrap,Scrap,Scrap
10620            RSBS    Num,Den,Num,LSL#1   ; 5/22
10630            ADDLO   Num,Num,Den
10640            ADC     Scrap,Scrap,Scrap
10650            RSBS    Num,Den,Num,LSL#1   ; 4/21
10660            ADDLO   Num,Num,Den
10670            ADC     Scrap,Scrap,Scrap
10680            RSBS    Num,Den,Num,LSL#1   ; 3/20
10690            ADDLO   Num,Num,Den
10700            ADC     Scrap,Scrap,Scrap
10710            RSBS    Num,Den,Num,LSL#1   ; 2/19
10720            ADDLO   Num,Num,Den
10730            ADC     Scrap,Scrap,Scrap
10740            RSBS    Num,Den,Num,LSL#1   ; 1/18
10750            ADDLO   Num,Num,Den
10760            ADC     Scrap,Scrap,Scrap
10770            CMP     Count,#0
10780            BGT     loop
10790        RSBS    Num,Den,Num,LSL#1
10800        ADC     Result,Scrap,#0
10810        TEQ     Sign,#0
10820        RSBMI   Result,Result,#0
10830        BICS    PC,LK,#Vflag
10840.DivError
10850        TEQ     Sign,#0
10860        MOVPL   Result,#&40000000
10870        MOVMI   Result,#&C0000000
10880        ORRS    PC,LK,#Vflag
10890\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
10900\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
10910;
10920; Solid4
10930;
10940; On entry :
10950;   R1 - Pointer to start of scanline.
10960;   R3 - Left.
10970;   R4 - Right.
10980;   R7 - Colour.
10990;
11000; Solid colour scanline routines.
11010;
11020.Solid4 MVN     LastMask,Right                          ; 1   1
11030        MOV     R6,Left,ASR#3                           ; 1   2
11040        ADD     R5,LinePtr,R6,LSL#2                     ; 1   3
11050        RSBS    Width,R6,Right,ASR#3                    ; 1   4
11060        MOV     Temp,#%11100                            ; 1   5
11070        AND     FirstMask,Temp,Left,LSL#2               ; 1   6
11080        AND     LastMask,Temp,LastMask,LSL#2            ; 1   7
11090        MVN     Temp,#NOT&FFFFFFFF                      ; 1   8
11100        MOV     FirstMask,Temp,LSL FirstMask            ; 2   10
11110        ANDEQ   FirstMask,FirstMask,Temp,LSR LastMask   ; 1 + 11   2   12
11120        LDMIA   R5,{R6}                                 ; 4   15   4   16
11130        BIC     R6,R6,FirstMask                         ; 1   16   1   17
11140        AND     FirstMask,Colour,FirstMask              ; 1   17   1   18
11150        ORR     R6,R6,FirstMask                         ; 1   18   1   19
11160        STMIA   R5 !,{R6}                               ; 4   22   4   23
11170        MOVEQS  PC,LK                                   ; 1 + 23   4   27
11180        MOV     LastMask,Temp,LSR LastMask              ; 2   25
11190        SUBS    Width,Width,#1                          ; 1   26
11200        LDR     R6,[R5,Width,LSL#2]                     ; 4   30
11210        BIC     R6,R6,LastMask                          ; 1   31
11220        AND     FirstMask,Colour,LastMask               ; 1   32
11230        ORR     R6,R6,FirstMask                         ; 1   33
11240        STR     R6,[R5,Width,LSL#2]                     ; 4   37
11250        MOVEQS  PC,LK                                   ; 1 + 38   4   41
11260        MOV     R3,Colour                               ; 1   39
11270        MOV     R6,Colour                               ; 1   40
11280        MOV     Temp,Colour                             ; 1   41
11290.loop   CMP     Width,#12                               ; 1   42   1 + 1
11300        ADDLS   PC,PC,Width,LSL#4                       ; 4   46   1 + 2
11310        STMIA   R5 !,{Colour,R3,Temp,R6}                ;          7 + 9
11320        STMIA   R5 !,{Colour,R3,Temp,R6}                ;          7 + 16
11330        STMIA   R5 !,{Colour,R3,Temp,R6}                ;          7 + 23
11340        SUBS    Width,Width,#12                         ;          1 + 24
11350        B       loop                                    ;          4 + 28
11360        STMIA   R5 !,{Colour}                           ; 4   50
11370        MOVS    PC,LK                                   ; 4   54
11380        DCD     0
11390        DCD     0
11400        STMIA   R5 !,{Colour,R6}                        ; 5   51
11410        MOVS    PC,LK                                   ; 4   55
11420        DCD     0
11430        DCD     0
11440        STMIA   R5 !,{Colour,R3,Temp}                   ; 6   52
11450        MOVS    PC,LK                                   ; 4   56
11460        DCD     0
11470        DCD     0
11480        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   53
11490        MOVS    PC,LK                                   ; 4   57
11500        DCD     0
11510        DCD     0
11520        MOV     R2,Colour                               ; 1   47
11530        STMIA   R5 !,{Colour,R2,R3,Temp,R6}             ; 8   55
11540        MOVS    PC,LK                                   ; 4   59
11550        DCD     0
11560        MOV     R2,Colour                               ; 1   47
11570        MOV     R4,Colour                               ; 1   48
11580        STMIA   R5 !,{Colour,R2,R3,R4,Temp,R6}          ; 9   57
11590        MOVS    PC,LK                                   ; 4   61
11600        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   53
11610        STMIA   R5 !,{Colour,R3,Temp}                   ; 6   59
11620        MOVS    PC,LK                                   ; 4   63
11630        DCD     0
11640        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   53
11650        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   60
11660        MOVS    PC,LK                                   ; 4   64
11670        DCD     0
11680        MOV     R2,Colour                               ; 1   47
11690        STMIA   R5 !,{Colour,R2,R3,Temp,R6}             ; 8   55
11700        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   62
11710        MOVS    PC,LK                                   ; 4   66
11720        MOV     R2,Colour                               ; 1   47
11730        STMIA   R5 !,{Colour,R2,R3,Temp,R6}             ; 8   55
11740        STMIA   R5 !,{Colour,R2,R3,Temp,R6}             ; 8   63
11750        MOVS    PC,LK                                   ; 4   67
11760        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   53
11770        STMIA   R5 !,{Colour,R3,Temp,R6}                ; 7   60
11780        STMIA   R5 !,{Colour,R3,Temp}                   ; 6   66
11790        MOVS    PC,LK                                   ; 4   70
11800        MOV     R2,Colour                               ; 1   47
11810        MOV     R4,Colour                               ; 1   48
11820        STMIA   R5 !,{Colour,R2,R3,R4,Temp,R6}          ; 9   57
11830        STMIA   R5 !,{Colour,R2,R3,R4,Temp,R6}          ; 9   66
11840        MOVS    PC,LK                                   ; 4   70
11850\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
11860.SortZ  MOV     R11,#Sort_Buffer
11870        LDR     R10,[VP,#Sort_End]
11880        SUB     R10,R10,#12
11890.QZSort SUBS    R9,R10,R11
11900        MOVLSS  PC,LK
11910        CMP     R9,#12*3-12
11920        BLO     SZswap2
11930        BHI     SZsort
11940.SZswap3
11950        LDMIA   R11,{R0-R2,R3-R5,R6-R8}
11960        CMP     R0,R3
11970        BGE     sz31
11980            FN_SWP( R0,R3 )
11990            FN_SWP( R1,R4 )
12000            FN_SWP( R2,R5 )
12010.sz31   CMP     R3,R6
12020        STMLTIA R10,{R3-R5}
12030        MOVLT   R3,R6
12040        MOVLT   R4,R7
12050        MOVLT   R5,R8
12060        CMP     R0,R3
12070        MOVLT   R6,R0
12080        MOVLT   R7,R1
12090        MOVLT   R8,R2
12100        STMLTIA R11,{R3-R5,R6-R8}
12110        STMGEIA R11,{R0-R2,R3-R5}
12120        MOVS    PC,LK
12130.SZswap2
12140        LDMIA   R11,{R0-R2,R3-R5}
12150        CMP     R0,R3
12160        MOVLT   R6,R0
12170        MOVLT   R7,R1
12180        MOVLT   R8,R2
12190        STMLTIA R11,{R3-R5,R6-R8}
12200        MOVS    PC,LK
12210.SZsort MOV     R0,R11
12220        MOV     R1,R10
12230        STMFD   SP !,{R10,LK}
12240        LDMIA   R0!,{R2-R4}
12250        LDMIA   R1 ,{R5-R7}
12260;        MOV     LK,R9,LSR#4
12270;        ADD     LK,R0,LK,LSL#3
12280        ADD     LK,R0,R1
12290        MOV     LK,LK,LSR#1
12300        TST     LK,#%010
12310        SUBNE   LK,LK,#12>>1
12320        LDMIA   LK,{R8-R10}
12330        CMP     R2,R5
12340        STMLTIA R1,{R2-R4}
12350        MOVLT   R2,R5
12360        MOVLT   R3,R6
12370        MOVLT   R4,R7
12380        LDMLTIA R1,{R5-R7}
12390        CMP     R2,R8
12400        STMGTIA LK,{R2-R4}
12410        MOVGT   R2,R8
12420        MOVGT   R3,R9
12430        MOVGT   R4,R10
12440        CMP     R2,R5
12450        STMLTIA R1,{R2-R4}
12460        MOVLT   R2,R5
12470        MOVLT   R3,R6
12480        MOVLT   R4,R7
12490        LDMFD   SP !,{R10,LK}
12500.repeat         TEQ     R0,R1
12510                BEQ     done1
12520.next           LDMDB   R1!,{R5-R7}
12530                CMP     R2,R5
12540                BGE     repeat
12550            STMDB   R0,{R5-R7}
12560.loop           TEQ     R0,R1
12570                BEQ     done2
12580                LDMIA   R0!,{R5-R7}
12590                CMP     R2,R5
12600                BLE     loop
12610            STMIA   R1,{R5-R7}
12620            TEQ     R0,R1
12630            BNE     next
12640.done1  SUB     R0,R0,#12
12650.done2  STMIA   R0,{R2-R4}
12660        SUB     R0,R0,#12
12670        CMP     R0,R11
12680        STMGTFD SP !,{R0,R10,LK}
12690        MOVGT   R10,R0
12700        BLGT    QZSort
12710        LDMGTFD SP !,{R0,R10,LK}
12720        ADD     R11,R0,#12*2
12730        CMP     R11,R10
12740        BLT     QZSort
12750        MOVS    PC,LK
12760\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
12770]
12780NEXT Pass
12790VarBlock!AngleA = 0
12800VarBlock!AngleB = 0
12810VarBlock!AngleC = 0
12820VarBlock?Bank   = 1
12830OSCLI("*Save ^.Code "+STR$~Code%+"+"+STR$~(P%-Code%))
12840OSCLI("*SetType ^.Code Data")
