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