'STAR3D PROOF OF CONCEPT, 2021-12-29 BY NATHANIEL BABIAK. REPEAT 'SPRITES. GLOBAL S_SMAX, S_LIST_SIZE, S_LIST_ADR, S_BUFR_SIZE, S_HDR0_ADR, S_BDY0_ADR, S_HDR1_ADR GLOBAL S_BDY1_ADR, S_HDR2_ADR, S_BDY2_ADR, S_RASTER_ADR, S_RASTER_SIZE, S_RASTER_WORD GLOBAL S_RASTER_NUM, S_NEXT_PAGE, S_CA DIM GLOBAL S_P2CA(23), S_STEP(9), S_W2WORD(31), S_Y2LIST(127) DIM GLOBAL S_Y2HDR0(127), S_Y2HDR1(127), S_Y2HDR2(127) DIM GLOBAL S_Y2BDY0(127), S_Y2BDY1(127), S_Y2BDY2(127) DIM GLOBAL S_YN2BDY_XY(127,9), S_YN2BDY_CA(127,9), S_YY2SIZE(127,127), S_XY2WORD(159,127) 'FPS. GLOBAL F_FRAMES, F_TIME, F_STR$ 'DO IT! CALL MAIN_TEST UNTIL 1 SUB MAIN_TEST CALL F_INIT CALL S_INIT TOUCHSCREEN 'USE_PAGE_FLIP = 0 USE_PAGE_FLIP = -1 IF NOT USE_PAGE_FLIP THEN CALL V_PAGE_FLIP_OFF KEYBOARD ON RADIUS = 0 K$ = "C" DO CALL F_SHOW IF USE_PAGE_FLIP THEN CALL S_PAGE_FLIP CALL S_CLS END IF IF K$ = "C" THEN CLR = RND(23) XC = 32 YC = 5 X0 = RND(6) + 0.0001 X1 = RND*6+12-3 X2 = RND*6+12-3 X3 = 24 X4 = RND*6+36-3 X5 = RND*6+36-3 X6 = RND(6)+48-6 + 0.9999 Y0 = RND*6+24-3 Y1 = RND*6 Y2 = RND(6)+48-6 + 0.0001 Y3 = 24 Y4 = RND*6 Y5 = RND(6)+48-6 + 0.9999 Y6 = RND*6+24-3 CALL S_CLS END IF IF K$ = "R" THEN RADIUS = RADIUS XOR 64 K$ = INKEY$ XC = INT( COS( TIMER * 180 / PI / 6000 ) * RADIUS + 32 ) YC = INT( SIN( TIMER * 180 / PI / 6000 ) * RADIUS + 5 ) IF TOUCH THEN X3 = TOUCH.X - XC - 64 Y3 = TOUCH.Y - YC - 64 END IF CALL S_PAL( 0 ) CALL S_PXL( X0+XC,Y0+YC ) CALL S_PXL( X1+XC,Y1+YC ) CALL S_PXL( X2+XC,Y2+YC ) CALL S_PXL( X3+XC,Y3+YC ) CALL S_PXL( X4+XC,Y4+YC ) CALL S_PXL( X5+XC,Y5+YC ) CALL S_PXL( X6+XC,Y6+YC ) CALL S_PAL((CLR ) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X0+XC,Y0+YC, X1+XC,Y1+YC ) CALL S_PAL((CLR+ 1) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X1+XC,Y1+YC, X4+XC,Y4+YC ) CALL S_PAL((CLR+ 2) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X4+XC,Y4+YC, X6+XC,Y6+YC ) CALL S_PAL((CLR+ 3) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X6+XC,Y6+YC, X5+XC,Y5+YC ) CALL S_PAL((CLR+ 4) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X5+XC,Y5+YC, X2+XC,Y2+YC ) CALL S_PAL((CLR+ 5) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X2+XC,Y2+YC, X0+XC,Y0+YC ) ADD XC, 64 ADD YC, 64 CALL S_PAL( 0 ) CALL S_PXL( X0+XC,Y0+YC ) CALL S_PXL( X1+XC,Y1+YC ) CALL S_PXL( X2+XC,Y2+YC ) CALL S_PXL( X3+XC,Y3+YC ) CALL S_PXL( X4+XC,Y4+YC ) CALL S_PXL( X5+XC,Y5+YC ) CALL S_PXL( X6+XC,Y6+YC ) CALL S_PAL((CLR+ 6) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X0+XC,Y0+YC, X1+XC,Y1+YC ) CALL S_PAL((CLR+ 7) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X1+XC,Y1+YC, X4+XC,Y4+YC ) CALL S_PAL((CLR+ 8) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X4+XC,Y4+YC, X6+XC,Y6+YC ) CALL S_PAL((CLR+ 9) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X6+XC,Y6+YC, X5+XC,Y5+YC ) CALL S_PAL((CLR+10) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X5+XC,Y5+YC, X2+XC,Y2+YC ) CALL S_PAL((CLR+11) MOD 24) CALL S_TRI( X3+XC,Y3+YC, X2+XC,Y2+YC, X0+XC,Y0+YC ) LOOP END SUB SUB V_PAGE_FLIP_OFF ON VBL OFF INC S_NEXT_PAGE CALL S_VBL S_HDR1_ADR = S_HDR0_ADR S_BDY1_ADR = S_BDY0_ADR S_HDR2_ADR = S_HDR0_ADR S_BDY2_ADR = S_BDY0_ADR END SUB SUB S_INIT RESTORE S_INIT0 S_INIT0: READ MIN_CHAR, PRIORITY, SPRITE_MIN_N, S_SMAX, SPRITE_ORDER ' 0 TO 255, 0 OR %00100000, 0 TO 63, 2 TO 10, -1 OR 1 DATA 0, 0, 0, 10, -1 READ S_LIST_SIZE, S_LIST_ADR DATA $80, $A000 READ S_HDR0_ADR, S_BDY0_ADR, S_HDR1_ADR, S_BDY1_ADR, S_HDR2_ADR, S_BDY2_ADR DATA $A080, $A101, $B501, $B582, $C982, $CA03 S_BUFR_SIZE = $80 * 4 * S_SMAX + $80 S_RASTER_ADR = $FE00 + 4 * SPRITE_MIN_N S_RASTER_SIZE = 4*S_SMAX S_RASTER_WORD = 4*S_SMAX +$100*4*S_SMAX FOR PL = 0 TO %00000111 S_P2CA( 3 * PL ) = MIN_CHAR + $100 * ( %11001000 + PRIORITY + PL ) S_P2CA( 3 * PL + 1 ) = MIN_CHAR + 4 + $100 * ( %11001000 + PRIORITY + PL ) S_P2CA( 3 * PL + 2 ) = MIN_CHAR + 8 + $100 * ( %11001000 + PRIORITY + PL ) NEXT PL FOR SN = 0 TO 9 S_STEP( SN ) = ( SN - SPRITE_ORDER + S_SMAX ) MOD S_SMAX NEXT SN FOR WIDTH = 0 TO 31 S_W2WORD( WIDTH ) = $100 * WIDTH NEXT WIDTH PYWORD = $2020 FOR PY = 0 TO 127 OFFSET_PY = 4 * S_SMAX * PY S_Y2LIST( PY ) = S_LIST_ADR + PY S_Y2HDR0( PY ) = S_HDR0_ADR + PY S_Y2BDY0( PY ) = S_BDY0_ADR + OFFSET_PY S_Y2HDR1( PY ) = S_HDR1_ADR + PY S_Y2BDY1( PY ) = S_BDY1_ADR + OFFSET_PY S_Y2HDR2( PY ) = S_HDR2_ADR + PY S_Y2BDY2( PY ) = S_BDY2_ADR + OFFSET_PY FOR SN = 0 TO S_SMAX - 1 S_YN2BDY_XY( PY, SN ) = OFFSET_PY + 4 * SN S_YN2BDY_CA( PY, SN ) = S_YN2BDY_XY( PY, SN ) + 2 NEXT SN FOR PY2 = 0 TO 127 S_YY2SIZE( PY2, PY ) = PY2 - PY + 2 NEXT PY2 FOR PX = 0 TO 159 S_XY2WORD( PX, PY ) = PX + PYWORD NEXT PX ADD PYWORD, $100 NEXT PY CALL S_PAL( 0 ) ON VBL CALL S_VBL END SUB SUB S_RASTER0 COPY S_Y2BDY0( RASTER ), PEEK( S_Y2HDR0( RASTER ) ) TO S_RASTER_ADR END SUB SUB S_RASTER1 COPY S_Y2BDY1( RASTER ), PEEK( S_Y2HDR1( RASTER ) ) TO S_RASTER_ADR END SUB SUB S_RASTER2 COPY S_Y2BDY2( RASTER ), PEEK( S_Y2HDR2( RASTER ) ) TO S_RASTER_ADR END SUB SUB S_PAL( PL ) S_CA = S_P2CA( PL ) END SUB SUB S_CLS FILL S_LIST_ADR, S_LIST_SIZE FILL S_HDR0_ADR, S_BUFR_SIZE POKE S_HDR0_ADR, S_RASTER_SIZE FILL S_RASTER_ADR, S_RASTER_SIZE END SUB SUB S_PAGE_FLIP INC S_NEXT_PAGE SWAP S_HDR0_ADR, S_HDR1_ADR SWAP S_BDY0_ADR, S_BDY1_ADR SWAP S_HDR1_ADR, S_HDR2_ADR SWAP S_BDY1_ADR, S_BDY2_ADR END SUB SUB S_VBL IF S_NEXT_PAGE THEN DEC S_NEXT_PAGE IF S_RASTER_NUM = 2 THEN ON RASTER CALL S_RASTER2 S_RASTER_NUM = 0 ELSE IF S_RASTER_NUM THEN ON RASTER CALL S_RASTER1 INC S_RASTER_NUM ELSE ON RASTER CALL S_RASTER0 INC S_RASTER_NUM END IF END IF END SUB SUB S_PXL( FX, FY ) IF FX >= 0 AND FX < 160 AND FY >= 0 AND FY < 128 THEN SN = S_STEP( PEEK( S_Y2LIST( FY ) ) ) POKE S_Y2LIST( FY ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( FY, SN ), S_XY2WORD( FX, FY ) POKEW S_BDY0_ADR + S_YN2BDY_CA( FY, SN ), S_CA POKEW S_HDR0_ADR + FY, S_RASTER_WORD END IF END SUB SUB S_PXL_NO_HDR( FX, FY ) IF FX >= 0 AND FX < 160 AND FY >= 0 AND FY < 128 THEN SN = S_STEP( PEEK( S_Y2LIST( FY ) ) ) POKE S_Y2LIST( FY ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( FY, SN ), S_XY2WORD( FX, FY ) POKEW S_BDY0_ADR + S_YN2BDY_CA( FY, SN ), S_CA END IF END SUB SUB S_VERT( PX, PY1, PY2 ) FOR PY = PY1 TO PY2 SN = S_STEP( PEEK( S_Y2LIST( PY ) ) ) POKE S_Y2LIST( PY ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( PY, SN ), S_XY2WORD( PX, PY ) POKEW S_BDY0_ADR + S_YN2BDY_CA( PY, SN ), S_CA NEXT PY FILL S_HDR0_ADR + PY1, S_YY2SIZE( PY2, PY1 ), S_RASTER_SIZE END SUB SUB S_HORZ_CLIP( FX1, FX2, PY ) IF PY >= 0 AND PY < 128 THEN PX = MIN( MAX( 0, INT( FX1 ) ), 159 ) IF FX1 < 160 AND FX2 >= PX THEN SN = S_STEP( PEEK( S_Y2LIST( PY ) ) ) POKE S_Y2LIST( PY ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( PY, SN ), S_XY2WORD( PX, PY ) - S_W2WORD( MIN( FX2 - PX, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( PY, SN ), S_CA POKEW S_HDR0_ADR + PY, S_RASTER_WORD END IF END IF END SUB SUB S_HORZ( FX1, FX2, PY ) 'IF PY >= 0 AND PY < 128 THEN PX = MIN( MAX( 0, INT( FX1 ) ), 159 ) IF FX1 < 160 AND FX2 >= PX THEN SN = S_STEP( PEEK( S_Y2LIST( PY ) ) ) POKE S_Y2LIST( PY ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( PY, SN ), S_XY2WORD( PX, PY ) - S_W2WORD( MIN( FX2 - PX, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( PY, SN ), S_CA POKEW S_HDR0_ADR + PY, S_RASTER_WORD END IF 'END IF END SUB SUB S_HORZ_NO_HDR( FX1, FX2, PY ) 'IF PY >= 0 AND PY < 128 THEN PX = MIN( MAX( 0, INT( FX1 ) ), 159 ) IF FX1 < 160 AND FX2 >= PX THEN SN = S_STEP( PEEK( S_Y2LIST( PY ) ) ) POKE S_Y2LIST( PY ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( PY, SN ), S_XY2WORD( PX, PY ) - S_W2WORD( MIN( FX2 - PX, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( PY, SN ), S_CA 'POKEW S_HDR0_ADR + PY, S_RASTER_WORD END IF 'END IF END SUB SUB S_RECT( FX1, PY1, FX2, PY2 ) FOR PY = PY1 TO PY2 CALL S_HORZ_NO_HDR( FX1, FX2, PY ) NEXT PY FILL S_HDR0_ADR + PY1, S_YY2SIZE( PY2, PY1 ), S_RASTER_SIZE END SUB SUB S_CIRC( FX, FY, FR ) 'CALLING SUBPROGRAM BOUNDS FR. Y0 = INT( FY ) Y1 = Y0 - INT( FR ) Y2 = Y0 + INT( FR ) IF Y1 < 128 AND Y2 >= 0 THEN Y1 = MIN( MAX( 0, Y1 ), 127 ) Y2 = MIN( MAX( 0, Y2 ), 127 ) R2 = ( INT( FR ) + 0.5 ) ^ 2 X0 = INT( FX ) FOR PY = Y1 TO Y2 PX = INT( SQR( R2 - ( PY - Y0 ) ^ 2 ) ) CALL S_HORZ_NO_HDR( X0 - PX, X0 + PX, PY ) NEXT PY FILL S_HDR0_ADR + Y1, S_YY2SIZE( Y2, Y1 ), S_RASTER_SIZE END IF END SUB SUB S_TRI( FX1, FY1, FX2, FY2, FX3, FY3 ) IF FY1 >= FY2 THEN IF FY1 >= FY3 THEN IF FY2 >= FY3 THEN PX1 = FX3 PY1 = INT( FY3 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX1 PY3 = INT( FY1 ) ELSE PX1 = FX2 PY1 = INT( FY2 ) PX2 = FX3 PY2 = INT( FY3 ) PX3 = FX1 PY3 = INT( FY1 ) END IF ELSE PX1 = FX2 PY1 = INT( FY2 ) PX2 = FX1 PY2 = INT( FY1 ) PX3 = FX3 PY3 = INT( FY3 ) END IF ELSE IF FY2 >= FY3 THEN IF FY1 >= FY3 THEN PX1 = FX3 PY1 = INT( FY3 ) PX2 = FX1 PY2 = INT( FY1 ) PX3 = FX2 PY3 = INT( FY2 ) ELSE PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX3 PY2 = INT( FY3 ) PX3 = FX2 PY3 = INT( FY2 ) END IF ELSE PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX3 PY3 = INT( FY3 ) END IF END IF IF PY3 - PY1 THEN CY1 = MAX( PY1, 0 ) + 0.5 CY3 = MIN( PY3, 127.5 ) SLOPE13 = ( PX3 - PX1 ) / ( PY3 - PY1 ) X13 = SLOPE13 * ( CY1 - PY1 ) + PX1 IF PY2 - PY1 THEN SLOPE12 = ( PX2 - PX1 ) / ( PY2 - PY1 ) CY2 = MIN( PY2, 127.5 ) X12 = SLOPE12 * ( CY1 - PY1 ) + PX1 IF SLOPE13 <= SLOPE12 THEN DEC X12 FOR ROW = CY1 TO CY2 PX0 = MIN( MAX( 0, INT( X13 ) ), 159 ) IF X13 < 160 AND X12 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X12 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X12, SLOPE12 ADD X13, SLOPE13 NEXT ROW ELSE DEC X13 FOR ROW = CY1 TO CY2 PX0 = MIN( MAX( 0, INT( X12 ) ), 159 ) IF X12 < 160 AND X13 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X13 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X12, SLOPE12 ADD X13, SLOPE13 NEXT ROW INC X13 END IF END IF IF PY3 - PY2 THEN CY2 = MAX( PY2, 0 ) + 0.5 SLOPE23 = ( PX3 - PX2 ) / ( PY3 - PY2 ) X23 = SLOPE23 * ( CY2 - PY3 ) + PX3 IF SLOPE13 <= SLOPE23 THEN DEC X13 FOR ROW = CY2 TO CY3 PX0 = MIN( MAX( 0, INT( X23 ) ), 159 ) IF X23 < 160 AND X13 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X13 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X23, SLOPE23 ADD X13, SLOPE13 NEXT ROW ELSE DEC X23 FOR ROW = CY2 TO CY3 PX0 = MIN( MAX( 0, INT( X13 ) ), 159 ) IF X13 < 160 AND X23 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X23 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X23, SLOPE23 ADD X13, SLOPE13 NEXT ROW END IF END IF IF CY3 >= 0 AND CY1 < 128 THEN FILL S_HDR0_ADR + CY1, S_YY2SIZE( CY3, CY1 ), S_RASTER_SIZE END IF END SUB SUB S_TRI_INLINE( FX1, FY1, FX2, FY2, FX3, FY3 ) REPEAT IF FY1 >= FY2 THEN IF FY1 >= FY3 THEN IF FY2 >= FY3 THEN PX1 = FX3 PY1 = INT( FY3 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX1 PY3 = INT( FY1 ) ELSE PX1 = FX2 PY1 = INT( FY2 ) PX2 = FX3 PY2 = INT( FY3 ) PX3 = FX1 PY3 = INT( FY1 ) END IF ELSE PX1 = FX2 PY1 = INT( FY2 ) PX2 = FX1 PY2 = INT( FY1 ) PX3 = FX3 PY3 = INT( FY3 ) END IF ELSE IF FY2 >= FY3 THEN IF FY1 >= FY3 THEN PX1 = FX3 PY1 = INT( FY3 ) PX2 = FX1 PY2 = INT( FY1 ) PX3 = FX2 PY3 = INT( FY2 ) ELSE PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX3 PY2 = INT( FY3 ) PX3 = FX2 PY3 = INT( FY2 ) END IF ELSE PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX3 PY3 = INT( FY3 ) END IF END IF UNTIL 1 IF PY3 - PY1 THEN CY1 = MAX( PY1, 0 ) + 0.5 CY3 = MIN( PY3, 127.5 ) SLOPE13 = ( PX3 - PX1 ) / ( PY3 - PY1 ) X13 = SLOPE13 * ( CY1 - PY1 ) + PX1 IF PY2 - PY1 THEN REPEAT SLOPE12 = ( PX2 - PX1 ) / ( PY2 - PY1 ) CY2 = MIN( PY2, 127.5 ) X12 = SLOPE12 * ( CY1 - PY1 ) + PX1 IF SLOPE13 <= SLOPE12 THEN DEC X12 FOR ROW = CY1 TO CY2 'CALL S_HORZ_NO_HDR( X13, X12, ROW ) PX0 = MIN( MAX( 0, INT( X13 ) ), 159 ) IF X13 < 160 AND X12 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X12 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X12, SLOPE12 ADD X13, SLOPE13 NEXT ROW ELSE DEC X13 FOR ROW = CY1 TO CY2 'CALL S_HORZ_NO_HDR( X12, X13, ROW ) PX0 = MIN( MAX( 0, INT( X12 ) ), 159 ) IF X12 < 160 AND X13 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X13 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X12, SLOPE12 ADD X13, SLOPE13 NEXT ROW INC X13 END IF UNTIL 1 END IF IF PY3 - PY2 THEN REPEAT CY2 = MAX( PY2, 0 ) + 0.5 SLOPE23 = ( PX3 - PX2 ) / ( PY3 - PY2 ) X23 = SLOPE23 * ( CY2 - PY3 ) + PX3 IF SLOPE13 <= SLOPE23 THEN DEC X13 FOR ROW = CY2 TO CY3 'CALL S_HORZ_NO_HDR( X23, X13, ROW ) PX0 = MIN( MAX( 0, INT( X23 ) ), 159 ) IF X23 < 160 AND X13 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X13 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X23, SLOPE23 ADD X13, SLOPE13 NEXT ROW ELSE DEC X23 FOR ROW = CY2 TO CY3 'CALL S_HORZ_NO_HDR( X13, X23, ROW ) PX0 = MIN( MAX( 0, INT( X13 ) ), 159 ) IF X13 < 160 AND X23 >= PX0 THEN SN = S_STEP( PEEK( S_Y2LIST( ROW ) ) ) POKE S_Y2LIST( ROW ), SN POKEW S_BDY0_ADR + S_YN2BDY_XY( ROW, SN ), S_XY2WORD( PX0, ROW ) - S_W2WORD( MIN( X23 - PX0, 31 ) ) POKEW S_BDY0_ADR + S_YN2BDY_CA( ROW, SN ), S_CA END IF ADD X23, SLOPE23 ADD X13, SLOPE13 NEXT ROW END IF UNTIL 1 END IF IF CY3 >= 0 AND CY1 < 128 THEN FILL S_HDR0_ADR + CY1, S_YY2SIZE( CY3, CY1 ), S_RASTER_SIZE END IF END SUB SUB S_TRI_OPTIMIZED( FX1, FY1, FX2, FY2, FX3, FY3 ) REPEAT IF FY1 >= FY2 THEN IF FY1 >= FY3 THEN IF FY2 >= FY3 THEN PX1 = FX3 PY1 = INT( FY3 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX1 PY3 = INT( FY1 ) ELSE PX1 = FX2 PY1 = INT( FY2 ) PX2 = FX3 PY2 = INT( FY3 ) PX3 = FX1 PY3 = INT( FY1 ) END IF ELSE PX1 = FX2 PY1 = INT( FY2 ) PX2 = FX1 PY2 = INT( FY1 ) PX3 = FX3 PY3 = INT( FY3 ) END IF ELSE IF FY2 >= FY3 THEN IF FY1 >= FY3 THEN PX1 = FX3 PY1 = INT( FY3 ) PX2 = FX1 PY2 = INT( FY1 ) PX3 = FX2 PY3 = INT( FY2 ) ELSE PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX3 PY2 = INT( FY3 ) PX3 = FX2 PY3 = INT( FY2 ) END IF ELSE PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX3 PY3 = INT( FY3 ) END IF END IF UNTIL 1 IF PY3 - PY1 THEN CY1 = MAX( PY1, 0 ) + 0.5 CY3 = MIN( PY3, 127.5 ) SLOPE13 = ( PX3 - PX1 ) / ( PY3 - PY1 ) X13 = SLOPE13 * ( CY1 - PY1 ) + PX1 IF PY2 - PY1 THEN REPEAT SLOPE12 = ( PX2 - PX1 ) / ( PY2 - PY1 ) CY2 = MIN( PY2, 127.5 ) X12 = SLOPE12 * ( CY1 - PY1 ) + PX1 IF SLOPE13 <= SLOPE12 THEN DEC X12 FOR ROW = CY1 TO CY2 CALL S_HORZ_NO_HDR( X13, X12, ROW ) ADD X12, SLOPE12 ADD X13, SLOPE13 NEXT ROW ELSE DEC X13 FOR ROW = CY1 TO CY2 CALL S_HORZ_NO_HDR( X12, X13, ROW ) ADD X12, SLOPE12 ADD X13, SLOPE13 NEXT ROW INC X13 END IF UNTIL 1 END IF IF PY3 - PY2 THEN REPEAT CY2 = MAX( PY2, 0 ) + 0.5 SLOPE23 = ( PX3 - PX2 ) / ( PY3 - PY2 ) X23 = SLOPE23 * ( CY2 - PY3 ) + PX3 IF SLOPE13 <= SLOPE23 THEN DEC X13 FOR ROW = CY2 TO CY3 CALL S_HORZ_NO_HDR( X23, X13, ROW ) ADD X23, SLOPE23 ADD X13, SLOPE13 NEXT ROW ELSE DEC X23 FOR ROW = CY2 TO CY3 CALL S_HORZ_NO_HDR( X13, X23, ROW ) ADD X23, SLOPE23 ADD X13, SLOPE13 NEXT ROW END IF UNTIL 1 END IF IF CY3 >= 0 AND CY1 < 128 THEN FILL S_HDR0_ADR + CY1, S_YY2SIZE( CY3, CY1 ), S_RASTER_SIZE END IF END SUB SUB S_TRI_ALGORITHM( FX1, FY1, FX2, FY2, FX3, FY3 ) REPEAT PX1 = FX1 PY1 = INT( FY1 ) PX2 = FX2 PY2 = INT( FY2 ) PX3 = FX3 PY3 = INT( FY3 ) IF PY2 < PY1 THEN SWAP PX1, PX2 SWAP PY1, PY2 END IF IF PY3 < PY2 THEN SWAP PX2, PX3 SWAP PY2, PY3 IF PY2 < PY1 THEN SWAP PX1, PX2 SWAP PY1, PY2 END IF END IF UNTIL 1 IF PY3 - PY1 THEN SLOPE13 = ( PX3 - PX1 ) / ( PY3 - PY1 ) INTCP13 = PX3 - SLOPE13 * PY3 IF PY2 - PY1 THEN REPEAT SLOPE12 = ( PX2 - PX1 ) / ( PY2 - PY1 ) INTCP12 = PX2 - SLOPE12 * PY2 FOR PY1 = PY1 + 0.5 TO PY2 X12 = SLOPE12 * PY1 + INTCP12 X13 = SLOPE13 * PY1 + INTCP13 CALL S_HORZ_CLIP( MIN( X12, X13 ), MAX( X12, X13 ) - 1, PY1 ) NEXT PY1 UNTIL 1 END IF IF PY3 - PY2 THEN REPEAT SLOPE23 = ( PX3 - PX2 ) / ( PY3 - PY2 ) INTCP23 = PX3 - SLOPE23 * PY3 FOR PY2 = PY2 + 0.5 TO PY3 X23 = SLOPE23 * PY2 + INTCP23 X13 = SLOPE13 * PY2 + INTCP13 CALL S_HORZ_CLIP( MIN( X23, X13 ), MAX( X23, X13 ) - 1, PY2 ) NEXT PY2 UNTIL 1 END IF END IF END SUB SUB F_INIT F_STR$ = CHR$(10) + CHR$(10) + CHR$(10) + CHR$(10) + CHR$(10) F_STR$ = "%" + F_STR$ + F_STR$ + CHR$(10) END SUB SUB F_SHOW INC F_FRAMES IF TIMER - F_TIME >= 30 THEN IF S_RASTER_NUM = 2 THEN ADR = S_HDR1_ADR ELSE IF S_RASTER_NUM THEN ADR = S_HDR0_ADR ELSE ADR = S_HDR2_ADR AD2 = ADR + 127 CPU = 1024 FOR ADR = ADR TO AD2 ADD CPU, PEEK( ADR ) NEXT ADR IF CPU / 175.56 < 10 THEN Z$ = "0" ELSE Z$ = "" TRACE "RASTER" TRACE "CPU" TRACE Z$ + STR$( INT( CPU / 175.56 ) ) + F_STR$ FPS = 60 * F_FRAMES / ( TIMER - F_TIME ) F_FRAMES = 0 F_TIME = TIMER IF FPS < 10 THEN Z$ = "0" ELSE Z$ = "" TRACE "FPS" TRACE Z$ + STR$( INT( FPS ) ) END IF END SUB #1:MAIN PALETTES 003008031010253A0004192E0014293E 0002162B0011263B00051A2F00152A3F #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0103070F1F3F7FFF0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000103070F1F3F7FFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0103070F1F3F7FFF0103070F1F3F7FFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0103070F1F3F7FFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000103070F1F3F7FFF 0000000000000000FFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 0103070F1F3F7FFF0103070F1F3F7FFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0103070F1F3F7FFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 00000000000000000000000000000000 00000000000000000103070F1F3F7FFF 0000000000000000FFFFFFFFFFFFFFFF 0000000000000000FFFFFFFFFFFFFFFF 00000000000000000000000000000000 0103070F1F3F7FFF0103070F1F3F7FFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0103070F1F3F7FFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 00000000000000000103070F1F3F7FFF 0000000000000000FFFFFFFFFFFFFFFF 0000000000000000FFFFFFFFFFFFFFFF 0000000000000000FFFFFFFFFFFFFFFF 0103070F1F3F7FFF0103070F1F3F7FFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 AA55AA55AA55AA550000000000000000 FFFFFFFFFFFFFFFF0000000000000000 AA55AA55AA55AA5555AA55AA55AA55AA 0000000000000000FFFFFFFFFFFFFFFF AA55AA55AA55AA55FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AA55AA55AA55AA55AA55AA55AA55AA55 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000103070F1F3F00000103070F1F3F 0F7FFFFFFFFFFFFF0F7FFFFFFFFFFFFF F0FEFFFFFFFFFFFFF0FEFFFFFFFFFFFF 000080C0E0F0F8FC000080C0E0F0F8FC 0F3F7F7FFFFFFFFF0F3F7F7FFFFFFFFF 00C0E0E0F0F0F0F000C0E0E0F0F0F0F0 071F3F7F7FFFFFFF071F3F7F7FFFFFFF 80E0F0F8F8FCFCFC80E0F0F8F8FCFCFC 071F3F7F7FFFFFFF071F3F7F7FFFFFFF E0F8FCFEFEFFFFFFE0F8FCFEFEFFFFFF 01071F3F3F7F7FFF01071F3F3F7F7FFF F8FEFFFFFFFFFFFFF8FEFFFFFFFFFFFF 000080C0C0E0E0F0000080C0C0E0E0F0 0003070F1F3F7F7F0003070F1F3F7F7F 7EFFFFFFFFFFFFFF7EFFFFFFFFFFFFFF 00C0E0F0F8FCFEFE00C0E0F0F8FCFEFE 3F7F7F7FFFFFFFFF3F7F7F7FFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFEFEFEFFFFFFFFFCFEFEFEFFFFFFFF 7F7F3F0F000000007F7F3F0F00000000 E0E0C00000000000E0E0C00000000000 FF7F7F3F1F070000FF7F7F3F1F070000 FCF8F8F0E0800000FCF8F8F0E0800000 FFFFFF7F7F3F1F07FFFFFF7F7F3F1F07 FFFFFFFEFEFCF8E0FFFFFFFEFEFCF8E0 FFFFFFFFFF7F7F3FFFFFFFFFFF7F7F3F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F0F0F0F0F0E0E0C0F0F0F0F0F0E0E0C0 7FFFFFFFFFFFFF7F7FFFFFFFFFFFFF7F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFFFFFFFFFFFFFEFEFFFFFFFFFFFFFE FFFFFFFF7F7F7F3FFFFFFFFF7F7F7F3F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFEFEFEFCFFFFFFFFFEFEFEFC 1E3F7FFFFFFFFF7F1E3F7FFFFFFFFF7F 000080C0C0C0C080000080C0C0C0C080 3C7EFFFFFFFF7E3C3C7EFFFFFFFF7E3C 387CFEFEFE7C3800387CFEFEFE7C3800 3078FCFC783000003078FCFC78300000 70F8F8F87000000070F8F8F870000000 3F1F0701000000003F1F070100000000 FFFFFEF800000000FFFFFEF800000000 C080000000000000C080000000000000 7F7F3F1F0F0703007F7F3F1F0F070300 FFFFFFFFFFFFFF7EFFFFFFFFFFFFFF7E FEFEFCF8F0E0C000FEFEFCF8F0E0C000 3F1F0F07030100003F1F0F0703010000 FFFFFFFFFFFF7F0FFFFFFFFFFFFF7F0F FFFFFFFFFFFFFEF0FFFFFFFFFFFFFEF0 FCF8F0E0C0800000FCF8F0E0C0800000 3F1E0000000000003F1E000000000000 00000000000000000000000000000000 60F0F0600000000060F0F06000000000 E0E0E00000000000E0E0E00000000000 C0C0000000000000C0C0000000000000 80000000000000008000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00181818180018000000000000000000 006C6C24000000000000000000000000 00247E24247E24000000000000000000 00083E380E3E08000000000000000000 00626408102646000000000000000000 001C34386E643A000000000000000000 00181830000000000000000000000000 000C183030180C000000000000000000 0030180C0C1830000000000000000000 000024187E1824000000000000000000 000018187E1818000000000000000000 00000000181830000000000000000000 000000007E0000000000000000000000 00000000001818000000000000000000 00060C18306040000000000000000000 003C666E76663C000000000000000000 0018381818187E000000000000000000 003C660C18307E000000000000000000 003C660C06663C000000000000000000 0066667E060606000000000000000000 007E607C06067C000000000000000000 001C307C66663C000000000000000000 007E060C183030000000000000000000 003C663C66663C000000000000000000 003C663E06663C000000000000000000 00000018001800000000000000000000 00000018001830000000000000000000 00000C1830180C000000000000000000 0000007E007E00000000000000000000 000030180C1830000000000000000000 003C660C180018000000000000000000 003C666E6E603C000000000000000000 00183C667E6666000000000000000000 007C667C66667C000000000000000000 003C666060663C000000000000000000 00786C66666C78000000000000000000 007E607860607E000000000000000000 007E6078606060000000000000000000 003C606E66663C000000000000000000 0066667E666666000000000000000000 003C181818183C000000000000000000 001E060606663C000000000000000000 00666C78786C66000000000000000000 0060606060607E000000000000000000 0042667E7E6666000000000000000000 0066767E6E6666000000000000000000 003C666666663C000000000000000000 007C667C606060000000000000000000 003C66666A6C3E000000000000000000 007C667C786C66000000000000000000 003E603C06067C000000000000000000 007E1818181818000000000000000000 0066666666663C000000000000000000 00666666663C18000000000000000000 0066667E7E6642000000000000000000 00663C183C6666000000000000000000 0066663C181818000000000000000000 007E0C1830607E000000000000000000 003C303030303C000000000000000000 006030180C0602000000000000000000 003C0C0C0C0C3C000000000000000000 00183C66000000000000000000000000 0000000000007E000000000000000000