home *** CD-ROM | disk | FTP | other *** search
-
-
- 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
-