* * 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 *-------------------------------