;-------------------- ; From: Michael Dehlwes ; Subject: SIN/COS Table Create sin-table, containing sin-values*65535 (=FFFFh) for 0 to 90 degrees. (Small MS-DOS QBASIC program provided at end of msg) I used 0.1-degrees-steps, you may enhance this. If you make q-degrees-steps, use [cmp cx,(90/q)] instead of [cmp cx,900] SineTable DW 0 DW 114 DW 228 DW 343 DW 457 DW 571 ... DW 65531 DW 65532 DW 65533 DW 65534 DW 65535 EndOfSinT DW 65535 To compute value of sin(x)*y: TableEntry[x]*y/65536 Division by 65536=take high word of doubleword For better results: ((TableEntry[x]*y)+TableEntry[x])/65536 90 < x < 180: sin(x)=sin(180-x) 180 < x < 270: sin(x)=-sin(x-180) 270 < x < 360: sin(x)=-sin(360-x) cos(x)=sin(90-x) ;Draw an ellipse: ; uses vars: CenterX, CenterY, RadX, RadY ; temp vars: x,y Draw4Points MACRO pop x pop y call SetPoint (CenterX+x,CenterY+y) call SetPoint (CenterX+x,CenterY-y) call SetPoint (CenterX-x,CenterY+y) call SetPoint (CenterX-x,CenterY-y) ENDM ; Calculates sin(a/(180*q))*b -> dx SinXlat MACRO a,b local nocarry mov ax,SineTable[a] mul b add ax,SineTable[a] jnc nocarry inc dx nocarry: ENDM CosXlat MACRO a,b local nocarry mov ax,EndOfSinT[-a] mul b add ax,EndOfSinT[-a] jnc nocarry inc dx nocarry: ENDM DrawEllipse PROC mov bx,0 ; start at top drawloop: push bx ; save degrees counter shl bx,1 ; bx*2, for pointer op SinXlat bx,RadX push dx CosXlat bx,RadY push dx Draw4Points pop bx inc bx cmp bx,900 jbe drawloop ret DrawEllipse ENDP ------------- MS-DOS QBasic: MakeSinT.Bas DEFDBL A-Z OPEN "O", 1, "SINETABL.INC" INPUT "Steps/degree (e.g. 10 for 1/10-degree-steps):", Steps PRINT "Memory required for table:"; INT(180 * Steps) + 2; "bytes" f = 3.141592654# / (180 * Steps) FOR i = 0 TO 90 * Steps PRINT #1, "DW "; INT(SIN(i * f) * 65536) NEXT CLOSE 1 --------------