INCLUDE "include:exec/types.i" ;Needed for SOFFSET macro INCLUDE "Stereo.i" *Exec Library functions XREF _intena XREF _AbsExecBase ;Base address for exec library XREF _LVOWaitPort XREF _LVOGetMsg XREF _LVOPutMsg XREF _LVOReplyMsg XREF _WBenchMsg XREF _LVOOpenLibrary ;exec function to open library XREF _LVOCloseLibrary XREF _LVOAllocMem XREF _LVOFreeMem XREF _LVODoIO XREF _LVOSendIO XREF _LVOCheckIO XREF _LVOAbortIO XREF _LVORemove XREF _LVOAllocSignal XREF _LVOFreeSignal XREF _LVOFindTask XREF _LVOAddTask XREF _LVORemTask XREF _LVOOpenDevice XREF _LVOCloseDevice XREF _LVOForbid XREF _LVOPermit XREF _LVOOpenDiskFont XREF _LVOCloseFont *Dos Library functions XREF _LVOExecute XREF _LVOOutput ;DOS functions XREF _LVODelay XREF _LVOOpen XREF _LVOClose XREF _LVOIoErr XREF _LVOCurrentDir XREF _LVOParentDir XREF _LVOExamine XREF _LVOLock XREF _LVOUnLock XREF _LVORead XREF _LVOWrite *Graphics Library functions XREF _LVOSetDrMd XREF _LVOOwnBlitter XREF _LVODisownBlitter XREF _LVOWaitBlit XREF _LVOAllocRaster XREF _LVOFreeRaster XREF _LVOInitView XREF _LVOInitVPort XREF _LVOInitBitMap XREF _LVOGetColorMap XREF _LVOFreeColorMap XREF _LVOFreeVPortCopLists XREF _LVOFreeCprList XREF _LVOMakeVPort XREF _LVOMrgCop XREF _LVOLoadView XREF _LVOInitRastPort XREF _LVOMove XREF _LVODraw XREF _LVOText XREF _LVOSetAPen XREF _LVOSetFont XREF _LVOWaitBOVP XREF _LVOBltClear XREF _LVOLoadRGB4 *Intuition Library functions XREF _LVOClearScreen XREF _LVOScreenToFront XREF _LVOScreenToBack XREF _LVOOpenWindow XREF _LVOCloseWindow XREF _LVORequest XREF _LVOEndRequest XREF _LVOGetPrefs XREF _LVOMoveScreen XREF _LVOOpenScreen XREF _LVOCloseScreen *Translator Library Function XREF _LVOTranslate XDEF __Animate3D IO_QUICK EQU 1 ;Bit 0 set for quick io NT_MESSAGE EQU 5 gb_ActiView EQU $22 *IDNestCnt EQU $22 MyGadgets EQU WINDOWDRAG!WINDOWDEPTH!WINDOWSIZING ;!WINDOWCLOSE MyFeatures EQU SMART_REFRESH!ACTIVATE MyFlags EQU MyGadgets!MyFeatures!WINDOWSIZING MyFlag EQU MyGadgets!MyFeatures MODE_OLDFILE EQU 1005 MODE_NEWFILE EQU 1006 MLP1 EQU 33 SIGNFLAG equ $40 MyView EQU V_LACE!V_HIRES TRUE EQU -1 FALSE EQU 0 CLEAR_PUBLIC EQU MEMF_CHIP!MEMF_CLEAR Trig_Size EQU 900 ;Enough mem for 450 s.w. degrees LE_Size EQU $400 ;$200 words for Left Eye RE_Size EQU $400 ;$200 words for Right Eye Eye_Size EQU LE_Size+RE_Size OB_Size EQU 400 ;Output buffer of narrator TB_Size EQU 164 ;Two lines of centered text Public_Size EQU nw_SIZE+Trig_Size+Eye_Size+OB_Size+TB_Size ;+ss_SIZEOF SOLID EQU $FFFF DOTTED EQU $AAAA SWidth EQU 640 SHeight EQU 400 S1Width EQU SWidth-1 S1Height EQU SHeight-1 BPDepth EQU 2 CHPADR EQU $DFF000 COP1LCH EQU $80 COPJMP1 EQU $88 DMACONW EQU $96 SETBIT EQU $80 DMACONR EQU $2 INTREQR EQU $1E DDRA EQU $BFE201 ;DDR for CIAA SDR EQU $BFEC01 ;Serial data register of CIAA POT0DAT EQU $12 POT1DAT EQU $14 BLTCON0 EQU $40 ;Control register 0 BLTCON1 EQU $42 ;Control register 1 BLTAFWM EQU $44 ;Blitter first word mask for source A BLTALWM EQU $46 ;Blitter last word mask for source A BLTCPTH EQU $48 ;Blitter pointer C (high 3 bits) BLTCPTL EQU $4A ;Blitter pointer C (low 16 bits) BLTBPTH EQU $4C ;Blitter pointer B (high 3 bits) BLTBPTL EQU $4E ;Blitter pointer B (low 16 bits) BLTAPTH EQU $50 ;Blitter pointer A (high 3 bits) BLTAPTL EQU $52 ;Blitter pointer A (low 16 bits) BLTDPTH EQU $54 ;Blitter pointer D (high 3 bits) BLTDPTL EQU $56 ;Blitter pointer D (low 16 bits) BLTSIZE EQU $58 ;Start & size (window width, height) BLTCMOD EQU $60 BLTBMOD EQU $62 BLTAMOD EQU $64 BLTDMOD EQU $66 BLTCDAT EQU $70 BLTBDAT EQU $72 BLTADAT EQU $74 BPL1PTH EQU $E0 BPL1PTL EQU $E2 BPLCON0 EQU $100 BPLCON1 EQU $102 BPLCON2 EQU $104 __Animate3D: move.l a7,InitSP ;Save initial stack pointer move.l a6,Savea6 ;Library pointer=0 for icon, FF44A8 for CLI move.l a5,Savea5 move.l #0,xoffset move.l _WBenchMsg,a0 move.l a0,WBMsg move.l sm_ArgList(a0),a0 ;Get pointer to arglist move.l wa_Name(a0),d1 move.l d1,MyName move.l WBMsg,d0 ;See if from workbench bne.s NoCLI bsr CopyPath NoCLI: bsr OpenDOS bsr LibsOpen ;Open Dos, Graphics and Intuition Libraries bsr GetFont bsr OpenNew ;Open the new window * bsr SaveSprite ;Save data of sprite pointer bsr SpeakPort bsr ConsolePort bsr OpenNil bsr PageTitle bsr OpenNewScreen bsr ColorSet bsr CustomClear * bset.b #0,SprSts ;Show that pointer is visible Repeat: * bsr SpriteClear AmyName: move.l #1,DZ bsr SetMale lea AmigaName,a5 move.l #90,Theta move.l #128,DTheta HexMot: move.l #0,d0 move.l d0,Phi move.l d0,DPhi move.l d0,xoffset move.l d0,yoffset move.l d0,zoffset move.w d0,FrmCnt HexWait: bsr TriGet bsr LoadOne jsr (a5) bsr EndChk bsr TriGet bsr LoadTwo jsr (a5) cmp.w #2,FrmCnt bne.s NotFrst lea Mes1,a0 move.b #5,d0 SpkThr: bsr TransIt sub.b #1,d0 bne.s SpkThr bsr SetFemale lea AmyTab,a1 move.l (a1)+,a0 move.l a1,CurAmy bsr Async NotFrst: bsr EndChk bra.s HexWait CheckIt: movem.l a0-a6,-(a7) move.l PendIO,d0 tst.l d0 beq.s NotPnd move.l _AbsExecBase,a6 move.l SpeakIO,a1 jsr _LVOCheckIO(a6) tst.l d0 ;See if null returned beq.s NotPnd ;Actually pending, but not done move.l d0,a1 ;Address of structure for returned message jsr _LVORemove(a6) ;d0 should have been equal to a1. move.l #0,PendIO ;Clear pending status move.l CurAmy,a1 ;Get address of pointer to next message move.l (a1)+,d0 ;Get address of next message beq.s NotPnd move.l a1,CurAmy move.l d0,a0 bsr ChkSnd ;Check sound characteristics bsr Async ;Start next message NotPnd: movem.l (a7)+,a0-a6 rts ChkSnd: move.l SpeakIO,a1 cmp.l #AmyFour,d0 ;See if Amy upset on next one. beq.s FulVol cmp.l #AmySix,d0 beq.s FulVol VolNrm: move.w #40,NDI_VOLUME(a1) cmp.l #DaveThree,d0 * beq SetScreen beq SetMale cmp.l #Lst1,d0 beq SetMale cmp.l #NxtFive,d0 beq SetFemale cmp.l #NxtEgt,d0 beq SetMale cmp.l #NxtTen,d0 beq SetFemale cmp.l #NxtTwl,d0 beq SetMale cmp.l #NxtFrt,d0 beq SetMale cmp.l #NxtSxt,d0 beq SetFemale cmp.l #NxtNnt,d0 beq SetMale cmp.l #NxtTwt,d0 ;See if we want to move screen up beq.s SetScreen cmp.l #NxtThr,d0 bne.s NotSlo move.w #80,NDI_RATE(a1) NotSlo: rts FulVol: move.w #64,NDI_VOLUME(a1) bsr SetFemale ;Only Amy talks loud rts SetScreen: movem.l d0-d7/a0-a6,-(a7) bsr SetMale bsr ScreenUp movem.l (a7)+,d0-d7/a0-a6 rts OpenNew: move.l #Public_Size,d0 bsr StructureAlloc move.l d0,a2 move.l d0,MyNewWindow ;Store pointer beq Term ;Terminate program if failed * bne.s SucAll * move.l #3,ErrNum * bra TotalFail ;Can't display if not to this point. *SucAll: move.l a2,MyNewWindow bsr.s PointStruct ;Set up pointers for different structures. bsr.s InitNewWindow ;Initialize new window structure move.l MyNewWindow,a0 movea.l IntuitionLibrary,a6 ;a6 established by IntuOpen jsr _LVOOpenWindow(a6) ;Open the new window. move.l d0,MyWindow ;Pointer to window structure for new window move.l d0,a0 beq Term ;Terminate if failed to open window move.l wd_WScreen(a0),a0 ;Get to Work bench screen point add.l #sc_ViewPort,a0 ;Get up to ViewPort structure move.l vp_ColorMap(a0),a2 ;Get pointer to colormap structure move.l cm_ColorTable(a2),a2 ;Get pointer to Color Table lea SColor,a1 move.l (a2)+,(a1)+ move.l (a2),(a1) ;Store original color table move.l a0,PortView rts OldColor: lea SColor,a1 bra.s ChColr NewColor: lea MCTable,a1 ChColr: move.l a6,-(a7) move.l PortView,a0 move.l #4,d0 move.l GraphicsLibrary,a6 jsr _LVOLoadRGB4(a6) move.l (a7)+,a6 rts InitNewWindow: bsr TitleTran move.l MyNewWindow,a2 move.w #SWidth,nw_Width(a2) move.w #200,nw_Height(a2) move.b #0,nw_DetailPen(a2) ;Invisible move.b #1,nw_BlockPen(a2) ;White move.l #MyFlag,nw_Flags(a2) move.l WTBuf,d1 move.l d1,nw_Title(a2) move.w #SWidth,nw_MinWidth(a2) move.w #100,nw_MinHeight(a2) move.w #SWidth,nw_MaxWidth(a2) move.w #200,nw_MaxHeight(a2) move.w #WBENCHSCREEN,nw_Type(a2) rts PointStruct: adda.l #nw_SIZE,a2 ;Get base for Raster a * move.l a2,SpriteBuffer ;Save pointer to sprite buffer * adda.l #ss_SIZEOF,a2 move.l a2,LeftEye adda.l #LE_Size,a2 move.l a2,RightEye adda.l #RE_Size,a2 move.l a2,OutBuf adda.l #400,a2 move.l a2,WTBuf adda.l #82,a2 move.l a2,StrBuf adda.l #82,a2 move.l a2,SinTab adda.l #180,a2 ;Find cosine base move.l a2,CosTab lea sintab,a0 ;Locate sine table in file move.l SinTab,a1 ;Destination of larger table in RAM move.l #91,d0 MovSin: move.w (a0)+,(a1)+ subq.l #1,d0 bne.s MovSin rts StructureAlloc: move.l a6,-(a7) ;Save a6 (intution library base) move.l _AbsExecBase,a6 ;Exec functions coming up move.l #CLEAR_PUBLIC,d1 ;Public memory jsr _LVOAllocMem(a6) move.l (a7)+,a6 ;Recover a6 rts CloseNew: move.l a6,-(a7) move.l MyWindow,d0 beq.s NoWind move.l d0,a0 movea.l IntuitionLibrary,a6 jsr _LVOCloseWindow(a6) NoWind: move.l _AbsExecBase,a6 move.l MyNewWindow,d0 beq.s NoWdSt move.l d0,a1 move.l #Public_Size,d0 bsr StructFree NoWdSt: move.l #0,MyNewWindow move.l (a7)+,a6 rts *OpenLib opens the library whose name is pointed to by a1. The library *base address is returned in d0. a6 is destroyed. OpenLib: move.l #MLP1,d0 ;Version 33 or later movea.l _AbsExecBase,a6 jsr _LVOOpenLibrary(a6) ;Find Library base. rts ;Library base returned in d0 OpenDOS: *Open the Dos Library move.l #DosName,a1 ;Get Dos Name bsr.s OpenLib move.l d0,DosLibrary ;Save pointer for it * beq TotalFail ;Hey it can't even give error messages. beq Term ;Terminate if failure rts LibsOpen: *Now open intuition IntuOpen: move.l #IntuitionName,a1 ;Request intuition library. bsr.s OpenLib move.l d0,IntuitionLibrary beq Term ;Terminate if failed GraphicsOpen: * Open the graphics library move.l #GraphicsName,a1 ;Request graphics library. bsr.s OpenLib move.l d0,GraphicsLibrary ;Save pointer beq Term ;Terminate for failure GraphOpen: move.l #TranslatorName,a1 bsr.s OpenLib move.l d0,TranslatorLibrary beq Term TransOpen: move.l #DiskFontName,a1 bsr.s OpenLib move.l d0,DiskFontLibrary beq Term DFOpen: rts CloseLibs: move.l _AbsExecBase,a6 ;Be certain we have exec library move.l DiskFontLibrary,a1 bsr CloseLib move.l TranslatorLibrary,a1 bsr CloseLib move.l GraphicsLibrary,a1 bsr CloseLib ;Close graphics library move.l IntuitionLibrary,a1 bsr CloseLib ;Close intuition library rts CloseDOS: move.l DosLibrary,a1 CloseLib: move.l a1,d0 beq.s NotOpen jsr _LVOCloseLibrary(a6) NotOpen: rts EndChk: bsr CheckIt bsr KeyRead bne.s KeyOne ;0 returned if no new key pressed rts KeyOne: cmp.b #3,d0 ;See if Ctrl C beq.s Term ;Terminate program if ESC pressed bclr #5,d0 ;Clear lower-case bit cmp.b #$49,d0 ;See if I for Intuition bne.s NoRestore bsr ResView NoRestore: rts ;Return if not I or Control C AbortIt: move.l a6,-(a7) move.l _AbsExecBase,a6 jsr _LVOAbortIO(a6) move.l (a7)+,a6 rts Term: bsr OldColor move.l #CommandD,d1 bsr DoIt ;Assign c: sys:c move.l #CommandE,d1 bsr DoIt ;Delete ram:c files move.l SpeakIO,a1 bsr AbortIt move.l ConIO,a1 bsr AbortIt TermIt: move.l #EndCmd,d1 ;Now erase files from ram bsr DoIt * bsr RestoreSprite bsr CloseNewScreen bsr CloseNil bsr CloseDevices bsr CloseNew ;Close new Window bsr CloseLibs bsr CloseDOS move.l Savea5,a5 move.l Savea6,a6 move.l InitSP,a7 rts CorkScrew: bsr SetFemale lea Spiral,a5 bsr LobInp move.w #0,FrmCnt move.l SegLength,d0 move.l #0,Theta move.l #40,ThetaNew move.l #30,Phi move.l #0,yoffset move.l #0,xoffset move.l #-20000,zoffset move.l #10,DZ move.l #2,DTheta move.l #3,DPhi Frames: bsr TriChg bsr LoadOne jsr (a5) bsr EndChk bsr TriChg bsr LoadTwo jsr (a5) bsr EndChk cmp.w #100,FrmCnt bge.s Frames tst.l DZ ;See if on return trip bmi.s Frames lea LstTab,a1 move.l (a1)+,a0 move.l a1,CurAmy bsr Async move.w #100,FrmCnt bra.s Frames * Vector has inputs of d0 = x1, d1 = y1, d2 = z1, d3 = x2, * d4 = y2 and d5 = z2. It returns with the first point still in d0 - d2. Vector: movem.l d0-d2,-(a7) movem.l d3-d5,-(a7) move.l d0,xtemp move.l d1,ytemp move.l d2,z bsr Plot3D movem.l (a7)+,d0-d2 move.l d0,xtemp move.l d1,ytemp move.l d2,z bsr Plot3D bsr One3D movem.l (a7)+,d0-d2 rts * PolyVector adds another 3d line segment. d0-d2 are the next coordinates. PolyVector: move.l d0,xtemp move.l d1,ytemp move.l d2,z bra Plot3D SetUp: move.w #SOLID,TXTURE move.w #0,PointCount ;Initialize counter. move.l #SWidth,d0 lsr.l #3,d0 move.w d0,bytwidth bsr TabCom rts LobInp: move.l #7,d2 move.l d2,SegLength move.l #2,DTheta rts TriChg: move.l DTheta,d0 add.l d0,Theta cmp.l #360,Theta blt.s KepTheta sub.l #360,Theta KepTheta: move.l DPhi,d0 add.l d0,Phi cmp.l #360,Phi blt.s KepPhi sub.l #360,Phi KepPhi: cmp.l #470,zoffset ;See if already forward bge.s RevPas move.l DZ,d0 ;Get Delta Z bmi.s RevPas move.l zoffset,d0 bpl.s ZPlus neg.l d0 asr.l #5,d0 cmp.l #10,d0 bgt.s DZOK ZPlus: move.l #10,d0 DZOK: add.l d0,zoffset bra.s TriFnc RevPas: move.l #-1,DZ subq.w #1,FrmCnt move.l zoffset,d0 bpl.s PlusZ cmp.l #-30000,d0 bgt.s CloseIs EndLoop: adda.l #4,a7 move.w LoopCnt,d0 bne Term bra AmyName CloseIs: asr.l #4,d0 cmp.l #-16,d0 blt.s KeepDZ move.l #-16,d0 KeepDZ: add.l d0,zoffset bra.s TriFnc PlusZ: subq.l #8,zoffset bra.s TriFnc TriGet bsr ChangeTheta TriFnc: lea Theta,a0 move.l (a0),d0 lsl.l #1,d0 ;Offset to address of cosine(theta) move.l CosTab,a0 adda d0,a0 ;Get address of cosine theta move.w (a0),d1 ;Get value of cosine(theta) ext.l d1 ;Make long asr.l #4,d1 move.w d1,CosTheta move.l SinTab,a0 adda d0,a0 ;Find sin(theta) move.w (a0),d1 ;Get sin(theta) ext.l d1 asr.l #4,d1 move.w d1,SinTheta lea Phi,a0 move.l (a0),d0 lsl.l #1,d0 ;Offset to address of cosine(theta) move.l CosTab,a0 adda d0,a0 ;Get address of cosine theta move.w (a0),d1 ;Get value of cosine(theta) ext.l d1 ;Make long asr.l #4,d1 move.w d1,CosPhi move.l SinTab,a0 adda d0,a0 ;Find sin(theta) move.w (a0),d1 ;Get sin(theta) ext.l d1 asr.l #4,d1 move.w d1,SinPhi rts GetFont: move.l a6,-(a7) move.l IntuitionLibrary,a6 lea PrefBuf,a0 move.l #4,d0 jsr _LVOGetPrefs(a6) move.b PrefBuf,d0 cmp.b #8,d0 ;See if 80 column mode beq.s Eighty move.l #60,PrefBuf bra.s Sixty Eighty: move.l #80,PrefBuf Sixty move.l (a7)+,a6 rts CustomClear: move.l #0,TopOffset move.w #0,BottomOffset bsr ClearOne bsr ClearTwo move.l GraphicsLibrary,a6 move.l MyScreenA,a1 move.b #$FD,d3 ;For raster port mask lea TitleL,a0 bsr.s ScTitle move.l MyScreenB,a1 lea TitleL,a0 bsr.s ScTitle move.b #$FE,d3 move.l MyScreenB,a1 lea TitleR,a0 bsr.s ScTitle move.l MyScreenA,a1 lea TitleR,a0 bsr ScTitle move.l #3600,TopOffset move.w #45,BottomOffset ;Clear all but top 45 lines rts ScTitle: add.l #sc_RastPort,a1 move.b d3,rp_Mask(a1) move.l a0,-(a7) move.l #2,d0 move.l a1,-(a7) jsr _LVOSetDrMd(a6) ;Set to jam 2 so they don't erase move.l (a7)+,a1 ;each other move.l ScrFnt,a0 jsr _LVOSetFont(a6) ;Set font and setapen don't destroy move.l #3,d0 ;a1 jsr _LVOSetAPen(a6) move.l #200,d0 move.l #14,d1 move.l (a7)+,a0 move.l a1,-(a7) jsr _LVOMove(a6) move.l a0,a1 bsr EndFnd move.l (a7)+,a1 jsr _LVOText(a6) rts LoadOne: move.l MyScreenB,a1 ;B is current forward screen move.l MyScreenA,a0 ;A is in rear bsr.s ScrAdj bra.s ClearTwo LoadTwo: move.l MyScreenA,a1 ;Screen A is forward move.l MyScreenB,a0 bsr ScrAdj ;Adjust B to agree with A bra ClearOne ScreenUp: move.w #175,d1 UpMore: move.l d1,-(a7) bsr.s ScreensMove move.l (a7)+,d1 sub.w #5,d1 bge.s UpMore rts ScreenDown: move.w #5,d1 DnMore: move.l d1,-(a7) bsr.s ScreensMove move.l (a7)+,d1 add.w #5,d1 cmp.w #180,d1 ble.s DnMore rts ScreensMove: movem.l d0-d1/a0/a6,-(a7) move.l IntuitionLibrary,a6 move.l MyScreenA,a0 move.w d1,-(a7) bsr.s ScrnMove move.w (a7)+,d1 move.w d1,-(a7) move.l MyScreenB,a0 bsr.s ScrnMove move.w (a7)+,d1 move.w d1,LastTop movem.l (a7)+,d0-d1/a0/a6 rts ScrnMove: move.w sc_TopEdge(a0),d0 sub.w d0,d1 ext.l d1 move.l #0,d0 jsr _LVOMoveScreen(a6) rts ScrAdj: movem.l a0-a1/a6,-(a7) move.l IntuitionLibrary,a6 * move.l sc_MouseY(a1),d0 ;Get current mouse coordinates * cmp.l LastMouse,d0 * beq.s NoMouse * move.l d0,LastMouse * bsr RestoreSprite * bra.s KeepSprite *NoMouse: * addq.w #1,MouCnt ;Increment frame count for mouse * cmp.w #30,MouCnt ;See if it's exceeded 30 * blt.s KeepSprite * bsr SpriteClear *KeepSprite: move.w sc_TopEdge(a1),d0 ;Get current top for forward screen move.w d0,d1 ;Save it in d1 sub.w LastTop,d0 ;Find change beq.s NoSMov ;No screen movement move.w d1,LastTop ;Save new top move.w d0,d1 ;Change into d1 ext.l d1 move.l #0,d0 move.l a0,-(a7) jsr _LVOMoveScreen(a6) ;Move new screen to agree with other move.l (a7)+,a0 NoSMov: jsr _LVOScreenToFront(a6) ;Move new screen to front movem.l (a7)+,a0-a1/a6 rts Plot3D: move.l z,d0 move.b #10,d3 ;For shifting 10 bits. move.l d0,d5 ;z is also in d5 muls SinTheta,d5 ;d0 is z*sin(theta) lea xtemp,a0 move.l (a0),d1 ;d1 is xtemp move.l d1,d2 ;xtemp is also in d2 muls CosTheta,d2 ;d2 is xtemp*cos(theta) add.l d2,d5 ;have found xpr muls CosTheta,d0 ;d0 is z*cos(theta) muls SinTheta,d1 ;d1 is xtemp*sin(theta) sub.l d0,d1 ;d1 is now zint asr.l d3,d5 ;xpr/1024 move.l d5,d0 ;Get xpr back into d0 muls SinPhi,d0 ;Find ypr=xpr*sin(phi) lea ytemp,a0 move.l (a0),d4 ;Get ytemp muls CosPhi,d4 ;ytemp*cos(phi) add.l #50,d4 ;50+ytemp*cos(phi) add.l d4,d0 ;x = y'+ytemp*cos(phi) in d0 move.w CosPhi,d2 muls d5,d2 ;Find x'*cos(phi) move.l (a0),d4 ;Get ytemp again. muls SinPhi,d4 ;Find ytemp*sin(phi) sub.l d4,d2 ;Find z = x'' for Point3D asr.l d3,d0 ;Shift x down 10 bits add.w #320,d0 asr.l d3,d1 ;Shift y down 10 bits add.w #199,d1 ;Add in offset for y-direction asr.l d3,d2 ;Shift z down 10 bits to compensate for ; integer trig functions. add.l xoffset,d0 add.l yoffset,d1 add.l zoffset,d2 neg.l d2 ;Reverse z(actually x) bra Point3D * Set3D works exactly as Point3D, except that it places the points directly * onto the appropriate bit plane, rather than into a buffer area. * Inputs include d0(x), d1(y), d2(z) and a3(pointer to address of bit plane) * No values will be destroyed by routine. Set3D: movem.l d0-d7/a0-a2,-(a7) ;Save the registers move.w #1024,d4 ;d4 will act as z + z0. add.w d2,d4 ;Find z + z0 move.w #244,d5 ;d5 will be 244-x sub.w d0,d5 ;Find 244-x muls d2,d5 ;Find z*(244-x) divs d4,d5 ;Find delta-x for left eye movem.l d0-d2,-(a7) ;Save x, y, & z values add.w d5,d0 ;Find x for left eye move.w #199,d5 ;d5 is to be H/2 - y sub.w d1,d5 ;Find H/2 - y muls d2,d5 ;Find z*(H/2 - y) divs d4,d5 ;Find delta-y add.w d1,d5 ;Find new y-coord. move.w d5,d1 ;New y in d1 move.w d5,d3 ;Save y in d3 bsr setpix ;Note that setpix uses x=d0, y=d1 and destroys ;d1, d2, & a0. a0 points to absolute address ;where pixel is located in bit plane movem.l (a7)+,d0-d2 ;Recover x, y, & z. move.w #394,d5 sub.w d0,d5 ;Find 394-x muls d2,d5 ;Find z*(394-x) divs d4,d5 ;Find delta-x for right eye add.w d5,d0 ;Find new x value for right eye move.w d3,d1 ;Get y adda #4,a3 ;Get blue plane address bsr setpix suba #4,a3 ;Back to pointer for red plane movem.l (a7)+,d0-d7/a0-a2 ;Retrieve all registers rts ;Done for this set of points. * Point3D takes x, y & z as inputs in registers d0, d1, and d2. It will * convert these 3 values to 2 sets of coordinates. The 1st is the set * observed by the left eye and the 2nd is that observed by the right eye. * These pairs are then stored in the buffer areas lefteye & righteye. A * point counter is used to offset into these buffers and the counter is * then incremented. The half separation of the eyes is assumed to be 75 * pixels, and distance between the observer and screen is 1024 pixels. Point3D: movem.l d0-d7/a0-a2,-(a7) ;Save the registers move.w #1024,d4 ;d4 will act as z + z0. add.w d2,d4 ;Find z + z0 move.w #244,d5 ;d5 will be 244-x sub.w d0,d5 ;Find 244-x muls d2,d5 ;Find z*(244-x) divs d4,d5 ;Find delta-x for left eye move.w PointCount,d6 ;Find #points so far add.w d0,d5 ;Find altered x value for left eye move.l LeftEye,a0 ;Get location of table for left eye lsl.w #2,d6 ;Allow 4 bytes for combined (x,y) ext.l d6 adda d6,a0 ;Point to x-coord. for nth point. move.w d5,(a0)+ ;Store and move up for y-coord. move.w #199,d5 ;d5 is to be H/2 - y sub.w d1,d5 ;Find H/2 - y muls d2,d5 ;Find z*(H/2 - y) divs d4,d5 ;Find delta-y add.w d1,d5 ;Find new y-coord. move.w d5,(a0) ;Store result of y-coord. movem.l d5,-(a7) ;Push y value move.w #394,d5 sub.w d0,d5 ;Find 394-x muls d2,d5 ;Find z*(394-x) divs d4,d5 ;Find delta-x for right eye add.w d0,d5 ;Find new x value for right eye move.l RightEye,a0 adda d6,a0 ;Point to current value lsr.w #2,d6 ;Get counter back to actual size addq.w #1,d6 ;Find new count move.w d6,PointCount ;Store new count move.w d5,(a0)+ ;Store altered x-value movem.l (a7)+,d5 ;Recover y-value move.w d5,(a0) ;Store y-value movem.l (a7)+,d0-d7/a0-a2 ;Retrieve all registers rts ;Done for this set of points. * Poly3D has no inputs in registers. It will complete a sequence of lines * starting with the first point in the eye buffers and end will the same * point. The number of points is indicated by PointCount. The effect is * creating a polygon with N segments when there are N pairs of points stored * in the eye buffers. Prior to executing, Point3D will have been called at * least twice. Poly3D: move.w PointCount,d7 ;Point counter in d7 move.l LeftEye,a2 move.w (a2)+,d3 ;Get 1st x-value move.w (a2)+,d4 ;& 1st y-value ext.l d3 ext.l d4 movem.l d3-d4,-(a7) ;Push 1st point subq.w #1,d7 ;Decrement count dispol: move.w (a2)+,d5 ;Get x2 move.w (a2)+,d6 ;& y2 ext.l d5 ext.l d6 bsr AnyLine ;Display line subq.w #1,d7 bne.s dispol movem.l (a7)+,d5-d6 ;Recover 1st point as last bsr AnyLine adda.l #4,a3 ;Forward to color for right eye move.w PointCount,d7 ;Point counter in d7 move.l RightEye,a2 move.w (a2)+,d3 ;Get 1st x-value move.w (a2)+,d4 ;& 1st y-value ext.l d3 ext.l d4 movem.l d3-d4,-(a7) ;Push 1st point subq.w #1,d7 ;Decrement count poldis: move.w (a2)+,d5 ;Get x2 move.w (a2)+,d6 ;& y2 ext.l d5 ext.l d6 bsr AnyLine ;Display line subq.w #1,d7 bne.s poldis movem.l (a7)+,d5-d6 ;Recover 1st point as last bsr AnyLine suba.l #4,a3 ;Backward to color for left eye move.w #0,PointCount rts *Lines3D is identical to Poly3D, except the polygon isn't closed. Therefore, * the line sequence ends on the last point Lines3D: move.w PointCount,d7 ;Point counter in d7 move.l LeftEye,a2 move.w (a2)+,d3 ;Get 1st x-value move.w (a2)+,d4 ;& 1st y-value ext.l d3 ext.l d4 movem.l d3-d4,-(a7) ;Push 1st point subq.w #1,d7 ;Decrement count dislin: move.w (a2)+,d5 ;Get x2 move.w (a2)+,d6 ;& y2 ext.l d5 ext.l d6 bsr AnyLine ;Display line subq.w #1,d7 bne.s dislin movem.l (a7)+,d5-d6 ;Recover 1st point as last adda.l #4,a3 ;Forward to color for right eye move.w PointCount,d7 ;Point counter in d7 move.l RightEye,a2 move.w (a2)+,d3 ;Get 1st x-value move.w (a2)+,d4 ;& 1st y-value ext.l d3 ext.l d4 movem.l d3-d4,-(a7) ;Push 1st point subq.w #1,d7 ;Decrement count lindis: move.w (a2)+,d5 ;Get x2 move.w (a2)+,d6 ;& y2 ext.l d5 ext.l d6 bsr AnyLine ;Display line subq.w #1,d7 bne.s lindis movem.l (a7)+,d5-d6 ;Recover 1st point as last suba.l #4,a3 ;Backward to color for left eye move.w #0,PointCount rts * One3D has no inputs in registers. It will draw one 3D line starting with * the first point in the eye buffers and ending with the 2nd point. Prior * to executing, Point3D will have been called exactly twice. One3D: move.l LeftEye,a2 move.w (a2)+,d3 ;Get 1st x-value move.w (a2)+,d4 ;& 1st y-value ext.l d3 ext.l d4 move.w (a2)+,d5 ;Get x2 move.w (a2)+,d6 ;& y2 ext.l d5 ext.l d6 bsr AnyLine ;Display line adda.l #4,a3 ;Forward to color for right eye move.l RightEye,a2 move.w (a2)+,d3 ;Get 1st x-value move.w (a2)+,d4 ;& 1st y-value ext.l d3 ext.l d4 move.w (a2)+,d5 ;Get x2 move.w (a2)+,d6 ;& y2 ext.l d5 ext.l d6 bsr AnyLine ;Display line suba.l #4,a3 ;Backward to color for left eye move.w #0,PointCount rts noline: rts * vertline will have its inputs as x1(d3),y1(d4),y2(d5) with x2=x1 vertline: cmp.l d4,d6 ;See if only point beq.s noline movem.l d3-d6,-(a7) ;Push current values move.l #1,d2 ;Will be in quadrant 2 if plus sub.w d4,d6 ;Find y2 - y1 bpl.s postiv ;Already plus move.l #3,d2 ;4th quadrant if negative neg.w d6 ;Make delta-y plus postiv: move.w d3,d0 ;Get x1 into d0 move.w d4,d1 ; & y1 into d1 move.w #SHeight,d3 ;Get screen height in d3 cmp.w #400,d3 ;See if interlace beq.s samkep ;Keep same if interlace asr.w #1,d6 ;Halve delta-y samkep: move.w d6,d3 ;d3 has delta-y (as deltax in NewLine) move.w #0,d4 ;deltay in NewLine is 0 addi.l #4,d2 ;Offset for steep slopes lsl.l #1,d2 ;Double offset lea octcod,a1 ;Get table location adda d2,a1 ;Find pointer to table move.w (a1),d2 ;Get octant code ori.w #SIGNFLAG,d2 ;Set sign flag bsr NewLine movem.l (a7)+,d3-d6 ;Pop values move.l d5,d3 ;Get x2 into x1 move.l d6,d4 ;Get y2 into y1 rts * AnyLine will take input for x1 in d3, y1 in d4, x2 in d5 and y2 in d6 * It will determine if the slope is 0 or infinite and accordingly branch * to horzline or vertline. If neither, it will determine the values for * delta-x and delta-y, determine the quadrant and call NewLine. AnyLine: cmp.w d3,d5 ;See if x1=x2 beq vertline cmp.w d4,d6 ;See if y1=y2 beq horzline movem.l d3-d5,-(a7) move.w #0,d2 ;Quadrant # 0 to start with move.w d3,d0 ;x1 into d0 move.w d4,d1 ;y1 into d1 move.w d5,d3 ;x2 into d3 move.w d6,d4 ;y2 into d4 sub.w d0,d3 ;Find delta-x ishirs: tst.w d3 ;See if negative bmi.s quad23 ;If negative its in 2nd or 3rd quadrant quad14: sub.w d1,d4 ;Find delta-y isintl: tst.w d4 bmi.s quad4 ;It's quadrant 4 quad1: move.l #0,d2 bra octsel ;It's quadrant 1, n = 0 quad4: move.l #3,d2 ;It's quadrant four neg.w d4 ;Make delta-y + bra octsel quad23: sub.w d1,d4 ;Find delta-y intoo: tst.w d4 ;See if - bmi.s quad3 quad2: move.l #1,d2 neg.w d3 ;Make delta-x + bra octsel quad3: move.l #2,d2 ;Quadrant number is 3 neg.w d3 ;Make deltax + neg.w d4 ;Same for delta y octsel: cmp.w d3,d4 ;See if delta-x less than delta-y bmi.s smallslope add.l #4,d2 ;Add in 4 more through table move.l d3,-(a7) ;Push delta x move.l d4,d3 ;Get delta y into delta x move.l (a7)+,d4 ;Pop as delta y smallslope: lsl.l #1,d2 ;Go to select octant lea octcod,a1 adda d2,a1 move.w (a1),d2 ;Get octant code bsr NewLine ;Draw line movem.l (a7)+,d3-d5 move.w d5,d3 ;Make x1 = old x2 move.w d6,d4 ;Make y1 = old y2 rts * horzline will have its inputs as x1(d3),y1(d4),x2(d5) with y2=y1 * d2 will contain the value of delta-x horzline: movem.l d3-d7,-(a7) ;Push current values move.l #0,d2 ;Quadrant 1 if y1>y2 sub.w d3,d5 ;Find deltax bpl.s plus ;Already plus move.l #2,d2 ;Quadrant 4 is - neg.w d5 ;Make deltax + plus: move.w d3,d0 ;Get x1 into d0 move.w d4,d1 ;& y1 into d1 move.w #SWidth,d3 ;Get screen width into d3 cmp.w #640,d3 ;See if high res. beq.s kepsam lsr.w #1,d5 ;Halve delta x kepsam: move.w d5,d3 move.w #0,d4 ;Make deltay = 0 lsl.l #1,d2 ;Double offset lea octcod,a1 adda d2,a1 ;Find pointer to table move.w (a1),d2 ;Get octant code ori.w #SIGNFLAG,d2 bsr NewLine movem.l (a7)+,d3-d7 okay: move.l d5,d3 ;Get x2 into x1 move.l d6,d4 ;Get y2 into y1 rts ResView: movem.l d0-d7/a0-a6,-(a7) move.l #CommandD,d1 bsr DoIt ;Do assign c: sys:c * bsr RestoreSprite move.l IntuitionLibrary,a6 move.l MyScreenA,a0 jsr _LVOScreenToBack(a6) ;Hide both custom screens. move.l MyScreenB,a0 jsr _LVOScreenToBack(a6) lea HomeIt,a0 bsr StrWrite lea Caution,a0 bsr TransIt lea MyString,a0 bsr TransIt bsr SpcWait * bsr SpriteClear move.l #CommandC,d1 bsr DoIt ;Do assign c: ram:c movem.l (a7)+,d0-d7/a0-a6 rts MyDelay: move.l a6,-(a7) move.l DosLibrary,a6 move.l #200,d1 jsr _LVODelay(a6) move.l (a7)+,a6 rts *setpix has inputs of d0.w for x, d1.w for y, and a3 for the video pointer * Registers affected include d1, d2, and a0. It returns with the address * of the pixel in a0 and the bit to be set or cleared in d1 setpix: move.w d1,d2 ;See if y is - and get into d2 bmi.s setnot ;Don't set if negative intlce: move.w #S1Height,d2 sub.w d1,d2 ;*;Find 199-y bcs.s setnot ;* ;Don't set if y1 > yupper. move.w d1,d2 move.w d0,d1 ;See if x is negative bmi.s setnot ;Don't set if is cmp.w #S1Width,d0 bgt.s setnot ;bcc.s setnot ;If no carry then too big move.w d2,d1 ;Save y in d1 lsl.w #6,d1 ;d1 is 32y lsl.w #4,d2 ;d2 is 8y add.w d1,d2 ;d2 is 80y (40y) nrmres: move.w d0,d1 ;d1 is x lsr.w #3,d1 ;d1 is x/8 add.w d1,d2 ;d2 is offset for memory location move.l (a3),a0 ;Point to beginning of memory****was (a3) adda.l d2,a0 ;Add in offset move.w d0,d1 ;d1 is x eori.w #7,d1 ;Toggle lowest 3 bits. andi.w #7,d1 ;Get 7 - x(mod 8) bset d1,(a0) ;Set bit 7-x(mod8) setnot: rts TabCom: move.l CosTab,a0 ;Get beginning of Cos and end of Sin move.l a0,a1 move.w (a1)+,d0 ;Move destination up 1 word. move.b #90,d0 movtab: move.w -(a0),(a1)+ ;Transfer 1 word of table subq.b #1,d0 ;Decrement counter bne.s movtab ;Repeat until 89 values moved. move.l SinTab,a0 move.l CosTab,a1 adda #180,a1 ;Point to cosine 90 degrees move.w #272,d0 tabmov: move.w (a0)+,d1 neg.w d1 move.w d1,(a1)+ ;Store - sine subq.w #1,d0 bne.s tabmov ;Now have through sine(360) move.l CosTab,a0 adda #180,a0 ;Point to cos(90) move.w #0,(a0) ;0 sin(180) rts ClearOne: move.l PnPtr0,a3 move.l a3,PagNum bra.s clears ;Plane both of bit planes for page one ClearTwo: move.l PnPtr1,a3 move.l a3,PagNum clears: move.l a3,a0 move.l #0,d3 bsr.s clearshort move.l a3,a0 move.l #1,d3 clearshort: movem.l d0-d1,-(a7) move.l d3,d1 ;Get bit plane number into d1 lsl.l #2,d1 ;Quadruple offset adda d1,a0 movea.l (a0),a1 ;Get address of screen. adda.l TopOffset,a1 ;# bytes = 80 times #lines move.w #SHeight,d0 ;Get screen height * sub.w #54,d0 ;Less 74 scan lines sub.w BottomOffset,d0 mulu #SWidth,d0 ; times width lsr.l #3,d0 ;Find number of bytes move.l #1,d1 ;Set up flags for waiting on blitter. *Note: BltClear does not cause the problem with disk access. jsr _LVOBltClear(a6) ;Clear the screen. movem.l (a7)+,d0-d1 rts *DrawNot will be reached if x1 or y1 is negative, or if both delta-x & * delta-y are 0. DrawNot: rts * NewLine has inputs as follows. x1, y1 in d0 & d1 for input to setpix *d2 has the octant number, with d3 & d4 being delta-x & delta-y respectively NewLine: ori.w #1,d2 ;Line mode,solid line * Will use ori.w #3 for single bit/scanline move.w d2,(BLTCON1+CHPADR) bsr setpix move.l a0,(BLTCPTH+CHPADR) ;a0 has pixel location move.l a0,(BLTDPTH+CHPADR) andi.w #$F,d0 ;Mask off above 15. move.b #12,d5 ;Want to shift 12 bits. lsl.w d5,d0 ;d0 now has start position. * ori.w #$BFA,d0 ;Add in start position to #$B4A ori.w #$BC8,d0 * $4A is used for ((not A and B) or (AB and not C) * $FA would be used for A or C, and $C8 for (A + C)B == texture move.w d0,(BLTCON0+CHPADR) move.w d4,d1 ;Get dy bmi.s DrawNot ;No - dy allowed move.w d3,d0 ;Get dx bmi.s DrawNot or.w d0,d1 ;Or deltax & deltay beq.s DrawNot ;Don't draw if both 0 * move.l a6,-(a7) ;Save Lib pointer * move.l _AbsExecBase,a6 ;Get exec lib. move.w d4,d1 ;Get dy again sub.w d0,d1 ;d(y-x) into d1 asl.w #2,d1 ;4*d(y-x) into d1 move.w d1,(BLTAMOD+CHPADR);Store 4(y-x) in BLTAMOD move.w d4,d1 ;Get dy again asl.w #2,d1 ;4dy in d1 move.w d1,(BLTBMOD+CHPADR) move.w #$8000,(BLTADAT+CHPADR) ;Index register move.w TXTURE,(BLTBDAT+CHPADR) ;Solid lines asl.w #1,d4 ;Find 2dy sub.w d3,d4 ;2y-x ind d4 now move.w d4,(BLTAPTL+CHPADR) ;2y-x into BLTAPTL move.w bytwidth,(BLTCMOD+CHPADR) ;#$50,(BLTCMOD+CHPADR) ;Screen width move.w bytwidth,(BLTDMOD+CHPADR) ;#$50,(BLTDMOD+CHPADR) move.l #$FFFFFFFF,(BLTAFWM+CHPADR) ;Make mask high for 1st & last move.w #$8140,d0 ;Code for blitter enable. asl.w #6,d3 ;Shift left 6 bits (64 delta-x) ori.w #2,d3 ;Set line draw bit. DskChk: move.w (INTREQR+CHPADR),d1 ;Check request status for disk btst #4,d1 ;See if request pending bne.s DskChk ;Wait until not requested. StsWat: move.w (DMACONR+CHPADR),d1 ;Get enable status btst #4,d1 ;Keep checking until DSKEN off beq.s StsWat btst #14,d1 ;See if busy bne.s StsWat or.w d1,d0 ;Keep status same for copper, etc. bset #10,d0 ;Turn on blitter nasty * move.w #$4000,_intena * addq.b #1,IDNestCnt(a6) ntnst4: move.w d0,(DMACONW+CHPADR) ;Enable the blitter. move.w d3,(BLTSIZE+CHPADR) ;Send out line size to start it. watsts: move.w (DMACONR+CHPADR),d0 ;Get current status btst #14,d0 ;See if busy bne.s watsts * subq.b #1,IDNestCnt(a6) * bge.s EnableDone * move.w #$C000,_intena EnableDone: * move.l (a7)+,a6 ;Recover library pointer rts ;Back to work. NxtPnt: move.l (a4)+,d0 move.l (a4)+,d1 move.l #0,d2 move.l a4,-(a7) bsr PolyVector move.l (a7)+,a4 rts AmigaName: movem.l d0-d5/a4,-(a7) lea AName,a4 bsr.s ClosedPoly ;Outer part of 1st A bsr.s ClosedPoly ;Inner part of 1st A bsr.s ClosedPoly ;M bsr.s ClosedPoly ;I bsr.s ClosedPoly ;G bsr.s ClosedPoly ;Exterior of 2nd A bsr.s ClosedPoly ;Interior of 2nd A movem.l (a7)+,d0-d5/a4 rts ClosedPoly: move.l #0,d2 move.l #0,d5 PolyClose: move.w (a4)+,d1 move.w (a4),d0 ext.l d0 ext.l d1 move.l d1,FirstY move.l d0,FirstX subq.w #2,a4 DoLine: move.w (a4)+,d1 move.w (a4)+,d0 move.l a4,-(a7) ;Save beginning point ext.l d0 ext.l d1 move.w (a4)+,d4 move.w (a4)+,d3 ext.l d3 ext.l d4 cmp.l FirstY,d4 ;See if last point bne.s NotLast cmp.l FirstX,d3 beq.s LastPoint NotLast: movem.l d2/d5,-(a7) bsr Vector movem.l (a7)+,d2/d5 move.l (a7)+,a4 bra.s DoLine LastPoint: bsr Vector move.l (a7)+,a4 addq.l #4,a4 ;Get to beginning of next table rts Spiral: lea ThetaTotal,a0 move.l #0,(a0) ;Initial value of theta NxtSprl: move.l a0,-(a7) bsr Rosette bsr Plot3D move.l (a7)+,a0 move.l DTheta,d0 add.l d0,(a0) cmp.l #180,(a0) ;ytemp ble.s NxtSprl bsr Lines3D ThetaChange: addq.l #8,ThetaNew cmp.l #360,ThetaNew blt.s NewOK sub.l #360,ThetaNew NewOK: rts ChangeTheta: move.l DTheta,d0 lsr.l #5,d0 cmp.w #135,FrmCnt bge.s LT180 cmp.w #45,FrmCnt blt.s LT180 add.l d0,Theta cmp.l #360,Theta ble.s OKTheta sub.l #360,Theta bra.s OKTheta LT180: sub.l d0,Theta bpl.s OKTheta add.l #360,Theta OKTheta: move.l DPhi,d0 lsr.l #5,d0 add.l d0,Phi cmp.l #360,Phi blt.s OKPhi sub.l #360,Phi OKPhi: move.l SinTab,a0 move.l CosTab,a1 move.l Theta,d0 lsl.l #1,d0 ;Get offset in trig table. add.l d0,a1 add.l d0,a0 move.w (a0),d1 ;Get sin move.w (a1),d0 ;Get cos ext.l d0 ext.l d1 asr.l #7,d0 asr.l #7,d1 ;Get actual value times 128 bsr MakChg move.l d0,yoffset move.l d1,zoffset addq.w #1,FrmCnt rts MakChg: add.l #64,d1 cmp.w #135,FrmCnt bge.s GT540 cmp.w #45,FrmCnt bge.s SecHal GT540: neg.l d0 cmp.w #180,FrmCnt blt.s ChgDon bne.s Not180 ChkPnd: move.l PendIO,d0 ;See if anything pending beq.s MesDon bsr CheckIt bra.s ChkPnd MesDon: bsr SetMale lea Mes3,a0 move.b #7,d0 NxMes3: bsr TransIt sub.b #1,d0 bne.s NxMes3 bsr SetFemale Not180: add.l #1,DTheta add.l #1,DPhi move.l yoffset,d0 move.l zoffset,d1 tst.l DZ ble Retrip sub.l DZ,d1 add.l #1,DZ cmp.l #-4000,d1 bgt.s IsClose neg.l DZ lea TabAmy,a1 move.l (a1)+,a0 move.l a1,CurAmy bsr Async IsClose: move.l #0,d0 ChgDon: rts SecHal: add.l #128,d1 neg.l d1 rts Retrip: cmp.w #1024,FrmCnt bge EndLst ;End of last (actually next to last) sequence tst.l DZ beq.s LstPas sub.l DZ,d1 add.l #1,DZ bsr CheckIt cmp.l #-100,d1 ble.s IsClose move.l #0,DZ ChkPd2: move.l PendIO,d2 ;See if io still pending beq.s IO2Don bsr CheckIt bra.s ChkPd2 IO2Don: bsr SetMale lea DaveTab,a1 move.l (a1)+,a0 move.l a1,CurAmy bsr Async bra.s IsClose LstPas: move.l PendIO,d2 ;Get io status bne.s IsClose cmp.w #1000,FrmCnt blt StrtLst bra IsClose StrtLst: bsr Second bsr Third bsr SetFemale lea LateAmy,a1 move.l (a1)+,a0 move.l a1,CurAmy bsr Async bsr NewColor move.w #1000,FrmCnt bsr ScreenDown move.l #-600,d1 ;Move further away bra IsClose EndLst: cmp.w #4000,FrmCnt ;See if on last pass bgt.s PasLst bsr CheckIt move.l PendIO,d2 bne IsClose move.w #4000,FrmCnt ;Start frame count high * bsr ScreenUp PasLst: cmp.w #4030,FrmCnt ble IsClose adda.l #12,a7 ;Balance Stack bra CorkScrew Rosette: movem.l d0-d3/a0-a2,-(a7) move.b #8,d3 move.w Leaf,d1 ;Count of # of leaves bsr SinGet move.w d0,rho ;Store 64*cos(3*theta) in rho move.w #1,d1 bsr CosGet muls rho,d0 asr.l d3,d0 move.l d0,xtemp bsr SinGet muls rho,d0 asr.l d3,d0 move.l d0,ytemp move.w rho,d0 muls d0,d0 move.w #1,d1 move.l ThetaNew,d2 move.l d0,d5 move.l (a0),d4 move.l d2,(a0) bsr.s CosGet move.l d4,(a0) muls d5,d0 asr.l d3,d0 sub.b #1,d3 asr.l d3,d0 move.l d0,z movem.l (a7)+,d0-d3/a0-a2 rts CosGet: move.l CosTab,a1 TrgVal: move.l (a0),d0 ;Get theta lsl.l #1,d0 ;Double for short word table muls d1,d0 ;Include multiplier ChkSiz: cmp.l #720,d0 ;See if beyond table ble.s SmlEnf sub.l #720,d0 bra.s ChkSiz SmlEnf: add.l d0,a1 ;Get sine location move.w (a1),d0 ;Get trig value ext.l d0 asr.l #7,d0 rts SinGet: move.l SinTab,a1 bra.s TrgVal SetWhite: lea WhiteScript,a0 bsr StrWrite rts SetOrange: lea OrangeScript,a0 bsr StrWrite rts PageTitle: move.l GraphicsLibrary,a6 bsr SetWhite lea LinFed,a0 bsr StrWrite lea IntMes0,a0 move.l #4,d3 bsr CtrBlock bsr SetOrange lea IntMes1,a0 move.l #1,d3 bsr CtrWrite bsr CopyFiles lea MenStr,a0 bsr TransIt bsr TransIt bsr SetWhite lea IntMes2,a0 move.l #2,d3 bsr CtrBlock bsr SetUp lea AnCmd,a0 bsr TabWrite bsr TabWrite lea Remem,a0 bsr TransIt bsr TransIt lea DefStr,a0 bsr TransIt bsr TransIt lea SpcStr,a0 bsr CtrWrite * Wait for keyboard input Wait: move.l #0,MyBuffer ;Clear input buffer move.l ConIO,a1 move.l #0,IO_ACTUAL(a1) move.w #20,d3 move.w #1,LoopCnt ;Default value WaitSpc: move.w d3,-(a7) bsr.s ShrtDelay bsr KeyRead ;Read single key using quick-io move.w (a7)+,d3 cmp.b #$20,d0 beq.s WasSpc subq.w #1,d3 bne.s WaitSpc move.l ConIO,a1 bsr.s AbortIt move.l #0,MyBuffer rts WasSpc: move.l ConIO,a1 bsr.s AbortIt move.w #0,LoopCnt move.l #0,MyBuffer ;Flush buffer rts SpcWait: move.l #0,MyBuffer ;Clear input buffer move.l ConIO,a1 move.l #0,IO_ACTUAL(a1) WaitHere: bsr KeyRead ;Read single key using quick-io cmp.b #$20,d0 beq.s WasSpc bra.s WaitHere ;SpcWait only acknowledges space bar ShrtDelay: move.l a6,-(a7) move.l DosLibrary,a6 move.l #10,d1 jsr _LVODelay(a6) move.l (a7)+,a6 rts *SaveSprite: * move.w #$120,d1 * move.w #$122,d2 * move.l #0,a0 *DoSrch: move.w (a0)+,d3 * cmp.w d1,d3 * bne.s DoSrch * move.w (a0)+,d0 ;Move past data word * move.w (a0),d3 * cmp.w d2,d3 * bne.s DoSrch * suba #2,a0 ;Back up to SPR0PTH * move.l (a0)+,d0 ;Get value of SPR0PTH * move.l d0,(SpriteSave) ;Store msw * move.w (a0),d1 ;Get lsw of pointer (i.e. SPR0PTL) * move.w d1,(SpriteSave+2) * move.l (SpriteSave),a0 ;Get address of pointer * adda #4,a0 ;Move up to table for sprite * move.l a0,(SpriteSave) * move.l SpriteBuffer,a1 ;Point to buffer for saving sprite data. * move.b #16,d1 ;Counter for number of words to move. * bra.s blkmov ;Transfer data of original sprite *SpriteClear: * btst.b #0,SprSts * beq.s IsCler * move.b #16,d1 * move.l (SpriteSave),a0 *bufclr: move.l #0,(a0)+ * subq.b #1,d1 * bne.s bufclr * move.l MyScreenA,a0 * move.l sc_MouseY(a0),d0 * move.l d0,LastMouse * move.w #0,MouCnt * bclr.b #0,SprSts *IsCler: rts *RestoreSprite: * btst.b #0,SprSts ;See if pointer already displayed. * bne.s SprtOn * movem.l a0-a1,-(a7) * move.l (SpriteSave),a1 ;Get address of pointer * move.l SpriteBuffer,a0 ;Pointer to buffer for recover sprite data * move.b #16,d1 ;Counter for number of words to move. * bsr blkmov * movem.l (a7)+,a0-a1 *SprtOn: bset.b #0,SprSts * rts *blkmov: * move.l (a0)+,(a1)+ * subq.b #1,d1 ;Decrement counter * bne.s blkmov * rts PortCreate: move.l #-1,d0 jsr _LVOAllocSignal(a6) move.l d0,Signal cmp.l #-1,d0 beq.s NoSignal move.l #MP_SIZE,d0 bsr StructureAlloc move.l d0,MsgPort beq.s MemFail move.l d0,a2 move.l #0,LN_NAME(a2) move.b #0,LN_PRI(a2) move.b #NT_MSGPORT,LN_TYPE(a2) clr.b MP_FLAGS(a2) move.l Signal,d0 move.b d0,MP_SIGBIT(a2) NoSignal: rts TaskFind: move.l #0,a1 jsr _LVOFindTask(a6) move.l d0,MP_SIGTASK(a2) move.l a2,a0 add.l #MP_MSGLIST,a0 move.l a0,(a0) addq.l #4,(a0) clr.l 4(a0) move.l a2,d0 rts MemFail: move.l Signal,d0 jsr _LVOFreeSignal(a6) rts PortDelete: move.l MsgPort,d0 beq.s NoPort move.l d0,a1 move.b #-1,LN_TYPE(a1) moveq #-1,d2 move.l d2,MP_MSGLIST(a1) moveq #0,d2 move.b MP_SIGBIT(a1),d0 jsr _LVOFreeSignal(a6) move.l #MP_SIZE,d0 move.l MsgPort,a1 bsr StructFree move.l #0,MsgPort NoPort: rts SpeakPort: move.l a6,-(a7) move.l _AbsExecBase,a6 move.l #NDI_SIZE,d0 bsr StructureAlloc move.l d0,SpeakIO ;Save pointer to IO request block bsr PortCreate bsr TaskFind move.l MsgPort,a1 move.l a1,MsgPortN move.l Signal,a1 move.l a1,SignalN move.l SpeakIO,a1 move.b #NT_MESSAGE,LN_TYPE(a1) move.l d0,MN_REPLYPORT(a1) move.w #MP_SIZE,MN_LENGTH(a1) lea NarDev_Name,a0 move.l SpeakIO,a1 bsr.s DeviceOpen move.l SpeakIO,a1 move.l OutBuf,d0 move.l d0,IO_DATA(a1) move.w #CMD_WRITE,IO_COMMAND(a1) ;Set up for output audio $ lea AudChn,a0 move.l a0,NDI_CHMASKS(a1) move.w #4,NDI_NUMMASKS(a1) move.w #40,NDI_VOLUME(a1) * move.w #21000,NDI_SAMPFREQ(a1) * bsr SetMale move.l (a7)+,a6 rts SetMale: move.l a1,-(a7) move.l SpeakIO,a1 move.w #MALE,NDI_SEX(a1) move.w #DEFFREQ,NDI_SAMPFREQ(a1) move.w #110,NDI_PITCH(a1) move.w #160,NDI_RATE(a1) move.l (a7)+,a1 rts SetFemale: move.l a1,-(a7) move.l SpeakIO,a1 * move.w #MAXFREQ,NDI_SAMPFREQ(a1) move.w #24000,NDI_SAMPFREQ(a1) move.w #FEMALE,NDI_SEX(a1) move.w #190,NDI_PITCH(a1) move.w #170,NDI_RATE(a1) move.l (a7)+,a1 rts ConsolePort: move.l a6,-(a7) move.l _AbsExecBase,a6 move.l #IOSTD_SIZE,d0 bsr StructureAlloc move.l d0,ConIO ;Save pointer to IO request block bsr PortCreate bsr TaskFind move.l MsgPort,a1 move.l a1,MsgPortC move.l Signal,a1 move.l a1,SignalC lea ConDev_Name,a0 move.l ConIO,a1 move.b #NT_MESSAGE,LN_TYPE(a1) move.l d0,MN_REPLYPORT(a1) move.w #MP_SIZE,MN_LENGTH(a1) move.l MyWindow,d0 move.l d0,IO_DATA(a1) bsr.s DeviceOpen move.l (a7)+,a6 rts DeviceOpen: move.l #0,d0 move.l #0,d1 jsr _LVOOpenDevice(a6) rts CloseDevices: move.l a6,-(a7) move.l _AbsExecBase,a6 move.l SpeakIO,d1 move.l #NDI_SIZE,d0 bsr.s DeviceClose move.l SignalN,d0 move.l #0,SpeakIO move.l d0,Signal move.l MsgPortN,d0 move.l d0,MsgPort bsr PortDelete move.l ConIO,d1 move.l #IOSTD_SIZE,d0 bsr.s DeviceClose move.l #0,ConIO move.l SignalC,d0 move.l d0,Signal move.l MsgPortC,d0 move.l d0,MsgPort bsr PortDelete move.l (a7)+,a6 rts DeviceClose: move.l d1,a1 ;See if 0 beq.s WasCl movem.l d0/a1,-(a7) ;Save pointer to IOReqStr jsr _LVOCloseDevice(a6) movem.l (a7)+,d0/a1 ;Recover IOReqStr pointer and Size bsr StructFree WasCl: rts Async: movem.l d0-d7/a1-a6,-(a7) move.l TranslatorLibrary,a6 move.l a0,a1 bsr.s EndFnd move.l a1,-(a7) ;Save beginning of next string move.l OutBuf,a1 move.l #400,d1 ;Output buffer 200 bytes long jsr _LVOTranslate(a6) move.l OutBuf,a1 bsr.s EndFnd move.l #1,PendIO ;Indicate IO is active move.l SpeakIO,a1 move.l _AbsExecBase,a6 move.l d0,IO_LENGTH(a1) jsr _LVOSendIO(a6) move.l (a7)+,a0 ;Recover beginning of next string. movem.l (a7)+,d0-d7/a1-a6 rts TransIt: movem.l d0-d7/a1-a6,-(a7) move.l TranslatorLibrary,a6 move.l a0,a1 bsr.s EndFnd move.l a1,-(a7) ;Save beginning of next string move.l OutBuf,a1 move.l #400,d1 ;Output buffer 200 bytes long jsr _LVOTranslate(a6) move.l OutBuf,a1 bsr.s EndFnd move.l SpeakIO,a1 move.l _AbsExecBase,a6 move.l d0,IO_LENGTH(a1) jsr _LVODoIO(a6) move.l (a7)+,a0 ;Recover beginning of next string. movem.l (a7)+,d0-d7/a1-a6 rts EndFnd: move.l #0,d0 move.l d0,d2 NxtByt: move.b (a1)+,d1 ;Get translated code beq.s CodDon addq.l #1,d0 cmp.b #$a,d1 beq.s NxtByt addq.l #1,d2 bra.s NxtByt CodDon: rts KeyRead: movem.l a1/a6,-(a7) move.l ConIO,a1 move.l _AbsExecBase,a6 move.l #MyBuffer,IO_DATA(a1) move.l #1,IO_LENGTH(a1) move.w #CMD_READ,IO_COMMAND(a1) move.b #IO_QUICK,IO_FLAGS(a1) jsr _LVOSendIO(a6) * jsr _LVODoIO(a6) move.b MyBuffer,d0 move.l IO_ACTUAL(a1),d1 ;Get #bytes movem.l (a7)+,a1/a6 rts CtrBlock: move.l d3,-(a7) bsr CtrWrite move.l (a7)+,d3 subq.l #1,d3 bne.s CtrBlock rts TitleTran: lea NewWindTitle,a0 move.l WTBuf,a1 move.l a1,-(a7) bsr CntFnd move.l (a7)+,a1 bra.s SpcFil TabWrite: movem.l a1/a6,-(a7) move.l d2,d1 bra.s CmpTab CntFnd: move.l a0,a1 bsr EndFnd move.l PrefBuf,d1 sub.l d2,d1 subq.l #1,d1 asr.l #1,d1 move.l d1,d2 rts FilSpc: move.l StrBuf,a1 SpcFil: move.b #$20,(a1)+ subq.l #1,d1 bne.s SpcFil ChrTrn: move.b (a0)+,d0 move.b d0,(a1)+ bne.s ChrTrn rts CtrWrite: movem.l a1/a6,-(a7) bsr.s CntFnd ;Find # of leading spaces CmpTab: bsr FilSpc move.l a0,-(a7) move.l StrBuf,a0 bsr StrWrite move.l (a7)+,a0 ;Recover beginning of Next string. movem.l (a7)+,a1/a6 rts StrWrite: movem.l a1/a6,-(a7) move.l _AbsExecBase,a6 move.l ConIO,a1 move.w #CMD_WRITE,IO_COMMAND(a1) move.l a0,IO_DATA(a1) ;a0 points to string move.l #-1,IO_LENGTH(a1) ;Write string ending with 0 move.l #0,IO_ACTUAL(a1) ;Clear counter * jsr _LVOSendIO(a6) jsr _LVODoIO(a6) WrtChk: move.l ConIO,a1 move.l IO_ACTUAL(a1),d1 beq.s WrtChk ;Don't leave until value non-zero movem.l (a7)+,a1/a6 rts OpenNewScreen: move.l a6,-(a7) move.l #ns_SIZEOF,d0 bsr StructureAlloc move.l d0,MyNewScreen bsr InitTxtAttr ;Initialize the text attribute structure lea FontName,a1 ;Get name of font. move.l DiskFontLibrary,a6 move.l a1,(a0) ;Store font name pointer in structure. jsr _LVOOpenDiskFont(a6);Open the font move.l MyNewScreen,a2 ;Point to new screen structure move.l d0,ns_Font(a2) ;Store font designation. move.l d0,ScrFnt move.w #640,ns_Width(a2) move.w #400,ns_Height(a2) move.w #2,ns_Depth(a2) move.b #3,ns_DetailPen(a2) ;Invisible move.b #0,ns_BlockPen(a2) ;White move.w #MyView,ns_ViewModes(a2) move.w #CUSTOMSCREEN,ns_Type(a2) move.l MyNewScreen,a0 ;Get pointer the new screen structure movea.l IntuitionLibrary,a6 jsr _LVOOpenScreen(a6) ;Get file handle, already open move.l d0,MyScreenA ;Pointer to new screen beq.s ScrnFail move.l MyNewScreen,a0 ;Get pointer the new screen structure movea.l IntuitionLibrary,a6 jsr _LVOOpenScreen(a6) ;Get file handle, already open move.l d0,MyScreenB ;Pointer to new screen beq.s ScrnFail move.l (a7)+,a6 rts ScrnFail: lea ScrFail,a0 bsr TransIt move.l (a7)+,a6 rts * Close the Screen CloseNewScreen move.l a6,-(a7) move.l MyNewScreen,d0 ;Point to new screen structure beq.s NoScreenStr move.l d0,a1 move.l ns_Font(a1),a1 ;Get pointer for textfont move.l GraphicsLibrary,a6 jsr _LVOCloseFont(a6);Close the font bsr FreeTxtAttr NoScreenStr: movea.l IntuitionLibrary,a6 move.l MyScreenA,d0 beq.s NoScrA move.l d0,a0 jsr _LVOCloseScreen(a6) NoScrA: move.l MyScreenB,d0 move.l d0,a0 beq.s NoScrB jsr _LVOCloseScreen(a6) NoScrB: move.l MyNewScreen,d0 beq.s NoNewScr move.l d0,a1 move.l #ns_SIZEOF,d0 bsr StructFree NoNewScr: move.l #0,MyNewScreen move.l (a7)+,a6 rts ColorSet: movem.l d0-d7/a0-a6,-(a7) move.l MyScreenA,a3 move.l a3,a0 add.l #sc_ViewPort,a0 move.l CTable,a1 move.l #4,d0 jsr _LVOLoadRGB4(a6) add.l #sc_BitMap,a3 ;Get up to bitmap structure add.l #bm_Planes,a3 ;Get pointer to 1st plane. move.l a3,PnPtr0 move.l MyScreenB,a3 move.l a3,a0 add.l #sc_ViewPort,a0 move.l CTable,a1 move.l #4,d0 jsr _LVOLoadRGB4(a6) add.l #sc_BitMap,a3 ;Get up to bitmap structure add.l #bm_Planes,a3 ;Get pointer to 1st plane. move.l a3,PnPtr1 movem.l (a7)+,d0-d7/a0-a6 move.l GraphicsLibrary,a6 rts StructFree: move.l a6,-(a7) move.l _AbsExecBase,a6 move.l a1,d1 beq.s IsFree jsr _LVOFreeMem(a6) IsFree: move.l (a7)+,a6 rts InitTxtAttr: move.l #ta_SIZEOF,d0 bsr.s StructureAlloc move.l d0,MyTextAttr move.l d0,a0 move.w #20,ta_YSize(a0) rts FreeTxtAttr: move.l MyTextAttr,d0 beq.s NoTA move.l d0,a1 move.l #ta_SIZEOF,d0 bsr.s StructFree NoTA: move.l #0,MyTextAttr rts OpenNil: move.l a6,-(a7) move.l DosLibrary,a6 move.l #NilDev,d1 move.l #MODE_OLDFILE,d2 jsr _LVOOpen(a6) move.l d0,NilHandle beq.s NilFail move.l (a7)+,a6 rts NilFail: lea FailNil,a0 bsr TransIt move.l (a7)+,a6 rts CloseNil: move.l a6,-(a7) move.l DosLibrary,a6 move.l NilHandle,d1 beq.s NilClosed jsr _LVOClose(a6) NilClosed: move.l (a7)+,a6 rts Second: move.l #Command3,d1 bra.s DoIt Third: move.l #Command4,d1 DoIt: move.l #0,d2 move.l NilHandle,d3 move.l a6,-(a7) move.l DosLibrary,a6 jsr _LVOExecute(a6) move.l (a7)+,a6 rts SDelay: move.l #100,d1 jsr _LVODelay(a6) rts CopyFiles: movem.l d0-d7/a0-a6,-(a7) move.l #CommandA,d1 ;do a MakeDir for RAM:StereoDemo bsr DoIt tst.l d0 bne.s SuccessA lea FailA,a0 bsr TransIt SuccessA: move.l #CommandB,d1 bsr DoIt tst.l d0 bne.s SuccessB lea FailA,a0 bsr TransIt SuccessB: move.l DosLibrary,a6 move.l #RamFile,RamFP move.l #RamName,RamNP move.l #fib_SIZEOF+6000,d0 ;Get memory for FIB and files to copy bsr StructureAlloc move.l d0,FIB add.l #fib_SIZEOF,d0 move.l d0,FileBuffer move.l #Stereo,d1 ;Point to name Stereo move.l #ACCESS_READ,d2 jsr _LVOLock(a6) ;Get lock tst.l d0 ;See if null beq.s NotThere ;Is on current director move.l d0,d1 ;Get ready to unlock (not open) jsr _LVOUnLock(a6) ;Release it. bra.s CurDir ;Current directory if got to here NotThere: bsr CopyPaths bra.s CopyDone CurDir: move.l #WndName,d1 bsr CopyOne move.l #Wnd2Name,d1 bsr CopyOne CopyDone: move.l #Ram2Name,RamNP move.l #Ram2File,RamFP move.l #CRun,d1 bsr CopyC move.l #CAssign,d1 bsr CopyC move.l #CDelete,d1 bsr CopyC move.l FIB,a1 move.l #fib_SIZEOF+6000,d0 bsr StructFree move.l #CommandC,d1 bsr DoIt ;Assign c: ram:c movem.l (a7)+,d0-d7/a0-a6 rts CopyC: addq.l #2,d1 ;Get to name without c: move.l d1,-(a7) subq.l #2,d1 ;Back to c:name bra.s DoOpen CopyPaths: move.l #WndName,d1 bsr CopyFull move.l #Wnd2Name,d1 CopyFull: move.l d1,-(a7) ;Save pointer to short file name move.l RemPath,a1 ;Get location for rest of string bsr CopyName ;Append name to path move.l #FullPath,d1 ;Set to open full path. bra.s DoOpen ;Open and copy the file CopyOne: move.l d1,-(a7) ;Save pointer to file name DoOpen: move.l #MODE_OLDFILE,d2 jsr _LVOOpen(a6) move.l d0,DosFileHandle beq.s NoFile move.l DosFileHandle,d1 move.l FileBuffer,d2 move.l #6000,d3 jsr _LVORead(a6) ;Read file move.l d0,FileLength move.l DosFileHandle,d1 jsr _LVOClose(a6) ;Close it move.l (a7)+,d1 ;Recover file name move.l RamNP,a1 bsr CopyName move.l RamFP,d1 move.l #MODE_NEWFILE,d2 jsr _LVOOpen(a6) move.l d0,DosFileHandle move.l d0,d1 ;Filehandle into d1 move.l FileBuffer,d2 move.l FileLength,d3 jsr _LVOWrite(a6) move.l DosFileHandle,d1 jsr _LVOClose(a6) rts NoFile: move.l (a7)+,d1 bsr SDelay rts CopyName: move.l d1,a0 CpyChr: move.b (a0)+,d0 move.b d0,(a1)+ bne.s CpyChr rts CopyPath: move.l $c(a5),a0 ;Get pointer to pointer to name move.l (a0),a0 ;Get pointer to name lea FullPath,a1 MovChr: move.b (a0)+,d0 move.b d0,(a1)+ bne.s MovChr FstLet: move.b -(a1),d0 ;Get last byte bclr #5,d0 ;Mask off lower-case bit cmp.b #'S',d0 ;See if 1st letter of Stereo bne.s FstLet move.l a1,RemPath ;Point to remainder of filename path rts dseg RamFP: ds.l 1 ;Pointer to ram file RamNP: ds.l 1 ;Pointer to name for ram file CurAmy: dc.l 0 ;Current location in AmyTab AmyTab: dc.l AmyOne,AmyTwo,AmyThree,AmyFour,0 TabAmy: dc.l AmySix,AmySeven,AmyEight,0 DaveTab: dc.l DaveOne,DaveTwo,0 LateAmy: dc.l Amy1,DaveThree,DaveFour,NxtFive,NxtSix,NxtSev,NxtEgt,NxtNin dc.l NxtTen,NxtElv,NxtTwl,NxtThr,NxtFrt,NxtFif,NxtSxt,NxtSvt dc.l NxtEtt,NxtNnt,NxtTwt,NxtTt1,NxtTt2,NxtTt3,0 LstTab: dc.l Warning,Wrn2,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,Lst1,Lst2 dc.l NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul dc.l Lst3,Lst4,Lst5,Lst6,Lst7,Lst8,Lst9,NxtNul,NxtNul,NxtNul,NxtNul,NxtNul,Lst10,Lst11,Lst12,0 PendIO: dc.l 0 RemPath: dc.l 0 FileLength: dc.l 0 DosFileHandle: dc.l 0 FileBuffer: dc.l 0 ;Pointer to buffer for file copying. Error: dc.l 0 MyName: dc.l 0 FIB: dc.l 0 CurrentLock: dc.l 0 OldLock: dc.l 0 WBMsg: dc.l 0 NilHandle: dc.l 0 PrefBuf: dc.l 0 MyTextAttr: dc.l 0 StrBuf: dc.l 0 WTBuf: dc.l 0 MyNewScreen: dc.l 0 MyScreenA: dc.l 0 MyScreenB: dc.l 0 ScrFnt: dc.l 0 MyBuffer: dc.l 0,0 ;Keyboard input buffer OutBuf: dc.l 0 ;Output buffer for narrator. SndBuf: dc.l 0 ;Audio buffer MsgPort: dc.l 0 MsgPortN: dc.l 0 ;Message port for narrator MsgPortC: dc.l 0 ;Message port for console Signal: dc.l 0 SignalN: dc.l 0 ;Pointer for Narrator Signal SignalC: dc.l 0 ;Pointer of Console Signal ConIO: dc.l 0 ;Pointer for structure for console io SpeakIO: ;Pointer for structure for narrator io dc.l 0 TranslatorLibrary: dc.l 0 DiskFontLibrary: dc.l 0 AudChn: dc.b 3,5,10,12 DZ: dc.l 1 *SpriteSave: * ds.l 1 *SpriteBuffer: * dc.l 0 FirstY: ds.l 1 FirstX: ds.l 1 CTable: dc.l CTable2 Savea5: ds.l 1 Savea6: ds.l 1 InitSP: ds.l 1 ErrNum: dc.l 0 SinTab: ds.l 1 CosTab: ds.l 1 ThetaTotal: ds.l 1 ThetaNew: ds.l 1 TopOffset: ds.l 1 BottomOffset: ds.w 1 LastTop: dc.w 0 MouCnt: ds.w 1 LastMouse: ds.l 1 DTheta: dc.l 128 xoffset: ds.l 1 yoffset: ds.l 1 zoffset: ds.l 1 z: ds.l 1 rho: ds.l 1 xtemp: ds.l 1 ytemp: ds.l 1 SegLength: ds.w 1 Leaf: ds.w 1 octcod: dc.w OCTANT1,OCTANT4,OCTANT5,OCTANT8,OCTANT2,OCTANT3,OCTANT6,OCTANT7 PagNum: ds.l 1 Theta: dc.l 1 Phi: dc.l 1 DPhi: dc.l 0 SinTheta: dc.w 1 CosTheta: dc.w 1 SinPhi: dc.w 1 CosPhi: dc.w 1 IntuitionLibrary: ;Library pointers will be null until opened. dc.l 0 GraphicsLibrary: dc.l 0 DosLibrary: dc.l 0 MyNewWindow: ds.l 1 MyWindow: ds.l 1 bytwidth: ds.l 1 PortView: ds.l 1 * The 4 elements of the following color table are practically perfect * for the 3D filters I'm using. CTable2: dc.w $550,$d40,$490,$d90 ;green was $0a0 MCTable: dc.w $fff,0,0,$f0 SColor: ds.w 4 PnPtr0: dc.l 0 ;,0,0,0,0,0,0,0 ;Pointer for 8 bit planes. PnPtr1: dc.l 0 ;,0,0,0,0,0,0,0 ;Pointer for 8 bit planes. sintab: dc.w 0,$11E,$23C,$359,$477,$594,$6B1,$7CD dc.w $8E9,$A03,$B1D,$C36,$D4E,$E66,$F7C,$1090 dc.w $11A4,$12B6,$13C7,$14D6,$15E4,$16F0,$17FA,$1902 dc.w $1A08,$1B0C,$1C0E,$1D0E,$1E0C,$1F07,$2000,$20F6 dc.w $21EA,$22DB,$23CA,$24B5,$259E,$2684,$2767,$2847 dc.w $2923,$29FD,$2AD3,$2BA6,$2C75,$2D41,$2E0A,$2ECE dc.w $2F90,$304D,$3107,$31BD,$326F,$331D,$33C7,$346D dc.w $350F,$35AD,$3646,$36DC,$376D,$37FA,$3882,$3906 dc.w $3986,$3A01,$3A78,$3AEA,$3B57,$3BC0,$3C24,$3C83 dc.w $3CDE,$3D34,$3D85,$3DD2,$3E19,$3E5C,$3E9A,$3ED3 dc.w $3F07,$3F36,$3F61,$3F86,$3FA6,$3FC2,$3FD8,$3FEA dc.w $3FF6,$3FFE costab: dc.w $3FFF,$3FFE,$3FF6,$3FEA LeftEye: ds.l 1 RightEye: ds.l 1 PointCount: ds.w 1 FrmCnt: ds.w 1 LoopCnt: dc.w 0 AName: dc.w -241,50,-194,-50,-187,-50,-153,50,-162,50,-174,14 dc.w -214,14,-231,50,-241,50 dc.w -210,6,-191,-36,-178,6,-210,6 MName: dc.w -132,50,-106,-50,-97,-50,-88,-17,-68,-50,-61,-50,-54,50 dc.w -62,50,-68,-33,-87,-4,-93,-4,-102,-31,-125,50,-132,50 IName: dc.w -20,50,-20,41,-12,41,0,-41,-9,-41,-9,-50,20,-50 dc.w 20,-41,9,-41,-3,41,5,41,5,50,-20,50 GName: dc.w 51,50,67,-50,128,-50,124,-25,113,-25,116,-41,77,-41 dc.w 64,41,100,41,103,25,87,25,87,18,127,18,127,25 dc.w 114,25,109,50,51,50 AName2: dc.w 149,50,196,-50,203,-50,237,50,228,50,216,14 dc.w 176,14,159,50,149,50 dc.w 180,6,199,-36,212,6,180,6 TXTURE: ds.w 1 DosName: dc.b 'dos.library',0 DiskFontName: dc.b 'diskfont.library',0 IntuitionName: dc.b 'intuition.library',0 GraphicsName: dc.b 'graphics.library',0 FontName: dc.b 'diamond.font',0 DubFed: dc.b $a,$a,0 LinFed: dc.b $a,0 SprSts: dc.b 0 IntMes0: dc.b 'Animated 3D Graphics',$a,$a,0 dc.b 'Software',$a,$a,0 dc.b 'by',$a,$a,0 dc.b 'David M. McKinstry',$a,$a,0 IntMes1: dc.b 'Copyright ',$a9,' 1987-88',$a,$a,0 IntMes2: dc.b 'View on RGB analog monitor using "3D Glasses",',$a,0 dc.b 'Red for left eye and Green for right!',$a,$a,0 AnCmd: dc.b 'Return to Intuition I',$a,$a,0 dc.b 'Terminate Program Control C',$a,$a,0 NewWindTitle: dc.b 'Stereoscopic Demonstration',0 NarDev_Name: dc.b 'narrator.device',0 ConDev_Name: dc.b 'console.device',0 AudDev_Name: dc.b 'audio.device',0 TranslatorName: dc.b 'translator.library',0 WhiteScript: dc.b $9b,'40;31m',0 OrangeScript: dc.b $9b,'40;33m',0 Remem: dc.b 'If you want to run anuhther program that requires uce of the floppy drives, ' dc.b 'press I to stop the animation and get back to in2ihshun!',0 Caution: dc.b 'The prowgram can only be terminated by uzing control see, ' dc.b 'while the animation is proceeding!',0 DefStr: dc.b 'The default for this demo is 1 pass through.',0 dc.b 'If you want the animation to run forever, press the space bar' dc.b 'within the next 4 seconds!',0 SpcStr: dc.b 'Press the space bar for continuous looping!',0 HomeIt: dc.b 12,$a,$a,9,9 MyString: dc.b 'Press the space bar to continue!',0 MenStr: dc.b 'This demonstration may be freely dooplicated and used by anyone, ' dc.b 'as long is it is kept at a unit and includes the above copyright notice.',0 dc.b 'In addition, the drower StereoDemo and all its files must be kawpeed without ' dc.b 'changing them in order for the demo to run correctly.',0 Mes1: dc.b 'Befowr we start this demo, place the 3 D glasses with the red filter' dc.b 'in front of yowr left I and green filter in front of yowr right I.',0 dc.b 'You should be able to look through each filter and see a single image.',0 dc.b 'You may have to adjust the intensity of the monitor to get the ' dc.b 'best results.',0 dc.b 'Do not sit too clowsleee to the monitor or you may have trouble fusing the 2 images.',0 dc.b 'This becomes more critikal if the size of the screen is bigger.',0 Mes2: dc.b 'Only the Amiga has the grafix rehzilushun, cullour, and speed ' dc.b 'that permits real-time stereoscopic animation.',0 Mes3: dc.b 'Amee!',0 dc.b 'Please dew not be so critikal',0 dc.b 'After all, you can not chew gum either.',0 dc.b 'But you dew have sound and graphics ko-prawcessors, 4 thousand ' dc.b '9T6 cuhlurs, and as with this demo, a 6 hundred forty by 4 hundred display.',0 dc.b 'Of course, this is standard on every computer in the Commodore Amiga line.',0 dc.b 'B4 you interrupted me, I was about to say that the uhbility ' dc.b 'of the Amiga for real-time animation makes it an ideal educational tewl.',0 dc.b 'Any figure can be rowtated about 3 ahxeez and moved any distance from the viewer.',0 *Mes8: dc.b 'How about a flying rowz-eht?',0 *Mes9: dc.b 'and a shuttle kraft?',0 TitleL: dc.b 'Stereoscopic Screen',0 TitleR: dc.b ' Stereoscopic Screen',0 NilDev: dc.b 'NIL:',0 Null: dc.b 0 StereoName: dc.b 'StereoFiles',0 FailNil: dc.b 'Sorry, the NIL device could not be opened',0 ScrFail: dc.b 'Sorry, Custom Screen could not be opened',0 CommandA: dc.b 'MakeDir RAM:StereoDemo',0 CommandB: dc.b 'MakeDir RAM:c',0 CommandC: dc.b 'Assign c: ram:c',0 CommandD: dc.b 'Assign c: sys:c',0 CommandE: dc.b 'Delete RAM:c all',0 Command3: dc.b 'Run > NIL: RAM:StereoDemo/Window',0 Command4: dc.b 'Run > NIL: RAM:StereoDemo/Window2',0 EndCmd: dc.b 'Delete RAM:StereoDemo all',0 NoLock: dc.b 'No lock available',0 FailA: dc.b 'Could not MakeDir',0 FailB: dc.b 'Could not change directory',0 FailC: dc.b 'Could not copy files',0 AmyOne: dc.b 'Hello, I am an Amiga personal computer.',0 AmyTwo: dc.b 'Amigaz R the only personal computers with the speed, colour, and detail' dc.b 'That permits real-time stereoscopic animation.',0 AmyThree: dc.b 'I am sorry that my animation is sow slow when I am talking,',0 AmyFour: dc.b 'but the other personal computers can not even draw and chew gum at the same time.',0 AmySix: dc.b 'Yooo Big Dummeee!',0 AmySeven: dc.b 'I was not talking about their gum chewing!',0 AmyEight: dc.b 'They can not dew multi-tasking and animation!',0 DaveOne: dc.b 'Well yes, hardly any other personal computer can do animation, let alone multi-tasking!',0 DaveTwo: dc.b 'and Amiga has had a completely working multi-tasking operating system for about 3 years!',0 Amy1: ;Now it's Amy again dc.b 'Lets pull down our custom screen and see whats going on behind it!',0 DaveThree: dc.b 'OK!',0 DaveFour: dc.b 'Whats this?',0 NxtFive: dc.b 'Well,',0 NxtSix: dc.b ' On our right is a computer from big blue',0 NxtSev: dc.b 'and on our left is the computer for - Quote - the rest of us - UnQuote',0 NxtEgt: dc.b 'Oh?',0 NxtNin: dc.b 'And just who are the rest of us?',0 NxtTen: dc.b ' ',0 NxtElv: dc.b 'They are the extremely ritch!',0 NxtTwl: dc.b 'Those are not very good simulations Amy!',0 NxtThr: dc.b 'They are soooooow slowoooooo!',0 NxtFrt: dc.b 'You are cheating with a lot of delay loops!',0 NxtFif: dc.b 'Arnt you?',0 NxtSxt: dc.b 'Well!',0 NxtSvt: dc.b 'Those computers seem that slow to me!',0 NxtEtt: dc.b 'and I have nothing more to say!',0 NxtNnt: dc.b 'Well its about time you were quiet!',0 NxtTwt: dc.b 'Now let me fihnish what I wanted to say!',0 NxtTt1: dc.b 'Those karakteristics already mentioned, along with the Amigaz sound genaerating uhbilities ' dc.b 'make it ideal for uce in science education.',0 NxtTt2: dc.b 'Some obvious applications for stereoscopic grafix include ' dc.b 'vectors and vector fieldzs in fizzix and mathematics,',0 NxtTt3: dc.b 'and krisolograffee and mowlekular models in fizzix, khemistree, and the life and earth sciences.',0 NxtNul: dc.b ' ' dc.b ' ',0 WndName: dc.b 'Window',0 Wnd2Name: dc.b 'Window2',0 FileOpen: dc.b 'File has been opened',0 FileRead: dc.b 'File has been read',0 FileCopy: dc.b 'File has been copied',0 Warning: dc.b 'Red alert! Red alert!',0 Wrn2: dc.b 'Alien invader sighted! ',0 Lst1: dc.b 'You can just Relax Amy.',0 Lst2: dc.b 'Its just a friendly flying rowz-eht?',0 Lst3: dc.b 'You know, we really should forgive Amy for her outbursts!',0 Lst4: dc.b 'After all, she is extremely talented and does not believe she is being' dc.b 'prawperly rehkognized!',0 Lst5: dc.b 'But, she is only about 3 years old and has not learned much tolerance ' dc.b 'or dihplo-muhsee yet!',0 Lst6: dc.b 'Before we leave, I would like to point out that the ' dc.b 'power is in the Amiga and AmigaDOS.',0 Lst7: dc.b 'All the kahlkulations and display for this demo are done in real time.',0 Lst8: dc.b 'The total number of bytes in this demo is about twenty-one thousand.',0 Lst9: dc.b 'That means that a single floppy could hold over forty programs like this 1!',0 Lst10: dc.b 'Well!',0 Lst11: dc.b 'Good bye friendly row-seht',0 Lst12: dc.b 'and good bye everyone!',0 CRun: dc.b 'C:Run',0 CAssign: dc.b 'C:Assign',0 CDelete: dc.b 'C:Delete',0 Stereo: dc.b 'Stereo',0 RamFile: dc.b 'RAM:StereoDemo/' RamName: ds.b 80 FullPath: ds.b 256 Ram2File: dc.b 'Ram:c/' Ram2Name: ds.b 80 END