With very little modification to the original code you posted:
'-------------------------------------------------------------------------------
' Cogs By Shockwave
'
' An intro featuring gear wheels :-)
'-------------------------------------------------------------------------------
OPTION STATIC
OPTION EXPLICIT
CONST XRES = 800
CONST YRES = 600
DIM SHARED AS DOUBLE RAD2DEG
DIM SHARED AS INTEGER HALFX = (XRES/2)
DIM SHARED AS INTEGER HALFY = (YRES/2)
DIM SHARED AS DOUBLE ROLL1,ROLL2,SMV
RAD2DEG = ((4*ATN(1)) / 180 )
''#define PTC_WIN
#INCLUDE "TINYPTC_EXT.BI"
#INCLUDE "WINDOWS.BI"
DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )
DECLARE SUB DRAW_WHEEL(BYVAL CX AS INTEGER ,_
BYVAL CY AS INTEGER,_
BYVAL RADIUS AS DOUBLE ,_
BYVAL STEPSIZE AS DOUBLE,_
BYVAL TOOTHSIZE AS DOUBLE,_
BYVAL ANGLE AS DOUBLE ,_
BYVAL COLOUR AS UINTEGER ,_
byval light_x as single=320.0,_
byval light_y as single=240.0,_
byval offset as single=1.1)
DECLARE SUB FLAT_TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)
'-------------------------------------------------------------------------------
PTC_ALLOWCLOSE(0)
PTC_SETDIALOG(0,"",0,0)
IF (PTC_OPEN("<( - DBF - )>",XRES,YRES)=0) THEN
END-1
END IF
'-------------------------------------------------------------------------------
dim as single la,shadow_offset,light_x,light_y
dim as integer i,c0,c1,c2
WHILE(GETASYNCKEYSTATE(VK_ESCAPE)<>-32767)
SMV=1.5*SIN(TIMER/3)
ROLL1=ROLL1+SMV
ROLL2=ROLL2-SMV
'rotate light around centre of screen
la+=0.01
IF ROLL1>360 THEN ROLL1=ROLL1-360
for i=0 to 1
if i=0 then
'change this value slightly for more/less depth
shadow_offset=1.08
'shadow colour
c0=&h300030
c1=c0
c2=c0
else
shadow_offset=1.0
c0=&H778899
c1=&H8899AA
c2=&H667788
end if
light_x=400.0+350.0*sin(la)
light_y=300.0+250.0*cos(la)
DRAW_WHEEL ( 460 , 115 , 50 , 20 , 6 , (ROLL1*2),c0, light_x,light_y,shadow_offset )
DRAW_WHEEL ( 460 , 395 , 50 , 20 , 6 , (ROLL1*2),c0, light_x,light_y,shadow_offset )
DRAW_WHEEL ( 198 , 140 , 100 , 10 , 10 , ROLL1,c1, light_x,light_y,shadow_offset )
DRAW_WHEEL ( 379 , 255 , 100 , 10 , 10 , (ROLL2-5) ,c2, light_x,light_y,shadow_offset )
DRAW_WHEEL ( 617 , 433 , 100 , 10 , 10 , (ROLL2-5) ,c2, light_x,light_y,shadow_offset )
next
'draw the light position
draw_wheel(400.0+350.0*sin(la),300.0+250.0*cos(la),20,1,1,0,&hffffff)
PTC_UPDATE@BUFFER(0)
for i=0 to (800*600-1)
buffer(i)=&h600060
next
WEND
'-------------------------------------------------------------------------------
'
' USAGE : DRAW_WHEEL ( XPOS , YPOS , RADIUS , STEPSIZE , TOOTH SIZE , ROTATION )
'
SUB DRAW_WHEEL(BYVAL CX AS INTEGER ,BYVAL CY AS INTEGER, BYVAL RADIUS AS DOUBLE , BYVAL STEPSIZE AS DOUBLE, BYVAL TOOTHSIZE AS DOUBLE, BYVAL ANGLE AS DOUBLE , BYVAL COLOUR AS UINTEGER ,byval light_x as single=320.0,byval light_y as single=240.0, byval offset as single=1.1)
DIM AS DOUBLE RADIUS2
DIM AS INTEGER STORE
DIM AS INTEGER CNT
STORE = (360/STEPSIZE)+1
DIM AS DOUBLE X1(STORE),Y1(STORE),X2(STORE),Y2(STORE)
DIM AS INTEGER L
'-------------------------------------------------------------------------------
' First create the gearwheel object;
'-------------------------------------------------------------------------------
RADIUS2 = TOOTHSIZE+RADIUS
FOR L=0 TO 360 STEP STEPSIZE
X1(CNT) = (RADIUS * SIN ((L+ANGLE) * RAD2DEG)) + CX
Y1(CNT) = (RADIUS * COS ((L+ANGLE) * RAD2DEG)) + CY
X2(CNT) = (RADIUS2* SIN ((L+ANGLE) * RAD2DEG)) + CX
Y2(CNT) = (RADIUS2* COS ((L+ANGLE) * RAD2DEG)) + CY
' BUFFER (INT(X1(CNT))+(INT(Y1(CNT))*XRES)) = &HFFFFFF
' BUFFER (INT(X2(CNT))+(INT(Y2(CNT))*XRES)) = &HFFFFFF
CNT=CNT+1
NEXT
'-------------------------------------------------------------------------------
' Now we can draw it.
'-------------------------------------------------------------------------------
' INSIDE FIRST;
FOR L=0 TO CNT-2
FLAT_TRIANGLE(light_x+(CX-light_x)*offset,light_y+(CY-light_y)*offset,_
light_x+(X1(L)-light_x)*offset,light_y+(Y1(L)-light_y)*offset,_
light_x+(X1(L+1)-light_x)*offset,light_y+(Y1(L+1)-light_y)*offset,_
COLOUR)
NEXT
' NOW THE TEETH;
FOR L=0 TO CNT-2 STEP 2
FLAT_TRIANGLE(light_x+(X2(L)-light_x)*offset,light_y+(Y2(L)-light_y)*offset,_
light_x+(X1(L)-light_x)*offset,light_y+(Y1(L)-light_y)*offset,_
light_x+(X1(L+1)-light_x)*offset,light_y+(Y1(L+1)-light_y)*offset,_
COLOUR)
FLAT_TRIANGLE(light_x+(X2(L)-light_x)*offset,light_y+(Y2(L)-light_y)*offset,_
light_x+(X2(L+1)-light_x)*offset,light_y+(Y2(L+1)-light_y)*offset,_
light_x+(X1(L+1)-light_x)*offset,light_y+(Y1(L+1)-light_y)*offset,_
COLOUR)
NEXT
END SUB
SUB FLAT_TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)
'-------------------------------------------------------------------------
' FLAT TRIANGLE RENDERER WITH ASSEMBLY LANGUAGE RASTERISING BY SHOCKWAVE ^ DBF ^ S!P 2006.
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' WE NEED TO SORT THESE POINTS INTO ORDER FROM TOP TO BOTTOM, AN EXCHANGE SORT IS OK.
' AS WE ONLY HAVE GOT 3 POINTS TO ARRANGE.
'-------------------------------------------------------------------------
DIM AS INTEGER TEMPX,TEMPY,LO,LI
DIM AS INTEGER PX(3)
DIM AS INTEGER PY(3)
DIM TFLAG AS INTEGER
dim pp as uinteger PTR
DIM AS INTEGER IL1,IL2,SLICE
TFLAG=0
PX(1)= X1
PX(2)= X2
PX(3)= X3
PY(1)= Y1
PY(2)= Y2
PY(3)= Y3
FOR LO = 1 TO 2
FOR LI =1 TO 2
IF PY(LI+1) <= PY(LI) THEN
TEMPX = PX(LI) : TEMPY = PY(LI)
PX(LI) = PX(LI+1)
PY(LI) = PY(LI+1)
PX(LI+1) = TEMPX
PY(LI+1) = TEMPY
END IF
NEXT LI
NEXT LO
' BOOT OUT INVISIBLE TRIANGLES!
IF PX(1)<0 AND PX(2)<0 AND PX(3)< 0 THEN TFLAG=1
IF PX(1)>XRES AND PX(2)>XRES AND PX(3)>XRES THEN TFLAG=1
IF PY(1)>YRES AND PY(2)>YRES AND PY(3)>YRES THEN TFLAG=1
DIM AS DOUBLE XP1,XP2:' SCREEN POSITIONS.
DIM AS DOUBLE XI1,XI2:' INTERPOLATIONS.
'***
'*** REGULAR TRIANGLE (Y1<Y2 Y2<Y3)
'***
IF PY(1)<PY(2) AND PY(2)<PY(3) or (PY(2) = PY(3)) THEN
TFLAG=1
XP1 = PX(1)
XP2 = PX(1)
XI1 = (PX(1)-PX(2)) / (PY(2) - PY(1))
XI2 = (PX(1)-PX(3)) / (PY(3) - PY(1))
FOR LO = PY(1) TO PY(2)-1
IF LO>=0 AND LO<YRES THEN
IF XP1<=XP2 THEN
IL1=XP1
IL2=XP2
ELSE
IL1=XP2
IL2=XP1
END IF
IF IL2>XRES THEN IL2=XRES
IF IL1<0 THEN IL1=0
SLICE = IL2-IL1
IF SLICE>0 THEN
PP = @BUFFER(IL1+(LO*XRES))
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT
XI1 = (PX(2)-PX(3)) / (PY(3) - PY(2))
XP1 = PX(2)
FOR LO = PY(2) TO PY(3)
IF LO>=0 AND LO<YRES THEN
IF XP1<=XP2 THEN
IL1=XP1
IL2=XP2
ELSE
IL1=XP2
IL2=XP1
END IF
IF IL2>XRES THEN IL2=XRES
IF IL1<0 THEN IL1=0
SLICE = IL2-IL1
IF SLICE>0 THEN
PP = @BUFFER(IL1+(LO*XRES))
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT
END IF
'***
'*** FLAT TOPPED TRIANGLE Y1=Y2
'***
IF TFLAG=0 AND PY(1) = PY(2) THEN
TFLAG=1
XP1 = PX(1)
XP2 = PX(2)
XI1 = (PX(1)-PX(3)) / (PY(3) - PY(1))
XI2 = (PX(2)-PX(3)) / (PY(3) - PY(2))
FOR LO = PY(1) TO PY(3)
IF LO>=0 AND LO<YRES THEN
IF XP1<=XP2 THEN
IL1=XP1
IL2=XP2
ELSE
IL1=XP2
IL2=XP1
END IF
IF IL2>XRES THEN IL2=XRES
IF IL1<0 THEN IL1=0
SLICE = IL2-IL1
IF SLICE>0 THEN
PP = @BUFFER(IL1+(LO*XRES))
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT
END IF
END SUB