 ** LIB3D EXTENSIONS** Á COLLECTION OF ROUTINES WHICH EXTENDS* THE 3D LIBRARY, ADDING ROUTINES FOR CREATING,* MANIPULATING, AND RENDERING OBJECTS.** ÓÌÊ ÍARCH/ÁPRIL 1999*** ÉDEA: ÍAINTAIN A LIST OF OBJECTS.* ÅACH OBJECT IS OF THE FOLLOWING FORM:** ÏBJECT:*        ÃENTERØ          2 BYTES*        ÃENTERÙ          2 BYTES*        ÃENTERÚ          2 BYTES*        ÏBJ DATA POINTER 2 BYTES*        ÉÄ BYTE          1 BYTE*        ÕSER BYTE        1 BYTE*        ÃENTER POSITION  1 BYTE*        ÃENTERØÒEM       1 BYTE*              ÙÒEM       1 BYTE*              ÚÒEM       1 BYTE*        ÏRIENTATION MATRIX 18 BYTESÏBJÃØ = 0ÏBJÃÙ = 2ÏBJÃÚ = 4ÏBJÄATA = 6ÏBJÉÄ = 8ÏBJÕSER = 9ÏBÃENÐOS = 10ÏBJÃØÒEM = 11ÏBJÃÙÒEM = 12ÏBJÃÚÒEM = 13ÏBJÍAT = 14ÏBJÓIZE = 32à;32 BYTES TOTAL** ÃENTERØ/Ù/Ú REPRESENTS THE OBJECT LOCATION* ÄATA POINTER POINTS TO OBJECT DATA, BELOW.* ÉÄ AND USER BYTE IS OPTIONAL, TO LET THE USER ASSIGN AN ÉÄ TO AN OBJECT* ÃENTERØ/Ù/ÚÒEM IS THE FRACTIONAL PART OF THE OBJECT CENTERS,*   USED BY THE MOVEMENT ROUTINES* ÏRIENTATION MATRIX CONSISTS OF 9-BYTE INTEGER MATRIX AND 9-BYTE REMAINDER*** ÏBJECT DATA: ÔHERE ARE TWO TYPES OF* OBJECTS, NORMAL AND COMPOUND, WHICH* ARE OBJECTS MADE UP OF A NUMBER OF* SMALLER "OBLETS".  ÎORMAL OBJECT DATA* IS OF THE FOLLOWING FORM:**        ÔYPEÉÄ = 0   1 BYTE*        # OF POINTS  1 BYTE*        # OF FACES   1 BYTE*        XCOORDS      N BYTES*        YCOORDS      N BYTES*        ZCOORDS      N BYTES*    FACES:*        # OF POINTS  1 BYTE*        FILL PATTERN 1 BYTE*        POINT LIST   M BYTES** THAT IS, POINT DATA FOLLOWED BY A LIST OF FACES.* ÆILL PATTERN IS AN INDEX INTO FILL PATTERN LIST, USED WITH SOLID POLYGONS.* X/Y/ZCOORDS CONSIST OF P OBJECT POINTS (-96..96) FOLLOWED BY Q NORMALS.** ÃOMPOUND OBJECTS ARE OF THE FORM:**        ÔYPEÉÄ = $80 1 BYTE*        # OF POINTS  1 BYTE*        # OF OBLETS  1 BYTE*        XCOORDS      N BYTES*        YCOORDS      N BYTES*        ZCOORDS      N BYTES*    OBLETS:*        REF POINTS   P BYTES*        OBLET 1*          OBLET SIZE (IN BYTES)*                     1 BYTE*          # OF FACES 1 BYTE*          FACES*        OBLET 2 ...** ÅACH OBLET IS SIMILAR TO A NORMAL OBJECT, BUT IS ASSOCIATED WITH A POINT* IN THE POINT LIST -- THE REFERENCE POINT.  ÔHE OBLETS ARE DRAWN BY FIRST* DEPTH-SORTING THESE POINTS AND DRAWING FROM BACK TO FRONT.* ORG $5000 JMP ÉNIT3Äà;ÉNITIALIZE LIB3D JMP ÁDDÏBJà;ÁDD OBJECT TO OBJECT LIST JMP ÄELÏBJà;ÄELETE OBJECT FROM LIST JMP ÓETÃURÏBà;ÓET CURRENT OBJECT JMP ÇETÃURÏBà;ÇET CURRENT OBJECT JMP ÇETÎEXTÏBà;ÇET NEXT OBJECT IN LIST JMP ÇETÏBJà;ÇET POINTER TO OBJECT JMP ÓETÍATà;ÃALCULATE AND SET OBJECT MATRIX JMP ÐITCHà;ÐITCH - ROTATE OBJECT AROUND X-AXIS JMP ÙAWà;ÙAW - ROTATE AROUND Y-AXIS JMP ÒOLLà;ÒOLL - ROTATE AROUND Z-AXIS JMP ÍOVEÓIDEà;ÍOVE OBJECT JMP ÍOVEÄOWN JMP ÍOVEÆORWARDS JMP ÇETÓIDEÖECà;ÏRIENTATION VECTORS JMP ÇETÄOWNÖECà;(LENGTH=64) JMP ÇETÆRONTÖEC JMP ÓETÐARMSà;ÓET RENDERING PARAMETERS JMP ÓETÖISÐARMSà;ÓET VISIBILITY PARAMETERS JMP ÃALCÖIEWà;ÓET VIEWPOINT = OBJECT JMP ÓORTÖISà;ÃOMPUTE AND SORT VISIBLE OBJECTS JMP ÄRAWÁLLÖISà;ÄRAW ALL VISIBLE OBJECTS JMP ÇETÎEXTÖISà;ÄRAW NEXT OBJESIBLE OBJECT LIST JMP ÒOTÄRAWà;ÒOTATE AND DRAW OBJECT JMP ÄRAWÆACEà;ÄRAW SINGLE FACE (POLYGON)ÎÕÍÏÂÊÓ ÄÆÂ 00à;ÎUMBER OF OBJECTSÎÕÍÃÅÎÔÓ ÄÆÂ 00à;ÎUMBER OF OBJECT SENTERÃÕÒÏÂÊ ÄÆÂ 00à;ÃURRENT OBJECTÌÁÓÔÏÂÊ ÄÆÂ 00ÚÍÁØ ÄÁ $2000à;ÍAXIMUM RANGEÚÍÉÎ ÄÆÂ 100à;ÍINIMUM RANGEÏÂÊÅÃÔÓ ÄÁ $0800à;ÏBJECT RECORDS 1227 = 3456 BYTES = $0Ä80*===============================TEMPA = $55TEMPX = $56TEMPY = $57TEMP = $58à;TWO BYTESPOINT = $5Aà;TWO BYTESØ1 = $60à;ÌINE X-COORDÙ1 = $62Ø2 = $64Ù2 = $66ÌÉÎÅÌÏ = $4Æ00à;ÌINES DRAWNÌÉÎÅÈÉ = $4Æ68à;SPEEDS UP WIREFRAMEÍÁØÌÉÎÅÓ = $67ÏÂÌÅÔÓ = $4ÆÄ0à;ÏBLET LISTÏÂÈÅÁÄ = $2Æà;ÈEAD OF LIST = $55ÆÆÏÂÊÌÏ = $5600à;ÏBJECT POINTERSÏÂÊÈÉ = $5680à;IF 0 THEN EMPTYÖÉÓÏÂÊÓ = $5700ÏÂÃÅÎ = $5781à;ÃENTER OBJECT #à;ÎOTE: WILL BUG IF 128 VIS OBJScx = $5800à;rOTATED/RELATIVECENTERShcx = $5880cy = $5900hcy = $5980cz = $5Á00hcz = $5Á80plistx equ $5Â00à;pOINT LISTS (PROJECTED)plisty equ $5Ã00ÐÌÉÓÔÚ ÅÑÕ $5Ä00ÍÐÒÏÊ = $5Å00à;ÔWO PAGES*===============================* LIB3D STUFFÃÁÌÃÍÁÔ equ $8800ÁÃÃÒÏÔØ equ $8803ÁÃÃÒÏÔÙ equ $8806ÁÃÃÒÏÔÚ equ $8809ÇÌÏÂÒÏÔ equ $880cÒÏÔÐÒÏÊ equ $880fÐÏÌÙÆÉÌÌ equ $8812ÐÌÏÔ ÅÑÕ $8815ÄÒÁ×ÌÉÎÅ ÅÑÕ $8818ÖÅÒÓÉÏÎ ÅÑÕ $881ÂÐÑ equ $0200à;pOINT QUEUEÍÁÔÒÉØ = $41à;lOCAL ROTATION MATRIXÖÉÅ×ÍÁÔ = $4aà;vIEWPOINT ROTATION MATRIXxoffset equ $53yoffset equ $54multlo1 equ $b1à;mULTIPLICATION TABLESmultlo2 equ $b3multhi1 equ $b5multhi2 equ $b7ÂÉÔÍÁÐ equ $b9à;pAGE OF BITMAP BASEfillpat equ $bbà;pOINTER TO FILL PATTERNplistxlo equ $bdà;pOINTERS TO PLOTTED POINTSplistxhi equ $bfplistylo equ $c1plistyhi equ $c3ÐÌÉÓÔÚÌÏ ÅÑÕ $8Âà;ÒOTATED Z-COORDSÐÌÉÓÔÚÈÉ ÅÑÕ $8Äc0xlo equ $63à;pOINTERS TO CENTERS TO ROTATEc0xhi equ $65c0ylo equ $67c0yhi equ $69c0zlo equ $6bc0zhi equ $6dcxlo equ $a3à;pOINTERS TO ROTATED CENTERScxhi equ $a5cylo equ $a7cyhi equ $a9czlo equ $abczhi equ $adrotmath equ $afà;pOINTER TO ROTATION MATH TABLEÐ0Ø equ $69à;pOINTERS TO POINTS TO BE ROTATEDÐ0Ù equ $6bÐ0Ú equ $6d** ÉNITIALIZE LIB3D POINTERS, VARIABLES** ÏN ENTRY: .ÁÙ = POINTER TO OBJECT RECORDS*ÉNIT3Ä ÓÔÁ ÏÂÊÅÃÔÓ ÓÔÙ ÏÂÊÅÃÔÓ+1 lda #>ÍÐÒÏÊà;tABLE AT $8000 sta rotmath+1 ldx #$c1 stx multlo1+1 dex stx multlo2+1 ldx #$c4 stx multhi1+1 dex stx multhi2+1 ÌÄÁ #$ÆÆ ÓÔÁ ÃÕÒÏÂÊ lda #00 ÓÔÁ ÎÕÍÏÂÊÓ ÓÔÁ ÌÁÓÔÏÂÊ sta plistxlo sta plistylo ÓÔÁ ÐÌÉÓÔÚÌÏ lda #$80 sta plistxhi sta plistyhi ÓÔÁ ÐÌÉÓÔÚÈÉ ldx #>plistx stx plistxlo+1 stx plistxhi+1 inx stx plistylo+1 stx plistyhi+1 ÉÎØ ÓÔØ ÐÌÉÓÔÚÌÏ+1 ÓÔØ ÐÌÉÓÔÚÈÉ+1 ldx #<ÃØ stx cxlo stx cylo stx czlo ÌÄØ #<ÈÃØ stx cxhi stx cyhi stx czhi ldx #>cx stx cxlo+1 ÌÄØ #>ÈÃØ stx cxhi+1 ldx #>cy stx cylo+1 ÌÄØ #>ÈÃÙ stx cyhi+1 ldx #>cz stx czlo+1 ÌÄØ #>ÈÃÚ stx czhi+1 ldØ #159à;(0,0) = CENTER OF SCREEN ÌÄÙ #99 ÊÓÒ ÖÅÒÓÉÏÎ ÂÐÌ :ÎÏÍ ÌÄØ #79à;ÍULTICOLOR:ÎÏÍ ÓÔØ ØÏÆÆÓÅÔ ÓÔÙ ÙÏÆÆÓÅÔ ÌÄÙ #00à;ÚERO OUT OBJECT POINTERS ÔÙÁ:Ì1 ÓÔÁ ÏÂÊÈÉ,Ù ÉÎÙ ÂÐÌ :Ì1à;128 ENTRIES ÒÔÓ** ÁDDÏBJ -- ÁDD OBJECT TO OBJECT LIST** ÏN ENTRY: .ÁÙ = POINTER TO OBJECT POINT DATA*           .Ø  = OPTIONAL ÉÄ BYTE** ÏN EXIT: .ÁÙ = POINTER TO OBJECT*          .Ø  = OBJECT NUMBER*          Ã SET INDICATES AN ERROR*ÁDDÏBJ STA TEMPA STY TEMPY STX TEMPX LDX #00à;ÆIND OPEN SLOT TXA STA TEMP CLC:LOOP LDY OBJHI,X BEQ :FOUND ADC #ÏBJÓIZEà;32 BYTES PER RECORD BCC :C1 INC TEMP CLC:C1 INX BPL :LOOP SEC RTS:FOUND ADC OBJECTS STA POINT STA OBJLO,X LDA TEMP ADC OBJECTS+1 STA POINT+1 STA OBJHI,X INC NUMOBJS CPX LASTOBJ BCC :INIT STX LASTOBJ:INIT LDY #ÏBJÓIZE-1à;ÉNIT OBJECT LDA #00:L2 STA (POINT),Y DEY BPL :L2 LDA #64à;ÉDENTITY MATRIX LDY #ÏBJÍAT STA (POINT),Y LDY #ÏBJÍAT+4 STA (POINT),Y LDY #ÏBJÍAT+8 STA (POINT),Y LDY #ÏBJÉÄ LDA TEMPXà;ÉÄ STA (POINT),Y LDA TEMPYà;ÏBJ DATA POINTER DEY STA (POINT),Y LDA TEMPA DEY STA (POINT),YÓETÃURÏB STX CUROBJÇETÃURÏB LDX CUROBJÇETÏBJ LDA OBJLO,X LDY OBJHI,X RTS** ÄELÏBJ -- ÒEMOVE OBJECT FROM LIST*           BY SETTING HIGH BYTE=0** ÏN ENTRY: .Ø = OBJECT NUMBER*           Ã SET MEANS SERIOUS ERROR!*ÄELÏBJ ÌÄÁ #00 ÓÔÁ ÏÂÊÈÉ,Ø ÌÄÁ ÎÕÍÏÂÊÓ ÂÅÑ :ÒÔÓ ÄÅÃ ÎÕÍÏÂÊÓ ÃÐØ ÌÁÓÔÏÂÊà;ÌAST OBJECT IN LIST ÂÃÃ :ÒÔÓ:Ì1 ÌÄÁ ÏÂÊÈÉ,Ø ÂÎÅ :ÓÔØ ÄÅØ ÂÐÌ :Ì1 ÓÅÃà;ÏUT OF OBJECTS! ÉÎØ:ÓÔØ ÓÔØ ÌÁÓÔÏÂÊ:ÒÔÓ ÒÔÓ** ÇETÎEXTÏB -- ÇET NEXT OBJECT IN LIST** ÏN EXIT: .Ø = OBJECT NUMBER*          .ÁÙ= OBJECT POINTER*          Ã SET INDICATES ERROR*          ÃURRENT OBJECT SET TO .Ø*ÇETÎEXTÏB ÌÄÁ ÎÕÍÏÂÊÓ ÂÅÑ :ÅÒÒ ÌÄØ ÃÕÒÏÂÊ ÂÍÉ :ÅÒÒ ÃÐØ ÌÁÓÔÏÂÊ ÂÃÃ :Ã1 ÌÄØ #$ÆÆ:Ã1 ÉÎØ ÌÄÙ ÏÂÊÈÉ,Ø ÂÅÑ :Ã1 ÌÄÁ ÏÂÊÌÏ,Ø ÓÔØ ÃÕÒÏÂÊ ÃÌÃ ÒÔÓ:ÅÒÒ ÓÅÃ ÒÔÓ*-------------------------------** ÏBJECT MANIPULATION ROUTINES**-------------------------------** ÓETÍAT -- ÃALCULATE MATRIX FOR CURRENT OBJECT** ÏN ENTRY: .Á = ÁNGLE AROUND Z-AXIS*           .Ù = ÁNGLE AROUND Y-AXIS*           .Ø = ÁNGLE AROUND X-AXIS*ÓETÍAT ÊÓÒ ÃÁÌÃÍÁÔà;ÒESULT -> ÍÁÔÒÉØ ÌÄØ ÃÕÒÏÂÊ ÂÍÉ :ÒÔÓ ÌÄÁ ÏÂÊÌÏ,Ø ÃÌÃ ÁÄÃ #ÏBJÍATà;ÍATRIX ÓÔÁ ÐÏÉÎÔ ÌÄÁ ÏÂÊÈÉ,Ø ÁÄÃ #00 ÓÔÁ ÐÏÉÎÔ+1 ÌÄÁ #00 ÌÄÙ #17:Ì2 ÓÔÁ (ÐÏÉÎÔ),Ùà;ÚERO REMAINDER ÄÅÙ ÃÐÙ #8 ÂÎÅ :Ì2:ÌÏÏÐ ÌÄÁ ÍÁÔÒÉØ,Ù ÓÔÁ (ÐÏÉÎÔ),Ù ÄÅÙ ÂÐÌ :ÌÏÏÐ:ÒÔÓ ÒÔÓ** ÙAW/ÐITCH/ÒOLL -- ÁCCUMULATE A ROTATION ON CURRENT OBJECT** ÏN ENTRY: Ã CLEAR -> POSITIVE ROTATION*           Ã SET -> NEGATIVE ROTATION*ÇETÃURÍAT ÐÈÐ ÊÓÒ ÇETÃURÏB ÃÌÃ ÁÄÃ #ÏBJÍAT ÂÃÃ :PLP ÉÎÙ:PLP ÐÌÐ ÒÔÓÐITCH ÊÓÒ ÇETÃURÍAT ÊÍÐ ÁÃÃÒÏÔØÙAW ÊÓÒ ÇETÃURÍAT ÊÍÐ ÁÃÃÒÏÔÙÒOLL ÊÓÒ ÇETÃURÍAT ÊÍÐ ÁÃÃÒÏÔÚ** ÍOVEÄOWN/ÓIDE/ÆORWARDS -- ÍOVE OBJECT ALONG ITS*   (LOCAL) Ø Ù OR Ú AXIS.** ÎOTE THAT ORIENTATION MATRIX IS INVERSE OF OBJECT MATRIX** ÏN ENTRY: .Á = VELOCITY (SIGNED)*ÍÏÖÒÔÓ ÒÔÓÍOVEÄOWN ÌÄÙ #ÏBJÍATà;ÒOW 1 ÄÆÂ $2ÃÍOVEÓIDE ÌÄÙ #ÏBJÍAT+3à;ÒOW 2 ÄÆÂ $2ÃÍOVEÆORWARDS ÌÄÙ #ÏBJÍAT+6 ÓÔÙ ÔÅÍÐÙà;ÏBJECT OFFSET ÃÍÐ #00 ÂÅÑ ÍÏÖÒÔÓ ÓÔÁ ÍÕÌÔÌÏ1à;ÐLAIN SIGNED MULTPLY ÓÔÁ ÍÕÌÔÈÉ1 ÅÏÒ #$ÆÆ ÃÌÃ ÁÄÃ #01 ÓÔÁ ÍÕÌÔÌÏ2 ÓÔÁ ÍÕÌÔÈÉ2 ÌÄØ ÃÕÒÏÂÊ ÂÍÉ ÍÏÖÒÔÓ ÌÄÁ ÏÂÊÌÏ,Ø ÓÔÁ ÐÏÉÎÔ ÌÄÁ ÏÂÊÈÉ,Ø ÓÔÁ ÐÏÉÎÔ+1 ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁÙ ÌÄÁ #ÏBJÃØÒEM ÌÄØ #ÏBJÃØ ÊÓÒ ÍOVÍULT ÌÄÙ ÔÅÍÐÙ ÉÎÙ ÓÔÙ ÔÅÍÐÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁÙ ÌÄÁ #ÏBJÃÙÒEM ÌÄØ #ÏBJÃÙ ÊÓÒ ÍOVÍULT ÌÄÙ ÔÅÍÐÙ ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁÙ ÌÄÁ #ÏBJÃÚÒEM ÌÄØ #ÏBJÃÚÍOVÍULT ÓÔØ ÔÅÍÐØà;ÃOORD ÓÔÁ ÔÅÍÐÁà;ÒEMAINDER ÌÄÁ (ÍÕÌÔÌÏ1),Ù ÓÅÃ ÓÂÃ (ÍÕÌÔÌÏ2),Ù ÓÔÁ ÔÅÍÐ ÌÄÁ (ÍÕÌÔÈÉ1),Ù ÓÂÃ (ÍÕÌÔÈÉ2),Ù ÃÐÙ #$80à;ÆIX UP SIGNS ÂÃÃ :ÐÏÓ1 ÓÂÃ ÍÕÌÔÌÏ1:ÐÏÓ1 ÌÄØ ÍÕÌÔÌÏ1 ÂÐÌ :ÄÉÖ ÓÔÙ ÔÅÍÐ+1 ÓÅÃ ÓÂÃ ÔÅÍÐ+1:ÄÉÖ ÓÔÁ ÔÅÍÐ+1à;ÎOW DIV BY 16 ÌÄÙ #00 ÁÎÄ #$ÆÆ ÂÐÌ :ÐÏÓÁ ÄÅÙà;ÈIGH BYTE:ÐÏÓÁ ÔÙÁ ÁÓÌ ÔÅÍÐ ÒÏÌ ÔÅÍÐ+1 ÒÏÌ ÁÓÌ ÔÅÍÐ ÒÏÌ ÔÅÍÐ+1 ÒÏÌ ÁÓÌ ÔÅÍÐ ÒÏÌ ÔÅÍÐ+1 ÒÏÌ ÁÓÌ ÔÅÍÐ ÒÏÌ ÔÅÍÐ+1 ÒÏÌ ÔÁØ ÌÄÁ ÔÅÍÐ ÌÄÙ ÔÅÍÐÁà;ÒEMAINDER ÃÌÃ ÁÄÃ (ÐÏÉÎÔ),Ù ÓÔÁ (ÐÏÉÎÔ),Ù ÌÄÙ ÔÅÍÐØà;ÃOORD ÌÄÁ ÔÅÍÐ+1 ÁÄÃ (ÐÏÉÎÔ),Ù ÓÔÁ (ÐÏÉÎÔ),Ù ÉÎÙ ÔØÁ ÁÄÃ (ÐÏÉÎÔ),Ù ÓÔÁ (ÐÏÉÎÔ),Ù ÒÔÓ** ÇETÄOWN/ÓIDE/ÆRONTÖEC** ÇET ORIENTATION VECTOR* ÏN ENTRY: ÃURRENT OBJECT SET* ÏN EXIT: (.Ø,.Ù,.Á) = (Ø,Ù,Ú) SIGNED*          DIRECTION VECTOR, LENGTH=64*ÇETÄOWNÖEC ÌÄÙ #ÏBJÍATà;ÒOW 1 ÄÆÂ $2ÃÇETÓIDEÖEC ÌÄÙ #ÏBJÍAT+3à;ÒOW 2 ÄÆÂ $2ÃÇETÆRONTÖEC ÌÄÙ #ÏBJÍAT+6 ÌÄØ ÃÕÒÏÂÊ ÂÍÉ :ÒÔÓ ÌÄÁ ÏÂÊÌÏ,Ø ÓÔÁ ÐÏÉÎÔ ÌÄÁ ÏÂÊÈÉ,Ø ÓÔÁ ÐÏÉÎÔ+1 ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁØ ÉÎÙ ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÐÈÁ ÄÅÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁÙ ÐÌÁ:ÒÔÓ ÒÔÓ*-------------------------------** ÖISUALIZATION ROUTINES**-------------------------------ÖIEWÏBJ ÄÆÂ 00à;ÖIEWPOINT OBJECTÓÏÌÉÄÐÏÌ ÄÆÂ 00à;ÓOLID/WIREFRAME POLYGONSÐÁÔÔÁÂ ÄÁ $1000à;ÐATTERN TABLE** ÓETÐARMS -- ÓET RENDERING PARAMETERS** ÏN ENTRY: .ÁÙ = ÐOINTER TO PATTERN TABLE*           .Ø  = ÂITMAP PAGE*            Ã SET   -> SOLID POLYGONS*            Ã CLEAR -> WIREFRAME*ÓETÐARMS ÒÏÒ ÓÏÌÉÄÐÏÌ ÓÔÁ ÐÁÔÔÁÂ ÓÔÙ ÐÁÔÔÁÂ+1 ÓÔØ ÂÉÔÍÁÐ ÒÔÓ** ÓETÖISÐARMS -- ÓET VISIBILITY PARMS** ÏN ENTRY: .ÁÙ = ÍAXIMUM OBJECT RANGE*           .Ø  = ÍINIMUM OBJECT RANGE*ÓETÖISÐARMS ÓÔÁ ÚÍÁØ ÓÔÙ ÚÍÁØ+1 ÓÔØ ÚÍÉÎ ÒÔÓ** ÃALCÖIEW -- ÃALCULATE VIEW (ÓET VIEWPOINT, TRANSLATE AND ROTATE CENTERS)** ÏN ENTRY: .Ø = VIEWPOINT OBJECT** ÏN EXIT: TRANSLATED ROTATED CENTERS*          IN ÃØ/ÃÙ/ÃÚ*ÃALCÖIEW ÓÔØ ÖIEWÏBJ ÊÓÒ ÓETÃURÏB ÓÔÁ ÐÏÉÎÔ ÓÔÙ ÐÏÉÎÔ+1 ÌÄØ #8 ÌÄÙ #ÏBJÍAT+8:LOOP ÌÄÁ (ÐÏÉÎÔ),Ùà;ÖIEWPOINT MATRIX ÓÔÁ ÖÉÅ×ÍÁÔ,Ø ÄÅÙ ÄÅØ ÂÐÌ :LOOP ÌÄØ #11à;ÓET UP POINTERS:CL ÌÄÁ ÃØÌÏ,Ø ÓÔÁ Ã0ØÌÏ,Ø ÄÅØ ÂÐÌ :CL ÌÄØ #00 ÓÔØ ÔÅÍÐØà;ÏBJECT INDEX:GETLOOP ÊÓÒ ÇETÎEXTÏB ÃÐØ ÖIEWÏBJ ÂÅÑ :DONE ÓÔÁ ÔÅÍÐ ÓÔÙ ÔÅÍÐ+1 ÔØÁ ÌÄØ ÔÅÍÐØ ÓÔÁ ÏÂÃÅÎ,Øà;ÏBJECT NUMBER ÔØÁ ÌÄÙ #ÏBÃENÐOSà;ÐOSITION IN CENTER LIST ÓÔÁ (ÔÅÍÐ),Ù ÌÄÙ #00 ÌÄÁ (ÔÅÍÐ),Ùà;ÔRANSLATE ÓÅÃ ÓÂÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÃØ,Ø ÉÎÙ ÌÄÁ (ÔÅÍÐ),Ù ÓÂÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÈÃØ,Ø ÉÎÙ ÌÄÁ (ÔÅÍÐ),Ùà;ÔRANSLATE ÓÅÃ ÓÂÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÃÙ,Ø ÉÎÙ ÌÄÁ (ÔÅÍÐ),Ù ÓÂÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÈÃÙ,Ø ÉÎÙ ÌÄÁ (ÔÅÍÐ),Ùà;ÔRANSLATE ÓÅÃ ÓÂÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÃÚ,Ø ÉÎÙ ÌÄÁ (ÔÅÍÐ),Ù ÓÂÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÈÃÚ,Ø ÉÎÃ ÔÅÍÐØ ÂÐÌ :GETLOOP:DONE ÌÄÙ ÔÅÍÐØà;# OF OBJECTS ÓÔÙ ÎÕÍÃÅÎÔÓ ÊÍÐ ÇÌÏÂÒÏÔà;OFF SHE GOES!** ÓORTÖIS -- ÃOMPUTE AND SORT ALL VISIBLE OBJECTS** ÏN ENTRY: CENTERS STORED IN ÃØ ETC.** ÏN EXIT: ÖISÏBJS = LINKED LIST OF VISIBLE OBJECTS*   (FARTHEST OBJECTS AT START OF LIST)** ÖISIBILITY CONDITIONS:*   X+Z>0, X-Z<0 (WITHIN VIEW AREA)*   SAME FOR X+Y/X-Y*   Z > 8192 WILL BE TREATED AS TOO FAR AWAY TO SEE*   Z < 180 IS TREATED AS BEING TOO NEAR.*ÎÕÍÖÉÓ ÄÆÂ 00ÓORTÖIS ldÁ #00 stÁ numvis ÌÄÁ #$80 ÓÔÁ ÖÉÓÏÂÊÓ+$80 ldx numÃÅÎÔÓ dex ÂÍÉ :RTS:LOOP lda ÈÃz,xà;HIGH BYTE sta temp+1 lda cz,xà;LOW BYTE sta temp ÃÍÐ ÚÍÁØ ÌÄÁ ÔÅÍÐ+1 ÓÂÃ ÚÍÁØ+1à;gREATER THAN 8192? bcs :skipà;(OR NEGATIVE) ÌÄÁ ÔÅÍÐ cmp ÚÍÉÎ lda temp+1 sbc #00 bcc :skip lda tempà;X+Z>0 clc adc cx,x lda temp+1 adc hcx,x bmi :skip lda tempà;Z-X>0 cmp cx,x lda temp+1 sbc hcx,x bmi :skip lda tempà;Y+Z>0 clc adc cy,x lda temp+1 adc hcy,x bmi :skip lda tempà;Z-Y>0 cmp cy,x lda temp+1 sbc hcy,x bmi :skip ÌÄÙ #$80à;ÈEAD OF LIST:L1 ÌÄÁ ÖÉÓÏÂÊÓ,Ùà;ÌINKED LIST OF OBJECTS ÂÍÉ :LINK ÓÔÙ ÔÅÍÐÙ ÔÁÙà;ÎEXT OBJECT ÌÄÁ ÃÚ,Ùà;ÉF FARTHER, THEN ÃÍÐ ÔÅÍÐà;MOVE DOWN LIST ÌÄÁ ÈÃÚ,Ù ÓÂÃ ÔÅÍÐ+1 ÂÃÓ :L1à;ÎEAREST OBJECTS LAST IN LIST ÔÙÁ ÌÄÙ ÔÅÍÐÙà;ÉNSERT INTO LIST:LINK ÓÔÁ ÖÉÓÏÂÊÓ,Øà;Ø -> REST OF LIST ÔØÁ ÓÔÁ ÖÉÓÏÂÊÓ,Ùà;BEGINNING OF LIST -> Ø:SKIP ÄÅØ ÂÐÌ :LOOP ÌÄÙ #$80 ÓÔÙ ÃÏÂà;ÃURRENT OBJECT:RTS ÒÔÓ** ÄRAWÁLLÖIS -- ÄRAW ALL VISIBLE OBJECTS*   IN LINKED LIST.*ÃÏÂ ÄÆÂ 00à;ÃURRENT OBJECTÄRAWÌOOP ÓÔÙ ÃÏÂ**** ÆÉØ ÍÅ!!!*** ÌÄÁ ÏÂÃÅÎ,Ùà;ÁCTUAL OBJECT NUMBER ÔÁØ ÊÓÒ ÒOTÄRAWÄRAWÁLLÖIS ÌÄØ ÃÏÂà;ÈEAD = #$80 ÌÄÙ ÖÉÓÏÂÊÓ,Ø ÂÐÌ ÄRAWÌOOP:DONEÄRAWÒÔÓ ÒÔÓ** ÇETÎEXTÖIS -- ÇET NEXT OBJECT IN*   VISIBLE LIST.** ÏN EXIT: Î SET INDICATES END OF LIST*ÇETÎEXTÖIS ÌÄØ ÃÏÂ ÌÄÙ ÖÉÓÏÂÊÓ,Ø ÂÍÉ ÄRAWÒÔÓ ÓÔÙ ÃÏÂ* YET ANOTHER ÆÉØ ÍÅ!!! ÄÆÂ $ÂÅ ÄÁ ÏÂÃÅÎà;ÌÄØ ÏÂÃÅÎ,Ù ÌÄÁ #00 ÓÔÁ ÎÕÍÌÉÎÅÓ ÊÍÐ ÓETÃURÏB** ÒOTÄRAW -- ÒOTATE AND DRAW AN OBJECT** ÏN ENTRY: ÏBJECT NUMBER IN .Ø*   ÓETÐARMS ALREADY CALLED.*ÄÁÔÁÐ ÄÁ 0à;ÔEMP POINTERÎÐÏÉÎÔÓ ÄÆÂ 00ÏÂÔÙÐÅ ÄÆÂ 00ÎÆÁÃÅÓ ÄÆÂ 00à;ÆACES/ÏBLETSÒOTÄRAW ÌÄÁ ÏÂÊÌÏ,Ø ÓÔÁ ÐÏÉÎÔ ÌÄÁ ÏÂÊÈÉ,Ø ÓÔÁ ÐÏÉÎÔ+1 ÌÄÙ #ÏBJÍATà;ÍATRIX -> ÚÐ ÌÄØ #00 ÓÔØ ÎÕÍÌÉÎÅÓ:MLI ÓÔØ ÔÅÍÐ ÌÄÁ #3 ÓÔÁ ÔÅÍÐ+1:ML ÌÄÁ (ÐÏÉÎÔ),Ùà;ÔAKE TRANSPOSE TO GET ÓÔÁ ÍÁÔÒÉØ,Øà;ORIENTATION MATRIX ÉÎÙ ÉÎØ ÉÎØ ÉÎØ ÄÅÃ ÔÅÍÐ+1 ÂÎÅ :ML ÌÄØ ÔÅÍÐ ÉÎØ ÃÐØ #3 ÂÎÅ :MLI ÌÄÙ #ÏBÃENÐOS ÌÄÁ (ÐÏÉÎÔ),Ù ÓÔÁ ÔÅÍÐÁà;ÐOSITION OF CENTER IN LIST ÌÄÙ #ÏBJÄATAà;ÇET DATA POINTER FOR LATER ÌÄÁ (ÐÏÉÎÔ),Ù ÓÔÁ ÄÁÔÁÐ ÔÁØ ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÓÔÁ ÄÁÔÁÐ+1 ÓÔÁ ÐÏÉÎÔ+1 ÓÔØ ÐÏÉÎÔ ÌÄÙ #00 ÌÄÁ (ÐÏÉÎÔ),Ù ÓÔÁ ÏÂÔÙÐÅà;ÎORMAL/COMPOUND ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ùà;ÎUMBER OF POINTS ÂÅÑ :RTS ÓÔÁ ÎÐÏÉÎÔÓ ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÓÔÁ ÎÆÁÃÅÓ ÉÎÙà;ÐOINT POINTERS ÔÙÁ ÃÌÃ ÁÄÃ ÐÏÉÎÔ ÓÔÁ Ð0Ø ÌÄØ ÐÏÉÎÔ+1 ÂÃÃ :C1 ÉÎØ ÃÌÃ:C1 ÓÔØ Ð0Ø+1 ÁÄÃ ÎÐÏÉÎÔÓ ÓÔÁ Ð0Ù ÂÃÃ :C2 ÉÎØ ÃÌÃ:C2 ÓÔØ Ð0Ù+1 ÁÄÃ ÎÐÏÉÎÔÓ ÓÔÁ Ð0Ú ÂÃÃ :C3 ÉÎØ ÃÌÃ:C3 ÓÔØ Ð0Ú+1 ÁÄÃ ÎÐÏÉÎÔÓ ÓÔÁ ÆÁÃÅÐÔÒ ÔØÁ ÁÄÃ #00 ÓÔÁ ÆÁÃÅÐÔÒ+1 ÌÄÙ ÎÐÏÉÎÔÓ ÌÄØ ÔÅÍÐÁà;ÃENTER INDEX ÓÅÃà;ÒOT AND PROJ ÊÓÒ ÒÏÔÐÒÏÊ ÌÄÁ ÎÆÁÃÅÓà;ÍAYBE JUST WANT TOINTSATE P ÂÅÑ :RTS ÌÄÁ ÆÁÃÅÐÔÒ ÌÄÙ ÆÁÃÅÐÔÒ+1 ÌÄØ ÏÂÔÙÐÅ ÂÍÉ ÃOMPOUND:DLOOP ÊÓÒ ÄRAWÆACE ÄÅÃ ÎÆÁÃÅÓ ÂÎÅ :DLOOP:RTS ÒÔÓ** ÃOMPOUND OBJECTS ARE MADE UP OF* A SMALLER NUMBER OF "OBLETS",* DRAWN IN ORDER AFTER SORTING THEIR* REFERENCE POINTS.*ÃÏÂÌÅÔ ÄÆÂ 00à;ÃURRENT OBLETÏÂÌÐÔÒ ÄÁ 00à;ÐOINTER TO OBLETSÃOMPOUND ÓÔÁ ÐÏÉÎÔ ÓÔÙ ÐÏÉÎÔ+1 ÃÌÃ ÁÄÃ ÎÆÁÃÅÓ ÓÔÁ ÏÂÌÐÔÒ ÔÙÁ ÁÄÃ #00 ÓÔÁ ÏÂÌÐÔÒ+1 ÌÄÁ #ÏÂÈÅÁÄ ÓÔÁ ÏÂÌÅÔÓ+ÏÂÈÅÁÄà;ÈEAD OF LIST ÄÅÃ ÎÆÁÃÅÓ:SORT ÌÄÙ ÎÆÁÃÅÓà;ÎUMBER OF OBLETS ÌÄÁ (ÐÏÉÎÔ),Ùà;= # REF POINTS ÔÁØ ÌÄÁ ÐÌÉÓÔÚ,Ø ÓÔÁ ÔÅÍÐ ÌÄÁ ÐÌÉÓÔÚ+$80,Ø ÓÔÁ ÔÅÍÐ+1 ÌÄØ ÎÆÁÃÅÓà;ÃURRENT OBLET ÌÄÙ #ÏÂÈÅÁÄà;ÈEAD OF LIST:L1 ÌÄÁ ÏÂÌÅÔÓ,Ùà;ÌINKED LIST ÃÍÐ #ÏÂÈÅÁÄ ÂÃÓ :LINK ÓÔÙ ÔÅÍÐÙ ÔÁÙà;ÎEXT OBJECT ÌÄÁ ÐÌÉÓÔÚ,Ùà;ÉF FARTHER, THEN ÃÍÐ ÔÅÍÐà;MOVE DOWN LIST ÌÄÁ ÐÌÉÓÔÚ+$80,Ù ÓÂÃ ÔÅÍÐ+1 ÂÃÓ :L1à;ÎEAREST OBJECTS LAST IN LIST ÔÙÁ ÌÄÙ ÔÅÍÐÙà;ÉNSERT INTO LIST:LINK ÓÔÁ ÏÂÌÅÔÓ,Øà;Ø -> REST OF LIST ÔØÁ ÓÔÁ ÏÂÌÅÔÓ,Ùà;BEGINNING OF LIST -> Ø ÄÅÃ ÎÆÁÃÅÓ ÂÐÌ :SORTà;ÎOW DRAW THEM ÌÄÙ #ÏÂÈÅÁÄ:LOOP ÌÄÁ ÏÂÌÅÔÓ,Ù** ÆÉØ ÍÅ!* ÔÁØ ÓÔØ ÃÏÂÌÅÔ ÃÐØ #ÏÂÈÅÁÄ ÂÃÓ :RTS ÌÄÁ ÏÂÌÐÔÒ+1 ÓÔÁ ÐÏÉÎÔ+1 ÌÄÁ ÏÂÌÐÔÒà;ÌOCATE IT ÓÔÁ ÐÏÉÎÔ ÃÐØ #00 ÂÅÑ :DRAW ÌÄÙ #00 ÃÌÃ:L2 ÁÄÃ (ÐÏÉÎÔ),Ù ÓÔÁ ÐÏÉÎÔ ÂÃÃ :DEX ÉÎÃ ÐÏÉÎÔ+1 ÃÌÃ:DEX ÄÅØ ÂÎÅ :L2:DRAW ÌÄÙ #1 ÌÄÁ (ÐÏÉÎÔ),Ùà;ÎUMBER OF FACES ÓÔÁ ÎÆÁÃÅÓ ÌÄÙ ÐÏÉÎÔ+1 ÌÄÁ ÐÏÉÎÔ ÃÌÃ ÁÄÃ #2 ÂÃÃ :DLOOP ÉÎÙ:DLOOP ÊÓÒ ÄRAWÆACE ÄÅÃ ÎÆÁÃÅÓ ÂÎÅ :DLOOP ÌÄÙ ÃÏÂÌÅÔ ÂÐÌ :LOOP:RTS ÒÔÓ** ÄRAWÆACE -- ÄRAW A POLYGON** ÏN ENTRY: .ÁÙ POINTS TO FACE DATA* ÏN EXIT: .ÁÙ POINTS TO NEXT FACE** ×IREFRAME: Ã CLEAR -> FACE NOT DRAWN*ÎÖÅÒÔÓ ÄÆÂ 00à;ÎUMBER OF VERTICESÆÁÃÅÐÔÒ ÄÁ 00à;ÐOINTER TO FACEÄRAWÆACE ÓÔÁ ÐÏÉÎÔ ÓÔÙ ÐÏÉÎÔ+1 ÌÄÙ #00 ÌÄÁ (ÐÏÉÎÔ),Ù ÓÔÁ ÎÖÅÒÔÓ ÓÅÃà;Î+1 IN LIST ÁÄÃ #2à;(CLOSES ON ITSELF) ÁÄÃ ÐÏÉÎÔ ÓÔÁ ÆÁÃÅÐÔÒà;ÎEXT FACE ÌÄÁ #00 ÓÔÁ ÔÅÍÐ ÁÄÃ ÐÏÉÎÔ+1 ÓÔÁ ÆÁÃÅÐÔÒ+1 ÌÄÙ #1à;ÆILL PATTERN ÌÄÁ (ÐÏÉÎÔ),Ùà;INDEX ÁÓÌ ÒÏÌ ÔÅÍÐ ÁÓÌ ÒÏÌ ÔÅÍÐ ÁÓÌ ÒÏÌ ÔÅÍÐ ÁÄÃ ÐÁÔÔÁÂ ÓÔÁ ÆÉÌÌÐÁÔ ÌÄÁ ÔÅÍÐ ÁÄÃ ÐÁÔÔÁÂ+1 ÓÔÁ ÆÉÌÌÐÁÔ+1 ÌÄØ ÓÏÌÉÄÐÏÌ ÂÐÌ :×IRE ÌÄØ #$ÆÆ:PQ ÉÎØ ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ùà;ÃOPY TO QUEUE ÓÔÁ ÐÑ,Ø ÃÐØ ÎÖÅÒÔÓ ÂÎÅ :PQ ÔØÁà;ÅMPTY FACE ÂÅÑ :EXIT ÊÓÒ ÐÏÌÙÆÉÌÌ:EXIT ÌÄÁ ÆÁÃÅÐÔÒ ÌÄÙ ÆÁÃÅÐÔÒ+1 ÒÔÓà;×IREFRAME ROUTINE:×IREà;ÊÓÒ ÉSÖISà;ÂÃÃ :EXIT ÌÄÙ #2à;ÃONNECT THE DOTS...:L2 ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁØ ÌÄÁ ÐÌÉÓÔØ,Ø ÓÔÁ Ø1 ÌÄÁ ÐÌÉÓÔØ+$80,Ø ÓÔÁ Ø1+1 ÌÄÁ ÐÌÉÓÔÙ,Ø ÓÔÁ Ù1 ÌÄÁ ÐÌÉÓÔÙ+$80,Ø ÓÔÁ Ù1+1 ÓÔØ ÔÅÍÐÁ ÉÎÙ ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁØ ÌÄÁ ÐÌÉÓÔØ,Ø ÓÔÁ Ø2 ÌÄÁ ÐÌÉÓÔØ+$80,Ø ÓÔÁ Ø2+1 ÌÄÁ ÐÌÉÓÔÙ,Ø ÓÔÁ Ù2 ÌÄÁ ÐÌÉÓÔÙ+$80,Ø ÓÔÁ Ù2+1 ÓÔÙ ÔÅÍÐÙ* ÃHECK FOR LINE CONNECTIONS* ÐOINTS IN ÔÅÍÐÁ AND .Ø ÌÄÙ #00:LOOP ÃÐÙ ÎÕÍÌÉÎÅÓ ÂÅÑ :STORE ÔØÁ ÃÍÐ ÌÉÎÅÌÏ,Ù ÂÎÅ :TEST2 ÌÄÁ ÔÅÍÐÁ ÃÍÐ ÌÉÎÅÈÉ,Ù ÂÅÑ :SKIP:INY ÉÎÙ ÂÐÌ :LOOP:STORE ÌÄÁ ÔÅÍÐÁ ÓÔÁ ÌÉÎÅÌÏ,Ù ÔØÁ ÓÔÁ ÌÉÎÅÈÉ,Ù ÃÐÙ #ÍÁØÌÉÎÅÓ ÂÅÑ :JSR ÉÎÃ ÎÕÍÌÉÎÅÓ:JSR ÊÓÒ ÄRAWÌINE:SKIP ÌÄÙ ÔÅÍÐÙ ÄÅÃ ÎÖÅÒÔÓ ÂÎÅ :L2 ÓÅÃ ÂÃÓ :EXIT:TEST2 ÃÍÐ ÌÉÎÅÈÉ,Ù ÂÎÅ :INY ÌÄÁ ÔÅÍÐÁ ÃÍÐ ÌÉÎÅÌÏ,Ù ÂÎÅ :INY ÂÅÑ :SKIPÎÕÍÌÉÎÅÓ ÄÆÂ 00** ÉSÖIS -- ÃOMPUTE WHETHER FACE IS*    VISIBLE, USING CROSS-PRODUCTS** ÏN ENTRY: .ÁÙ = POINTER TO FACE* ÏN EXIT: Ã SET -> VISIBLE*          Ã CLEAR -> NOT VISIBLE*ÉSÖIS*------------------------------- DO 0 ÓÔÁ ÐÏÉÎÔ ÓÔÙ ÐÏÉÎÔ+1 ÌÄÙ #4à;Î+1 ÌÄÁ (ÐÏÉÎÔ),Ù ÔÁØ ÄÅÙ ÌÄÁ (ÐÏÉÎÔ),Ùà;Î ÔÁÙ ÌÄÁ ÐÌÉÓÔØ,Ø ÓÅÃ ÓÂÃ ÐÌÉÓÔØ,Ù ÓÔÁ Ø1 ÌÄÁ ÐÌÉÓÔØ+$80,Ø ÓÂÃ ÐÌÉÓÔØ+$80,Ù ÓÔÁ Ø1+1à;ÄØ ÌÄÁ ÐÌÉÓÔÙ,Ø ÓÅÃ ÓÂÃ ÐÌÉÓÔÙ,Ù ÓÔÁ Ù1 ÌÄÁ ÐÌÉÓÔÙ+$80,Ø ÓÂÃ ÐÌÉÓÔÙ+$80,Ù ÓÔÁ Ù1+1 ÂÐÌ :ØÃÈËà;ÉF > ÂÅÑ :ØÃÈË FIN*-------------------------------
