********************************************************** * * * Protracker Version 1.2 - * * * * Based on Soundtracker V2.5 / Noisetracker x.x) * * Original Coding by Lars Hamre * * with some "Resource" help from Anders Hamre * * Thanks to Rune, and a hi there to Sven, Morten, * * Per and Torgeir. * * * *--------------------------------------------------------* ; OPT O+ ; FileFormat sd_songname EQU 0 sd_sampleinfo EQU 20 sd_numofpatt EQU 950 sd_pattpos EQU 952 sd_mahokakt EQU 1080 sd_patterndata EQU 1084 ; audXtemp offsets n_note EQU 0 ; W n_cmd EQU 2 ; W n_cmdlo EQU 3 ; low B of cmd n_start EQU 4 ; L n_length EQU 8 ; W n_loopstart EQU 10 ; L n_replen EQU 14 ; W n_period EQU 16 ; W n_finetune EQU 18 ; B n_volume EQU 19 ; B n_dmabit EQU 20 ; W n_toneportdirec EQU 22 ; B n_toneportspeed EQU 23 ; B n_wantedperiod EQU 24 ; W n_vibratocmd EQU 26 ; B n_vibratopos EQU 27 ; B n_tremolocmd EQU 28 ; B n_tremolopos EQU 29 ; B n_wavecontrol EQU 30 ; B n_glissfunk EQU 31 ; B n_sampleoffset EQU 32 ; B n_pattpos EQU 33 ; B n_loopcount EQU 34 ; B n_funkoffset EQU 35 ; B n_wavestart EQU 36 ; L n_reallength EQU 40 ; W n_trigger EQU 42 ; B n_samplenum EQU 43 ; B ; Exec Library Offsets LVOFindTask EQU -294 LVOFindName EQU -276 LVOForbid EQU -132 LVOPermit EQU -138 LVOAddPort EQU -354 LVORemPort EQU -360 LVOWaitPort EQU -384 LVOOpenLibrary EQU -552 LVOCloseLibrary EQU -414 LVOOpenDevice EQU -444 LVOCloseDevice EQU -450 LVODoIO EQU -456 LVOSendIO EQU -462 LVOGetMsg EQU -372 LVOReplyMsg EQU -378 LVOAllocMem EQU -198 LVOAllocAbs EQU -204 LVOFreeMem EQU -210 LVOAvailMem EQU -216 LVOAddIntServer EQU -168 LVORemIntServer EQU -174 LVOOpenResource EQU -498 LVOSetFunction EQU -420 LVOSetIntVector EQU -162 LVORemDevice EQU -438 ; CIA Resource Offsets AddICRVector EQU -6 RemICRVector EQU -12 ; DOS Library Offsets LVOOpen EQU -30 LVOClose EQU -36 LVORead EQU -42 LVOWrite EQU -48 LVODeleteFile EQU -72 LVORename EQU -78 LVOLock EQU -84 LVOUnLock EQU -90 LVOExamine EQU -102 LVOExNext EQU -108 LVOInfo EQU -114 LVOIoErr EQU -132 LVOSeek EQU -66 LVOCreateDir EQU -120 LVOCurrentDir EQU -126 LVODateStamp EQU -192 LVODelay EQU -198 LVOExecute EQU -222 LVOUnLoadSeg EQU -156 ; Intuition Library Offsets LVOAutoRequest EQU -348 LVOEasyRequest EQU -588 ;V37+ function! LVODisplayAlert EQU -90 LVOOpenWorkbench EQU -210 LVOCloseWorkbench EQU -78 LVOWBenchToFront EQU -342 ; Graphics Library Offsets LVOBltBitMap EQU -30 LVOWaitBlit EQU -228 LVOOwnBlitter EQU -456 LVODisownBlitter EQU -462 ; DateStamp ofib_DateStamp EQU $84 ds_Days EQU $00 ds_Minute EQU $04 ds_Tick EQU $08 ; Memory Alloc Flags MEMF_PUBLIC EQU $0001 MEMF_CHIP EQU $0002 MEMF_FAST EQU $0004 MEMF_CLEAR EQU $10000 MEMF_LARGEST EQU $20000 ; IO Block Offsets IO_COMMAND EQU $1C IO_FLAGS EQU $1E IO_ACTUAL EQU $20 IO_LENGTH EQU $24 IO_DATA EQU $28 IO_OFFSET EQU $2C ; Device Commands CMD_READ EQU $2 CMD_WRITE EQU $3 CMD_UPDATE EQU $4 TD_MOTOR EQU $9 TD_FORMAT EQU $B TD_CHANGESTATE EQU $E TD_PROTSTATUS EQU $F ; Exec Offsets DeviceList EQU 350 IDNestCnt EQU 294 DirNameLength EQU 30 ConfigFileSize EQU 1024 KeyBufSize EQU 20 ; Screen Offsets ScreenWidth EQU 40 ScreenHeight EQU 256 ScreenPlanes EQU 2 PlaneSize EQU ScreenWidth*ScreenHeight A_BoxData EQU 22 T_BoxData EQU 44 P_BoxData EQU 66 H_BoxData EQU 88 C_BoxData EQU 110 ; More Screen Offsets TopMenusPos EQU (ScreenWidth*01)+15 SpectrumAnaPos EQU (ScreenWidth*45)+15 ;1815 FormatBoxPos EQU (ScreenWidth*52)+10 ;2090 SureBoxPos EQU (ScreenWidth*52)+20 ;2100 SamScrPos EQU (ScreenWidth*122) ;4880 VolBoxPos EQU (ScreenWidth*155)+9 ;6209 PattBlkSize EQU (ScreenWidth*694) ; Text Pos Offsets TempoTextPos EQU (ScreenWidth*15)+7 TempoNumPos EQU (ScreenWidth*124)+4 TimerNumPos EQU (ScreenWidth*103)+34 FreeMemPos EQU (ScreenWidth*131)+33 TuneMemPos EQU (ScreenWidth*124)+33 Scope1Pos EQU (ScreenWidth*56)+16 ScopeBox1Pos EQU (ScreenWidth*72)+16 ScopeBox2Pos EQU (ScreenWidth*72)+22 ScopeBox3Pos EQU (ScreenWidth*72)+28 ScopeBox4Pos EQU (ScreenWidth*72)+34 AnaBlkPos EQU (ScreenWidth*49)+16 PointerYsize EQU 16 ;************************************************************************** ; RunBack Hunk for Protracker ; Written by Lars Hamre/Amiga Freelancers 1990 ; NOTE: This version will not pass arguments or WBMsg to the new Process! SECTION ptrunback,CODE rb_HunkStart SUB.L A1,A1 MOVE.L 4.W,A6 JSR -294(A6) ; FindTask MOVE.L D0,A4 MOVEQ #0,D0 TST.L $AC(A4) ; pr_CLI BNE.S rb_FromCLI LEA $5C(A4),A0 ; pr_MsgPort JSR -384(A6) ; WaitPort LEA $5C(A4),A0 JSR -372(A6) ; GetMsg rb_FromCLI MOVE.L D0,D7 ; D7 = WBmsg LEA rb_DOSname(PC),A1 MOVEQ #0,D0 JSR -552(A6) ; OpenLibrary TST.L D0 BEQ.S rb_dexit MOVE.L D0,A5 EXG A5,A6 ; A6=DOS MOVE.L $98(A4),D1 ; pr_CurrentDir JSR -96(A6) ; DupLock MOVE.L D0,rb_CurrentDir EXG A5,A6 ; A6=exec JSR -132(A6) ; Forbid MOVE.L #rb_ProgName,D1 MOVEQ.L #0,D2 MOVE.B 9(A4),D2 ; priority LEA rb_HunkStart-4(PC),A0 MOVE.L (A0),D3 ; Ptr to next segment CLR.L (A0) ; Unlink next segment MOVE.L #4000,D4 EXG A5,A6 ; A6=DOS JSR -138(A6) ; CreateProc EXG A5,A6 ; A6=exec JSR -138(A6) ; Permit MOVE.L A5,A1 JSR -414(A6) ; CloseLibrary rb_dexit TST.L D7 BEQ.S rb_exit JSR -132(A6) ; Forbid MOVE.L D7,A1 JSR -378(A6) ; ReplyMsg rb_exit MOVEQ #0,D0 RTS rb_DOSname dc.b "dos.library",0 ; End of runback hunk ;******************** CODE HUNK ********************* SECTION ptcode,CODE START MOVE.L 4.W,A6 SUB.L A1,A1 JSR LVOFindTask(A6) MOVE.L D0,PTProcess BSR.S Main MOVE.L 4.W,A6 JSR LVOForbid(A6) MOVE.L DOSBase,A6 MOVE.L rb_CurrentDir(PC),D1 JSR LVOUnLock(A6) LEA START-4(PC),A0 MOVE.L A0,D1 LSR.L #2,D1 JSR LVOUnLoadSeg(A6) MOVEQ #0,D0 RTS Main MOVE.L SP,StackSave BSR OpenLotsOfThings BSR SetVBInt BSR SetMusicInt BSR SetInputHandler BSR SetAutoReq BSR SetEasyReq JSR SetPatternPos BSR SetNormalPtrCol BSR StorePtrCol BSR RedrawToggles BSR DoShowFreeMem BSR SetTempo BSR SetCopList BSR CheckInitError LEA VersionText(PC),A0 JSR ShowStatusText MainLoop BSR DoKeyBuffer BSR CheckTransKeys BSR CheckCtrlKeys BSR CheckAltKeys BSR CheckKeyboard BSR CheckF1_F2 BSR CheckF3_F5 BSR CheckF6_F10 BSR CheckPlayKeys BSR CheckHelpKey BSR ArrowKeys2 BSR ShowTimer BSR ShowFreeMem BSR CheckBlockPos JSR CheckSampleLength BSR CheckRedraw JSR CheckMIDIin BTST #6,$BFE001 BNE.S MainLoop ; Loop if not pressed TST CurrScreen BNE.S MainSkip MOVE #1,notogfl BSR DisplayMainScreen JSR ShowAllRight BSR WaitForButtonUp MainSkip BSR ArrowKeys BRA CheckGadgets notogfl dc.w 0 PTProcess dc.l 0 rb_CurrentDir dc.l 0 rb_ProgName dc.b "PT1.2C",0 VersionText dc.b 'V1.2 - RELEASE C',0 even CheckInitError MOVE.B InitError,D0 BEQ Return1 BTST #0,D0 BEQ.S cieskp1 JSR PLSTMemErr cieskp1 MOVE.B InitError,D0 BTST #1,D0 BEQ.S cieskp2 JSR PLSTOpenErr JSR FreePLST cieskp2 MOVE.B InitError,D0 BTST #2,D0 BEQ.S cieskp3 BSR ConfigErr cieskp3 MOVE.B InitError,D0 BTST #3,D0 BEQ Return1 BSR ConfigErr2 BSR SetNormalPtrCol BRA StorePtrCol CheckRedraw TST.B UpdateTempo BEQ.S chkredr CLR.B UpdateTempo BSR SetTempo chkredr CMP.L #'patp',RunMode BNE Return1 JSR ShowPosition TST.B PattRfsh BEQ Return1 MOVE.L PattRfshNum,PatternNumber JMP RedrawPattern ;---- Cleanup upon exit from PT ---- ExitCleanup JSR StopIt SF EdEnable BSR EscPressed BSR EscPressed BSR ResetVBInt BSR ResetMusicInt BSR ResetInputHandler BSR ResetAutoReq BSR ResetEasyReq BSR ResetCopList JSR CloseMIDI JSR FreeCopyBuf errorexit1 errorexit2 MOVE.L StackSave,SP MOVE.L 4.W,A6 MOVE.L GfxBase,A1 JSR LVOCloseLibrary(A6) MOVE.L IntuitionBase,A1 JSR LVOCloseLibrary(A6) MOVE.L DOSBase,A1 JSR LVOCloseLibrary(A6) MOVE.L TextBplPtr,D1 BEQ.S exex1 MOVE.L D1,A1 MOVE.L #PattBlkSize,D0 JSR LVOFreeMem(A6) exex1 MOVE.L SongDataPtr,D1 BEQ.S exex2 MOVE.L D1,A1 MOVE.L #70716,D0 JSR LVOFreeMem(A6) exex2 BSR FreeDirMem BSR GiveBackInstrMem JSR FreePLST JSR TurnOffVoices BCLR #1,$BFE001 MOVE.B LEDStatus,D0 AND.B #2,D0 OR.B D0,$BFE001 ; Restore LED Status MOVEQ #0,D0 Return1 RTS ;---- Open Lots Of Things ---- OpenLotsOfThings MOVE.B $BFE001,LEDStatus BSET #1,$BFE001 JSR TurnOffVoices MOVE.L 4.W,A6 LEA DOSname(PC),A1 ; Open DOS library MOVEQ #0,D0 JSR LVOOpenLibrary(A6) MOVE.L D0,DOSBase LEA GraphicsName(PC),A1 ; Open graphics library MOVEQ #0,D0 JSR LVOOpenLibrary(A6) MOVE.L D0,GfxBase LEA IntuitionName(PC),A1 ; Open Intuition library MOVEQ #0,D0 JSR LVOOpenLibrary(A6) MOVE.L D0,IntuitionBase MOVE.l D0,A6 MOVE $14(A6),IntuitionVer MOVE.L DOSBase,A6 MOVE.L rb_CurrentDir(PC),D1 JSR LVOCurrentDir(A6) MOVE.L #PattBlkSize,D0 ; Alloc 27k CHIP textbpl MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,TextBplPtr BEQ errorexit1 MOVE D0,NoteBplptrLow ; set low word SWAP D0 MOVE D0,NoteBplptrHigh ; set high word MOVE.L #70716,D0 ; Alloc 70k patternmemory MOVE.L #MEMF_PUBLIC!MEMF_CLEAR,D1 JSR LVOAllocMem(A6) MOVE.L D0,SongDataPtr BEQ errorexit2 MOVE.L D0,A0 LEA $14(A0),A0 MOVEQ #30,D0 alotloop1 MOVE #1,$1C(A0) LEA $1E(A0),A0 DBF D0,alotloop1 MOVE.L SongDataPtr,A0 MOVE #$017F,sd_numofpatt(A0) MOVE.L #'M.K.',sd_mahokakt(A0) ; M.K. again... MOVEQ #6,D0 MOVE.L D0,CurrSpeed MOVE #1,PEDPos MOVE.L #ModulesPath2,PathPtr MOVE.L #CopList,CopListPtr MOVE.L #CopListBitplanes,CopListBplPtr MOVE.L #CopListColors,CopListColorPtr MOVE.L #CopListBpl4,CopListBpl4Ptr MOVE.L #KbdTransTable2,KeyTransTabPtr MOVE.L #NoteNames1,NoteNamesPtr MOVE.L #VUMeterColors,TheRightColors MOVE.L #BitPlaneData,D0 ; Set pointers to bitplane data LEA CopListBitplanes,A1 MOVE D0,6(A1) SWAP D0 MOVE D0,2(A1) SWAP D0 ADD.L #PlaneSize,D0 MOVE D0,14(A1) SWAP D0 MOVE D0,10(A1) BSR SetDefSpritePtrs BSR UpdateCursorPos JSR RedrawPattern JSR ShowPosition JSR ShowSongLength MOVE #1,InsNum JSR ShowSampleInfo LEA BitPlaneData+TopMenusPos,A0 LEA TopMenusBuffer,A1 MOVEQ #44-1,D0 stmloop MOVEQ #25-1,D1 stmloop2 MOVE.B (A0)+,(A1)+ MOVE.B PlaneSize-1(A0),1099(A1) DBF D1,stmloop2 LEA 15(A0),A0 DBF D0,stmloop BSR DoResetAll BSR cfgupda BSR DoLoadConfig MOVE.L #NoteNames1,NoteNamesPtr TST.B Accidental BEQ .skip MOVE.L #NoteNames2,NoteNamesPtr .skip JSR DoLoadPLST ChangeCopList TST SamScrEnable BNE Return1 BSR SetupAnaCols SetupVUCols TST SamScrEnable BNE Return1 LEA CopListMark2,A0 ;VUmeter coloring MOVE #($BA<<8)+7,D5 ;Start position $BA07 LEA VUMeterColors,A5 MOVEQ #47,D7 ;Change 48 lines alotlp4 MOVE D5,(A0)+ MOVE #$FFFE,(A0)+ LEA VUmeterColRegs(PC),A1 MOVEQ #1,D6 alotlp5 MOVE (A5),D4 MOVE (A1)+,(A0)+ MOVE #3,FadeX MOVE D4,D0 BSR FadeCol MOVE D0,(A0)+ MOVE (A1)+,(A0)+ MOVE D4,(A0)+ MOVE (A1)+,(A0)+ MOVE #-3,FadeX MOVE D4,D0 BSR FadeCol MOVE D0,(A0)+ DBF D6,alotlp5 ADDQ #2,A5 ADD #$0100,D5 ; Next line... DBF D7,alotlp4 RTS VUmeterColRegs dc.w $01B2,$01B4,$01B6,$01BA,$01BC,$01BE CopListBpl4Ptr dc.l 0 CopListPtr dc.l 0 CopListBplPtr dc.l 0 CopListColorPtr dc.l 0 DOSname dc.b 'dos.library',0 IntuitionName dc.b 'intuition.library',0 GraphicsName dc.b 'graphics.library',0,0 SetupAnaCols LEA CopListAnalyzer,A5 MOVE ColorTable+12,D2 MOVEQ #39,D0 ; Change col 40 lines MOVE #$687D,D1 ; Start pos sacloop MOVE D1,(A5)+ ; Set wait MOVE #$FFFE,(A5)+ MOVE #$018C,(A5)+ ; Set analyzer color ADDQ.L #2,A5 ADD #$0060,D1 ; Move x-pos MOVE D1,(A5)+ ; Wait MOVE #$FFFE,(A5)+ MOVE #$018C,(A5)+ ; Set text color MOVE D2,(A5)+ ADD #$0100,D1 ; Next line... SUB #$0060,D1 DBF D0,sacloop TST.B DisableAnalyzer BNE.S ClearAnalyzerColors SetAnalyzerColors LEA CopListAnalyzer+6,A1 LEA AnalyzerColors,A0 MOVEQ #39,D0 ; 40 lines sanclop MOVE (A0)+,(A1) LEA 16(A1),A1 DBF D0,sanclop RTS ClearAnalyzerColors LEA CopListAnalyzer+6,A0 MOVE ColorTable+12,D1 MOVEQ #39,D0 ; 40 lines. cacloop MOVE D1,(A0) LEA 16(A0),A0 DBF D0,cacloop RTS SetSamSpritePtrs MOVE.L #LoopSpriteData1,Ch1SpritePtr MOVE.L #LoopSpriteData2,Ch2SpritePtr MOVE.L #PlayPosSpriteData,Ch3SpritePtr MOVE.L #NoSpriteData,Ch4SpritePtr BRA.S sdsp2 SetDefSpritePtrs MOVE.L #VUSpriteData1,Ch1SpritePtr MOVE.L #VUSpriteData2,Ch2SpritePtr MOVE.L #VUSpriteData3,Ch3SpritePtr MOVE.L #VUSpriteData4,Ch4SpritePtr sdsp2 MOVE.L #CursorSpriteData,CursorPosPtr MOVE.L #PointerSpriteData,PointerSpritePtr MOVE.L #LineCurSpriteData,LineCurPosPtr MOVE.L #NoSpriteData,NoSpritePtr MOVE.L PointerSpritePtr,SpritePtrsPtr LEA SpritePtrsPtr,A0 ; Set pointers to spritedata LEA CopList,A1 MOVEQ #15,D2 alotloop2 MOVE (A0)+,2(A1) ADDQ.L #4,A1 DBF D2,alotloop2 RTS PointerSpritePtr dc.l 0 ;---- AutoRequest() ---- SetAutoReq MOVE.L 4.W,A6 JSR LVOForbid(A6) MOVE.L IntuitionBase,A1 MOVE.L #NewAutoRequest,D0 MOVE.L #LVOAutoRequest,A0 JSR LVOSetFunction(A6) MOVE.L D0,AutoReqSave MOVE.L D0,xyzza+2 JSR LVOPermit(A6) RTS ResetAutoReq MOVE.L 4.W,A6 MOVE.L IntuitionBase,A1 MOVE.L AutoReqSave(PC),D0 MOVE.L #LVOAutoRequest,A0 JSR LVOSetFunction(A6) RTS NewAutoRequest TST MountFlag BNE PositiveReturn BTST.B #0,AutoReqRunning BNE.S xyzza OR.b #1,AutoReqRunning MOVE.L A0,saveA0 BSR ResetCopList MOVE.L saveA0(pc),A0 xyzzy JSR $fc00d2 clr.b AutoReqRunning BRA SetCopList xyzza JMP $fc00d2 AutoReqSave EQU xyzzy+2 saveA0 dc.l 0 ;---- EasyRequest() ---- V37+ SetEasyReq CMP #37,IntuitionVer BLT noeasyreq MOVE.L 4.W,A6 JSR LVOForbid(A6) MOVE.L IntuitionBase,A1 MOVE.L #NewEasyRequest,D0 MOVE.L #LVOEasyRequest,A0 JSR LVOSetFunction(A6) MOVE.L D0,EasyReqSave+2 JSR LVOPermit(A6) noeasyreq RTS ResetEasyReq CMP #37,IntuitionVer BLT noeasyreq MOVE.L 4.W,A6 MOVE.L IntuitionBase,A1 MOVE.L EasyReqSave+2(PC),D0 MOVE.L #LVOEasyRequest,A0 JSR LVOSetFunction(A6) RTS NewEasyRequest TST MountFlag BNE PositiveReturn BTST.B #0,AutoReqRunning BNE.S EasyReqSave OR.b #1,AutoReqRunning MOVE.L A0,saveA0 BSR ResetCopList MOVE.L saveA0(pc),A0 BSR EasyReqSave ;goto orig vector clr.b AutoReqRunning BRA SetCopList EasyReqSave JMP $fc00d2 IntuitionVer dc.w 0 ;---- DisplayAlert() ---- SetDispAlert MOVE.L IntuitionBase,A0 MOVE.L LVODisplayAlert+2(A0),DispAlertSave MOVE.L #NewDispAlert,LVODisplayAlert+2(A0) RTS ResetDispAlert MOVE.L IntuitionBase,A0 MOVE.L DispAlertSave,LVODisplayAlert+2(A0) RTS NewDispAlert MOVEM.L D0-D7/A0-A6,-(SP) LEA SoftFailText(PC),A1 ADDQ.L #3,A0 MOVEQ #16,D0 ndaloop CMP.B (A1)+,(A0)+ BNE.S ndaexit DBF D0,ndaloop BSR FindAdr TST.L D0 BEQ.S ndaexit MOVE.L D0,A1 MOVE.L SongDataPtr,A0 MOVE.L #70716,D0 ndalop2 MOVE.B (A0)+,D1 MOVE D1,$DFF180 MOVE.B D1,(A1)+ SUBQ.L #1,D0 BNE.S ndalop2 ndaexit MOVEM.L (SP)+,D0-D7/A0-A6 xyzzy2 JMP $FC0000 DispAlertSave EQU xyzzy2+2 SoftFailText dc.b "Software Failure :-(",0 even ;---- Copper List Functions ---- SetCopList MOVE.L #CopList,$DFF080 RTS ResetCopList MOVE.L GfxBase,A0 MOVE.L 38(A0),$DFF080 RTS ;---- Vertical Blank Interrupt Functions ---- SetVBInt MOVEQ #5,D0 LEA VBIntServer,A1 MOVE.L 4.W,A6 JSR LVOAddIntServer(A6) RTS ResetVBInt MOVEQ #5,D0 LEA VBIntServer,A1 MOVE.L 4.W,A6 JSR LVORemIntServer(A6) RTS vbint MOVEM.L D0-D7/A0-A6,-(SP) BSR UpdatePointerPos BSR VUmeters BSR Scope BSR SpecAnaInt BSR ArrowKeys BSR CheckKeyRepeat BSR UpdateTicks MOVEM.L (SP)+,D0-D7/A0-A6 RTS VBIntServer dc.l 0,0 dc.b 2,0 ; type, priority dc.l vbintname dc.l 0,vbint vbintname dc.b "Protracker_Music_VBlank",0 even ;---- Music Interrupt ---- SetMusicInt TST.B IntMode BNE.S SetCIAInt MOVEQ #5,D0 LEA MusicIntServer,A1 MOVE.L 4.W,A6 JSR LVOAddIntServer(A6) RTS ResetMusicInt TST.B IntMode BNE ResetCIAInt MOVEQ #5,D0 LEA MusicIntServer,A1 MOVE.L 4.W,A6 JSR LVORemIntServer(A6) RTS MusicIntServer dc.l 0,0 dc.b 2,1 ; type, priority dc.l musintname dc.l 0,IntMusic musintname dc.b "Protracker_Music_CIAInt",0 even ;---- CIA Interrupt ---- ciatalo = $400 ciatahi = $500 ciatblo = $600 ciatbhi = $700 ciacra = $E00 ciacrb = $F00 SetCIAInt MOVEQ #2,D6 LEA $BFD000,A5 MOVE.B #'b',CIAAname+3 SetCIALoop MOVEQ #0,D0 LEA CIAAname(PC),A1 MOVE.L 4.W,A6 JSR LVOOpenResource(A6) MOVE.L D0,CIAAbase BEQ Return1 MOVE.L D0,A6 MOVE.L GfxBase,A0 MOVE 206(A0),D0 ; DisplayFlags BTST #2,D0 ; PAL? BEQ.S WasNTSC MOVE.L #1773447,D7 ; PAL BRA.S sciask WasNTSC MOVE.L #1789773,D7 ; NTSC sciask MOVE.L D7,TimerValue DIVU #125,D7 ; Default to normal 50 Hz timer CMP #2,D6 BEQ.S TryTimerA TryTimerB LEA MusicIntServer(PC),A1 MOVEQ #1,D0 ; Bit 1: Timer B JSR AddICRVector(A6) MOVE.L #1,TimerFlag TST.L D0 BNE.S CIAError MOVE.L A5,CIAAaddr MOVE.B D7,ciatblo(A5) LSR #8,D7 MOVE.B D7,ciatbhi(A5) BSET #0,ciacrb(A5) BRA SetTempo TryTimerA LEA MusicIntServer(PC),A1 MOVEQ #0,D0 ; Bit 0: Timer A JSR AddICRVector(A6) CLR.L TimerFlag TST.L D0 BNE.S CIAError MOVE.L A5,CIAAaddr MOVE.B D7,ciatalo(A5) LSR #8,D7 MOVE.B D7,ciatahi(A5) BSET #0,ciacra(A5) BRA SetTempo CIAError MOVE.B #'a',CIAAname+3 LEA $BFE001,A5 SUBQ #1,D6 BNE SetCIALoop CLR.L CIAAbase RTS ResetCIAInt MOVE.L CIAAbase(PC),D0 BEQ Return1 CLR.L CIAAbase MOVE.L D0,A6 MOVE.L CIAAaddr(PC),A5 TST.L TimerFlag BEQ.S ResTimerA BCLR #0,ciacrb(A5) MOVEQ #1,D0 BRA.S RemInt ResTimerA BCLR #0,ciacra(A5) MOVEQ #0,D0 RemInt LEA MusicIntServer(PC),A1 MOVEQ #0,d0 JSR RemICRVector(A6) RTS CIAAname dc.b 'ciaa.resource',0 CIAAbase dc.l 0 TimerFlag dc.l 0 TimerValue dc.l 0 ;---- Tempo ---- TempoGadg CMP #60,D0 BHS Return1 CMP #44,D0 BHS.S TemDown TemUp MOVE RealTempo(PC),D0 ADDQ #1,D0 BTST #2,$DFF016 BNE.S teupsk ADDQ #8,D0 ADDQ #1,D0 teupsk CMP #255,D0 BLS.S teposk MOVE #255,D0 teposk MOVE D0,RealTempo BSR SetTempo BRA Wait_4000 TemDown MOVE RealTempo(PC),D0 SUBQ #1,D0 BTST #2,$DFF016 BNE.S tednsk SUBQ #8,D0 SUBQ #1,D0 tednsk CMP #32,D0 BHS.S teposk MOVE #32,D0 BRA.S teposk ChangeTempo CMP #94,D0 BHS.S TempoDown CMP #80,D0 BHS.S TempoUp RTS TempoUp MOVE Tempo,D0 ADDQ #1,D0 BTST #2,$DFF016 BNE.S temupsk ADDQ #8,D0 ADDQ #1,D0 temupsk CMP #255,D0 BLS.S temposk MOVE #255,D0 temposk MOVE D0,Tempo MOVE D0,RealTempo BSR.S ShowTempo BSR.S SetTempo BRA Wait_4000 TempoDown MOVE Tempo,D0 SUBQ #1,D0 BTST #2,$DFF016 BNE.S temdnsk SUBQ #8,D0 SUBQ #1,D0 temdnsk CMP #32,D0 BHS.S temposk MOVE #32,D0 BRA.S temposk ShowTempo MOVE #TempoTextPos,TextOffset MOVE RealTempo(PC),WordNumber JMP Print3DecDigits SetTempo MOVEQ #125,D0 MOVE.L CIAAbase(PC),D1 BEQ.S setesk3 MOVE RealTempo(PC),D0 CMP #32,D0 BHS.S setemsk MOVEQ #32,D0 setemsk MOVE D0,RealTempo setesk3 TST SamScrEnable BNE.S setesk2 MOVE #TempoNumPos,TextOffset MOVE D0,WordNumber JSR Print3DecDigits setesk2 MOVE.L CIAAbase(PC),D0 BEQ Return1 MOVE RealTempo(PC),D0 MOVE.L TimerValue(PC),D1 DIVU D0,D1 MOVE.L CIAAaddr(PC),A5 MOVE.L TimerFlag(PC),D0 BEQ.S SetTemA MOVE.B D1,ciatblo(A5) ;and set the CIA timer LSR #8,D1 MOVE.B D1,ciatbhi(A5) RTS SetTemA MOVE.B D1,ciatalo(A5) LSR #8,D1 MOVE.B D1,ciatahi(A5) RTS RealTempo dc.w 125 CIAAaddr dc.l 0 ;---- Input Event Handler ---- SetInputHandler MOVE.L 4.W,A6 LEA InpEvPort,A1 JSR LVOAddPort(A6) LEA InputDevName,A0 MOVEQ #0,D0 LEA InpEvIOReq,A1 MOVEQ #0,D1 MOVE.L #InpEvPort,14(A1) JSR LVOOpenDevice(A6) LEA InpEvIOReq,A1 MOVE #9,IO_COMMAND(A1) ; IND_ADDHANDLER MOVE.B #1,IO_FLAGS(A1) MOVE.L #InpEvStuff,IO_DATA(A1) JSR LVOSendIO(A6) RTS ResetInputHandler MOVE.L 4.W,A6 LEA InpEvIOReq,A1 MOVE #10,IO_COMMAND(A1) ; IND_REMHANDLER MOVE.B #1,IO_FLAGS(A1) MOVE.L #InpEvStuff,IO_DATA(A1) JSR LVOSendIO(A6) LEA InpEvIOReq,A1 JSR LVOCloseDevice(A6) LEA InpEvPort,A1 JSR LVORemPort(A6) RTS InpEvStuff dc.l 0,0 dc.b 2,52 ; type, priority dc.l inpevname dc.l 0,InputHandler inpevname dc.b "Protracker_InputHandler",0 even ;-------------------------------------- ; A0-InputEvent, A1-Data Area ; InputHandler MOVEM.L D1/A0-A3,-(SP) TST.B AutoReqRunning BNE.S inphend SUB.L A2,A2 MOVE.L A0,A1 MOVE.B 4(A1),D0 ; ie_Class CMP.B #1,D0 ; RAWKEY BEQ.S InpRawkey CMP.B #2,D0 ; RAWMOUSE BEQ.S InpRawmouse MOVE.L A1,A2 InpNext MOVE.L (A1),A1 MOVE.L A1,D0 BNE.S InputHandler inphend MOVE.L A0,D0 MOVEM.L (SP)+,D1/A0-A3 RTS InpRawkey BSR InpUnchain MOVE 6(A1),D0 BSR ProcessRawkey BRA InpNext InpRawmouse BSR InpUnchain MOVE MouseX3,D0 MOVE MouseY3,D1 ADD 10(A1),D0 ADD 12(A1),D1 TST D0 BPL.S irskip1 MOVEQ #0,D0 irskip1 TST D1 BPL.S irskip2 MOVEQ #0,D1 irskip2 CMP #320,D0 BLO.S irskip3 MOVE #320-1,D0 irskip3 CMP #256,D1 BLO.S irskip4 MOVE #256-1,D1 irskip4 MOVE D0,MouseX3 MOVE D1,MouseY3 ; LSR #1,D0 ;moves faster without this ; LSR #1,D1 MOVE D0,MouseX MOVE D1,MouseY BRA.S InpNext InpUnchain MOVE.L A2,D0 BNE.S InpUnc2 MOVE.L (A1),A0 RTS InpUnc2 MOVE.L (A1),(A2) RTS ;---- Process rawkey code from the keyboard ---- ProcessRawkey CMP.B LastRawkey,D0 BEQ Return1 MOVE.B D0,LastRawkey CMP.B #67+128,D0 BEQ LowerInstr2 CMP.B #96,D0 BEQ ShiftOn CMP.B #97,D0 BEQ ShiftOn2 CMP.B #100,D0 BEQ AltOn CMP.B #101,D0 BEQ AltOn2 CMP.B #99,D0 BEQ CtrlOn CMP.B #102,D0 BEQ LeftAmigaOn CMP.B #99+128,D0 BEQ CtrlOff CMP.B #100+128,D0 BEQ AltOff CMP.B #96+128,D0 BEQ.S ShiftOff CMP.B #101+128,D0 BEQ AltOff CMP.B #97+128,D0 BEQ.S ShiftOff CMP.B #102+128,D0 BEQ LeftAmigaOff CMP.B #98,D0 BEQ.S KeyRepOn CMP.B #98+128,D0 BEQ.S KeyRepOff kbintSetKey TST.B D0 BNE.S kbintDoSet MOVE.B #127,D0 kbintDoSet MOVE KeyBufPos(PC),D1 CMP #KeyBufSize,D1 BHS Return1 LEA KeyBuffer(PC),A3 MOVE.B D0,(A3,D1.W) ADDQ #1,KeyBufPos RTS LowerInstr2 CLR HiLowInstr BRA.S kbintSetKey KeyRepOn ST KeyRepeat RTS KeyRepOff SF KeyRepeat RTS ShiftOn MOVE #1,ShiftKeyStatus RTS ShiftOn2 MOVE #1,ShiftKeyStatus BRA.S kbintSetKey ShiftOff CLR ShiftKeyStatus RTS AltOn MOVE #1,AltKeyStatus RTS AltOn2 MOVE #1,AltKeyStatus BRA.S kbintSetKey AltOff CLR AltKeyStatus RTS CtrlOn MOVE #1,CtrlKeyStatus RTS CtrlOff CLR CtrlKeyStatus RTS LeftAmigaOn MOVE #1,LeftAmigaStatus RTS LeftAmigaOff CLR LeftAmigaStatus RTS DoKeyBuffer MOVE KeyBufPos(PC),D0 BEQ Return1 SUBQ #1,D0 LEA KeyBuffer(PC),A0 MOVE.B (A0,D0.W),D1 MOVE D0,KeyBufPos MOVE.B D1,RawKeyCode MOVE.B D1,SaveKey MOVE KeyRepDelay,KeyRepCounter BTST #7,D1 BEQ.S dkbend CLR KeyRepCounter dkbend RTS KeyBufPos dc.w 0 KeyBuffer dcb.b KeyBufSize,0 ShiftKeyStatus dc.w 0 AltKeyStatus dc.w 0 CtrlKeyStatus dc.w 0 LeftAmigaStatus dc.w 0 LastRawkey dc.b 255,0 SaveKey dc.b 0 KeyRepeat dc.b 0 KeyRepCounter dc.w 0 ;---- Key repeat ---- CheckKeyRepeat TST.B KeyRepeat BEQ Return1 MOVE KeyRepCounter(PC),D0 BEQ Return1 SUBQ #1,D0 BEQ.S RepDown MOVE D0,KeyRepCounter RTS RepDown MOVE.B SaveKey(PC),RawKeyCode MOVE KeyRepSpeed,KeyRepCounter RTS ;---- Update Mousepointer Position ---- UpdatePointerPos MOVE MouseX,D0 ADDQ #3,D0 MOVE MouseY,D1 MOVEQ #PointerYsize,D2 MOVE.L PointerSpritePtr,A0 JMP SetSpritePos ;---- Timer ---- UpdateTicks CMP.L #'patp',RunMode BNE Return1 ADDQ #1,PatternTicks MOVE PatternTicks(PC),D0 MOVE.L 4.W,A0 CMP.B $212(A0),D0 BNE Return1 CLR PatternTicks ADDQ.L #1,TimerTicks RTS ShowTimer CMP #4,CurrScreen BEQ Return1 MOVE.L TimerTicks(PC),D0 DIVU #60,D0 MOVE D0,WordNumber SWAP D0 MOVE D0,D7 MOVE #TimerNumPos,TextOffset JSR Print2DecDigits MOVE D7,WordNumber ADDQ #1,TextOffset JMP Print2DecDigits PatternTicks dc.w 0 TimerTicks dc.l 0 ;---- Spectrum Analyzer ---- SpecAnaInt CMP #1,CurrScreen BNE Return1 TST.B DisableAnalyzer BNE Return1 .loop TST.B AnaDrawFlag BNE Return1 ST AnaDrawFlag MOVEQ #40,D5 MOVEQ #126,D6 LEA AnalyzerHeights,A0 LEA AnalyzerOpplegg,A1 LEA AnalyzerOffsets(PC),A2 MOVE.L TextBplPtr,A3 LEA AnaBlkPos(A3),A3 MOVEQ #$16,D7 spanlab1 MOVE (A0)+,D0 CMP #36,D0 BLO.S spanskip2 MOVE #36,D0 spanskip2 MOVE (A1)+,D1 CMP D0,D1 BEQ.S spanskip3 BLO.S span_r2 SUB D0,D1 SUBQ #1,D1 ADD D0,D0 MOVE (A2,D0.W),D0 spanloop CLR.B (A3,D0.W) SUB D5,D0 DBF D1,spanloop BRA.S spanskip3 span_r2 SUB D1,D0 SUBQ #1,D0 LSL #1,D1 MOVE 0(A2,D1.W),D1 spanloop2 MOVE.B D6,0(A3,D1.W) SUB D5,D1 DBF D0,spanloop2 spanskip3 ADDQ.L #1,A3 DBF D7,spanlab1 LEA AnalyzerHeights,A0 LEA AnalyzerOpplegg,A1 MOVEQ #22,D7 spanloop3 MOVE (A0),D0 MOVE D0,(A1)+ BEQ.S spanskip4 SUBQ #1,D0 spanskip4 MOVE D0,(A0)+ DBF D7,spanloop3 SF AnaDrawFlag RTS ClearAnaHeights LEA AnalyzerOpplegg,A0 LEA AnalyzerHeights,A1 MOVEQ #22,D7 MOVEQ #0,D0 cahloop MOVE D0,(A0)+ MOVE D0,(A1)+ DBF D7,cahloop RTS PlayNoteAnalyze ; Called by keyboard play MOVEM.L D0-D3/A0,-(SP) MOVEQ #0,D2 MOVE 2(A6),D2 BRA.S SpecAna2 SpectrumAnalyzer ; Called by playroutine TST (A4) BEQ Return1 MOVEM.L D0-D3/A0,-(SP) MOVEQ #0,D2 MOVE.B n_volume(A6),D2 ; Get channel volume SpecAna2 TST.B AnaDrawFlag BNE ohno ST AnaDrawFlag BSR SetAnalyzerVolumes BEQ.S saend LSL #8,D2 DIVU #682,D2 MOVE D2,D3 LSR #1,D3 LEA AnalyzerHeights,A0 SUB #113,D0 ; Subtract 113 (highest rate) MOVE #743,D1 SUB D0,D1 ; Invert range 0-743 MULU D1,D1 ; 0 - 743^2 DIVU #25093,D1 MOVE D1,D0 CMP #46,D0 BLO.S saskip MOVEQ #45,D0 saskip LSL #1,D0 ADD D2,(A0,D0.W) CMP #36,(A0,D0.W) BLO.S saskip2 MOVE #36,(A0,D0.W) saskip2 TST D0 BEQ.S saskip3 ADD D3,-2(A0,D0.W) CMP #36,-2(A0,D0.W) BLO.S saskip3 MOVE #36,-2(A0,D0.W) saskip3 CMP #44,D0 BEQ.S saend ADD D3,2(A0,D0.W) CMP #36,2(A0,D0.W) BLO.S saend MOVE #36,2(A0,D0.W) saend SF AnaDrawFlag ohno MOVEM.L (SP)+,D0-D3/A0 RTS AnalyzerOffsets dc.w $0730,$0708,$06E0,$06B8,$0690,$0668,$0640,$0618 dc.w $05F0,$05C8,$05A0,$0578,$0550,$0528,$0500,$04D8 dc.w $04B0,$0488,$0460,$0438,$0410,$03E8,$03C0,$0398 dc.w $0370,$0348,$0320,$02F8,$02D0,$02A8,$0280,$0258 dc.w $0230,$0208,$01E0,$01B8,$0190,$0168,$0140,$0118 dc.w $00F0 AnaDrawFlag dc.b 0,0 ;---- Scope ---- ns_sampleptr = 0 ns_endptr = 4 ns_repeatptr = 8 ns_rependptr = 12 ns_period = 16 ns_volume = 18 Scope LEA audchan1temp,A0 LEA ScopeInfo,A2 LEA ScopeSamInfo,A1 LEA BlankSample,A3 MOVEQ #3,D6 ScoLoop MOVE (A0),D0 AND #$0FFF,D0 OR n_period(A0),D0 BEQ ScoSampleEnd ; end if no note & no period MOVE n_period(A0),ns_period(A2) MOVE.B n_volume(A0),ns_volume(A2) TST.B n_trigger(A0) BEQ ScoContinue ScoRetrig SF n_trigger(A0) BSR SetScope MOVEQ #0,D0 MOVE.B n_samplenum(A0),D0 SUBQ #1,D0 LSL #4,D0 MOVE.L ns_sampleptr(A1,D0.W),ns_sampleptr(A2) MOVE.L ns_endptr(A1,D0.W),ns_endptr(A2) MOVE.L ns_repeatptr(A1,D0.W),ns_repeatptr(A2) MOVE.L ns_rependptr(A1,D0.W),ns_rependptr(A2) MOVE.L ns_sampleptr(A2),D0 CMP.L A3,D0 ; at end of sample... BEQ.S ScoNextChan BRA ScoChk ScoContinue MOVE.L ns_sampleptr(A2),D0 CMP.L A3,D0 ; at end of sample... BEQ.S ScoNextChan MOVEQ #0,D1 MOVE ns_period(A2),D1 LSR #1,D1 BEQ.S ScoNextChan MOVE.L #35469,D2 DIVU D1,D2 EXT.L D2 ADD.L D2,D0 ScoChk CMP.L ns_endptr(A2),D0 BLO.S ScoUpdatePtr TST.L ns_repeatptr(A2) BNE.S ScoSamLoop ScoSampleEnd MOVE.L A3,D0 BRA.S ScoUpdatePtr ScoSamLoop SUB.L ns_endptr(A2),D0 ADD.L ns_repeatptr(A2),D0 MOVE.L ns_rependptr(A2),ns_endptr(A2) CMP.L ns_endptr(A2),D0 BHS ScoSamLoop ScoUpdatePtr MOVE.L D0,ns_sampleptr(A2) ScoNextChan LEA 20(A2),A2 ;ADD.L #20,A2 LEA 44(A0),A0 ;ADD.L #44,A0 DBF D6,ScoLoop ; now draw channels TST.B ScopeEnable BEQ.S clsnot CMP #1,CurrScreen BNE.S clsnot TST.B EdEnable BNE.S clsnot MOVE.L TextBplPtr,A0 ADD.L #Scope1Pos,A0 MOVEQ #0,D0 MOVEQ #32,D1 clscop1 ;MOVEQ #5,D2 MOVE.L D0,(A0)+ MOVE.L D0,(A0)+ MOVE.L D0,(A0)+ MOVE.L D0,(A0)+ MOVE.L D0,(A0)+ MOVE.L D0,(A0)+ ;DBF D2,clscop2 LEA 16(A0),A0 DBF D1,clscop1 clsnot MOVEQ #-1,D4 TST SamScrEnable BEQ.S ScoNClr MOVEQ #0,D4 ScoNClr MOVEQ #0,D7 MOVE $DFF002,D6 ; dmaconr MOVEQ #0,D5 MOVE.L #ScopeBox1Pos,A1 LEA xBlankSample,A2 BTST #0,D6 BEQ.S ScoSkp1 LEA ScopeInfo,A2 MOVE.B ns_volume(A2),D5 ScoSkp1 BSR.S ScoDraw MOVEQ #0,D5 MOVE.L #ScopeBox2Pos,A1 LEA xBlankSample,A2 BTST #1,D6 BEQ.S ScoSkp2 LEA ScopeInfo+20,A2 MOVE.B ns_volume(A2),D5 ScoSkp2 BSR.S ScoDraw MOVEQ #0,D5 MOVE.L #ScopeBox3Pos,A1 LEA xBlankSample,A2 BTST #2,D6 BEQ.S ScoSkp3 LEA ScopeInfo+40,A2 MOVE.B ns_volume(A2),D5 ScoSkp3 BSR.S ScoDraw MOVEQ #0,D5 MOVE.L #ScopeBox4Pos,A1 LEA xBlankSample,A2 BTST #3,D6 BEQ.S ScoSkp4 LEA ScopeInfo+60,A2 MOVE.B ns_volume(A2),D5 ScoSkp4 BSR ScoDraw TST.L D7 BEQ sdloscr Scorts RTS ScoDraw TST.B ScopeEnable BEQ.S sdlpos CMP #1,CurrScreen BNE.S sdlpos TST.B EdEnable BNE.S sdlpos LSR #1,D5 CMP #32,D5 BLS.S sdsk1 MOVEQ #32,D5 sdsk1 MOVE.L (A2),A0 ADD.L TextBplPtr,A1 MOVEQ #4,D2 sdlp1 MOVEQ #7,D3 sdlp2 MOVE.B (A0)+,D0 ; get byte EXT D0 ; extend to word NEG D0 ; negate MULS D5,D0 ; multiply by volume ASR #8,D0 ; shift down MOVE D0,D1 ASL #5,D0 ; * 32 ASL #3,D1 ; * 8 ADD D1,D0 ; (32+8) = * 40 BSET D3,(A1,D0.W) ; set a bit DBF D3,sdlp2 ADDQ.L #1,A1 ; yes sdlskip DBF D2,sdlp1 sdlpos TST.B D4 BNE.S Scorts LEA xBlankSample(PC),A0 CMP.L A0,A2 BEQ.S sdloscr MOVE.L (A2),D1 MOVE.L SamDrawStart(PC),D0 CMP.L D0,D1 BLS.S Scorts CMP.L SamDrawEnd(PC),D1 BHS.S Scorts SUB.L D0,D1 MULU #314,D1 MOVE.L SamDisplay,D0 BEQ.S Scorts DIVU D0,D1 ST D4 ST D7 MOVE.L D1,D0 ADDQ #6,D0 MOVE #139,D1 sdlpspr MOVEQ #64,D2 LEA PlayPosSpriteData,A0 JMP SetSpritePos sdloscr MOVEQ #0,D0 MOVE #270,D1 BRA.S sdlpspr SetScope MOVEQ #0,D1 MOVE.B n_samplenum(A0),D1 SUBQ #1,D1 LSL #4,D1 LEA ScopeSamInfo,A4 LEA (A4,D1.W),A4 MOVE.L n_start(A0),D0 MOVE.L D0,ns_sampleptr(A4) MOVEQ #0,D1 MOVE n_length(A0),D1 ADD.L D1,D0 ADD.L D1,D0 MOVE.L D0,ns_endptr(A4) MOVE.L n_loopstart(A0),D0 MOVE.L D0,ns_repeatptr(A4) MOVEQ #0,D1 MOVE n_replen(A0),D1 CMP #1,D1 BEQ.S sconorep ADD.L D1,D0 ADD.L D1,D0 MOVE.L D0,ns_rependptr(A4) BRA Return1 sconorep CLR.L ns_repeatptr(A4) RTS ToggleAnaScope TST notogfl BNE Return1 BSR WaitForButtonUp MOVEQ #0,D4 TST.B AnaScopFlag BNE.S tasana ST AnaScopFlag BRA RedrawAnaScope tasana SF AnaScopFlag BRA RedrawAnaScope ScopeEnable dc.b 0 AnaScopFlag dc.b 1 xBlankSample dc.l BlankSample SamDrawStart dc.l 0 SamDrawEnd dc.l 0 ;---- Show Free/Tune Memory ---- DoShowFreeMem MOVE #1,UpdateFreeMem ShowFreeMem MOVEM.L D0-D7/A0-A6,-(SP) TST UpdateFreeMem BEQ.S sfmskp CLR UpdateFreeMem CLR.L FreeMemory CLR.L TuneMemory sfmskp BSR ShowTuneMem MOVEQ #MEMF_CHIP,D1 TST.B ShowPublicFlag BEQ sfmskp2 MOVEQ #MEMF_PUBLIC,D1 sfmskp2 MOVE.L 4.W,A6 JSR LVOAvailMem(A6) CMP.L FreeMemory(PC),D0 BEQ.S fremend MOVE.L D0,FreeMemory TST.B ShowDecFlag BNE.S shfrdec MOVE.L D0,D6 MOVE #FreeMemPos,TextOffset SWAP D0 AND #$FF,D0 MOVE D0,WordNumber JSR PrintHexByte MOVE D6,WordNumber JSR PrintHexWord fremend MOVEM.L (SP)+,D0-D7/A0-A6 RTS shfrdec MOVE.L FreeMemory(PC),D0 MOVE #FreeMemPos,TextOffset JSR Print6DecDigits BRA.S fremend ShowTuneMem MOVE.L SongDataPtr,A0 LEA 42(A0),A0 MOVE TuneUp(PC),D7 SUBQ #1,D7 MOVE #31,TuneUp MOVEQ #0,D0 ; Zero length stumeloop MOVEQ #0,D1 MOVE (A0),D1 ASL #1,D1 ADD.L D1,D0 ; Add samplelength ADD.L #30,A0 DBF D7,stumeloop ADD.L #1084,D0 ; Add 1084 to length MOVE.L SongDataPtr,A0 MOVEQ #127,D7 ADD.L #952,A0 MOVEQ #0,D6 stumeloop2 MOVE.B (A0)+,D5 CMP.B D5,D6 BHI.S stumeskip MOVE.B D5,D6 stumeskip DBF D7,stumeloop2 ADDQ #1,D6 ASL.L #8,D6 ASL.L #2,D6 ADD.L D6,D0 ; Add 1024 x Number of patterns CMP.L TuneMemory(PC),D0 BEQ Return1 MOVE.L D0,TuneMemory TST.B ShowDecFlag BNE.S shtudec MOVE.L D0,D6 MOVE #TuneMemPos,TextOffset SWAP D0 AND #$FF,D0 MOVE D0,WordNumber JSR PrintHexByte MOVE D6,WordNumber JMP PrintHexWord shtudec MOVE.L TuneMemory(PC),D0 MOVE #TuneMemPos,TextOffset JMP Print6DecDigits UpdateFreeMem dc.w 0 FreeMemory dc.l 0 TuneMemory dc.l 0 TuneUp dc.w 31 ;---- Audio Channel Toggles ---- CheckToggle MOVE MouseY2,D0 CMP #1,CurrScreen BNE Return1 CMP #44,D0 BHS Return1 DoToggleMute CMP #34,D0 BHS.S ToggleCh4 CMP #23,D0 BHS.S ToggleCh3 CMP #12,D0 BHS.S ToggleCh2 ToggleCh1 LEA audchan1toggle(PC),A0 BRA.S TogCh ToggleCh2 LEA audchan2toggle(PC),A0 BRA.S TogCh ToggleCh3 LEA audchan3toggle(PC),A0 BRA.S TogCh ToggleCh4 LEA audchan4toggle(PC),A0 TogCh CLR.B RawKeyCode EOR #1,(A0) BSR WaitForButtonUp CLR D0 MOVE audchan4toggle(PC),D0 LSL.B #1,D0 OR audchan3toggle(PC),D0 LSL.B #1,D0 OR audchan2toggle(PC),D0 LSL.B #1,D0 OR audchan1toggle(PC),D0 MOVE D0,ActiveChannels BSR.S RedrawToggles BSR Wait_4000 BRA Wait_4000 RedrawToggles CMP #1,CurrScreen BNE Return1 LEA audchan1toggle(PC),A0 BSR.S RedrawSingleTogg LEA audchan2toggle(PC),A0 BSR.S RedrawSingleTogg LEA audchan3toggle(PC),A0 BSR.S RedrawSingleTogg LEA audchan4toggle(PC),A0 RedrawSingleTogg LEA BitPlaneData,A1 MOVEQ #0,D0 MOVE 2(A0),D0 ADD.L D0,A1 MOVEQ #0,D0 MOVE 4(A0),D0 LEA ToggleONdata,A2 TST (A0) BNE.S rtskip LEA ToggleOFFdata,A2 rtskip ADD.L D0,A2 MOVEQ #10,D4 rtloop2 MOVE (ScreenWidth*2)+8(A2),PlaneSize(A1) MOVE (A2)+,(A1) LEA ScreenWidth(A1),A1 DBF D4,rtloop2 RTS rtdoit MOVEQ #10,D4 rtloop MOVE (ScreenWidth*3)+12(A2),PlaneSize(A1) MOVE (A2)+,(A1) LEA ScreenWidth(A1),A1 DBF D4,rtloop RTS ;---- VU Meters ---- VUmeters LEA audchan1temp,A1 LEA VUSpriteData1,A2 MOVE audchan1toggle(PC),D0 BSR.S OneVUmeter LEA audchan2temp,A1 LEA VUSpriteData2,A2 MOVE audchan2toggle(PC),D0 BSR.S OneVUmeter LEA audchan3temp,A1 LEA VUSpriteData3,A2 MOVE audchan3toggle,D0 BSR.S OneVUmeter LEA audchan4temp,A1 LEA VUSpriteData4,A2 MOVE audchan4toggle,D0 OneVUmeter TST.L RunMode BEQ.S VUmeterDown TST (A1) BEQ.S VUmeterDown TST D0 BEQ.S VUmeterDown TST.L Counter BNE.S VUmeterDown MOVEQ #0,D0 ; New note MOVE.B n_volume(A1),D0 ; Get volume CMP #$40,D0 ; Higher than $40 ? BLS.S iccskip ; No, skip MOVEQ #$40,D0 ; Yes, set to $40 iccskip LEA VUmeterHeights(PC),A3 MOVE.B #233,D7 ; Set to 233 SUB.B 0(A3,D0.W),D7 ; Subtract to get new height MOVE.B D7,(A2) RTS VUmeterDown CMP.B #233,(A2) BEQ Return1 ADDQ.B #1,(A2) RTS audchan1toggle dc.w 1,(ScreenWidth*01)+38,0 Chan1Volume dc.w 0 audchan2toggle dc.w 1,(ScreenWidth*12)+38,22 Chan2Volume dc.w 0 audchan3toggle dc.w 1,(ScreenWidth*23)+38,44 Chan3Volume dc.w 0 audchan4toggle dc.w 1,(ScreenWidth*34)+38,66 Chan4Volume dc.w 0 ActiveChannels dc.w 15 VUmeterHeights dc.b 0,0,1,2,2,3,4,5,5,6,7,8,8,9,10,11 dc.b 11,12,13,14,14,15,16,17,17,18,19,20,20,21,22,23 dc.b 23,24,25,26,26,27,28,29,29,30,31,32,32,33,34,35 dc.b 35,36,37,38,38,39,40,41,41,42,43,44,44,45,46,47 dc.b 47,0 SetAnalyzerVolumes MOVEM.L D0-D3/A0,-(SP) LSL #8,D2 DIVU #640,D2 CMP #$F0A0,A5 BNE.S savCh2 TST audchan1toggle BEQ.S savCh2 CMP Chan1Volume,D2 ; volume BLO.S savCh2 MOVE D2,Chan1Volume savCh2 CMP #$F0B0,A5 BNE.S savCh3 TST audchan2toggle BEQ.S savCh3 CMP Chan2Volume,D2 BLO.S savCh3 MOVE D2,Chan2Volume savCh3 CMP #$F0C0,A5 BNE.S savCh4 TST audchan3toggle BEQ.S savCh4 CMP Chan3Volume,D2 BLO.S savCh4 MOVE D2,Chan3Volume savCh4 CMP #$F0D0,A5 BNE.S savNone TST audchan4toggle BEQ.S savNone CMP Chan4Volume,D2 BLO.S savNone MOVE D2,Chan4Volume savNone MOVEM.L (SP)+,D0-D3/A0 MOVEQ #1,D4 RTS ;---- Disk Op. ---- +++ DiskOp CLR.B RawKeyCode MOVE CurrScreen,D0 CMP #3,D0 BEQ ExitFromDir CMP #1,D0 BNE Return1 ShowDirScreen BSR WaitForButtonUp MOVE #3,CurrScreen ST DisableAnalyzer ST NoSampleInfo JSR ClearAnalyzerColors BSR Clear100Lines BSR SwapDirScreen BEQ DisplayMainAll BSR ShowDiskSpace BSR ShowModPackMode BSR ShowPackMode BSR ShowRAWIFFMode DoAutoDir TST.B AutoDirFlag BEQ SelectPath MOVE DirPathNum,D0 BEQ LoadModuleGadg CMP #1,D0 BEQ LoadSongGadg CMP #2,D0 BEQ LoadSampleGadg BRA SelectModules SelectPath MOVE DirPathNum,D0 BEQ SelectModules CMP #1,D0 BEQ SelectSongs BRA SelectSamples SwapDirScreen MOVE.L DecompMemPtr,D0 BEQ.S sdirs2 MOVE.L D0,A1 BSR.S ssets3 BRA FreeDecompMem sdirs2 LEA DirScreenData,A0 MOVE.L #DirScreenSize,D0 BSR Decompact BEQ Return1 ssets3 LEA BitPlaneData,A0 MOVEQ #1,D2 ;2 planes sxloop1 MOVE #1000-1,D0 sxloop2 MOVE.L (A0),D1 MOVE.L (A1),(A0)+ MOVE.L D1,(A1)+ DBF D0,sxloop2 LEA (ScreenWidth*156)(A0),A0 DBF D2,sxloop1 MOVEQ #-1,D0 RTS CheckDirGadgets MOVEM.W MouseX2,D0/D1 CMP #44,D1 BHI CheckDirGadgets2 CMP #33,D1 BLS.S ExtrasMenu CMP #11,D0 BLO DirBrowseGadg CMP #187,D0 BLO DirPathGadg CMP #216,D0 BLO ParentDirGadg CMP #307,D0 BLO ShowFreeDiskGadg BRA CheckDirGadgets2 ExtrasMenu CMP #94,D0 BHS ToggleMenu CMP #22,D1 BHI.S DeleteFileGadg CMP #11,D1 BHI.S RenameFileGadg BRA DiskFormatGadg RenameFileGadg BSR StorePtrCol BSR WaitForButtonUp BSR ClearFileNames MOVE.L PathPtr,A4 BSR ShowDirPath LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ.S RenameFileDirOk BSR ClearDirTotal BSR DirDisk BNE RestorePtrCol RenameFileDirOk MOVE FileNameScrollPos,D0 BSR RedrawFileNames MOVE #10,Action LEA SelectFileText,A0 JSR ShowStatusText BRA RestorePtrCol DeleteFileGadg MOVE DirPathNum,D0 BEQ DeleteModuleGadg CMP #1,D0 BEQ DeleteSongGadg CMP #2,D0 BEQ DeleteSampleGadg RTS ToggleMenu CMP #146,D0 BHS SelectMenu CMP #22,D1 BHI ToggleIFFSave CMP #11,D1 BHI.S ToggleSongPack ToggleModPack CLR.B ModPackMode BSR ShowNotImpl ShowModPackMode LEA ToggleOFFText(PC),A0 TST.B ModPackMode BEQ.S smpmskp LEA ToggleONText2(PC),A0 smpmskp MOVEQ #3,D0 MOVE #175,D1 JSR ShowText3 BRA WaitForButtonUp ShowNotImpl LEA NotImplText(PC),A0 JSR ShowStatusText BRA SetErrorPtrCol NotImplText dc.b 'Not implemented',0 ToggleSongPack EOR.B #1,PackMode ShowPackMode LEA ToggleOFFText(PC),A0 TST.B PackMode BEQ.S spsskip LEA ToggleONText2(PC),A0 spsskip MOVEQ #3,D0 MOVE #615,D1 JSR ShowText3 BRA WaitForButtonUp ToggleIFFSave EOR.B #1,RAWIFFMode ShowRAWIFFMode LEA RAWText(PC),A0 TST.B RAWIFFMode BEQ.S sraffu LEA IFFText(PC),A0 sraffu MOVEQ #3,D0 MOVE #1055,D1 JSR ShowText3 BRA WaitForButtonUp RAWText dc.b "RAW",0 IFFText dc.b "IFF",0 SelectMenu CMP #156,D0 BHS LoadMenu CMP #22,D1 BHI SelectSamples CMP #11,D1 BHI SelectSongs BRA SelectModules LoadMenu CMP #238,D0 BHS.S SaveMenu CMP #22,D1 BHI LoadSampleGadg CMP #11,D1 BHI LoadSongGadg BRA LoadModuleGadg SaveMenu CMP #22,D1 BHI SaveSampleGadg CMP #11,D1 BHI SaveSongGadg BRA SaveModuleGadg CheckDirGadgets2 MOVEM MouseX2,D0/D1 CMP #3,CurrScreen BNE Return1 CMP #307,D0 BLO FileNamePressed CMP #44,D1 BLS FileNameOneUp CMP #89,D1 BLO.S ExitFromDir BRA FileNameOneDown ExitFromDir BSR WaitForButtonUp CLR.B RawKeyCode BSR SwapDirScreen BSR Clear100Lines DisplayMainAll BSR DisplayMainScreen JSR ShowSongLength JSR ShowSampleInfo JSR ShowSongName JSR Show_MS TST LoadInProgress BNE.S dimaskp JSR ShowAllRight dimaskp JMP ShowPosition DirBrowseGadg MOVEQ #0,D3 MOVE DirPathNum,D3 LEA dpnum(PC),A0 ADD.L D3,A0 MOVEQ #0,D0 MOVE.B (A0),D0 ADDQ.B #1,D0 CMP.B #7,D0 BLO.S dbgskip MOVEQ #0,D0 dbgskip MOVE.B D0,(A0) MULU #5,D0 MOVE.L PathPtr,A0 MOVEQ #63,D1 MOVEQ #0,D2 dbglop1 MOVE.B D2,(A0)+ DBF D1,dbglop1 LEA dirpaths(PC),A0 LEA -5(A0,D0.W),A0 TST D0 BNE.S dbgskp2 LEA ModulesPath,A0 TST D3 BEQ.S dbgskp2 LEA SongsPath,A0 CMP #1,D3 BEQ.S dbgskp2 LEA SamplePath,A0 dbgskp2 MOVE.L PathPtr,A1 dbglop2 MOVE.B (A0)+,(A1)+ BNE.S dbglop2 BSR ShowDirPath MOVE #3,WaitTime BRA WaitALittle dirpaths dc.b "DF0:",0,"DF1:",0,"DH0:",0,"DH1:",0,"RAM:",0,"ST-00:",0 dpnum dc.b 0,0,0,0 DirPathNum dc.w 3 SelectModules MOVEQ #0,D0 BRA.S ChangePath SelectSongs MOVEQ #1,D0 BRA.S ChangePath SelectSamples MOVEQ #2,D0 ChangePath MOVE.L TextBplPtr,A0 LEA 178(A0),A0 MOVEQ #0,D2 MOVEQ #26,D1 chpalop MOVE D2,(A0) LEA ScreenWidth(A0),A0 DBF D1,chpalop LEA ModulesPath2,A4 MOVE #178,D1 MOVE D0,DirPathNum BEQ.S chpaski LEA SongsPath2,A4 MOVE #618,D1 CMP #1,D0 BEQ.S chpaski LEA SamplePath2,A4 MOVE #1058,D1 chpaski MOVE.L TextBplPtr,A0 LEA (A0,D1.W),A0 MOVE #$0100,(A0) MOVE #$0F80,40(A0) MOVE #$0FC0,80(A0) MOVE #$0F80,120(A0) MOVE #$0100,160(A0) MOVE.L A4,PathPtr BSR ShowDirPath BRA WaitForButtonUp ;---- Song Gadgets ---- LoadSongGadg BSR StorePtrCol BSR WaitForButtonUp BSR ClearFileNames BSR SelectSongs LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ LoadSongDirOk BSR ClearDirTotal BSR DirDisk BNE RestorePtrCol LoadSongDirOk MOVE FileNameScrollPos,D0 BSR RedrawFileNames MOVE #1,Action LEA SelectSongText,A0 JSR ShowStatusText BRA RestorePtrCol SaveSongGadg BSR SelectSongs LEA SaveSongText,A0 BSR AreYouSure BNE Return1 BSR RestorePtrCol BSR ClearFileNames BSR StopIt JSR SaveSong MOVE #1,Action RTS DeleteSongGadg BSR WaitForButtonUp BSR ClearFileNames BSR SelectSongs LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ.S DeleteSongDirOk BSR ClearDirTotal BSR DirDisk BEQ.S DeleteSongDirOk BRA RestorePtrCol DeleteSongDirOk MOVE FileNameScrollPos,D0 BSR RedrawFileNames MOVE #2,Action LEA SelectSongText,A0 JSR ShowStatusText BRA SetDeletePtrCol ;---- Module Gadgets ---- LoadModuleGadg BSR StorePtrCol BSR WaitForButtonUp BSR ClearFileNames BSR SelectModules LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ.S LoadModDirOk BSR ClearDirTotal BSR DirDisk BEQ.S LoadModDirOk BRA RestorePtrCol LoadModDirOk MOVE FileNameScrollPos,D0 BSR RedrawFileNames MOVE #3,Action LEA SelectModuleText,A0 JSR ShowStatusText BRA RestorePtrCol SaveModuleGadg BSR SelectModules LEA SaveModuleText,A0 BSR AreYouSure BNE Return1 JSR SaveModule MOVE #3,Action JMP ShowAllRight DeleteModuleGadg BSR WaitForButtonUp BSR ClearFileNames BSR SelectModules LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ.S DeleteModDirOk BSR ClearDirTotal BSR DirDisk BEQ.S DeleteModDirOk BRA RestorePtrCol DeleteModDirOk MOVE FileNameScrollPos(PC),D0 BSR RedrawFileNames MOVE #4,Action LEA SelectModuleText,A0 JSR ShowStatusText BRA SetDeletePtrCol ;---- Sample Gadgets ---- LoadSampleGadg BSR StorePtrCol BSR WaitForButtonUp BSR ClearFileNames BSR SelectSamples LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ.S LoadSampleDirOk BSR ClearDirTotal BSR DirDisk BEQ.S LoadSampleDirOk BRA RestorePtrCol LoadSampleDirOk MOVE FileNameScrollPos,D0 BSR RedrawFileNames MOVE #5,Action LEA SelectSampleText,A0 JSR ShowStatusText BRA RestorePtrCol SaveSampleGadg BSR SelectSamples CLR.B RawKeyCode MOVE InsNum,D0 BEQ NotSampleNull LEA SaveSampleText,A0 BSR AreYouSure BNE Return1 dosavesample BSR StorePtrCol BSR CreateSampleName MOVE.L DiskDataLength,D1 BEQ Return1 MOVEQ #0,D1 MOVE InsNum,D1 LSL.L #2,D1 LEA SamplePtrs,A0 MOVE.L 0(A0,D1.W),DiskDataPtr BSR SetDiskPtrCol MOVE.L DOSBase,A6 MOVE.L FileNamePtr,D1 MOVE.L #1006,D2 JSR LVOOpen(A6) MOVE.L D0,FileHandle BNE SaveSample JSR CantOpenFile BRA ErrorRestoreCol SaveSample LEA SavingSampleText,A0 JSR ShowStatusText TST.B RAWIFFMode BEQ savesam MOVE.L FileHandle,D1 MOVE.L #IFFFORM,D2 MOVEQ #IFFEND-IFFFORM,D3 JSR LVOWrite(A6) savesam MOVE.L FileHandle,D1 MOVE.L DiskDataPtr,D2 MOVE.L DiskDataLength,D3 JSR LVOWrite(A6) MOVE.L FileHandle,D1 JSR LVOClose(A6) CLR.L FileHandle MOVE #5,Action JSR ShowAllRight BRA RestorePtrCol IFFFORM dc.b "FORM" dc.l 0 dc.b "8SVX" IFFVHDR dc.b "VHDR" dc.l 20 dc.l 0,0,32 ; oneshot, repeat, hisamples dc.w 16726 ; This is really NTSC (16574 for PAL!!!) dc.b 1,0 ; octaves, compression dc.l $10000 ; volume IFFNAME dc.b "NAME" dc.l 24 dcb.b 24,0 dc.b "ANNO" dc.l 16 dc.b "Protracker 1.2C",0 IFFBODY dc.b "BODY" dc.l 0 IFFEND ;---- Delete Sample ---- DeleteSampleGadg BSR StorePtrCol BSR WaitForButtonUp BSR ClearFileNames BSR SelectSamples LEA FileNamesPtr(PC),A5 BSR HasDiskChanged BEQ.S DeleteSamDirOk BSR ClearDirTotal BSR DirDisk BEQ.S DeleteSamDirOk BRA RestorePtrCol DeleteSamDirOk MOVE FileNameScrollPos(PC),D0 BSR RedrawFileNames MOVE #6,Action LEA SelectSampleText,A0 JSR ShowStatusText BRA SetDeletePtrCol ;---- Directory Path Gadget ---- DirPathGadg BSR StorePtrCol BSR SetWaitPtrCol MOVE.L PathPtr,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #63,TextEndPtr MOVE #19,TextLength MOVE #1484,A4 BSR GetTextLine BRA RestorePtrCol CopyPath LEA FileName,A1 TST.B (A0) ; If no path BEQ Return1 cploop MOVE.B (A0)+,(A1)+ ; Copy path to filename BNE.S cploop CMP.B #':',-2(A1) ; If ending with ':' it's ok BEQ.S PathCharBack CMP.B #'/',-2(A1) ; If ending with '/' it's ok BEQ.S PathCharBack MOVE.B #'/',-1(A1) ; Add '/' to end path RTS PathCharBack SUBQ.L #1,A1 RTS ShowDirPath CMP #3,CurrScreen BNE Return1 MOVEM.L D0-D7/A0-A6,-(SP) MOVE.L PathPtr,A0 MOVEQ #19,D0 MOVE #1484,D1 JSR ShowText3 MOVEM.L (SP)+,D0-D7/A0-A6 RTS ;---- File List Gadgets ---- FileNameOneUp TST Action BEQ Return1 LEA FileNamesPtr(PC),A5 MOVE FileNameScrollPos(PC),D0 BEQ Return1 SUBQ #1,D0 BTST #2,$DFF016 BNE RedrawFileNames SUBQ #3,D0 BPL RedrawFileNames MOVEQ #0,D0 BRA RedrawFileNames FileNameOneDown TST Action BEQ Return1 LEA FileNamesPtr(PC),A5 MOVE FileNameScrollPos(PC),D0 ADDQ #1,D0 BTST #2,$DFF016 BNE.S fnod2 ADDQ #3,D0 fnod2 MOVE 16(A5),D1 SUBQ #8,D1 BMI Return1 CMP D1,D0 BLS RedrawFileNames MOVE D1,D0 BRA RedrawFileNames ;---- Clicked on a filename ---- FileNamePressed SUB #44,D1 MOVE #1,UpdateFreeMem TST Action BEQ Return1 CMP #3,D1 BLO Return1 CMP #50,D1 BHI Return1 SUBQ #3,D1 AND.L #$FFFF,D1 DIVU #6,D1 MOVE D1,FileNameScrollPos+2 LEA FileNamesPtr(PC),A5 MOVE FileNameScrollPos(PC),D0 ADD D1,D0 CMP 16(A5),D0 BHS Return1 MULU #36,D0 ADD.L (A5),D0 MOVE.L D0,A0 TST.L 32(A0) BMI.S AddDirectory MOVEQ #DirNameLength-1,D0 LEA DirInputName,A1 fnploop MOVE.B (A0)+,(A1)+ DBF D0,fnploop MOVE Action,D6 CMP #1,D6 BEQ LoadSong CMP #2,D6 BEQ DeleteSong CMP #3,D6 BEQ xLoadModule CMP #4,D6 BEQ DeleteModule CMP #5,D6 BEQ LoadSample CMP #6,D6 BEQ DeleteSample CMP #10,D6 BEQ RenameFile RTS xLoadModule JMP LoadModule AddDirectory MOVE.L A0,-(SP) MOVE.L PathPtr,A0 BSR CopyPath MOVE.L (SP)+,A0 MOVEQ #DirNameLength-1,D0 addplop MOVE.B (A0)+,(A1)+ DBF D0,addplop LEA FileName,A0 MOVE.L PathPtr,A1 MOVEQ #62,D0 addplp2 MOVE.B (A0)+,(A1)+ DBF D0,addplp2 addpdir BSR ShowDirPath MOVE Action,D6 CMP #1,D6 BEQ LoadSongGadg CMP #2,D6 BEQ DeleteSongGadg CMP #3,D6 BEQ LoadModuleGadg CMP #4,D6 BEQ DeleteModuleGadg CMP #5,D6 BEQ LoadSampleGadg CMP #6,D6 BEQ DeleteSampleGadg CMP #10,D6 BEQ RenameFileGadg RTS ParentDirGadg BSR WaitForButtonUp MOVE.L PathPtr,A0 MOVE.L A0,A1 pdgloop TST.B (A1)+ BNE.S pdgloop SUBQ.L #1,A1 CMP.L A0,A1 BLS Return1 SUBQ.L #1,A1 CMP.B #'/',(A1) BNE.S pdgskp1 CLR.B (A1) pdgskp1 CMP.B #':',(A1) BEQ.S addpdir CMP.B #'/',(A1) BEQ pdgslsh CLR.B (A1) CMP.L A0,A1 BLS.S addpdir SUBQ.L #1,A1 BRA.S pdgskp1 pdgslsh CLR.B (A1) BRA addpdir FileNamesPtr dc.l 0 ; A5+ 0 dc.l 0 ; + 4 dc.l 0 ; + 8 dc.l 0 ; +12 dc.w 0 ; +16 dc.w 24 ; +18 FileNameScrollPos dc.w 0 dc.w 0 ;---- Has Disk Changed ---- HasDiskChanged MOVE.L DOSBase,A6 MOVE.L A4,D1 MOVEQ #-2,D2 JSR LVOLock(A6) MOVE.L D0,FileLock BEQ.S ExamineError MOVE.L FileLock,D1 MOVE.L #FileInfoBlock,D2 JSR LVOExamine(A6) TST.L D0 BEQ.S ExamineError LEA FileInfoBlock,A0 MOVE.L ofib_DateStamp+ds_Days(A0),D0 CMP.L 4(A5),D0 BNE.S DiskChanged MOVE.L ofib_DateStamp+ds_Minute(A0),D0 CMP.L 8(A5),D0 BNE.S DiskChanged MOVE.L ofib_DateStamp+ds_Tick(A0),D0 CMP.L 12(A5),D0 BNE.S DiskChanged MOVE.L FileLock,D1 JSR LVOUnLock(A6) MOVEQ #0,D0 RTS DiskChanged MOVE.L ofib_DateStamp+ds_Days(A0),4(A5) MOVE.L ofib_DateStamp+ds_Minute(A0),8(A5) MOVE.L ofib_DateStamp+ds_Tick(A0),12(A5) MOVE.L FileLock,D1 JSR LVOUnLock(A6) MOVEQ #-1,D0 RTS ExamineError CLR.L 4(A5) MOVEQ #-1,D0 RTS ShowFreeDiskGadg BSR WaitForButtonUp BSR.S LockAndGetInfo BSR DirDiskUnlock JMP ShowAllRight LockAndGetInfo BSR StorePtrCol BSR SetDiskPtrCol CLR FileNameScrollPos MOVE.L DOSBase,A6 MOVE.L A4,D1 ; Dir-path in A4 MOVEQ #-2,D2 JSR LVOLock(A6) MOVE.L D0,FileLock BEQ DirDiskError LEA ReadingDirText,A0 JSR ShowStatusText MOVE.L FileLock,D1 MOVE.L #InfoData,D2 JSR LVOInfo(A6) LEA InfoData,A0 MOVE.L 12(A0),D0 ; id_NumBlocks SUB.L 16(A0),D0 ; id_NumBlocksUsed MULU 22(A0),D0 ; id_BytesPerBlock + 2 MOVE.L D0,FreeDiskSpace ShowDiskSpace MOVE #1510,TextOffset MOVE.L FreeDiskSpace,D7 TST.B ShowDecFlag BNE.S sdsdec SWAP D7 MOVE D7,WordNumber JSR PrintHexWord SWAP D7 MOVE D7,WordNumber JSR PrintHexWord MOVEQ #0,D0 RTS sdsdec DIVU #10000,D7 MOVE D7,WordNumber JSR Print4DecDigits SWAP D7 MOVE D7,WordNumber JSR Print4DecDigits MOVEQ #0,D0 RTS ;---- Get Disk Directory ---- AllocDirMem ADD #50,DirEntries MOVE DirEntries,D0 MULU #36,D0 MOVE.L DirAllocSize(PC),D6 MOVE.L D0,DirAllocSize MOVE.L #MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,D7 BEQ.S baehsj MOVE.L FileNamesPtr(PC),D1 MOVE.L D7,FileNamesPtr TST.L D1 BEQ Return1 TST.L D6 BEQ Return1 MOVE.L D1,A0 MOVE.L D7,A1 MOVE.L D6,D0 admloop MOVE.B (A0)+,(A1)+ SUBQ.L #1,D6 BNE.S admloop MOVE.L D1,A1 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) RTS FreeDirMem MOVE.L FileNamesPtr(PC),D1 BEQ Return1 MOVE.L D1,A1 MOVE.L DirAllocSize(PC),D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) CLR.L FileNamesPtr CLR DirAllocSize CLR DirEntries RTS baehsj JSR OutOfMemErr MOVEQ #-1,D0 RTS DirAllocSize dc.l 0 DirEntries dc.w 0 DirDisk BSR FreeDirMem BSR AllocDirMem BSR LockAndGetInfo BNE Return1 MOVE.L FileLock,D1 MOVE.L #FileInfoBlock,D2 JSR LVOExamine(A6) TST.L D0 BEQ DirDiskError ddloop1 MOVE.L FileLock,D1 MOVE.L #FileInfoBlock,D2 MOVE.L DOSBase,A6 JSR LVOExNext(A6) TST.L D0 BEQ DirDiskUnlock BTST #2,$DFF016 BEQ.S AbortDir BSR NewDirEntry BRA.S ddloop1 AbortDir CLR.L 4(A5) LEA DirAbortedText(PC),A0 JSR ShowStatusText BSR.S DirDiskUnlock BSR WaitALittle JSR ShowAllRight MOVEQ #0,D0 RTS DirDiskUnlock MOVE.L FileLock,D1 JSR LVOUnLock(A6) BSR RestorePtrCol MOVEQ #0,D0 RTS DirAbortedText dc.b 'dir aborted !',0 DirDiskError TST.L FileLock BEQ.S ddeskip MOVE.L FileLock,D1 JSR LVOUnLock(A6) ddeskip BSR RestorePtrCol LEA CantFindDirText,A0 JSR ShowStatusText BSR SetErrorPtrCol MOVEQ #-1,D0 RTS ClearDirTotal CLR 16(A5) RTS CantFindDirText dc.b "can't find dir !",0,0 NewDirEntry LEA FIB_FileName,A0 TST.B ShowDirsFlag BNE.S ndeok1 TST.L FIB_EntryType BPL Return1 ndeok1 TST.L FIB_EntryType BPL ndeok2 TST.B ModOnlyFlag BEQ.S ndeok2 TST DirPathNum BNE.S ndeok2 MOVE.L (A0),D0 AND.L #$CFCFCFCF,D0 CMP.L #$4D4F440E,D0 ; MOD. BNE Return1 ndeok2 MOVE 16(A5),D0 CMP DirEntries,D0 BLO.S ndeok3 MOVE.L A0,-(SP) BSR AllocDirMem MOVE.L (SP)+,A0 ndeok3 MOVE 16(A5),D6 BEQ.S ndeadd1 ; If first entry SUBQ #1,D6 MOVE.L (A5),A1 ndeloopname MOVEQ #0,D2 MOVE.L FIB_EntryType,D0 MOVE.L 32(A1),D1 TST.L D0 BPL.S ndesfil ; if directory, all is well TST.L D1 BMI.S ndenext ; was file, so skip if directory BRA.S ndelopc ndesfil TST.L D1 ; if file BPL.S ndeinse ndelopc MOVE.B (A0,D2.W),D0 ; Get a character BEQ.S ndeinse CMP.B #96,D0 ; Lowercase? BLO.S ndeskp1 SUB.B #32,D0 ; Switch to upper ndeskp1 MOVE.B (A1,D2.W),D1 BEQ.S ndenext CMP.B #96,D1 BLO.S ndeskp2 SUB.B #32,D1 ndeskp2 CMP.B D0,D1 BHI.S ndeinse BNE.S ndenext ADDQ #1,D2 BRA.S ndelopc ndenext LEA 36(A1),A1 ; next entry DBF D6,ndeloopname ; loop entries MOVE.L (A5),A1 MOVE 16(A5),D0 MULU #36,D0 ADD D0,A1 BRA.S ndeadd2 ndeinse MOVE.L (A5),A2 MOVE 16(A5),D0 MULU #36,D0 ADD D0,A2 MOVE.L A2,A3 LEA 36(A3),A3 nde3loop MOVE -(A2),-(A3) CMP.L A2,A1 BNE.S nde3loop BRA.S ndeadd2 ndeadd1 MOVE.L (A5),A1 ; Put new filename into list ndeadd2 LEA FIB_FileName,A0 MOVE.L A1,A3 MOVEQ #35,D0 ; Clear old filename nde4loop CLR.B (A3)+ DBF D0,nde4loop MOVE FIB_DateStamp+ds_Days+2,30(A1) MOVEQ #-1,D0 TST.L FIB_EntryType BPL ndefskp MOVE.L FIB_FileSize,D0 ndefskp MOVE.L D0,32(A1) MOVEQ #29,D0 ; Copy new filename nde4loop2 MOVE.B (A0)+,D1 MOVE.B D1,(A1)+ TST.B D1 BEQ.S nde4skip DBF D0,nde4loop2 nde4skip ADDQ #1,16(A5) ; Files + 1 RTS RedrawFileNames MOVE D0,-(SP) BSR ShowDirPath MOVE (SP)+,D0 MOVE D0,FileNameScrollPos TST 16(A5) BEQ Return1 MOVE.L #1881,A6 MOVE A6,TextOffset MOVE.L (A5),D6 MULU #36,D0 ADD.L D0,D6 MOVE 16(A5),D0 SUB FileNameScrollPos,D0 CMP #8,D0 BHS.S ShowFileNames SUBQ #1,D0 MOVE D0,D7 BRA.S sfnloop ShowFileNames MOVE #$91,D0 BSR WaitForVBlank MOVEQ #7,D7 sfnloop MOVE A6,TextOffset MOVE.L D6,A0 MOVEQ #0,D0 MOVE 30(A0),D0 BSR CalculateDate MOVE TheDay(PC),WordNumber JSR Print2DecDigits MOVE TheMonth(PC),WordNumber JSR Print2DecDigits MOVE TheYear(PC),WordNumber JSR Print2DecDigits ADDQ #1,TextOffset MOVE.L D6,ShowTextPtr MOVE #24,TextLength TST DirPathNum BNE.S sfnskip TST.B ModOnlyFlag BEQ.S sfnskip MOVE.L D6,A0 CMP.L #"mod.",(A0) BNE.S sfnskip ADDQ.L #4,ShowTextPtr sfnskip JSR SpaceShowText LEA 32(A6),A6 MOVE A6,TextOffset MOVE.L D6,A0 MOVE.L 32(A0),D1 BMI.S sfndir TST.B ShowDecFlag BNE.S sfndec SWAP D1 AND #$000F,D1 BSR ShowOneDigit MOVE.L D6,A0 MOVE 34(A0),WordNumber JSR PrintHexWord sfnend ADD.L #36,D6 LEA 208(A6),A6 DBF D7,sfnloop RTS sfndec MOVE.L D1,D0 SUBQ #1,TextOffset JSR Print6DecDigits BRA.S sfnend sfndir MOVE.L #DirText,ShowTextPtr SUBQ #1,TextOffset MOVE #6,TextLength JSR ShowText BRA.S sfnend ClrFileText dc.b " " CalculateDate DIVU #1461,D0 LSL #2,D0 MOVE D0,TheYear CLR D0 SWAP D0 CMP #789,D0 BEQ.S cadleap BLO.S cadskp2 SUBQ #1,D0 cadskp2 DIVU #365,D0 MOVE.L D0,D1 SWAP D1 CMP #4,D0 BLO.S cadskip SUBQ #1,D0 cadskip ADD D0,TheYear LEA MonthTable(PC),A1 MOVEQ #24,D0 cadloop SUBQ #2,D0 MOVE (A1,D0.W),D2 CMP D2,D1 BHS.S cadskp3 TST D0 BNE.S cadloop cadskp3 LSR #1,D0 ADDQ #1,D0 MOVE D0,TheMonth SUB D2,D1 ADDQ #1,D1 MOVE D1,TheDay cadend MOVEQ #0,D0 MOVE TheYear(PC),D0 ADD #78,D0 DIVU #100,D0 SWAP D0 MOVE D0,TheYear RTS cadleap ADD #2,TheYear MOVE #2,TheMonth MOVE #29,TheDay BRA cadend TheYear dc.w 0 TheMonth dc.w 0 TheDay dc.w 0 MonthTable dc.w 0,31,59,90,120,151,181,212,243,273,304,334 DirText dc.b " (DIR)" ;---- Play Song ---- PlaySong MOVEQ #0,D0 SongFrom BSR StopIt BTST #2,$DFF016 BNE.S sofr1 MOVE PlayFromPos,D0 sofr1 MOVE D0,ScrPattPos LSL #4,D0 AND.L #$FFFF,D0 MOVE.L D0,PatternPosition wfbu1 BTST #6,$BFE001 BEQ.S wfbu1 CLR.B RawKeyCode CLR.B SaveKey BSR SetPlayPtrCol CLR PatternTicks CLR.L TimerTicks MOVE.L #'patp',RunMode CLR DidQuantize MOVE.L #-1,LongFFFF BSR SetScrPatternPos SetPlayPosition MOVE.L CurrPos,D0 MOVE.L SongDataPtr,A0 CMP.B sd_numofpatt(A0),D0 BHS.S SongPosToZero MOVE.L CurrPos,SongPosition RTS SongPosToZero CLR.L SongPosition CLR.L CurrPos RTS ;---- Play Pattern ---- PlayPattern MOVEQ #0,D0 PattFrom BSR StopIt BTST #2,$DFF016 BNE.S pafr1 MOVE PlayFromPos,D0 pafr1 MOVE D0,ScrPattPos LSL #4,D0 AND.L #$FFF,D0 MOVE.L D0,PatternPosition wfbu2 BTST #6,$BFE001 BEQ.S wfbu2 CLR.B RawKeyCode CLR.B SaveKey MOVE.L #'patt',RunMode BSR SetPlayPtrCol ResetPosition MOVE.L PatternNumber,SongPosition RTS ;---- Record Pattern/Song ---- RecordPattern MOVEQ #0,D0 RecordFrom TST SamScrEnable BNE Return1 BSR StopIt BTST #2,$DFF016 BNE.S refr1 MOVE PlayFromPos,D0 refr1 MOVE D0,ScrPattPos LSL #4,D0 AND.L #$FFF,D0 MOVE.L D0,PatternPosition wfbu3 BTST #6,$BFE001 BEQ.S wfbu3 BSR SetEditPtrCol CLR.B RawKeyCode CLR.B SaveKey BSR SaveUndo MOVE.L #'edit',EditMode MOVE.L #'patt',RunMode TST.B RecordMode BEQ.S ResetPosition MOVE.L #'patp',RunMode BRA SetPlayPosition ;---- Show Main Screen ---- DisplayMainScreen CLR BlockMarkFlag MOVE #1,CurrScreen SF NoSampleInfo TST LoadInProgress BNE.S dmsskp3 BSR SetNormalPtrCol TST RunMode BEQ.S dmsskip BSR SetPlayPtrCol dmsskip TST.L EditMode BEQ.S dmsskp2 BSR SetEditPtrCol dmsskp2 BSR StorePtrCol dmsskp3 ST DisableAnalyzer BSR ClearAnaHeights BSR ClearRightArea LEA BitPlaneData+TopMenusPos,A0 LEA TopMenusBuffer,A1 MOVEQ #44-1,D0 cgloop4 MOVEQ #25-1,D1 cgloop5 MOVE.B (A1)+,(A0)+ MOVE.B 1099(A1),PlaneSize-1(A0) DBF D1,cgloop5 LEA 15(A0),A0 DBF D0,cgloop4 BSR RedrawToggles TST.B EdEnable BNE EditOp MOVEQ #0,D4 RedrawAnaScope MOVE #145,D0 BSR WaitForVBlank SF ScopeEnable ST DisableAnalyzer BSR ClearRightArea LEA SpectrumAnaData,A0 MOVE.L #SpectrumAnaSize,D0 TST.B AnaScopFlag BEQ.S cgjojo LEA ScopeData,A0 MOVE.L #ScopeSize,D0 cgjojo BSR Decompact BEQ cgjaja LEA BitPlaneData+SpectrumAnaPos,A0 MOVEQ #1,D7 cgloop1 MOVEQ #55-1,D6 ; 55 lines in picture. cgloop2 MOVEQ #25-1,D5 ; 25 bytes(x8) cgloop3 MOVE.B (A1)+,(A0)+ DBF D5,cgloop3 ADDQ.L #1,A1 LEA 15(A0),A0 DBF D6,cgloop2 LEA $1F68(A0),A0 DBF D7,cgloop1 BSR FreeDecompMem cgjaja ;TST.L D4 ;fuks up with this ;BNE Return1 TST.B AnaScopFlag BNE cgscope BSR ClearAnaHeights BSR ClearRightArea SF DisableAnalyzer BRA SetAnalyzerColors cgscope ST ScopeEnable BRA ClearAnalyzerColors ;---- Clear Areas ---- ClearFileNames MOVE #145,D0 BSR WaitForVBlank MOVE.L TextBplPtr,A1 LEA 1800(A1),A1 MOVE #550-1,D0 MOVEQ #0,D1 cfnloop MOVE.L D1,(A1)+ DBF D0,cfnloop RTS ClearRightArea MOVE.L TextBplPtr,A0 LEA ScreenWidth+15(A0),A0 MOVEQ #0,D2 MOVEQ #99-1,D0 cnblloop1 MOVEQ #25-1,D1 cnblloop2 MOVE.B D2,(A0)+ DBF D1,cnblloop2 LEA 15(A0),A0 DBF D0,cnblloop1 RTS Clear100Lines MOVE.L TextBplPtr,A0 MOVE #(ScreenWidth*25)-1,D0 MOVEQ #0,D1 chlloop MOVE.L D1,(A0)+ DBF D0,chlloop RTS ;---- Are You Sure Requester ---- AreYouSure MOVE.B DisableAnalyzer,SaveDA MOVE.B ScopeEnable,SaveScope SF ScopeEnable JSR ShowStatusText BSR StorePtrCol BSR SetWaitPtrCol BSR Wait_4000 CMP #1,CurrScreen BNE.S aysskip TST.B DisableAnalyzer BNE.S aysskip ST DisableAnalyzer BSR ClearAnaHeights BSR ClearRightArea aysskip LEA SureBoxData,A1 BSR SwapBoxMem BSR WaitForButtonUp BSR Wait_4000 CLR.B RawKeyCode surebuttoncheck BTST #2,$DFF016 BEQ.S SureAnswerNo BSR DoKeyBuffer MOVE.B RawKeyCode,D0 CMP.B #21,D0 ; Pressed Y BEQ SureAnswerYes CMP.B #68,D0 ; Pressed Return BEQ.S SureAnswerYes CMP.B #54,D0 ; Pressed N BEQ.S SureAnswerNo CMP.B #69,D0 ; Pressed Esc BEQ.S SureAnswerNo BTST #6,$BFE001 ; Left Mousebutton BNE.S surebuttoncheck MOVEM.W MouseX,D0/D1 CMP #$AB,D0 BLO.S surebuttoncheck CMP #$FC,D0 BHI.S surebuttoncheck CMP #$48,D1 BLO.S surebuttoncheck CMP #$52,D1 BHI.S surebuttoncheck CMP #$C5,D0 BLO.S SureAnswerYes CMP #$EA,D0 BLO.S surebuttoncheck SureAnswerNo LEA SureBoxData,A1 BSR.S SwapBoxMem JSR ShowAllRight BSR ClearAnaHeights MOVE.B SaveDA,DisableAnalyzer MOVE.B SaveScope,ScopeEnable BSR ErrorRestoreCol BSR WaitForButtonUp BSR Wait_4000 CLR.B RawKeyCode MOVEQ #-1,D0 RTS SureAnswerYes LEA SureBoxData,A1 BSR.S SwapBoxMem JSR ShowAllRight BSR ClearAnaHeights MOVE.B SaveDA,DisableAnalyzer MOVE.B SaveScope,ScopeEnable BSR RestorePtrCol BSR WaitForButtonUp BSR Wait_4000 CLR.B RawKeyCode MOVEQ #0,D0 RTS SwapBoxMem LEA BitPlaneData+SureBoxPos,A0 MOVEQ #38,D0 ssbmloop1 MOVEQ #12,D1 ssbmloop2 MOVE.B PlaneSize(A0),D2 MOVE.B 546(A1),PlaneSize(A0) MOVE.B D2,546(A1) MOVE.B (A0),D2 MOVE.B (A1),(A0)+ MOVE.B D2,(A1)+ DBF D1,ssbmloop2 LEA 27(A0),A0 ADDQ.L #1,A1 DBF D0,ssbmloop1 MOVE.L TextBplPtr,A0 ; Swap text... LEA SureBoxPos(A0),A0 LEA TextDataBuffer,A1 MOVEQ #38,D0 ssbmloop3 MOVEQ #12,D1 ssbmloop4 MOVE.B (A0),D2 MOVE.B (A1),(A0)+ MOVE.B D2,(A1)+ DBF D1,ssbmloop4 LEA 27(A0),A0 ADDQ.L #1,A1 DBF D0,ssbmloop3 RTS WaitForButtonUp BTST #6,$BFE001 ; Check Left Mousebutton BEQ.S WaitForButtonUp BTST #2,$DFF016 ; Check Right Mousebutton BEQ.S WaitForButtonUp MOVE #$91,D0 WaitForVBlank MOVE.L $DFF004,D1 LSR.L #8,D1 AND #$1FF,D1 CMP D1,D0 BNE.S WaitForVBlank RTS ;---- Set Pointercolors ---- SetDeletePtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$077,2(A6) MOVE #$044,6(A6) MOVE #$0DD,10(A6) MOVE.L (SP)+,A6 RTS SetNormalPtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$777,2(A6) MOVE #$444,6(A6) MOVE #$DDD,10(A6) MOVE.L (SP)+,A6 RTS SetDiskPtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$070,2(A6) MOVE #$040,6(A6) MOVE #$0D0,10(A6) MOVE.L (SP)+,A6 RTS SetPlayPtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$770,2(A6) MOVE #$440,6(A6) MOVE #$DD0,10(A6) MOVE.L (SP)+,A6 RTS SetEditPtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$05A,2(A6) MOVE #$006,6(A6) MOVE #$08f,10(A6) MOVE.L (SP)+,A6 RTS SetWaitPtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$727,2(A6) MOVE #$404,6(A6) MOVE #$F7F,10(A6) MOVE.L (SP)+,A6 RTS SetErrorPtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE #$C02,2(A6) MOVE #$400,6(A6) MOVE #$F03,10(A6) MOVE.L (SP)+,A6 MOVE #1,UpdateFreeMem BSR WaitALittle JSR ShowAllRight BSR SetNormalPtrCol MOVEQ #0,D0 RTS WaitALittle MOVE WaitTime(PC),D1 errorwaitloop BSR Wait_4000 DBF D1,errorwaitloop MOVE #23,WaitTime RTS WaitTime dc.w 23 StorePtrCol MOVE.L A6,-(SP) MOVE.L CopListColorPtr,A6 MOVE 2(A6),PointerCol1Save MOVE 6(A6),PointerCol2Save MOVE 10(A6),PointerCol3Save MOVE.L (SP)+,A6 RTS ErrorRestoreCol BSR SetErrorPtrCol RestorePtrCol MOVE.L A6,-(SP) MOVE #1,UpdateFreeMem MOVE.L CopListColorPtr,A6 MOVE PointerCol1Save,2(A6) MOVE PointerCol2Save,6(A6) MOVE PointerCol3Save,10(A6) MOVE.L (SP)+,A6 RTS ;---- Check special keys ---- CheckPlayKeys MOVE.B RawKeyCode,D0 CMP.B #101,D0 BEQ PlaySong CMP.B #103,D0 BEQ PlayPattern CMP.B #64,D0 BNE.S cpkskip TST.L RunMode BNE StopIt TST.L EditMode BNE StopIt BRA Edit cpkskip CMP.B #97,D0 BEQ RecordPattern CMP.B #69,D0 BEQ EscPressed CMP.B #66,D0 BEQ TabulateCursor CMP.B #127,D0 BEQ GotoCLI CMP.B #48,D0 BEQ TurnOffVoices CMP.B #60,D0 BEQ KillSample CMP.B #13,D0 BEQ togglepnote CMP.B #67,D0 BEQ.S HigherInstr CMP.B #67+128,D0 BEQ.S LowerInstr MOVE HiLowInstr,D1 LEA kpinstable(PC),A0 MOVEQ #0,D2 kpinsloop CMP.B (A0,D2.W),D0 BEQ.S kpinsfound ADDQ #1,D2 CMP #16,D2 BLO.S kpinsloop RTS kpinsfound ADD D2,D1 BEQ.S insnull BRA.S redrsa2 LowerInstr CLR HiLowInstr RTS HigherInstr MOVE #16,HiLowInstr MOVE #16,D1 BRA.S redrsa2 redrsa3 MOVE D1,InsNum redrsam CLR.B RawKeyCode CLR.L SavSamInf JSR ShowSampleInfo JMP RedrawSample insnull TST InsNum BEQ.S insnul2 MOVE InsNum,LastInsNum CLR InsNum MOVEQ #0,D1 BRA.S redrsa2 insnul2 JMP ShowSampleInfo kpinstable dc.b 15,90,91,92 dc.b 93,61,62,63,74 dc.b 45,46,47,94,29,30 dc.b 31 redrsa2 TST.B pnoteflag BEQ.S redrsa3 CLR.B RawKeyCode TST AltKeyStatus BNE.S setpnote MOVE D1,InsNum JSR ShowSampleInfo MOVE InsNum,D0 ADD D0,D0 MOVE pnotetable(PC,D0.W),D0 MOVEQ #-1,D2 BSR playtheinstr JMP RedrawSample pnotetable dc.w 24,24,24,24,24,24,24,24,24,24 dc.w 24,24,24,24,24,24,24,24,24,24 dc.w 24,24,24,24,24,24,24,24,24,24 dc.w 24,24 setpnote ADD D1,D1 LEA pnotetable(PC,D1.W),A0 MOVE.L A0,SplitAddress MOVE #4,SamNoteType LEA selnotetext(PC),A0 JMP ShowStatusText selnotetext dc.b "select note",0 togglepnote CLR.B RawKeyCode MOVEQ #0,D0 MOVE.B pnoteflag,D0 ADDQ.B #1,D0 CMP.B #3,D0 BLO.S tpnskp MOVEQ #0,D0 tpnskp MOVE.B D0,pnoteflag LEA pnotechar(PC,D0.W),A0 MOVEQ #1,D0 MOVE #5159,D1 JMP ShowText3 pnotechar dc.b 32,128,129 pnoteflag dc.b 0 ;---- Check transpose keys ---- CheckTransKeys TST LeftAmigaStatus BEQ Return1 MOVE PattCurPos,D0 BSR GetPositionPtr MOVE.B RawKeyCode,D1 CLR.B RawKeyCode MOVE.B SampleAllFlag,-(SP) BSR.S ctksub MOVE.B (SP)+,SampleAllFlag RTS ctksub MOVEQ #0,D0 CLR.B SampleAllFlag CMP.B #1,D1 BEQ NoteUp CMP.B #16,D1 BEQ NoteDown CMP.B #32,D1 BEQ OctaveUp CMP.B #49,D1 BEQ OctaveDown MOVE #300,D0 CMP.B #2,D1 BEQ NoteUp CMP.B #17,D1 BEQ NoteDown CMP.B #33,D1 BEQ OctaveUp CMP.B #50,D1 BEQ OctaveDown MOVEQ #0,D0 MOVE.B #1,SampleAllFlag CMP.B #3,D1 BEQ NoteUp CMP.B #18,D1 BEQ NoteDown CMP.B #34,D1 BEQ OctaveUp CMP.B #51,D1 BEQ OctaveDown MOVE #300,D0 CMP.B #4,D1 BEQ NoteUp CMP.B #19,D1 BEQ NoteDown CMP.B #35,D1 BEQ OctaveUp CMP.B #52,D1 BEQ OctaveDown RTS ;---- Check control keys ---- CheckCtrlKeys TST CtrlKeyStatus BEQ Return1 MOVEQ #0,D0 MOVE.B RawKeyCode,D0 CMP.B #35,D0 ; F BEQ ToggleFilter CMP.B #33,D0 ; S BEQ ToggleSplit CMP.B #55,D0 ; M BEQ ToggleMultiMode CMP.B #16,D0 ; Q BEQ UnmuteAll CMP.B #32,D0 ; A BEQ ToggleMute CMP.B #49,D0 ; Z BEQ RestoreEffects CMP.B #19,D0 ; R BEQ RestoreFKeyPos CMP.B #20,D0 ; T BEQ SwapTrack CMP.B #53,D0 ; B BEQ BeginBlock CMP.B #51,D0 ; C BEQ CopyBlock CMP.B #50,D0 ; X BEQ CutBlock CMP.B #34,D0 ; D BEQ DeleteBlock CMP.B #25,D0 ; P BEQ PasteBlock CMP.B #23,D0 ; I BEQ InsertBlock CMP.B #38,D0 ; J BEQ JoinPasteBlock CMP.B #54,D0 ; N BEQ Re_MarkBlock CMP.B #21,D0 ; Y BEQ BackwardsBlock CMP.B #17,D0 ; W BEQ PolyphonizeBlock CMP.B #18,D0 ; E BEQ ExpandTrack CMP.B #24,D0 ; O BEQ ContractTrack CMP.B #37,D0 ; H BEQ TransBlockUp CMP.B #40,D0 ; L BEQ TransBlockDown CMP.B #39,D0 ; K BEQ KillToEndOfTrack CMP.B #22,D0 ; U BEQ UndoLastChange CMP.B #68,D0 ; CR BEQ InsCmdTrack CMP.B #65,D0 ; Del BEQ DelCmdTrack CMP.B #36,D0 ; G BEQ BoostAll CMP.B #52,D0 ; V BEQ FilterAll CMP.B #1,D0 BLO Return1 CMP.B #10,D0 BHI Return1 BNE.S cckskip MOVEQ #0,D0 cckskip MOVE D0,EditMoveAdd CLR.B RawKeyCode ADD.B #'0',D0 LEA ematext(PC),A0 MOVE.B D0,11(A0) JSR ShowStatusText MOVE #10,WaitTime BSR WaitALittle JMP ShowAllRight ematext dc.b "editskip = 0",0,0 ;---- Check alt keys ---- CheckAltKeys TST AltKeyStatus BEQ Return1 MOVEQ #0,D0 MOVE.B RawKeyCode,D0 CMP.B #49,D0 ; Z BEQ ToggleCh1 CMP.B #50,D0 ; X BEQ ToggleCh2 CMP.B #51,D0 ; C BEQ ToggleCh3 CMP.B #52,D0 ; V BEQ ToggleCh4 CMP.B #53,D0 ; B BEQ Boost CMP.B #35,D0 ; F BEQ Filter CMP.B #20,D0 ; T BEQ.S xTuningTone CMP.B #33,D0 ; S BEQ.S xSamplerScreen CMP.B #19,D0 ; R BEQ.S xResample CMP.B #18,D0 ; E BEQ DoEditOp CMP.B #23,D0 ; I BEQ.S AutoInsert CMP.B #34,D0 ; D BEQ DiskOp CMP.B #39,D0 ; K BEQ KillInstrTrack ; CMP.B #17,D0 ; W ; BEQ.S WaitForNote CMP.B #32,D0 ; A BEQ.S xSampler CMP.B #16,D0 ; Q BEQ ChkQuit CMP.B #21,D0 ; Y BEQ SaveAllSamples ; CMP.B #24,D0 ; O ; CMP.B #55,D0 ; M ; CMP.B #25,D0 ; P ; CMP.B #38,D0 ; J ; CMP.B #54,D0 ; N ; CMP.B #37,D0 ; H ; CMP.B #40,D0 ; L ; CMP.B #22,D0 ; U ; CMP.B #36,D0 ; G RTS xTuningTone JMP TuningTone xSamplerScreen JMP SamplerScreen xResample JMP Resample xSampler JMP Sampler AutoInsert CLR.B RawKeyCode EOR.B #1,AutoInsFlag ShowAutoInsert CMP #4,CurrScreen BEQ Return1 MOVE.B #' ',D0 TST.B AutoInsFlag BEQ.S auins2 MOVE.B #'I',D0 auins2 MOVE.B D0,AutoInsText MOVE #4561,D1 MOVEQ #1,D0 LEA AutoInsText(PC),A0 JMP ShowText3 AutoInsText dc.b 0 AutoInsFlag dc.b 0 SaveAllSamples LEA SaveAllSamplesText,A0 BSR AreYouSure BNE SetErrorPtrCol MOVE InsNum,SaveInstr MOVE #1,InsNum .loop JSR ShowSampleInfo BSR dosavesample ADDQ #1,InsNum CMP #32,InsNum BLO.S .loop MOVE SaveInstr,InsNum JMP ShowSampleInfo SaveAllSamplesText dc.b "save all samples?",0 even ;---- Jump between channels ---- TabulateCursor CLR.B RawKeyCode TST ShiftKeyStatus BNE.S TabCurRight MOVE PattCurPos,D0 DIVU #6,D0 ADDQ #1,D0 CMP #4,D0 ;channels BNE.S tacskip MOVEQ #0,D0 tacskip MULU #6,D0 MOVE D0,PattCurPos BRA UpdateCursorPos TabCurRight MOVE PattCurPos,D0 ADDQ #5,D0 DIVU #6,D0 SUBQ #1,D0 BPL.S tacskip MOVEQ #3,D0 BRA.S tacskip ;---- Escape was pressed ---- EscPressed CLR.B RawKeyCode CLR.B SaveKey MOVE CurrScreen,D0 CMP #2,D0 BLO.S BotExit TopExit MOVE CurrScreen,D0 CMP #2,D0 BEQ ExitHelpScreen CMP #3,D0 BEQ ExitFromDir CMP #4,D0 BEQ.S pedexit CMP #5,D0 BEQ ExitSetup CMP #6,D0 BEQ.S plstexit CMP #7,D0 BEQ ExitSetup RTS BotExit TST SamScrEnable BNE.S samplerexit TST BlockMarkFlag BNE blkunma CMP #1,CurrScreen BNE Return1 TST.B EdEnable BNE ExitEditOp RTS samplerexit JMP ExitFromSam pedexit JMP PED_Exit plstexit JMP ExitPLST GotoCLI CLR.B RawKeyCode CLR.B SaveKey TST.L RunMode BNE.S cliskp1 BSR StopIt BSR ResetMusicInt cliskp1 BSR ResetVBInt BSR ResetInputHandler BSR ResetAutoReq BSR ResetEasyReq BSR ResetCopList MOVE.L ExtCmdAddress,D1 BEQ.S gcliskp CLR.L ExtCmdAddress MOVE.L ExtCmdWindow,D2 MOVEQ #0,D3 MOVE.L DOSBase,A6 JSR LVOExecute(A6) gcliskp SUB.L A0,A0 LEA BackToProText(PC),A1 LEA OKGadgetText(PC),A2 MOVE.L A2,A3 MOVEQ #0,D0 MOVEQ #0,D1 MOVE #196,D2 MOVEQ #50,D3 MOVE.L IntuitionBase,A6 JSR LVOAutoRequest(A6) ADDQ.B #1,LastRawkey TST.L RunMode BNE.S cliskp2 BSR SetMusicInt cliskp2 BSR SetVBInt BSR SetInputHandler BSR SetAutoReq BSR SetEasyReq BRA SetCopList BackToProText dc.b 0,1,1,0 dc.w 14,6 dc.l 0,btptext,0 btptext dc.b 'Back to Protracker',0,0 OKGadgetText dc.b 0,1,1,0 dc.w 6,3 dc.l 0,okgtext,0 okgtext dc.b 'OK',0,0 ;---- Check Help Key ---- HelpSelectText dc.b '* help selected *',0 PLSTSelectText dc.b '* plst selected *',0 PLSTHelpFlag dc.b 0,0 ; free 0 CheckHelpKey CMP.B #95,RawKeyCode ; Help Key pressed ? BNE Return1 CLR.B RawKeyCode TST ShiftKeyStatus BEQ.S realhlp LEA HelpSelectText,A0 EOR.B #1,PLSTHelpFlag BEQ.S chksel LEA PLSTSelectText,A0 chksel JSR ShowStatusText BSR WaitALittle JMP ShowAllRight gtoPLST JMP PLST realhlp TST.B PLSTHelpFlag BNE.S gtoPLST CMP #2,CurrScreen BEQ ExitHelpScreen BSR TopExit MOVE CurrScreen,SaveCurrScreen SF ScopeEnable ST DisableAnalyzer ST NoSampleInfo BSR ClearAnalyzerColors BSR SwapHelpScreen BEQ exithlp BSR Clear100Lines TST.L HelpTextIndex+4 BNE.S chkskip BSR GetHelpIndex chkskip MOVE.L #HelpFileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,FileHandle BNE ShowHelpPage LEA PTPath,A0 BSR CopyPath LEA HelpFileName(PC),A0 MOVEQ #7,D0 hefilop MOVE.B (A0)+,(A1)+ DBF D0,hefilop MOVE.L #FileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ HelpFileError BRA.S ShowHelpPage ExitHelpScreen MOVE.L FileHandle,D1 BEQ.S ehsskip MOVE.L DOSBase,A6 JSR LVOClose(A6) ehsskip BSR Clear100Lines BSR.S SwapHelpScreen exithlp MOVE SaveCurrScreen,CurrScreen BRA DisplayMainAll SwapHelpScreen MOVE.L DecompMemPtr,D0 ;get decompress address BEQ.S shelps2 MOVE.L D0,A1 ;if true then de-allocate it BSR ssets3 BRA FreeDecompMem shelps2 LEA HelpScreenData,A0 MOVE.L #HelpScreenSize,D0 BSR Decompact BEQ Return1 BRA ssets3 ShowHelpPage MOVE #2,CurrScreen MOVE HelpPage,D0 AND #$00FF,D0 LSL #2,D0 LEA HelpTextIndex,A0 MOVE.L FileHandle,D1 BEQ Return1 MOVE.L (A0,D0.W),D2 ADD.L #1024,D2 MOVEQ #-1,D3 MOVE.L DOSBase,A6 JSR LVOSeek(A6) MOVE.L FileHandle,D1 MOVE.L #HelpTextData,D2 MOVE.L #656,D3 JSR LVORead(A6) BSR Clear100Lines LEA HelpTextData+16,A6 MOVEQ #120,D6 MOVEQ #15,D7 shploop MOVEQ #0,D0 MOVE.L A6,A1 shplop2 CMP.B #10,(A1)+ BEQ.S ShowHelpLine TST.B -1(A1) BEQ.S ShowHelpLine ADDQ #1,D0 BRA.S shplop2 ShowHelpLine MOVE.L A6,ShowTextPtr MOVE.L A1,A6 MOVE D6,TextOffset MOVE D0,TextLength BEQ.S shlskip JSR ShowText shlskip ADD #240,D6 DBF D7,shploop BSR Wait_4000 BRA Wait_4000 HelpPage dc.w 1 HelpUp LEA HelpTextData+7,A0 BRA.S HelpMove HelpDown LEA HelpTextData+10,A0 BRA.S HelpMove HelpLeft LEA HelpTextData+4,A0 BRA.S HelpMove HelpRight LEA HelpTextData+13,A0 HelpMove CLR.B RawKeyCode MOVEQ #0,D0 JSR HexToInteger2 TST D0 BEQ Return1 AND #$00FF,D0 MOVE D0,HelpPage BRA ShowHelpPage GetHelpIndex MOVE.L LaHeTx,D0 CMP.L HelpTextIndex,D0 BEQ Return1 MOVE.L #HelpFileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,FileHandle BNE.S gehein LEA PTPath,A0 BSR CopyPath LEA HelpFileName(PC),A0 MOVEQ #7,D0 hefilp2 MOVE.B (A0)+,(A1)+ DBF D0,hefilp2 MOVE.L #FileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ.S HelpFileError gehein MOVE.L D0,D1 MOVE.L #HelpTextIndex,D2 MOVE.L #256*4,D3 JSR LVORead(A6) MOVE.L FileHandle,D1 JSR LVOClose(A6) MOVE.L HelpTextIndex,LaHeTx RTS HelpFileError MOVE #2,CurrScreen LEA NoHelpText(PC),A0 MOVE #1887,D1 MOVEQ #24,D0 JMP ShowText3 NoHelpText dc.b 'Unable to open helpfile!' HelpFileName dc.b 'PT.help',0 ;---- Check Function Keys F6-F10 ---- CheckF6_F10 CMP.B #85,RawKeyCode BNE.S CheckF7 CLR.B RawKeyCode TST ShiftKeyStatus BEQ.S cf6skip MOVE ScrPattPos,F6pos ShowPosSetText LEA PosSetText,A0 BSR ShowStatusText MOVEQ #8,D2 spsloop BSR Wait_4000 DBF D2,spsloop BRA ShowAllRight cf6skip MOVE F6pos,D0 chkalt TST AltKeyStatus BNE PattFrom TST CtrlKeyStatus BNE RecordFrom TST LeftAmigaStatus BNE SongFrom TST RunMode BNE Return1 MOVE D0,ScrPattPos BRA SetScrPatternPos CheckF7 CMP.B #86,RawKeyCode BNE.S CheckF8 CLR.B RawKeyCode TST ShiftKeyStatus BEQ.S cf7skip MOVE ScrPattPos,F7pos BRA.S ShowPosSetText cf7skip MOVE F7pos,D0 BRA.S chkalt CheckF8 CMP.B #87,RawKeyCode BNE.S CheckF9 CLR.B RawKeyCode TST ShiftKeyStatus BEQ.S cf8skip MOVE ScrPattPos,F8pos BRA ShowPosSetText cf8skip MOVE F8pos,D0 BRA chkalt CheckF9 CMP.B #88,RawKeyCode BNE.S CheckF10 CLR.B RawKeyCode TST ShiftKeyStatus BEQ.S cf9skip MOVE ScrPattPos,F9pos BRA ShowPosSetText cf9skip MOVE F9pos,D0 BRA chkalt CheckF10 CMP.B #89,RawKeyCode BNE Return1 CLR.B RawKeyCode TST ShiftKeyStatus BEQ.S cf10skip MOVE ScrPattPos,F10pos BRA ShowPosSetText cf10skip MOVE F10pos,D0 BRA chkalt F6pos dc.w 0 F7pos dc.w 16 F8pos dc.w 32 F9pos dc.w 48 F10pos dc.w 63 ;---- Check Function Keys F3-F5 ---- CheckF3_F5 MOVEQ #0,D0 MOVE.L D0,A0 TST ShiftKeyStatus BNE CCP4 TST CtrlKeyStatus BNE CCP4 TST AltKeyStatus BNE CutCopPas CMP.B #68,RawKeyCode BEQ.S StepPlayForward CMP.B #65,RawKeyCode BEQ.S StepPlayBackward TST SamScrEnable BEQ Return1 CMP.B #82,RawKeyCode BEQ.S xSamCut CMP.B #83,RawKeyCode BEQ.S xSamCop CMP.B #84,RawKeyCode BEQ.S xSamPas RTS xSamCut JMP SamCut xSamCop JMP SamCopy xSamPas JMP SamPaste StepPlayForward MOVE #1,StepPlayEnable BSR DoStopIt MOVE ScrPattPos,D0 BRA pafr1 StepPlayBackward MOVE #1,StepPlayEnable BSR DoStopIt MOVE ScrPattPos,D0 SUBQ #1,D0 AND #63,D0 BRA pafr1 StepPlayEnable dc.w 0 CCP4 MOVEQ #0,D0 MOVE PattCurPos,D0 DIVU #6,D0 AND.L #3,D0 LSL.L #2,D0 MOVE.L D0,A0 CutCopPas ADD.L SongDataPtr,A0 LEA sd_patterndata(A0),A0 MOVE.L PatternNumber,D0 LSL.L #8,D0 LSL.L #2,D0 ADD.L D0,A0 TST AltKeyStatus BNE.S CutCopPasPatt TST CtrlKeyStatus BNE.S CutCopPasCmds CutCopPasTrack CMP.B #82,RawKeyCode BEQ CutTrack CMP.B #83,RawKeyCode BEQ CopyTrack CMP.B #84,RawKeyCode BEQ PasteTrack CMP.B #68,RawKeyCode BEQ InsNoteTrack CMP.B #65,RawKeyCode BEQ DelNoteTrack RTS CutCopPasPatt CMP.B #82,RawKeyCode BEQ.S CutPattern CMP.B #83,RawKeyCode BEQ.S CopyPattern CMP.B #84,RawKeyCode BEQ PastePattern CMP.B #68,RawKeyCode BEQ InsNotePattern CMP.B #65,RawKeyCode BEQ DelNotePattern RTS CutCopPasCmds CMP.B #82,RawKeyCode BEQ CutCmds CMP.B #83,RawKeyCode BEQ CopyCmds CMP.B #84,RawKeyCode BEQ PasteCmds RTS CutPattern BSR SaveUndo LEA PatternBuffer,A1 MOVE #255,D0 MOVEQ #0,D1 cupaloop MOVE.L (A0),(A1)+ MOVE.L D1,(A0)+ DBF D0,cupaloop CLR.B RawKeyCode BRA RedrawPattern CopyPattern LEA PatternBuffer,A1 MOVE #255,D0 copaloop MOVE.L (A0)+,(A1)+ DBF D0,copaloop CLR.B RawKeyCode RTS PastePattern BSR SaveUndo LEA PatternBuffer,A1 MOVE #255,D0 papaloop MOVE.L (A1)+,(A0)+ DBF D0,papaloop CLR.B RawKeyCode BRA RedrawPattern CutTrack BSR SaveUndo LEA TrackBuffer,A1 MOVEQ #63,D0 MOVEQ #0,D1 cutrloop MOVE.L (A0),(A1)+ MOVE.L D1,(A0) LEA 16(A0),A0 DBF D0,cutrloop CLR.B RawKeyCode BRA RedrawPattern CopyTrack LEA TrackBuffer,A1 MOVEQ #63,D0 cotrloop MOVE.L (A0),(A1)+ LEA 16(A0),A0 DBF D0,cotrloop CLR.B RawKeyCode RTS PasteTrack BSR SaveUndo LEA TrackBuffer,A1 MOVEQ #63,D0 patrloop MOVE.L (A1)+,(A0) LEA 16(A0),A0 DBF D0,patrloop CLR.B RawKeyCode BRA RedrawPattern InsNotePattern BSR SaveUndo MOVEQ #0,D0 BSR GetPositionPtr BSR.S inotr MOVEQ #6,D0 BSR GetPositionPtr BSR.S inotr MOVEQ #12,D0 BSR GetPositionPtr BSR.S inotr MOVEQ #18,D0 BSR GetPositionPtr BSR.S inotr BRA.S intskip InsNoteTrack BSR SaveUndo BSR.S inotr intskip CLR.B RawKeyCode ADD D2,ScrPattPos AND #$3F,ScrPattPos BSR SetScrPatternPos BRA RedrawPattern inotr MOVE ScrPattPos,D1 LSL #4,D1 CMP #63*16,D1 BEQ.S inoskip MOVE #992,D0 intloop MOVE.L (A0,D0.W),16(A0,D0.W) SUB #16,D0 CMP D1,D0 BGE.S intloop inoskip MOVEQ #1,D2 CLR.L (A0,D1.W) RTS InsCmdTrack BSR SaveUndo MOVE PattCurPos,D0 BSR GetPositionPtr BSR.S icmtr BRA.S intskip icmtr MOVE ScrPattPos,D1 LSL #4,D1 CMP #63*16,D1 BEQ.S icmskip MOVE #992,D0 icmloop MOVE 2(A0,D0.W),D2 AND #$0FFF,D2 AND #$F000,18(A0,D0.W) OR D2,18(A0,D0.W) SUB #16,D0 CMP D1,D0 BGE.S icmloop icmskip MOVEQ #1,D2 AND #$F000,2(A0,D1.W) RTS DelNotePattern BSR SaveUndo MOVEQ #0,D0 BSR GetPositionPtr BSR.S dnt MOVEQ #6,D0 BSR GetPositionPtr BSR.S dnt MOVEQ #12,D0 BSR GetPositionPtr BSR.S dnt MOVEQ #18,D0 BSR GetPositionPtr BSR.S dnt BRA intskip DelNoteTrack BSR SaveUndo BSR.S dnt BRA intskip dnt MOVE ScrPattPos,D0 BEQ Return1 SUBQ #1,D0 LSL #4,D0 dntloop MOVE.L 16(A0,D0.W),(A0,D0.W) ADD #16,D0 CMP #1024,D0 BLO.S dntloop MOVE #1008,D1 MOVEQ #-1,D2 CLR.L (A0,D1.W) RTS DelCmdTrack BSR SaveUndo MOVE PattCurPos,D0 BSR GetPositionPtr BSR.S dct BRA intskip dct MOVE ScrPattPos,D0 BEQ Return1 SUBQ #1,D0 LSL #4,D0 dctloop MOVE 18(A0,D0.W),D2 AND #$0FFF,D2 AND #$F000,2(A0,D0.W) OR D2,2(A0,D0.W) ADD #16,D0 CMP #1024,D0 BLO.S dctloop MOVE #1008,D1 MOVEQ #-1,D2 AND #$F000,2(A0,D1.W) RTS CutCmds BSR SaveUndo LEA CmdsBuffer,A1 CLR D0 cucmloop MOVE.L 0(A0,D0.W),(A1)+ AND.L #$FFFFF000,(A0,D0.W) ADD #16,D0 CMP #1024,D0 BNE.S cucmloop CLR.B RawKeyCode BRA RedrawPattern CopyCmds LEA CmdsBuffer,A1 CLR D0 cocmloop MOVE.L 0(A0,D0.W),(A1)+ ADD #16,D0 CMP #1024,D0 BNE.S cocmloop CLR.B RawKeyCode RTS PasteCmds BSR SaveUndo LEA CmdsBuffer,A1 CLR D0 pacmloop MOVE.L 0(A0,D0.W),D1 AND.L #$FFFFF000,D1 MOVE.L (A1)+,D2 AND.L #$00000FFF,D2 OR.L D2,D1 MOVE.L D1,(A0,D0.W) ADD #16,D0 CMP #1024,D0 BNE.S pacmloop CLR.B RawKeyCode BRA RedrawPattern ;---- Swap Tracks ---- SwapTrack BSR StorePtrCol BSR SetWaitPtrCol LEA SwapTrackText,A0 BSR ShowStatusText swtloop BSR GetHexKey TST.B D1 BEQ.S swtabor CMP.B #4,D1 BHI.S swtloop BSR SaveUndo SUBQ.L #1,D1 LSL.L #2,D1 MOVE.L D1,D0 MOVE.L SongDataPtr,A0 LEA sd_patterndata(A0),A0 MOVE.L PatternNumber,D1 LSL.L #8,D1 LSL.L #2,D1 ADD.L D1,A0 MOVE.L A0,A1 ADD.L D0,A0 MOVE PattCurPos,D0 DIVU #6,D0 AND.L #$F,D0 LSL.L #2,D0 ADD.L D0,A1 MOVEQ #63,D1 swtloop2 MOVE.L (A0),D0 MOVE.L (A1),(A0) MOVE.L D0,(A1) LEA 16(A0),A0 LEA 16(A1),A1 DBF D1,swtloop2 BSR RedrawPattern swtabor BSR ShowAllRight BRA RestorePtrCol SwapTrackText dc.b 'Swap (1/2/3/4) ?',0,0 ;---- Block Commands ---- BlockMarkText dc.b 'mark block 00-00',0,0 BlockErrorText dc.b 'no block marked !',0 BufEmptyText dc.b 'buffer is empty !',0 BlockFromPos dc.w 0 BlockToPos dc.w 0 BlockMarkFlag dc.w 0 BlockBufferFlag dc.w 0 JoinPasteFlag dc.w 0 PolyPasteFlag dc.w 0 BuffFromPos dc.w 0 BuffToPos dc.w 0 BeginBlock CLR.B RawKeyCode TST BlockMarkFlag BEQ.S beblskp blkunma CLR BlockMarkFlag BRA ShowAllRight beblskp MOVE #1,BlockMarkFlag MOVE ScrPattPos,BlockFromPos MOVE ScrPattPos,BlockToPos ShowBlockPos MOVE BlockFromPos,D0 MOVE BlockToPos,D1 CMP D0,D1 BHS.S sbpskip EXG D0,D1 sbpskip LEA BlockMarkText+12(PC),A0 BSR IntTo2DecAscii LEA BlockMarkText+15(PC),A0 MOVE D1,D0 BSR IntTo2DecAscii LEA BlockMarkText(PC),A0 BRA ShowStatusText Re_MarkBlock CLR.B RawKeyCode MOVE #1,BlockMarkFlag MOVE BlockToPos,ScrPattPos BSR SetScrPatternPos BRA.S ShowBlockPos CheckBlockPos TST BlockMarkFlag BEQ Return1 MOVE ScrPattPos,D0 CMP BlockToPos,D0 BEQ Return1 MOVE D0,BlockToPos BRA.S ShowBlockPos IntTo2DecAscii AND.L #$FF,D0 DIVU #10,D0 ADD.B #'0',D0 MOVE.B D0,-1(A0) SWAP D0 ADD.B #'0',D0 MOVE.B D0,(A0) RTS CutBlock CLR.B RawKeyCode TST BlockMarkFlag BEQ BlockError BSR.S cobldo MOVE #1,BlockMarkFlag BRA ClearBlock CopyBlock CLR.B RawKeyCode TST BlockMarkFlag BEQ BlockError cobldo CLR BlockMarkFlag MOVE #1,BlockBufferFlag MOVE PattCurPos,D0 BSR GetPositionPtr LEA BlockBuffer,A1 MOVEQ #63,D0 cobllop MOVE.L (A0),(A1) LEA 16(A0),A0 LEA 16(A1),A1 DBF D0,cobllop MOVE BlockFromPos,D0 MOVE BlockToPos,D1 CMP D0,D1 BHS.S coblskp EXG D0,D1 coblskp MOVE D0,BuffFromPos MOVE D1,BuffToPos BRA ShowAllRight PasteBlock CLR.B RawKeyCode TST BlockBufferFlag BEQ BufferError BSR SaveUndo MOVE PattCurPos,D0 BSR GetPositionPtr LEA BlockBuffer,A1 MOVE BuffFromPos,D0 MOVE BuffToPos,D1 MOVE ScrPattPos,D2 LSL #4,D0 LSL #4,D1 LSL #4,D2 pabllop MOVE.L (A1,D0.W),D3 TST JoinPasteFlag BEQ.S pablskp MOVE.L D3,D4 AND.L #$FFFFF000,D4 BNE.S pablskp MOVE.L (A0,D2.W),D4 AND.L #$FFFFF000,D4 AND.L #$00000FFF,D3 OR.L D4,D3 pablskp MOVE.L D3,(A0,D2.W) CMP D0,D1 BEQ.S pablend CMP #63*16,D0 BEQ.S pablend CMP #63*16,D2 BEQ.S pablend ADD #16,D0 ADD #16,D2 TST PolyPasteFlag BEQ.S pabllop MOVEM.L A1/D0-D2,-(SP) BSR GotoNextMulti MOVE PattCurPos,D0 BSR GetPositionPtr MOVEM.L (SP)+,A1/D0-D2 BRA.S pabllop pablend CLR JoinPasteFlag CLR PolyPasteFlag BSR ShowAllRight BSR RedrawPattern TST ShiftKeyStatus BNE Return1 MOVE BuffToPos,D0 SUB BuffFromPos,D0 ADDQ #1,D0 ADD ScrPattPos,D0 CMP #63,D0 BLS.S pablset MOVEQ #0,D0 pablset MOVE D0,ScrPattPos BRA SetScrPatternPos PolyphonizeBlock MOVE #1,PolyPasteFlag JoinPasteBlock MOVE #1,JoinPasteFlag BRA PasteBlock InsertBlock CLR.B RawKeyCode TST BlockBufferFlag BEQ BufferError CMP #63,ScrPattPos BEQ PasteBlock MOVE BuffToPos,D0 SUB BuffFromPos,D0 inbllop MOVE.L D0,-(SP) MOVE PattCurPos,D0 BSR GetPositionPtr BSR inotr MOVE.L (SP)+,D0 DBF D0,inbllop BRA PasteBlock DeleteBlock CLR.B RawKeyCode TST BlockMarkFlag BEQ BlockError BSR SaveUndo MOVE BlockFromPos,D0 MOVE BlockToPos,D1 CMP D0,D1 BHS.S deblskp EXG D0,D1 deblskp CMP #63,D1 BEQ.S ClearBlock CLR BlockMarkFlag MOVE D0,ScrPattPos ADDQ #1,ScrPattPos SUB D0,D1 MOVE D1,D0 debllop MOVE.L D0,-(SP) MOVE PattCurPos,D0 BSR GetPositionPtr BSR dnt MOVE.L (SP)+,D0 DBF D0,debllop SUBQ #1,ScrPattPos BSR ShowAllRight BRA RedrawPattern ClearBlock TST BlockMarkFlag BEQ BlockError BSR SaveUndo CLR BlockMarkFlag MOVE PattCurPos,D0 BSR GetPositionPtr MOVE BlockFromPos,D0 MOVE BlockToPos,D1 CMP D0,D1 BHS.S clblskp EXG D0,D1 clblskp LSL #4,D0 LSL #4,D1 MOVEQ #0,D2 clbllop MOVE.L D2,(A0,D0.W) CMP D0,D1 BEQ.S clblend ADD #16,D0 BRA.S clbllop clblend BSR ShowAllRight BRA RedrawPattern BackwardsBlock CLR.B RawKeyCode TST BlockMarkFlag BEQ BlockError BSR SaveUndo CLR BlockMarkFlag MOVE PattCurPos,D0 BSR GetPositionPtr MOVE BlockFromPos,D0 MOVE BlockToPos,D1 CMP D0,D1 BHS.S bablskp EXG D0,D1 bablskp LSL #4,D0 LSL #4,D1 babllop MOVE.L (A0,D0.W),D2 MOVE.L (A0,D1.W),(A0,D0.W) MOVE.L D2,(A0,D1.W) CMP D1,D0 BHS.S bablend ADD #16,D0 SUB #16,D1 CMP D1,D0 BHS.S bablend BRA.S babllop bablend BSR ShowAllRight BRA RedrawPattern TransBlockUp SF trblflag BRA.S trbldo TransBlockDown ST trblflag trbldo CLR.B RawKeyCode TST BlockMarkFlag BEQ.S BlockError BSR SaveUndo MOVE #2,NoteShift MOVE BlockFromPos,D0 MOVE BlockToPos,D1 CMP D0,D1 BHS.S trblskp EXG D0,D1 trblskp MOVE D0,D5 LSL #4,D5 SUB D0,D1 MOVE D1,D6 MOVE PattCurPos,D0 BSR GetPositionPtr LEA (A0,D5.W),A3 MOVEQ #0,D3 MOVE.B SampleAllFlag,sampallsave ST SampleAllFlag TST.B trblflag BEQ.S trblup BSR sandlo2 MOVE.B sampallsave,SampleAllFlag BRA RedrawPattern trblup BSR sanulo2 MOVE.B sampallsave,SampleAllFlag BRA RedrawPattern trblflag dc.b 0 sampallsave dc.b 0 BlockError LEA BlockErrorText,A0 BSR ShowStatusText BRA SetErrorPtrCol BufferError LEA BufEmptyText,A0 BSR ShowStatusText BRA SetErrorPtrCol ExpandTrack CLR.B RawKeyCode BSR SaveUndo MOVE ScrPattPos,PosSave ADDQ #1,ScrPattPos CMP #64,ScrPattPos BHS.S extrend extrlop MOVE PattCurPos,D0 BSR GetPositionPtr BSR inotr ADDQ #2,ScrPattPos CMP #64,ScrPattPos BLO.S extrlop extrend MOVE PosSave,ScrPattPos BRA RedrawPattern ContractTrack CLR.B RawKeyCode BSR SaveUndo MOVE ScrPattPos,PosSave ADDQ #1,ScrPattPos CMP #64,ScrPattPos BHS.S cotrend cotrlop MOVE PattCurPos,D0 BSR GetPositionPtr BSR dnt ADDQ #1,ScrPattPos CMP #64,ScrPattPos BLO.S cotrlop cotrend MOVE PosSave,ScrPattPos BRA RedrawPattern PosSave dc.w 0 KillToEndOfTrack CLR.B RawKeyCode BSR SaveUndo MOVE PattCurPos,D0 BSR GetPositionPtr MOVE ScrPattPos,D0 MOVE D0,D1 MULU #16,D1 LEA (A0,D1.W),A0 TST ShiftKeyStatus BNE.S KillToStart kteot CLR.L (A0) LEA 16(A0),A0 ADDQ #1,D0 CMP #64,D0 BLO.S kteot BRA RedrawPattern KillToStart CLR.L (A0) LEA -16(A0),A0 TST D0 BEQ RedrawPattern SUBQ #1,D0 BRA.S KillToStart UndoLastChange CLR.B RawKeyCode MOVEQ #0,D0 BSR GetPositionPtr LEA UndoBuffer,A1 MOVE #255,D0 unlalop MOVE.L (A1),D1 MOVE.L (A0),(A1)+ MOVE.L D1,(A0)+ DBF D0,unlalop BRA RedrawPattern SaveUndo MOVEM.L D0/A0-A1,-(SP) MOVEQ #0,D0 BSR GetPositionPtr LEA UndoBuffer,A1 MOVE #255,D0 saunlop MOVE.L (A0)+,(A1)+ DBF D0,saunlop MOVEM.L (SP)+,D0/A0-A1 RTS BoostAll LEA BoostAllText,A0 BSR AreYouSure BNE SetErrorPtrCol MOVE InsNum,SaveInstr MOVE #1,InsNum boallop BSR ShowSampleInfo BSR Boost2 ADDQ #1,InsNum CMP #32,InsNum BLO.S boallop MOVE SaveInstr,InsNum BRA ShowSampleInfo FilterAll LEA FilterAllText,A0 BSR AreYouSure BNE SetErrorPtrCol MOVE InsNum,SaveInstr MOVE #1,InsNum fiallop BSR ShowSampleInfo BSR Filter2 ADDQ #1,InsNum CMP #32,InsNum BLO.S fiallop MOVE SaveInstr,InsNum BRA ShowSampleInfo BoostAllText dc.b 'boost all samples',0 FilterAllText dc.b 'filter all sampls',0 SaveInstr dc.w 0 ;---- Check Function Keys F1-F2 ---- CheckF1_F2 CMP.B #80,RawKeyCode BEQ.S SetOctaveLow CMP.B #81,RawKeyCode BEQ.S SetOctaveHigh RTS SetOctaveLow MOVE.L #KbdTransTable1,KeyTransTabPtr CLR.B RawKeyCode RTS SetOctaveHigh MOVE.L #KbdTransTable2,KeyTransTabPtr CLR.B RawKeyCode RTS ;---- Get Hex Key ---- GetHexByte BSR StorePtrCol BSR SetWaitPtrCol CLR.B RawKeyCode MOVEQ #0,D0 MOVE TextOffset,D0 DIVU #40,D0 ADDQ #6,D0 MOVE D0,LineCurY SWAP D0 LSL #3,D0 ADDQ #4,D0 MOVE D0,LineCurX BSR UpdateLineCurPos BSR.S GetHexKey MOVE.L D1,D0 MOVE.B D1,D6 LSL.B #4,D6 BSR PrintHexDigit ADD #8,LineCurX BSR UpdateLineCurPos BSR.S GetHexKey MOVE.L D1,D0 OR.B D1,D6 BSR PrintHexDigit CLR LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos BSR RestorePtrCol MOVEQ #0,D0 MOVE.B D6,D0 RTS GetHexKey CLR.B MixChar MOVEQ #0,D0 MOVEQ #0,D1 BTST #2,$DFF016 BEQ.S ghkreturn BSR DoKeyBuffer MOVE.B RawKeyCode,D0 MOVE.B D0,MixChar BEQ.S GetHexKey CMP.B #68,D0 ; CR BEQ.S ghkreturn CMP.B #69,D0 ; Esc BEQ.S ghkreturn CMP.B #79,D0 ; <-- BEQ.S ghkleft CMP.B #78,D0 ; --> BEQ.S ghkright BSR.S CheckHexKey CMP.B #16,D1 BEQ.S GetHexKey CLR.B RawKeyCode ghkreturn MOVEQ #0,D0 RTS ghkleft MOVEQ #-1,D0 RTS ghkright MOVEQ #1,D0 RTS CheckHexKey LEA RawKeyHexTable,A0 MOVEQ #0,D1 chxloop CMP.B (A0)+,D0 BEQ Return1 ADDQ.B #1,D1 CMP.B #16,D1 BNE.S chxloop RTS ;---- Enter Edit Commands (effects) ---- EditCommand TST.L EditMode BEQ Return1 MOVEQ #0,D0 MOVE.B RawKeyCode,D0 BSR.S CheckHexKey CMP.B #16,D1 BNE.S DoEditCommand RTS DoEditCommand CMP #1,PattCurPos BNE.S ChkPos2 CMP #1,D1 BHI Return1 MOVE.L #$FFF,D2 CLR CmdOffset LSL #4,D1 LSL #8,D1 BRA UpdateCommand ChkPos2 CMP #2,PattCurPos BNE.S ChkPos3 MOVE.L #$FFF,D2 MOVE #2,CmdOffset LSL #4,D1 LSL #8,D1 BRA UpdateCommand ChkPos3 CMP #3,PattCurPos BNE.S ChkPos4 MOVE.L #$F0FF,D2 MOVE #2,CmdOffset LSL #8,D1 BRA UpdateCommand ChkPos4 CMP #4,PattCurPos BNE.S ChkPos5 MOVE.L #$FF0F,D2 MOVE #2,CmdOffset LSL #4,D1 BRA UpdateCommand ChkPos5 CMP #5,PattCurPos BNE.S ChkPos7 MOVE.L #$FFF0,D2 MOVE #2,CmdOffset BRA UpdateCommand ChkPos7 CMP #7,PattCurPos BNE.S ChkPos8 CMP #1,D1 BHI Return1 MOVE.L #$FFF,D2 MOVE #4,CmdOffset LSL #4,D1 LSL #8,D1 BRA UpdateCommand ChkPos8 CMP #8,PattCurPos BNE.S ChkPos9 MOVE.L #$FFF,D2 MOVE #6,CmdOffset LSL #4,D1 LSL #8,D1 BRA UpdateCommand ChkPos9 CMP #9,PattCurPos BNE.S ChkPos10 MOVE.L #$F0FF,D2 MOVE #6,CmdOffset LSL #8,D1 BRA UpdateCommand ChkPos10 CMP #10,PattCurPos BNE.S ChkPos11 MOVE.L #$FF0F,D2 MOVE #6,CmdOffset LSL #4,D1 BRA UpdateCommand ChkPos11 CMP #11,PattCurPos BNE.S ChkPos13 MOVE.L #$FFF0,D2 MOVE #6,CmdOffset BRA UpdateCommand ChkPos13 CMP #13,PattCurPos BNE.S ChkPos14 CMP #1,D1 BHI Return1 MOVE.L #$FFF,D2 MOVE #8,CmdOffset LSL #4,D1 LSL #8,D1 BRA UpdateCommand ChkPos14 CMP #14,PattCurPos BNE.S ChkPos15 MOVE.L #$FFF,D2 MOVE #10,CmdOffset LSL #4,D1 LSL #8,D1 BRA UpdateCommand ChkPos15 CMP #15,PattCurPos BNE.S ChkPos16 MOVE.L #$F0FF,D2 MOVE #10,CmdOffset LSL #8,D1 BRA UpdateCommand ChkPos16 CMP #16,PattCurPos BNE.S ChkPos17 MOVE.L #$FF0F,D2 MOVE #10,CmdOffset LSL #4,D1 BRA UpdateCommand ChkPos17 CMP #17,PattCurPos BNE.S ChkPos19 MOVE.L #$FFF0,D2 MOVE #10,CmdOffset BRA UpdateCommand ChkPos19 CMP #19,PattCurPos BNE.S ChkPos20 CMP #1,D1 BHI Return1 MOVE.L #$FFF,D2 MOVE #12,CmdOffset LSL #4,D1 LSL #8,D1 BRA.S UpdateCommand ChkPos20 CMP #20,PattCurPos BNE.S ChkPos21 MOVE.L #$FFF,D2 MOVE #14,CmdOffset LSL #4,D1 LSL #8,D1 BRA.S UpdateCommand ChkPos21 CMP #21,PattCurPos BNE.S ChkPos22 MOVE.L #$F0FF,D2 MOVE #14,CmdOffset LSL #8,D1 BRA.S UpdateCommand ChkPos22 CMP #22,PattCurPos BNE.S MustBePos23 MOVE.L #$FF0F,D2 MOVE #14,CmdOffset LSL #4,D1 BRA.S UpdateCommand MustBePos23 MOVE.L #$FFF0,D2 MOVE #14,CmdOffset UpdateCommand MOVE.L SongDataPtr,A0 LEA sd_patterndata(A0),A0 MOVE.L PatternNumber,D0 LSL.L #8,D0 LSL.L #2,D0 ADD.L D0,A0 MOVEQ #0,D0 MOVE ScrPattPos,D0 LSL #4,D0 EXT.L D0 ADD.L D0,A0 ADD CmdOffset,A0 AND D2,(A0) ADD D1,(A0) MOVE (A0),WordNumber MOVEQ #0,D0 MOVE ScrPattPos,D0 MULU #7*40,D0 MOVE PattCurPos,D1 DIVU #6,D1 MULU #9,D1 ADD.L D1,D0 ADD #7528,D0 MOVE D0,TextOffset CMP #0,CmdOffset BEQ.S ShowInstrNibble CMP #4,CmdOffset BEQ.S ShowInstrNibble CMP #8,CmdOffset BEQ.S ShowInstrNibble CMP #12,CmdOffset BEQ.S ShowInstrNibble BSR PrintHexWord dscend BSR EditMoveDown CLR.B RawKeyCode RTS ShowInstrNibble SUBQ #1,TextOffset MOVE #1,TextLength MOVEQ #0,D0 MOVE (A0),D0 AND #$F000,D0 BNE.S sinokok TST.B BlankZeroFlag BEQ.S sinokok MOVE.L #BlankInsText,D0 BRA.S sinprt sinokok LSR #4,D0 LSR #7,D0 ADD.L #FastHexTable+1,D0 sinprt MOVE.L D0,ShowTextPtr BSR ShowText BRA.S dscend ;---- Store/Insert Effect Commands ---- CheckStoreEffect MOVEQ #0,D0 MOVE.B RawKeyCode,D0 BEQ Return1 CMP.B #70,D0 ; Del BEQ CheckKeyboard2 CMP.B #10,D0 BHI Return1 SUBQ.B #1,D0 ADD.B D0,D0 MOVE.L D0,D7 MOVE PattCurPos,D0 BSR GetPositionPtr MOVE ScrPattPos,D0 LSL #4,D0 LEA (A0,D0.W),A0 MOVE 2(A0),D0 AND #$0FFF,D0 LEA EffectMacros,A0 MOVE D0,(A0,D7.W) LEA CommandStoredText,A0 BSR ShowStatusText BSR WaitALittle BRA ShowAllRight CommandStoredText dc.b 'command stored!',0 CheckInsertEffect CLR InsEfx MOVEQ #0,D0 MOVE.B RawKeyCode,D0 BEQ Return1 CMP.B #70,D0 ; Del BEQ CheckKeyboard2 CMP.B #11,D0 ; - BEQ DecreaseEffect CMP.B #12,D0 ; = (+) BEQ.S IncreaseEffect CMP.B #13,D0 ; \ BEQ.S CopyEffect CMP.B #10,D0 BHI Return1 SUBQ.B #1,D0 ADD.B D0,D0 LEA EffectMacros,A0 MOVE (A0,D0.W),InsEfx DoInsEffect MOVE.B #70,RawKeyCode BRA CheckNoteKeys GetLastEffect MOVE PattCurPos,D0 BSR GetPositionPtr MOVE ScrPattPos,D0 SUBQ #1,D0 AND #$3F,D0 LSL #4,D0 LEA (A0,D0.W),A0 MOVE 2(A0),D0 AND #$0FFF,D0 RTS CopyEffect BSR.S GetLastEffect MOVE D0,InsEfx BRA.S DoInsEffect IncreaseEffect BSR.S GetLastEffect MOVE D0,D1 AND #$0F00,D1 CMP #$0E00,D1 BEQ.S IncECom ADDQ.B #1,D0 MOVE D0,InsEfx BRA.S DoInsEffect IncECom MOVE D0,D1 ADDQ.B #1,D1 AND.B #$0F,D1 AND #$0FF0,D0 OR.B D1,D0 MOVE D0,InsEfx BRA.S DoInsEffect DecreaseEffect BSR.S GetLastEffect MOVE D0,D1 AND #$0F00,D1 CMP #$0E00,D1 BEQ.S DecECom SUBQ.B #1,D0 MOVE D0,InsEfx BRA DoInsEffect DecECom MOVE D0,D1 SUBQ.B #1,D1 AND.B #$0F,D1 AND #$0FF0,D0 OR.B D1,D0 MOVE D0,InsEfx BRA DoInsEffect InsEfx dc.w 0 ;---- Check Keyboard for notekeys ---- CheckKeyboard TST.B RawKeyCode BEQ Return1 TST LeftAmigaStatus BNE Return1 TST CtrlKeyStatus BNE Return1 TST ShiftKeyStatus BNE CheckStoreEffect TST AltKeyStatus BNE CheckInsertEffect CheckKeyboard2 MOVE PattCurPos,D0 BEQ.S CheckNoteKeys CMP #6,D0 BEQ.S CheckNoteKeys CMP #12,D0 BEQ.S CheckNoteKeys CMP #18,D0 BEQ.S CheckNoteKeys TST.L EditMode BNE EditCommand RTS CheckNoteKeys LEA RawKeyScaleTable,A0 MOVE.B RawKeyCode,D1 MOVEQ #38,D0 cnkloop CMP.B 0(A0,D0.W),D1 BEQ.S NoteKeyPressed DBF D0,cnkloop RTS NoteKeyPressed CLR.B RawKeyCode MOVE.L KeyTransTabPtr,A1 MOVE.B (A1,D0.W),D0 CMP #36,D0 BHS.S nkpskip MOVE.L SplitAddress,D1 BEQ.S nkpskip CLR.L SplitAddress MOVE.L D1,A0 MOVE.B D0,(A0) MOVE SamNoteType,D1 BEQ ShowSplit CLR SamNoteType AND #$FF,D0 MOVE D0,(A0) CMP #1,D1 BEQ.S loclab1 CMP #3,D1 BEQ ShowS2TuneNote CMP #4,D1 BEQ ShowAllRight JMP ShowResamNote loclab1 JMP ShowSamNote nkpskip MOVE InsNum,PlayInsNum TST.B SplitFlag BEQ.S nkpskip2 LEA SplitInstrTable,A1 MOVE.B (A1,D0.W),D1 BEQ.S nkpskip3 MOVE.B D1,PlayInsNum+1 nkpskip3 LEA SplitTransTable,A1 MOVE.B (A1,D0.W),D0 nkpskip2 MOVEQ #0,D2 playtheinstr LEA PeriodTable,A1 ; note in d0 here MOVE.L D0,D4 LSL #1,D0 MOVEQ #0,D3 MOVE (A1,D0.W),D3 MOVE.L SongDataPtr,A0 ; This fixes finetune... LEA 14(A0),A0 MOVE InsNum,D1 BNE.S nkpskipit MOVE LastInsNum,D1 nkpskipit MULU #30,D1 ADD.L D1,A0 MOVEQ #0,D1 MOVE.B (A0),D1 ; get finetune MULU #37*2,D1 ADD.L D1,A1 MOVE (A1,D0.W),CurrentPlayNote TST.L D2 BEQ.S nkpnrml CMP.B #2,pnoteflag BNE antpskip nkpnrml TST.L EditMode BEQ antpskip AddNoteToPattern MOVE.L SongDataPtr,A0 LEA sd_patterndata(A0),A0 ; Find first pattern MOVE.L PatternNumber,D0 LSL.L #8,D0 LSL.L #2,D0 ADD.L D0,A0 ; Find current pattern MOVEQ #0,D0 MOVE ScrPattPos,D0 BSR QuantizeCheck LSL #4,D0 EXT.L D0 ADD.L D0,A0 ; Find current pos MOVE PattCurPos,D0 DIVU #6,D0 LSL #2,D0 EXT.L D0 ADD.L D0,A0 ; Find current channel TST AltKeyStatus BEQ.S antpsks AND.L #$FFFFF000,(A0) MOVE InsEfx,D0 OR D0,2(A0) BRA.S antp3 antpsks TST ShiftKeyStatus BEQ.S antpskip2 CLR.L (A0) antpskip2 MOVE D3,(A0) ; Put note into pattern BEQ.S antp2 TST.B AutoInsFlag BEQ.S antp4 MOVE VolumeEfx,2(A0) antp4 MOVEQ #0,D0 MOVE PlayInsNum,D0 LSL #4,D0 AND.B #$F,2(A0) ADD.B D0,2(A0) LSL #4,D0 AND #$F000,D0 OR D0,(A0) BRA.S antp3 antp2 AND #$0FFF,2(A0) antp3 MOVE 2(A0),CurrCmds MOVE.L NoteNamesPtr,A0 LSL #2,D4 EXT.L D4 ADD.L D4,A0 MOVE.L A0,ShowTextPtr MOVE #3,TextLength MOVEQ #0,D0 MOVE ScrPattPos,D0 BSR QuantizeCheck MULU #7*40,D0 MOVEQ #0,D1 MOVE PattCurPos,D1 DIVU #6,D1 MULU #9,D1 ADD.L D1,D0 ADD #7524,D0 MOVE D0,TextOffset TST AltKeyStatus BEQ.S antpnot ADDQ #4,D0 MOVE D0,TextOffset BRA.S antpalt antpnot BSR ShowText ; Show notename BSR PrintHiInstrNum antpalt MOVE CurrCmds,WordNumber BSR PrintHexWord BSR EditMoveDown antpskip TST DidQuantize BNE.S testmul TST CurrentPlayNote BNE PlayNote testmul TST.B MultiFlag BEQ Return1 GotoNextMulti MOVEQ #0,D0 MOVE PattCurPos,D0 DIVU #6,D0 LEA MultiModeNext,A0 MOVE.B (A0,D0.W),D0 SUBQ #1,D0 AND #3,D0 MULU #6,D0 MOVE D0,PattCurPos BRA UpdateCursorPos QuantizeCheck TST.L RunMode BEQ.S qcend MOVEQ #0,D1 MOVE.B QuantizeValue,D1 BEQ.S qcend CMP #1,D1 BEQ.S QuanOne MOVE #1,DidQuantize MOVE.L D1,D2 LSR #1,D2 ADD D0,D2 AND #$003F,D2 DIVU D1,D2 MULU D1,D2 CMP D0,D2 BHI.S qcskip CLR DidQuantize qcskip MOVE D2,D0 RTS QuanOne MOVE.L CurrSpeed,D1 LSR.L #1,D1 CMP.L Counter,D1 BLS.S QuantToNextNote qcend CLR DidQuantize RTS QuantToNextNote ADDQ #1,D0 AND #$003F,D0 MOVE #1,DidQuantize RTS PlayNote CMP #18,PattCurPos BNE.S ChkChan3 LEA $DFF0D0,A5 LEA audchan4temp,A4 BRA.S DoPlayNote ChkChan3 CMP #12,PattCurPos BNE.S ChkChan2 LEA $DFF0C0,A5 LEA audchan3temp,A4 BRA.S DoPlayNote ChkChan2 CMP #6,PattCurPos BNE.S ChkChan1 LEA $DFF0B0,A5 LEA audchan2temp,A4 BRA.S DoPlayNote ChkChan1 TST PattCurPos BNE Return1 LEA $DFF0A0,A5 LEA audchan1temp,A4 DoPlayNote MOVE.L A5,NoteAddr LEA SampleInfo,A6 MOVE PlayInsNum,D0 BEQ.S dpnplay LSL.L #2,D0 LEA SamplePtrs,A0 LEA SampleInfo2,A6 MOVE.L 0(A0,D0.W),si_pointer2 MOVE.L SongDataPtr,A0 LEA -10(A0),A0 MOVE PlayInsNum,D0 MOVE.B D0,PlayInsNum2 MULU #30,D0 ADD.L D0,A0 MOVE.L 22(A0),SampleInfo2 MOVE.L 26(A0),si_long2 dpnplay MOVE.B PlayInsNum2,n_samplenum(A4) MOVE 4(A6),D0 ; repeat BNE.S dpn2 MOVE (A6),D0 ; length BRA.S dpn3 dpn2 ADD 6(A6),D0 ; add replen dpn3 MOVEQ #0,D1 MOVE.B 3(A6),D1 MOVE D1,8(A5) ; Set volume MOVE.B D1,n_volume(A4) MOVE CurrentPlayNote,6(A5) ; Set period MOVE CurrentPlayNote,n_period(A4) MOVE n_dmabit(A4),$DFF096 ; Channel DMA off MOVE.L 8(A6),D1 ADD.L StartOfs,D1 MOVE.L D1,(A5) ; Set sampledata pointer CLR.L StartOfs MOVE.L D1,n_start(A4) MOVE D0,4(A5) ; Set length MOVE D0,n_length(A4) BNE.S dpnnz MOVEQ #1,D0 MOVE D0,4(A5) MOVE D0,n_length(A4) dpnnz MOVE CurrentPlayNote,D0 BSR PlayNoteAnalyze MOVE DMAWait,D0 dpnolp1 DBF D0,dpnolp1 MOVE n_dmabit(A4),D0 AND ActiveChannels,D0 OR #$8000,D0 MOVE D0,$DFF096 ; Turn DMA back on MOVE DMAWait,D0 dpnolp2 DBF D0,dpnolp2 MOVEQ #0,D1 MOVE 4(A6),D1 ; repeat*2 ADD.L D1,D1 ADD.L 8(A6),D1 ; + startptr MOVE.L D1,(A5) ; Set loop pointer MOVE.L D1,n_loopstart(A4) MOVE 6(A6),4(A5) ; Set loop length MOVE 6(A6),n_replen(A4) ST n_trigger(A4) BRA testmul PlayInsNum2 dc.b 0,0 ;---- Check Cursor Arrow Keys ---- ArrowKeys CMP.B #4,EnterTextFlag BEQ Return1 MOVE.B RawKeyCode,D0 TST GetLineFlag BNE.S arkeskip TST ShiftKeyStatus BNE.S arkeskip TST AltKeyStatus BNE.S arkeskip CMP #2,CurrScreen BEQ.S arkeskip CMP.B #78,D0 BEQ RightArrow CMP.B #79,D0 BEQ LeftArrow arkeskip CMP.B #76,D0 BEQ.S UpArrow CMP.B #77,D0 BEQ DownArrow CLR ArrowPressed RTS ArrowPressed dc.w 0 ArrowRepCounter dc.w 0 UpArrow TST.L RunMode BNE Return1 CMP #2,CurrScreen BEQ Return1 CMP #3,CurrScreen BEQ Return1 CMP #4,CurrScreen BEQ Return1 CMP #6,CurrScreen BEQ Return1 TST ArrowPressed BEQ.S MoveOneUp ADDQ #1,ArrowRepCounter TST AltKeyStatus BNE.S AltUpArrow TST ShiftKeyStatus BNE.S ShiftUpArrow CMP #6,ArrowRepCounter BPL.S MoveOneUp RTS ShiftUpArrow CMP #3,ArrowRepCounter BPL.S MoveOneUp RTS AltUpArrow CMP #1,ArrowRepCounter BPL.S MoveOneUp RTS MoveOneUp CLR ArrowRepCounter MOVE #$FFFF,ArrowPressed CMP.L #'patt',RunMode BEQ Return1 SUBQ #1,ScrPattPos AND #$003F,ScrPattPos BRA SetScrPatternPos DownArrow TST.L RunMode BNE Return1 CMP #2,CurrScreen BEQ Return1 CMP #3,CurrScreen BEQ Return1 CMP #4,CurrScreen BEQ Return1 CMP #6,CurrScreen BEQ Return1 TST ArrowPressed BEQ.S MoveOneDown ADDQ #1,ArrowRepCounter TST AltKeyStatus BNE.S AltDownArrow TST ShiftKeyStatus BNE.S ShiftDownArrow CMP #6,ArrowRepCounter BPL.S MoveOneDown RTS ShiftDownArrow CMP #3,ArrowRepCounter BPL.S MoveOneDown RTS AltDownArrow CMP #1,ArrowRepCounter BPL.S MoveOneDown RTS MoveOneDown CLR ArrowRepCounter MOVE #$FFFF,ArrowPressed TST.L RunMode BNE Return1 ADDQ #1,ScrPattPos AND #$003F,ScrPattPos BRA SetScrPatternPos EditMoveDown TST.L RunMode BNE Return1 MOVE EditMoveAdd,D0 ADD D0,ScrPattPos AND #$003F,ScrPattPos BRA SetScrPatternPos EditMoveAdd dc.w 1 RightArrow TST ArrowPressed BEQ.S MoveOneRight ADDQ #1,ArrowRepCounter CMP #6,ArrowRepCounter BPL.S MoveOneRight RTS PatternOneUp ADDQ.L #1,PatternNumber AND.L #$3F,PatternNumber BSR Wait_4000 BRA RedrawPattern MoveOneRight CLR ArrowRepCounter MOVE #$FFFF,ArrowPressed ADDQ #1,PattCurPos CMP #24,PattCurPos BMI.S morskip CLR PattCurPos morskip BRA.S UpdateCursorPos LeftArrow TST ArrowPressed BEQ.S MoveOneLeft ADDQ #1,ArrowRepCounter CMP #6,ArrowRepCounter BPL.S MoveOneLeft RTS PatternOneDown SUBQ.L #1,PatternNumber AND.L #$3F,PatternNumber BSR Wait_4000 BRA RedrawPattern MoveOneLeft CLR ArrowRepCounter MOVE #$FFFF,ArrowPressed SUBQ #1,PattCurPos TST PattCurPos BPL UpdateCursorPos MOVE #23,PattCurPos UpdateCursorPos TST SamScrEnable BNE Return1 MOVE PattCurPos,D0 LEA CursorPosTable,A0 MOVE.B 0(A0,D0.W),D0 LSL #3,D0 ADD #9,D0 MOVE #$BD,D1 MOVEQ #14,D2 ; 14 lines LEA CursorSpriteData,A0 BRA SetSpritePos ArrowKeys2 MOVE.B RawKeyCode,D0 CMP.B #76,D0 BEQ.S UpArrow2 CMP.B #77,D0 BEQ.S DownArrow2 CMP.B #79,D0 BEQ.S LeftArrow2 CMP.B #78,D0 BEQ RightArrow2 RTS UpArrow2 CMP #2,CurrScreen BEQ HelpUp CMP #3,CurrScreen BEQ FileNameOneUp CMP #4,CurrScreen BEQ PED_OneUp CMP #6,CurrScreen BEQ PLSTOneUp RTS DownArrow2 CMP #2,CurrScreen BEQ HelpDown CMP #3,CurrScreen BEQ FileNameOneDown CMP #4,CurrScreen BEQ PED_OneDown CMP #6,CurrScreen BEQ PLSTOneDown RTS LeftArrow2 TST ShiftKeyStatus BNE PositionDown TST AltKeyStatus BNE PatternOneDown TST CtrlKeyStatus BNE SampleNumDown CMP #2,CurrScreen BEQ HelpLeft RTS RightArrow2 TST ShiftKeyStatus BNE PositionUp TST AltKeyStatus BNE PatternOneUp TST CtrlKeyStatus BNE SampleNumUp CMP #2,CurrScreen BEQ HelpRight RTS ;---- Update Line Cursor Position ---- UpdateLineCurPos MOVE LineCurX,D0 MOVE LineCurY,D1 SUBQ #1,D0 MOVEQ #2,D2 LEA LineCurSpriteData,A0 BRA SetSpritePos ;---- Check Gadgets ---- CheckGadgets BSR UpdatePointerPos BSR.S CheckGadgets2 CLR notogfl CMP #$FFFF,GadgRepeat BEQ.S CgRepeat MOVEQ #0,D0 cgloop ADDQ.L #1,D0 TST.B HHFlag BEQ.S cgnorma CMP.L #40000*5,D0 BEQ.S CgRepeat BRA.S cgnorm2 cgnorma CMP.L #40000,D0 BEQ.S CgRepeat cgnorm2 BTST #6,$BFE001 BEQ.S cgloop CLR UpOrDown BRA MainLoop CgRepeat TST.B HHFlag BEQ.S cgrepe2 BSR Wait_4000 cgrepe2 MOVE #$FFFF,GadgRepeat BTST #6,$BFE001 BEQ.S CheckGadgets CLR GadgRepeat CLR UpOrDown BRA MainLoop CheckGadgets2 MOVE MouseX,MouseX2 BNE.S cgskip TST MouseY BNE.S cgskip ChkQuit LEA QuitPTText,A0 BSR AreYouSure BEQ ExitCleanup ; Quit PT! RTS cgskip MOVE MouseY,MouseY2 CMP #4,CurrScreen BEQ CheckPresEdGadgs MOVE MouseX2,D0 MOVE MouseY2,D1 CMP #122,D1 BHS WantedPattGadg CMP #111,D1 BHS CheckSmplNamOrLoad CMP #100,D1 BHS TypeInSongName CMP #120,D0 BLO.S cgskip2 CMP #6,CurrScreen BEQ CheckPLSTGadgs cgskip2 CMP #2,CurrScreen BEQ Return1 CMP #3,CurrScreen ; Screen 3 is DirScreen... BEQ CheckDirGadgets CMP #5,CurrScreen BEQ CheckSetupGadgs CMP #7,CurrScreen BEQ CheckSetup2Gadgs CMP #45,D1 BHS.S cgskip3 CMP #306,D0 BHS CheckToggle CMP #244,D0 BHS.S MainMenu3 CMP #181,D0 BHS.S MainMenu2 CMP #120,D0 BHS MainMenu1 cgskip3 CMP #120,D0 BHS.S cgskip4 CMP #109,D0 BHS DownGadgets CMP #98,D0 BHS UpGadgets CMP #62,D0 BHS EnterNumGadg BRA PosInsDelGadgs cgskip4 TST.B EdEnable BNE CheckEditOpGadgs BRA ToggleAnaScope MainMenu3 MOVE MouseY2,D0 CMP #34,D0 BHS DPMGFIH CMP #23,D0 BHS Setup CMP #12,D0 BHS PresetEditor TST D0 BHS PLST RTS DPMGFIH JMP SamplerScreen MainMenu2 MOVE MouseY2,D0 CMP #3,CurrScreen BNE mm2skip CMP #44,D0 BHS CheckDirGadgets2 mm2skip CMP #44,D0 BHS Return1 CMP #34,D0 BHS ShowDirScreen CMP #23,D0 BHS DoEditOp CMP #12,D0 BHS ClearAll TST D0 BHS StopIt RTS MainMenu1 MOVE MouseY2,D0 CMP #3,CurrScreen BNE.S mm1skip CMP #44,D0 BHS CheckDirGadgets2 mm1skip CMP #44,D0 BHS Return1 CMP #34,D0 BHS RecordPattern CMP #23,D0 BHS Edit CMP #12,D0 BHS PlayPattern TST D0 BHS PlaySong RTS ;---- Disk Format ---- DiskFormatGadg BSR WaitForButtonUp BSR Wait_4000 BSR ClearFileNames BSR SwapFormatBox BSR WaitForButtonUp LEA AreYouSureText,A0 BSR ShowStatusText fmtbuttonchk BSR DoKeyBuffer MOVE.B RawKeyCode,D0 CMP.B #69,D0 ; ESC BEQ.S fmtbend BTST #6,$BFE001 BNE.S fmtbuttonchk MOVEM.W MouseX,D0/D1 CMP #89,D0 BLO.S fmtbuttonchk CMP #212,D0 BHI.S fmtbuttonchk CMP #72,D1 BLO.S fmtbuttonchk CMP #82,D1 BHI.S fmtbuttonchk CMP #136,D0 BLO.S DiskFormat CMP #166,D0 BLO.S fmtbuttonchk fmtbend BSR.S SwapFormatBox BRA SetErrorPtrCol SwapFormatBox LEA FormatBoxData,A1 LEA BitPlaneData+FormatBoxPos,A0 MOVEQ #38,D0 sfbloop1 MOVEQ #17,D1 sfbloop2 MOVE.B PlaneSize(A0),D2 MOVE.B 702(A1),PlaneSize(A0) MOVE.B D2,702(A1) MOVE.B (A0),D2 MOVE.B (A1),(A0)+ MOVE.B D2,(A1)+ DBF D1,sfbloop2 LEA $0016(A0),A0 DBF D0,sfbloop1 RTS DiskFormat BSR SwapFormatBox BSR ShowAllRight BSR ClearFileNames LEA PlsEntNamText,A0 MOVE #2570,D1 MOVEQ #17,D0 BSR ShowText3 LEA OfVolumeText,A0 MOVE.B #'_',15(A0) MOVE.B #'_',16(A0) MOVE #2810,D1 MOVEQ #17,D0 BSR ShowText3 BSR SetWaitPtrCol LEA DiskNumText1,A6 MOVEQ #1,D0 df_loop CLR.B 0(A6,D0.W) DBF D0,df_loop MOVE.L A6,TextEndPtr MOVE.L A6,ShowTextPtr ADDQ.L #2,TextEndPtr MOVE.B #1,EnterTextFlag MOVE #2825,A4 MOVE #2,TextLength BSR GetTextLine CLR.B EnterTextFlag CLR.L TextEndPtr BSR ClearFileNames MOVE.L 4.W,A6 MOVE.L #5632,D0 MOVEQ #MEMF_CHIP,D1 JSR LVOAllocMem(A6) MOVE.L D0,FormatDataPtr BEQ df_memerr BSR DoShowFreeMem SUB.L A1,A1 JSR LVOFindTask(A6) MOVE.L D0,ProcessPtr LEA TrackdiskPort,A1 JSR LVOAddPort(A6) LEA TrackdiskIOExtTD,A1 MOVEQ #0,D0 MOVEQ #0,D1 LEA TrackdiskName,A0 JSR LVOOpenDevice(A6) MOVE.L #TrackdiskPort,TDPortPtr CLR CylinderNumber LEA TrackdiskIOExtTD,A1 MOVE #TD_CHANGESTATE,IO_COMMAND(A1) JSR LVODoIO(A6) ; Check if disk in drive TST.L IO_ACTUAL(A1) BEQ.S df_indrive LEA NoDiskInDriveText,A0 BSR ShowStatusText MOVE #50,WaitTime BSR SetErrorPtrCol BRA df_cleanup df_indrive LEA TrackdiskIOExtTD,A1 MOVE #TD_PROTSTATUS,IO_COMMAND(A1) JSR LVODoIO(A6) ; Check write protect TST.L IO_ACTUAL(A1) BEQ.S df_noprot LEA WriteProtectedText,A0 BSR ShowStatusText MOVE #50,WaitTime BSR SetErrorPtrCol BRA df_cleanup df_noprot LEA DiskFormatText,A0 MOVE #2581-7,D1 MOVEQ #11,D0 BSR ShowText3 LEA InProgressText,A0 MOVE #2821-7,D1 MOVEQ #11,D0 BSR ShowText3 CLR.L FmtDiskOffset MOVE.L FormatDataPtr,FmtDataPtr MOVE.L #$00001600,FmtDataSize BSR ClearCylinder BSR SetDiskPtrCol df_formatloop LEA FormattingCylText,A0 BSR ShowStatusText MOVE CylinderNumber,D0 LSR #1,D0 MOVE D0,WordNumber BSR Print2DecDigits MOVE.L 4.W,A6 LEA TrackdiskIOExtTD,A1 MOVE #TD_FORMAT,IO_COMMAND(A1) JSR LVODoIO(A6) ; Format cylinder LEA VerifyingText,A0 BSR ShowStatusText MOVE CylinderNumber,D0 LSR #1,D0 MOVE D0,WordNumber BSR Print2DecDigits MOVE.L 4.W,A6 LEA TrackdiskIOExtTD,A1 MOVE #CMD_READ,IO_COMMAND(A1) JSR LVODoIO(A6) ; Read cylinder to verify TST.B Fmt_hmmm BEQ.S df_verifyok LEA VerifyErrText(PC),A0 BSR ShowStatusText MOVE #50,WaitTime BSR SetErrorPtrCol BRA df_cleanup VerifyErrText dc.b "Verify error!",0 df_verifyok ADD.L #$1600,FmtDiskOffset ADDQ #1,CylinderNumber CMP #160,CylinderNumber BNE df_formatloop LEA InitDiskText,A0 BSR ShowStatusText BSR ClearCylinder MOVE.L FormatDataPtr,A2 LEA BootblockData(PC),A0 MOVEQ #12,D0 .loop MOVE.L (A0)+,(A2)+ DBF D0,.loop LEA TrackdiskIOExtTD,A1 CLR.L IO_OFFSET(A1) MOVE.L #512,IO_LENGTH(A1) MOVE #CMD_WRITE,IO_COMMAND(A1) MOVE.L 4.W,A6 JSR LVODoIO(A6) ; Write bootblock MOVE.L #DateStamp,D1 MOVE.L DOSBase,A6 JSR LVODateStamp(A6) MOVE.L 4.W,A6 BSR ClearCylinder MOVE.L FormatDataPtr,A2 MOVE #2,2(A2) MOVE #$0048,14(A2) MOVE.L #$FFFFFFFF,$0138(A2) MOVE #$0371,$013E(A2) MOVE.L #$0553542D,$01B0(A2) MOVE DiskNumText1,$01B4(A2) MOVE #$06F7,$01E2(A2) MOVE #1,$01FE(A2) LEA DateStamp,A0 MOVE.L (A0),D0 MOVE.L D0,$01A4(A2) MOVE.L D0,$01E4(A2) MOVE.L 4(A0),D0 MOVE.L D0,$01A8(A2) MOVE.L D0,$01E8(A2) MOVE.L 8(A0),D0 MOVE.L D0,$01AC(A2) MOVE.L D0,$01EC(A2) MOVE.L A2,A3 MOVE.L A3,A4 MOVEQ #$7F,D1 MOVEQ #0,D0 MOVE.L D0,$0014(A4) df_loop2 SUB.L (A3)+,D0 DBF D1,df_loop2 MOVE.L D0,$0014(A4) MOVE.L #$C000C037,$0200(A2) LEA $0204(A2),A3 MOVEQ #$36,D0 df_loop3 MOVE.L #$FFFFFFFF,(A3)+ DBF D0,df_loop3 MOVE #$3FFF,$0272(A2) MOVE #$3FFF,$02DC(A2) LEA TrackdiskIOExtTD,A1 MOVE.L #$0006E000,IO_OFFSET(A1) MOVE.L #1024,IO_LENGTH(A1) MOVE #CMD_WRITE,IO_COMMAND(A1) JSR LVODoIO(A6) LEA TrackdiskIOExtTD,A1 MOVE #CMD_UPDATE,IO_COMMAND(A1) JSR LVODoIO(A6) ; Flush write buffer df_cleanup LEA TrackdiskIOExtTD,A1 MOVE #TD_MOTOR,IO_COMMAND(A1) CLR.L IO_LENGTH(A1) JSR LVODoIO(A6) ; Turn off the motor MOVE.L Fmt_tja,A0 MOVE.L $0024(A0),A0 OR.B #2,$0040(A0) LEA TrackdiskIOExtTD,A1 MOVE.L 4.W,A6 JSR LVOCloseDevice(A6) LEA TrackdiskPort,A1 JSR LVORemPort(A6) MOVE.L FormatDataPtr,A1 MOVE.L #5632,D0 JSR LVOFreeMem(A6) CMP #160,CylinderNumber BNE.S df_skip2 CMP #'00',DiskNumText1 BNE.S df_skip2 MOVE.L DOSBase,A6 MOVE.L #150,D1 ; Wait 3 sec JSR LVODelay(A6) MOVE.L #LockNameDF0,D1 MOVE.L #-2,D2 JSR LVOLock(A6) MOVE.L D0,D6 BEQ df_skip3 MOVE.L D0,D1 JSR LVOCurrentDir(A6) MOVE.L D0,D7 MOVE.L D6,D1 JSR LVOUnLock(A6) MOVE.L #FmtSongDirName,D1 JSR LVOCreateDir(A6) MOVE.L D0,D1 BEQ.S .err1 JSR LVOUnLock(A6) .err1 MOVE.L #FmtModuleDirName,D1 JSR LVOCreateDir(A6) MOVE.L D0,D1 BEQ.S df_skip2 JSR LVOUnLock(A6) df_skip2 MOVE.L D7,D1 JSR LVOCurrentDir(A6) df_skip3 BSR SetNormalPtrCol BSR ShowAllRight BSR ClearFileNames MOVE #1,UpdateFreeMem RTS df_memerr BSR OutOfMemErr BRA.S df_skip2 ClearCylinder MOVE.L FormatDataPtr,A0 MOVE #1407,D0 MOVEQ #0,D1 ccloop MOVE.L D1,(A0)+ DBF D0,ccloop RTS BootblockData dc.l $444F5300,$c0200f19,$00000370,$43fa0018 dc.l $4eaeffa0,$4a80670a,$20402068,$00167000 dc.l $4e7570ff,$60fa646f,$732e6c69,$62726172 dc.l $79000000 LockNameDF0 dc.b "df0:",0 even ;---- Clear All Data ---- ClearAll ADD.L #1,LaHeTx MOVE.B DisableAnalyzer,SaveDA MOVE.B ScopeEnable,SaveScope SF ScopeEnable LEA PleaseSelectText,A0 BSR ShowStatusText BSR StorePtrCol BSR SetWaitPtrCol BSR Wait_4000 CMP #1,CurrScreen BNE.S clbskip TST.B DisableAnalyzer BNE.S clbskip ST DisableAnalyzer BSR ClearAnaHeights BSR ClearRightArea clbskip LEA ClearBoxData,A1 BSR SwapBoxMem BSR WaitForButtonUp BSR Wait_4000 clearbuttoncheck BTST #2,$DFF016 BEQ ClrCancel BSR DoKeyBuffer MOVE.B RawKeyCode,D0 CMP.B #33,D0 ; Pressed S BEQ ClrSamples CMP.B #24,D0 ; Pressed O BEQ ClrSong CMP.B #32,D0 ; Pressed A BEQ ClrAll CMP.B #51,D0 ; Pressed C BEQ ClrCancel CMP.B #69,D0 ; Pressed Esc BEQ ClrCancel BTST #6,$BFE001 ; Left Mousebutton BNE.S clearbuttoncheck MOVEM.W MouseX,D0/D1 CMP #166,D0 BLO.S clearbuttoncheck CMP #257,D0 BHI.S clearbuttoncheck CMP #58,D1 BLO.S clearbuttoncheck CMP #84,D1 BHI.S clearbuttoncheck CMP #204,D0 BHS.S samporcancel CMP #198,D0 BLS.S songorall BRA.S clearbuttoncheck songorall CMP #74,D1 BHS.S ClrAll CMP #68,D1 BLS ClrSong BRA clearbuttoncheck samporcancel CMP #74,D1 BHS.S ClrCancel CMP #68,D1 BLS.S ClrSamples BRA clearbuttoncheck RemoveClearBox LEA ClearBoxData,A1 BSR SwapBoxMem BSR ShowAllRight BSR ClearAnaHeights MOVE.B SaveDA,DisableAnalyzer MOVE.B SaveScope,ScopeEnable BSR RestorePtrCol CLR.B RawKeyCode RTS ClrCancel BSR.S RemoveClearBox BRA SetErrorPtrCol ClrAll BSR DoClearSong BSR ClrSampleInfo BSR SetNormalPtrCol BSR.S RemoveClearBox BRA DisplayMainAll ClrSamples BSR.S RemoveClearBox BSR StopIt BSR ClrSampleInfo BSR SetNormalPtrCol SF EdEnable MOVE #1,InsNum BRA DisplayMainAll ClrSong BSR.S RemoveClearBox BSR DoClearSong BSR SetNormalPtrCol BRA DisplayMainAll ClrSampleInfo BSR GiveBackInstrMem MOVE.L SongDataPtr,A0 LEA sd_sampleinfo(A0),A0 MOVE #31*30-1,D0 csiloop CLR.B (A0)+ DBF D0,csiloop MOVE.L SongDataPtr,A1 LEA sd_sampleinfo(A1),A1 MOVEQ #30,D0 caloop2 MOVE #1,28(A1) LEA 30(A1),A1 DBF D0,caloop2 LEA SampleLengthAdd(PC),A3 MOVEQ #31,D0 csilop2 CLR (A3)+ DBF D0,csilop2 JMP RedrawSample DoClearSong BSR StopIt CLR.B RawKeyCode MOVE.L SongDataPtr,A0 MOVE.L A0,A1 MOVEQ #19,D0 docla2x CLR.B (A0)+ DBF D0,docla2x MOVE.L A1,A2 ADD.L #70716,A2 ADD.L #950,A1 MOVEQ #0,D0 caloop MOVE D0,(A1)+ CMP.L A1,A2 BNE.S caloop MOVE.L SongDataPtr,A0 MOVE #$017F,sd_numofpatt(A0) MOVE.L #'M.K.',sd_mahokakt(A0) ; M.K. all the way... SF EdEnable CLR.L CurrPos CLR.L SongPosition CLR.L PatternPosition CLR.L PatternPtr CLR.L TimerTicks CLR BlockMarkFlag CLR.B MetroChannel MOVE #1,EditMoveAdd MOVEQ #0,D0 MOVE DefaultSpeed,D0 MOVE.L D0,CurrSpeed MOVE Tempo,RealTempo BSR SetTempo BSR RestoreEffects2 BSR RestoreFKeyPos2 BSR UnmuteAll MOVE #1,InsNum MOVE.L #6,CurrSpeed CLR.L PatternNumber CLR ScrPattPos BSR SetScrPatternPos BRA RedrawPattern UnmuteAll MOVE #1,audchan1toggle MOVE #1,audchan2toggle MOVE #1,audchan3toggle MOVE #1,audchan4toggle MOVE #$000F,ActiveChannels BRA RedrawToggles ToggleMute CLR.B RawKeyCode TST ShiftKeyStatus BEQ tomuskp CLR audchan1toggle CLR audchan2toggle CLR audchan3toggle CLR audchan4toggle tomuskp MOVEQ #0,D0 MOVE PattCurPos,D0 DIVU #6,D0 MULU #11,D0 ADDQ #4,D0 BRA DoToggleMute RestoreEffects MOVEQ #0,D0 MOVE DefaultSpeed,D0 MOVE.L D0,CurrSpeed MOVE Tempo,RealTempo BSR SetTempo BSR.S RestoreEffects2 CLR.B RawKeyCode LEA EfxRestoredText(PC),A0 BSR ShowStatusText BSR WaitALittle BRA ShowAllRight RestoreEffects2 LEA audchan1temp,A0 BSR.S reefsub LEA audchan2temp,A0 BSR.S reefsub LEA audchan3temp,A0 BSR.S reefsub LEA audchan4temp,A0 reefsub CLR.B n_wavecontrol(A0) CLR.B n_glissfunk(A0) CLR.B n_finetune(A0) CLR.B n_loopcount(A0) RTS RestoreFKeyPos CLR.B RawKeyCode LEA PosRestoredText(PC),A0 BSR ShowStatusText BSR WaitALittle BSR ShowAllRight RestoreFKeyPos2 MOVE #00,F6pos MOVE #16,F7pos MOVE #32,F8pos MOVE #48,F9pos MOVE #63,F10pos RTS EfxRestoredText dc.b 'efx restored !',0 PosRestoredText dc.b 'pos restored !',0 GiveBackInstrMem MOVEQ #1,D7 MOVE.L 4.W,A6 gbimloop MOVE D7,D2 LSL #2,D2 LEA SamplePtrs,A0 MOVE.L 0(A0,D2.W),D1 BEQ.S gbimskip MOVE.L 124(A0,D2.W),D0 CLR.L 0(A0,D2.W) CLR.L 124(A0,D2.W) MOVE.L D1,A1 JSR LVOFreeMem(A6) gbimskip ADDQ #1,D7 CMP #32,D7 BNE.S gbimloop MOVE #1,UpdateFreeMem JMP FreeCopyBuf ;---- Setup ---- +++ Setup CMP #7,LastSetupScreen BEQ Setup2 CLR LastSetupScreen BSR WaitForButtonUp MOVE #5,CurrScreen ST DisableAnalyzer ST NoSampleInfo BSR Clear100Lines BSR ShowSetupScreen BEQ ExitSetup RefreshSetup BSR SetScreenColors BSR Show_MS CMP #5,CurrScreen BNE Return1 BSR MarkColor BSR ShowSetupToggles BSR ShowSplit BSR ShowPrintPath BSR ShowKeyRepeat BSR ShowExtCommand BSR ShowMultiSetup BSR ShowConfigNumber BSR ShowAccidental ; Always last (redraws pattern) RTS ShowSetupScreen MOVE.L SetupMemPtr,D0 BNE DecompactSetup BSR SaveMainPic TST.L SetupMemPtr BEQ Return1 BRA DecompactSetup SaveMainPic MOVE.L #8000,D0 MOVEQ #0,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,SetupMemPtr BEQ OutOfMemErr MOVE.L D0,A1 LEA BitPlaneData,A0 MOVEQ #1,D2 sssloop1 MOVE #999,D0 sssloop2 MOVE.L (A0)+,(A1)+ DBF D0,sssloop2 LEA 6240(A0),A0 DBF D2,sssloop1 RTS RestoreMainPic MOVE.L SetupMemPtr,D0 BEQ Return1 MOVE.L D0,A1 LEA BitPlaneData,A0 MOVEQ #1,D2 ssxloop1 MOVE #1000-1,D0 ssxloop2 MOVE.L (A1)+,(A0)+ DBF D0,ssxloop2 LEA 6240(A0),A0 DBF D2,ssxloop1 MOVE.L SetupMemPtr,A1 CLR.L SetupMemPtr MOVE.L #8000,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) RTS SetupMemPtr dc.l 0 DecompactSetup2 LEA Setup2Data,A0 MOVE.L #Setup2Size,D0 BRA.S decoset DecompactSetup LEA SetupScreenData,A0 MOVE.L #SetupScreenSize,D0 decoset BSR Decompact BEQ Return1 BSR ssets3 MOVEQ #-1,D0 RTS ; Gadgets CheckSetupGadgs TST.L SplitAddress BEQ.S csgskip CLR.L SplitAddress BSR ShowSplit csgskip MOVEM.W MouseX2,D0/D1 CMP #210,D0 BHS SetupMenu3 CMP #108,D0 BHS.S SetupMenu2 ;---- Menu 1 ---- CMP #11,D1 BLS LoadConfig CMP #22,D1 BLS SaveConfig CMP #33,D1 BLS ResetAll CMP #44,D1 BLS ExtCommand CMP #55,D1 BLS MultiSetup CMP #66,D1 BLS SetRed CMP #77,D1 BLS SetGreen CMP #88,D1 BLS SetBlue CMP #99,D1 BLS ColorGadgets RTS SetupMenu2 CMP #11,D1 BLS Return1 CMP #55,D1 BLS SetSplit CMP #66,D1 BLS SetKeyRepeat CMP #77,D1 BLS ToggleAccidental CMP #88,D1 BLS PrintSong CMP #99,D1 BLS EnterPrintPath RTS SetupMenu3 CMP #11,D1 BLS.S ExitOrClear CMP #22,D1 BLS ToggleSplit CMP #33,D1 BLS ToggleFilter CMP #44,D1 BLS ToggleTransDel CMP #55,D1 BLS ToggleShowDec CMP #66,D1 BLS ToggleAutoDir CMP #77,D1 BLS ToggleAutoExit CMP #88,D1 BLS ToggleModOnly CMP #99,D1 BLS ToggleMIDI RTS ExitOrClear CMP #265,D0 BLS ClearSplit CMP #306,D0 BHS Setup2 ExitSetup BSR WaitForButtonUp MOVE CurrScreen,LastSetupScreen CLR.B RawKeyCode CLR.L SplitAddress BSR RestoreMainPic SF NoSampleInfo BSR SetupVUCols BSR SetupAnaCols BSR Clear100Lines BRA DisplayMainAll LastSetupScreen dc.w 0 ToggleSplit EOR.B #1,SplitFlag BRA ShowSetupToggles ToggleFilter BCHG #1,$BFE001 BRA ShowSetupToggles ToggleTransDel EOR.B #1,TransDelFlag BRA.S ShowSetupToggles ToggleShowDec EOR.B #1,ShowDecFlag MOVE #1,UpdateFreeMem BRA.S ShowSetupToggles ToggleAutoDir EOR.B #1,AutoDirFlag BRA.S ShowSetupToggles ToggleAutoExit EOR.B #1,AutoExitFlag BRA.S ShowSetupToggles ToggleModOnly EOR.B #1,ModOnlyFlag LEA FileNamesPtr(PC),A0 CLR.L 4(A0) BRA.S ShowSetupToggles ToggleMIDI EOR.B #1,MIDIFlag BSR.S ShowSetupToggles tstmidi TST.B MIDIFlag BNE OpenMIDI BRA CloseMIDI ClearSplit BSR WaitForButtonUp LEA ClearSplitText,A0 BSR AreYouSure BNE Return1 LEA SplitData,A0 MOVEQ #15,D0 clsploop CLR.B (A0)+ DBF D0,clsploop BRA ShowSplit ShowSetupToggles CLR.B RawKeyCode BSR Show_MS CMP #5,CurrScreen BNE Return1 MOVE.B $BFE001,D0 LSR.B #1,D0 AND.B #1,D0 EOR.B #1,D0 MOVE.B D0,FilterFlag LEA SplitFlag,A4 MOVE #3,TextLength MOVEQ #7,D7 MOVE #636,D6 sstloop MOVE D6,TextOffset LEA ToggleOFFText(PC),A0 TST.B (A4)+ BEQ.S sstskip LEA ToggleONText(PC),A0 sstskip BSR ShowText2 ADD #440,D6 DBF D7,sstloop BRA WaitForButtonUp ToggleONText2 dc.b ' ' ToggleONText dc.b 'on ' ToggleOFFText dc.b 'off ' ShowSplit BSR CalculateSplit CMP #5,CurrScreen BNE Return1 LEA SplitData,A3 MOVE.L NoteNamesPtr,A4 MOVEQ #0,D5 MOVE #614,D6 CLR WordNumber shsploop MOVE D6,TextOffset MOVE.B (A3,D5.W),WordNumber+1 ; instr BSR PrintHexByte ADDQ #4,D6 MOVE D6,D1 MOVEQ #0,D0 MOVE.B 1(A3,D5.W),D0 ; note LSL #2,D0 LEA (A4,D0.W),A0 MOVEQ #4,D0 BSR ShowText3 ADDQ.L #5,D6 MOVE D6,D1 MOVEQ #0,D0 MOVE.B 2(A3,D5.W),D0 ; trans LSL #2,D0 LEA (A4,D0.W),A0 MOVEQ #4,D0 BSR ShowText3 ADD #431,D6 ADDQ #4,D5 CMP #16,D5 BNE.S shsploop RTS CalculateSplit LEA SplitTransTable,A0 LEA SplitInstrTable,A1 LEA SplitData,A2 MOVEQ #0,D0 casploop MOVE.B D0,(A0,D0.W) CLR.B (A1,D0.W) ADDQ #1,D0 CMP #37,D0 BLS.S casploop MOVE.B 1(A2),-(SP) MOVE.B 1+4(A2),-(SP) MOVE.B 1+8(A2),-(SP) MOVE.B 1+12(A2),-(SP) ; note MOVEQ #3,D4 caspbigloop MOVEQ #127,D0 MOVEQ #0,D1 MOVEQ #0,D2 casploop2 CMP.B 1(A2,D1.W),D0 ; note BLS.S caspskip MOVE.L D1,D2 MOVE.B 1(A2,D1.W),D0 ; note caspskip ADDQ #4,D1 CMP #16,D1 BNE.S casploop2 MOVEQ #0,D0 MOVE.B 1(A2,D2.W),D0 ; note MOVE.B #127,1(A2,D2.W) ; note MOVE.B 2(A2,D2.W),D1 ; trans casploop3 MOVE.B D1,(A0,D0.W) MOVE.B (A2,D2.W),(A1,D0.W) ; instr ADDQ #1,D1 CMP #36,D1 BLO.S caspskip2 MOVEQ #35,D1 caspskip2 ADDQ #1,D0 CMP #36,D0 BLO.S casploop3 DBF D4,caspbigloop MOVE.B (SP)+,1+12(A2) MOVE.B (SP)+,1+8(A2) MOVE.B (SP)+,1+4(A2) MOVE.B (SP)+,1(A2) ; note RTS SetSplit LEA SplitData,A2 SUBQ #1,D1 DIVU #11,D1 SUBQ #1,D1 MOVE D1,D7 LSL #2,D7 MULU #440,D1 ADD #600,D1 CMP #176,D0 BHS.S SetSplitTranspose CMP #136,D0 BHS.S SetSplitNote ADD #14,D1 MOVE D1,TextOffset BSR GetHexByte CMP.B #$1F,D0 BLS.S setskip MOVE.B #$1F,D0 setskip MOVE.B D0,(A2,D7.W) ; instr BRA ShowSplit SetSplitNote MOVE.L D1,-(SP) BSR ShowSplit MOVE.L (SP)+,D1 ADD #18,D1 MOVEQ #3,D0 LEA SpcNoteText,A0 BSR ShowText3 LEA 1(A2,D7.W),A0 ; note MOVE.L A0,SplitAddress BRA WaitForButtonUp SetSplitTranspose MOVE.L D1,-(SP) BSR ShowSplit MOVE.L (SP)+,D1 ADD #23,D1 MOVEQ #3,D0 LEA SpcNoteText,A0 BSR ShowText3 LEA 2(A2,D7.W),A0 ; trans MOVE.L A0,SplitAddress BRA WaitForButtonUp SetKeyRepeat CMP #188,D0 BHS.S skrep2 MOVE #2381,TextOffset BSR GetHexByte MOVE.B D0,KeyRepDelay+1 BRA.S ShowKeyRepeat skrep2 MOVE #2384,TextOffset BSR GetHexByte MOVE.B D0,KeyRepSpeed+1 ShowKeyRepeat MOVE #2381,TextOffset MOVE KeyRepDelay,WordNumber BSR PrintHexByte ADDQ #1,TextOffset MOVE KeyRepSpeed,WordNumber BRA PrintHexByte ToggleAccidental MOVE.L #NoteNames1,NoteNamesPtr EOR.B #1,Accidental BEQ.S ShowAccidental MOVE.L #NoteNames2,NoteNamesPtr ShowAccidental LEA AccidentalText(PC),A0 TST.B Accidental BEQ.S shacskp LEA AccidentalText+1(PC),A0 shacskp MOVEQ #1,D0 MOVE #2824,D1 BSR ShowText3 BRA RedrawPattern AccidentalText dc.b '#Ħ' LoadConfig CMP #84,D0 BHS SetConfigNumber LEA LoadConfigText,A0 BSR AreYouSure BNE Return1 BSR WaitForButtonUp LEA LoadingCfgText(PC),A0 BSR ShowStatusText DoLoadConfig BSR StorePtrCol BSR PutConfigNumber MOVE.L #ConfigName,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,D7 BNE.S cfgopok LEA PTPath,A0 BSR CopyPath LEA ConfigName(PC),A0 MOVEQ #12,D0 cfgnlop MOVE.B (A0)+,(A1)+ DBF D0,cfgnlop MOVE.L #FileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,D7 BEQ.S ConfigErr cfgopok BSR SetDiskPtrCol MOVE.L D7,D1 CLR.L ConfigID MOVE.L #ConfigID,D2 MOVE.L #4,D3 JSR LVORead(A6) CMP.L #"PT1.",ConfigID BNE.S cfgerr2 LEA SetupData+4,A0 MOVE.L D7,D1 MOVE.L A0,D2 MOVE.L #ConfigFileSize-4,D3 JSR LVORead(A6) lcfgend MOVE.L D7,D1 JSR LVOClose(A6) BSR ShowAllRight BSR RestorePtrCol cfgupda BSR CopyCfgData BSR tstmidi BSR ChangeCopList BRA RefreshSetup ConfigErr BSET #2,InitError LEA FileNotFoundText(PC),A0 cferr BSR ShowStatusText MOVE #50,WaitTime BRA ErrorRestoreCol cfgerr2 BSR.S ConfigErr2 BRA.S lcfgend ConfigErr2 BSET #3,InitError LEA NotAConfFileText(PC),A0 BRA.S cferr ConfigErr3 LEA CantCreateFiText(PC),A0 BRA.S cferr FileNotFoundText dc.b "config not found!",0 NotAConfFileText dc.b "not a config file",0 CantCreateFiText dc.b "can't create file",0 SaveConfig CMP #84,D0 BHS SetConfigNumber LEA SaveConfigText,A0 BSR AreYouSure BNE Return1 BSR StorePtrCol BSR SetDiskPtrCol BSR PutConfigNumber LEA SavingCfgText(PC),A0 BSR ShowStatusText MOVE.L DOSBase,A6 LEA PTPath,A0 BSR CopyPath LEA ConfigName(PC),A0 MOVEQ #12,D0 cfgllop MOVE.B (A0)+,(A1)+ DBF D0,cfgllop MOVE.L #FileName,D1 MOVE.L #1006,D2 JSR LVOOpen(A6) MOVE.L D0,D7 BEQ ConfigErr3 MOVE.L D0,D1 MOVE.L #SetupData,D2 MOVE #ConfigFileSize,D3 JSR LVOWrite(A6) MOVE.L D7,D1 JSR LVOClose(A6) BSR ShowAllRight BRA RestorePtrCol SetConfigNumber MOVE #611,TextOffset BSR GetHexByte MOVE D0,ConfigNumber ShowConfigNumber MOVE #611,TextOffset MOVE ConfigNumber(PC),WordNumber BRA PrintHexByte PutConfigNumber MOVE ConfigNumber(PC),D0 LEA ConfigName+12(PC),A0 BRA IntToHex2 ConfigName dc.b 'PT.config-00',0,0 ConfigNumber dc.w 0 LoadingCfgText dc.b 'loading config',0 SavingCfgText dc.b 'saving config',0,0 ConfigID dc.l 0 ResetAll LEA ResetAllText,A0 BSR AreYouSure BNE Return1 DoResetAll LEA DefaultSetupData,A0 LEA SetupData,A1 MOVE #ConfigFileSize-1,D0 rsaloop MOVE.B (A0)+,(A1)+ DBF D0,rsaloop BRA RefreshSetup ExtCommand CMP #11,D0 BLO.S excolab BSR StorePtrCol BSR SetWaitPtrCol LEA ExtCommands,A6 MOVE ExtCmdNumber,D1 MULU #32,D1 ADD.L D1,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #31,TextEndPtr MOVE #11,TextLength MOVE #1482,A4 BSR GetTextLine BRA RestorePtrCol ShowExtCommand LEA ExtCommands,A0 MOVE ExtCmdNumber,D1 MULU #32,D1 ADD.L D1,A0 MOVEQ #11,D0 MOVE #1482,D1 BRA ShowText3 excolab BTST #2,$DFF016 BEQ.S excorun ADDQ #1,ExtCmdNumber AND #7,ExtCmdNumber BSR.S ShowExtCommand BSR Wait_4000 BSR Wait_4000 BSR Wait_4000 BRA Wait_4000 excorun LEA ExtCommands,A0 MOVE ExtCmdNumber,D1 MULU #32,D1 ADD.L D1,A0 TST.B (A0) BEQ Return1 MOVE.L A0,ExtCmdAddress MOVE.L IntuitionBase,A6 JSR LVOOpenWorkbench(A6) JSR LVOWBenchToFront(A6) MOVE.L #ExtCmdConsole,D1 MOVE.L #1005,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,ExtCmdWindow BEQ.S winderr LSL.L #2,D0 MOVE.L D0,A0 MOVE.L PTProcess,A1 MOVE.L 8(A0),$A4(A1) BSR GotoCLI MOVE.L ExtCmdWindow,D1 BEQ Return1 MOVE.L DOSBase,A6 JSR LVOClose(A6) CLR.L ExtCmdWindow RTS winderr LEA ConsoleErrText,A0 BSR ShowStatusText BRA SetErrorPtrCol ExtCmdNumber dc.w 0 ExtCmdAddress dc.l 0 ExtCmdWindow dc.l 0 ExtCmdConsole dc.b "CON:0/0/640/150/Protracker Output Window",0 ConsoleErrText dc.b "Can't open window",0,0 MultiSetup CMP #44,D0 BLO Return1 BSR StorePtrCol BSR SetWaitPtrCol MOVE #1,GetLineFlag SUB #44,D0 LSR #4,D0 MOVE.B D0,musepos museset MOVEQ #0,D0 MOVE.B musepos,D0 MOVE.L D0,D1 LSL #4,D1 MOVE #52,LineCurX MOVE #53,LineCurY ADD D1,LineCurX LEA MultiModeNext,A1 LEA (A1,D0.W),A1 BSR UpdateLineCurPos muselop BSR GetHexKey TST.B D1 BEQ.S musenul CMP.B #4,D1 BHI.S muselop MOVE.B D1,(A1) BSR ShowMultiSetup MOVEQ #1,D0 musenul TST.B D0 BEQ.S museabo ADD.B D0,musepos AND.B #3,musepos BSR Wait_4000 BSR Wait_4000 BSR Wait_4000 BRA.S museset museabo BSR RestorePtrCol CLR GetLineFlag MOVE #0,LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos ShowMultiSetup MOVE #1926,TextOffset MOVE.B MultiModeNext,D0 BSR PrintHexDigit MOVE #1928,TextOffset MOVE.B MultiModeNext+1,D0 BSR PrintHexDigit MOVE #1930,TextOffset MOVE.B MultiModeNext+2,D0 BSR PrintHexDigit MOVE #1932,TextOffset MOVE.B MultiModeNext+3,D0 BRA PrintHexDigit musepos dc.b 0,0 SetRed CMP #82,D0 BHS SelectColor setr2 BSR GetColPos AND #$0F00,D2 LSR #8,D2 CMP.B D2,D0 BEQ.S setrskp AND #$00FF,D1 LSL #8,D0 OR D0,D1 MOVE D1,(A0) BSR ShowColSliders BSR SetScreenColors setrskp BTST #6,$BFE001 BEQ.S setr2 RTS SetGreen CMP #82,D0 BHS SelectColor setg2 BSR.S GetColPos AND #$00F0,D2 LSR #4,D2 CMP.B D2,D0 BEQ.S setgskp AND #$0F0F,D1 LSL #4,D0 OR D0,D1 MOVE D1,(A0) BSR ShowColSliders BSR SetScreenColors setgskp BTST #6,$BFE001 BEQ.S setg2 RTS SetBlue CMP #82,D0 BHS SelectColor setb2 BSR.S GetColPos AND #$000F,D2 CMP.B D2,D0 BEQ.S setbskp AND #$0FF0,D1 OR D0,D1 MOVE D1,(A0) BSR ShowColSliders BSR SetScreenColors setbskp BTST #6,$BFE001 BEQ.S setb2 RTS GetColPos MOVEQ #0,D0 MOVE MouseX,D0 CMP #26,D0 BHS.S gcpskp2 MOVEQ #0,D0 BRA.S gcpskip gcpskp2 SUB #26,D0 DIVU #3,D0 AND.L #$FF,D0 CMP #15,D0 BLS.S gcpskip MOVEQ #15,D0 gcpskip CMP #7,CurrScreen BEQ GetColAddr LEA ColorTable,A0 MOVE CurrColor,D1 ADD D1,D1 LEA (A0,D1.W),A0 MOVE (A0),D1 MOVE D1,D2 RTS ShowColSliders LEA ColSliders(PC),A2 MOVE.L TextBplPtr,A1 ADD.L #3282,A1 BSR.S gcpskip AND #$000F,D1 BSR.S ShowOneSlider MOVE.L TextBplPtr,A1 ADD.L #2842,A1 BSR.S gcpskip AND #$00F0,D1 LSR #4,D1 BSR.S ShowOneSlider MOVE.L TextBplPtr,A1 ADD.L #2402,A1 BSR.S gcpskip AND #$0F00,D1 LSR #8,D1 ShowOneSlider CLR.L (A1) CLR.L 4(A1) CLR.L 40(A1) CLR.L 44(A1) CLR.L 80(A1) CLR.L 84(A1) MOVE D1,D3 ADD D3,D3 ADD D3,D3 MOVE 2(A2,D3.W),D4 MOVE.B 0(A2,D3.W),00(A1,D4.W) MOVE.B 1(A2,D3.W),01(A1,D4.W) MOVE.B 0(A2,D3.W),40(A1,D4.W) MOVE.B 1(A2,D3.W),41(A1,D4.W) MOVE.B 0(A2,D3.W),80(A1,D4.W) MOVE.B 1(A2,D3.W),81(A1,D4.W) RTS ColSliders dc.w %0000000001111100,0 dc.w %0000111110000000,1 dc.w %0000000111110000,1 dc.w %0000000000111110,1 dc.w %0000011111000000,2 dc.w %0000000011111000,2 dc.w %0000000000011111,2 dc.w %0000001111100000,3 dc.w %0000000001111100,3 dc.w %0000111110000000,4 dc.w %0000000111110000,4 dc.w %0000000000111110,4 dc.w %0000011111000000,5 dc.w %0000000011111000,5 dc.w %0000000000011111,5 dc.w %0000001111100000,6 SelectColor CMP #84,D1 BHS Return1 MOVE.L TextBplPtr,A0 LEA 2410(A0),A0 MOVEQ #24,D2 slcloop CLR.L (A0) LEA 40(A0),A0 DBF D2,slcloop SUB #82,D0 DIVU #13,D0 SUB #60,D1 DIVU #6,D1 MOVE D0,D2 LSL #2,D2 ADD D1,D2 MOVE D2,CurrColor MarkColor BSR gcpskip MOVE.L A0,UndoColAddr MOVE D1,UndoCol BSR ShowColSliders BSR.S BlockColors MOVE CurrColor,D0 MOVE D0,D1 AND #$0003,D1 MULU #6*40,D1 MOVE.L TextBplPtr,A0 ADD.L D1,A0 LEA 2410(A0),A0 BTST #2,D0 BNE.S slcskip MOVE #$3FF0,(A0) MOVE #$3FF0,240(A0) MOVEQ #4,D0 slclop2 LEA 40(A0),A0 MOVE #$2010,(A0) DBF D0,slclop2 BRA WaitForButtonUp slcskip MOVE.L #$0001FF80,(A0) MOVE.L #$0001FF80,240(A0) MOVEQ #4,D0 slclop3 LEA 40(A0),A0 MOVE.L #$0001FF80,(A0) DBF D0,slclop3 BRA WaitForButtonUp BlockColors MOVE.L TextBplPtr,A0 LEA 2452(A0),A0 MOVEQ #3,D1 suploop2 MOVEQ #4,D0 suploop3 MOVE.B #$FF,(A0) ADD.L #40,A0 DBF D0,suploop3 ADD.L #40,A0 DBF D1,suploop2 RTS ColorGadgets CMP #79,D0 BHS SetDefaultCol CMP #33,D0 BHS.S CancelCol MOVE.L UndoColAddr,A0 MOVE UndoCol,D0 MOVE (A0),UndoCol MOVE D0,(A0) BSR ShowColSliders BRA SetScreenColors CancelCol LEA CanCols(PC),A0 LEA ColorTable,A1 MOVEQ #7,D0 cacolop MOVE (A0)+,(A1)+ DBF D0,cacolop BSR ShowColSliders BRA SetScreenColors CopyCfgData LEA ColorTable,A0 LEA CanCols(PC),A1 MOVEQ #7,D0 cocclop MOVE (A0)+,(A1)+ DBF D0,cocclop LEA ModulesPath2,A0 MOVE #195,D0 cocclp2 CLR.B (A0)+ DBF D0,cocclp2 LEA ModulesPath,A0 LEA ModulesPath2,A1 BSR.S cocclp3 LEA SongsPath,A0 LEA SongsPath2,A1 BSR.S cocclp3 LEA SamplePath,A0 LEA SamplePath2,A1 cocclp3 MOVE.B (A0)+,(A1)+ BNE.S cocclp3 LEA VUMeterColors,A0 LEA SaveColors,A1 MOVEQ #40+48-1,D0 cocclp4 MOVE (A0)+,(A1)+ DBF D0,cocclp4 RTS UndoCol dc.w 0 UndoColAddr dc.l 0 CanCols dc.w 0,0,0,0,0,0,0,0 SetDefaultCol LEA DefCol,A0 LEA ColorTable,A1 MOVEQ #7,D0 sdcloop MOVE (A0)+,(A1)+ DBF D0,sdcloop BSR ShowColSliders SetScreenColors BSR SetupAnaCols SetScreenColors2 LEA ColorTable,A0 LEA CopCol0,A1 MOVE (A0),(A1) MOVE 2(A0),4(A1) MOVE 4(A0),8(A1) MOVE 6(A0),12(A1) MOVE 8(A0),16(A1) MOVE 10(A0),20(A1) MOVE 12(A0),24(A1) MOVE 14(A0),28(A1) MOVE 14(A0),D0 TST SamScrEnable BEQ.S sscnosc MOVE 8(A0),D0 sscnosc MOVE D0,NoteCol MOVE 10(A0),D0 MOVE D0,D4 MOVE #3,FadeX BSR.S FadeCol MOVE D0,32(A1) MOVE D4,36(A1) MOVE D4,D0 MOVE #-3,FadeX BSR.S FadeCol MOVE D0,40(A1) RTS FadeCol MOVE D0,D1 MOVE D0,D2 MOVE D0,D3 LSR #8,D1 ADD FadeX(PC),D1 BPL.S redskp MOVEQ #0,D1 redskp CMP #15,D1 BLS.S redskp2 MOVEQ #15,D1 redskp2 AND #$00F0,D2 LSR #4,D2 ADD FadeX(PC),D2 BPL.S grnskp MOVEQ #0,D2 grnskp CMP #15,D2 BLS.S grnskp2 MOVEQ #15,D2 grnskp2 AND #$000F,D3 ADD FadeX(PC),D3 BPL.S bluskp MOVEQ #0,D3 bluskp CMP #15,D3 BLS.S bluskp2 MOVEQ #15,D3 bluskp2 MOVE D3,D0 LSL #4,D2 OR D2,D0 LSL #8,D1 OR D1,D0 RTS CurrColor dc.w 0 FadeX dc.w -3 EnterPrintPath BSR StorePtrCol BSR SetWaitPtrCol LEA PrintPath,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #31,TextEndPtr MOVE #12,TextLength MOVE #3694,A4 BSR GetTextLine BRA RestorePtrCol ShowPrintPath LEA PrintPath,A0 MOVE #3694,D1 MOVEQ #12,D0 BRA ShowText3 ; Print Song PrintSong LEA PrintSongText,A0 BSR AreYouSure BNE Return1 BSR StorePtrCol MOVE.L #PrintPath,D1 MOVE.L #1006,D2 MOVE.L DOSBase,A6 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ CantOpenFile BSR SetDiskPtrCol LEA PrintingSongText,A0 BSR ShowStatusText MOVE.L FileHandle,D1 MOVE.L #SongDumpText,D2 MOVEQ #68,D3 MOVE.L DOSBase,A6 JSR LVOWrite(A6) MOVE.L FileHandle,D1 MOVE.L SongDataPtr,D2 MOVEQ #20,D3 JSR LVOWrite(A6) BSR PrintCRLF BSR PrintCRLF BSR PrintSong2 BSR PrintCRLF BSR PrintSong4 BSR PrintFormFeed MOVE.L SongDataPtr,A0 MOVEQ #0,D0 MOVE.B sd_numofpatt(A0),D0 LEA sd_pattpos(A0),A0 MOVEQ #0,D7 ps_loop CMP.B (A0,D0.W),D7 BGT.S ps_skip MOVE.B (A0,D0.W),D7 ps_skip SUBQ #1,D0 BPL.S ps_loop MOVEQ #0,D1 ps_loop2 MOVEM.L D1-D7/A0-A6,-(SP) BSR PrintPattern MOVEM.L (SP)+,D1-D7/A0-A6 TST.L D0 BNE.S ps_skip2 MOVEM.L D1/D7,-(SP) BSR PrintFormFeed MOVEM.L (SP)+,D1/D7 ADDQ #1,D1 CMP D7,D1 BLO.S ps_loop2 ps_skip2 MOVE.L DOSBase,A6 MOVE.L FileHandle,D1 JSR LVOClose(A6) BSR ShowAllRight BRA RestorePtrCol PrintSong2 MOVEQ #1,D7 ps2_2 MOVE.L D7,D0 LSR.B #4,D0 CMP.B #9,D0 BLS.S spujk ADDQ.B #7,D0 spujk ADD.B #'0',D0 MOVE.B D0,PattXText1 MOVE.B D7,D0 AND.B #$0F,D0 CMP.B #9,D0 BLS.S spujk2 ADDQ.B #7,D0 spujk2 ADD.B #'0',D0 MOVE.B D0,PattXText2 MOVE.L SongDataPtr,A0 MOVE D7,D0 MULU #30,D0 LEA -10(A0,D0.W),A0 LEA PpText,A1 MOVEQ #21,D0 ps2_loop MOVE.B #' ',(A1)+ DBF D0,ps2_loop LEA PpText,A1 MOVE.L A0,SavIt ps2_loop2 MOVE.B (A0)+,D0 BEQ PrintSong3 MOVE.B D0,(A1)+ BRA.S ps2_loop2 SavIt dc.l 0 PrintSong3 MOVE.L D7,-(SP) ; pattnum MOVE.L SavIt(PC),A0 MOVE 22(A0),D0 ADD D0,D0 LEA Prafs+2+4,A0 BSR IntToHexASCII MOVE.L SavIt(PC),A0 MOVE 26(A0),D0 ADD D0,D0 LEA Prafs+8+4,A0 BSR IntToHexASCII MOVE.L SavIt(PC),A0 MOVE 28(A0),D0 ADD D0,D0 LEA Prafs+14+4,A0 BSR IntToHexASCII MOVE.L DOSBase,A6 MOVE.L FileHandle,D1 MOVE.L #PtotText,D2 MOVEQ #52,D3 JSR LVOWrite(A6) MOVE.L (SP)+,D7 ADDQ #1,D7 CMP #$0020,D7 BNE ps2_2 RTS PrintSong4 MOVE.L SongDataPtr,A0 MOVEQ #0,D7 MOVE.B sd_numofpatt(A0),D7 LEA sd_pattpos(A0),A0 MOVEQ #0,D5 ps4_loop1 MOVEQ #0,D6 ps4_loop2 MOVEQ #0,D0 MOVE.B (A0)+,D0 MOVE D0,D1 LSR #4,D1 ADD.B #$30,D1 CMP.B #$39,D1 BLS.S ps4_skip ADDQ.B #7,D1 ps4_skip AND.B #15,D0 ADD.B #$30,D0 CMP.B #$39,D0 BLS.S ps4_skip2 ADDQ.B #7,D0 ps4_skip2 LEA PnText,A1 MOVE.B D1,(A1)+ MOVE.B D0,(A1) MOVEM.L D5-D7/A0,-(SP) MOVE.L DOSBase,A6 MOVE.L FileHandle,D1 MOVE.L #PnText,D2 MOVEQ #4,D3 JSR LVOWrite(A6) MOVEM.L (SP)+,D5-D7/A0 ADDQ #1,D5 CMP D5,D7 BEQ Return1 ADDQ #1,D6 CMP #$0010,D6 BNE.S ps4_loop2 MOVEM.L D5-D7/A0,-(SP) BSR.S PrintCRLF MOVEM.L (SP)+,D5-D7/A0 BRA.S ps4_loop1 PrintCRLF MOVE.L DOSBase,A6 MOVE.L FileHandle,D1 MOVE.L #CRLF_Text,D2 MOVEQ #2,D3 JSR LVOWrite(A6) RTS PrintFormFeed MOVE.L DOSBase,A6 MOVE.L FileHandle,D1 MOVE.L #FF_Text,D2 MOVEQ #1,D3 JSR LVOWrite(A6) RTS PrintPattern MOVE.L D1,D6 ; D1=pattern number DIVU #10,D6 ADD.B #'0',D6 MOVE.B D6,PattNumText1 SWAP D6 ADD.B #'0',D6 MOVE.B D6,PattNumText2 MOVEM.L D0-D7/A0-A6,-(SP) MOVE.L FileHandle,D1 MOVE.L #PatternNumText,D2 MOVEQ #18,D3 MOVE.L DOSBase,A6 JSR LVOWrite(A6) MOVEM.L (SP)+,D0-D7/A0-A6 MOVE.L D1,D6 MOVE.L SongDataPtr,A6 LEA sd_patterndata(A6),A6 LSL.L #8,D6 LSL.L #2,D6 ADD.L D6,A6 CLR.L PPattPos MOVEQ #0,D6 pp_posloop MOVEQ #0,D7 MOVE #2,TextLength MOVE.L PPattPos,D1 LEA PattPosText,A5 DIVU #10,D1 ADD.B #'0',D1 MOVE.B D1,(A5)+ CLR D1 SWAP D1 ADD.B #'0',D1 MOVE.B D1,(A5)+ ADDQ.L #5,A5 pp_noteloop MOVEQ #0,D0 MOVEQ #0,D1 MOVE #3,TextLength MOVE (A6),D1 AND #$0FFF,D1 LEA PeriodTable,A0 pp_findloop CMP 0(A0,D0.L),D1 BEQ PrintNote ADDQ.L #2,D0 BRA.S pp_findloop PrintNote ADD.L D0,D0 ADD.L NoteNamesPtr,D0 MOVE.L D0,A0 MOVE.L (A0),(A5)+ CMP.B #'Ħ',-3(A5) BNE.S prnoxyz MOVE.B #'b',-3(A5) prnoxyz ADDQ.L #1,A5 MOVEQ #0,D0 MOVE (A6),D0 AND #$F000,D0 LSR #8,D0 LSL.L #1,D0 LEA FastHexTable,A0 ADD.L D0,A0 MOVE.B (A0),(A5)+ MOVEQ #0,D0 MOVE.B 2(A6),D0 LSL.L #1,D0 LEA FastHexTable,A0 ADD.L D0,A0 MOVE (A0),(A5)+ MOVEQ #0,D0 MOVE.B 3(A6),D0 LSL.L #1,D0 LEA FastHexTable,A0 ADD.L D0,A0 MOVE (A0),(A5)+ ADDQ.L #4,A5 ADDQ.L #4,A6 ADDQ.L #1,D7 CMP.L #4,D7 BNE pp_noteloop ADDQ.L #1,PPattPos MOVEM.L D0-D7/A0-A6,-(SP) MOVE.L DOSBase,A6 MOVE.L FileHandle,D1 MOVE.L #PnText2,D2 MOVEQ #68,D3 JSR LVOWrite(A6) BSR PrintCRLF MOVEM.L (SP)+,D0-D7/A0-A6 BTST #2,$DFF016 BEQ.S NegativeReturn ADDQ.L #1,D6 CMP.L #64,D6 BNE pp_posloop MOVEQ #0,D0 RTS NegativeReturn MOVEQ #-1,D0 RTS PositiveReturn MOVEQ #0,D0 RTS ;---- Setup2 ---- Setup2 BSR WaitForButtonUp MOVE #7,CurrScreen CLR LastSetupScreen ST DisableAnalyzer ST NoSampleInfo BSR Clear100Lines MOVE.L SetupMemPtr,D0 BNE set2skp BSR SaveMainPic BEQ ExitSetup set2skp BSR DecompactSetup2 BSR SetScreenColors refrsh2 BSR ShowIntMode BSR ShowTempo BSR ShowSpeed BSR ShowColEdit BSR ShowRainbow BSR GetColPos BSR ShowColSliders BSR ShowS2Modules BSR ShowS2Songs BSR ShowS2Samples BSR ShowS2PTPath BSR ShowS2MaxPLST BSR ShowS2DMAWait BSR ShowS2TuneNote BSR ShowS2SalvAddr BRA ShowS2T CheckSetup2Gadgs MOVEM.W MouseX2,D0/D1 CMP #210,D0 BHS Setup2Menu3 CMP #108,D0 BHS.S Setup2Menu2 ;---- Menu 1 ---- CMP #11,D1 BLS ToggleIntMode CMP #22,D1 BLS ChangeTempo CMP #33,D1 BLS ChangeSpeed CMP #44,D1 BLS ToggleColEdit CMP #55,D1 BLS RotOrSpread CMP #66,D1 BLS SetRed2 CMP #77,D1 BLS SetGreen2 CMP #88,D1 BLS SetBlue2 CMP #99,D1 BLS ColorGadgets2 RTS Setup2Menu2 CMP #11,D1 BLS Set2ModPath CMP #22,D1 BLS Set2SongPath CMP #33,D1 BLS Set2SamPath CMP #44,D1 BLS Set2PTPath CMP #55,D1 BLS SetS2MaxPLST CMP #66,D1 BLS SetS2DMAWait CMP #77,D1 BLS SetS2TuneNote CMP #88,D1 BLS SetS2SalvAddr CMP #99,D1 BLS RecoverSong RTS Setup2Menu3 CMP #11,D1 BLS ExitOrDefault CMP #22,D1 BLS ToggleOverride CMP #33,D1 BLS ToggleNosamples CMP #44,D1 BLS ToggleBlankZero CMP #55,D1 BLS ToggleShowDirs CMP #66,D1 BLS ToggleShowPublic CMP #77,D1 BLS ToggleCutToBuf CMP #88,D1 BLS ToggleIFFLoop CMP #99,D1 BLS ToggleHH RTS ExitOrDefault CMP #265,D0 BLS.S SetS2Default CMP #306,D0 BHS Setup BRA ExitSetup SetS2Default LEA SetDefaultsText(PC),A0 BSR AreYouSure BNE Return1 LEA DefaultSetupData,A0 LEA DefaultSongsPath,A2 LEA SongsPath,A1 MOVEQ #95,D0 ss2dela MOVE.B (A2)+,(A1)+ DBF D0,ss2dela LEA DefaultPTPath,A2 LEA PTPath,A1 MOVEQ #31,D0 ss2delb MOVE.B (A2)+,(A1)+ DBF D0,ss2delb LEA DefaultMaxPLSTEntries,A2 MOVE (A2),MaxPLSTEntries LEA DefaultDMAWait,A2 MOVE (A2),DMAWait LEA DefaultTuneNote,A2 MOVE.L (A2),TuneNote LEA DefaultSalvageAddress,A2 LEA SalvageAddress,A1 MOVE.L (A2)+,(A1)+ MOVE.L (A2),(A1) BRA refrsh2 SetDefaultsText dc.b "Set defaults?",0 ToggleIntMode BSR ResetMusicInt EOR.B #1,IntMode BSR SetMusicInt BSR SetTempo BSR WaitForButtonUp ShowIntMode LEA VBlankText(PC),A0 TST.B IntMode BEQ.S simskip LEA CIAText(PC),A0 simskip MOVEQ #6,D0 MOVE #167,D1 BRA ShowText3 VBlankText dc.b "VBLANK" CIAText dc.b " CIA " ChangeSpeed MOVEQ #0,D1 CMP #94,D0 BHS.S SpeedDown CMP #80,D0 BHS.S SpeedUp RTS SpeedUp MOVE DefaultSpeed,D1 ADDQ.B #1,D1 CMP.B #$FF,D1 BLS.S spedup2 MOVE #$FF,D1 spedup2 MOVE D1,DefaultSpeed MOVE.L D1,CurrSpeed BSR.S ShowSpeed BSR Wait_4000 BRA Wait_4000 ShowSpeed MOVE #608+440,TextOffset MOVE DefaultSpeed,WordNumber JMP PrintHexByte SpeedDown MOVE DefaultSpeed,D1 SUB.B #1,D1 CMP.B #1,D1 BHS.S spedup2 MOVEQ #1,D1 BRA.S spedup2 ToggleOverride EOR.B #1,OverrideFlag BRA.S ShowS2T ToggleNosamples EOR.B #1,NosamplesFlag BRA.S ShowS2T ToggleBlankZero EOR.B #1,BlankZeroFlag BSR.S ShowS2T BRA RedrawPattern ToggleShowDirs EOR.B #1,ShowDirsFlag BRA.S ShowS2T ToggleShowPublic EOR.B #1,ShowPublicFlag MOVE #1,UpdateFreeMem BRA.S ShowS2T ToggleCutToBuf EOR.B #1,CutToBufFlag BRA.S ShowS2T ToggleIFFLoop EOR.B #1,IFFLoopFlag BRA.S ShowS2T ToggleHH EOR.B #1,HHFlag ShowS2T CLR.B RawKeyCode CMP #7,CurrScreen BNE Return1 LEA OverrideFlag,A4 MOVE #3,TextLength MOVEQ #7,D7 MOVE #636,D6 sstloop2 MOVE D6,TextOffset LEA ToggleOFFText,A0 TST.B (A4)+ BEQ.S sstskip2 LEA ToggleONText,A0 sstskip2 BSR ShowText2 ADD #440,D6 DBF D7,sstloop2 BRA WaitForButtonUp ShowS2Modules MOVE #177,D1 LEA ModulesPath,A0 s2path MOVEQ #9,D0 BRA ShowText3 ShowS2Songs MOVE #177+440,D1 LEA SongsPath,A0 BRA.S s2path ShowS2Samples MOVE #177+880,D1 LEA SamplePath,A0 BRA.S s2path ShowS2PTPath MOVE #177+1320,D1 LEA PTPath,A0 BRA.S s2path Set2ModPath BSR StorePtrCol BSR SetWaitPtrCol LEA ModulesPath,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #31,TextEndPtr MOVE #9,TextLength MOVE #177,A4 BSR GetTextLine BRA RestorePtrCol Set2SongPath BSR StorePtrCol BSR SetWaitPtrCol LEA SongsPath,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #31,TextEndPtr MOVE #9,TextLength MOVE #177+440,A4 BSR GetTextLine BRA RestorePtrCol Set2SamPath BSR StorePtrCol BSR SetWaitPtrCol LEA SamplePath,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #31,TextEndPtr MOVE #9,TextLength MOVE #177+880,A4 BSR GetTextLine BRA RestorePtrCol Set2PTPath BSR StorePtrCol BSR SetWaitPtrCol LEA PTPath,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #31,TextEndPtr MOVE #9,TextLength MOVE #177+1320,A4 BSR GetTextLine BRA RestorePtrCol SetS2MaxPLST CMP #199,D0 BHS.S S2PLSTd CMP #188,D0 BHS.S S2PLSTu RTS S2PLSTu MOVE MaxPLSTEntries,D0 ADD #100,D0 CMP #9999,D0 BLS.S s2pu MOVE #9999,D0 s2pu MOVE D0,MaxPLSTEntries BSR.S ShowS2MaxPLST BRA Wait_4000 S2PLSTd MOVEQ #0,D0 MOVE MaxPLSTEntries,D0 ADDQ #1,D0 DIVU #100,D0 SUBQ #1,D0 BPL.S s2pd MOVEQ #0,D0 BRA.S s2pu s2pd MULU #100,D0 BRA.S s2pu ShowS2MaxPLST MOVE MaxPLSTEntries,WordNumber MOVE #1939,TextOffset BRA Print4DecDigits SetS2DMAWait CMP #199,D0 BHS.S S2dwd CMP #188,D0 BHS.S S2dwu RTS S2dwu MOVE DMAWait,D0 ADDQ #1,D0 BTST #2,$DFF016 BNE.S s2npu ADD #9,D0 s2npu CMP #9999,D0 BLS.S s2du MOVE #9999,D0 s2du MOVE D0,DMAWait BSR.S ShowS2DMAWait BRA Wait_4000 S2dwd MOVE DMAWait,D0 SUBQ #1,D0 BTST #2,$DFF016 BNE.S s2npd SUB #9,D0 s2npd TST D0 BPL.S s2du MOVEQ #0,D0 BRA.S s2du ShowS2DMAWait MOVE DMAWait,WordNumber MOVE #2379,TextOffset BRA Print4DecDigits SetS2TuneNote CMP #187,D0 BHS.S ss2tvol MOVE #2820,D1 MOVEQ #3,D0 LEA SpcNoteText,A0 BSR ShowText3 MOVE #3,SamNoteType MOVE.L #TuneNote,SplitAddress BRA WaitForButtonUp ShowS2TuneNote CMP #7,CurrScreen BNE Return1 MOVE.L NoteNamesPtr,A4 MOVE TuneNote,D0 LSL #2,D0 LEA (A4,D0.W),A0 MOVEQ #4,D0 MOVE #2820,D1 BSR ShowText3 MOVE TToneVol,WordNumber MOVE #2824,TextOffset BRA PrintHexByte ss2tvol MOVE #2824,TextOffset BSR GetHexByte MOVE D0,TToneVol BRA.S ShowS2TuneNote SetS2SalvAddr BRA ShowNotImpl BSR StorePtrCol BSR SetWaitPtrCol LEA SalvageAddress,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #6,TextEndPtr MOVE #6,TextLength MOVE #3260,A4 MOVE.B #5,EnterTextFlag BSR GetTextLine CLR.B EnterTextFlag BSR RestorePtrCol ShowS2SalvAddr LEA SalvageAddress,A0 MOVEQ #6,D0 MOVE #3260,D1 BRA ShowText3 RecoverSong BRA ShowNotImpl LEA RecoverSongText(PC),A0 BSR AreYouSure BNE Return1 BSR DoClearSong BSR ClrSampleInfo BSR.S FindAdr MOVE.L D0,A0 MOVE.L SongDataPtr,A1 MOVE.L #70716,D0 recloop MOVE.B (A0)+,(A1)+ SUBQ.L #1,D0 BNE.S recloop BRA RedrawPattern FindAdr LEA SalvageAddress+6,A0 BSR HexToInteger MOVE D0,D3 MOVEQ #0,D0 BSR HexToInteger2 SWAP D0 OR D3,D0 RTS RecoverSongText dc.b "Recover Song?",0 ToggleColEdit CMP #79,D0 BHS SelectColor2 CLR SpreadFlag LEA VUMeterColors,A0 MOVEQ #48,D0 CMP.L TheRightColors(PC),A0 BNE.S tced2 LEA AnalyzerColors,A0 MOVEQ #36,D0 tced2 MOVE.L A0,TheRightColors MOVE D0,ColorsMax CMP RainbowPos(PC),D0 BHI.S tced3 CLR RainbowPos tced3 BSR ShowRainbow BSR.S ShowColEdit BRA WaitForButtonUp ShowColEdit LEA cedtxt1(PC),A0 LEA VUMeterColors,A1 CMP.L TheRightColors(PC),A1 BEQ.S shcoed LEA cedtxt2(PC),A0 shcoed MOVEQ #6,D0 MOVE #1483,D1 BRA ShowText3 cedtxt1 dc.b "VU-MTR" cedtxt2 dc.b "ANALYZ" RotOrSpread CMP #16,D0 BLO.S RotColUp CMP #32,D0 BLO.S RotColDown CMP #79,D0 BHS SelectColor2 BRA SpreadColors RotColUp CLR SpreadFlag MOVE.L TheRightColors(PC),A0 MOVE (A0),D0 MOVE ColorsMax(PC),D1 SUBQ #2,D1 rocoup1 MOVE 2(A0),(A0)+ DBF D1,rocoup1 MOVE D0,(A0) rocoup2 BSR GetColPos BSR ShowColSliders BSR ShowRainbow BRA SetupVUCols RotColDown CLR SpreadFlag MOVE.L TheRightColors(PC),A0 MOVE ColorsMax(PC),D1 ADD D1,A0 ADD D1,A0 MOVE -(A0),D0 SUBQ #2,D1 rocodn1 MOVE -2(A0),(A0) SUBQ.L #2,A0 DBF D1,rocodn1 MOVE D0,(A0) BRA.S rocoup2 SpreadColors MOVE RainbowPos,SpreadFrom MOVE #1,SpreadFlag RTS SpreadFrom dc.w 0 SpreadFlag dc.w 0 ColorGadgets2 CLR SpreadFlag CMP #79,D0 BHS.S SetDefaultCol2 CMP #33,D0 BHS.S CancelCol2 MOVE.L UndoColAddr,A0 MOVE UndoCol,D1 MOVE (A0),UndoCol MOVE D1,(A0) BRA rocoup2 SetDefaultCol2 MOVE.L TheRightColors(PC),A0 MOVE.L A0,A1 SUB.L #SetupData,A1 ADD.L #DefaultSetupData,A1 sedeco4 MOVE ColorsMax,D0 BRA.S sedeco3 sedeco2 MOVE (A1)+,(A0)+ sedeco3 DBF D0,sedeco2 BRA rocoup2 CancelCol2 MOVE.L TheRightColors(PC),A0 MOVE.L A0,A1 SUB.L #VUMeterColors,A1 ADD.L #SaveColors,A1 BRA.S sedeco4 GetColAddr MOVE.L TheRightColors(PC),A0 MOVE RainbowPos,D1 ADD D1,D1 LEA (A0,D1.W),A0 MOVE (A0),D1 MOVE D1,D2 RTS SetRed2 CMP #79,D0 BHS SelectColor2 set2r2 BSR GetColPos AND #$0F00,D2 LSR #8,D2 CMP.B D2,D0 BEQ.S setrsk2 AND #$00FF,D1 LSL #8,D0 OR D0,D1 MOVE D1,(A0) BSR ShowColSliders BSR ShowRainbow BSR SetupVUCols setrsk2 BTST #6,$BFE001 BEQ.S set2r2 RTS SetGreen2 CMP #79,D0 BHS SelectColor2 set2g2 BSR GetColPos AND #$00F0,D2 LSR #4,D2 CMP.B D2,D0 BEQ.S setgsk2 AND #$0F0F,D1 LSL #4,D0 OR D0,D1 MOVE D1,(A0) BSR ShowColSliders BSR ShowRainbow BSR SetupVUCols setgsk2 BTST #6,$BFE001 BEQ.S set2g2 RTS SetBlue2 CMP #79,D0 BHS.S SelectColor2 set2b2 BSR GetColPos AND #$000F,D2 CMP.B D2,D0 BEQ.S setbsk2 AND #$0FF0,D1 OR D0,D1 MOVE D1,(A0) BSR ShowColSliders BSR ShowRainbow BSR SetupVUCols setbsk2 BTST #6,$BFE001 BEQ.S set2b2 RTS SelectColor2 MOVEQ #0,D7 setcolp BTST #6,$BFE001 BNE.S ChkSpread MOVE ColorsMax(PC),D0 MOVE MouseY,D1 CMP D7,D1 BEQ.S setcolp MOVE D1,D7 CMP #37,D1 BHS.S setcoly MOVEQ #37,D1 setcoly SUB #37,D1 CMP D0,D1 BLT.S setcol2 MOVE D0,D1 SUBQ #1,D1 setcol2 MOVE D1,RainbowPos BSR ShowRainbow BSR GetColPos MOVE.L A0,UndoColAddr MOVE D1,UndoCol BSR ShowColSliders BRA setcolp ChkSpread TST SpreadFlag BEQ Return1 CLR SpreadFlag BSR GetColPos MOVE SpreadFrom,D0 MOVE RainbowPos,D1 CMP D1,D0 BLO.S chkspr2 EXG D0,D1 chkspr2 MOVE D1,D4 SUB D0,D4 CMP #1,D4 BLS Return1 MOVE.L D4,A2 ADD D4,D4 MOVE.L TheRightColors(PC),A0 MOVE.L A0,A1 ADD D0,D0 ADD D1,D1 LEA (A0,D0.W),A0 ; 1st col MOVE (A0),D2 LEA (A1,D1.W),A1 MOVE (A1),D3 ; 2nd col MOVEQ #0,D5 sprdlop MOVE D2,D0 ; red LSR #8,D0 MOVE D3,D1 LSR #8,D1 BSR ColCrossfade LSL #8,D0 MOVE D0,D7 MOVE D2,D0 ; green LSR #4,D0 AND #$000F,D0 MOVE D3,D1 LSR #4,D1 AND #$000F,D1 BSR ColCrossfade LSL #4,D0 OR D0,D7 MOVE D2,D0 ; blue AND #$000F,D0 MOVE D3,D1 AND #$000F,D1 BSR ColCrossfade OR D0,D7 ADDQ #2,D5 MOVE D7,(A0)+ CMP.L A1,A0 BLO sprdlop BRA rocoup2 ColCrossfade MOVE D4,D6 SUB D5,D6 MULU D6,D0 ADD.L A2,D0 MULU D5,D1 ADD D1,D0 DIVU D4,D0 CMP #15,D0 BLS Return1 MOVEQ #15,D0 RTS ShowRainbow MOVE.L TextBplPtr,A0 LEA 1490(A0),A0 MOVEQ #0,D1 MOVE.L #$00FFE000,D2 MOVE RainbowPos,D3 rainlop MOVE.L D2,D0 CMP D3,D1 BNE.S rainsk1 MOVE.L #$1EFFEF00,D0 rainsk1 MOVE.L D0,(A0) LEA 40(A0),A0 ADDQ #1,D1 CMP #48,D1 BLO.S rainlop LEA CopListAnalyzer,A0 MOVE.L TheRightColors(PC),A1 MOVE #$5107,D0 MOVEQ #47,D1 MOVEQ #0,D2 rainlp2 MOVE D0,(A0)+ MOVE #$FFFE,(A0)+ MOVE #$018E,(A0)+ CMP ColorsMax(PC),D2 BLO.S rainsk2 CLR (A0)+ BRA.S rainsk3 rainsk2 MOVE (A1)+,(A0)+ rainsk3 ADD #$0100,D0 ADDQ #1,D2 DBF D1,rainlp2 MOVEQ #63,D0 rainlp3 MOVE.L #$01B80000,(A0)+ DBF D0,rainlp3 RTS RainbowPos dc.w 0 TheRightColors dc.l 0 ColorsMax dc.w 48 ;---- PT Decompacter ---- ; A0...source packed screen | A1...pointer to raw screen ; D0...length of packed data ; Decompact MOVE.L A0,CompPtr MOVE.L D0,CompLen BSR.S FreeDecompMem MOVE.L CompPtr(PC),A0 CMP.L #'FORM',(A0) ;if IFF doit else old pak format BEQ DecompactIFF MOVE.L (A0),D0 MOVE.L D0,DecompMemSize MOVEQ #0,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,DecompMemPtr BEQ OutOfMemErr MOVE.L D0,A1 MOVE.L CompPtr(PC),A0 MOVE.L CompLen(PC),D0 ADDQ.L #4,A0 SUBQ.L #4,D0 dcmloop MOVE.B (A0)+,D1 CMP.B #181,D1 BEQ.S DecodeIt MOVE.B D1,(A1)+ decom2 SUBQ.L #1,D0 CMP.L #0,D0 BGT.S dcmloop MOVE.L DecompMemPtr,A1 MOVEQ #-1,D0 RTS DecodeIt MOVEQ #0,D1 MOVE.B (A0)+,D1 MOVE.B (A0)+,D2 dcdloop MOVE.B D2,(A1)+ DBF D1,dcdloop SUBQ.L #2,D0 BRA.S decom2 FreeDecompMem MOVE.L DecompMemPtr,D0 BEQ .nomem MOVE.L D0,A1 MOVE.L DecompMemSize,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) CLR.L DecompMemPtr .nomem RTS CompPtr dc.l 0 CompLen dc.l 0 ; --- if crunched IFF then go 4 it!! DecompactIFF MOVE.L A0,pic_buf MOVEM.L D0-7/A0-A6,-(SP) BSR iff_search MOVEM.L (SP)+,D0-7/A0-6 MOVE width_bytes(pc),D0 MULU height(pc),D0 MULU planes_num(pc),D0 MOVE.L D0,DecompMemSize MOVE.L #$10000,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,DecompMemPtr BEQ OutOfMemErr MOVE.L D0,bitplane ;store where to decompact into BSR colors_init BSR unpacker MOVE.L DecompMemPtr,A1 MOVEQ #-1,D0 RTS *-------------------------------------------------------------------* ; this de-packs an iff file into bitmap using pic_buf doiff bsr iff_search bsr colors_init bsr unpacker rts ********************** resulting output info.. width dc.w 320 ;pixels height dc.w 200 modes dc.l $12345678 planes dcb.l 6,0 bitplane dc.l $40000 ;start address of output bitmap color_map dcb.w 64,0 ********************** iff_search move.l pic_buf(pc),a0 ;address of IFF file add.l #4+8,a0 move.l a0,bmhd_chunk move.l 4(a0),d0 add.l d0,a0 addq.l #8,a0 move.l a0,cmap_chunk iff_l1 move.l 4(a0),d0 add.l d0,a0 addq.l #8,a0 move.l #"BODY",d1 cmp.l (a0),d1 bne.s iff_l1 move.l a0,body_chunk move.l bmhd_chunk(pc),a2 move.l a2,a1 add.l #16,a1 moveq #0,d0 move.b (a1),d0 cmp #6,d0 blt.s iff_cont moveq #6,d0 iff_cont move d0,planes_num move.l a2,a1 add.l #18,a1 move.b (a1),comp_flag move.l a2,a1 addq.l #8,a1 moveq #0,d0 move (a1)+,d0 move d0,width moveq #0,d3 cmp #640,d0 blt.s iff_cont3 or.w #$8000,d3 iff_cont3 move d0,d1 and #7,d1 beq.s iff_cont2 or #8,d0 iff_cont2 lsr #3,d0 ;divu #8,D0 move d0,width_bytes moveq #0,d0 move (a1),d0 move d0,height cmp #400,d0 blt.s iff_cont4 or #4,d3 iff_cont4 move d3,modes rts ******** colors initialize ******** colors_init move.l cmap_chunk(pc),a0 addq.l #8,a0 lea color_map(pc),a1 moveq #31,d7 ;number of colors!! co_loop1 moveq #0,d0 move.b (a0)+,d0 and.b #$f0,d0 lsl.w #4,d0 move.b (a0)+,d0 and.w #$0ff0,d0 moveq #0,d1 move.b (a0)+,d1 lsr.b #4,d1 and.b #$0f,d1 or.b d1,d0 move.w d0,(a1)+ dbf d7,co_loop1 rts ***************************************************************** *­­­­­­­­­­­­ U N P A C K E R (fast) ­­­­­­­­­­­­­­­­­­­ ***************************************************************** unpacker lea planes(pc),a2 moveq #5,d7 move.l bitplane(pc),d6 moveq #0,d0 move width_bytes(pc),d0 mulu height(pc),d0 fillad move.l d6,(a2)+ add.l d0,d6 dbf d7,fillad lea planes(pc),a2 move.l body_chunk(pc),a0 lea 4(a0),a0 move.l (a0),d7 move.l a0,a3 add.l d7,a3 lea 2(a3),a3 lea 4(a0),a0 move planes_num(pc),d2 ;number of planes loop cntr unp_loop cmp.l a3,a0 bgt.s unpacker-2 moveq #0,d3 pic_loop1 move.l d3,d4 lsl #2,d4 ;mulu #4,d4 move.l (a2,d4.w),a5 bsr.s unpack_row move.l a5,(a2,d4.w) addq #1,d3 ;add 1 to plane count cmp d2,d3 ;if hit max then stop end blt.s pic_loop1 move.l bmhd_chunk(pc),a5 and.b #1,17(a5) beq.s unp_loop lea mask_dummy(pc),a5 bsr.s unpack_row bra.s unp_loop unpack_row move.l d2,-(sp) move width_bytes(pc),d2 unp_loop1 cmp.l a3,a0 bgt.s unpack_row_end tst d2 beq.s unpack_row_end moveq #0,d0 tst comp_flag bne.s unp_comp move width_bytes(pc),d0 subq #1,d0 bra.s unp_loop2 unp_comp move.b (a0)+,d0 ;copy it bmi.s packed and #$7f,d0 unp_loop2 sub d0,d2 subq #1,d2 unp_loop2a move.b (a0)+,(a5)+ dbf d0,unp_loop2a bra.s unp_loop1 packed neg.b d0 ;fill it and #$7f,d0 move.b (a0)+,d1 unp_loop3 sub d0,d2 subq #1,d2 unp_loop3a move.b d1,(a5)+ dbf d0,unp_loop3a bra.s unp_loop1 unpack_row_end move.l (sp)+,d2 unpack_end rts *------------- chunk-Data ---------------* bmhd_chunk dc.l 0 ;address of IFF file + 12 cmap_chunk dc.l 0 ;address of Color MAP body_chunk dc.l 0 ;address of the packed BitMAP planes_num dc.l 0 comp_flag dc.l 0 width_bytes dc.w 0 ;width of screen pixels/8 pic_buf dc.l 0 mask_dummy dcb.l 32,0 ;---- Position Insert/Delete Gadgets ---- PosInsDelGadgs MOVE MouseY2,D0 CMP #11,D0 BHS Return1 MOVE MouseX2,D0 CMP #62,D0 BHS Return1 CMP #51,D0 BHS.S PosDelete CMP #40,D0 BHS.S PosInsert RTS PosInsert MOVE.L SongDataPtr,A0 LEA sd_pattpos(A0),A0 ADD.L #126,A0 MOVEQ #127,D0 MOVE.L CurrPos,D1 AND.L #127,D1 posinloop MOVE.B (A0),1(A0) SUBQ.L #1,A0 SUBQ.L #1,D0 CMP.L D1,D0 BHI.S posinloop MOVE.B PatternNumber+3,1(A0) BSR PositionUp CLR UpOrDown BSR SongLengthGadg BRA WaitForButtonUp PosDelete MOVE.L SongDataPtr,A0 LEA sd_pattpos(A0),A0 MOVE.L CurrPos,D0 AND.L #127,D0 ADD.L D0,A0 posdeloop MOVE.B 1(A0),(A0) ADDQ.L #1,A0 ADDQ.L #1,D0 CMP.L #127,D0 BLS.S posdeloop CLR.B -1(A0) BSR ShowPosition MOVE #-1,UpOrDown BSR SongLengthGadg BRA WaitForButtonUp ;---- Enter number gadg ---- EnterNumGadg MOVE MouseY2,D1 CMP #11,D1 BLO EnterPosGadg CMP #22,D1 BLO EnterPattGadg CMP #33,D1 BLO EnterLenGadg RTS EnterPosGadg CLR.B RawKeyCode MOVE #76,LineCurX MOVE #10,LineCurY MOVE #169,TextOffset BSR GetDec3Dig TST AbortDecFlag BNE pogskip CMP #127,D0 BLS.S eposgok MOVEQ #127,D0 eposgok MOVE.L D0,CurrPos BRA pogskip EnterPattGadg CLR.B RawKeyCode MOVE #84,LineCurX MOVE #21,LineCurY MOVE #610,TextOffset BSR GetDecByte TST AbortDecFlag BNE pogskip CMP.B #63,D0 BLS.S epgok MOVEQ #63,D0 epgok MOVE.L SongDataPtr,A0 LEA sd_pattpos(A0),A0 ADD.L CurrPos,A0 MOVE.B D0,(A0) BRA pogskip EnterLenGadg CLR.B RawKeyCode MOVE #76,LineCurX MOVE #32,LineCurY MOVE #1049,TextOffset BSR GetDec3Dig TST AbortDecFlag BNE ShowSongLength CMP #128,D0 BLS.S elengok MOVE.B #128,D0 elengok MOVE.L SongDataPtr,A0 LEA sd_numofpatt(A0),A0 MOVE.B D0,(A0) BRA ShowSongLength GetDec3Dig MOVE #1,AbortDecFlag BSR StorePtrCol BSR SetWaitPtrCol BSR UpdateLineCurPos gd3loop BSR GetKey0_9 CMP #68,D1 BEQ.S gd3exit CMP #2,D1 BHI.S gd3loop MOVE D1,D0 MULU #100,D0 MOVE D0,gd3temp BSR ShowOneDigit ADDQ #8,LineCurX BSR UpdateLineCurPos BSR GetKey0_9 CMP.B #68,D1 BEQ.S gd3exit MOVE D1,D0 MULU #10,D0 ADD D0,gd3temp BSR ShowOneDigit ADDQ #8,LineCurX BSR UpdateLineCurPos BSR GetKey0_9 CMP.B #68,D1 BEQ.S gd3exit ADD D1,gd3temp CLR AbortDecFlag gd3exit CLR LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos BSR RestorePtrCol MOVEQ #0,D0 MOVE gd3temp(PC),D0 RTS gd3temp dc.w 0 ;---- Up/Down Gadgets ---- DownGadgets MOVE #1,UpdateFreeMem MOVE #-1,UpOrDown BRA.S ug2 UpGadgets MOVE #1,UpdateFreeMem CLR UpOrDown ug2 MOVE MouseY2,D0 CMP #100,D0 BHS Return1 CMP #89,D0 BHS RepLenGadg CMP #78,D0 BHS RepeatGadg CMP #67,D0 BHS SampleLengthGadg CMP #56,D0 BHS VolumeGadg CMP #45,D0 BHS SampleNumGadg CMP #34,D0 BHS FineTuneGadg CMP #23,D0 BHS SongLengthGadg CMP #12,D0 BHS PatternGadg TST MouseY2 BHS.S PositionGadg RTS PositionGadg TST UpOrDown BMI.S PositionDown PositionUp ADDQ.L #1,CurrPos BTST #2,$DFF016 BNE.S pogskp2 ADD.L #9,CurrPos pogskp2 CMP.L #127,CurrPos BLS.S pogskip MOVE.L #127,CurrPos pogskip MOVE.L CurrPos,SongPosition BSR ShowPosition BSR Wait_4000 BSR Wait_4000 BRA Wait_4000 PositionDown SUBQ.L #1,CurrPos BTST #2,$DFF016 BNE.S pogskp3 SUB.L #9,CurrPos pogskp3 TST.L CurrPos BPL.S pogskip CLR.L CurrPos BRA.S pogskip PatternGadg MOVE.L SongDataPtr,A0 LEA sd_pattpos(A0),A0 TST UpOrDown BMI.S PatternDown PatternUp ADD.L CurrPos,A0 ADDQ.B #1,(A0) BTST #2,$DFF016 BNE.S pagaskp ADD.B #9,(A0) pagaskp CMP.B #63,(A0) BLS.S pogskip MOVE.B #63,(A0) BRA.S pogskip PatternDown ADD.L CurrPos,A0 SUBQ.B #1,(A0) BTST #2,$DFF016 BNE.S padoskp SUB.B #9,(A0) padoskp TST.B (A0) BPL pogskip CLR.B (A0) BRA pogskip SongLengthGadg MOVE.L SongDataPtr,A0 LEA sd_numofpatt(A0),A0 TST UpOrDown BMI.S SongLengthDown SongLengthUp ADDQ.B #1,(A0) BTST #2,$DFF016 BNE.S slupskp ADD.B #9,(A0) slupskp CMP.B #127,(A0) BMI.S solgskip MOVE.B #127,(A0) solgskip BSR ShowSongLength BSR Wait_4000 BSR Wait_4000 BRA Wait_4000 SongLengthDown SUBQ.B #1,(A0) BTST #2,$DFF016 BNE.S sldoskp SUB.B #9,(A0) sldoskp CMP.B #1,(A0) BGE.S solgskip MOVE.B #1,(A0) BRA.S solgskip SampleNumGadg BTST #2,$DFF016 ; Check Right Mousebutton BNE.S SampleNum2 TST InsNum BEQ ShowSampleInfo MOVE InsNum,LastInsNum CLR InsNum BRA ShowSampleInfo SampleNum2 TST UpOrDown BMI.S SampleNumDown SampleNumUp ADDQ #1,InsNum CMP #31,InsNum BMI.S snuskip MOVE #31,InsNum snuskip BSR redrsam BSR Wait_4000 BRA Wait_4000 SampleNumDown TST InsNum BEQ.S snuskip SUBQ #1,InsNum CMP #1,InsNum BPL.S snuskip MOVE #1,InsNum BRA.S snuskip FineTuneGadg MOVE.L SongDataPtr,A0 LEA 12(A0),A0 MOVE InsNum,D0 BEQ Return1 MULU #30,D0 ADD.L D0,A0 BTST #2,$DFF016 BNE.S ftgskip CLR.B 2(A0) BRA.S ftuskip ftgskip TST UpOrDown BMI.S FineTuneDown FineTuneUp AND.B #$0F,2(A0) CMP.B #7,2(A0) BEQ.S ftuskip ADDQ.B #1,2(A0) AND.B #$0F,2(A0) ftuskip BSR ShowSampleInfo BSR Wait_4000 BRA Wait_4000 FineTuneDown AND.B #$0F,2(A0) CMP.B #8,2(A0) BEQ.S ftuskip SUBQ.B #1,2(A0) AND.B #$0F,2(A0) BRA.S ftuskip VolumeGadg MOVE.L SongDataPtr,A0 LEA 12(A0),A0 MOVE InsNum,D0 BEQ Return1 MULU #30,D0 ADD.L D0,A0 TST UpOrDown BMI.S VolumeDown VolumeUp ADDQ.B #1,3(A0) BTST #2,$DFF016 BNE.S voupskp ADD.B #15,3(A0) voupskp CMP.B #$40,3(A0) BLS.S ftuskip MOVE.B #$40,3(A0) BRA.S ftuskip VolumeDown SUBQ.B #1,3(A0) BTST #2,$DFF016 BNE.S vodoskp SUB.B #15,3(A0) vodoskp TST.B 3(A0) BPL ftuskip CLR.B 3(A0) BRA ftuskip SampleLengthGadg MOVE #1,SampleLengthFlag MOVE.L SongDataPtr,A0 LEA 12(A0),A0 MOVEQ #0,D0 MOVE InsNum,D0 BEQ ShowSampleInfo MULU #30,D0 ADD.L D0,A0 TST UpOrDown BMI.S SampleLengthDown SampleLengthUp ADDQ #1,(A0) BTST #2,$DFF016 BNE.S sluskip CMP #$7FF0,(A0) BHS.S sluskip ADDQ #7,(A0) sluskip CMP #$7FFF,(A0) BLO ShowSampleInfo MOVE #$7FFF,(A0) BRA ShowSampleInfo SampleLengthDown MOVE 4(A0),D0 ADD 6(A0),D0 SUBQ #1,(A0) BTST #2,$DFF016 BNE.S sldskip SUBQ #7,(A0) sldskip BMI.S sldskip2 CMP (A0),D0 BLS ShowSampleInfo MOVE D0,(A0) BRA ShowSampleInfo sldskip2 CLR (A0) BRA ShowSampleInfo SampleLengthFlag dc.w 0 CheckSampleLength TST SampleLengthFlag BEQ Return1 CLR SampleLengthFlag MOVEQ #0,D0 MOVE InsNum,D0 BEQ Return1 MOVE.L SongDataPtr,A0 LEA 12(A0),A0 MOVE.L D0,D1 LSL #2,D1 MULU #30,D0 ADD.L D0,A0 LEA SamplePtrs,A1 LEA (A1,D1.W),A1 MOVE.L A0,PlaySamPtr MOVE.L A1,RealSamPtr MOVE.L 124(A1),D0 LSR.L #1,D0 MOVE (A0),D1 CMP D0,D1 BHI.S ItsTooMuch RTS ItsTooMuch LEA AddWorkSpaceText(PC),A0 BSR AreYouSure BNE.S RestoreLength BSR TurnOffVoices MOVE.L PlaySamPtr,A0 MOVEQ #0,D0 MOVE (A0),D0 LSL.L #1,D0 MOVE.L D0,SamAllocLen MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,SamAllocPtr BEQ.S RestoreLength MOVE.L D0,A1 MOVE.L RealSamPtr,A0 MOVE.L (A0),D0 BEQ.S nosamth MOVE.L D0,A2 MOVE.L 124(A0),D1 BEQ.S nosamth SUBQ.L #1,D1 cpsalop MOVE.B (A2)+,(A1)+ DBF D1,cpsalop MOVE.L (A0),A1 MOVE.L 124(A0),D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) nosamth MOVE.L RealSamPtr,A0 MOVE.L SamAllocPtr,(A0) MOVE.L SamAllocLen,124(A0) BSR ShowSampleInfo BSR RedrawSample BRA WaitForButtonUp RestoreLength MOVE.L PlaySamPtr,A0 MOVE.L RealSamPtr,A1 MOVE.L 124(A1),D0 LSR.L #1,D0 MOVE D0,(A0) BRA ShowSampleInfo AddWorkSpaceText dc.b 'add workspace ?',0 PlaySamPtr dc.l 0 RealSamPtr dc.l 0 SamAllocPtr dc.l 0 SamAllocLen dc.l 0 RepeatGadg MOVE.L SongDataPtr,A0 LEA 12(A0),A0 MOVEQ #0,D0 MOVE InsNum,D0 BEQ ShowSampleInfo MULU #30,D0 ADD.L D0,A0 TST UpOrDown BMI.S RepeatDown RepeatUp ADDQ #1,4(A0) BTST #2,$DFF016 BNE.S ruskip ADDQ #7,4(A0) ruskip MOVE (A0),D0 ; Length BEQ.S ruskip2 SUB 6(A0),D0 ; - RepLen CMP 4(A0),D0 BHI.S ruskip2 MOVE D0,4(A0) ruskip2 BSR ShowSampleInfo BSR UpdateRepeats BRA SetLoopSprites2 RepeatDown SUBQ #1,4(A0) BTST #2,$DFF016 BNE.S rdskip SUBQ #7,4(A0) rdskip TST 4(A0) BPL.S ruskip2 CLR 4(A0) BRA.S ruskip2 RepLenGadg MOVE.L SongDataPtr,A0 LEA 12(A0),A0 MOVEQ #0,D0 MOVE InsNum,D0 BEQ ShowSampleInfo MULU #30,D0 ADD.L D0,A0 TST UpOrDown BMI.S RepLenDown RepLenUp ADDQ #1,6(A0) BTST #2,$DFF016 ; Check Right Mousebutton BNE.S rluskip ADDQ #7,6(A0) rluskip MOVE (A0),D0 BEQ.S ruskip2 SUB 4(A0),D0 CMP 6(A0),D0 BHI.S ruskip2 BRA.S rldskip RepLenDown MOVEQ #0,D0 MOVE 6(A0),D0 SUBQ.L #1,D0 BTST #2,$DFF016 BNE.S rldskip SUBQ.L #7,D0 rldskip CMP.L #1,D0 BGE.S rldskp2 MOVEQ #1,D0 rldskp2 MOVE D0,6(A0) BRA ruskip2 Wait_4000 MOVE #$4000,D0 TST.B HHFlag BEQ.S wl_loop MOVE #$FFFF,D0 wl_lop1 DBF D0,wl_lop1 MOVE #$A000,D0 wl_loop DBF D0,wl_loop RTS UpdateRepeats LEA audchan1temp,A1 LEA $DFF0A0,A2 LEA ScopeInfo,A3 BSR.S upre2 LEA audchan2temp,A1 LEA $DFF0B0,A2 LEA ScopeInfo+20,A3 BSR.S upre2 LEA audchan3temp,A1 LEA $DFF0C0,A2 LEA ScopeInfo+40,A3 BSR.S upre2 LEA audchan4temp,A1 LEA $DFF0D0,A2 LEA ScopeInfo+60,A3 upre2 MOVE InsNum,D0 CMP.B n_samplenum(A1),D0 BNE Return1b MOVE.L n_start(A1),A1 MOVEQ #0,D0 MOVE 4(A0),D0 ; repeat ADD.L D0,A1 ADD.L D0,A1 MOVE.L A1,(A2) MOVE 6(A0),D0 MOVE D0,4(A2) ; replen MOVE.L A1,ns_repeatptr(A3) ADD.L D0,A1 ADD.L D0,A1 MOVE.L A1,ns_rependptr(A3) Return1b RTS SetPatternPos MOVE.L PatternPosition,D0 LSR.L #4,D0 BRA.S ssppskip SetScrPatternPos MOVE ScrPattPos,D0 ssppskip TST SamScrEnable BNE Return1b MOVE D0,PlayFromPos MULU #7*40,D0 MOVE.L TextBplPtr,A0 LEA 5560(A0),A0 ADD.L A0,D0 MOVE.L CopListBpl4Ptr(PC),A1 MOVE D0,6(A1) SWAP D0 MOVE D0,2(A1) RTS PlayFromPos dc.w 0 WantedPattGadg TST SamScrEnable BNE CheckSamGadgets TypeInWantedPatt CMP #138,D1 BHI.S tiwp2 CMP #25,D0 BHI TempoGadg tiwp2 CMP.L #'patp',RunMode ; not if a song is playing... BEQ Return1b CLR.B RawKeyCode MOVE #12,LineCurX MOVE #$0086,LineCurY MOVE #5121,TextOffset BSR GetDecByte TST AbortDecFlag BNE.S twexit MOVE.B D0,PatternNumber+3 CMP.L #63,PatternNumber BLS.S twexit MOVE.L #63,PatternNumber twexit BRA RedrawPattern GetKey0_9 BTST #2,$DFF016 BEQ.S gk_ret MOVEQ #0,D0 BSR DoKeyBuffer MOVE.B RawKeyCode,D0 BEQ.S GetKey0_9 CLR.B RawKeyCode CMP.B #68,D0 BEQ.S gk_ret CMP.B #69,D0 BEQ.S gk_ret CMP.B #10,D0 BEQ.S gk_end BHI.S GetKey0_9 CMP.B #1,D0 BLO.S GetKey0_9 MOVE.L D0,D1 RTS gk_end MOVEQ #0,D1 RTS gk_ret MOVEQ #68,D1 RTS ShowOneDigit ADD.B #'0',D1 MOVE.B D1,NumberText CLR D1 SWAP D1 MOVE #1,TextLength MOVE.L #NumberText,ShowTextPtr BSR ShowText CLR.L NumberText CLR WordNumber RTS ;---- Get Text Line ---- GetTextLine MOVEQ #0,D0 MOVE A4,D0 DIVU #40,D0 ADDQ #5,D0 MOVE D0,LineCurY SWAP D0 LSL #3,D0 ADDQ #4,D0 MOVE D0,LineCurX BSR UpdateLineCurPos MOVE.L ShowTextPtr,DSTPtr CLR.L DSTOffset CLR.L DSTPos MOVE #1,GetLineFlag MOVE.L A4,A5 MOVE LineCurX,D5 CLR.B RawKeyCode BSR UpdateText WaitForKey BTST #2,$DFF016 BEQ AbortGetLine BTST #6,$BFE001 BEQ LineClicked BSR DoKeyBuffer MOVEQ #0,D1 MOVE.B RawKeyCode,D1 BEQ.S WaitForKey CMP.B #78,D1 BEQ MoveCharRight CMP.B #79,D1 BEQ MoveCharLeft CMP.B #70,D1 BEQ DeleteChar CMP.B #65,D1 BEQ BackspaceChar CMP.B #68,D1 BEQ GetLineReturn CMP.B #69,D1 BEQ GetLineReturn BTST #7,D1 BNE.S WaitForKey LEA UnshiftedKeymap,A4 TST ShiftKeyStatus BEQ.S gtlskip LEA ShiftedKeymap,A4 gtlskip AND #$007F,D1 CMP.B #64,D1 BHI.S WaitForKey MOVE.B (A4,D1.W),D1 BEQ.S WaitForKey TST.B EnterTextFlag BEQ.S TextLineKey CMP.B #'0',D1 BLO WaitForKey CMP.B #'f',D1 BHI WaitForKey CMP.B #'a',D1 BHS.S TextLineKey CMP.B #'9',D1 BHI WaitForKey TextLineKey CMP.L TextEndPtr,A6 BEQ WaitForKey MOVE.L TextEndPtr,A4 tlkloop MOVE.B -(A4),1(A4) CMP.L A4,A6 BNE.S tlkloop MOVE.L TextEndPtr,A4 CLR.B (A4) MOVE.B D1,(A6)+ BSR PosMoveRight BSR UpdateText CLR.B RawKeyCode BRA WaitForKey LineClicked MOVE MouseY,D1 SUB LineCurY,D1 CMP #2,D1 BGT GetLineReturn CMP #-8,D1 BLT GetLineReturn MOVE MouseX,D1 SUB LineCurX,D1 ADDQ #4,D1 ASR #3,D1 BEQ WaitForKey BPL.S linclri CMP.L DSTPtr(PC),A6 BEQ WaitForKey SUBQ.L #1,A6 BSR PosMoveLeft upwake2 BSR UpdateText BRA WaitForKey linclri CMP.L TextEndPtr,A6 BEQ WaitForKey TST.B (A6) BEQ WaitForKey ADDQ.L #1,A6 BSR PosMoveRight BRA.S upwake2 PosMoveRight MOVE.L DSTPos,D0 MOVEQ #0,D1 MOVE TextLength,D1 TST.B EnterTextFlag BNE.S pmrskip SUBQ #1,D1 pmrskip CMP.L D1,D0 BLO.S posrok ADDQ.L #1,DSTOffset BRA UpdateLineCurPos posrok ADDQ.L #1,DSTPos ADDQ #8,LineCurX BRA UpdateLineCurPos PosMoveLeft TST.L DSTPos BNE.S poslok SUBQ.L #1,DSTOffset BRA UpdateLineCurPos poslok SUBQ.L #1,DSTPos SUBQ #8,LineCurX BRA UpdateLineCurPos BackspaceChar CMP.L DSTPtr(PC),A6 BEQ WaitForKey SUBQ.L #1,A6 MOVE.L A6,A4 dobaloop MOVE.B 1(A4),(A4)+ CMP.L TextEndPtr,A4 BNE.S dobaloop BSR PosMoveLeft upwake BSR UpdateText BSR Wait_4000 BSR Wait_4000 BSR Wait_4000 BRA WaitForKey DeleteChar MOVE.L A6,A4 dechloop MOVE.B 1(A4),(A4)+ CMP.L TextEndPtr,A4 BLO.S dechloop BRA.S upwake MoveCharRight CMP.L TextEndPtr,A6 BEQ WaitForKey TST.B (A6) BEQ WaitForKey ADDQ.L #1,A6 BSR PosMoveRight BRA.S upwake MoveCharLeft CMP.L DSTPtr(PC),A6 BEQ WaitForKey SUBQ.L #1,A6 BSR PosMoveLeft BRA.S upwake GetLineReturn MOVE.L DSTPtr,A6 CMP.B #1,EnterTextFlag BNE.S gtl_rskip TST.B DiskNumText2 BEQ WaitForKey gtl_rskip CMP.B #3,EnterTextFlag BNE.S gtl_rskip2 TST.B SndDiskNum1 BEQ WaitForKey gtl_rskip2 MOVE.L A6,A4 dlrloop TST.B (A4)+ BNE.S dlrloop SUBQ.L #1,A4 dlrloop2 CMP.L TextEndPtr,A4 BHS.S dlrexit CLR.B (A4)+ BRA.S dlrloop2 dlrexit CLR LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos CLR GetLineFlag MOVE.B RawKeyCode,MixChar CLR.B RawKeyCode CLR.L DSTOffset BSR.S UpdateText BRA WaitForButtonUp AbortGetLine MOVE.L DSTPtr,A6 MOVE.L A6,A4 clliloop CLR.B (A4)+ CMP.L TextEndPtr,A4 BNE.S clliloop BSR.S UpdateText BRA GetLineReturn UpdateText MOVE A5,TextOffset MOVE.L DSTPtr,A0 ADD.L DSTOffset,A0 BRA ShowText2 DSTPtr dc.l 0 DSTPos dc.l 0 DSTOffset dc.l 0 ;---- TypeInSongName BSR StorePtrCol BSR SetWaitPtrCol CLR.L EditMode MOVE.L SongDataPtr,A6 MOVE.L A6,TextEndPtr MOVE.L A6,ShowTextPtr ADD.L #19,TextEndPtr MOVE #20,TextLength MOVE #4133,A4 BSR GetTextLine CLR.L TextEndPtr BRA RestorePtrCol CheckSmplNamOrLoad CMP #287,MouseX2 BHS LoadNamedSample TypeInSampleName BSR StorePtrCol BSR SetWaitPtrCol CLR.L EditMode MOVE.L SongDataPtr,A6 LEA -10(A6),A6 MOVE InsNum,D7 BNE.S tisnskip MOVE LastInsNum,D7 tisnskip MULU #30,D7 ADD.L D7,A6 MOVE.L A6,TextEndPtr MOVE.L A6,ShowTextPtr ADD.L #21,TextEndPtr MOVE #22,TextLength MOVE #4573,A4 BSR GetTextLine CLR.L TextEndPtr BRA RestorePtrCol LoadSample TST InsNum BEQ NotSampleNull BSR StorePtrCol LEA SamplePath2,A0 BSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 lsloop MOVE.B (A0)+,(A1)+ DBF D0,lsloop MOVE.L SongDataPtr,A0 MOVE InsNum,D0 MULU #30,D0 LEA -10(A0),A0 ADD.L D0,A0 LEA DirInputName,A1 MOVEQ #21,D0 lsloop2 MOVE.B (A1)+,(A0)+ DBF D0,lsloop2 BSR SetDiskPtrCol MOVE.L #FileName,D1 BSR ExamineAndAlloc BEQ ErrorRestoreCol MOVE.L #FileName,D1 BRA lnssec2 CheckForIFF2 ; load loop ;load IFF sample!!! MOVEQ #-1,D2 BRA.S ciff2 CheckForIFF MOVEQ #0,D2 ciff2 MOVEQ #0,D1 CMP.L #'FORM',(A0) BNE.S wiskip CMP.L #'8SVX',8(A0) BNE.S wiskip MOVE.L A0,A2 MOVE.L A1,D0 ADD.L A0,A1 TST.L D2 BEQ.S cfiloop BSR.S CheckIFFLoop cfiloop CMP.L #'BODY',(A0) BEQ.S wasIFF ADDQ.L #2,A0 CMP.L A1,A0 BLS.S cfiloop RTS wasIFF ADDQ.L #8,A0 ADD.L A2,D0 SUB.L A0,D0 wiloop MOVE.B (A0)+,(A2)+ CMP.L A1,A0 BLS.S wiloop MOVE.L SampleInstrSave(PC),A3 LSR #1,D0 MOVE 22(A3),D1 SUB D0,D1 MOVE D0,22(A3) wiskip LEA SampleLengthAdd(PC),A3 MOVE InsNum,D0 LSL #1,D0 MOVE D1,(A3,D0.W) RTS CheckIFFLoop TST.B IFFLoopFlag BEQ Return2 MOVEM.L A0/D0,-(SP) cilloop CMP.L #'VHDR',(A0) BEQ.S wasvhdr ADDQ.L #2,A0 CMP.L A1,A0 BLS.S cilloop cilend MOVEM.L (SP)+,A0/D0 RTS wasvhdr MOVE.L SampleInstrSave(PC),A3 MOVE.L 12(A0),D0 BEQ.S cilend LSR #1,D0 MOVE D0,28(A3) MOVE.L 8(A0),D0 BNE.S wsvhdr2 MOVEQ #2,D0 wsvhdr2 LSR #1,D0 MOVE D0,26(A3) BRA.S cilend SampleInstrSave dc.l 0 SampleLengthAdd dcb.w 32,0 ExamineAndAlloc MOVEQ #-2,D2 MOVE.L DOSBase,A6 JSR LVOLock(A6) MOVE.L D0,FileLock BEQ CantFindFile MOVE.L D0,D1 MOVE.L #FileInfoBlock,D2 JSR LVOExamine(A6) TST.L FIB_EntryType BPL CantExamFile MOVE.L FileLock,D1 JSR LVOUnLock(A6) MOVE.L FIB_FileSize,D0 BEQ FileIsEmpty BSR TurnOffVoices BSR FreeSample MOVE.L FIB_FileSize,D0 CMP.L #$FFFE,D0 BLS.S exalloc MOVE.L #$FFFE,D0 exalloc LEA SamplePtrs,A4 MOVE InsNum,D1 LSL #2,D1 ADD D1,A4 MOVE.L D0,124(A4) MOVE.L D0,DiskDataLength MOVE.L 4.W,A6 MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 JSR LVOAllocMem(A6) MOVE.L D0,DiskDataPtr MOVE.L D0,(A4) BEQ OutOfMemErr LEA LoadingSampleText(PC),A0 BSR ShowStatusText MOVE.L SongDataPtr,A0 MOVE InsNum,D0 MULU #30,D0 LEA -10(A0),A0 ADD.L D0,A0 MOVE.L A0,SampleInstrSave MOVE.L DiskDataLength,D0 LSR.L #1,D0 MOVE D0,22(A0) MOVE.L #$00400000,24(A0) MOVE #1,28(A0) BSR ShowSampleInfo MOVEQ #-1,D0 RTS LoadNamedSample TST InsNum BEQ NotSampleNull BSR StorePtrCol BSR CreateSampleName BSR SetDiskPtrCol MOVE.L FileNamePtr,D1 BSR ExamineAndAlloc BEQ Return2 MOVE.L FileNamePtr,D1 lnssec2 MOVE.L DOSBase(PC),A6 MOVE.L #1005,D2 JSR LVOOpen(A6) MOVE.L D0,D7 BEQ CantOpenFile MOVE.L D0,D1 MOVE.L DiskDataPtr,D2 MOVE.L DiskDataLength,D3 JSR LVORead(A6) MOVE.L D7,D1 JSR LVOClose(A6) MOVE.L DiskDataPtr,A0 MOVE.L DiskDataLength,A1 BSR CheckForIFF2 BSR ValidateLoops BSR ShowSampleInfo MOVE.L DiskDataPtr,A0 CLR (A0) BSR RedrawSample CLR.L SavSamInf BSR ShowAllRight BRA RestorePtrCol CreateSampleName LEA SampleFileName,A0 MOVEQ #27,D0 csnloop CLR.B (A0)+ DBF D0,csnloop MOVE.L SongDataPtr,A0 MOVE InsNum,D0 MULU #30,D0 LEA -10(A0),A0 ADD.L D0,A0 MOVE.L A0,SampleInstrSave MOVEQ #0,D0 MOVE 22(A0),D0 ADD.L D0,D0 MOVE.L D0,DiskDataLength MOVE.L D0,IFFBODY+4 ADD.L #IFFEND-IFFFORM-8,D0 MOVE.L D0,IFFFORM+4 MOVEQ #0,D0 MOVE 22(A0),D0 ADD.L D0,D0 MOVEQ #0,D1 MOVE 28(A0),D1 CMP #1,D1 BLS.S csnskp2 ADD.L D1,D1 MOVEQ #0,D0 MOVE 26(A0),D0 ADD.L D0,D0 BRA.S csnskp3 csnskp2 MOVEQ #0,D1 csnskp3 MOVE.L D0,IFFVHDR+8 MOVE.L D1,IFFVHDR+12 LEA SampleFileName,A1 LEA IFFNAME+8,A2 MOVEQ #21,D0 csnloop2 MOVE.B (A0),(A1)+ MOVE.B (A0)+,(A2)+ DBF D0,csnloop2 MOVE.L #SampleFileName,D1 MOVE.L D1,FileNamePtr BSR.S FindColon BEQ.S CheckOverride LEA SamplePath2,A0 BSR CopyPath MOVE.L #SampleFileName,A0 csnloop3 MOVE.B (A0)+,(A1)+ BNE.S csnloop3 MOVE.L #FileName,FileNamePtr RTS FindColon MOVE.L D1,A0 fcloop MOVE.B (A0)+,D0 BEQ.S FindColonFail CMP.B #':',D0 BEQ.S FindColonSuccess BRA.S fcloop FindColonFail MOVEQ #-1,D0 RTS FindColonSuccess MOVEQ #0,D0 RTS CheckOverride TST.B OverrideFlag BEQ Return2 MOVE.L #SampleFileName,A0 MOVE.L A0,A1 LEA 21(A1),A1 MOVE.L A1,A2 chkovlp MOVE.B -(A1),D0 CMP.B #':',D0 BEQ.S chkovok CMP.B #'/',D0 BEQ.S chkovok MOVE.L A1,A2 CMP.L A0,A1 BHI.S chkovlp chkovok LEA SamplePath2,A0 BSR CopyPath chkovl2 MOVE.B (A2)+,(A1)+ BNE.S chkovl2 MOVE.L #FileName,FileNamePtr RTS ValidateLoops MOVE.L SongDataPtr,A0 LEA 20(A0),A0 MOVEQ #30,D0 valolop MOVE 22(A0),D1 MOVE 26(A0),D2 MOVE 28(A0),D3 CMP D1,D2 BHS.S valosk1 ADD D2,D3 CMP D1,D3 BHI.S valosk2 valoque TST 28(A0) BNE.S valosk3 MOVE #1,28(A0) valosk3 LEA 30(A0),A0 DBF D0,valolop RTS valosk2 SUB D2,D1 MOVE D1,28(A0) BRA.S valoque valosk1 MOVEQ #1,D1 MOVE.L D1,26(A0) BRA.S valoque LoadPreset CLR.B RawKeyCode TST InsNum BEQ NotSampleNull BSR TurnOffVoices BSR FreeSample BSR CreateSampleName MOVE.L FileNamePtr,A0 TST.B (A0) BEQ Return2 MOVE.L DiskDataLength,D0 BEQ Return2 MOVE.L DiskDataLength,D0 BSR AllocSample MOVE.L DiskDataPtr,D0 BEQ.S loprerr BSR ShowSampleInfo BSR DoLoadData BSR ShowAllRight MOVE.L DiskDataPtr,A0 MOVE.L DiskDataLength,A1 BSR CheckForIFF BSR ValidateLoops BSR ShowSampleInfo MOVE.L DiskDataPtr,A0 CLR (A0) BSR RedrawSample MOVE #1,UpdateFreeMem RTS loprerr BSR StorePtrCol BSR OutOfMemErr BSR RestorePtrCol BRA RedrawSample AllocSample MOVE.L D0,-(SP) MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,DiskDataPtr LEA SamplePtrs,A0 MOVE InsNum(PC),D1 LSL #2,D1 LEA (A0,D1.W),A0 MOVE.L DiskDataPtr(PC),(A0) MOVE.L (SP)+,124(A0) RTS FreeSample LEA SamplePtrs(PC),A0 MOVE InsNum(PC),D0 BEQ Return2 LSL #2,D0 LEA (A0,D0.W),A0 MOVE.L (A0),D1 BEQ Return2 CLR.L (A0) MOVE.L 124(A0),D0 CLR.L 124(A0) MOVE.L D1,A1 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) RTS NotSampleNull LEA NotSample0Text(PC),A0 BSR ShowStatusText BRA SetErrorPtrCol NotSample0Text dc.b 'not sample 0 !',0,0 ;---- DeleteSong LEA DeleteSongText,A0 BSR AreYouSure BNE Return2 LEA DeletingSongText(PC),A0 BSR ShowStatusText LEA SongsPath2,A0 BSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 dsloop MOVE.B (A0)+,(A1)+ DBF D0,dsloop MOVE #1,Action Delete3 MOVE.L #FileName,FileNamePtr MOVE.L DOSBase(PC),A6 MOVE.L FileNamePtr(PC),D1 MOVE.L D1,A0 JSR LVODeleteFile(A6) BSR ClearFileNames BSR ShowAllRight BSR SetNormalPtrCol BSR StorePtrCol BRA DoAutoDir DeleteModule LEA DeleteModuleText,A0 BSR AreYouSure BNE Return2 LEA DeletingModuleText(PC),A0 BSR ShowStatusText LEA ModulesPath2,A0 BSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 dmdloop MOVE.B (A0)+,(A1)+ DBF D0,dmdloop MOVE #3,Action BRA.S Delete3 DeleteSample LEA DeleteSampleText,A0 BSR AreYouSure BNE Return2 LEA DeletingSampleText(PC),A0 BSR ShowStatusText LEA SamplePath2,A0 BSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 dsaloop MOVE.B (A0)+,(A1)+ DBF D0,dsaloop MOVE #5,Action BRA Delete3 RenameFile LEA RenamingFileText(PC),A0 BSR ShowStatusText LEA DirInputName,A0 LEA NewInputName,A1 MOVEQ #23,D0 rnfloop MOVE.B (A0)+,(A1)+ BNE.S rnfskip SUBQ.L #1,A0 rnfskip DBF D0,rnfloop BSR StorePtrCol BSR SetWaitPtrCol LEA NewInputName,A6 MOVE.L A6,ShowTextPtr MOVE.L A6,TextEndPtr ADD.L #23,TextEndPtr MOVE #24,TextLength MOVE FileNameScrollPos+2,D0 MULU #240,D0 MOVE #1888,A4 ADD D0,A4 BSR GetTextLine TST.B NewInputName BEQ.S rnfend CMP.B #69,MixChar BEQ.S rnfend MOVE.L PathPtr,A0 BSR CopyPath LEA NewInputName,A0 MOVEQ #23,D0 rnfloop2 MOVE.B (A0)+,(A1)+ DBF D0,rnfloop2 LEA FileName,A0 LEA NewFileName,A1 rnfloop3 MOVE.B (A0)+,(A1)+ BNE.S rnfloop3 MOVE.L PathPtr,A0 BSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 rnfloop4 MOVE.B (A0)+,(A1)+ DBF D0,rnfloop4 MOVE.L #FileName,D1 MOVE.L #NewFileName,D2 MOVE.L DOSBase(PC),A6 JSR LVORename(A6) rnfend BSR ClearFileNames CLR Action BSR RestorePtrCol BRA ShowAllRight LoadSong MOVE #1,LoadInProgress BSR DoClearSong BSR ClrSampleInfo LEA SongsPath2,A0 BSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 losoloop2 MOVE.B (A0)+,(A1)+ DBF D0,losoloop2 MOVE.L SongDataPtr(PC),DiskDataPtr MOVE.L #FileName,FileNamePtr MOVE.L #70716,DiskDataLength LEA LoadingSongText(PC),A0 BSR ShowStatusText BSR DoLoadData BEQ lososkip3 MOVE.L SongDataPtr(PC),A0 CMP.L #'PACK',(A0) BNE.S lososkip MOVE.L 4(A0),CrunchedSongLength MOVE.L 8(A0),RealSongLength MOVE.L SongDataPtr(PC),D0 ADD.L #70716,D0 SUB.L RealSongLength(PC),D0 MOVE.L D0,EndOfSongPtr LEA DecrunchingText(PC),A0 BSR ShowStatusText BSR Decruncher BSR ShowAllRight lososkip MOVE.L SongDataPtr(PC),A0 CMP.L #'M.K.',sd_mahokakt(A0) ;M.K. again... BEQ.S lososkip2 BSR MahoneyAndKaktus ;Was 16 instr, so move up... lososkip2 LEA LoadingSongText(PC),A0 BSR ShowStatusText BSR CheckAbort BEQ.S lososkip3 TST.B AutoExitFlag BEQ.S NoSongAutoExit BSR ExitFromDir NoSongAutoExit CLR.L PatternNumber CLR.L CurrPos BSR RedrawPattern CLR ScrPattPos BSR SetScrPatternPos BSR SortDisks LEA SampleSortList(PC),A0 MOVEQ #30,D0 losoloop3 TST.B NosamplesFlag BNE.S lososkip3 BSR CheckAbort BEQ.S lososkip3 MOVE InsNum(PC),TuneUp BSR DoShowFreeMem MOVE.L (A0)+,D1 MOVE D1,InsNum MOVEM.L D0/D1/A0,-(SP) BSR LoadPreset BSR ShowSampleInfo MOVEM.L (SP)+,D0/D1/A0 DBF D0,losoloop3 lososkip3 MOVE #1,InsNum MOVE.L #6,CurrSpeed CLR LoadInProgress BSR ShowAllRight BSR SetNormalPtrCol BSR DoShowFreeMem BSR CheckInstrLengths BSR ShowSampleInfo BRA RedrawSample SortDisks MOVEM.L D0-D4/A0-A1,-(SP) MOVE.L SongDataPtr(PC),A0 LEA 23(A0),A0 LEA SampleSortList(PC),A1 MOVEQ #1,D0 losoloop4 MOVE.B (A0)+,(A1)+ ; ST-(0)1 MOVE.B (A0),(A1)+ ; ST-0(1) MOVE D0,(A1)+ ; insnum LEA 29(A0),A0 ADDQ.L #1,D0 CMP.L #32,D0 BLO.S losoloop4 losoloop5 CLR MoreInstrFlag LEA SampleSortList(PC),A0 MOVEQ #29,D2 losoloop6 MOVE (A0),D0 MOVE 4(A0),D1 CMP D0,D1 ; if next disk greater BHS.S loso2_2 MOVE #1,MoreInstrFlag MOVE.L (A0),D3 ; swap disks MOVE.L 4(A0),D4 MOVE.L D4,(A0) MOVE.L D3,4(A0) loso2_2 ADDQ.L #4,A0 DBF D2,losoloop6 TST MoreInstrFlag BNE.S losoloop5 LEA SampleSortList(PC),A0 MOVEQ #30,D0 losoloop7 CLR (A0) ADDQ.L #4,A0 DBF D0,losoloop7 MOVEM.L (SP)+,D0-D4/A0-A1 RTS MahoneyAndKaktus LEA Loadas31Text(PC),A0 BSR AreYouSure BEQ.S putmk MOVE.L SongDataPtr(PC),A0 ; M.K. 32 samples format! LEA 466(A0),A1 ADD.L #66006,A0 makloop MOVE.L (A0),484(A0) CLR.L (A0) SUBQ.L #4,A0 CMP.L A0,A1 BNE.S makloop MOVE.L SongDataPtr(PC),A0 LEA sd_mahokakt(A0),A1 LEA sd_numofpatt(A0),A0 makloop2 MOVE 4(A0),(A0)+ CMP.L A0,A1 BNE.S makloop2 MOVE.L #'M.K.',(A0) ;M.K. again! MOVEQ #0,D0 RTS putmk MOVE.L SongDataPtr(PC),A0 MOVE.L #'M.K.',sd_mahokakt(A0) ;put M.K. MOVEQ #-1,D0 RTS Loadas31Text dc.b "Load as 31 instr?",0 CheckInstrLengths MOVE.L SongDataPtr(PC),A0 ADD.L #20,A0 MOVEQ #30,D1 xilloop MOVE 26(A0),D0 ADD 28(A0),D0 CMP 22(A0),D0 BLS.S xilskip MOVE 26(A0),D0 LSR #1,D0 MOVE D0,26(A0) xilskip ADD.L #30,A0 DBF D1,xilloop RTS CheckAbort BTST #2,$DFF016 BNE Return2 MOVEM.L D0-D7/A0-A6,-(SP) LEA AbortLoadText,A0 BSR AreYouSure BNE.S chabno MOVEM.L (SP)+,D0-D7/A0-A6 MOVEQ #0,D7 RTS chabno MOVEM.L (SP)+,D0-D7/A0-A6 MOVEQ #-1,D7 RTS StopIt BSR.S DoStopIt TurnOffVoices MOVEM.L A0-A1,-(SP) MOVE #$000F,$DFF096 CLR $DFF0A8 CLR $DFF0B8 CLR $DFF0C8 CLR $DFF0D8 CLR.B RawKeyCode LEA ScopeInfo,A0 LEA BlankSample,A1 MOVE.L A1,(A0) MOVE.L A1,20(A0) MOVE.L A1,40(A0) MOVE.L A1,60(A0) MOVEM.L (SP)+,A0-A1 RTS DoStopIt BSR SetNormalPtrCol CLR.L EditMode CLR.L RunMode CLR.B PattDelayTime CLR.B PattDelayTime2 BRA RestoreEffects2 UsePreset BSR StorePtrCol TST.L PLSTmem BEQ.S upend TST InsNum BEQ.S upend CLR.B RawKeyCode MOVE CurrentPreset(PC),D0 SUBQ #1,D0 MULU #30,D0 MOVE.L PLSTmem(PC),A0 ADD.L D0,A0 MOVE InsNum(PC),D0 MULU #30,D0 MOVE.L SongDataPtr(PC),A1 LEA -10(A1,D0.W),A1 MOVE.L A1,A2 MOVEQ #29,D0 uploop MOVE.B (A0)+,(A1)+ DBF D0,uploop MOVE.L (A2),D0 AND.L #$DFDFFFFF,D0 CMP.L #$53540000,D0 ;ST__ BNE.S upok CLR (A2) CLR.L 22(A2) MOVE.L #$00000001,26(A2) upok BSR LoadPreset upend BSR ShowSampleInfo BRA RestorePtrCol ;---- Edit ---- Edit TST SamScrEnable BNE Return2 BSR StopIt CLR.B RawKeyCode BSR SetEditPtrCol BSR SetScrPatternPos MOVE.L #'edit',EditMode BRA WaitForButtonUp ;---- Edit Op. ---- DoEditOp CLR.B RawKeyCode CMP #1,CurrScreen BNE Return2 TST.B EdEnable BEQ.S EditOp ADDQ.B #1,EdScreen CMP.B #4,EdScreen BLO.S EditOp MOVE.B #1,EdScreen EditOp BSR WaitForButtonUp ST EdEnable ST DisableAnalyzer JSR ClearAnalyzerColors BSR ClearRightArea BRA DrawEditMenu EdEnable dc.b 0 EdScreen dc.b 1 DrawEditMenu CMP.B #1,EdScreen BNE.S demskip MOVE.L #EditOpText1,ShowTextPtr LEA Edit1Data,A0 MOVE.L #Edit1Size,D0 BRA.S demit demskip CMP.B #2,EdScreen BNE.S demskip2 MOVE.L #EditOpText2,ShowTextPtr LEA Edit2Data,A0 MOVE.L #Edit2Size,D0 BRA.S demit demskip2 CMP.B #3,EdScreen BNE Return2 MOVE.L #EditOpText3,ShowTextPtr LEA Edit3Data,A0 MOVE.L #Edit3Size,D0 demit BSR Decompact BEQ ExitEditOp LEA BitPlaneData+SpectrumAnaPos,A0 MOVEQ #54,D0 demloop1 MOVEQ #24,D1 demloop2 MOVE.B 1430(A1),PlaneSize(A0) MOVE.B (A1)+,(A0)+ DBF D1,demloop2 LEA 15(A0),A0 ADDQ.L #1,A1 DBF D0,demloop1 BSR FreeDecompMem MOVE #1936,TextOffset MOVE #22,TextLength BSR ShowText CMP.B #1,EdScreen BEQ ShowSampleAll CMP.B #2,EdScreen BNE.S demskip3 BSR ShowTrackPatt BSR ShowFrom BSR ShowTo BSR ShowRecordMode BSR ShowQuantize BSR ShowMetronome BRA ShowMultiMode demskip3 CMP.B #3,EdScreen BNE Return2 BSR ShowHalfClip BSR ShowPos BSR ShowMod BRA ShowVol EditOpText1 dc.b ' track pattern ' EditOpText2 dc.b ' record samples ' EditOpText3 dc.b ' sample editor ' CheckEditOpGadgs MOVE PattCurPos(PC),D0 BSR.S GetPositionPtr MOVEM.W MouseX2,D0/D1 CMP #306,D0 BHS.S CheckEdSwap CMP.B #1,EdScreen BEQ CheckEdGadg1 CMP.B #2,EdScreen BEQ CheckEdGadg2 CMP.B #3,EdScreen BEQ CheckEdGadg3 RTS GetPositionPtr MOVE.L SongDataPtr(PC),A0 LEA sd_patterndata(A0),A0 MOVE.L PatternNumber(PC),D2 LSL.L #8,D2 LSL.L #2,D2 ADD.L D2,A0 MOVEQ #0,D2 MOVE D0,D2 DIVU #6,D2 LSL #2,D2 ADD D2,A0 RTS CheckEdSwap CMP #55,D1 BLS Return2 MOVEQ #1,D2 CMP #66,D1 BLS.S SetEditOpScreen MOVEQ #2,D2 CMP #77,D1 BLS.S SetEditOpScreen MOVEQ #3,D2 CMP #88,D1 BLS.S SetEditOpScreen CMP #99,D1 BLS.S ExitEditOp RTS SetEditOpScreen MOVE.B D2,EdScreen BRA EditOp ExitEditOp SF EdEnable CLR.B RawKeyCode BRA DisplayMainScreen CheckEdGadg1 CMP #55,D1 BLS ToggleSampleAll CMP #66,D1 BLS NoteUp CMP #77,D1 BLS NoteDown CMP #88,D1 BLS OctaveUp CMP #99,D1 BLS OctaveDown RTS CheckEdGadg2 CMP #55,D1 BLS ToggleTrackPatt CMP #213,D0 BLS.S ceg2left CMP #66,D1 BLS DeleteOrKill CMP #77,D1 BLS ExchangeOrCopy CMP #88,D1 BLS SetSampleFrom CMP #99,D1 BLS SetSampleTo RTS ceg2left CMP #66,D1 BLS ToggleRecordMode CMP #77,D1 BLS SetQuantize CMP #88,D1 BLS SetMetronome CMP #99,D1 BLS ToggleMultiMode RTS CheckEdGadg3 MOVE.L SongDataPtr(PC),A5 LEA -10(A5),A5 MOVE InsNum(PC),D2 BNE.S ceg3skip MOVE LastInsNum,D2 ceg3skip MULU #30,D2 ADD.L D2,A5 CMP #55,D1 BLS ToggleHalfClip CMP #213,D0 BLS.S ceg3mid CMP #66,D1 BLS SetSamplePos CMP #77,D1 BLS SetModSpeed CMP #88,D1 BLS CutBeg CMP #99,D1 BLS ChangeVolume RTS ceg3mid CMP #165,D0 BLS.S ceg3left CMP #66,D1 BLS Echo CMP #77,D1 BLS Filter CMP #88,D1 BLS Backwards CMP #99,D1 BLS DownSample RTS ceg3left CMP #66,D1 BLS Mix CMP #77,D1 BLS Boost CMP #88,D1 BLS XFade CMP #99,D1 BLS UpSample RTS ToggleSampleAll BSR WaitForButtonUp EOR.B #1,SampleAllFlag ShowSampleAll LEA BitPlaneData+1838,A1 LEA S_BoxData,A2 TST.B SampleAllFlag BEQ rtdoit2 LEA S_BoxData+A_BoxData,A2 rtdoit2 JMP rtdoit OctaveUp MOVE #24,NoteShift BRA.S nup2 NoteUp MOVE #2,NoteShift nup2 BSR SaveUndo CMP #214,D0 BLS.S nup3 MOVEQ #0,D0 BSR GetPositionPtr BSR.S SampleNoteUp MOVEQ #6,D0 BSR GetPositionPtr BSR.S SampleNoteUp MOVEQ #12,D0 BSR GetPositionPtr BSR.S SampleNoteUp MOVEQ #18,D0 BSR GetPositionPtr nup3 BSR.S SampleNoteUp BRA RedrawPattern SampleNoteUp MOVEQ #63,D6 MOVE.L A0,A3 MOVE InsNum(PC),D3 TST.B SampleAllFlag BEQ.S sanulo2 MOVEQ #0,D3 sanulo2 MOVE.L D6,D0 MOVE.L A3,A0 sanuloop MOVE.B 2(A0),D1 LSR.B #4,D1 MOVE.B (A0),D2 AND.B #$F0,D2 OR.B D2,D1 CMP.B D3,D1 BNE.S sanuskip MOVE (A0),D1 MOVE D1,D2 AND #$F000,D2 AND #$0FFF,D1 BEQ.S sanuskip BSR CheckPeriod BNE.S sanuskip ADD NoteShift(PC),D5 CMP #$0048,D5 BLO.S sanuok TST.B TransDelFlag BEQ.S sanuskip AND.L #$00000FFF,(A0) BRA.S sanuskip sanuok MOVE 0(A2,D5.W),D1 OR D2,D1 MOVE D1,(A0) sanuskip LEA 16(A0),A0 DBF D0,sanuloop TST.B SampleAllFlag BEQ Return2 ADDQ #1,D3 CMP #32,D3 BLO.S sanulo2 RTS OctaveDown MOVE #24,NoteShift BRA.S ndown2 NoteDown MOVE #2,NoteShift ndown2 BSR SaveUndo CMP #214,D0 BLS.S ndown3 MOVEQ #0,D0 BSR GetPositionPtr BSR.S SampleNoteDown MOVEQ #6,D0 BSR GetPositionPtr BSR.S SampleNoteDown MOVEQ #12,D0 BSR GetPositionPtr BSR.S SampleNoteDown MOVEQ #18,D0 BSR GetPositionPtr ndown3 BSR.S SampleNoteDown BRA RedrawPattern SampleNoteDown MOVEQ #63,D6 MOVE.L A0,A3 MOVE InsNum(PC),D3 TST.B SampleAllFlag BEQ.S sandlo2 MOVEQ #0,D3 sandlo2 MOVE D6,D0 MOVE.L A3,A0 sandloop MOVE.B 2(A0),D1 LSR.B #4,D1 MOVE.B (A0),D2 AND.B #$F0,D2 OR.B D2,D1 CMP.B D1,D3 BNE.S sandskip MOVE (A0),D1 MOVE D1,D2 AND #$F000,D2 AND #$0FFF,D1 BEQ.S sandskip BSR.S CheckPeriod BNE.S sandskip SUB NoteShift(PC),D5 BPL.S sandok TST.B TransDelFlag BEQ.S sandskip AND.L #$00000FFF,(A0) BRA.S sandskip sandok MOVE 0(A2,D5.W),D1 OR D2,D1 MOVE D1,(A0) sandskip LEA 16(A0),A0 DBF D0,sandloop TST.B SampleAllFlag BEQ Return2 ADDQ #1,D3 CMP #$20,D3 BLO.S sandlo2 RTS NoteShift dc.w 0 CheckPeriod LEA PeriodTable(PC),A2 MOVEQ #-2,D5 chpeloop ADDQ.L #2,D5 MOVE 0(A2,D5.W),D4 BEQ.S PeriodNotOk CMP D4,D1 BEQ.S PeriodOk BRA.S chpeloop PeriodOk MOVEQ #0,D4 RTS PeriodNotOk MOVEQ #-1,D4 RTS ToggleTrackPatt BSR WaitForButtonUp ADDQ.B #1,TrackPattFlag CMP.B #3,TrackPattFlag BLO.S ShowTrackPatt CLR.B TrackPattFlag ShowTrackPatt LEA BitPlaneData+1838,A1 LEA S_BoxData+T_BoxData,A2 TST.B TrackPattFlag BEQ rtdoit2 LEA S_BoxData+P_BoxData,A2 CMP.B #1,TrackPattFlag BEQ rtdoit2 LEA S_BoxData,A2 BRA rtdoit2 KillInstrTrack BSR SaveUndo MOVE PattCurPos(PC),D0 BSR GetPositionPtr BRA.S dst2 DeleteOrKill CMP #260,D0 BHS KillSample DelSampleTrack BSR SaveUndo TST.B TrackPattFlag BEQ.S dst2 MOVEQ #0,D0 BSR GetPositionPtr BSR.S dstdoit MOVEQ #6,D0 BSR GetPositionPtr BSR.S dstdoit MOVEQ #12,D0 BSR GetPositionPtr BSR.S dstdoit MOVEQ #18,D0 BSR GetPositionPtr dst2 BSR.S dstdoit BRA RedrawPattern dstdoit CLR.B RawKeyCode MOVEQ #63,D0 MOVE InsNum(PC),D3 BEQ NotSampleNull ksloop MOVE.B 2(A0),D1 LSR.B #4,D1 MOVE.B (A0),D2 AND.B #$F0,D2 OR.B D2,D1 CMP.B D1,D3 BNE.S ksskip CLR.L (A0) ksskip LEA 16(A0),A0 DBF D0,ksloop RTS KillSample LEA KillSampleText,A0 BSR AreYouSure BNE Return2 Destroy BSR StorePtrCol MOVE InsNum(PC),D0 BEQ ErrorRestoreCol BSR TurnOffVoices BSR FreeSample MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D0 MULU #30,D0 LEA -10(A0),A0 ADD.L D0,A0 MOVE.L A0,A1 MOVEQ #29,D0 kisalop CLR.B (A0)+ DBF D0,kisalop MOVE #1,28(A1) BSR ShowSampleInfo BSR RedrawSample BRA RestorePtrCol ExchangeOrCopy MOVEQ #-1,D4 CMP #260,D0 BHS.S CopySampleTrack ExchSampleTrack CMP.B #2,TrackPattFlag BEQ ExchSamples MOVEQ #0,D4 BRA.S mstskip CopySampleTrack CMP.B #2,TrackPattFlag BEQ CopySamples mstskip TST.B TrackPattFlag BEQ.S mst2 MOVEQ #0,D0 BSR GetPositionPtr BSR.S mstdoit MOVEQ #6,D0 BSR GetPositionPtr BSR.S mstdoit MOVEQ #12,D0 BSR GetPositionPtr BSR.S mstdoit MOVEQ #18,D0 BSR GetPositionPtr mst2 BSR.S mstdoit BRA RedrawPattern mstdoit MOVEQ #63,D0 esloop MOVE.B 2(A0),D1 LSR.B #4,D1 MOVE.B (A0),D2 AND.B #$F0,D2 OR.B D2,D1 CMP.B SampleFrom(PC),D1 BNE.S esskip2 AND.L #$0FFF0FFF,(A0) MOVE.B SampleTo(PC),D2 MOVE.B D2,D3 AND.B #$F0,D2 OR.B D2,(A0) LSL.B #4,D3 OR.B D3,2(A0) BRA.S esskip3 esskip2 TST.B D4 BNE.S esskip3 CMP.B SampleTo(PC),D1 BNE.S esskip3 AND.L #$0FFF0FFF,(A0) MOVE.B SampleFrom(PC),D2 MOVE.B D2,D3 AND.B #$F0,D2 OR.B D2,(A0) LSL.B #4,D3 OR.B D3,2(A0) esskip3 LEA 16(A0),A0 DBF D0,esloop RTS ExchSamples BSR StorePtrCol MOVEQ #0,D0 MOVE.B SampleFrom(PC),D0 BEQ ErrorRestoreCol MOVEQ #0,D1 MOVE.B SampleTo(PC),D1 BEQ ErrorRestoreCol MOVE D0,D2 MOVE D1,D3 LEA SampleLengthAdd+2,A2 LSL #1,D2 LSL #1,D3 LEA (A2,D2.W),A0 LEA (A2,D3.W),A1 MOVE (A0),D4 MOVE (A1),(A0) MOVE D4,(A1) LEA SamplePtrs,A2 LSL #1,D2 LSL #1,D3 LEA (A2,D2.W),A0 LEA (A2,D3.W),A1 MOVE.L (A0),D4 MOVE.L (A1),(A0) MOVE.L D4,(A1) MOVE.L 124(A0),D4 MOVE.L 124(A1),124(A0) MOVE.L D4,124(A1) SUBQ #1,D0 SUBQ #1,D1 MULU #30,D0 MULU #30,D1 MOVE.L SongDataPtr(PC),A2 LEA 20(A2),A2 LEA (A2,D0.W),A0 LEA (A2,D1.W),A1 MOVEQ #29,D0 exsalop MOVE.B (A0),D1 MOVE.B (A1),(A0)+ MOVE.B D1,(A1)+ DBF D0,exsalop BSR ShowSampleInfo BSR RedrawSample BRA RestorePtrCol CopySamples BSR StorePtrCol MOVEQ #0,D0 MOVE.B SampleFrom(PC),D0 BEQ ErrorRestoreCol MOVEQ #0,D1 MOVE.B SampleTo(PC),D1 BEQ ErrorRestoreCol LEA SamplePtrs(PC),A2 LSL #2,D0 LSL #2,D1 LEA (A2,D0.W),A3 LEA (A2,D1.W),A4 MOVE.L (A3),D0 BEQ ErrorRestoreCol MOVE.L 124(A3),D0 MOVEQ #MEMF_CHIP,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) TST.L D0 BEQ OutOfMemErr MOVE.L D0,A5 MOVEQ #0,D0 MOVE.B SampleTo(PC),D0 MOVE D0,InsNum BSR Destroy MOVE.L A5,(A4) MOVE.L 124(A3),D0 MOVE.L D0,124(A4) MOVE.L (A3),A0 cosalp2 MOVE.B (A0)+,(A5)+ SUBQ.L #1,D0 BNE.S cosalp2 MOVEQ #0,D0 MOVEQ #0,D1 MOVE.B SampleFrom(PC),D0 MOVE.B SampleTo(PC),D1 MOVE D1,InsNum MULU #30,D0 MULU #30,D1 MOVE.L SongDataPtr(PC),A2 LEA -10(A2),A2 LEA (A2,D0.W),A0 LEA (A2,D1.W),A1 MOVEQ #29,D0 cosalop MOVE.B (A0)+,(A1)+ DBF D0,cosalop BSR ShowSampleInfo BSR RedrawSample BRA RestorePtrCol SetSampleFrom MOVE InsNum(PC),D2 CMP #283,D0 BLS.S sesfskip MOVE.B SampleFrom(PC),D2 CMP #295,D0 BLS.S sesfup SUBQ.B #1,D2 BPL.S sesfskip MOVEQ #0,D2 sesfskip MOVE.B D2,SampleFrom BSR Wait_4000 BRA.S ShowFrom sesfup ADDQ.B #1,D2 CMP.B #$1F,D2 BLS.S sesfskip MOVE.B #$1F,SampleFrom ShowFrom MOVE #3273,TextOffset CLR WordNumber MOVE.B SampleFrom(PC),WordNumber+1 BRA PrintHexByte SetSampleTo MOVE InsNum(PC),D2 CMP #283,D0 BLS.S sestskip MOVE.B SampleTo(PC),D2 CMP #295,D0 BLS.S sestup SUBQ.B #1,D2 BPL.S sestskip MOVEQ #0,D2 sestskip MOVE.B D2,SampleTo BSR Wait_4000 BRA.S ShowTo sestup ADDQ.B #1,D2 CMP.B #$1F,D2 BLS.S sestskip MOVE.B #$1F,SampleTo ShowTo MOVE #3713,TextOffset CLR WordNumber MOVE.B SampleTo(PC),WordNumber+1 BRA PrintHexByte SampleFrom dc.b 0 SampleTo dc.b 0 ToggleRecordMode BSR WaitForButtonUp EOR.B #1,RecordMode ShowRecordMode MOVE #2382,D1 LEA PattText,A0 TST.B RecordMode BEQ.S srmskip LEA SongText,A0 srmskip MOVEQ #4,D0 BRA ShowText3 PattText dc.b 'patt' SongText dc.b 'song' RecordMode dc.b 0 QuantizeValue dc.b 1 MetroSpeed dc.b 4 MetroChannel dc.b 0 MultiFlag dc.b 0 SampleAllFlag dc.b 0 TrackPattFlag dc.b 0 ClipHalveFlag dc.b 0 AbortDecFlag dc.w 0 GetDecByte MOVE #1,AbortDecFlag BSR StorePtrCol BSR SetWaitPtrCol BSR UpdateLineCurPos BSR GetKey0_9 CMP.B #68,D1 BEQ.S gdbexit MOVE.B D1,D0 MULU #10,D0 MOVE.B D0,GetDecTemp BSR ShowOneDigit ADDQ #8,LineCurX BSR UpdateLineCurPos BSR GetKey0_9 CMP.B #68,D1 BEQ.S gdbexit ADD.B D1,GetDecTemp CLR AbortDecFlag gdbexit CLR LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos BSR RestorePtrCol MOVE.B GetDecTemp,D0 RTS SetQuantize CLR.B RawKeyCode MOVE #196,LineCurX MOVE #76,LineCurY MOVE #2824,TextOffset BSR GetDecByte TST AbortDecFlag BNE ShowQuantize CMP.B #63,D0 BLS.S tqskip MOVEQ.B #63,D0 tqskip MOVE.B D0,QuantizeValue ShowQuantize MOVE #2824,TextOffset CLR WordNumber MOVE.B QuantizeValue,WordNumber+1 BRA Print2DecDigits SetMetronome CLR.B RawKeyCode CMP #188,D0 BHS.S smchan MOVE #3261,TextOffset MOVE #172,LineCurX MOVE #87,LineCurY BSR GetDecByte TST AbortDecFlag BNE ShowMetronome CMP.B #64,D0 BLS.S smexit MOVEQ.B #64,D0 smexit MOVE.B D0,MetroSpeed BRA.S ShowMetronome smchan MOVE #3264,TextOffset BSR GetHexByte CMP #4,D0 BLS.S smexit2 MOVEQ #4,D0 smexit2 MOVE.B D0,MetroChannel ShowMetronome MOVE #3261,TextOffset CLR WordNumber MOVE.B MetroSpeed,WordNumber+1 BSR Print2DecDigits MOVE #3264,TextOffset CLR WordNumber MOVE.B MetroChannel,WordNumber+1 BRA Print2DecDigits ToggleMultiMode BSR WaitForButtonUp CLR.B RawKeyCode EOR.B #1,MultiFlag ShowMultiMode BSR.S Show_MS CMP #1,CurrScreen BNE Return2 CMP.B #2,EdScreen BNE Return2 TST.B EdEnable BEQ Return2 MOVE #3700,D1 LEA SingleText(PC),A0 TST.B MultiFlag BEQ.S smmskip LEA MultiText(PC),A0 smmskip MOVEQ #6,D0 BRA ShowText3 SingleText dc.b 'single' MultiText dc.b ' multi' Show_MS CMP #4,CurrScreen BEQ Return2 MOVE.B #' ',D0 TST.B MultiFlag BEQ.S smsskp1 MOVE.B #'M',D0 smsskp1 MOVE.B #' ',D1 TST.B SplitFlag BEQ.S smsskp2 MOVE.B #'S',D1 smsskp2 MOVE.B D0,mstext MOVE.B D1,mstext+1 MOVE #4121,D1 MOVEQ #2,D0 LEA mstext(PC),A0 BSR ShowText3 BRA ShowAutoInsert mstext dc.b '__' ;---- Edit Op. 3 ---- ToggleHalfClip BSR WaitForButtonUp EOR.B #1,HalfClipFlag ShowHalfClip LEA BitPlaneData+1838,A1 LEA S_BoxData+H_BoxData,A2 ;&& TST.B HalfClipFlag BEQ.S ogaoga LEA S_BoxData+C_BoxData,A2 ogaoga JMP rtdoit SetSamplePos MOVE.L SamplePos(PC),D2 CMP #283,D0 BLS Return2 CMP #295,D0 BLS.S shpoup SUBQ.L #1,D2 BTST #2,$DFF016 BNE.S shposkip SUB.L #15,D2 shposkip BPL.S shposkip2 MOVEQ #0,D2 shposkip2 MOVE.L D2,SamplePos BRA.S ShowPos shpoup ADDQ.L #1,D2 BTST #2,$DFF016 BNE.S shposkip3 ADD.L #15,D2 shposkip3 MOVEQ #0,D3 MOVE 22(A5),D3 LSL.L #1,D3 CMP.L D3,D2 BLS.S shposkip2 MOVE.L D3,SamplePos ShowPos CMP #1,CurrScreen BNE Return2 TST.B EdEnable BEQ Return2 CMP.B #3,EdScreen BNE Return2 MOVE #2391,TextOffset MOVE SamplePos+2(PC),WordNumber BRA PrintHexWord SetModSpeed CMP #243,D0 BLS DoMod MOVEQ #0,D2 BTST #2,$DFF016 BEQ.S semoskp MOVE.B ModSpeed,D2 CMP #283,D0 BLS Return2 CMP #295,D0 BLS.S semoup SUB.B #1,D2 CMP.B #127,D2 BNE.S semoskp MOVE.B #128,D2 BRA.S semoskp semoup ADD.B #1,D2 CMP.B #128,D2 BNE.S semoskp MOVEQ #127,D2 semoskp MOVE.B D2,ModSpeed BSR Wait_4000 ShowMod LEA PlusMinusText(PC),A0 MOVEQ #0,D6 MOVE.B ModSpeed,D6 BPL.S shmoskp NEG.B D6 ADDQ.L #1,A0 shmoskp MOVEQ #1,D0 MOVE #2831,D1 BSR ShowText3 MOVE D6,WordNumber BRA Print3DecDigits PlusMinusText dc.b ' -' DoMod BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D2 MOVE SampleInfo(PC),D2 BEQ ErrorRestoreCol LSL #1,D2 SUBQ #1,D2 MOVE.L si_pointer,D0 BEQ ErrorRestoreCol BSR AllocBuffer MOVE.L D0,A2 MOVE.L D0,A3 MOVE.L A1,A4 ADD.L D2,A3 CLR.L ModOffset CLR.L ModPos dmoloop CMP.L A3,A2 BHS.S dmoskip MOVE.B (A1),(A2)+ BSR.S UpdateMod BRA.S dmoloop dmoskip MOVE.L si_pointer(PC),A1 CLR (A1) BSR FreeBuffer BSR RestorePtrCol BRA DisplaySample UpdateMod MOVE.B ModSpeed(PC),D0 BEQ.S upmplus EXT D0 EXT.L D0 MOVE.L ModPos(PC),D1 ADD.L D0,D1 MOVE.L D1,ModPos ASR.L #8,D1 ASR.L #4,D1 MOVE.L D1,D3 AND #$1F,D1 LEA VibratoTable,A0 MOVEQ #0,D0 MOVE.B (A0,D1.W),D0 LSR.B #2,D0 MOVE.L ModOffset(PC),D1 BTST #5,D3 BEQ.S upmskip SUB.L D0,D1 BRA.S upmskp2 upmskip ADD.L D0,D1 upmskp2 ADD.L #$800,D1 MOVE.L D1,ModOffset ASR.L #8,D1 ASR.L #3,D1 BPL.S upmskp3 MOVEQ #0,D1 upmskp3 CMP.L D2,D1 BLO.S upmskp4 MOVE.L D2,D1 upmskp4 MOVE.L A4,A1 ADD.L D1,A1 RTS upmplus ADDQ.L #1,A1 RTS CutBeg CMP #283,D0 BHI FadeDown CMP #259,D0 BHI FadeUp BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D3 MOVE SampleInfo(PC),D3 BEQ ErrorRestoreCol LSL #1,D3 SUBQ #1,D3 MOVE.L si_pointer,D0 BEQ ErrorRestoreCol MOVE.L D0,A1 MOVE.L D0,A2 MOVE.L D0,A3 ADD.L SamplePos(PC),A2 ADD.L D3,A3 cbeloop CMP.L A3,A2 BHS.S cbeskip MOVE.B (A2),D0 CLR.B (A2)+ MOVE.B D0,(A1)+ BRA.S cbeloop cbeskip MOVE.L si_pointer(PC),A2 CLR (A2) SUB.L A2,A1 MOVE.L A1,D0 LSR.L #1,D0 ADDQ.L #1,D0 AND #$7FFF,D0 MOVE D0,22(A5) BSR ShowSampleInfo BSR RestorePtrCol BRA DisplaySample FadeUp BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D3 MOVE SampleInfo(PC),D3 BEQ ErrorRestoreCol MOVEQ #0,D1 MOVE.L SamplePos(PC),D2 BEQ ErrorRestoreCol MOVE.L si_pointer,D0 BEQ ErrorRestoreCol MOVE.L D0,A0 LSR #1,D2 BEQ ErrorRestoreCol MOVEQ #0,D4 fuloop MOVE.B (A0),D0 EXT D0 MULS D1,D0 DIVS D2,D0 MOVE.B D0,(A0)+ ADDQ #1,D4 MOVE D4,D1 LSR #1,D1 CMP D2,D1 BLO.S fuloop BSR RestorePtrCol BRA DisplaySample FadeDown BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D3 MOVE SampleInfo(PC),D3 BEQ ErrorRestoreCol LSL.L #1,D3 SUBQ.L #1,D3 ;Length-1 MOVE.L SamplePos(PC),D2 CMP.L D3,D2 BHS ErrorRestoreCol MOVE.L D3,D4 ; Copy length to D4 SUB.L D2,D3 ; Length-pos MOVE.L D3,D2 ; Copy offset to D2 MOVE.L si_pointer,D0 BEQ ErrorRestoreCol MOVE.L D0,A0 LEA (A0,D4.L),A0 ;Start at end of sample LSR #1,D2 BEQ ErrorRestoreCol MOVEQ #0,D1 MOVEQ #0,D4 fdloop MOVE.B (A0),D0 EXT D0 MULS D1,D0 DIVS D2,D0 MOVE.B D0,(A0) SUBQ.L #1,A0 ADDQ #1,D4 MOVE D4,D1 LSR #1,D1 CMP D2,D1 BLO.S fdloop BSR RestorePtrCol BRA DisplaySample ChangeVolume MOVE SampleVol(PC),D2 CMP #243,D0 BLS DoChangeVol CMP #283,D0 BLS Return2 CMP #295,D0 BLS shvoup SUBQ #1,D2 BTST #2,$DFF016 BNE.S shvoskip SUB #9,D2 shvoskip BPL.S shvoskip2 MOVEQ #0,D2 shvoskip2 MOVE D2,SampleVol BSR Wait_4000 BRA.S ShowVol shvoup ADDQ.L #1,D2 BTST #2,$DFF016 BNE.S shvoskip3 ADD #9,D2 shvoskip3 CMP #999,D2 BLS.S shvoskip2 MOVE #999,SampleVol BSR Wait_4000 ShowVol MOVE #3711,TextOffset MOVE SampleVol(PC),WordNumber BSR Print3DecDigits LEA PercentText(PC),A0 MOVE #1,TextLength BRA ShowText2 PercentText dc.b '%',0 DoChangeVol BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D3 MOVE SampleInfo(PC),D3 BEQ ErrorRestoreCol LSL #1,D3 SUBQ #1,D3 MOVE.L si_pointer,D0 BEQ ErrorRestoreCol MOVE.L D0,A1 MOVE SampleVol(PC),D0 dcvloop MOVE.B (A1),D1 EXT D1 MULS D0,D1 DIVS #100,D1 CMP #127,D1 BLE.S dcvskip MOVEQ #127,D1 dcvskip CMP #-128,D1 BGE.S dcvskp2 MOVEQ #-128,D1 dcvskp2 MOVE.B D1,(A1)+ DBF D3,dcvloop MOVE.L si_pointer(PC),A1 CLR (A1) BSR RestorePtrCol BRA DisplaySample Mix BTST #2,$DFF016 BEQ OldMix BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVE #1,GetLineFlag MOVE #4,MixCurPos mixlopx BSR DisplayMix BSR GetHexKey TST.B D0 BNE.S mixnzro CMP.B #68,MixChar BEQ Mix2 CMP.B #69,MixChar BEQ EndMix BTST #2,$DFF016 BEQ EndMix mixpchr LEA MixText(PC),A0 LEA FastHexTable+1,A1 LSL #1,D1 MOVE MixCurPos(PC),D0 MOVE.B (A1,D1.W),(A0,D0.W) MixMoveRight MOVE MixCurPos,D0 ADDQ #1,D0 CMP #6,D0 BEQ.S mmrp1 CMP #9,D0 BEQ.S mmrp2 CMP #15,D0 BHS.S mmrp3 mmrok MOVE D0,MixCurPos BRA mixlopx mmrp1 MOVEQ #7,D0 BRA.S mmrok mmrp2 MOVEQ #13,D0 BRA.S mmrok mmrp3 MOVEQ #14,D0 BRA.S mmrok mixnzro CMP.B #1,D0 BEQ.S MixMoveRight MixMoveLeft MOVE MixCurPos,D0 SUBQ #1,D0 CMP #4,D0 BLO.S mmlp1 CMP #6,D0 BEQ.S mmlp2 CMP #12,D0 BEQ.S mmlp3 BRA.S mmrok mmlp1 MOVEQ #4,D0 BRA.S mmrok mmlp2 MOVEQ #5,D0 BRA.S mmrok mmlp3 MOVEQ #8,D0 BRA.S mmrok DisplayMix MOVE #53,LineCurY MOVE MixCurPos,D0 LSL #3,D0 ADD #132,D0 MOVE D0,LineCurX BSR UpdateLineCurPos LEA MixText(PC),A0 MOVE #1936,D1 MOVEQ #22,D0 BSR ShowText3 BSR Wait_4000 BSR Wait_4000 BRA Wait_4000 MixText dc.b 'mix 01+02 to 03 ' MixChar dc.b 0,0 MixCurPos dc.w 0 ToSam dc.w 0 FromPtr1 dc.l 0 FromPtr2 dc.l 0 ToPtr dc.l 0 MixPtr dc.l 0 MixLength dc.l 0 EndMix CLR.B RawKeyCode BSR RestoreMix BRA RestorePtrCol RestoreMix CLR GetLineFlag MOVE #270,LineCurY CLR LineCurX BSR UpdateLineCurPos LEA EditOpText3(PC),A0 MOVE #1936,D1 MOVEQ #22,D0 BRA ShowText3 Mix2 BSR RestoreMix BSR TurnOffVoices LEA SamplePtrs,A2 MOVEQ #0,D0 LEA MixText+4(PC),A0 BSR HexToInteger2 TST D0 BEQ SamOutOfRange CMP #$1F,D0 BHI SamOutOfRange LSL #2,D0 LEA (A2,D0.W),A3 MOVE.L A3,FromPtr1 MOVEQ #0,D0 LEA MixText+7(PC),A0 BSR HexToInteger2 TST D0 BEQ SamOutOfRange CMP #$1F,D0 BHI SamOutOfRange LSL #2,D0 LEA (A2,D0.W),A3 MOVE.L A3,FromPtr2 MOVEQ #0,D0 LEA MixText+13(PC),A0 BSR HexToInteger2 MOVE D0,ToSam BEQ SamOutOfRange CMP #$1F,D0 BHI SamOutOfRange LSL #2,D0 LEA (A2,D0.W),A3 MOVE.L A3,ToPtr MOVE.L FromPtr1,A1 MOVE.L FromPtr2,A2 MOVE.L 124(A1),D1 MOVE.L 124(A2),D2 CMP.L D1,D2 BLO.S mixnswp EXG D1,D2 mixnswp TST.L D1 BEQ SamEmptyError ; Both samples had length=0 MOVE.L D1,D0 AND.L #$FFFF,D0 MOVE.L D0,MixLength MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,MixPtr BEQ SamMemError ; No memory for new sample... LEA mixingtext(PC),A0 BSR ShowStatusText MOVE.L FromPtr1(PC),A1 MOVE.L 124(A1),D1 MOVE.L (A1),A1 MOVE.L FromPtr2(PC),A2 MOVE.L 124(A2),D2 MOVE.L (A2),A2 MOVE.L MixPtr(PC),A3 MOVE.L MixLength,D3 TST D1 BEQ.S mixnd1 SUBQ #1,D1 mixnd1 TST D2 BEQ.S mixnd2 SUBQ #1,D2 mixnd2 SUBQ #1,D3 mixlop2 MOVE.B (A1),D4 EXT D4 MOVE.B (A2),D0 EXT D0 ADD D4,D0 TST.B HalfClipFlag BEQ mixhalf CMP #127,D0 BLE.S mixnbig MOVEQ #127,D0 mixnbig CMP #-128,D0 BGE mixokok MOVEQ #-128,D0 BRA mixokok mixhalf ASR #1,D0 mixokok MOVE.B D0,(A3)+ TST D1 BEQ.S zerd1 ADDQ.L #1,A1 SUBQ #1,D1 BNE.S zerd1 SUB.L A1,A1 zerd1 TST D2 BEQ.S zerd2 ADDQ.L #1,A2 SUBQ #1,D2 BNE.S zerd2 SUB.L A2,A2 zerd2 DBF D3,mixlop2 MOVE ToSam(PC),InsNum BSR FreeSample MOVE.L ToPtr(PC),A0 MOVE.L MixPtr(PC),A1 CLR (A1) MOVE.L A1,(A0) MOVE.L MixLength(PC),124(A0) MOVE.L SongDataPtr(PC),A0 MOVE ToSam(PC),D0 SUBQ #1,D0 MULU #30,D0 LEA 20(A0,D0.W),A0 MOVE.L MixLength(PC),D0 LSR #1,D0 MOVE D0,22(A0) MOVE #$0040,24(A0) MOVE #$0000,26(A0) MOVE #$0001,28(A0) BSR RestorePtrCol BSR ShowAllRight BSR ShowSampleInfo BRA DisplaySample SamOutOfRange LEA mixerrtext1(PC),A0 BSR ShowStatusText BRA ErrorRestoreCol SamEmptyError LEA mixerrtext2(PC),A0 BSR ShowStatusText BRA ErrorRestoreCol SamMemError LEA mixerrtext3(PC),A0 BSR ShowStatusText BRA ErrorRestoreCol OutOfMemErr LEA mixerrtext3(PC),A0 BSR ShowStatusText BSR SetErrorPtrCol MOVEQ #0,D0 RTS mixerrtext1 dc.b 'not range 01-1F !',0 mixerrtext2 dc.b 'empty samples !!!',0 mixerrtext3 dc.b 'out of memory !!!',0 mixingtext dc.b 'mixing samples...',0 OldMix MOVE.L SamplePos(PC),FlangePos DoMix BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D2 MOVE SampleInfo(PC),D2 ; 22(A0) BEQ Return2 LSL #1,D2 MOVE.L si_pointer(PC),D0 BEQ ErrorRestoreCol BSR AllocBuffer MOVE.L D0,A2 MOVE.L D0,A3 MOVE.L A1,A4 ADD.L D2,A3 ADD.L FlangePos(PC),A2 CLR.L ModOffset CLR.L ModPos MOVEQ #-1,D7 mixloop ADDQ.L #1,D7 CMP.L A3,A2 BHS mixskip MOVE.L MarkStartOfs(PC),D0 BMI.S omxget MOVE.L MarkEndOfs(PC),D1 CMP.L D0,D1 BEQ.S omxget CMP.L D0,D7 BLO.S omxok2 CMP.L D1,D7 BHI.S omxok2 omxget MOVE.B (A2),D0 EXT D0 MOVE.B (A1),D1 EXT D1 ADD D1,D0 TST.B HalfClipFlag BEQ.S omxhalf CMP #127,D0 BLE.S omxnbig MOVEQ #127,D0 omxnbig CMP #-128,D0 BGE.S omxokok MOVEQ #-128,D0 BRA.S omxokok omxhalf ASR #1,D0 omxokok MOVE.B D0,(A2)+ BSR UpdateMod BRA.S mixloop omxok2 ADDQ.L #1,A2 BSR UpdateMod BRA.S mixloop mixskip MOVE.L si_pointer(PC),A1 CLR (A1) BSR FreeBuffer BSR RestorePtrCol BSR WaitForButtonUp TST DispOrRedraw BEQ DisplaySample CLR DispOrRedraw BRA RedrawSample DispOrRedraw dc.w 0 AllocBuffer MOVE.L D0,D7 MOVE.L D2,D0 MOVE.L D2,BufMemSize MOVE.L #MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,BufMemPtr BEQ OutOfMemErr MOVE.L D7,A0 MOVE.L D0,A1 MOVE.L BufMemSize(PC),D0 SUBQ.L #1,D0 albloop MOVE.B (A0)+,(A1)+ DBF D0,albloop MOVE.L BufMemPtr(PC),A1 MOVE.L D7,D0 RTS FreeBuffer MOVE.L BufMemPtr(PC),D0 BEQ Return2 MOVE.L D0,A1 MOVE.L BufMemSize(PC),D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) CLR.L BufMemPtr RTS Echo MOVE.L SamplePos(PC),FlangePos BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D2 MOVE SampleInfo(PC),D2 ; 22(A0) BEQ ErrorRestoreCol LSL #1,D2 MOVE.L si_pointer(PC),D0 BEQ ErrorRestoreCol MOVE.L D0,A1 MOVE.L D0,A2 MOVE.L D0,A3 MOVE.L D0,A4 ADD.L D2,A3 ADD.L FlangePos(PC),A2 CLR.L ModOffset CLR.L ModPos flaloop CMP.L A3,A2 BHS flaskip MOVE.B (A2),D0 EXT D0 MOVE.B (A1),D1 EXT D1 ADD D1,D0 ASR #1,D0 MOVE.B D0,(A2)+ BSR UpdateMod BRA flaloop flaskip MOVE.L si_pointer(PC),A1 CLR (A1) BSR RestorePtrCol TST.B HalfClipFlag BEQ DisplaySample MOVE SampleVol,-(SP) MOVE #200,SampleVol BSR DoChangeVol MOVE (SP)+,SampleVol BRA DisplaySample Filter2 MOVE #1,DispOrRedraw Filter CLR.B RawKeyCode LEA FilteringText,A0 BSR ShowStatusText MOVE.L #1,FlangePos MOVE.B ModSpeed(PC),-(SP) MOVE.B HalfClipFlag,-(SP) CLR.B ModSpeed CLR.B HalfClipFlag BSR DoMix MOVE.B (SP)+,HalfClipFlag MOVE.B (SP)+,ModSpeed BRA ShowAllRight FilteringText dc.b 'filtering',0 Boost BSR.S Boost3 BRA DisplaySample Boost2 BSR.S Boost3 BRA RedrawSample Boost3 CLR.B RawKeyCode BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol LEA BoostingText,A0 BSR ShowStatusText MOVEQ #0,D3 MOVE SampleInfo(PC),D3 BEQ booend LSL #1,D3 SUBQ #1,D3 MOVE.L si_pointer(PC),D0 BEQ booend MOVE.L D0,A1 MOVE.L MarkStartOfs(PC),D0 BMI.S booskp1 MOVE.L MarkEndOfs(PC),D1 SUB.L D0,D1 BEQ.S booskp1 MOVE.L D1,D3 MOVE.L SamStart(PC),A1 ADD.L D0,A1 booskp1 MOVEQ #0,D0 booloop MOVE.B (A1),D1 EXT D1 MOVE D1,D2 SUB D0,D1 MOVE D2,D0 TST D1 BMI booneg ASR #2,D1 ADD D1,D2 BRA booskip booneg NEG D1 ASR #2,D1 SUB D1,D2 booskip CMP #127,D2 BLE booskp2 MOVEQ #127,D2 booskp2 CMP #-128,D2 BGE booskp3 MOVEQ #-128,D2 booskp3 MOVE.B D2,(A1)+ DBF D3,booloop MOVE.L si_pointer(PC),A1 CLR (A1) booend BSR ShowAllRight BRA RestorePtrCol BoostingText dc.b 'boosting',0,0 XFade BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D2 MOVE SampleInfo(PC),D2 ; 22(A0) BEQ ErrorRestoreCol ADD D2,D2 MOVE.L si_pointer(PC),D0 BEQ ErrorRestoreCol MOVE.L D0,A1 MOVE.L D0,A2 ADD.L D2,A2 xfaloop MOVE.B (A1),D0 EXT D0 MOVE.B -(A2),D1 EXT D1 ADD D1,D0 TST.B HalfClipFlag BEQ xfahalf CMP #127,D0 BLE xfanbig MOVEQ #127,D0 xfanbig CMP #-128,D0 BGE xfaokok MOVEQ #-128,D0 BRA xfaokok xfahalf ASR #1,D0 xfaokok MOVE.B D0,(A1)+ MOVE.B D0,(A2) CMP.L A2,A1 BLO.S xfaloop MOVE.L si_pointer(PC),A1 CLR (A1) BSR RestorePtrCol BRA DisplaySample Backwards BSR WaitForButtonUp BSR StorePtrCol BSR SetWaitPtrCol MOVEQ #0,D2 MOVE 22(A5),D2 BEQ ErrorRestoreCol MOVE.L si_pointer(PC),D0 BEQ ErrorRestoreCol MOVE.L D0,A1 MOVE.L D0,A2 ADD.L D2,D2 ADD.L D2,A2 MOVE.L MarkStartOfs(PC),D0 BMI.S bacloop MOVE.L MarkEndOfs(PC),D1 SUB.L D0,D1 BEQ.S bacloop MOVE.L SamStart(PC),A1 ADD.L D0,A1 MOVE.L A1,A2 ADD.L D1,A2 bacloop MOVE.B (A1),D0 MOVE.B -(A2),(A1)+ MOVE.B D0,(A2) CMP.L A2,A1 BLO.S bacloop MOVE.L si_pointer(PC),A1 CLR (A1) BSR RestorePtrCol BRA DisplaySample UpSample BSR WaitForButtonUp LEA UpsampleText,A0 BSR AreYouSure BNE Return2 BSR TurnOffVoices BSR StorePtrCol BSR SetWaitPtrCol MOVE InsNum(PC),D0 LSL #2,D0 LEA SamplePtrs(PC),A0 LEA (A0,D0.W),A0 MOVE.L 124(A0),D3 CMP.L #2,D3 BLS ErrorRestoreCol MOVE.L (A0),D0 BEQ ErrorRestoreCol MOVE.L D0,A2 MOVE.L D0,A4 MOVE.L D3,D4 LSR.L #1,D3 BCLR #0,D3 MOVE.L D3,D0 MOVEQ #MEMF_CHIP,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) TST.L D0 BEQ.S upserro MOVE.L D0,A3 MOVE.L D0,D2 MOVE.L D3,D5 SUBQ.L #1,D3 upsloop MOVE.B (A2)+,(A3)+ ADDQ.L #1,A2 DBF D3,upsloop MOVE.L A4,A1 MOVE.L D4,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) MOVE InsNum(PC),D0 LSL #2,D0 LEA SamplePtrs(PC),A0 LEA (A0,D0.W),A0 MOVE.L D2,(A0) MOVE.L D5,124(A0) MOVE.L D2,A0 CLR (A0) MOVE 22(A5),D0 LSR #1,D0 MOVE D0,22(A5) MOVE 26(A5),D0 LSR #1,D0 MOVE D0,26(A5) MOVE 28(A5),D0 LSR #1,D0 BNE upsskip2 MOVEQ #1,D0 upsskip2 MOVE D0,28(A5) BSR ShowSampleInfo BSR WaitForButtonUp BSR RestorePtrCol BRA RedrawSample upserro BSR RestorePtrCol BRA OutOfMemErr DownSample BSR WaitForButtonUp TST InsNum BEQ NotSampleNull LEA DownSampleText,A0 JSR AreYouSure BNE Return2 BSR TurnOffVoices BSR StorePtrCol BSR SetWaitPtrCol MOVE.L si_pointer(PC),D0 BEQ ErrorRestoreCol MOVEQ #0,D0 MOVE SampleInfo(PC),D0 BEQ ErrorRestoreCol LSL.L #1,D0 CMP.L #$FFFE,D0 BHI ErrorRestoreCol LSL.L #1,D0 CMP.L #$FFFE,D0 BLS dnsskip MOVE.L #$FFFE,D0 dnsskip MOVE.L D0,BufMemSize MOVEQ #MEMF_CHIP,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,BufMemPtr BEQ SamMemError MOVE.L si_pointer(PC),A1 MOVE.L D0,A2 MOVE.L BufMemSize,D3 LSR.L #1,D3 SUBQ.L #1,D3 dnsloop MOVE.B (A1)+,D0 MOVE.B D0,(A2)+ MOVE.B D0,(A2)+ DBF D3,dnsloop BSR FreeSample LEA SamplePtrs,A0 MOVE InsNum(PC),D0 LSL #2,D0 MOVE.L BufMemPtr,(A0,D0.W) MOVE.L BufMemSize,124(A0,D0.W) MOVE 22(A5),D0 LSL #1,D0 CMP #$7FFF,D0 BLS dnsok1 MOVE #$7FFF,D0 dnsok1 MOVE D0,22(A5) MOVE 26(A5),D0 LSL #1,D0 CMP #$7FFF,D0 BLS dnsok2 MOVE #$7FFF,D0 dnsok2 MOVE D0,26(A5) MOVE 28(A5),D0 CMP #1,D0 BEQ dnsok3 LSL #1,D0 CMP #$7FFF,D0 BLS dnsok3 MOVE #$7FFF,D0 dnsok3 MOVE D0,28(A5) BSR ShowSampleInfo BSR WaitForButtonUp BSR RestorePtrCol BRA RedrawSample SamplePos dc.l 0 SampleVol dc.w 100 FlangePos dc.l 0 ModSpeed dc.b 0 HalfClipFlag dc.b 0 ModPos dc.l 0 ModOffset dc.l 0 BufMemPtr dc.l 0 BufMemSize dc.l 0 ;---- Save Song ---- SaveSong BSR StopIt CLR.B RawKeyCode MOVE.L SongDataPtr(PC),A0 LEA SampleLengthAdd(PC),A1 MOVEQ #0,D0 MOVEQ #2,D1 sadloop MOVE (A1,D1.W),D2 ADD D2,42(A0,D0.W) ADD #30,D0 ADDQ #2,D1 CMP #62,D1 BNE sadloop LEA sd_pattpos(A0),A0 MOVEQ #0,D0 MOVEQ #0,D1 MOVEQ #0,D2 CLR HighPattNum ssloop MOVE.B 0(A0,D0.W),D1 ADDQ #1,D0 CMP #128,D0 BHI DoSaveSong MOVE HighPattNum(PC),D2 CMP D2,D1 BLS ssloop MOVE D1,HighPattNum BRA ssloop DoSaveSong LEA SongsPath2,A0 JSR CopyPath MOVE.L SongDataPtr(PC),A0 MOVEQ #19,D0 dssloop MOVE.B (A0)+,(A1)+ DBF D0,dssloop MOVE.L #FileName,FileNamePtr MOVE.L SongDataPtr(PC),DiskDataPtr MOVE.L #1084,DiskDataLength MOVEQ #0,D0 MOVE HighPattNum,D0 ADDQ.L #1,D0 LSL.L #8,D0 LSL.L #2,D0 ADD.L D0,DiskDataLength MOVE.B PackMode,D0 BTST #0,D0 BEQ dssnocr LEA CrunchingText(PC),A0 BSR ShowStatusText BSR Cruncher dssnocr BSR DoSaveData MOVE.B PackMode,D0 BTST #0,D0 BEQ dssnoc2 LEA DecrunchingText(PC),A0 BSR ShowStatusText BSR Decruncher dssnoc2 MOVE.L SongDataPtr(PC),A0 LEA SampleLengthAdd(PC),A1 MOVEQ #0,D0 MOVEQ #2,D1 ssuloop MOVE (A1,D1.W),D2 SUB D2,42(A0,D0.W) ADD #30,D0 ADD #2,D1 CMP #62,D1 BNE ssuloop BSR ShowAllRight SetNormalPtrCol2 JMP SetNormalPtrCol Cruncher BSR SetNormalPtrCol2 MOVE.L SongDataPtr(PC),A0 MOVE.L A0,A1 LEA 12(A1),A1 MOVE.L A1,SongPlus12Ptr MOVE.L A0,A1 ADD.L #70716,A1 ; hoeh... MOVE.L A1,SongPlus70kPtr MOVE.L A0,A1 ADD.L #70716,A1 SUB.L DiskDataLength(PC),A1 MOVE.L A1,EndOfSongPtr MOVE.L DiskDataLength(PC),RealSongLength MOVE.L SongDataPtr(PC),A0 ADD.L DiskDataLength(PC),A0 MOVE.L SongDataPtr(PC),A1 ADD.L #70716,A1 MOVE.L DiskDataLength(PC),D0 cloop MOVE.B -(A0),-(A1) SUBQ.L #1,D0 BNE cloop BSR DoCrunch SUB.L SongPlus12Ptr(PC),A2 MOVE.L A2,D0 MOVE.L D0,CrunchedSongLength MOVE.L D0,D1 ADD.L SongPlus12Ptr(PC),D1 MOVE.L D1,DontKnowWhat MOVE.L SongDataPtr(PC),A0 MOVE.L #'PACK',(A0) MOVE.L CrunchedSongLength,4(A0) MOVE.L RealSongLength(PC),8(A0) MOVE.L SongDataPtr(PC),DiskDataPtr MOVE.L CrunchedSongLength(PC),D0 ADD.L #12,D0 MOVE.L D0,DiskDataLength RTS EndOfSongPtr dc.l 0 SongPlus70kPtr dc.l 0 RealSongLength dc.l 0 SongPlus12Ptr dc.l 0 DontKnowWhat dc.l 0 CrunchedSongLength dc.l 0 DoCrunch MOVE.L EndOfSongPtr(PC),A0 MOVE.L SongPlus70kPtr(PC),A1 MOVE.L SongPlus12Ptr(PC),A2 MOVEQ #1,D2 CLR D1 dcloop BSR DoCrunch2 TST.B D0 BEQ dcskip ADDQ #1,D1 CMP #$0108,D1 BNE dcskip BSR DoCrunch6 dcskip CMP.L A0,A1 BGT dcloop BSR DoCrunch6 BRA DoCrunch8 DoCrunch2 MOVE.L A0,A3 LEA 127(A3),A3 CMP.L A1,A3 BLE dc2skip MOVE.L A1,A3 dc2skip MOVEQ #1,D5 MOVE.L A0,A5 ADDQ.L #1,A5 dc2_1 MOVE.B (A0),D3 MOVE.B 1(A0),D4 MOVE D3,$DFF1A2 dc2loop CMP.B (A5)+,D3 BNE dc2skip2 CMP.B (A5),D4 BEQ DoCrunch3 dc2skip2 CMP.L A5,A3 BGT dc2loop BRA dc4_3 DoCrunch3 SUBQ.L #1,A5 MOVE.L A0,A4 dc3loop MOVE.B (A4)+,D3 CMP.B (A5)+,D3 BNE dc3skip CMP.L A5,A3 BGT dc3loop dc3skip MOVE.L A4,D3 SUB.L A0,D3 SUBQ.L #1,D3 CMP.L D3,D5 BGE dc4_2 MOVE.L A5,D4 SUB.L A0,D4 SUB.L D3,D4 SUBQ.L #1,D4 CMP.L #4,D3 BLE DoCrunch4 MOVEQ #6,D6 CMP.L #$00000101,D3 BLT dc3skip2 MOVE #$0100,D3 dc3skip2 BRA dc4_1 DoCrunch4 MOVE D3,D6 SUBQ #2,D6 LSL #1,D6 dc4_1 LEA CrunchData3(PC),A6 CMP 0(A6,D6.W),D4 BGE dc4_2 MOVE.L D3,D5 MOVE.L D4,CrunchData1 MOVE.B D6,CrunchData2 dc4_2 CMP.L A5,A3 BGT dc2_1 dc4_3 CMP.L #1,D5 BEQ DoCrunch5 BSR DoCrunch6 MOVE.B CrunchData2(PC),D6 MOVE.L CrunchData1(PC),D3 MOVE 8(A6,D6.W),D0 BSR DoCrunch7 MOVE $0010(A6,D6.W),D0 BEQ dc4skip MOVE.L D5,D3 SUBQ #1,D3 BSR DoCrunch7 dc4skip MOVE $0018(A6,D6.W),D0 MOVE $0020(A6,D6.W),D3 BSR DoCrunch7 ADDQ #1,$0028(A6,D6.W) ADD.L D5,A0 CLR.B D0 RTS DoCrunch5 MOVE.B (A0)+,D3 MOVEQ #8,D0 BSR DoCrunch7 MOVEQ #1,D0 RTS CrunchData1 dc.l 0 CrunchData2 dc.b 0,0 CrunchData3 dc.w $0100,$0200,$0400,$1000,8,9,10,8 dc.w 0,0,0,8,2,3,3,3,1,4,5,6,0,0,0,0 CrunchData4 dc.w 0 CrunchData5 dc.w 0 DoCrunch6 TST D1 BEQ Return2 MOVE D1,D3 CLR D1 CMP #9,D3 BGE dc6_2 ADDQ #1,CrunchData4 SUBQ #1,D3 MOVEQ #5,D0 BRA DoCrunch7 dc6_2 ADDQ #1,CrunchData5 SUB #9,D3 OR #$0700,D3 MOVEQ #11,D0 DoCrunch7 SUBQ #1,D0 dc7loop LSR.L #1,D3 ROXL.L #1,D2 BCS dc8_2 DBF D0,dc7loop RTS DoCrunch8 CLR D0 dc8_2 MOVE.L D2,(A2)+ MOVEQ #1,D2 DBF D0,dc7loop RTS Decruncher MOVE.L SongDataPtr(PC),A0 LEA 12(A0),A0 MOVE.L EndOfSongPtr(PC),A1 MOVE.L CrunchedSongLength(PC),D0 MOVE.L RealSongLength(PC),D1 BSR DoDecrunch MOVE.L EndOfSongPtr(PC),A0 MOVE.L SongDataPtr(PC),A1 MOVE.L RealSongLength(PC),D0 ddcloop MOVE.B (A0)+,(A1)+ SUBQ.L #1,D0 BNE ddcloop MOVE.L SongDataPtr(PC),A0 ADD.L #$0001143C,A0 MOVE.L SongDataPtr(PC),A1 ADD.L RealSongLength(PC),A1 SUB.L A1,A0 MOVE.L A0,D0 ddcloop2 CLR.B (A1)+ SUBQ.L #1,D0 BNE ddcloop2 RTS DoDecrunch ADD.L D0,A0 MOVE.L D1,A2 ADD.L A1,A2 MOVE.L -(A0),D0 dec_1 LSR.L #1,D0 BNE.S decskip BSR.S dec5 decskip BCS.S dec3 MOVEQ #8,D1 MOVEQ #1,D3 LSR.L #1,D0 BNE.S decskip2 BSR.S dec5 decskip2 BCS.S dec4_1 MOVEQ #3,D1 CLR D4 dec_2 BSR.S dec6 MOVE D2,D3 ADD D4,D3 decloop1 MOVEQ #7,D1 decloop2 LSR.L #1,D0 BNE.S decskip3 BSR.S dec5 decskip3 ROXL.L #1,D2 DBF D1,decloop2 MOVE.B D2,-(A2) DBF D3,decloop1 BRA.S dec4_3 dec2 MOVEQ #8,D1 MOVEQ #8,D4 BRA.S dec_2 dec3 MOVEQ #2,D1 BSR.S dec6 CMP.B #2,D2 BLT.S dec4 CMP.B #3,D2 BEQ.S dec2 MOVEQ #8,D1 BSR.S dec6 MOVE D2,D3 MOVE #8,D1 BRA.S dec4_1 dec4 MOVE #9,D1 ADD D2,D1 ADDQ #2,D2 MOVE D2,D3 dec4_1 BSR.S dec6 dec4_2 SUBQ #1,A2 MOVE.B 0(A2,D2.W),(A2) DBF D3,dec4_2 dec4_3 CMP.L A2,A1 BLT.S dec_1 RTS dec5 MOVE.L -(A0),D0 MOVE D0,$DFF1A2 MOVE #$10,CCR ROXR.L #1,D0 RTS dec6 SUBQ #1,D1 CLR D2 dec6loop LSR.L #1,D0 BNE.S dec6skip MOVE.L -(A0),D0 MOVE D0,$DFF1A2 MOVE #$10,CCR ROXR.L #1,D0 dec6skip ROXL.L #1,D2 DBF D1,dec6loop RTS LoadModule MOVE #1,LoadInProgress BSR DoClearSong BSR ClrSampleInfo JSR SetDiskPtrCol LEA ModulesPath2,A0 JSR CopyPath LEA DirInputName,A0 MOVEQ #DirNameLength-1,D0 lmloop2 MOVE.B (A0)+,(A1)+ DBF D0,lmloop2 LEA LoadingModuleText(PC),A0 BSR ShowStatusText MOVE.L DOSBase(PC),A6 MOVE.L #FileName,D1 MOVE.L #1005,D2 JSR LVOOpen(A6) MOVE.L D0,FileHandle TST D0 BEQ CantOpenFile MOVE.L D0,D1 MOVE.L SongDataPtr(PC),D2 MOVE.L #1084,D3 JSR LVORead(A6) MOVE.L SongDataPtr(PC),A0 CMP.L #'PP20',(A0) BEQ PowerPacked MOVE.B #127,sd_numofpatt+1(A0) ; Set maxpatt to 127 CMP.L #'M.K.',sd_mahokakt(A0) ; M.K. again... BEQ lmskip BSR MahoneyAndKaktus BNE lmskip MOVE.L FileHandle(PC),D1 MOVE.L #600,D2 MOVEQ #-1,D3 JSR LVOSeek(A6) lmskip LEA LoadingModuleText(PC),A0 BSR ShowStatusText MOVE.L SongDataPtr(PC),A0 LEA sd_pattpos(A0),A0 MOVEQ #0,D0 MOVE.B -1(A0),D0 MOVEQ #0,D3 lmloop3 CMP.B (A0)+,D3 BHI lmskip2 MOVE.B -1(A0),D3 lmskip2 DBF D0,lmloop3 ADDQ #1,D3 MULU #1024,D3 MOVE.L FileHandle(PC),D1 MOVE.L SongDataPtr(PC),D2 ADD.L #1084,D2 MOVE.L DOSBase,A6 JSR LVORead(A6) CLR.L PatternNumber CLR.L CurrPos BSR RedrawPattern CLR ScrPattPos BSR SetScrPatternPos MOVE #1,InsNum BSR CheckAbort BEQ rmiend TST.B AutoExitFlag BEQ readinstrloop JSR ExitFromDir readinstrloop TST.B NosamplesFlag BNE rmiend BSR CheckAbort BEQ rmiend BSR ShowSampleInfo MOVE InsNum(PC),TuneUp JSR DoShowFreeMem MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D7 MULU #30,D7 MOVEQ #0,D0 MOVE 12(A0,D7.W),D0 BEQ rminext ADD.L D0,D0 MOVE.L 4.W,A6 MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L D0,-(SP) JSR LVOAllocMem(A6) MOVE.L (SP)+,D6 TST.L D0 BNE ReadModInstrument BSR OutOfMemErr MOVE.L DOSBase(PC),A6 MOVE.L FileHandle(PC),D1 MOVE.L D6,D2 MOVEQ #0,D3 BRA rminext ReadModInstrument MOVE InsNum(PC),D7 LSL #2,D7 LEA SamplePtrs(PC),A0 MOVE.L D0,0(A0,D7.W) MOVE.L D6,124(A0,D7.W) MOVE.L DOSBase(PC),A6 MOVE.L FileHandle(PC),D1 MOVE.L D0,D2 MOVE.L D6,D3 JSR LVORead(A6) BSR RedrawSample rminext ADDQ #1,InsNum CMP #32,InsNum BNE readinstrloop rmiend MOVE.L FileHandle(PC),D1 MOVE.L DOSBase(PC),A6 JSR LVOClose(A6) MOVE #1,InsNum MOVE.L #6,CurrSpeed CLR LoadInProgress BSR ShowAllRight JSR SetNormalPtrCol BSR CheckInstrLengths BSR ShowSampleInfo BSR RedrawSample JMP DoShowFreeMem PowerPacked LEA PowerPackedText,A0 BSR ShowStatusText JSR SetErrorPtrCol BSR DoClearSong BSR ClrSampleInfo BRA rmiend PowerPackedText dc.b "Powerpacker mod.!",0 SaveModule JSR StorePtrCol JSR SetDiskPtrCol MOVE.L SongDataPtr(PC),A0 LEA sd_pattpos(A0),A0 MOVEQ #0,D0 MOVEQ #0,D1 MOVEQ #0,D2 CLR HighPattNum smloop MOVE.B 0(A0,D0.W),D1 ADDQ #1,D0 CMP #128,D0 BHI DoSaveModule MOVE HighPattNum(PC),D2 CMP D2,D1 BLS smloop MOVE D1,HighPattNum BRA smloop DoSaveModule LEA ModulesPath2,A0 JSR CopyPath MOVE.B #'m',(A1)+ MOVE.B #'o',(A1)+ MOVE.B #'d',(A1)+ MOVE.B #'.',(A1)+ MOVE.L SongDataPtr(PC),A0 MOVEQ #19,D0 dsmloop2 MOVE.B (A0)+,(A1)+ DBF D0,dsmloop2 MOVE.L SongDataPtr(PC),A0 MOVE.L A0,DiskDataPtr MOVE.L #1084,DiskDataLength MOVEQ #0,D0 MOVE HighPattNum(PC),D0 ADDQ.L #1,D0 LSL.L #8,D0 LSL.L #2,D0 ADD.L D0,DiskDataLength ; Add 1024 x NumOfPatt MOVE.B #127,sd_numofpatt+1(A0) ; Set maxpatt to 127 MOVE.L #'M.K.',sd_mahokakt(A0) ; M.K. again... LEA SavingModuleText(PC),A0 BSR ShowStatusText BTST #2,$DFF016 BEQ CantOpenFile BSR OpenModForWrite BNE CantOpenFile BSR WriteModuleData BNE WriteModError BTST #2,$DFF016 BEQ WriteModError MOVE InsNum(PC),SaveInstrNum MOVEQ #1,D6 saveinstrloop MOVE D6,InsNum BSR ShowSampleInfo BSR WriteInstrument TST.L D0 BNE.S WriteModError ADDQ.B #1,D6 CMP.B #32,D6 BNE saveinstrloop BSR CloseWriteMod MOVE SaveInstrNum(PC),InsNum BSR ShowSampleInfo BSR ShowAllRight JMP RestorePtrCol SaveInstrNum dc.w 0 WriteModError BSR CloseWriteMod BRA CantSaveFile WriteInstrument MOVE D6,D0 LSL #2,D0 LEA SamplePtrs(PC),A0 MOVE.L 0(A0,D0.W),D1 BEQ Return2 MOVE.L 124(A0,D0.W),D0 BEQ Return2 MOVE.L D1,DiskDataPtr MOVE.L SongDataPtr(PC),A0 LEA 12(A0),A0 MOVE D6,D0 MULU #30,D0 ADD.L D0,A0 MOVEQ #0,D0 MOVE (A0),D0 LSL.L #1,D0 MOVE.L D0,DiskDataLength BNE.S WriteModuleData RTS OpenModForWrite MOVE.L DOSBase(PC),A6 MOVE.L #FileName,D1 MOVE.L #1006,D2 JSR LVOOpen(A6) MOVE.L D0,D7 BEQ.S wmfailed MOVEQ #0,D0 RTS WriteModuleData MOVE.L DOSBase(PC),A6 MOVE.L D7,D1 MOVE.L DiskDataPtr(PC),D2 MOVE.L DiskDataLength(PC),D3 BEQ .okok JSR LVOWrite(A6) CMP.L DiskDataLength(PC),D3 BNE.S wmfailed ; JSR LVOIoErr(A6) ; TST.L D0 ; BNE.S wmfailed MOVEQ #0,D0 .okok RTS wmfailed MOVEQ #-1,D0 RTS CloseWriteMod MOVE.L DOSBase(PC),A6 MOVE.L D7,D1 JMP LVOClose(A6) ;---- Load PLST ---- LoadPLST LEA LoadPLSTText,A0 JSR AreYouSure BNE Return2 JSR WaitForButtonUp LEA LoadingPLSTText(PC),A0 BSR ShowStatusText DoLoadPLST JSR StorePtrCol LEA PTPath,A0 JSR CopyPath LEA PLSTName(PC),A0 MOVEQ #4,D0 dlploop MOVE.B (A0)+,(A1)+ DBF D0,dlploop MOVE.L #FileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase(PC),A6 JSR LVOOpen(A6) MOVE.L D0,D7 BEQ PLSTOpenErr JSR SetDiskPtrCol CLR.L PresetTotal BSR.S AllocPLST MOVE.L PLSTmem(PC),D2 BEQ PLSTMemErr2 MOVE.L D7,D1 MOVE.L PLSTAllocSize,D3 MOVE.L DOSBase(PC),A6 JSR LVORead(A6) MOVE.L D0,MaxPLSTOffset DIVU #30,D0 MOVE D0,PresetTotal cloplst MOVE.L D7,D1 MOVE.L DOSBase(PC),A6 JSR LVOClose(A6) ; BSR PLSTCheckNum ; BSR ShowAllRight JMP RestorePtrCol PLSTName dc.b 'PLST',0,0 AllocPLST BSR.S FreePLST MOVE MaxPLSTEntries,D0 BEQ Return2 MULU #30,D0 MOVE.L D0,PLSTAllocSize MOVE.L #MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,PLSTmem MOVE MaxPLSTEntries,MaxPLSTEntries2 RTS FreePLST CLR MaxPLSTEntries2 CLR.L MaxPLSTOffset CLR PresetTotal MOVE.L PLSTmem,D0 BEQ Return2 MOVE.L D0,A1 MOVE.L PLSTAllocSize,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) CLR.L PLSTmem RTS PLSTMemErr2 BSR.S PLSTMemErr BRA cloplst PLSTMemErr TST MaxPLSTEntries BEQ.S reptrco BSET #0,InitError LEA PLSTMemText,A0 plster BSR.S ShowStatusText MOVE #50,WaitTime JMP ErrorRestoreCol reptrco JMP RestorePtrCol PLSTOpenErr TST MaxPLSTEntries BEQ.S reptrco BSET #1,InitError LEA PLSTOpenText,A0 BRA.S plster PLSTMemText dc.b 'no mem for plst !',0 PLSTOpenText dc.b 'plst not found ! ',0 InitError dc.b 0,0 ShowAllRight MOVEM.L D0-D7/A0-A6,-(SP) LEA AllRightText(PC),A0 BSR.S ShowStatusText MOVEM.L (SP)+,D0-D7/A0-A6 RTS ShowStatusText MOVE.L TextBplPtr(PC),A1 ADD.L #5131,A1 MOVEQ #4,D0 stloop1 MOVEQ #16,D1 stloop2 CLR.B (A1)+ DBF D1,stloop2 LEA 23(A1),A1 DBF D0,stloop1 MOVE.L A0,A1 MOVE #5131,D1 MOVEQ #-1,D0 stloop3 ADDQ #1,D0 TST.B (A1)+ BNE.S stloop3 BRA ShowText3 ;---- Redraw Pattern ---- RedrawPattern TST SamScrEnable BNE Return2 SF PattRfsh MOVE #5121,TextOffset MOVE PatternNumber+2(PC),WordNumber BSR Print2DecDigits ; Print PatternNumber MOVE.L SongDataPtr(PC),A6 LEA $43C(A6),A6 MOVE.L PatternNumber,D6 LSL.L #8,D6 LSL.L #2,D6 ADD.L D6,A6 MOVE #7521,TextOffset CLR.L PPattPos LEA PeriodTable(PC),A2 LEA RedrawBuffer(PC),A3 LEA FastHexTable(PC),A4 MOVEQ #'0',D4 MOVE.B BlankZeroFlag,D5 MOVEQ #63,D6 rpnxpos MOVEQ #3,D7 MOVE PPattPos+2(PC),WordNumber BSR Print2DecDigits ; Print PatternPosition ADDQ #1,TextOffset ADDQ.L #1,PPattPos rploop MOVEQ #0,D0 MOVEQ #0,D1 MOVE (A6),D1 AND #$0FFF,D1 BNE.S rpfind MOVE.L #'--- ',(A3) BRA.S rpskip rpfind MOVEQ #36,D2 rpfindloop CMP (A2,D0.W),D1 BEQ.S rpfound ADDQ.L #2,D0 DBF D2,rpfindloop MOVE.L #'??? ',(A3) BRA.S rpskip rpfound LSL.L #1,D0 ADD.L NoteNamesPtr(PC),D0 MOVE.L D0,A0 MOVE.L (A0),(A3) rpskip MOVE.B (A6)+,D0 LSR.B #4,D0 ADD.B #'0',D0 MOVE.B D0,3(A3) MOVE.B (A6)+,D0 MOVEQ #0,D0 MOVE.B (A6)+,D0 ADD D0,D0 MOVE (A4,D0.W),4(A3) MOVEQ #0,D0 MOVE.B (A6)+,D0 ADD D0,D0 MOVE (A4,D0.W),6(A3) TST.B D5 BEQ.S rpskp3 CMP.B 3(A3),D4 BNE.S rpskp3 MOVE.B #' ',3(A3) rpskp3 MOVE #9,TextLength MOVE.L A3,ShowTextPtr BSR ShowText DBF D7,rploop ; Next Channel ADD #241,TextOffset DBF D6,rpnxpos ; Next PattPos RTS RedrawBuffer dc.b '---00000 ',0 ShowPosition MOVE.L SongDataPtr(PC),A0 LEA 952(A0),A0 ADD.L CurrPos(PC),A0 MOVE.B (A0),WordNumber+1 MOVE.B (A0),PattRfshNum+3 MOVEQ #0,D1 MOVE.B (A0),D1 CMP.B LongFFFF+3(PC),D1 BEQ.S spskip2 ST PattRfsh spskip2 MOVE #608,TextOffset MOVE.B (A0),LongFFFF+3 CMP #0,CurrScreen BEQ.S spokok CMP #1,CurrScreen BEQ.S spokok CMP #6,CurrScreen BEQ.S spokok RTS spokok BSR Print4DecDigits MOVE CurrPos+2,WordNumber MOVE #168,TextOffset BRA Print4DecDigits ShowSongLength CMP #2,CurrScreen BEQ.S ShowSongName CMP #3,CurrScreen BEQ.S ShowSongName CMP #4,CurrScreen BEQ Return2 CMP #5,CurrScreen BEQ.S ShowSongName MOVE.L SongDataPtr(PC),A0 LEA sd_numofpatt(A0),A0 MOVE.L A0,CurrCmds CLR WordNumber MOVE.B (A0),WordNumber+1 MOVE #1048,TextOffset BSR Print4DecDigits MOVE.L CurrCmds(PC),A0 ShowSongName MOVE.L SongDataPtr(PC),A0 MOVE #4133,D1 MOVEQ #20,D0 BRA ShowText3 ShowSampleInfo MOVEQ #0,D0 MOVE InsNum(PC),D0 MOVE D0,PlayInsNum BNE.S ssiskipit MOVE LastInsNum(PC),D0 ssiskipit MOVE D0,D1 LSL.L #2,D0 LEA SamplePtrs(PC),A0 MOVE.L (A0,D0.W),si_pointer MOVE.L SongDataPtr(PC),A0 LEA -10(A0),A0 MOVE D1,D0 MULU #30,D0 ADD.L D0,A0 MOVE.L A0,CurrCmds MOVE.L 22(A0),SampleInfo MOVE.L 26(A0),si_long TST.B NoSampleInfo BNE ssiskip MOVE.L A0,-(SP) MOVE.B #' ',FineTuneSign MOVE.B 24(A0),D0 BEQ.S dopfitu MOVE.B #'+',FineTuneSign BTST #3,D0 BEQ.S dopfitu MOVE.B #'-',FineTuneSign MOVEQ #16,D1 SUB.B D0,D1 MOVE.B D1,D0 dopfitu MOVE #1491,TextOffset BSR PrintHexDigit ; FineTune LEA FineTuneSign(PC),A0 MOVE #1490,D1 MOVEQ #1,D0 BSR ShowText3 ; FineTuneSign MOVE.L (SP)+,A0 CLR WordNumber MOVE.B 25(A0),WordNumber+1 MOVE WordNumber,VolumeEfx OR #$0C00,VolumeEfx MOVE #2368,TextOffset BSR PrintHexWord ; Volume MOVEQ #0,D0 MOVE SampleInfo(PC),D0 LSL.L #1,D0 MOVE D0,WordNumber MOVE.L SamplePos,D2 CMP.L D0,D2 BLS.S ShowLen MOVE.L D0,SamplePos BSR ShowPos MOVEQ #0,D0 MOVE SampleInfo(PC),D0 LSL.L #1,D0 MOVE D0,WordNumber ShowLen MOVE #2808,TextOffset BSR PrintHexWord ; Length MOVE si_long,D0 ADD D0,D0 MOVE D0,WordNumber MOVE #3248,TextOffset BSR PrintHexWord ; Repeat MOVE si_long+2,D0 ADD D0,D0 MOVE D0,WordNumber MOVE #3688,TextOffset BSR PrintHexWord ; RepLen BSR.S ssiinst ssiskip TST.B NoSampleInfo BEQ.S ssiskp2 CMP #5,CurrScreen BEQ.S ssiskp2 CMP #3,CurrScreen BNE Return2 ssiskp2 MOVE.L CurrCmds(PC),A0 MOVE #4573,D1 MOVEQ #22,D0 BRA ShowText3 ; SampleName ssiinst TST.B NoSampleInfo BNE Return2 MOVE InsNum(PC),WordNumber MOVE #1928,TextOffset BRA PrintHexWord ; SampleNumber FineTuneSign dc.b ' ',0 VolumeEfx dc.w 0 ;---- Print Decimal Digits ---- Print2DecDigits MOVE #2,TextLength MOVEQ #0,D1 MOVE WordNumber(PC),D1 LEA NumberText(PC),A0 BRA.S pdig Print3DecDigits MOVE #3,TextLength MOVEQ #0,D1 MOVE WordNumber(PC),D1 LEA NumberText(PC),A0 BRA.S pdig100 Print4DecDigits MOVE #4,TextLength MOVEQ #0,D1 MOVE WordNumber(PC),D1 LEA NumberText(PC),A0 DIVU #1000,D1 BSR.S DoOneDigit pdig100 DIVU #100,D1 BSR.S DoOneDigit pdig DIVU #10,D1 BSR.S DoOneDigit BSR.S DoOneDigit MOVE.L #NumberText,A0 BRA ShowText2 DoOneDigit ADD.B #'0',D1 MOVE.B D1,(A0)+ CLR D1 SWAP D1 RTS Print6DecDigits LEA NumberText,A0 MOVE.L D0,D1 CMP.L #1000000,D1 BHS toobig SWAP D1 CLR D1 SWAP D1 DIVU #10,D1 SWAP D1 ADD.B #'0',D1 MOVE.B D1,5(A0) CMP.L #10,D0 BLO.S p6zero1 DIVU #100,D0 MOVE.L D0,D1 CLR D0 SWAP D0 DIVU #10,D0 ADD.B #'0',D0 MOVE.B D0,4(A0) AND.L #$FFFF,D1 BEQ.S p6zero2 DIVU #10,D1 SWAP D1 ADD.B #'0',D1 MOVE.B D1,3(A0) CLR D1 SWAP D1 TST D1 BEQ.S p6zero3 DIVU #10,D1 SWAP D1 ADD.B #'0',D1 MOVE.B D1,2(A0) CLR D1 SWAP D1 TST D1 BEQ.S p6zero4 DIVU #10,D1 SWAP D1 ADD.B #'0',D1 MOVE.B D1,1(A0) CLR D1 SWAP D1 TST D1 BEQ.S p6zero5 DIVU #10,D1 SWAP D1 ADD.B #'0',D1 MOVE.B D1,(A0) BRA.S p6end p6zero1 MOVE.B #' ',4(A0) p6zero2 MOVE.B #' ',3(A0) p6zero3 MOVE.B #' ',2(A0) p6zero4 MOVE.B #' ',1(A0) p6zero5 MOVE.B #' ',0(A0) p6end MOVE #6,TextLength BRA ShowText2 toobig MOVE.B #' ',D0 BSR.S toobig2 DIVU #1000,D0 MOVE D0,WordNumber BSR Print4DecDigits MOVE.B #'K',D0 toobig2 LEA NumberText(PC),A0 MOVE.B D0,(A0) MOVE #1,TextLength BRA ShowText2 NumberText dcb.b 6,0 ;---- Print Hex Digits ---- PrintHiInstrNum MOVEQ #0,D0 TST CurrentPlayNote BEQ.S phin2 MOVE InsNum(PC),D0 LSR #4,D0 BNE.S PrintHexDigit phin2 TST.B BlankZeroFlag BEQ.S PrintHexDigit LEA BlankInsText(PC),A0 BRA.S phd2 PrintHexDigit AND.L #$0F,D0 ADD.L D0,D0 LEA FastHexTable+1(PC),A0 ADD.L D0,A0 phd2 MOVE #1,TextLength BRA.S ShowText2 BlankInsText dc.b " ",0 PrintHexWord LEA WordNumber(PC),A0 MOVEQ #0,D0 MOVE.B (A0),D0 LSL.L #1,D0 LEA FastHexTable(PC),A0 ADD.L D0,A0 MOVE #2,TextLength BSR.S ShowText2 PrintHexByte LEA WordNumber(PC),A0 MOVEQ #0,D0 MOVE.B 1(A0),D0 LSL.L #1,D0 MOVE.L #FastHexTable,A0 ADD.L D0,A0 MOVE #2,TextLength BSR.S ShowText2 CLR WordNumber RTS ;---- Text Output Routines ---- ShowText3 MOVE D0,TextLength MOVE D1,TextOffset ShowText2 MOVE.L A0,ShowTextPtr ShowText MOVEM.L A2-A4,-(SP) LEA TextTable(PC),A3 LEA FontData,A4 MOVE TextLength(PC),D0 MOVE.L TextBplPtr(PC),A1 MOVE TextOffset(PC),D1 LEA (A1,D1.W),A1 ADD D0,TextOffset MOVE.L ShowTextPtr(PC),A0 BRA.S dstlope dstloop MOVEQ #0,D1 MOVE.B (A0)+,D1 BNE.S dstskip MOVE.B ShowZeroFlag(PC),D1 dstskip MOVE.B (A3,D1.W),D1 LSL #3,D1 MOVE.L A4,A2 ADD.L D1,A2 MOVE.B (A2)+,(A1)+ MOVE.B (A2)+,40-1(A1) MOVE.B (A2)+,80-1(A1) MOVE.B (A2)+,120-1(A1) MOVE.B (A2),160-1(A1) dstlope DBF D0,dstloop MOVEM.L (SP)+,A2-A4 RTS SpaceShowText MOVE ShowZeroFlag(PC),-(SP) MOVE.B #' ',ShowZeroFlag BSR.S ShowText MOVE (SP)+,ShowZeroFlag RTS ShowZeroFlag dc.b 95,0 TextTable dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15 ; 32 dc.b 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 dc.b 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 ; 64 dc.b 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 dc.b 69,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 ; 96 dc.b 48,49,50,51,52,53,54,55,56,57,58,65,66,67,68,63 dc.b 69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 128 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 160 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 192 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 224 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;---- Set Sprite Position ---- SetSpritePos ADD #$2C,D1 ADD D1,D2 ROL.W #7,D2 ASL #1,D2 BCC.S sppskip OR #2,D2 sppskip ROL.W #7,D1 ASL #1,D1 BCC.S sppskip2 OR #4,D2 sppskip2 ADD #$7D,D0 ASR #1,D0 BCC.S sppskip3 OR #1,D2 sppskip3 OR D0,D1 MOVE D1,(A0) MOVE D2,2(A0) RTS ;---- DoLoad / DoSave Data ---- DoLoadData TST.L DiskDataLength BEQ.S dlsend TST.L DiskDataPtr BEQ.S dlsend JSR SetDiskPtrCol LEA LoadingText(PC),A0 BSR ShowStatusText MOVE.L DOSBase(PC),A6 MOVE.L FileNamePtr(PC),D1 MOVE.L #1005,D2 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ.S CantOpenFile MOVE.L FileHandle(PC),D1 MOVE.L DiskDataPtr(PC),D2 MOVE.L DiskDataLength(PC),D3 JSR LVORead(A6) MOVE.L FileHandle(PC),D1 JSR LVOClose(A6) dlsend CLR.L FileHandle JSR SetNormalPtrCol MOVEQ #-1,D0 RTS CantOpenFile LEA CantOpenFileText(PC),A0 caopfil BSR ShowStatusText JSR SetErrorPtrCol MOVEQ #0,D0 RTS CantSaveFile LEA CantSaveFileText(PC),A0 BRA.S caopfil CantExamFile LEA CantExamFileText(PC),A0 BRA.S caopfil CantFindFile LEA CantFindFileText(PC),A0 BRA.S caopfil FileIsEmpty LEA FileIsEmptyText(PC),A0 BRA.S caopfil CantOpenFileText dc.b "can't open file !",0 CantSaveFileText dc.b "can't save file !",0 CantExamFileText dc.b "examine error !",0 CantFindFileText dc.b "can't find file !",0 FileIsEmptyText dc.b "file is empty !",0 DoSaveData JSR SetDiskPtrCol LEA SavingText(PC),A0 BSR ShowStatusText MOVE.L DOSBase(PC),A6 MOVE.L FileNamePtr(PC),D1 MOVE.L #1006,D2 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ CantOpenFile MOVE.L FileHandle(PC),D1 MOVE.L DiskDataPtr(PC),D2 MOVE.L DiskDataLength(PC),D3 JSR LVOWrite(A6) MOVE.L FileHandle(PC),D1 JSR LVOClose(A6) CLR.L FileHandle JMP SetNormalPtrCol ;---- PLST ---- PLST CLR.B RawKeyCode CMP #6,CurrScreen BEQ ExitPLST CMP #1,CurrScreen BNE Return2 JSR WaitForButtonUp MOVE #6,CurrScreen JSR ClearRightArea JSR ClearAnalyzerColors BSR.S DrawPLSTScreen BEQ ExitPLST BSR RedrawPLST PLST_rts RTS DrawPLSTScreen LEA PLSTData,A0 MOVE.L #PLSTSize,D0 BSR Decompact BEQ Return2 LEA BitPlaneData+TopMenusPos,A0 MOVEQ #98,D0 dplstloop1 MOVEQ #24,D1 dplstloop2 MOVE.B 2574(A1),PlaneSize(A0) MOVE.B (A1)+,(A0)+ DBF D1,dplstloop2 LEA 15(A0),A0 ADDQ.L #1,A1 DBF D0,dplstloop1 BSR FreeDecompMem MOVEQ #-1,D0 RTS ShowDiskNames MOVE #616,TextOffset MOVE #5,TextLength MOVE.L #STText1,A0 BSR ShowText2 ADDQ #1,TextOffset MOVE.L #STText2,A0 BSR ShowText2 ADDQ #1,TextOffset MOVE.L #STText3,A0 BRA ShowText2 PLSTCheckNum TST.L PLSTmem BEQ NoPLST TST.L MaxPLSTOffset BEQ NoPLST MOVE.L PLSTmem(PC),A0 MOVE PresetTotal(PC),D7 SUBQ #1,D7 TST.B STText1Number BNE plstsskip TST.B STText2Number BNE plstsskip TST.B STText3Number BEQ PLSTMarkAll plstsskip MOVE.L STText1Number-1(PC),A3 MOVE.L STText2Number-1(PC),A4 MOVE.L STText3Number-1(PC),A5 MOVEQ #0,D6 PLSTmarkloop MOVE #'st',(A0) ; Set lowercase 'st' MOVE.B 3(A0),D0 CMP.B #'a',D0 BLO.S pmlskp1 SUB.B #32,D0 pmlskp1 MOVE.B D0,3(A0) MOVE.B 4(A0),D0 CMP.B #'a',D0 BLO.S pmlskp2 SUB.B #32,D0 pmlskp2 MOVE.B D0,4(A0) MOVE.L 2(A0),D0 ; Get number ('-01:' etc) PLSTchk1 CMP.L A3,D0 BNE PLSTchk2 MOVE #'ST',(A0) ADDQ #1,D6 BRA PLSTmarknext PLSTchk2 CMP.L A4,D0 BNE PLSTchk3 MOVE #'ST',(A0) ADDQ #1,D6 BRA PLSTmarknext PLSTchk3 CMP.L A5,D0 BNE PLSTmarknext MOVE #'ST',(A0) ADDQ #1,D6 PLSTmarknext ADD.L #30,A0 DBF D7,PLSTmarkloop MOVE D6,PresetMarkTotal CLR PLSTpos CLR.L PLSTOffset RTS PLSTMarkAll MOVE #'ST',(A0) ; Set uppercase 'ST' LEA 30(A0),A0 DBF D7,PLSTMarkAll MOVE PresetTotal(PC),PresetMarkTotal CLR PLSTpos CLR.L PLSTOffset RTS NoPLST CLR PresetMarkTotal CLR PLSTpos CLR.L PLSTOffset RTS RedrawPLST MOVE PresetMarkTotal(PC),WordNumber MOVE #189,TextOffset BSR Print4DecDigits BSR ShowDiskNames TST.L PLSTmem BEQ PLST_rts TST.L MaxPLSTOffset BEQ PLST_rts MOVE.L PLSTOffset(PC),D6 MOVE.L PLSTmem(PC),A6 MOVE #976,A5 ; TextOffset LEA PLSTOffset(PC),A4 MOVEQ #11,D7 ; Number of lines to print TST.L D6 BMI EndOfPLST dtplstloop CMP #'ST',(A6,D6.L) ; Check for 'ST' BNE PLSTNext MOVE.L D6,(A4)+ MOVE A5,TextOffset MOVE #19,TextLength LEA (A6,D6.L),A3 ADDQ.L #3,A3 MOVE.L A3,ShowTextPtr MOVEM.L D0-D7/A0-A6,-(SP) BSR SpaceShowText MOVEM.L (SP)+,D0-D7/A0-A6 MOVE 22(A6,D6.L),WordNumber MOVE WordNumber,D0 LSL #1,D0 MOVE D0,WordNumber MOVEM.L D0-D7/A0-A6,-(SP) BSR PrintHexWord MOVEM.L (SP)+,D0-D7/A0-A6 ADD.L #30,D6 CMP.L MaxPLSTOffset(PC),D6 BHI EndOfPLST ADD #240,A5 ; Next Screen position DBF D7,dtplstloop RTS PLSTNext ADD.L #30,D6 CMP.L MaxPLSTOffset(PC),D6 BHI EndOfPLST BRA dtplstloop EndOfPLST MOVE.L #$FFFFFFFF,(A4)+ MOVE A5,TextOffset MOVE #23,TextLength MOVE.L #EmptyLineText,ShowTextPtr MOVEM.L D0-D7/A0-A6,-(SP) BSR SpaceShowText MOVEM.L (SP)+,D0-D7/A0-A6 ADD #240,A5 DBF D7,EndOfPLST RTS TypeInDisk1 LEA STText1Number(PC),A6 MOVE #156,LineCurX BRA DoTypeInDisk TypeInDisk2 LEA STText2Number(PC),A6 MOVE #204,LineCurX BRA DoTypeInDisk TypeInDisk3 LEA STText3Number(PC),A6 MOVE #252,LineCurX DoTypeInDisk CLR.B (A6) CLR.B 1(A6) JSR StorePtrCol JSR SetWaitPtrCol BSR ShowDiskNames MOVE #20,LineCurY BSR UpdateLineCurPos BSR GetHexKey TST.B RawKeyCode BNE ClearDiskNum BTST #2,$DFF016 BEQ ClearDiskNum ADD D1,D1 LEA FastHexTable+1(PC),A0 MOVE.B (A0,D1.W),(A6) ADDQ #8,LineCurX BSR ShowDiskNames BSR UpdateLineCurPos BSR GetHexKey TST.B RawKeyCode BNE ClearDiskNum BTST #2,$DFF016 BEQ ClearDiskNum ADD D1,D1 LEA FastHexTable+1(PC),A0 MOVE.B (A0,D1.W),1(A6) JSR RestorePtrCol BSR PLSTCheckNum BSR RedrawPLST CLR LineCurX MOVE #270,LineCurY BRA UpdateLineCurPos ClearAllDisks BSR DoClearDisks BSR PLSTCheckNum BRA RedrawPLST DoClearDisks MOVEQ #0,D0 MOVE.B D0,STText1Number MOVE.B D0,STText1Number+1 MOVE.B D0,STText2Number MOVE.B D0,STText2Number+1 MOVE.B D0,STText3Number MOVE.B D0,STText3Number+1 MOVE.B D0,STText4Number MOVE.B D0,STText4Number+1 RTS MountList JSR StorePtrCol JSR SetDiskPtrCol BSR DoClearDisks MOVE #1,MountFlag LEA df0text(PC),A4 BSR DoMountList LEA STText1(PC),A0 BSR CheckMountName LEA df1text(PC),A4 BSR DoMountList LEA STText2(PC),A0 BSR CheckMountName LEA df2text(PC),A4 BSR DoMountList LEA STText3(PC),A0 BSR CheckMountName ; LEA df3text(PC),A4 ; BSR DoMountList ; LEA STText4(PC),A0 ; BSR CheckMountName CLR MountFlag JSR RestorePtrCol BRA cdisknum2 DoMountList CLR.L FIB_FileName CLR.L FIB_FileName+4 CLR.L FIB_FileName+8 MOVE.L DOSBase(PC),A6 MOVE.L A4,D1 MOVEQ #-2,D2 JSR LVOLock(A6) MOVE.L D0,FileLock BEQ MountError MOVE.L FileLock(PC),D1 MOVE.L #FileInfoBlock,D2 JSR LVOExamine(A6) TST.L D0 BEQ MountError MOVE.L FileLock(PC),D1 JSR LVOUnLock(A6) MountError MOVEQ #-1,D0 RTS CheckMountName MOVE FIB_FileName,D0 BEQ MountError MOVE #'ST',D1 ; Check for ST AND #$1F1F,D0 AND #$1F1F,D1 CMP D0,D1 BNE ClearDiskNum MOVE.B FIB_FileName+3,D0 LSL #8,D0 MOVE.B FIB_FileName+4,D0 CMP #'00',D0 BEQ ClearDiskNum MOVE.B D0,4(A0) ; Put disk number into ST-xx LSR #8,D0 MOVE.B D0,3(A0) MOVEQ #0,D0 RTS ClearDiskNum CLR.B RawKeyCode JSR RestorePtrCol CLR.B (A6) CLR.B 1(A6) CLR LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos cdisknum2 BSR PLSTCheckNum BRA RedrawPLST df0text dc.b 'DF0:',0,0 df1text dc.b 'DF1:',0,0 df2text dc.b 'DF2:',0,0 df3text dc.b 'DF3:',0,0 CheckPLSTGadgs MOVEM.W MouseX2(PC),D0/D1 CMP #120,D0 BLO cplstend CMP #23,D1 BHS PLSTPressed CMP #12,D1 BHS PLSTLine2 PLSTLine1 CMP #268,D0 BHS ExitPLST CMP #168,D0 BHS cplstend CMP #120,D0 BHS ClearAllDisks RTS PLSTLine2 CMP #268,D0 BHS MountList CMP #218,D0 BHS TypeInDisk3 CMP #168,D0 BHS TypeInDisk2 BRA TypeInDisk1 cplstend RTS ExitPLST JSR WaitForButtonUp CLR.B RawKeyCode JSR ClearRightArea JMP DisplayMainScreen PLSTOneUp TST PresetMarkTotal BEQ Return2 BTST #6,$BFE001 BEQ PLST_rts MOVE PLSTpos,D0 MOVE D0,D2 SUBQ #1,D0 TST ShiftKeyStatus BNE.S pouski2 BTST #2,$DFF016 BNE pouskip pouski2 SUB #9,D0 pouskip TST D0 BPL DoPLSTUpDown CLR D0 BRA DoPLSTUpDown PLSTOneDown TST PresetMarkTotal BEQ Return2 BTST #6,$BFE001 BEQ PLST_rts MOVE PLSTpos(PC),D0 MOVE D0,D2 ADDQ #1,D0 TST ShiftKeyStatus BNE.S podski2 BTST #2,$DFF016 BNE podskip podski2 ADD #9,D0 podskip MOVE PresetMarkTotal(PC),D1 SUB #12,D1 CMP D0,D1 BHS DoPLSTUpDown MOVE D1,D0 DoPLSTUpDown BSR UpdateOffset BRA RedrawPLST UpdateOffset MOVE PLSTpos(PC),D1 MOVE D0,PLSTpos CMP D0,D1 BEQ Return2 TST D0 BEQ ZeroPLSTOffset SUBQ #1,D0 MOVE.L PLSTmem(PC),A0 MOVEQ #0,D6 cpoloop CMP #'ST',(A0,D6.L) ; Check for 'ST' BEQ NextPLSTOffset ADD.L #30,D6 BRA cpoloop NextPLSTOffset ADD.L #30,D6 DBF D0,cpoloop MOVE.L D6,PLSTOffset RTS ZeroPLSTOffset CLR.L PLSTOffset RTS PLSTPressed CMP #24,D1 BLO Return2 CMP #95,D1 BHI Return2 SUB #24,D1 AND.L #$0000FFFF,D1 DIVU #6,D1 LSL #2,D1 LEA PLSTOffset(PC),A0 MOVE.L (A0,D1.W),D1 BMI Return2 DIVU #30,D1 ADDQ #1,D1 MOVE D1,CurrentPreset JSR WaitForButtonUp BRA UsePreset ;---- Preset Editor/PED ---- PresetEditor JSR WaitForButtonUp MOVE #4,CurrScreen ST DisableAnalyzer ST NoSampleInfo BSR SwapPresEdScreen BEQ pedexi2 PED_Refresh CLR PED_Action MOVE.L TextBplPtr(PC),A0 MOVE #1219,D0 pedloop CLR.L (A0)+ DBF D0,pedloop JSR SetNormalPtrCol JSR ClearAnalyzerColors BSR ShowPEDnumbers BRA ShowPresetNames SwapPresEdScreen MOVE.L DecompMemPtr,D0 BEQ speds2 MOVE.L D0,A1 BSR speds3 BRA FreeDecompMem speds2 LEA PresetEdData,A0 MOVE.L #PresetEdSize,D0 BSR Decompact BEQ Return2 speds3 LEA BitPlaneData,A0 MOVEQ #1,D2 spesloop1 MOVE #1219,D0 spesloop2 MOVE.L (A0),D1 MOVE.L (A1),(A0)+ MOVE.L D1,(A1)+ DBF D0,spesloop2 LEA $14F0(A0),A0 DBF D2,spesloop1 MOVEQ #-1,D0 RTS CheckPresEdGadgs MOVEM.W MouseX2(PC),D0/D1 CMP #45,D1 BHS CheckPEDnames CLR PED_Action JSR SetNormalPtrCol CMP #307,D0 BHS PED_GotoPLST PED_Menu1 CMP #101,D0 BHS PED_Menu2 CMP #34,D1 BHS PED_DeleteDisk CMP #23,D1 BHS PED_Delete CMP #12,D1 BHS PED_Insert BRA PED_AddPathGadg PED_Menu2 CMP #209,D0 BHS PED_Menu3 CMP #34,D1 BHS PED_ClearPLST CMP #23,D1 BHS Return2 CMP #12,D1 BHS PED_Disk BRA PED_EnterPath PED_Menu3 CMP #34,D1 BHS PED_Print CMP #23,D1 BHS WritePLST CMP #12,D1 BHS.S xLoadPLST BRA PED_EnterPath xLoadPLST BSR LoadPLST MOVE #1,PEDPos BRA PED_Refresh PED_GotoPLST BSR PED_Exit BRA PLST PED_Exit JSR WaitForButtonUp BSR PLSTCheckNum BSR SwapPresEdScreen MOVE.L TextBplPtr(PC),A0 MOVE #1219,D0 pedeloop CLR.L (A0)+ DBF D0,pedeloop CLR.B RawKeyCode pedexi2 JSR ClearAnalyzerColors JMP DisplayMainAll PED_AddPathGadg TST.L PLSTmem BNE pedawok BSR AllocPLST TST.L PLSTmem BEQ PLSTMemErr pedawok MOVE.L DOSBase(PC),A6 MOVE.L #PEdDefaultPath,D1 MOVEQ #-2,D2 JSR LVOLock(A6) MOVE.L D0,FileLock BEQ UnlockReadPath JSR SetDiskPtrCol LEA AddingPathText(PC),A0 BSR ShowStatusText MOVE.L DOSBase(PC),A6 MOVE.L FileLock(PC),D1 MOVE.L #FileInfoBlock,D2 JSR LVOExamine(A6) TST.L D0 BPL UnlockReadPath TST.L FIB_EntryType BPL CheckPathDirName BSR AddPreset BRA IsPLSTFull CheckPathDirName CMP.B #'-',FIB_FileName+2 BNE IsPLSTFull MOVE.B FIB_FileName+3,SndDiskNum0 MOVE.B FIB_FileName+4,SndDiskNum1 BSR ShowPEDnumbers IsPLSTFull MOVE PresetTotal(PC),D0 CMP MaxPLSTEntries,D0 BLO ReadPathNext BSR PLSTisFull BRA ReadPathEnd ReadPathNext MOVE.L DOSBase,A6 MOVE.L FileLock(PC),D1 MOVE.L #FileInfoBlock,D2 JSR LVOExNext(A6) TST.L D0 BPL ReadPathEnd BTST #2,$DFF016 BEQ ReadPathEnd TST.L FIB_EntryType BPL IsPLSTFull CMP.L #'.inf',FIB_FileName BEQ IsPLSTFull CMP.L #'.inf',FIB_FileName+4 BEQ IsPLSTFull ; LEA FIB_FileName,A0 ; MOVEQ #28,D0 ;repalop CMP.B #'.',(A0)+ ; BEQ CouldBeInfo ; DBF D0,repalop rpnskip CLR PresetRepeat MOVE #1,PresetReplen ; TST.B IFFLoopFlag ; name is ok, test for IFF BRA rpnskp2 ; LEA PEDDefaultPath,A0 JSR CopyPath LEA FIB_FileName,A0 rpncpfn MOVE.B (A0)+,(A1)+ BNE.S rpncpfn MOVE.L #FileName,D1 MOVE.L #1005,D2 MOVE.L DOSBase(PC),A6 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ.S rpnskp2 MOVE.L D0,D1 LEA chkiffbuffer(PC),A2 CLR.L (A2) MOVE.L A2,D2 MOVEQ #12,D3 JSR LVORead(A6) CMP.L #"FORM",(A2) BNE.S rpnclse CMP.L #"8SVX",8(A2) BNE.S rpnclse rpnvhdr MOVE.L FileHandle(PC),D1 MOVE.L A2,D2 MOVEQ #4,D3 JSR LVORead(A6) TST.L D0 BEQ.S rpnclse CMP.L #"VHDR",(A2) BNE.S rpnvhdr MOVE.L FileHandle(PC),D1 MOVE.L A2,D2 MOVEQ #12,D3 JSR LVORead(A6) MOVE.L 8(A2),D0 BEQ.S rpnclse LSR #1,D0 MOVE D0,PresetReplen MOVE.L 4(A2),D0 LSR #1,D0 MOVE D0,PresetRepeat rpnclse MOVE.L FileHandle(PC),D1 JSR LVOClose(A6) rpnskp2 BSR AddPreset BSR ShowPEDnumbers BRA IsPLSTFull chkiffbuffer dc.l 0,0,0 CouldBeInfo CMP.B #'i',(A0)+ BNE rpnskip CMP.B #'n',(A0)+ BNE rpnskip CMP.B #'f',(A0)+ BNE rpnskip CMP.B #'o',(A0)+ BNE rpnskip CMP.B #0,(A0)+ BNE rpnskip BRA IsPLSTFull ReadPathEnd MOVE.L DOSBase(PC),A6 MOVE.L FileLock(PC),D1 BEQ rpeskip JSR LVOUnLock(A6) rpeskip JSR SetNormalPtrCol BSR ShowPresetNames BRA ShowAllRight UnlockReadPath MOVE.L DOSBase(PC),A6 MOVE.L FileLock(PC),D1 BEQ urpend JSR LVOUnLock(A6) urpend JMP SetErrorPtrCol AddPreset LEA PEdDefaultVol(PC),A0 LEA PresetName(PC),A1 MOVEQ #21,D0 .loop CLR.B (A1)+ DBF D0,.loop LEA PresetName(PC),A1 MOVEQ #5,D0 ; Disk ST-XX: aploop MOVE.B (A0)+,(A1)+ DBF D0,aploop LEA FIB_FileName,A0 MOVEQ #14,D0 ; Name 16 letters. aploop2 MOVE.B (A0)+,D1 BEQ .skip MOVE.B D1,(A1)+ DBF D0,aploop2 .skip CLR.B (A1) MOVE.L FIB_FileSize,D0 CMP.L #$FFFE,D0 BLS.S apskip2 MOVE #$FFFE,D0 apskip2 LSR #1,D0 MOVE D0,PresetLength CLR PresetFineTune LEA PresetName(PC),A6 BSR PED_CheckAdd ADDQ #1,PresetTotal ADD.L #30,MaxPLSTOffset RTS PED_Insert TST.L PLSTmem BNE pediwok BSR AllocPLST TST.L PLSTmem BEQ PLSTMemErr pediwok MOVE PresetTotal(PC),D0 CMP MaxPLSTEntries2,D0 BHS PLSTisFull LEA InsertPsetText(PC),A0 LEA PresetName(PC),A1 MOVEQ #39,D0 pediloop MOVE.B (A0)+,(A1)+ DBF D0,pediloop PossibleEdit JSR StorePtrCol JSR SetWaitPtrCol MOVE.L TextBplPtr(PC),A0 LEA 2320(A0),A0 MOVEQ #59,D0 pediloop2 CLR.L (A0)+ DBF D0,pediloop2 LEA EnterDataText(PC),A0 BSR ShowStatusText MOVE #63,LineCurY LEA PresetName(PC),A6 MOVEQ #3,D7 MOVE.B #4,EnterTextFlag ShowPsetText LEA PresetName+3(PC),A0 MOVEQ #37,D0 MOVE #2321,D1 BSR ShowText3 MOVE D7,D0 SUBQ #3,D0 ASL #3,D0 ADD #12,D0 MOVE D0,LineCurX BSR UpdateLineCurPos pediwaitkey JSR DoKeyBuffer MOVE.B RawKeyCode(PC),D0 BEQ pediwaitkey CLR.B RawKeyCode BTST #7,D0 BNE pediwaitkey AND #$FF,D0 CMP.B #69,D0 BEQ PED_ESCkey CMP.B #65,D0 BEQ PED_BkspaceKey CMP.B #68,D0 BEQ PED_ReturnKey CMP.B #79,D0 BEQ PED_LeftArrowKey CMP.B #78,D0 BEQ PED_RightArrowKey CMP.B #64,D0 BHI pediwaitkey CMP #40,D7 BEQ pediwaitkey CMP #22,D7 BEQ pediwaitkey LEA UnshiftedKeymap(PC),A0 TST ShiftKeyStatus BEQ ShiftKeySkip LEA ShiftedKeymap(PC),A0 ShiftKeySkip MOVE.B 0(A0,D0.W),D1 BEQ pediwaitkey CMP #6,D7 BLO.S hexchk2 CMP #25,D7 BLO PED_PrintChar hexchk2 CMP.B #'0',D1 BLO pediwaitkey CMP.B #'f',D1 BHI pediwaitkey CMP.B #'9',D1 BLS PED_PrintChar CMP.B #'a',D1 BHS PED_PrintChar BRA pediwaitkey PED_PrintChar MOVE.B D1,(A6,D7.W) BRA PED_RightArrowKey PED_ReturnKey CMP.B #' ',PsetNameText BEQ PED_ESCkey LEA PsetVolText(PC),A0 LEA fitutexttab+32(PC),A1 MOVE.B (A0)+,D1 LSL #8,D1 MOVE.B (A0),D1 MOVEQ #15,D0 vofloop CMP -(A1),D1 BEQ.S vofound DBF D0,vofloop MOVEQ #0,D0 vofound MOVE D0,PresetFineTune LEA PsetLenText(PC),A0 BSR HexToInteger LSR #1,D0 MOVE D0,PresetLength LEA PsetRepeatText(PC),A0 BSR HexToInteger LSR #1,D0 MOVE D0,PresetRepeat LEA PsetReplenText(PC),A0 BSR HexToInteger LSR #1,D0 MOVE D0,PresetReplen BSR PED_CheckAdd ADDQ #1,PresetTotal PED_ESCkey CLR LineCurX MOVE #270,LineCurY BSR UpdateLineCurPos BSR ShowPresetNames BSR ShowPEDnumbers BSR ShowAllRight CLR.B EnterTextFlag JMP RestorePtrCol PED_BkspaceKey CMP #23,D7 BHS pedbsend CMP #6,D7 BLS pedbsend SUBQ #1,D7 MOVE.B #' ',(A6,D7.W) pedbsend BRA ShowPsetText PED_LeftArrowKey SUBQ #1,D7 CMP #2,D7 BLS pedlakskip2 CMP #5,D7 BEQ pedlakskip CMP #22,D7 BEQ pedlakskip CMP #25,D7 BEQ pedlakskip CMP #30,D7 BEQ pedlakskip CMP #35,D7 BEQ pedlakskip BRA ShowPsetText pedlakskip SUBQ #1,D7 BRA ShowPsetText pedlakskip2 MOVEQ #3,D7 BRA ShowPsetText PED_RightArrowKey ADDQ #1,D7 CMP #5,D7 BEQ pedrakskip CMP #22,D7 BEQ pedrakskip CMP #25,D7 BEQ pedrakskip CMP #30,D7 BEQ pedrakskip CMP #35,D7 BEQ pedrakskip CMP #40,D7 BHS pedrakskip2 BRA ShowPsetText pedrakskip ADDQ #1,D7 BRA ShowPsetText pedrakskip2 MOVEQ #39,D7 BRA ShowPsetText PED_CheckAdd MOVEQ #23,D0 pedcaloop SUBQ #1,D0 CMP.B #' ',0(A6,D0.W) BEQ pedcaloop CLR.B 1(A6,D0.W) MOVE.L PLSTmem(PC),A5 LEA 30(A5),A5 pedccnextloop MOVEQ #6,D0 TST.B 6(A5) BEQ PED_AddPreset PED_ConvertLoop MOVE.B 0(A5,D0.W),D2 BNE PED_ConvertCase TST.B 0(A6,D0.W) BNE PED_ConvertCase CLR.B 6(A5) SUBQ #1,PresetTotal BRA PED_AddPreset PED_ConvertCase CMP.B #'A',D2 BLO pedccskip CMP.B #'Z',D2 BHI pedccskip ADD.B #32,D2 pedccskip MOVE.B 0(A6,D0.W),D1 CMP.B #' ',D1 BEQ pedccskip3 CMP.B #'A',D1 BLO pedccskip2 CMP.B #'Z',D1 BHI pedccskip2 ADD.B #32,D1 pedccskip2 CMP.B D2,D1 BEQ pedccnext BHI pedccskip3 BRA PED_AddPreset pedccnext ADDQ #1,D0 CMP #22,D0 BNE PED_ConvertLoop pedccskip3 LEA 30(A5),A5 BRA pedccnextloop PED_AddPreset TST.B 6(A5) BEQ pedapskip MOVE.L PLSTmem(PC),A1 MOVE PresetTotal(PC),D0 CMP #1,D0 BEQ pedapskip MULU #30,D0 ADD.L D0,A1 LEA 30(A1),A1 CLR.B 31(A1) pedaploop MOVE (A1),30(A1) SUBQ.L #2,A1 CMP.L A1,A5 BLS pedaploop pedapskip MOVEQ #21,D0 pedaploop2 MOVE.B 0(A6,D0.W),D1 CMP.B #'A',D1 BLO pedapskip2 CMP.B #'Z',D1 BHI pedapskip2 ADD.B #32,D1 pedapskip2 CMP.B #' ',D1 BNE pedapskip3 MOVEQ #0,D1 pedapskip3 MOVE.B D1,0(A5,D0.W) DBF D0,pedaploop2 MOVE PresetLength(PC),22(A5) MOVE.B PresetFineTune+1(PC),24(A5) MOVE.B #$40,25(A5) MOVE PresetRepeat(PC),26(A5) MOVE PresetReplen(PC),28(A5) RTS HexToInteger MOVEQ #0,D0 BSR Single_hti LSL #8,D1 LSL #4,D1 OR D1,D0 BSR Single_hti LSL #8,D1 OR D1,D0 HexToInteger2 BSR Single_hti LSL #4,D1 OR D1,D0 BSR Single_hti OR D1,D0 RTS Single_hti MOVEQ #0,D1 MOVE.B (A0)+,D1 CMP.B #$60,D1 BLO shtiskip SUB.B #$20,D1 shtiskip SUB.B #$30,D1 CMP.B #9,D1 BLS Return2 SUBQ.B #7,D1 RTS PED_Delete JSR SetDeletePtrCol MOVE #1,PED_Action LEA SelectEntryText(PC),A0 BRA ShowStatusText PED_ClearPLST LEA ClearPLSTText,A0 JSR AreYouSure BNE Return2 BSR FreePLST BRA PED_Refresh ClearPLSTText dc.b 'clear plst ?',0,0 PED_Print LEA PrintPLSTText,A0 JSR AreYouSure BNE Return2 JSR StorePtrCol MOVE.L DOSBase(PC),A6 MOVE.L #PrintPath,D1 MOVE.L #1006,D2 JSR LVOOpen(A6) MOVE.L D0,FileHandle BEQ CantOpenFile JSR SetDiskPtrCol MOVE.L D0,D1 MOVE.L #PsetPLSTtext,D2 MOVEQ #56,D3 JSR LVOWrite(A6) LEA PrintingPLSTText(PC),A0 BSR ShowStatusText CLR PsetNumTemp pedpmainloop MOVE PsetNumTemp(PC),D0 LEA PsetPrtNumText(PC),A0 BSR IntToDecASCII MOVE.L PLSTmem(PC),A0 MOVE PsetNumTemp(PC),D0 MULU #30,D0 ADD.L D0,A0 MOVE.L A0,PsetPtrTemp LEA PsetPrtNameText(PC),A1 MOVE.L A1,A2 MOVEQ #19,D1 FillSpaceLoop MOVE.B #' ',(A2)+ DBF D1,FillSpaceLoop MOVEQ #19,D1 pedploop TST.B (A0) BEQ pedpskip MOVE.B (A0)+,(A1)+ DBF D1,pedploop pedpskip MOVE.L PsetPtrTemp(PC),A1 MOVE 22(A1),D0 LEA PsetPrtLenText(PC),A0 BSR IntToHexASCII MOVE.L PsetPtrTemp(PC),A1 MOVE 26(A1),D0 LEA PsetPrtRepeatText(PC),A0 BSR IntToHexASCII MOVE.L PsetPtrTemp(PC),A1 MOVE 28(A1),D0 ADD D0,D0 LEA PsetPrtRepLenText(PC),A0 BSR IntToHexASCII MOVE.L FileHandle(PC),D1 MOVE.L #PsetPrtNumText,D2 MOVEQ #53,D3 JSR LVOWrite(A6) BTST #2,$DFF016 BEQ AbortPLSTPrint ADDQ #1,PsetNumTemp MOVE PsetNumTemp(PC),D0 CMP PresetTotal(PC),D0 BNE pedpmainloop BRA pedpend AbortPLSTPrint LEA OprAbortedText(PC),A0 BSR ShowStatusText JSR SetErrorPtrCol pedpend MOVE.L FileHandle(PC),D1 JSR LVOClose(A6) BSR ShowAllRight JMP RestorePtrCol IntToDecASCII MOVEQ #3,D3 MOVE.L #1000,D2 itdloop EXT.L D0 DIVU D2,D0 ADD.B #'0',D0 MOVE.B D0,(A0)+ DIVU #10,D2 SWAP D0 DBF D3,itdloop RTS IntToHex2 MOVEQ #1,D2 BRA ithaloop IntToHexASCII MOVEQ #3,D2 ithaloop MOVE D0,D1 AND.B #15,D1 CMP.B #10,D1 BLO ithaskip ADDQ.B #7,D1 ithaskip ADD.B #'0',D1 MOVE.B D1,-(A0) ROR #4,D0 DBF D2,ithaloop RTS WritePLST LEA SavePLSTText,A0 JSR AreYouSure BNE Return2 JSR StorePtrCol JSR SetDiskPtrCol LEA SavingPLSTText(PC),A0 BSR ShowStatusText LEA PTPath,A0 JSR CopyPath LEA PLSTName(PC),A0 MOVEQ #4,D0 dsploop MOVE.B (A0)+,(A1)+ DBF D0,dsploop MOVE.L #FileName,D1 MOVE.L #1006,D2 MOVE.L DOSBase(PC),A6 JSR LVOOpen(A6) MOVE.L D0,D7 BEQ CantOpenFile MOVE.L D0,D1 MOVE.L PLSTmem(PC),D2 MOVE PresetTotal(PC),D3 MULU #30,D3 JSR LVOWrite(A6) MOVE.L D7,D1 JSR LVOClose(A6) BSR ShowAllRight JMP RestorePtrCol CheckPEDnames CMP #307,D0 BLO PED_PsetHit CLR PED_Action JSR SetNormalPtrCol CMP #122,D1 BHS Return2 CMP #111,D1 BHS PED_Bottom CMP #100,D1 BHS.S PED_OneDown CMP #67,D1 BHS PED_Exit CMP #56,D1 BHS.S PED_OneUp BRA.S PED_Top PED_OneUp SUBQ #1,PEDPos TST ShiftKeyStatus BNE.S poup2 BTST #2,$DFF016 BNE.S pedouskip poup2 SUBQ #7,PEDPos pedouskip CMP #1,PEDPos BGE ShowPresetNames PED_Top MOVE #1,PEDPos BRA ShowPresetNames PED_OneDown CMP #9,PresetTotal BLO ShowPresetNames ADDQ #1,PEDPos TST ShiftKeyStatus BNE.S podn2 BTST #2,$DFF016 BNE.S pedodskip podn2 ADDQ #7,PEDPos pedodskip MOVE PresetTotal,D0 SUB #10,D0 CMP PEDPos,D0 BHS ShowPresetNames pedodsx MOVE D0,PEDPos BRA ShowPresetNames PED_Bottom MOVE PresetTotal(PC),D0 SUB #11,D0 BMI.S PED_Top ADDQ #1,D0 BRA.S pedodsx ShowPresetNames MOVE #2321,D6 MOVEQ #9,D7 MOVE.L PLSTmem(PC),D0 BEQ Return2 MOVE.L D0,A5 MOVE PEDPos(PC),D0 MULU #30,D0 ADD.L D0,A5 spndploop TST.B (A5) BEQ Return2 LEA PresetNameText,A1 MOVEQ #21,D0 spnloop MOVE.B #' ',(A1)+ DBF D0,spnloop MOVE.L A5,A0 ADDQ.L #3,A0 LEA -22(A1),A1 spnloop2 MOVE.B (A0)+,D0 BEQ.S DisplayPreset MOVE.B D0,(A1)+ BRA.S spnloop2 fitutexttab dc.b " 0+1+2+3+4+5+6+7-8-7-6-5-4-3-2-1" DisplayPreset MOVEQ #19,D0 LEA PresetNameText,A0 MOVE D6,D1 BSR ShowText3 ADD #20,D6 MOVE D6,TextOffset MOVEQ #0,D0 MOVE.B 24(A5),D0 AND.B #$0F,D0 ADD D0,D0 LEA fitutexttab(PC,D0.W),A0 MOVE #2,TextLength BSR ShowText2 MOVE 22(A5),D0 ADD D0,D0 MOVE D0,WordNumber ADDQ #1,TextOffset BSR PrintHexWord MOVE 26(A5),D0 ADD D0,D0 MOVE D0,WordNumber ADDQ #1,TextOffset BSR PrintHexWord MOVE 28(A5),D0 ADD D0,D0 MOVE D0,WordNumber ADDQ #1,TextOffset BSR PrintHexWord ADD #220,D6 ; 218 LEA 30(A5),A5 DBF D7,spndploop RTS PED_EnterPath JSR StorePtrCol JSR SetWaitPtrCol CLR.L EditMode LEA PEdDefaultPath(PC),A6 BSR UpdateLineCurPos MOVE.L A6,TextEndPtr MOVE.L A6,ShowTextPtr ADD.L #31,TextEndPtr MOVE #20,TextLength MOVE.L #178,A4 BSR GetTextLine CLR.L TextEndPtr JMP RestorePtrCol PED_Disk JSR StorePtrCol JSR SetWaitPtrCol CLR.L EditMode CLR.B SndDiskNum0 CLR.B SndDiskNum1 LEA SndDiskNum0(PC),A6 MOVE.L A6,TextEndPtr MOVE.L A6,ShowTextPtr ADDQ.L #2,TextEndPtr MOVE #2,TextLength MOVE.L #621,A4 MOVE.B #3,EnterTextFlag BSR GetTextLine LEA SndDiskNum0(PC),A6 MOVE.B #':',2(A6) CLR.B EnterTextFlag CLR.L TextEndPtr JMP RestorePtrCol ShowPEDnumbers MOVE PresetTotal,WordNumber MOVE #1061,TextOffset BSR Print4DecDigits LEA PEdDefaultPath,A0 MOVE #178,D1 MOVEQ #20,D0 BSR ShowText3 LEA PEdDefaultVol,A0 MOVE #618,D1 MOVEQ #6,D0 BRA ShowText3 PED_PsetHit CMP #1,PresetTotal BEQ.S pedphend MOVE MouseY2(PC),D0 CMP #59,D0 BLO.S pedphend CMP #119,D0 BHS.S pedphend SUB #59,D0 DIVU #6,D0 MOVE.L D0,D1 SWAP D1 CMP #5,D1 BEQ.S pedphend MOVE D0,D2 ADD PEDPos(PC),D2 CMP PresetTotal(PC),D2 BHI.S pedphend MULU #30,D0 MOVE.L PLSTmem(PC),A5 ADD.L D0,A5 MOVE PEDPos(PC),D0 MULU #30,D0 ADD.L D0,A5 TST PED_Action BEQ.S PED_CopyName CMP #1,PED_Action BEQ PED_DoDelete pedphend RTS PED_CopyName LEA PresetName(PC),A0 MOVEQ #21,D0 pedcnloop MOVE.B (A5)+,D1 BNE pedcnskip MOVE.B #' ',D1 pedcnskip MOVE.B D1,(A0)+ DBF D0,pedcnloop MOVEQ #0,D0 MOVE.B 2(A5),D0 AND.B #$0F,D0 ADD D0,D0 LEA fitutexttab(PC),A1 LEA (A1,D0.W),A1 LEA PsetVolText(PC),A0 MOVE.B #' ',-1(A0) MOVE.B (A1)+,(A0)+ MOVE.B (A1),(A0) MOVE (A5),D0 ADD D0,D0 LEA 6(A0),A0 BSR IntToHexASCII MOVE 4(A5),D0 ADD D0,D0 LEA 9(A0),A0 BSR IntToHexASCII LEA 9(A0),A0 MOVE 6(A5),D0 ADD D0,D0 BSR IntToHexASCII BRA PossibleEdit PED_DoDelete CLR PED_Action LEA DeletePresetText,A0 JSR AreYouSure BNE Return2 MOVE.L PLSTmem(PC),A1 MOVE PresetTotal(PC),D0 MULU #30,D0 ADD.L D0,A1 pedddloop MOVE 30(A5),(A5) ADDQ.L #2,A5 CMP.L A5,A1 BHI.S pedddloop CLR.B (A5) SUBQ #1,PresetTotal SUB.L #30,MaxPLSTOffset MOVE PEDPos(PC),D0 ADD #9,D0 CMP PresetTotal(PC),D0 BHI.S pedddskip SUBQ #1,PEDPos pedddskip BSR ShowPEDnumbers BSR ShowPresetNames JSR SetNormalPtrCol JMP StorePtrCol sepc JMP SetErrorPtrCol PLSTisFull LEA PLSTFullText(PC),A0 BSR ShowStatusText JMP SetErrorPtrCol PED_DeleteDisk LEA DelDiskText(PC),A0 MOVE.B SndDiskNum0(PC),10(A0) MOVE.B SndDiskNum1(PC),11(A0) JSR AreYouSure BNE Return2 JSR StorePtrCol JSR SetWaitPtrCol MOVE.L PLSTmem(PC),A0 MOVE.L A0,A1 MOVE PresetTotal(PC),D0 MULU #30,D0 ADD.L D0,A1 MOVE.L SndDiskNum0-1(PC),D1 MOVE.L #$FF5F5FFF,D2 AND.L D2,D1 peddslo MOVE.L 2(A0),D0 AND.L D2,D0 CMP.L D1,D0 BNE.S peddsno MOVE.L A0,A2 peddslp MOVE 30(A0),(A0)+ CMP.L A1,A0 BLO.S peddslp SUBQ #1,PresetTotal SUB.L #30,MaxPLSTOffset MOVE.L A2,A0 BRA.S peddsn1 peddsno LEA 30(A0),A0 peddsn1 CMP.L A1,A0 BLO.S peddslo MOVE #1,PEDPos BSR ShowPEDnumbers BSR ShowPresetNames JMP RestorePtrCol DelDiskText dc.b "Delete ST-.. ?",0,0 ;************ MIDI Routines ************ * Apollon MIDI Routines V0.2 * * V0.2 04/07-1991 First version * _RVOAllocMiscResource = -6 _RVOFreeMiscResource = -12 OpenMIDI TST.L MIDIinBuffer BNE.S omidisk MOVE.L #256,D0 MOVE.L #MEMF_PUBLIC!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,MIDIinBuffer BEQ Return2 omidisk CLR.B MIDIinTo CLR.B MIDIinFrom BSR.S .GetSer2 ;got the port? BEQ.S .end ;yes MOVE.L 4.W,A6 ;no..try to flush serial.device: JSR LVOForbid(A6) LEA DeviceList(A6),A0 ;ExecBase->DeviceList LEA SerDevName(PC),a1 ;"serial.device" JSR LVOFindName(A6) TST.L D0 BEQ.S .notfnd ;no serial.device!! MOVE.L D0,A1 JSR LVORemDevice(A6) .notfnd JSR LVOPermit(A6) BSR.S .GetSer2 ;now try it again... .end RTS .GetSer2 MOVE.L 4.W,A6 MOVEQ #0,D0 LEA MiscResName(PC),a1 JSR LVOOpenResource(A6) MOVE.L D0,MiscResBase BEQ .gs_err MOVE.L D0,A6 LEA rb_ProgName,A1 MOVEQ #0,D0 ;serial port JSR _RVOAllocMiscResource(A6) TST.L D0 BNE.S .gs_err ST.B SerPortAlloc CLR PrevBits MOVE $DFF01C,D0 BTST #0,D0 SNE.B PrevBits BTST #11,D0 SNE.B PrevBits+1 MOVEQ #0,D0 ;TBE LEA MIDIOutInterrupt(PC),A1 MOVE.L 4.W,A6 JSR LVOSetIntVector(A6) MOVE.L D0,PrevTBE MOVEQ #11,D0 ;RBF LEA MIDIInInterrupt(pc),A1 JSR LVOSetIntVector(A6) MOVE.L D0,PrevRBF MOVE #114,$DFF032 ;set baud rate 114/31250 (SERPER) MOVE #$8801,$DFF09A ;RBF & TBE on!! MOVE #30000,D0 .lolo MOVE #$0F0,$DFF180 DBF D0,.lolo MOVEQ #0,D0 RTS .gs_err MOVE #30000,D0 .lplp MOVE #$F00,$DFF180 DBF D0,.lplp MOVEQ #-1,D0 RTS ;----- Close MIDI and release serial port ----- CloseMIDI MOVE.L MIDIinBuffer(PC),D0 BEQ.S clmskip MOVE.L D0,A1 MOVE.L #256,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) CLR.L MIDIinBuffer clmskip TST.L MiscResBase BEQ.S .fs_end TST.B SerPortAlloc BEQ.S .fs_end MOVE #$0801,$dff09a ;disable RBF & TBE MOVE.L PrevTBE(PC),a1 MOVEQ #0,D0 MOVE.L 4.W,A6 JSR LVOSetIntVector(A6) MOVE.L PrevRBF(PC),a1 MOVEQ #11,D0 JSR LVOSetIntVector(A6) MOVE #$8000,D0 TST.B PrevBits BEQ.S .fs1 BSET #0,D0 .fs1 TST.B PrevBits+1 BEQ.S .fs2 BSET #11,D0 .fs2 MOVE D0,$DFF09A ;set RBF & TBE to their prev. values MOVE.L MiscResBase(PC),A6 MOVEQ #0,D0 ;serial port JSR _RVOFreeMiscResource(A6) CLR.B SerPortAlloc CLR.B lastcmdbyte .fs_end RTS mintflag dc.w 0 ;----- Every time we receive a MIDI byte ----- MIDIInIntHandler MOVE $DFF018,D0 ; read from serdatr MOVE #$0800,$DFF09C ;intreq MOVE #$F00,$DFF180 MOVEM.L D1-D2,-(SP) gmiskip MOVEQ #0,D1 MOVE.B 4(A1),D1 ; in to MOVE.L D1,D2 ADDQ.B #1,D2 CMP.B 5(A1),D2 ; in from BEQ gmiexit ; Buffer overflow MOVE.L (A1),A0 ; midi in buffer MOVE.B D0,(A0,D1.W) MOVE.B D2,4(A1); MIDIinTo gmiexit MOVEM.L (SP)+,D1-D2 RTS ;----- MIDI Transmit Buffer Empty Interrupt (Output) ----- MIDIOutIntHandler MOVE #$4000,intena(A0) ;disable int. ADDQ.B #1,IDNestCnt(A6) ;turn off multitasking MOVE #1,intreq(A0) ;clear intreq bit MOVE.B bytesinbuff(PC),D0 BEQ.S exsih ;buffer empty MOVE.L 4(A1),A5 ;get buffer read pointer MOVE #$100,D1 ;Stop bit MOVE.B (A5),D1 ;get byte MOVE D1,$030(A0) ;and push it out!! ADDQ.L #1,A5 ;add 1 CMP.L A1,A5 ;shall we reset ptr?? BNE.S nbufptr ;not yet.. LEA sendbuffer(PC),A5 nbufptr SUBQ.B #1,D0 ;one less bytes in buffer MOVE.B D0,bytesinbuff ;remember it MOVE.L A5,4(A1) ;push new read pointer back exsih SUBQ.B #1,IDNestCnt(A6) ;multitasking back on BGE.S exsih0 MOVE #$C000,intena(A0) exsih0 RTS ;----- Send data to MIDI Out or to output buffer ----- ; A0=ptr to data, D0=length AddMIDIData TST.B SerPortAlloc BEQ.S retamd MOVE.L A2,-(SP) MOVE.L 4.W,A6 MOVE #$4000,$DFF09A ;Disable interrupts ADDQ.B #1,IDNestCnt(A6) MOVE.B bytesinbuff(pc),D1 BNE.S noTBEreq MOVE #$8001,$DFF09C ;request TBE noTBEreq LEA buffptr(PC),A2 ;end of buffer (ptr) MOVE.L (A2),A1 ;buffer pointer adddataloop MOVE.B (A0)+,D1 ;get byte BPL.S norscheck ;this isn't a status byte CMP.B #$EF,D1 ;forget system messages BHI.S norscheck CMP.B lastcmdbyte(PC),D1 ;same as previos status byte?? BEQ.S samesb ;yes, skip MOVE.B D1,lastcmdbyte ;no, don't skip but remember!! norscheck MOVE.B D1,(A1)+ ;push it to midi send buffer ADDQ.B #1,bytesinbuff samesb CMP.L A2,A1 ;end of buffer?? BNE.S noresbuffptr ;no, no!! LEA sendbuffer(pc),a1 ;better reset it to avoid trashing noresbuffptr SUBQ.B #1,D0 BNE.S adddataloop MOVE.L A1,(A2) ;push new buffer ptr back overflow SUBQ.B #1,IDNestCnt(A6) BGE.S retamd1 MOVE #$C000,$DFF09A ;enable interrupts again retamd1 MOVE.L (SP)+,A2 retamd RTS PrevTBE dc.l 0 PrevRBF dc.l 0 PrevBits dc.b 0,0 MIDIOutInterrupt dc.l 0,0 dc.b 2,0 dc.l MIDIOutName,buffptr,MIDIOutIntHandler MIDIInInterrupt dc.l 0,0 dc.b 2,0 dc.l MIDIInName,MIDIinBuffer,MIDIInIntHandler buffptr dc.l sendbuffer readbuffptr dc.l sendbuffer sendbuffer ds.b 128 SerPortAlloc dc.b 0 bytesinbuff dc.b 0 MiscResBase dc.l 0 lastcmdbyte dc.b 0 even MIDIOutName dc.b 'PT MIDI Out',0 MIDIInName dc.b 'PT MIDI In',0 MiscResName dc.b 'misc.resource',0 SerDevName dc.b 'serial.device',0 even ;----- read from input buffer ----- MIDIin MOVE.B MIDIinFrom(PC),D0 CMP.B MIDIinTo(PC),D0 BNE migetbyt MOVEQ #2,D1 RTS migetbyt MOVE.L MIDIinBuffer(PC),A0 MOVE.L A0,$7FFF0 MOVE.B (A0,D0.W),D0 ADDQ.B #1,MIDIinFrom MOVEQ #0,D1 RTS CheckMIDIin TST.B MIDIFlag BEQ Return2 BSR MIDIin TST.L D1 BEQ mic_ok MOVE.B #1,MIDIError RTS mic_ok CLR.B MIDIError TST.B D0 BPL mic_databyte ;statusbyte here CMP.B #$F0,D0 BHS MIDISysMessage MOVE.B D0,MIDIRunStatus MOVE.B D0,D1 AND.B #$F0,D1 MOVE.B D1,MIDIRunCommand AND.B #$0F,D0 MOVE.B D0,MIDIRunChannel CLR.B MIDIByteCount RTS mic_databyte MOVE.B MIDIRunCommand(PC),D1 CMP.B #$80,D1 BEQ M_NoteOff CMP.B #$90,D1 BEQ M_NoteOn CMP.B #$A0,D1 BEQ M_PolyTouch CMP.B #$B0,D1 BEQ M_Control CMP.B #$C0,D1 BEQ M_ProgChange CMP.B #$D0,D1 BEQ M_MonoTouch CMP.B #$E0,D1 BEQ M_PitchBend CMP.B #$F0,D1 BEQ M_SysExData RTS M_NoteOff TST.B MIDIByteCount BNE mnf_veloc MOVE.B D0,MIDINote ADD.B #1,MIDIByteCount RTS mnf_veloc CLR.B MIDIByteCount MOVE.B D0,MIDIVelocity ; BSR MidiPlay RTS M_NoteOn MOVE #$F0F,$DFF180 TST.B MIDIByteCount BNE mno_veloc MOVE.B D0,MIDINote ADD.B #1,MIDIByteCount RTS mno_veloc CLR.B MIDIByteCount MOVE.B D0,MIDIVelocity BEQ mnf_veloc ;* MidiPlay * MOVE.B MIDINote,D0 CMP.B MIDIinTrans,D0 BLO miplskip SUB.B MIDIinTrans(PC),D0 CMP.B #36,D0 BLS J_nkp RTS miplskip CMP.B XMIDI_Play,D0 BEQ J_PlaySong CMP.B XMIDI_Pattern,D0 BEQ J_PlayPattern CMP.B XMIDI_Edit,D0 BEQ J_Edit CMP.B XMIDI_Record,D0 BEQ J_RecordPattern CMP.B XMIDI_Stop,D0 BEQ J_StopIt RTS J_nkp JMP nkpskip J_PlaySong JMP PlaySong J_PlayPattern JMP PlayPattern J_Edit JMP Edit J_RecordPattern JMP RecordPattern J_StopIt JMP StopIt MIDIinTrans dc.b 60,0 XMIDI_Play dc.b 40 ; E XMIDI_Pattern dc.b 38 ; D XMIDI_Edit dc.b 43 ; G XMIDI_Record dc.b 41 ; F XMIDI_Stop dc.b 36 ; C dc.b 0 ; free 0 M_PolyTouch TST.B MIDIByteCount BNE mpt_touch MOVE.B D0,MIDINote ADD.B #1,MIDIByteCount RTS mpt_touch CLR.B MIDIByteCount MOVE.B D0,MIDITouch RTS M_Control TST.B MIDIByteCount BNE mc_value MOVE.B D0,MIDIController ADD.B #1,MIDIByteCount RTS mc_value CLR.B MIDIByteCount MOVE.B D0,MIDIlsb RTS M_ProgChange MOVE.B D0,MIDIProgram RTS ; ADDQ.B #1,D0 ; AND.B #$1F,D0 ; BNE mpchskip ; TST InsNum ; BEQ mpchskip ; MOVE InsNum(PC),LastInsNum ;mpchskip ; MOVE.B D0,InsNum+1 ; BRA ShowSampleInfo M_MonoTouch MOVE.B D0,MIDITouch RTS M_PitchBend TST.B MIDIByteCount BNE mp_msb MOVE.B D0,MIDIlsb ADD.B #1,MIDIByteCount RTS mp_msb CLR.B MIDIByteCount MOVE.B D0,MIDImsb EXT D0 SUB #128,D0 MOVE CurrentPlayNote,D1 SUB D0,D1 CMP #113,D1 BLS.S mp_2 MOVE #113,D1 mp_2 MOVE.L NoteAddr,A0 MOVE D1,6(A0) RTS NoteAddr dc.l 0 M_rts RTS MIDISysMessage CMP.B #$F0,D0 BEQ M_SysEx ; System Exclusive CMP.B #$F1,D0 BEQ M_rts ; Quarter Frame (MIDI Time Code) CMP.B #$F2,D0 BEQ M_SongPos ; Song Position Pointer CMP.B #$F3,D0 BEQ M_SongSelect ; Song Select CMP.B #$F4,D0 BEQ M_rts ; -Reserved- CMP.B #$F5,D0 BEQ M_rts ; -Reserved- CMP.B #$F6,D0 BEQ M_rts ; -Reserved- CMP.B #$F7,D0 BEQ M_EOX ; End of System Exclusive CMP.B #$F8,D0 BEQ M_rts ; MIDI Timing Clock CMP.B #$F9,D0 BEQ M_rts ; -Reserved- CMP.B #$FA,D0 BEQ M_Start ; Start Message CMP.B #$FB,D0 BEQ M_Continue ; Continue Message CMP.B #$FC,D0 BEQ M_Stop ; Stop Message CMP.B #$FD,D0 BEQ M_rts ; --- Reserved --- CMP.B #$FE,D0 BEQ M_rts ; Active Sensing (Each 300ms if on) CMP.B #$FF,D0 BRA M_rts ; System Reset Message M_SysEx RTS M_SysExData RTS M_SongPos RTS M_SongSelect RTS M_EOX RTS M_Start JMP PlaySong M_Continue RTS M_Stop JMP StopIt MIDIinBuffer dc.l 0 MIDIinTo dc.b 0 MIDIinFrom dc.b 0 MIDIRunStatus dc.b $80 MIDIRunChannel dc.b 0 MIDIRunCommand dc.b $08 MIDIByteCount dc.b 0 MIDINote dc.b 0 MIDIVelocity dc.b 0 MIDITouch dc.b 0 MIDIController dc.b 0 MIDImsb dc.b 0 MIDIlsb dc.b 0 MIDIProgram dc.b 0 MIDIError dc.b 0 ;---- Sampler Screen ---- SamplerScreen CLR.B RawKeyCode JSR WaitForButtonUp TST SamScrEnable BNE ExitFromSam MOVE #1,SamScrEnable MOVE.L EditMode(PC),SaveEditMode CLR.L EditMode MOVE.L TextBplPtr(PC),A0 LEA 5560(A0),A0 MOVE.L A0,D0 LEA CopList2Bpl4Ptr,A1 MOVE D0,6(A1) SWAP D0 MOVE D0,2(A1) MOVEQ #0,D0 MOVE #270,D1 MOVEQ #14,D2 LEA CursorSpriteData,A0 BSR SetSpritePos JSR SetSamSpritePtrs MOVE CopCol0+16,CopList2+18 BSR SwapSamScreen BEQ exisam2 BSR ClearSamScr JSR DoShowFreeMem BSR ShowSamNote BSR ShowResamNote BRA RedrawSample ExitFromSam JSR WaitForButtonUp MOVE.L SamMemPtr,D0 BEQ exisam2 MOVE.L D0,A1 BSR Bjarne BSR.S FreeDecompMem2 exisam2 JSR SetDefSpritePtrs CLR.B RawKeyCode CLR SamScrEnable MOVEQ #-1,D0 MOVE.L D0,MarkStartOfs MOVE.L SaveEditMode(PC),EditMode BSR SetScreenColors2 JSR SetupVUCols BSR SetScrPatternPos BSR ClearSamScr JSR UpdateCursorPos JSR SetTempo BRA RedrawPattern FreeDecompMem2 MOVE.L SamMemPtr,D0 BEQ Return2 MOVE.L D0,A1 MOVE.L SamMemSize,D0 CLR.L SamMemPtr MOVE.L 4.W,A6 JSR LVOFreeMem(A6) RTS DecompactSam MOVE.L A0,CompPtr MOVE.L D0,CompLen BSR.S FreeDecompMem2 MOVE.L CompPtr(PC),A0 CMP.L #'FORM',(A0) BEQ DecompactSIFF MOVE.L (A0),D0 MOVE.L D0,SamMemSize MOVEQ #0,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,SamMemPtr BEQ OutOfMemErr MOVE.L D0,A1 MOVE.L CompPtr(PC),A0 MOVE.L CompLen(PC),D0 ADDQ.L #4,A0 SUBQ.L #4,D0 dcmlop3 MOVE.B (A0)+,D1 CMP.B #181,D1 BEQ.S DecodeIt3 MOVE.B D1,(A1)+ decom3 SUBQ.L #1,D0 CMP.L #0,D0 BGT.S dcmlop3 MOVE.L SamMemPtr(PC),A1 MOVEQ #-1,D0 RTS DecodeIt3 MOVEQ #0,D1 MOVE.B (A0)+,D1 MOVE.B (A0)+,D2 dcdlop3 MOVE.B D2,(A1)+ DBF D1,dcdlop3 SUBQ.L #2,D0 BRA.S decom3 ; --- if crunched IFF then go 4 it!! DecompactSIFF MOVE.L A0,pic_buf MOVEM.L D0-7/A0-A6,-(SP) BSR iff_search MOVEM.L (SP)+,D0-7/A0-6 MOVE width_bytes(pc),D0 MULU height(pc),D0 MULU planes_num(pc),D0 MOVE.L D0,SamMemSize MOVE.L #$10000,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,SamMemPtr BEQ OutOfMemErr MOVE.L D0,bitplane ;store where to decompact into BSR colors_init BSR unpacker MOVE.L SamMemPtr,A1 MOVEQ #-1,D0 RTS SwapSamScreen LEA SampScreenData,A0 MOVE.L #SampScreenSize,D0 BSR DecompactSam BEQ Return2 bjasize=134*10 Bjarne LEA BitPlaneData+SamScrPos,A0 MOVEQ #1,D2 BjaLop1 MOVE #bjasize-1,D1 ; 134 BjaLop2 MOVE.L (A0),D0 MOVE.L (A1),(A0)+ MOVE.L D0,(A1)+ DBF D1,BjaLop2 ADD.L #PlaneSize-bjasize*4,A0 DBF D2,BjaLop1 LEA CopListInsPos,A0 LEA CopList2,A1 MOVEQ #29,D1 BjaLoop MOVE (A0),D0 MOVE (A1),(A0)+ MOVE D0,(A1)+ DBF D1,BjaLoop MOVEQ #-1,D0 RTS ClearSamScr MOVE #5121,TextOffset MOVE #2,TextLength MOVE.L #blnktxt,ShowTextPtr BSR ShowText MOVE #TempoNumPos,TextOffset MOVE #3,TextLength BSR ShowText MOVE #130*10-1,D0 MOVE.L TextBplPtr,A0 LEA 5560(A0),A0 MOVE.L A0,LineScreen MOVEQ #0,D1 clrsslp MOVE.L D1,(A0)+ DBF D0,clrsslp RTS blnktxt dc.b " " ClearSamArea MOVE #64*10-1,D0 MOVE.L TextBplPtr,A0 LEA 5560(A0),A0 MOVE.L A0,LineScreen MOVEQ #0,D1 clrsare MOVE.L D1,(A0)+ DBF D0,clrsare RTS CheckSamGadgets MOVEM.W MouseX2,D0/D1 CMP #139,D1 BLO SamTopBar CMP #139+64,D1 BLO SamplePressed CMP #201+11,D1 BLO SamDragBar CMP #201+22,D1 BLO SamMenu1 CMP #201+33,D1 BLO SamMenu2 CMP #201+44,D1 BLO SamMenu3 CMP #201+66,D1 BLO SamMenu4 RTS SamTopBar CMP #32,D0 BLO ExitFromSam RTS SamMenu1 CMP #32,D0 BLO Return2 CMP #96,D0 BLO PlayWaveform CMP #176,D0 BLO ShowRange CMP #246,D0 BLO ZoomOut BRA DispBox SamMenu2 CMP #32,D0 BLO StopPlaying CMP #96,D0 BLO PlayDisplay CMP #176,D0 BLO ShowAll CMP #246,D0 BLO RangeAll BRA LoopToggle SamMenu3 CMP #32,D0 BLO StopPlaying CMP #96,D0 BLO PlayRange CMP #109,D0 ;116 BLO CurToStart CMP #122,D0 BLO CurToMid CMP #136,D0 ;136 BLO CurToEnd CMP #176,D0 BLO SwapBuffer CMP #246,D0 BLO Sampler BRA SetSamNote SamMenu4 CMP #32,D0 BLO SamCut CMP #64,D0 BLO SamCopy CMP #96,D0 BLO SamPaste CMP #136,D0 BLO RampVolume CMP #176,D0 BLO TuningTone CMP #246,D0 BLO Resample BRA SetResamNote PlayWaveform JSR PlayNote JMP WaitForButtonUp PlayDisplay LEA SampleInfo,A0 MOVE.L SamOffSet(PC),StartOfs MOVE.L SamDisplay(PC),D0 LSR.L #1,D0 MOVE D0,(A0) CLR 4(A0) MOVE #1,6(A0) MOVE PlayInsNum,-(SP) CLR PlayInsNum JSR PlayNote MOVE (SP)+,PlayInsNum BSR ShowSampleInfo JMP WaitForButtonUp PlayRange MOVE.L MarkStartOfs(PC),D1 BMI NoRangeError MOVE.L MarkEndOfs(PC),D0 CMP.L D0,D1 BEQ LargerRangeError LEA SampleInfo,A0 MOVE.L D1,StartOfs SUB.L D1,D0 LSR.L #1,D0 MOVE D0,(A0) CLR 4(A0) MOVE #1,6(A0) MOVE PlayInsNum,-(SP) CLR PlayInsNum JSR PlayNote MOVE (SP)+,PlayInsNum BSR ShowSampleInfo JMP WaitForButtonUp StopPlaying BRA TurnOffVoices StartOfs dc.l 0 ;---- ShowRange MOVE.L MarkStartOfs(PC),D0 BMI NoRangeError MOVE.L MarkEndOfs(PC),D1 CMP.L D1,D0 BEQ LargerRangeError SUB.L D0,D1 BNE shorano MOVEQ #1,D1 shorano MOVE.L D1,SamDisplay MOVE.L D0,SamOffSet MOVEQ #-1,D0 MOVE.L D0,MarkStartOfs CLR MarkStart BSR DisplaySample JMP WaitForButtonUp ZoomOut MOVE.L SamDisplay(PC),D0 MOVE.L SamLength(PC),D1 MOVE.L SamOffSet(PC),D2 MOVE.L D0,D3 LSL.L #1,D3 CMP.L D1,D3 BHI ShowAll LSR.L #1,D0 CMP.L D2,D0 BLO zoomou2 MOVEQ #0,D0 zoomou2 SUB.L D0,D2 MOVE.L D2,D0 ADD.L D3,D0 CMP.L D1,D0 BLS zoomou3 SUB.L D3,D1 MOVE.L D1,D2 zoomou3 MOVE.L D2,SamOffSet MOVE.L D3,SamDisplay BSR OffsetToMark MOVE.L MarkStartOfs(PC),D0 CMP.L MarkEndOfs(PC),D0 BNE zoomouo MOVEQ #-1,D0 MOVE.L D0,MarkStartOfs zoomouo BSR DisplaySample JMP WaitForButtonUp ShowAll CLR.L SamOffSet MOVE.L SamLength(PC),SamDisplay BSR OffsetToMark MOVE.L MarkStartOfs(PC),D0 CMP.L MarkEndOfs(PC),D0 BNE shoallo MOVEQ #-1,D0 MOVE.L D0,MarkStartOfs CLR MarkStart shoallo BSR DisplaySample JMP WaitForButtonUp RangeAll BSR InvertRange MOVE #3,MarkStart MOVE #316,MarkEnd BSR MarkToOffset ranall2 BSR InvertRange JMP WaitForButtonUp CurToStart BSR InvertRange MOVEQ #3,D0 MOVE D0,MarkStart MOVE D0,MarkEnd MOVE.L SamOffSet(PC),D0 MOVE.L D0,MarkStartOfs MOVE.L D0,MarkEndOfs BRA ranall2 CurToMid BSR InvertRange MOVE #156,D0 MOVE D0,MarkStart MOVE D0,MarkEnd MOVE.L SamOffSet(PC),D0 LSR.L #1,D0 ADD.L SamDisplay(PC),D0 MOVE.L D0,MarkStartOfs MOVE.L D0,MarkEndOfs BRA ranall2 CurToEnd BSR InvertRange MOVE #316,D0 MOVE D0,MarkStart MOVE D0,MarkEnd MOVE.L SamOffSet(PC),D0 ADD.L SamDisplay(PC),D0 MOVE.L D0,MarkStartOfs MOVE.L D0,MarkEndOfs BRA ranall2 SwapBuffer MOVE InsNum(PC),D1 BEQ NotSampleNull LSL #2,D1 LEA SamplePtrs,A0 LEA (A0,D1.W),A0 MOVE.L CopyBufPtr(PC),D0 MOVE.L (A0),CopyBufPtr MOVE.L D0,(A0) MOVE.L D0,A1 CLR (A1) MOVE.L CopyBufSize(PC),D0 MOVE.L 124(A0),CopyBufSize MOVE.L D0,124(A0) MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D1 MULU #30,D1 LEA 12(A0,D1.W),A0 LSR.L #1,D0 MOVE D0,(A0) MOVE.L RepBuf(PC),D0 MOVE.L 4(A0),RepBuf MOVE.L D0,4(A0) MOVE RepBuf2(PC),D0 MOVE 2(A0),RepBuf2 TST.B D0 BNE.S swabuf2 MOVE.B #$40,D0 swabuf2 MOVE D0,2(A0) JSR TurnOffVoices BSR ValidateLoops BSR ShowSampleInfo BSR UpdateRepeats BSR RedrawSample JMP WaitForButtonUp RepBuf dc.l 1 RepBuf2 dc.w $0040 ;---- NoRangeError LEA NoRangeText(PC),A0 nres2 BSR ShowStatusText JMP SetErrorPtrCol LargerRangeError LEA LargerRangeText(PC),A0 BRA.S nres2 SetCursorError LEA SetCursorText(PC),A0 BRA.S nres2 BufIsEmptyError LEA BufIsEmptyText(PC),A0 BRA.S nres2 EmptySampleError LEA EmptySampleText(PC),A0 BRA.S nres2 NoRangeText dc.b "no range selected",0 LargerRangeText dc.b "set larger range",0 SetCursorText dc.b "set cursor pos",0 BufIsEmptyText dc.b "buffer is empty",0 EmptySampleText dc.b "sample is empty",0 ;---- DispBox RTS LoopToggle JSR WaitForButtonUp MOVE InsNum(PC),D1 BEQ NotSampleNull MOVE.L SongDataPtr(PC),A0 MULU #30,D1 LEA 12(A0,D1.W),A0 TST LoopOnOffFlag BEQ.S loopton MOVE.L 4(A0),SavSamInf MOVEQ #1,D0 MOVE.L D0,4(A0) BSR ValidateLoops JSR TurnOffVoices looptlo BSR ShowSampleInfo BSR UpdateRepeats BRA DisplaySample loopton MOVE.L SavSamInf(PC),D0 BNE.S loopto2 MOVE (A0),D0 loopto2 MOVE.L D0,4(A0) BSR ValidateLoops BRA looptlo ShowLoopToggle LEA ToggleOFFText(PC),A0 TST LoopOnOffFlag BEQ.S sltskip LEA ToggleONText(PC),A0 sltskip MOVEQ #3,D0 MOVE #9076,D1 BRA ShowText3 LoopOnOffFlag dc.w 0 SavSamInf dc.l 0 SetSamNote BSR ShowResamNote MOVE #9516,TextOffset MOVE #3,TextLength MOVE.L #SpcNoteText,ShowTextPtr BSR ShowText MOVE #1,SamNoteType MOVE.L #SampleNote,SplitAddress JMP WaitForButtonUp SetResamNote BSR ShowSamNote MOVE #9956,TextOffset MOVE #3,TextLength MOVE.L #SpcNoteText,ShowTextPtr BSR ShowText MOVE #2,SamNoteType MOVE.L #ResampleNote,SplitAddress JMP WaitForButtonUp ResampleText dc.b "Resample?",0 ResamplingText dc.b "Resampling...",0 Resample LEA ResampleText(PC),A0 JSR AreYouSure BNE Return2 JSR StorePtrCol JSR SetWaitPtrCol LEA ResamplingText(PC),A0 BSR ShowStatusText LEA SamplePtrs,A0 MOVE InsNum(PC),D1 BEQ NotSampleNull LSL #2,D1 LEA (A0,D1.W),A0 MOVE.L (A0),D0 BEQ ERC2 MOVE.L D0,A2 MOVE.L 124(A0),D6 CMP.L #2,D6 BLS ERC2 MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D1 MULU #30,D1 MOVEQ #0,D0 MOVE.B 12+2(A0,D1.W),D0 ; finetune MULU #37*2,D0 LEA PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D1 MOVE ResampleNote(PC),D1 LSL #1,D1 MOVE (A0,D1.W),D1 BEQ ERC2 LEA PeriodTable,A0 MOVEQ #0,D5 MOVE TuneNote,D5 LSL #1,D5 MOVE (A0,D5.W),D5 BEQ ERC2 ; D1=resamperiod, D5=tuneperiod MOVE.L D5,D0 ; tune LSL.L #8,D0 LSL.L #4,D0 ; * 4096 DIVU D1,D0 ; / resample MOVEQ #0,D4 MOVE D0,D4 LSL.L #4,D4 ; hi-word=add value, lo-word=fraction MOVE D6,D7 LSR #1,D7 MULU D1,D7 DIVU D5,D7 AND.L #$FFFF,D7 CMP #2,D7 BLO ERC2 CMP #$7FFF,D7 BLO resamlo MOVE #$7FFF,D7 resamlo ADD.L D7,D7 MOVE.L D7,D0 MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) TST.L D0 BEQ SamMemError MOVE.L D0,A1 MOVE.L D0,A3 JSR TurnOffVoices MOVE.L A2,A0 ; D4=resample value, D6=old length, D7=new length ; A0/A2=old sample, A1/A3=new sample MOVE #32767,D1 MOVEQ #0,D3 MOVEQ #0,D5 resampleloop MOVE.B 1(A0),D0 EXT D0 MULS D1,D0 MOVE.B (A0),D2 EXT D2 MULS D3,D2 ADD.L D2,D0 ASR.L #8,D0 ASR.L #7,D0 MOVE.B D0,(A1)+ ADD.L D4,D5 SWAP D5 MOVE.L A2,A0 MOVEQ #0,D0 MOVE D5,D0 ADD.L D0,A0 SWAP D5 MOVE D5,D1 LSR #1,D1 MOVE #32767,D3 SUB D1,D3 MOVE.L A1,A4 SUB.L A3,A4 CMP.L D7,A4 BHS.S resamskip MOVE.L A0,A4 SUB.L A2,A4 CMP.L D6,A4 BLO.S resampleloop resamskip MOVE.L A2,A1 MOVE.L D6,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) MOVE InsNum(PC),D1 LSL #2,D1 LEA SamplePtrs,A0 LEA (A0,D1.W),A0 MOVE.L A3,(A0) MOVE.L D7,124(A0) MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D1 MULU #30,D1 LEA 12(A0,D1.W),A0 LSR.L #1,D7 MOVE D7,(A0) CLR.B 2(A0) CLR 4(A0) MOVE #1,6(A0) JSR RestorePtrCol BSR ClearSamStarts BSR ShowSampleInfo BSR ShowAllRight BRA RedrawSample ERC2 JMP ErrorRestoreCol SamCut CLR.B RawKeyCode MOVE.L MarkStartOfs(PC),D0 BMI NoRangeError CMP.L MarkEndOfs(PC),D0 BEQ LargerRangeError TST.B CutToBufFlag BEQ.S samcut2 BSR SamCopy samcut2 BSR TurnOffVoices LEA SamplePtrs(PC),A0 MOVE InsNum(PC),D1 BEQ NotSampleNull LSL #2,D1 LEA (A0,D1.W),A0 MOVE.L (A0),D0 BEQ EmptySampleError MOVE.L 124(A0),D2 CMP.L #2,D2 BLO EmptySampleError MOVE.L D0,A1 MOVE.L D0,A2 ; sample start MOVE.L D0,A3 MOVE.L D0,A4 MOVE.L D0,A5 ADD.L MarkStartOfs(PC),A3 ; mark start MOVE.L MarkEndOfs(PC),D0 SUB.L MarkStartOfs(PC),D0 CMP.L D2,D0 BHS Destroy MOVE.L MarkEndOfs(PC),D0 CMP.L D2,D0 BLO.S samsome MOVE.L D2,D0 SUBQ.L #1,D0 samsome ADD.L D0,A4 ; mark end ADD.L D2,A5 ; sample end MOVE.L A3,D0 SUB.L A2,D0 ADD.L A5,D0 SUB.L A4,D0 BNE sacoklen MOVEQ #0,D3 MOVEQ #0,D4 BRA sacfree sacoklen MOVE.L D0,D3 MOVEQ #MEMF_CHIP,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,D4 BEQ OutOfMemErr ; No memory MOVE.L D0,A0 MOVE.L A2,A1 MOVE.L A3,D0 SUB.L A2,D0 BRA.S sacskp1 saclop1 MOVE.B (A2)+,(A0)+ sacskp1 DBF D0,saclop1 MOVE.L A5,D0 SUB.L A4,D0 BRA.S sacskp2 smclop2 MOVE.B (A4)+,(A0)+ sacskp2 DBF D0,smclop2 sacfree MOVE.L D2,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) MOVE InsNum(PC),D1 LSL #2,D1 LEA SamplePtrs(PC),A0 LEA (A0,D1.W),A0 MOVE.L D4,(A0) MOVE.L D3,124(A0) MOVE.L D4,SamStart MOVE.L D3,SamLength MOVE.L SamOffSet(PC),D4 ADD.L SamDisplay(PC),D4 CMP.L D3,D4 BLO samcuto ; display ok MOVE.L SamDisplay(PC),D4 CMP.L D3,D4 BLO samnils ; if display < length, move offset samsall CLR.L SamOffSet ; else show all MOVE.L D3,SamDisplay BRA samcuto samnils MOVE.L D3,D4 SUB.L SamDisplay(PC),D4 BMI.S samsall ; if offset < 0, show all MOVE.L D4,SamOffSet samcuto MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D1 MULU #30,D1 LEA 12(A0,D1.W),A0 LSR.L #1,D3 MOVE D3,(A0) MOVE 4(A0),D0 CMP D3,D0 BLS.S samcuxx MOVEQ #1,D0 MOVE.L D0,4(A0) BRA.S samcuex samcuxx ADD 6(A0),D0 CMP D3,D0 BLS.S samcuex SUB 4(A0),D3 MOVE D3,6(A0) samcuex MOVE.L MarkStartOfs(PC),MarkEndOfs BSR ClearSamStarts BSR ValidateLoops BSR ShowSampleInfo BRA DisplaySample SamCopy CLR.B RawKeyCode MOVE.L MarkStartOfs(PC),D0 BMI NoRangeError CMP.L MarkEndOfs(PC),D0 BEQ LargerRangeError LEA SamplePtrs(PC),A0 MOVE InsNum(PC),D1 BEQ NotSampleNull LSL #2,D1 LEA (A0,D1.W),A0 MOVE.L (A0),D0 BEQ EmptySampleError MOVE.L 124(A0),D2 BEQ EmptySampleError MOVE.L D0,A3 MOVE.L D0,A4 ADD.L MarkStartOfs(PC),A3 ; mark start MOVE.L MarkEndOfs(PC),D0 ; mark end CMP.L D2,D0 BLO.S csamsom MOVE.L D2,D0 SUBQ.L #1,D0 csamsom ADD.L D0,A4 BSR.S FreeCopyBuf MOVE.L A4,D0 SUB.L A3,D0 ADDQ.L #1,D0 MOVE.L D0,CopyBufSize MOVEQ #MEMF_CHIP,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) MOVE.L D0,CopyBufPtr BEQ OutOfMemErr ; No memory MOVE.L D0,A5 csamlop MOVE.B (A3)+,(A5)+ CMP.L A4,A3 BLS.S csamlop BSR InvertRange BSR InvertRange JMP WaitForButtonUp FreeCopyBuf MOVE.L CopyBufPtr(PC),D0 BEQ Return2 MOVE.L D0,A1 MOVE.L CopyBufSize(PC),D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) CLR.L CopyBufPtr RTS CopyBufPtr dc.l 0 CopyBufSize dc.l 0 SamPaste CLR.B RawKeyCode MOVE.L MarkStartOfs(PC),D0 BMI SetCursorError LEA SamplePtrs(PC),A0 MOVE InsNum(PC),D1 BEQ NotSampleNull LSL #2,D1 LEA (A0,D1.W),A0 MOVEQ #0,D2 MOVE.L (A0),D0 BEQ.S sapanul MOVE.L 124(A0),D2 sapanul MOVE.L D0,A2 MOVE.L CopyBufPtr(PC),D3 BEQ BufIsEmptyError MOVE.L D3,A3 MOVE.L CopyBufSize(PC),D3 BEQ BufIsEmptyError MOVE.L D3,D4 ; copysize ADD.L D2,D4 ; + origsize CMP.L #$FFFE,D4 BLO.S sapaok MOVE.L #$FFFE,D4 sapaok MOVE.L D4,D0 MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) TST.L D0 BEQ OutOfMemErr MOVE.L D0,A4 MOVEQ #0,D0 TST.L D2 BEQ.S sapask1 MOVE.L MarkStartOfs(PC),D0 sapask1 MOVE.L D0,MarkStartOfs MOVE.L A2,A1 MOVE.L D2,D1 MOVE.L A4,A5 MOVE.L A4,A0 ADD.L D4,A0 ; D0 = paste position ; A0 = end of new sample ; A1/D1 = copy of A2/D2 ; A2/D2 = original sample ; A3/D3 = copy buffer ; A4/D4 = new sample ; A5 = copy of A4 BRA.S sapask2 sapalp1 MOVE.B (A2)+,(A4)+ ; copy first part CMP.L A0,A4 BHS.S sapaski SUBQ.L #1,D2 sapask2 DBF D0,sapalp1 BRA.S sapask3 sapalp2 MOVE.B (A3)+,(A4)+ ; copy from buffer CMP.L A0,A4 BHS.S sapaski sapask3 DBF D3,sapalp2 TST.L D2 BEQ.S sapaski BMI.S sapaski sapalp3 MOVE.B (A2)+,(A4)+ ; copy last part CMP.L A0,A4 BHS.S sapaski SUBQ.L #1,D2 BNE.S sapalp3 sapaski MOVE.L D1,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) MOVE InsNum(PC),D1 LSL #2,D1 LEA SamplePtrs(PC),A0 LEA (A0,D1.W),A0 MOVE.L A5,(A0) MOVE.L D4,124(A0) MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D1 MULU #30,D1 LEA 12(A0,D1.W),A0 LSR.L #1,D4 MOVE D4,(A0) MOVE.L MarkStartOfs(PC),MarkEndOfs BSR OffsetToMark BSR ClearSamStarts BSR ShowSampleInfo BRA RedrawSample RampVolume MOVE.L TextBplPtr(PC),A0 LEA 6209(A0),A0 MOVEQ #32,D3 ravlap2 MOVEQ #16,D2 ravlap1 CLR.B (A0)+ DBF D2,ravlap1 LEA 23(A0),A0 DBF D3,ravlap2 LEA BitPlaneData+VolBoxPos,A0 LEA VolBoxData,A1 MOVEQ #1,D4 ravlop3 MOVEQ #32,D3 ravlop2 MOVEQ #16,D2 ravlop1 MOVE.B (A1)+,(A0)+ DBF D2,ravlop1 ADDQ.L #1,A1 LEA 23(A0),A0 DBF D3,ravlop2 LEA 8920(A0),A0 DBF D4,ravlop3 BSR ShowVolSliders JSR WaitForButtonUp ravloop BTST #2,$DFF016 BEQ.S ExitVolBox JSR DoKeyBuffer MOVE.B RawKeyCode(PC),D2 CMP.B #68,D2 BEQ.S ExitVolBox BTST #6,$BFE001 BNE.S ravloop MOVEM.W MouseX,D0-D1 CMP #72,D0 BLO.S ravloop CMP #72+136,D0 BHS.S ravloop CMP #155,D1 BLO.S ravloop CMP #166,D1 BLO.S Vol1Slider CMP #177,D1 BLO Vol2Slider CMP #188,D1 BLO VolGadgs BRA.S ravloop ExitVolBox LEA BitPlaneData+VolBoxPos,A0 MOVEQ #1,D2 revlap3 MOVEQ #32,D1 revlap2 MOVEQ #16,D0 revlap1 CLR.B (A0)+ DBF D0,revlap1 LEA 23(A0),A0 DBF D1,revlap2 LEA 8920(A0),A0 DBF D2,revlap3 BRA DisplaySample Vol1Slider CMP #167,D0 BHI.S v1skip LEA Vol1(PC),A4 MOVEQ #0,D7 v1loop1 BTST #6,$BFE001 BNE ravloop MOVE MouseX(PC),D0 CMP D7,D0 BEQ.S v1loop1 MOVE D0,D7 SUB #107,D0 BPL.S v1skp2 MOVEQ #0,D0 v1skp2 CMP #60,D0 BLS.S v1skp3 MOVEQ #60,D0 v1skp3 MULU #200,D0 DIVU #60,D0 MOVE D0,(A4) shvosl BSR ShowVolSliders BRA.S v1loop1 v1skip MOVE #180,LineCurX MOVE #164,LineCurY MOVE #6342,TextOffset BSR GetDec3Dig TST AbortDecFlag BNE shvosl CMP #200,D0 BLS.S v1sk2 MOVE #200,D0 v1sk2 MOVE D0,Vol1 BRA.S shvosl Vol2Slider CMP #167,D0 BHI.S v2skip LEA Vol2(PC),A4 MOVEQ #0,D7 BRA v1loop1 v2skip MOVE #180,LineCurX MOVE #175,LineCurY MOVE #6782,TextOffset BSR GetDec3Dig TST AbortDecFlag BNE shvosl CMP #200,D0 BLS.S v2sk2 MOVE #200,D0 v2sk2 MOVE D0,Vol2 BRA shvosl VolGadgs CMP #100,D0 BLO DoRampVol CMP #144,D0 BLO Normalize CMP #154,D0 BLO.S SetRampDown CMP #164,D0 BLO.S SetRampUp CMP #174,D0 BLO.S SetRampUnity BRA ExitVolBox SetRampDown MOVE #100,Vol1 CLR Vol2 BRA.S sru2 SetRampUp CLR Vol1 MOVE #100,Vol2 BRA.S sru2 SetRampUnity MOVE #100,Vol1 MOVE #100,Vol2 sru2 BSR.S ShowVolSliders JSR WaitForButtonUp BRA ravloop ShowVolSliders MOVE.L TextBplPtr(PC),A0 LEA 6209(A0),A0 MOVEQ #21,D3 ravlip2 MOVEQ #12,D2 ravlip1 CLR.B (A0)+ DBF D2,ravlip1 LEA 27(A0),A0 DBF D3,ravlip2 MOVEQ #0,D4 MOVE Vol1(PC),D4 MOVEQ #20,D5 BSR OneSlider MOVEQ #0,D4 MOVE Vol2(PC),D4 MOVEQ #31,D5 BSR OneSlider MOVE Vol1(PC),WordNumber MOVE #6342,TextOffset BSR Print3DecDigits MOVE Vol2(PC),WordNumber MOVE #6782,TextOffset BRA Print3DecDigits OneSlider MOVE D4,D6 ADD D4,D4 ADD D6,D4 DIVU #10,D4 ADD #105,D4 MOVEQ #2,D6 oneslop MOVE D4,D0 MOVE D4,D2 ADDQ #5,D2 MOVE D5,D1 MOVE D5,D3 BSR DrawLine ADDQ #1,D5 DBF D6,oneslop RTS DoRampVol CLR.B RawKeyCode LEA SamplePtrs(PC),A0 MOVE InsNum(PC),D1 BEQ nozerr1 LSL #2,D1 LEA (A0,D1.W),A0 MOVEQ #0,D2 MOVE.L (A0),D0 BEQ nozerr2 MOVE.L D0,A2 MOVE.L 124(A0),D2 BEQ nozerr2 MOVE.L MarkStartOfs(PC),D0 BMI drvskip MOVE.L MarkEndOfs(PC),D1 SUB.L D0,D1 BEQ.S drvskip ADD.L D0,A2 MOVE.L D1,D2 ADDQ.L #1,D2 drvskip JSR StorePtrCol JSR SetWaitPtrCol MOVE.L D2,D5 MOVEQ #0,D3 drvloop MOVE D3,D1 MULU Vol2(PC),D1 DIVU D2,D1 MOVE D2,D4 SUB D3,D4 MULU Vol1(PC),D4 DIVU D2,D4 ADD D4,D1 ADDQ #1,D3 MOVE.B (A2),D0 EXT D0 MULS D1,D0 DIVS #100,D0 CMP #127,D0 BLT.S drvskp2 MOVEQ #127,D0 drvskp2 CMP #-128,D0 BGT.S drvskp3 MOVEQ #-128,D0 drvskp3 MOVE.B D0,(A2)+ SUBQ.L #1,D5 BNE drvloop JSR RestorePtrCol BRA ExitVolBox nozerr1 BSR NotSampleNull BRA ravloop nozerr2 BSR EmptySampleError BRA ravloop Normalize CLR.B RawKeyCode LEA SamplePtrs(PC),A0 MOVE InsNum(PC),D1 BEQ nozerr1 LSL #2,D1 LEA (A0,D1.W),A0 MOVEQ #0,D2 MOVE.L (A0),D0 BEQ nozerr2 MOVE.L D0,A2 MOVE.L 124(A0),D2 BEQ nozerr2 MOVE.L MarkStartOfs(PC),D0 BMI nozskip MOVE.L MarkEndOfs(PC),D1 SUB.L D0,D1 BEQ.S nozskip ADD.L D0,A2 MOVE.L D1,D2 ADDQ.L #1,D2 nozskip JSR StorePtrCol JSR SetWaitPtrCol MOVEQ #0,D0 nozloop MOVE.B (A2)+,D1 EXT D1 BPL.S nozskp2 NEG D1 nozskp2 CMP D0,D1 BLO.S nozskp3 MOVE D1,D0 nozskp3 SUBQ.L #1,D2 BNE nozloop JSR RestorePtrCol TST D0 BEQ SetRampUnity CMP #127,D0 BHI SetRampUnity CMP #64,D0 BLO.S nozmax MOVE.L #12700,D1 DIVU D0,D1 MOVE D1,Vol1 MOVE D1,Vol2 BRA sru2 nozmax MOVE #200,Vol1 MOVE #200,Vol2 BRA sru2 Vol1 dc.w 100 Vol2 dc.w 100 TuningTone JSR WaitForButtonUp CLR.B RawKeyCode TST TToneFlag BNE TToneOff MOVE #1,TToneFlag MOVE PattCurPos,D2 DIVU #6,D2 ADDQ #1,D2 AND #3,D2 MOVEQ #1,D0 LSL D2,D0 MOVE D0,TToneBit LEA $DFF0A0,A0 LSL #4,D2 LEA (A0,D2.W),A0 LEA PeriodTable(PC),A1 MOVE TuneNote,D1 LSL #1,D1 MOVE (A1,D1.W),D1 LEA TToneData,A2 MOVE D0,$DFF096 ; DMACON MOVE.L A2,(A0) MOVE #16,4(A0) ; 32 bytes MOVE D1,6(A0) MOVE TToneVol,8(A0) MOVE DMAWait,D2 ttowait DBF D2,ttowait BSET #15,D0 MOVE D0,$DFF096 RTS TToneOff CLR TToneFlag MOVE TToneBit(PC),$DFF096 RTS TToneFlag dc.w 0 TToneBit dc.w 0 SamplePressed CMP #144,D1 BHS.S spruskp MOVE LoopStartPos(PC),D2 BEQ.S sprusk5 SUBQ #3,D2 CMP D2,D0 BLT.S sprusk5 ADDQ #4,D2 CMP D2,D0 BLO LoopStartDrag sprusk5 MOVE LoopEndPos(PC),D2 BEQ.S spruskp SUBQ #3,D2 CMP D2,D0 BLT.S spruskp ADDQ #4,D2 CMP D2,D0 BLO LoopEndDrag spruskp CMP #3,D0 BLO Return2 CMP #317,D0 BHS Return2 MOVE D0,LastSamPos BSR InvertRange MOVE LastSamPos(PC),D0 MOVE D0,MarkStart MOVE D0,MarkEnd BSR InvertRange BSR MarkToOffset MOVE.L MarkEndOfs(PC),SamplePos BSR ShowPos sprulop BTST #6,$BFE001 BNE spruend MOVE MouseX(PC),D0 CMP #3,D0 BLO sprusk3 CMP #317,D0 BHS sprusk2 BRA sprusk4 sprusk2 MOVE #316,D0 BRA sprusk4 sprusk3 MOVEQ #3,D0 sprusk4 CMP LastSamPos(PC),D0 BEQ sprulop MOVE D0,LastSamPos BSR InvertRange MOVE LastSamPos(PC),MarkEnd BSR InvertRange BSR MarkToOffset MOVE.L MarkEndOfs(PC),SamplePos BSR ShowPos BRA sprulop spruend MOVE MarkStart(PC),D0 MOVE MarkEnd(PC),D1 CMP D0,D1 BHS MarkToOffset MOVE D0,MarkEnd MOVE D1,MarkStart BRA MarkToOffset InvertRange MOVE MarkStart(PC),D4 BEQ Return2 MOVE MarkEnd(PC),D5 MOVE.L GfxBase(PC),A6 JSR LVOOwnBlitter(A6) JSR LVOWaitBlit(A6) invran3 MOVE D4,D0 MOVEQ #0,D1 MOVE D4,D2 MOVEQ #64,D3 BSR DrawInvertLine CMP D5,D4 BEQ invranx BHI invran2 ADDQ #1,D4 BRA invran3 invran2 SUBQ #1,D4 BRA invran3 invranx MOVE.L GfxBase(PC),A6 JSR LVODisownBlitter(A6) RTS LoopStartPos dc.w 0 LoopEndPos dc.w 0 LoopStartDrag CLR DragType LopDrgLop MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D0 BEQ Return2 MULU #30,D0 LEA 12(A0,D0.W),A0 MOVE MouseX(PC),D0 lsdlop1 BTST #6,$BFE001 BNE lsdexit MOVE MouseX(PC),D1 CMP D0,D1 BEQ.S lsdlop1 SUB DragType,D1 BPL.S lsdmsk1 MOVEQ #0,D1 lsdmsk1 CMP #314,D1 BLO.S lsdmsk2 MOVE #314,D1 lsdmsk2 MOVE.L SamDisplay(PC),D0 MULU D0,D1 DIVU #314,D1 MOVE.L SamOffSet(PC),D0 ADD D1,D0 ; new repeat BCLR #0,D0 MOVEQ #0,D1 MOVE 4(A0),D1 ; old repeat ADD D1,D1 TST DragType BNE.S drgrepl MOVE D1,D3 SUB D1,D0 ; offset ADD D0,D1 MOVE 6(A0),D2 ADD D2,D2 ADD D2,D3 SUBQ #2,D3 SUB D0,D2 CMP D3,D1 BLS.S lsdok MOVE D3,D1 MOVEQ #2,D2 lsdok LSR #1,D1 MOVE D1,4(A0) LSR #1,D2 MOVE D2,6(A0) BSR.S lsdexit BRA LopDrgLop lsdexit BSR ShowSampleInfo BSR UpdateRepeats BRA SetLoopSprites2 LoopEndDrag MOVE #3,DragType BRA LopDrgLop drgrepl MOVE.L D0,D2 ; repend SUB.L D1,D2 ; subtract repstart CMP.L #2,D2 BGT.S ledskp1 MOVEQ #2,D2 BRA.S lsdok ledskp1 MOVE D1,D0 ; repeat ADD D2,D0 ; + replen MOVE (A0),D3 ADD D3,D3 CMP D3,D0 BLS.S lsdok SUB D1,D3 MOVE D3,D2 BRA.S lsdok DragType dc.w 0 SamDragBar CMP #4,D0 BLO Return2 CMP #316,D0 BHS Return2 CMP DragStart(PC),D0 BLO.S draglo CMP DragEnd(PC),D0 BHI.S draghi MOVE MouseX(PC),D0 MOVE D0,D1 SUB DragStart(PC),D1 MOVE D1,SaveMX sdrlop1 BTST #6,$BFE001 BNE Return2 MOVE MouseX(PC),D1 CMP D0,D1 BEQ.S sdrlop1 SUB SaveMX(PC),D0 SUBQ #4,D0 BPL.S sdrskp1 MOVEQ #0,D0 sdrskp1 MOVE.L SamLength(PC),D1 BEQ Return2 MULU D1,D0 DIVU #311,D0 AND.L #$FFFF,D0 BSR dragchk MOVE MouseX(PC),D0 BRA.S sdrlop1 draglo MOVE.L SamOffSet(PC),D0 SUB.L SamDisplay(PC),D0 BPL.S draglo2 MOVEQ #0,D0 draglo2 CMP.L SamOffSet(PC),D0 BEQ Return2 MOVE.L D0,SamOffSet BRA DisplaySample draghi MOVE.L SamOffSet(PC),D0 ADD.L SamDisplay(PC),D0 dragchk MOVE.L D0,D1 ADD.L SamDisplay(PC),D1 CMP.L SamLength(PC),D1 BLS.S draglo2 MOVE.L SamLength(PC),D0 SUB.L SamDisplay(PC),D0 BRA.S draglo2 SaveMX dc.w 0 ;---- MarkToOffset MOVE.L SamDisplay(PC),D0 MOVE MarkStart(PC),D1 BEQ Return2 SUBQ #3,D1 MULU D0,D1 DIVU #314,D1 AND.L #$FFFF,D1 ADD.L SamOffSet(PC),D1 MOVE.L D1,MarkStartOfs MOVE MarkEnd(PC),D1 CMP #316,D1 BLO.S mtosome MOVE.L SamOffSet(PC),D1 ADD.L D0,D1 BRA.S mtoexit mtosome SUBQ #3,D1 MULU D0,D1 DIVU #314,D1 AND.L #$FFFF,D1 ADD.L SamOffSet(PC),D1 mtoexit MOVE.L D1,MarkEndOfs RTS OffsetToMark MOVE.L MarkStartOfs(PC),D0 BMI.S otmout MOVE #3,MarkStart SUB.L SamOffSet(PC),D0 BMI.S otmskip ; set to start if before offset MULU #314,D0 MOVE.L SamDisplay(PC),D1 BEQ.S otmskip DIVU D1,D0 CMP #314,D0 BHI.S otmout ; if start after display ADD D0,MarkStart otmskip MOVE #3,MarkEnd MOVE.L MarkEndOfs(PC),D0 SUB.L SamOffSet(PC),D0 BMI.S otmout ; if end before offset MULU #314,D0 MOVE.L SamDisplay(PC),D1 BEQ Return2 DIVU D1,D0 CMP #313,D0 BLS.S otmok MOVE #313,D0 ; set to end if after display otmok ADD D0,MarkEnd RTS otmout CLR MarkStart RTS SamScrEnable dc.w 0 SamMemPtr dc.l 0 SamMemSize dc.l 0 LastSamPos dc.w 0 MarkStart dc.w 0 MarkEnd dc.w 0 MarkStartOfs dc.l 0 MarkEndOfs dc.l 0 ;---- Sample graphing stuff ---- DisplaySample TST SamScrEnable BEQ Return2 BSR rdsdoit TST.L MarkStartOfs BMI Return2 BSR OffsetToMark BRA InvertRange RedrawSample TST SamScrEnable BEQ Return2 MOVEQ #-1,D0 MOVE.L D0,MarkStartOfs CLR MarkStart MOVE InsNum(PC),D0 BEQ rdsblnk LEA SampleStarts(PC),A1 SUBQ #1,D0 LSL #2,D0 MOVE.L (A1,D0.W),SamStart BEQ rdsblnk MOVE.L 124(A1,D0.W),D1 BEQ rdsblnk MOVE.L D1,SamLength CLR.L SamOffSet MOVE.L D1,SamDisplay BRA rdsdoit rdsblnk LEA BlankSample,A0 MOVE.L A0,SamStart MOVE.L #314,SamLength CLR.L SamOffSet MOVE.L #314,SamDisplay rdsdoit MOVE.L GfxBase(PC),A6 JSR LVOOwnBlitter(A6) JSR LVOWaitBlit(A6) BSR ClearSamArea MOVE.L SamStart(PC),A0 MOVEQ #0,D4 MOVE.L SamOffSet(PC),D5 MOVE.L SamDisplay(PC),D6 MOVE.L D5,D7 MOVE.L A0,D0 ADD.L D5,D0 MOVE.L D0,SamDrawStart ADD.L D6,D0 MOVE.L D0,SamDrawEnd rdsloop MOVE D4,D0 ADDQ #3,D0 MOVEQ #127,D1 SUB.B (A0,D7.L),D1 LSR #2,D1 TST D4 BNE rdsdraw BSR MoveTo BRA rdsupdt rdsdraw BSR DrawTo rdsupdt ADDQ #1,D4 MOVE.L D4,D7 MULU D6,D7 DIVU #314,D7 AND.L #$FFFF,D7 ADD.L D5,D7 CMP #314,D4 BLO rdsloop MOVE.L GfxBase(PC),A6 JSR LVODisownBlitter(A6) BSR.S SetDragBar MOVE.L SamDisplay(PC),D0 LEA BlankSample,A0 CMP.L SamStart,A0 BNE.S rdsslwo MOVEQ #0,D0 rdsslwo MOVE #215*40+33,TextOffset BSR Print6DecDigits BRA SetLoopSprites SamStart dc.l 0 SamLength dc.l 0 SamOffSet dc.l 0 SamDisplay dc.l 0 SavSamIns dc.w 0 SetDragBar MOVE #4*10-1,D0 MOVE.L TextBplPtr,A0 LEA 5560+2720(A0),A0 MOVEQ #0,D1 sdblop2 MOVE.L D1,(A0)+ DBF D0,sdblop2 MOVE.L SamLength(PC),D0 BEQ Return2 MOVE.L SamOffSet(PC),D4 MOVE.L SamDisplay(PC),D5 CMP.L D0,D5 BEQ Return2 ADD.L D4,D5 MULU #311,D4 DIVU D0,D4 ADDQ #4,D4 MOVE D4,DragStart MULU #311,D5 DIVU D0,D5 ADDQ #5,D5 MOVE D5,DragEnd MOVE.L GfxBase(PC),A6 JSR LVOOwnBlitter(A6) JSR LVOWaitBlit(A6) MOVEQ #68,D6 MOVEQ #3,D7 sdbloop MOVE D4,D0 MOVE.L D6,D1 MOVE D5,D2 MOVE.L D6,D3 BSR.S DrawLine ADDQ.L #1,D6 DBF D7,sdbloop MOVE.L GfxBase(PC),A6 JSR LVODisownBlitter(A6) RTS DragStart dc.w 0 DragEnd dc.w 0 ;---- Line Routine ---- DrawInvertLine MOVE.B #$48,MinTerm BSR.S DrawLine MOVE.B #$C8,MinTerm RTS MoveTo MOVE D0,PenX MOVE D1,PenY RTS DrawTo MOVE PenX(PC),D2 MOVE PenY(PC),D3 MOVE D0,PenX MOVE D1,PenY DrawLine MOVEM.L D4-D7,-(SP) MOVEQ #0,D4 SUB D1,D3 BGE.S dypos NEG D3 BRA.S dyneg dypos BSET #0,D4 dyneg SUB D0,D2 BGE.S dxpos NEG D2 BRA.S dxneg dxpos BSET #1,D4 dxneg MOVE D2,D5 SUB D3,D5 BGE.S dxdypos EXG D2,D3 BRA.S dxdyneg dxdypos BSET #2,D4 dxdyneg MOVEQ #0,D5 ROR #4,D0 OR #$0B00,D0 MOVE.B D0,D5 MOVE.B MinTerm(PC),D0 LSL #1,D5 MULS #ScrWidth,D1 ADD D5,D1 ADD.L LineScreen(PC),D1 blitrdy BTST #14,$DFF002 ; DMACONR BNE.S blitrdy MOVE $DFF01C,-(SP) BSET #7,(SP) MOVE #$7FFF,$DFF09A MOVE.B Octants(PC,D4),D4 ADD.L D3,D3 MOVE D3,$DFF062 ; BLTBMOD SUB D2,D3 BGE.S dldspos OR.B #$40,D4 dldspos MOVE.L D3,$DFF050 ; BLTAPTR SUB D2,D3 MOVE D3,$DFF064 ; BLTAMOD MOVE D4,$DFF042 ; BLTCON1 MOVE D0,$DFF040 ; BLTCON0 MOVE.L D1,$DFF048 ; BLTCPTR MOVE.L D1,$DFF054 ; BLTDPTR MOVE #ScrWidth,$DFF060 ; BLTCMOD MOVE #ScrWidth,$DFF066 ; BLTDMOD MOVE #$8000,$DFF074 ; BLTADAT MOVE #$FFFF,$DFF044 ; BLTAFWM MOVE LinMask(PC),$DFF072 ; BLTBDAT ASL #6,D2 ADD #2,D2 MOVE D2,$DFF058 ; BLTSIZE MOVE (SP)+,$DFF09A MOVEM.L (SP)+,D4-D7 RTS ScrWidth = 40 Octants dc.b 3*4+1,2*4+1,1*4+1,0*4+1,7*4+1,5*4+1,6*4+1,4*4+1 LinMask dc.w $FFFF MinTerm dc.b $C8 ;was $CA dc.b 0 ;free 0 PenX dc.w 0 PenY dc.w 0 LineScreen dc.l 0 ;---- Loop Sprites ---- SetLoopSprites MOVEQ #-1,D6 MOVEQ #-1,D7 MOVE InsNum(PC),D0 BEQ slsset MULU #30,D0 MOVE.L SongDataPtr(PC),A0 LEA 12(A0,D0.W),A0 SetLoopSprites2 TST SamScrEnable BEQ Return2 CLR LoopOnOffFlag MOVEQ #-1,D6 MOVEQ #-1,D7 MOVEQ #0,D0 MOVE 4(A0),D0 ADD.L D0,D0 MOVEQ #0,D1 MOVE 6(A0),D1 ADD.L D1,D1 MOVE.L D0,D5 ADD.L D1,D5 CMP #2,D5 BLS.S slsset MOVE #1,LoopOnOffFlag MOVE.L SamOffSet(PC),D2 MOVE.L SamDisplay(PC),D3 MOVE.L D2,D4 ADD.L D3,D4 CMP.L D2,D0 BLO.S 1$ CMP.L D4,D0 BHI.S 1$ SUB.L D2,D0 MULU #314,D0 DIVU D3,D0 ADDQ #3,D0 MOVE D0,D6 1$ CMP.L D2,D5 BLO.S slsset CMP.L D4,D5 BHI.S slsset SUB.L D2,D5 MULU #314,D5 DIVU D3,D5 ADDQ #6,D5 MOVE D5,D7 slsset MOVE #139,D1 MOVE D6,D0 BPL.S 1$ MOVEQ #0,D0 MOVE #270,D1 1$ MOVEQ #64,D2 LEA LoopSpriteData1,A0 MOVE D0,LoopStartPos BSR SetSpritePos MOVE #139,D1 MOVE D7,D0 BPL.S 2$ MOVEQ #0,D0 MOVE #270,D1 2$ MOVEQ #64,D2 LEA LoopSpriteData2,A0 MOVE D0,LoopEndPos BSR SetSpritePos BRA ShowLoopToggle ;---- Playroutine ---- audchan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0 audchan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0 audchan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0 audchan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0 IntMusic MOVEM.L D0-D7/A0-A6,-(SP) MOVE.L RunMode(PC),D0 BEQ NoNewPositionYet CMP.L #'patt',D0 BEQ.S 1$ MOVE.L SongPosition(PC),CurrPos 1$ MOVE.L SongDataPtr(PC),A0 MOVE.B sd_numofpatt(A0),SongNumOfPatt+1 TST StepPlayEnable BNE.S 2$ ADDQ.L #1,Counter MOVE.L Counter(PC),D0 CMP.L CurrSpeed(PC),D0 BLO.S NoNewNote 2$ CLR.L Counter TST.B PattDelayTime2 BEQ.S GetNewNote BSR.S NoNewAllChannels BRA dskip NoNewNote BSR.S NoNewAllChannels BRA NoNewPositionYet NoNewAllChannels LEA audchan1toggle,A4 LEA audchan1temp(PC),A6 LEA $DFF0A0,A5 BSR CheckEffects LEA audchan2toggle,A4 LEA audchan2temp(PC),A6 LEA $DFF0B0,A5 BSR CheckEffects LEA audchan3toggle,A4 LEA audchan3temp(PC),A6 LEA $DFF0C0,A5 BSR CheckEffects LEA audchan4toggle,A4 LEA audchan4temp(PC),A6 LEA $DFF0D0,A5 BRA CheckEffects GetNewNote LEA 12(A0),A3 LEA sd_pattpos(A0),A2 LEA sd_patterndata(A0),A0 MOVEQ #0,D1 MOVE.L SongPosition(PC),D0 MOVE.B (A2,D0.W),D1 CMP.L #'patt',RunMode BNE.S 1$ MOVE.L PatternNumber(PC),D1 1$ ASL.L #8,D1 ASL.L #2,D1 ADD.L PatternPosition(PC),D1 MOVE.L D1,PatternPtr CLR DMACONtemp LEA audchan1toggle,A4 LEA $DFF0A0,A5 LEA audchan1temp(PC),A6 MOVEQ #1,D2 BSR PlayVoice MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE D0,8(A5) LEA audchan2toggle,A4 LEA $DFF0B0,A5 LEA audchan2temp(PC),A6 MOVEQ #2,D2 BSR.S PlayVoice MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE D0,8(A5) LEA audchan3toggle,A4 LEA $DFF0C0,A5 LEA audchan3temp(PC),A6 MOVEQ #3,D2 BSR.S PlayVoice MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE D0,8(A5) LEA audchan4toggle,A4 LEA $DFF0D0,A5 LEA audchan4temp(PC),A6 MOVEQ #4,D2 BSR.S PlayVoice MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE D0,8(A5) BRA SetDMA CheckMetronome CMP.B MetroChannel,D2 BNE Return2 MOVE.B MetroSpeed,D2 BEQ Return2 MOVE.L PatternPosition,D3 LSR.L #4,D3 DIVU D2,D3 SWAP D3 TST D3 BNE Return2 AND.L #$00000FFF,(A6) OR.L #$10D6F000,(A6) ; Play sample $1F at period $0D6 (214) RTS PlayVoice TST.L (A6) BNE.S plvskip BSR PerNop plvskip MOVE.L (A0,D1.L),(A6) ; Read note from pattern BSR.S CheckMetronome ADDQ.L #4,D1 MOVEQ #0,D2 MOVE.B n_cmd(A6),D2 ; Get lower 4 bits of instrument AND.B #$F0,D2 LSR.B #4,D2 MOVE.B (A6),D0 ; Get higher 4 bits of instrument AND.B #$F0,D0 OR.B D0,D2 TST.B D2 BEQ SetRegisters ; Instrument was zero MOVEQ #0,D3 LEA SampleStarts(PC),A1 MOVE D2,D4 MOVE.B D2,n_samplenum(A6) SUBQ.L #1,D2 LSL.L #2,D2 MULU #30,D4 MOVE.L (A1,D2.L),n_start(A6) MOVE (A3,D4.L),n_length(A6) MOVE (A3,D4.L),n_reallength(A6) MOVE.B 2(A3,D4.L),n_finetune(A6) MOVE.B 3(A3,D4.L),n_volume(A6) MOVE 4(A3,D4.L),D3 ; Get repeat TST D3 BEQ.S NoLoop MOVE.L n_start(A6),D2 ; Get start ASL #1,D3 ADD.L D3,D2 ; Add repeat MOVE.L D2,n_loopstart(A6) MOVE.L D2,n_wavestart(A6) MOVE 4(A3,D4.L),D0 ; Get repeat ADD 6(A3,D4.L),D0 ; Add replen MOVE D0,n_length(A6) MOVE 6(A3,D4.L),n_replen(A6) ; Save replen BRA.S SetRegisters NoLoop MOVE.L n_start(A6),D2 ADD.L D3,D2 MOVE.L D2,n_loopstart(A6) MOVE.L D2,n_wavestart(A6) MOVE 6(A3,D4.L),n_replen(A6) ; Save replen SetRegisters MOVE (A6),D0 AND #$0FFF,D0 BEQ CheckMoreEffects ; If no note MOVE 2(A6),D0 AND #$0FF0,D0 CMP #$0E50,D0 ; finetune BEQ.S DoSetFineTune MOVE.B 2(A6),D0 AND.B #$0F,D0 CMP.B #3,D0 ; TonePortamento BEQ.S ChkTonePorta CMP.B #5,D0 ; TonePortamento + VolSlide BEQ.S ChkTonePorta CMP.B #9,D0 ; Sample Offset BNE.S SetPeriod BSR CheckMoreEffects BRA.S SetPeriod DoSetFineTune BSR SetFineTune BRA.S SetPeriod ChkTonePorta BSR SetTonePorta BRA CheckMoreEffects SetPeriod MOVEM.L D0-D1/A0-A1,-(SP) MOVE (A6),D1 AND #$0FFF,D1 LEA PeriodTable(PC),A1 MOVEQ #0,D0 MOVEQ #$24,D7 ftuloop CMP (A1,D0.W),D1 BHS ftufound ADDQ.L #2,D0 DBF D7,ftuloop ftufound MOVEQ #0,D1 MOVE.B n_finetune(A6),D1 MULU #37*2,D1 ADD.L D1,A1 MOVE (A1,D0.W),n_period(A6) MOVEM.L (SP)+,D0-D1/A0-A1 MOVE 2(A6),D0 AND #$0FF0,D0 CMP #$0ED0,D0 BEQ CheckMoreEffects MOVE n_dmabit(A6),$DFF096 BTST #2,n_wavecontrol(A6) BNE vibnoc CLR.B n_vibratopos(A6) vibnoc BTST #6,n_wavecontrol(A6) BNE trenoc CLR.B n_tremolopos(A6) trenoc MOVE n_length(A6),4(A5) ; Set length MOVE.L n_start(A6),(A5) ; Set start BNE sdmaskp CLR.L n_loopstart(A6) MOVEQ #1,D0 MOVE D0,4(A5) MOVE D0,n_replen(A6) sdmaskp MOVE n_period(A6),D0 MOVE D0,6(A5) ; Set period JSR SpectrumAnalyzer ; Do the analyzer ST n_trigger(A6) MOVE n_dmabit(A6),D0 OR D0,DMACONtemp BRA CheckMoreEffects SetDMA MOVE DMAWait,D0 WaitDMA DBF D0,WaitDMA MOVE DMACONtemp,D0 AND ActiveChannels,D0 OR #$8000,D0 MOVE D0,$DFF096 MOVE DMAWait,D0 WaitDMA2 DBF D0,WaitDMA2 LEA $DFF000,A5 LEA audchan4temp(PC),A6 MOVE.L n_loopstart(A6),$D0(A5) MOVE n_replen(A6),$D4(A5) LEA audchan3temp(PC),A6 MOVE.L n_loopstart(A6),$C0(A5) MOVE n_replen(A6),$C4(A5) LEA audchan2temp(PC),A6 MOVE.L n_loopstart(A6),$B0(A5) MOVE n_replen(A6),$B4(A5) LEA audchan1temp(PC),A6 MOVE.L n_loopstart(A6),$A0(A5) MOVE n_replen(A6),$A4(A5) dskip TST.L RunMode BEQ dskipx BSR SetPatternPos dskipx MOVE.L PatternPosition(PC),D0 LSR.L #4,D0 MOVE D0,ScrPattPos ADD.L #16,PatternPosition MOVE.B PattDelayTime,D0 BEQ dskpc MOVE.B D0,PattDelayTime2 CLR.B PattDelayTime dskpc TST.B PattDelayTime2 BEQ dskpa SUBQ.B #1,PattDelayTime2 BEQ dskpa SUB.L #16,PatternPosition dskpa TST.B PBreakFlag BEQ nnpysk SF PBreakFlag MOVEQ #0,D0 MOVE.B PBreakPosition(PC),D0 LSL #4,D0 MOVE.L D0,PatternPosition CLR.B PBreakPosition nnpysk TST StepPlayEnable BEQ nnpysk2 BSR DoStopIt CLR StepPlayEnable MOVE.L PatternPosition(PC),D0 LSR.L #4,D0 AND #63,D0 MOVE D0,ScrPattPos nnpysk2 CMP.L #1024,PatternPosition BNE NoNewPositionYet NextPosition MOVEQ #0,D0 MOVE.B PBreakPosition(PC),D0 LSL #4,D0 MOVE.L D0,PatternPosition CLR.B PBreakPosition CLR.B PosJumpAssert CMP.L #'patp',RunMode BNE NoNewPositionYet ADDQ.L #1,SongPosition AND.L #$7F,SongPosition MOVE.L SongPosition(PC),D1 MOVE.L SongDataPtr(PC),A0 CMP.B sd_numofpatt(A0),D1 BLO NoNewPositionYet CLR.L SongPosition TST StepPlayEnable BEQ NoNewPositionYet BSR DoStopIt CLR StepPlayEnable MOVE.L PatternPosition(PC),D0 LSR.L #4,D0 MOVE D0,ScrPattPos NoNewPositionYet TST.B PosJumpAssert BNE NextPosition MOVEM.L (SP)+,D0-D7/A0-A6 RTS CheckEffects TST (A4) BEQ Return2 BSR chkefx2 MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE D0,8(A5) RTS chkefx2 BSR UpdateFunk MOVE n_cmd(A6),D0 AND #$0FFF,D0 BEQ Return2 MOVE.B n_cmd(A6),D0 AND.B #$0F,D0 TST.B D0 BEQ Arpeggio CMP.B #1,D0 BEQ PortaUp CMP.B #2,D0 BEQ PortaDown CMP.B #3,D0 BEQ TonePortamento CMP.B #4,D0 BEQ Vibrato CMP.B #5,D0 BEQ TonePlusVolSlide CMP.B #6,D0 BEQ VibratoPlusVolSlide CMP.B #$E,D0 BEQ E_Commands SetBack MOVE n_period(A6),6(A5) CMP.B #7,D0 BEQ Tremolo CMP.B #$A,D0 BEQ VolumeSlide Return2 RTS PerNop MOVE n_period(A6),6(A5) RTS Arpeggio MOVEQ #0,D0 MOVE.L Counter(PC),D0 DIVS #3,D0 SWAP D0 CMP #1,D0 BEQ Arpeggio1 CMP #2,D0 BEQ Arpeggio2 Arpeggio0 MOVE n_period(A6),D2 BRA ArpeggioSet Arpeggio1 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 LSR.B #4,D0 BRA ArpeggioFind Arpeggio2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #15,D0 ArpeggioFind ASL #1,D0 MOVEQ #0,D1 MOVE.B n_finetune(A6),D1 MULU #37*2,D1 LEA PeriodTable(PC),A0 ADD.L D1,A0 MOVEQ #0,D1 MOVE n_period(A6),D1 MOVEQ #$24,D7 arploop MOVE (A0,D0.W),D2 CMP (A0),D1 BHS ArpeggioSet ADDQ.L #2,A0 DBF D7,arploop RTS ArpeggioSet MOVE D2,6(A5) RTS FinePortaUp TST.L Counter BNE Return2 MOVE.B #$0F,LowMask PortaUp MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B LowMask,D0 MOVE.B #$FF,LowMask SUB D0,n_period(A6) MOVE n_period(A6),D0 AND #$0FFF,D0 CMP #$0071,D0 BPL PortaUskip AND #$F000,n_period(A6) OR #$0071,n_period(A6) PortaUskip MOVE n_period(A6),D0 AND #$0FFF,D0 MOVE D0,6(A5) RTS FinePortaDown TST.L Counter BNE Return2 MOVE.B #$0F,LowMask PortaDown CLR D0 MOVE.B n_cmdlo(A6),D0 AND.B LowMask,D0 MOVE.B #$FF,LowMask ADD D0,n_period(A6) MOVE n_period(A6),D0 AND #$0FFF,D0 CMP #$0358,D0 BMI PortaDskip AND #$F000,n_period(A6) OR #$0358,n_period(A6) PortaDskip MOVE n_period(A6),D0 AND #$0FFF,D0 MOVE D0,6(A5) RTS SetTonePorta MOVE.L A0,-(SP) MOVE (A6),D2 AND #$0FFF,D2 MOVEQ #0,D0 MOVE.B n_finetune(A6),D0 MULU #37*2,D0 LEA PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D0 StpLoop CMP (A0,D0.W),D2 BHS StpFound ADDQ #2,D0 CMP #37*2,D0 BLO StpLoop MOVEQ #35*2,D0 StpFound MOVE.B n_finetune(A6),D2 AND.B #8,D2 BEQ StpGoss TST D0 BEQ StpGoss SUBQ #2,D0 StpGoss MOVE (A0,D0.W),D2 MOVE.L (SP)+,A0 MOVE D2,n_wantedperiod(A6) MOVE n_period(A6),D0 CLR.B n_toneportdirec(A6) CMP D0,D2 BEQ ClearTonePorta BGE Return2 MOVE.B #1,n_toneportdirec(A6) RTS ClearTonePorta CLR n_wantedperiod(A6) RTS TonePortamento MOVE.B n_cmdlo(A6),D0 BEQ TonePortNoChange MOVE.B D0,n_toneportspeed(A6) CLR.B n_cmdlo(A6) TonePortNoChange TST n_wantedperiod(A6) BEQ Return2 MOVEQ #0,D0 MOVE.B n_toneportspeed(A6),D0 TST.B n_toneportdirec(A6) BNE TonePortaUp TonePortaDown ADD D0,n_period(A6) MOVE n_wantedperiod(A6),D0 CMP n_period(A6),D0 BGT TonePortaSetPer MOVE n_wantedperiod(A6),n_period(A6) CLR n_wantedperiod(A6) BRA TonePortaSetPer TonePortaUp SUB D0,n_period(A6) MOVE n_wantedperiod(A6),D0 CMP n_period(A6),D0 BLT TonePortaSetPer MOVE n_wantedperiod(A6),n_period(A6) CLR n_wantedperiod(A6) TonePortaSetPer MOVE n_period(A6),D2 MOVE.B n_glissfunk(A6),D0 AND.B #$0F,D0 BEQ GlissSkip MOVEQ #0,D0 MOVE.B n_finetune(A6),D0 MULU #37*2,D0 LEA PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D0 GlissLoop CMP (A0,D0.W),D2 BHS GlissFound ADDQ #2,D0 CMP #37*2,D0 BLO GlissLoop MOVEQ #35*2,D0 GlissFound MOVE (A0,D0.W),D2 GlissSkip MOVE D2,6(A5) ; Set period RTS Vibrato MOVE.B n_cmdlo(A6),D0 BEQ Vibrato2 MOVE.B n_vibratocmd(A6),D2 AND.B #$0F,D0 BEQ vibskip AND.B #$F0,D2 OR.B D0,D2 vibskip MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 BEQ vibskip2 AND.B #$0F,D2 OR.B D0,D2 vibskip2 MOVE.B D2,n_vibratocmd(A6) Vibrato2 MOVE.L A4,-(SP) MOVE.B n_vibratopos(A6),D0 LEA VibratoTable(PC),A4 LSR #2,D0 AND #$001F,D0 MOVEQ #0,D2 MOVE.B n_wavecontrol(A6),D2 AND.B #$03,D2 BEQ vib_sine LSL.B #3,D0 CMP.B #1,D2 BEQ vib_rampdown MOVE.B #255,D2 BRA vib_set vib_rampdown TST.B n_vibratopos(A6) BPL vib_rampdown2 MOVE.B #255,D2 SUB.B D0,D2 BRA vib_set vib_rampdown2 MOVE.B D0,D2 BRA vib_set vib_sine MOVE.B 0(A4,D0.W),D2 vib_set MOVE.B n_vibratocmd(A6),D0 AND #15,D0 MULU D0,D2 LSR #7,D2 MOVE n_period(A6),D0 TST.B n_vibratopos(A6) BMI VibratoNeg ADD D2,D0 BRA Vibrato3 VibratoNeg SUB D2,D0 Vibrato3 MOVE D0,6(A5) MOVE.B n_vibratocmd(A6),D0 LSR #2,D0 AND #$003C,D0 ADD.B D0,n_vibratopos(A6) MOVE.L (SP)+,A4 RTS TonePlusVolSlide BSR TonePortNoChange BRA VolumeSlide VibratoPlusVolSlide BSR Vibrato2 BRA VolumeSlide Tremolo MOVE.L A4,-(SP) MOVE.B n_cmdlo(A6),D0 BEQ Tremolo2 MOVE.B n_tremolocmd(A6),D2 AND.B #$0F,D0 BEQ treskip AND.B #$F0,D2 OR.B D0,D2 treskip MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 BEQ treskip2 AND.B #$0F,D2 OR.B D0,D2 treskip2 MOVE.B D2,n_tremolocmd(A6) Tremolo2 MOVE.B n_tremolopos(A6),D0 LEA VibratoTable(PC),A4 LSR #2,D0 AND #$001F,D0 MOVEQ #0,D2 MOVE.B n_wavecontrol(A6),D2 LSR.B #4,D2 AND.B #$03,D2 BEQ tre_sine LSL.B #3,D0 CMP.B #1,D2 BEQ tre_rampdown MOVE.B #255,D2 BRA tre_set tre_rampdown TST.B n_vibratopos(A6) BPL tre_rampdown2 MOVE.B #255,D2 SUB.B D0,D2 BRA tre_set tre_rampdown2 MOVE.B D0,D2 BRA tre_set tre_sine MOVE.B 0(A4,D0.W),D2 tre_set MOVE.B n_tremolocmd(A6),D0 AND #15,D0 MULU D0,D2 LSR #6,D2 MOVEQ #0,D0 MOVE.B n_volume(A6),D0 TST.B n_tremolopos(A6) BMI TremoloNeg ADD D2,D0 BRA Tremolo3 TremoloNeg SUB D2,D0 Tremolo3 BPL TremoloSkip CLR D0 TremoloSkip CMP #$40,D0 BLS TremoloOk MOVE #$40,D0 TremoloOk MOVE D0,8(A5) MOVE.B n_tremolocmd(A6),D0 LSR #2,D0 AND #$003C,D0 ADD.B D0,n_tremolopos(A6) MOVE.L (SP)+,A4 ADDQ.L #4,SP RTS SampleOffset MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 BEQ sononew MOVE.B D0,n_sampleoffset(A6) sononew MOVE.B n_sampleoffset(A6),D0 LSL #7,D0 CMP n_length(A6),D0 BGE sofskip SUB D0,n_length(A6) LSL #1,D0 ADD.L D0,n_start(A6) RTS sofskip MOVE #$0001,n_length(A6) RTS VolumeSlide MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 LSR.B #4,D0 TST.B D0 BEQ VolSlideDown VolSlideUp ADD.B D0,n_volume(A6) CMP.B #$40,n_volume(A6) BMI vsuskip MOVE.B #$40,n_volume(A6) vsuskip MOVE.B n_volume(A6),D0 ; MOVE D0,8(A5) RTS VolSlideDown MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 VolSlideDown2 SUB.B D0,n_volume(A6) BPL vsdskip CLR.B n_volume(A6) vsdskip MOVE.B n_volume(A6),D0 ; MOVE D0,8(A5) RTS PositionJump MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 SUBQ.B #1,D0 MOVE.L D0,SongPosition pj2 CLR.B PBreakPosition ST PosJumpAssert RTS VolumeChange MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 CMP.B #$40,D0 BLS VolumeOk MOVEQ #$40,D0 VolumeOk MOVE.B D0,n_volume(A6) ; MOVE D0,8(A5) RTS PatternBreak MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 MOVE.L D0,D2 LSR.B #4,D0 MULU #10,D0 AND.B #$0F,D2 ADD.B D2,D0 CMP.B #63,D0 BHI pj2 MOVE.B D0,PBreakPosition ST PosJumpAssert RTS SetSpeed MOVE.B 3(A6),D0 AND #$FF,D0 BEQ.S SpeedNull TST.B IntMode BEQ.S normspd CMP #32,D0 BLO.S normspd MOVE D0,RealTempo MOVEM.L D0-D7/A0-A6,-(SP) MOVE SamScrEnable,-(SP) ST SamScrEnable ST UpdateTempo JSR SetTempo MOVE (SP)+,SamScrEnable MOVEM.L (SP)+,D0-D7/A0-A6 RTS normspd CLR.L Counter MOVE D0,CurrSpeed+2 RTS SpeedNull CLR.L RunMode JSR SetNormalPtrCol RTS CheckMoreEffects MOVE.B 2(A6),D0 AND.B #$0F,D0 CMP.B #$9,D0 BEQ SampleOffset CMP.B #$B,D0 BEQ PositionJump CMP.B #$D,D0 BEQ PatternBreak CMP.B #$E,D0 BEQ E_Commands CMP.B #$F,D0 BEQ SetSpeed TST (A4) BEQ Return2 CMP.B #$C,D0 BEQ VolumeChange BRA PerNop E_Commands MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 LSR.B #4,D0 BEQ FilterOnOff CMP.B #1,D0 BEQ FinePortaUp CMP.B #2,D0 BEQ FinePortaDown CMP.B #3,D0 BEQ SetGlissControl CMP.B #4,D0 BEQ SetVibratoControl CMP.B #5,D0 BEQ SetFineTune CMP.B #6,D0 BEQ JumpLoop CMP.B #7,D0 BEQ SetTremoloControl CMP.B #8,D0 BEQ KarplusStrong CMP.B #$E,D0 BEQ PatternDelay TST (A4) BEQ Return2 CMP.B #9,D0 BEQ RetrigNote CMP.B #$A,D0 BEQ VolumeFineUp CMP.B #$B,D0 BEQ VolumeFineDown CMP.B #$C,D0 BEQ NoteCut CMP.B #$D,D0 BEQ NoteDelay CMP.B #$F,D0 BEQ FunkIt RTS FilterOnOff MOVE.B n_cmdlo(A6),D0 AND.B #1,D0 ASL.B #1,D0 AND.B #$FD,$BFE001 OR.B D0,$BFE001 RTS SetGlissControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 AND.B #$F0,n_glissfunk(A6) OR.B D0,n_glissfunk(A6) RTS SetVibratoControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 AND.B #$F0,n_wavecontrol(A6) OR.B D0,n_wavecontrol(A6) RTS SetFineTune MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 MOVE.B D0,n_finetune(A6) RTS JumpLoop TST.L Counter BNE Return2 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BEQ SetLoop TST.B n_loopcount(A6) BEQ jumpcnt SUB.B #1,n_loopcount(A6) BEQ Return2 jmploop MOVE.B n_pattpos(A6),PBreakPosition ST PBreakFlag RTS jumpcnt MOVE.B D0,n_loopcount(A6) BRA jmploop SetLoop MOVE.L PatternPosition,D0 LSR.L #4,D0 AND.B #63,D0 MOVE.B D0,n_pattpos(A6) RTS SetTremoloControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 LSL.B #4,D0 AND.B #$0F,n_wavecontrol(A6) OR.B D0,n_wavecontrol(A6) RTS KarplusStrong MOVEM.L D1-D2/A0-A1,-(SP) MOVE.L n_loopstart(A6),A0 MOVE.L A0,A1 MOVE n_replen(A6),D0 ADD D0,D0 SUBQ #2,D0 karplop MOVE.B (A0),D1 EXT D1 MOVE.B 1(A0),D2 EXT D2 ADD D1,D2 ASR #1,D2 MOVE.B D2,(A0)+ DBF D0,karplop MOVE.B (A0),D1 EXT D1 MOVE.B (A1),D2 EXT D2 ADD D1,D2 ASR #1,D2 MOVE.B D2,(A0) MOVEM.L (SP)+,D1-D2/A0-A1 RTS RetrigNote MOVE.L D1,-(SP) MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BEQ rtnend MOVE.L Counter,D1 BNE rtnskp MOVE n_note(A6),D1 AND #$0FFF,D1 BNE rtnend MOVE.L Counter,D1 rtnskp DIVU D0,D1 SWAP D1 TST D1 BNE rtnend DoRetrg MOVE n_dmabit(A6),$DFF096 ; Channel DMA off MOVE.L n_start(A6),(A5) ; Set sampledata pointer MOVE n_length(A6),4(A5) ; Set length MOVE n_period(A6),6(A5) MOVEQ #0,D0 MOVE.B n_volume(A6),D0 ; MOVE D0,8(A5) MOVE DMAWait,D0 rtnloop1 DBF D0,rtnloop1 MOVE n_dmabit(A6),D0 BSET #15,D0 MOVE D0,$DFF096 MOVE DMAWait,D0 rtnloop2 DBF D0,rtnloop2 MOVE.L n_loopstart(A6),(A5) MOVE.L n_replen(A6),4(A5) rtnend MOVE.L (SP)+,D1 RTS VolumeFineUp TST.L Counter BNE Return2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$F,D0 BRA VolSlideUp VolumeFineDown TST.L Counter BNE Return2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BRA VolSlideDown2 NoteCut MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 CMP.L Counter,D0 BNE Return2 CLR.B n_volume(A6) ; MOVE #0,8(A5) RTS NoteDelay MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 CMP.L Counter,D0 BNE Return2 MOVE (A6),D0 AND #$0FFF,D0 BEQ Return2 MOVE.L D1,-(SP) BRA DoRetrg PatternDelay TST.L Counter BNE Return2 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 TST.B PattDelayTime2 BNE Return2 ADDQ.B #1,D0 MOVE.B D0,PattDelayTime RTS FunkIt TST.L Counter BNE Return2 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 LSL.B #4,D0 AND.B #$0F,n_glissfunk(A6) OR.B D0,n_glissfunk(A6) TST.B D0 BEQ Return2 UpdateFunk MOVEM.L A0/D1,-(SP) MOVEQ #0,D0 MOVE.B n_glissfunk(A6),D0 LSR.B #4,D0 BEQ funkend LEA FunkTable(PC),A0 MOVE.B (A0,D0.W),D0 ADD.B D0,n_funkoffset(A6) BTST #7,n_funkoffset(A6) BEQ funkend CLR.B n_funkoffset(A6) MOVE.L n_loopstart(A6),D0 MOVEQ #0,D1 MOVE n_replen(A6),D1 ADD.L D1,D0 ADD.L D1,D0 MOVE.L n_wavestart(A6),A0 ADDQ.L #1,A0 CMP.L D0,A0 BLO.S funkok MOVE.L n_loopstart(A6),A0 funkok MOVE.L A0,n_wavestart(A6) MOVEQ #-1,D0 SUB.B (A0),D0 MOVE.B D0,(A0) funkend MOVEM.L (SP)+,A0/D1 RTS ;************************* End of Code ****************************** FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128 VibratoTable dc.b 0, 24, 49, 74, 97,120,141,161 dc.b 180,197,212,224,235,244,250,253 dc.b 255,253,250,244,235,224,212,197 dc.b 180,161,141,120, 97, 74, 49, 24 AllRightText dc.b 'All right',0 PLSTFullText dc.b 'Plst is full!',0 AreYouSureText dc.b 'Are you sure?',0 NoDiskInDriveText dc.b 'No disk in df0!',0 WriteProtectedText dc.b 'Write protected',0 OprAbortedText dc.b 'Print aborted!',0 EnterDataText dc.b 'Enter data',0 AddingPathText dc.b 'Adding path...',0 DiskErrorText dc.b 'Disk error !!',0 LoadingText dc.b 'Loading...',0 LoadingSongText dc.b 'Loading song',0 LoadingModuleText dc.b 'Loading module',0 LoadingSampleText dc.b 'Loading sample',0 SavingText dc.b 'Saving...',0 ;SaveSongText dc.b 'Save song ?',0 SavingSongText dc.b 'Saving song',0 ;SaveModuleText dc.b 'Save module ?',0 SavingModuleText dc.b 'Saving module',0 ;SaveSampleText dc.b 'Save sample ?',0 SavingSampleText dc.b 'Saving sample',0 LoadingPLSTText dc.b 'Loading plst',0 SavingPLSTText dc.b 'Saving plst',0 DeletingSongText dc.b 'Deleting song',0 DeletingModuleText dc.b 'Deleting module',0 DeletingSampleText dc.b 'Deleting sample',0 RenamingFileText dc.b 'Renaming file',0 DecrunchingText dc.b 'Decrunching...',0 CrunchingText dc.b 'Crunching...',0 SelectEntryText dc.b 'Select entry',0 SelectSongText dc.b 'Select song',0 SelectModuleText dc.b 'Select module',0 SelectSampleText dc.b 'Select sample',0 SelectFileText dc.b 'Select file',0 ReadingDirText dc.b 'Reading dir...',0 PosSetText dc.b 'Position set',0 PrintingSongText dc.b 'Printing song',0 PrintingPLSTText dc.b 'Printing plst',0 SaveSongText dc.b 'Save song ?',0 DeleteSongText dc.b 'Delete song ?',0 SaveModuleText dc.b 'Save module ?',0 DeleteModuleText dc.b 'Delete module ?',0 SaveSampleText dc.b 'Save sample ?',0 DeleteSampleText dc.b 'Delete sample ?',0 PrintPLSTText dc.b 'Print plst ?',0 PrintSongText dc.b 'Print song ?',0 QuitPTText dc.b 'Really quit ?',0 UpsampleText dc.b 'Upsample ?',0 DownSampleText dc.b 'Downsample ?',0 PleaseSelectText dc.b 'Please select',0 ClearSplitText dc.b 'Clear split ?',0 ResetAllText dc.b 'Reset config ?',0 DeletePresetText dc.b 'Delete preset ?',0 LoadPLSTText dc.b 'Load presetlist?',0 SavePLSTText dc.b 'Save presetlist?',0 KillSampleText dc.b 'Kill sample ?',0 AbortLoadText dc.b 'Abort loading ?',0 LoadConfigText dc.b 'Load config ?',0 SaveConfigText dc.b 'Save config ?',0 DiskFormatText dc.b 'Disk format' InProgressText dc.b 'in progress' FormattingCylText dc.b 'Formatting cyl ',0 VerifyingText dc.b 'Verifying cyl ',0 InitDiskText dc.b 'Initializing',0 PlsEntNamText dc.b 'Please enter name' OfVolumeText dc.b 'of volume: ST-__',0,0 cnop 0,2 DiskNumText1 dc.b '0' DiskNumText2 dc.b '0 ' PEdDefaultPath dc.b 'SYS:',0 dcb.b 47,0 PEdDefaultVol dc.b 'st-' SndDiskNum0 dc.b '0' SndDiskNum1 dc.b '1:' PresetName dc.b ' ' PsetNameText dc.b ' ' dc.b ' ' PsetVolText dc.b ' ' dc.b ' ' PsetLenText dc.b ' ' dc.b ' ' PsetRepeatText dc.b ' ' dc.b ' ' PsetReplenText dc.b ' ' InsertPsetText dc.b 'ST-01: 0 0000 0000 0002' PsetPLSTtext dc.b 'No. Samplename ' dc.b 'Length Repeat RepLen',$A,$A PsetPrtNumText dc.b ' : ' PsetPrtNameText dc.b ' ' PsetPrtLenText dc.b ' ' PsetPrtRepeatText dc.b ' ' PsetPrtRepLenText dc.b 10 dc.b 0 SongDumpText dc.b 9 dc.b 'Protracker Song-Dump -- Made with ' dc.b 'Protracker V1.2C ',$D,$A,$A dc.b 9 dc.b 'Songname: ' CRLF_Text dc.b 13,10 FF_Text dc.b 12,0 cnop 0,2 PatternNumText dc.b 9,9,9,'Pattern: ' PattNumText1 dc.b '0' PattNumText2 dc.b '0',$D,$A,$D,$A PtotText dc.b 9 PattXText1 dc.b "0" PattXText2 dc.b "0 : " PpText dc.b " " Prafs dc.b " 0000 0000 0000 ",$D,$A PnText2 dc.b " " cnop 0,2 dc.b 0 PattPosText dc.b '00 : ' PnText dc.b ' ',0 cnop 0,2 FmtSongDirName dc.b 'SYS:songs',0 FmtModuleDirName dc.b 'SYS:modules',0 cnop 0,2 STText1 dc.b 'ST' STText1Num dc.b '-' STText1Number dc.b 0,0,':' STText2 dc.b 'ST' STText2Num dc.b '-' STText2Number dc.b 0,0,':' STText3 dc.b 'ST' STText3Num dc.b '-' STText3Number dc.b 0,0,':' STText4 dc.b 'ST' STText4Num dc.b '-' STText4Number dc.b 0,0,':' EmptyLineText dc.b ' ',0 FastHexTable dc.b '000102030405060708090A0B0C0D0E0F' dc.b '101112131415161718191A1B1C1D1E1F' dc.b '202122232425262728292A2B2C2D2E2F' dc.b '303132333435363738393A3B3C3D3E3F' dc.b '404142434445464748494A4B4C4D4E4F' dc.b '505152535455565758595A5B5C5D5E5F' dc.b '606162636465666768696A6B6C6D6E6F' dc.b '707172737475767778797A7B7C7D7E7F' dc.b '808182838485868788898A8B8C8D8E8F' dc.b '909192939495969798999A9B9C9D9E9F' dc.b 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF' dc.b 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF' dc.b 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF' dc.b 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF' dc.b 'E0E1E2E3E4E5E6E7E8E9EAEBECEdEEEF' dc.b 'F0F1F2F3F4F5F6F7F8F9FAFBFCFdFEFF' TrackdiskName dc.b 'trackdisk.device',0 InputDevName dc.b 'input.device',0 DOSBase dc.l 0 IntuitionBase dc.l 0 GfxBase dc.l 0 RawKeyHexTable dc.b 10,1,2,3,4,5,6,7 dc.b 8,9,32,53,51,34,18,35 RawKeyScaleTable dc.b 49,33,50,34,51,52,36,53,37,54,38,55,56,40,57 dc.b 41,58,16,2,17,3,18,19,5,20,6,21,7,22,23,9,24,10 dc.b 25,26,12,27,70,70,0 KbdTransTable1 dc.b 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16 dc.b 12,13,14,15,16,17,18,19,20,21,22,23 dc.b 24,25,26,27,28,29,30,31,36,36 KbdTransTable2 dc.b 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 dc.b 24,25,26,27,28,29,30,31,32,33,34,35 dc.b 36,36,36,36,36,36,36,36,36,36 NoteNames1 dc.b 'C-1 C#1 D-1 D#1 E-1 F-1 F#1 G-1 G#1 A-1 A#1 B-1 ' dc.b 'C-2 C#2 D-2 D#2 E-2 F-2 F#2 G-2 G#2 A-2 A#2 B-2 ' dc.b 'C-3 C#3 D-3 D#3 E-3 F-3 F#3 G-3 G#3 A-3 A#3 B-3 ' SpcNoteText dc.b '--- ' NoteNames2 dc.b 'C-1 DĦ1 D-1 EĦ1 E-1 F-1 GĦ1 G-1 AĦ1 A-1 BĦ1 B-1 ' dc.b 'C-2 DĦ2 D-2 EĦ2 E-2 F-2 GĦ2 G-2 AĦ2 A-2 BĦ2 B-2 ' dc.b 'C-3 DĦ3 D-3 EĦ3 E-3 F-3 GĦ3 G-3 AĦ3 A-3 BĦ3 B-3 ' dc.b '--- ' PeriodTable ; Tuning 0 dc.w 856,808,762,720,678,640,604,570,538,508,480,453 dc.w 428,404,381,360,339,320,302,285,269,254,240,226 dc.w 214,202,190,180,170,160,151,143,135,127,120,113,0 ; Tuning 1 dc.w 850,802,757,715,674,637,601,567,535,505,477,450 dc.w 425,401,379,357,337,318,300,284,268,253,239,225 dc.w 213,201,189,179,169,159,150,142,134,126,119,113,0 ; Tuning 2 dc.w 844,796,752,709,670,632,597,563,532,502,474,447 dc.w 422,398,376,355,335,316,298,282,266,251,237,224 dc.w 211,199,188,177,167,158,149,141,133,125,118,112,0 ; Tuning 3 dc.w 838,791,746,704,665,628,592,559,528,498,470,444 dc.w 419,395,373,352,332,314,296,280,264,249,235,222 dc.w 209,198,187,176,166,157,148,140,132,125,118,111,0 ; Tuning 4 dc.w 832,785,741,699,660,623,588,555,524,495,467,441 dc.w 416,392,370,350,330,312,294,278,262,247,233,220 dc.w 208,196,185,175,165,156,147,139,131,124,117,110,0 ; Tuning 5 dc.w 826,779,736,694,655,619,584,551,520,491,463,437 dc.w 413,390,368,347,328,309,292,276,260,245,232,219 dc.w 206,195,184,174,164,155,146,138,130,123,116,109,0 ; Tuning 6 dc.w 820,774,730,689,651,614,580,547,516,487,460,434 dc.w 410,387,365,345,325,307,290,274,258,244,230,217 dc.w 205,193,183,172,163,154,145,137,129,122,115,109,0 ; Tuning 7 dc.w 814,768,725,684,646,610,575,543,513,484,457,431 dc.w 407,384,363,342,323,305,288,272,256,242,228,216 dc.w 204,192,181,171,161,152,144,136,128,121,114,108,0 ; Tuning -8 dc.w 907,856,808,762,720,678,640,604,570,538,508,480 dc.w 453,428,404,381,360,339,320,302,285,269,254,240 dc.w 226,214,202,190,180,170,160,151,143,135,127,120,0 ; Tuning -7 dc.w 900,850,802,757,715,675,636,601,567,535,505,477 dc.w 450,425,401,379,357,337,318,300,284,268,253,238 dc.w 225,212,200,189,179,169,159,150,142,134,126,119,0 ; Tuning -6 dc.w 894,844,796,752,709,670,632,597,563,532,502,474 dc.w 447,422,398,376,355,335,316,298,282,266,251,237 dc.w 223,211,199,188,177,167,158,149,141,133,125,118,0 ; Tuning -5 dc.w 887,838,791,746,704,665,628,592,559,528,498,470 dc.w 444,419,395,373,352,332,314,296,280,264,249,235 dc.w 222,209,198,187,176,166,157,148,140,132,125,118,0 ; Tuning -4 dc.w 881,832,785,741,699,660,623,588,555,524,494,467 dc.w 441,416,392,370,350,330,312,294,278,262,247,233 dc.w 220,208,196,185,175,165,156,147,139,131,123,117,0 ; Tuning -3 dc.w 875,826,779,736,694,655,619,584,551,520,491,463 dc.w 437,413,390,368,347,328,309,292,276,260,245,232 dc.w 219,206,195,184,174,164,155,146,138,130,123,116,0 ; Tuning -2 dc.w 868,820,774,730,689,651,614,580,547,516,487,460 dc.w 434,410,387,365,345,325,307,290,274,258,244,230 dc.w 217,205,193,183,172,163,154,145,137,129,122,115,0 ; Tuning -1 dc.w 862,814,768,725,684,646,610,575,543,513,484,457 dc.w 431,407,384,363,342,323,305,288,272,256,242,228 dc.w 216,203,192,181,171,161,152,144,136,128,121,114,0 CursorPosTable dc.b 3,6,7,8,9,10,12 dc.b 15,16,17,18,19,21 dc.b 24,25,26,27,28,30 dc.b 33,34,35,36,37 UnshiftedKeymap dc.b '`1234567890-=\*0' dc.b 'qwertyuiop[]*123' dc.b 'asdfghjkl;',39,'#',0,'456' dc.b 'zxcvbnm<>?',0,'.','789 ' SongNumOfPatt dc.w 1 NoteNamesPtr dc.l 0 SpritePtrsPtr dc.l 0 LineCurPosPtr dc.l 0 NoSpritePtr dc.l 0 CursorPosPtr dc.l 0 Ch1SpritePtr dc.l 0 Ch2SpritePtr dc.l 0 Ch3SpritePtr dc.l 0 Ch4SpritePtr dc.l 0 PPattPos dc.l 0 SaveEditMode dc.l 0 EditMode dc.l 0 RunMode dc.l 0 CurrCmds dc.l 0 TextBplPtr dc.l 0 TextOffset dc.w 0 TextLength dc.w 0 TextLenTemp dc.l 0 ShowTextPtr dc.l 0 PatternNumber dc.l 0 CurrPos dc.l 0 CurrSpeed dc.l 0 KeyTransTabPtr dc.l 0 CmdOffset dc.w 0 RawKeyCode dc.b 0 PattRfsh dc.b 0 MountFlag dc.w 0 GetLineFlag dc.w 0 LoadInProgress dc.w 0 KbIntSave dc.l 0 KbIntSavePtr dc.l 0 CurrentPlayNote dc.w 214 LineCurX dc.w 0 LineCurY dc.w 0 TextEndPtr dc.l 0 ScrPattPos dc.w 0 PattCurPos dc.w 0 GadgRepeat dc.w 0 WordNumber dc.w 0 HighPattNum dc.w 0 InsNum dc.w 0 LastInsNum dc.w 1 PlayInsNum dc.w 1 HiLowInstr dc.w 0 PEDPos dc.w 0 PLSTpos dc.w 0 MaxPLSTOffset dc.l 0 PresetMarkTotal dc.w 0 PLSTOffset dcb.b 14*4,0 CurrentPreset dc.w 1 UpOrDown dc.w 0 Joy0Low dc.w 0 Joy0High dc.w 0 MouseX dc.w 0 MouseY dc.w 0 MouseX2 dc.w 0 MouseY2 dc.w 0 MouseX3 dc.w 0 MouseY3 dc.w 0 DecompMemPtr dc.l 0 DecompMemSize dc.l 0 SampleInfo dc.w 0 si_volume dc.w 0 si_long dc.l 0 si_pointer dc.l 0,0,0,0,0 SampleInfo2 dc.w 0 si_volume2 dc.w 0 si_long2 dc.l 0 si_pointer2 dc.l 0,0,0,0,0 LongFFFF dc.l 0 PosJumpAssert dc.b 0 PBreakPosition dc.b 0 PBreakFlag dc.b 0 LEDStatus dc.b 0 PattDelayTime dc.b 0 PattDelayTime2 dc.b 0 PattRfshNum dc.l 0 DidQuantize dc.w 0 MessagePtr dc.l 0 FileNamePtr dc.l 0 DiskDataPtr dc.l 0 FileHandle dc.l 0 DiskDataLength dc.l 0 LowMask dc.b $FF PatternPosition dc.l 0 SongPosition dc.l 0 Counter dc.l 0 PatternPtr dc.l 0 SongDataPtr dc.l 0 SampleStarts dcb.l 31,0 SamplePtrs EQU SampleStarts-4 SampleLengths dcb.l 32,0 DMACONtemp dc.w 0 StackSave dc.l 0 InputDevMouse dc.l 0,0,0 AnalyzerHeights dcb.w 23,0 AnalyzerOpplegg dcb.w 23,0 Action dc.w 0 PathPtr dc.l 0 FileLock dc.l 0 CurrScreen dc.w 0 SaveCurrScreen dc.w 0 PointerCol1Save dc.w 0 PointerCol2Save dc.w 0 PointerCol3Save dc.w 0 GetDecTemp dc.b 0 UpdateTempo dc.b 0 MoreInstrFlag dc.w 0 SampleSortList dcb.l 32,0 PLSTmem dc.l 0 PresetTotal dc.w 0 SaveScope dc.b 0 dc.b 0 ;free 0 DisableAnalyzer dc.b 0 SaveDA dc.b 0 AutoReqRunning dc.b 0 NoSampleInfo dc.b 0 FormatDataPtr dc.l 0 CylinderNumber dc.w 0 TrackdiskPort dc.l 0,0,0,0 ProcessPtr dc.l 0,0,0,0 DateStamp dc.l 0,0,0,0 EnterTextFlag dc.w 0 PresetLength dc.w 0 PresetFineTune dc.w 0 PresetRepeat dc.w 0 PresetReplen dc.w 0 PED_Action dc.w 0 PsetNumTemp dc.w 0 PsetPtrTemp dc.l 0 FreeDiskSpace dc.l 0 SplitAddress dc.l 0 LaHeTx dc.l $12345678 PLSTAllocSize dc.l 0 MaxPLSTEntries2 dc.w 0 ;---- Setup Data ---- DefaultSetupData dc.b 'PT1.2 Configuration File',$A,0 DefaultSongsPath dc.b 'ST-00:songs' dcb.b 21,0 dc.b 'ST-00:modules' dcb.b 19,0 dc.b 'DF0:' dcb.b 28,0 dc.b 'PRT:' dcb.b 28,0 DefCol dc.w $000,$BBB,$888,$555,$FD0,$D04,$000,$34F dc.b 1 ; Song Pack Mode dc.b 0 ; Module Pack Mode dc.b 0 ; Split 0=off, 1=on dc.b 0 ; Filter dc.b 0 ; TransDel dc.b 1 ; ShowDec dc.b 1 ; AutoDir dc.b 1 ; AutoExit dc.b 1 ; ModOnly dc.b 0 ; MIDI dc.b 1,$18,$18,0 ; SplitData dc.b 2,$1A,$18,0 dc.b 3,$1C,$18,0 dc.b 4,$1D,$18,0 dc.w 20,2 ; KeyRepDelay/Speed dc.b 0 ; Accidental dc.b 0 ; not in use dc.b 'newshell',0 ; ExtCmd 0 dcb.b 23,0 dc.b 'DevPak',0 ; ExtCmd 1 dcb.b 25,0 dc.b 'info',0 ; ExtCmd 2 dcb.b 27,0 dc.b 'list',0 ; ExtCmd 3 dcb.b 27,0 dc.b 'loadwb -debug',0 ; ExtCmd 4 dcb.b 18,0 dc.b 'diskmaster2.0',0 ; ExtCmd 5 dcb.b 18,0 dc.b 'run AudioMasterIII',0 ; ExtCmd 6 dcb.b 13,0 dc.b 'ced',0 ; ExtCmd 7 dcb.b 28,0 dc.w 0 ; Not in use DefaultMaxPLSTEntries dc.w 2500 ; Max PLST Entries dc.b 2,3,4,1 ; Multi Mode Next dc.w $102,$202,$037,$047,$304, $F06,$C10,$C20,$E93,$A0F dc.b 0 ; RAW/IFF Save, 0=RAW, 1=IFF dc.b 1 ; IntMode, 0=VBLANK, 1=CIA dc.b 0 ; Override dc.b 0 ; Nosamples dc.b 0 ; BlankZero dc.b 1 ; ShowDirs dc.b 0 ; CutToBuf dc.b 0 ; ShowPublic dc.b 1 ; IFFLoop dc.b 0 ; HHFlag dc.w 125 ; Tempo DefaultDMAWait dc.w 300 ; DMAWait DefaultTuneNote dc.w 24 ; TuneNote (C-3) dc.w $20 ; TToneVol DefaultSalvageAddress dc.l 0,0 DefaultPTPath dc.b "ST-00:" ; Protracker Path (32 bytes long) dcb.b 26 dc.w 6 ; DefaultSpeed dc.w $0F00,$0F00,$0F10,$0F10,$0F20,$0F20,$0F30,$0F30 ; VU-Meter dc.w $0F40,$0F50,$0F60,$0F70,$0F80,$0F90,$0FA0,$0FB0 ; colors dc.w $0FC0,$0FD0,$0FE0,$0FF0,$0FF0,$0EF0,$0EF0,$0DF0 dc.w $0DF0,$0CF0,$0CF0,$0BF0,$0BF0,$0AF0,$09F0,$09F0 dc.w $08F0,$08F0,$07F0,$07F0,$06F0,$06F0,$05F0,$05F0 dc.w $04F0,$04F0,$03F0,$03F0,$02F0,$01F0,$00F0,$00E0 dc.w $0F00,$0F10,$0F20,$0F30,$0F40,$0F50,$0F60,$0F70 ; Analyzer dc.w $0F80,$0F90,$0FA0,$0FB0,$0FC0,$0FD0,$0FE0,$0FF0 ; colors dc.w $0EF0,$0DF0,$0CF0,$0BF0,$0AF0,$09F0,$08F0,$07F0 dc.w $06F0,$05F0,$04F0,$03F0,$02F0,$01F0,$00F0,$00E0 dc.w $00D0,$00C0,$00B0,$00A0,$0090,$0080,$0070,$0060 dcb.b 302 ; Pad to 1024 bytes ;---- Sampler routines ---- _custom EQU $00DFF000 intreq EQU $0000009C intreqr EQU $0000001E intena EQU $0000009A joy0dat EQU $0000000A vhposr EQU $00000006 dmacon EQU $00000096 dmaconr EQU $00000002 SamInfoPtr dc.l 0 SamInfoLen dc.l 0 SampleNote dc.w 24 ; C-3 ResampleNote dc.w 24 ; C-3 SamIntSave dc.w 0 SamDMASave dc.w 0 ClearTempSampArea LEA TempSampArea,A0 MOVE #379,D0 MOVEQ #0,D1 ctsalop MOVE D1,(A0)+ DBF D0,ctsalop RTS Sampler CLR.B RawKeyCode JSR StopIt JSR TopExit JSR WaitForButtonUp JSR SetWaitPtrCol BSR ShowMon JSR Wait_4000 JSR ClearRightArea JSR ClearAnalyzerColors BSR ClearTempSampArea BSR WaitForDiskDrive MOVE $DFF01C,SamIntSave ; intenar MOVE #$7FFF,_custom+intena JSR TurnOffVoices MOVE SampleNote,D0 ASL #1,D0 LEA PeriodTable,A0 MOVE (A0,D0.W),D0 LSR #1,D0 LEA $DFF000,A0 LEA $AA(A0),A5 LEA $BA(A0),A6 MOVE D0,$A6(A0) MOVE D0,$B6(A0) MOVEQ.L #$20,D0 MOVE D0,$A8(A0) MOVE D0,$B8(A0) MOVEQ.L #0,D0 MOVE D0,(A5) MOVE D0,(A6) MOVE.B #6,$BFD200 MOVEQ.L #2,D0 MOVE.B D0,$BFD000 MOVE.B #0,$BFE301 LEA GraphOffsets(PC),A0 LEA TempSampArea,A1 MOVE.L TextBplPtr,A2 LEA $09E8-40(A2),A2 LEA $00BFE101,A3 LEA _custom+intreqr,A4 MOVE #$0180,D7 MOVEQ.L #6,D6 MOVEQ.L #10,D3 monilop2 MOVEQ.L #22,D5 monilop4 MOVEQ.L #7,D4 monilop3 BTST D7,(A4) BEQ.S monilop3 MOVE D7,$7E(A4) MOVEQ.L #0,D0 MOVE.B (A3),D0 MOVE D0,D1 SUB.B D7,D0 MOVE.B D0,(A5) MOVE.B D0,(A6) LSR #3,D1 ADD D1,D1 MOVE 0(A0,D1.W),D0 MOVE (A1),D1 MOVE D0,(A1)+ BCLR D4,0(A2,D1.W) BSET D4,0(A2,D0.W) DBF D4,monilop3 ADDQ.L #1,A2 DBF D5,monilop4 SUB.L #23,A2 SUB.L #368,A1 BTST D6,-$0100(A3) BEQ sampexit BTST D3,-8(A4) BNE.S monilop2 ;-- start sampling -- MOVE InsNum(PC),D1 BEQ sampexit LSL #2,D1 LEA SamplePtrs,A0 MOVE.L (A0,D1.W),D0 BEQ.S samaok CLR.L (A0,D1.W) MOVE.L D0,A1 MOVE.L 124(A0,D1.W),D0 BEQ.S samaok CLR.L 124(A0,D1.W) MOVE.L 4.W,A6 JSR LVOFreeMem(A6) samaok MOVE.L #$FFFE,D6 ; try 64k samalclop MOVE.L D6,D0 MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1 MOVE.L 4.W,A6 JSR LVOAllocMem(A6) TST.L D0 BNE.S samalcok SUB.L #2048,D6 ; try 2k less BPL.S samalclop BSR OutOfMemErr BRA sampexit samalcok MOVE InsNum(PC),D1 LSL #2,D1 LEA SamplePtrs(PC),A0 MOVE.L D0,(A0,D1.W) MOVE.L D6,124(A0,D1.W) MOVE $DFF002,SamDMASave MOVE #$03FF,_custom+dmacon BSR GetSampleInfo MOVE.L SamInfoLen,D4 CLR $DFF100 CLR $DFF180 MOVE.L SamInfoPtr,A1 LEA _custom+intreq,A2 LEA $00BFE101,A3 ; parallel port LEA _custom+intreqr,A4 LEA $DFF0BA,A6 MOVE #$0180,D7 MOVEQ.L #6,D6 MOVEQ.L #0,D5 samploop BTST D7,(A4) BEQ.S samploop MOVE D7,(A2) MOVE.B (A3),D0 SUB.B D7,D0 MOVE.B D0,(A5) MOVE.B D0,(A6) MOVE.B D0,(A1)+ ADDQ #1,D5 CMP D4,D5 BEQ.S sampend BTST D6,-$0100(A3) BNE.S samploop sampend MOVE SamDMASave,D0 OR #$8000,D0 MOVE D0,$00DFF096 MOVE.L A1,D0 SUB.L SamInfoPtr(PC),D0 MOVE.L D0,SamInfoLen MOVE.L SongDataPtr(PC),A0 MOVE InsNum(PC),D1 MULU #30,D1 LEA 12(A0,D1.W),A0 MOVE.L SamInfoLen(PC),D0 LSR.L #1,D0 MOVE D0,(A0)+ MOVE #$0040,(A0)+ CLR (A0)+ MOVE #1,(A0) MOVE.L SamInfoLen(PC),D1 NEG.L D1 AND.L #$FFFFFFF8,D1 NEG.L D1 MOVE InsNum(PC),D0 ASL #2,D0 LEA SamplePtrs,A0 CMP.L 124(A0,D0.W),D1 BGE.S sampexit MOVE.L 124(A0,D0.W),D2 MOVE.L D1,124(A0,D0.W) SUB.L D1,D2 MOVE.L 0(A0,D0.W),A1 MOVE.L 124(A0,D0.W),D0 ADD.L D0,A1 MOVE.L D2,D0 MOVE.L 4.W,A6 JSR LVOFreeMem(A6) sampexit MOVE SamIntSave,D0 BSET #15,D0 MOVE D0,$DFF09A JSR TurnOffVoices JSR DisplayMainScreen BSR ClearSamStarts BSR ShowSampleInfo BSR RedrawSample JSR WaitForButtonUp CLR KeyBufPos CLR.B RawKeyCode CLR ShiftKeyStatus JMP Wait_4000 SampleNullInfo CLR.L SamInfoPtr CLR.L SamInfoLen MOVEQ #-1,D0 RTS GetSampleInfo MOVE InsNum(PC),D0 BEQ.S SampleNullInfo LSL #2,D0 LEA SamplePtrs(PC),A0 MOVE.L (A0,D0.W),SamInfoPtr MOVE.L 124(A0,D0.W),SamInfoLen MOVEQ #0,D0 RTS ShowMon SF ScopeEnable ST DisableAnalyzer JSR ClearRightArea LEA MonitorData,A0 MOVE.L #MonitorSize,D0 MOVEQ #-1,D4 JMP cgjojo WaitForDiskDrive JSR StorePtrCol MOVE.L 4.W,A6 LEA $15E(A6),A0 ; DeviceList LEA TrackdiskName,A1 ; trackdisk.device JSR LVOFindName(A6) MOVE.L D0,A6 LEA $24(A6),A6 ; dn_GlobalVec trdloop2 MOVE.L A6,A1 MOVEQ.L #3,D6 tdrloop TST.L (A1)+ BEQ.S tdrskip MOVE.L -4(A1),A2 BTST #7,$0041(A2) BEQ.S tdrnotset tdrskip DBF D6,tdrloop JMP RestorePtrCol tdrnotset JSR SetDiskPtrCol BRA.S trdloop2 ClearSamStarts LEA SamplePtrs+4,A0 MOVEQ #30,D0 cssLoop MOVE.L (A0)+,D1 BEQ cssSkip MOVE.L D1,A1 CLR (A1) cssSkip DBF D0,cssLoop RTS GraphOffsets dc.w 31*40,30*40,29*40,28*40,27*40,26*40,25*40,24*40 dc.w 23*40,22*40,21*40,20*40,19*40,18*40,17*40,16*40 dc.w 15*40,14*40,13*40,12*40,11*40,10*40,09*40,08*40 dc.w 07*40,06*40,05*40,04*40,03*40,02*40,01*40,00*40 SamNoteType dc.w 0 ShowSamNote TST SamScrEnable BEQ Return2 MOVE.L NoteNamesPtr,A4 MOVE #237*40+36,TextOffset MOVE SampleNote,D0 LSL #2,D0 LEA (A4,D0.W),A0 MOVE.L A0,ShowTextPtr MOVE #4,TextLength BRA ShowText ShowResamNote TST SamScrEnable BEQ Return2 MOVE.L NoteNamesPtr,A4 MOVE #248*40+36,TextOffset MOVE ResampleNote,D0 LSL #2,D0 LEA (A4,D0.W),A0 MOVE.L A0,ShowTextPtr MOVE #4,TextLength BRA ShowText ;---- Graphics Data ---- FontData INCBIN "raw/ptfont.raw" ;general font 8x8 FontSize =*-FontData cnop 0,2 SpectrumAnaData INCBIN "iff/ptspectrumana.iff" SpectrumAnaSize =*-SpectrumAnaData cnop 0,2 ScopeData INCBIN "iff/ptscope.iff" ScopeSize =*-ScopeData cnop 0,2 SureBoxData INCBIN "raw/ptsurebox.raw" SureBoxSize =*-SureBoxData cnop 0,2 ClearBoxData INCBIN "raw/ptclearbox.raw" ClearBoxSize =*-ClearBoxData cnop 0,2 FormatBoxData INCBIN "raw/ptformatbox.raw" FormatBoxSize =*-FormatBoxData cnop 0,2 DirScreenData INCBIN "iff/ptfilereq.iff" DirScreenSize =*-DirScreenData cnop 0,2 PLSTData INCBIN "iff/ptplst.iff" PLSTSize =*-PLSTData cnop 0,2 Edit1Data INCBIN "iff/ptedit1.iff" Edit1Size =*-Edit1Data cnop 0,2 Edit2Data INCBIN "iff/ptedit2.iff" Edit2Size =*-Edit2Data cnop 0,2 Edit3Data INCBIN "iff/ptedit3.iff" Edit3Size =*-Edit3Data cnop 0,2 SetupScreenData INCBIN "iff/ptsetup.iff" SetupScreenSize =*-SetupScreenData cnop 0,2 Setup2Data INCBIN "iff/ptsetup2.iff" Setup2Size =*-Setup2Data cnop 0,2 PresetEdData INCBIN "iff/ptpreseted.iff" PresetEdSize =*-PresetEdData cnop 0,2 SampScreenData INCBIN "iff/ptsampler.iff" SampScreenSize =*-SampScreenData cnop 0,2 MonitorData INCBIN "iff/ptmonitor.iff" MonitorSize =*-MonitorData cnop 0,2 HelpScreenData INCBIN "iff/pthelpscreen.iff" HelpScreenSize =*-HelpScreenData cnop 0,2 VolBoxData INCBIN "raw/ptvolbox.raw" ToggleONdata INCBIN "raw/PTToggleON.raw" ToggleOFFdata INCBIN "raw/PTToggleOFF.raw" S_BoxData INCBIN "raw/PTLetters.raw" ;************************** CHIP DATA HUNK ************************** SECTION ptdata,DATA_C BitPlaneData INCBIN "raw/PTMainScreen.raw" TToneData ; Tuning Tone (Sine Wave) dc.b 0, 25, 49, 71, 91, 106, 118, 126 dc.b 127, 126, 118, 106, 91, 71, 49, 25 dc.b 0, -25, -49, -71, -91,-106,-118,-126 dc.b -127,-126,-118,-106, -91, -71, -49, -25 ;----------------------------------------------------------------- ; copper list (very hard to implement into the OS as a screen!! ; CopList dc.l $01200000 ;Sprite 0 high dc.l $01220000 ;Sprite 0 low dc.l $01240000 ;Sprite 1 high dc.l $01260000 ;Sprite 1 low dc.l $01280000 ;Sprite 2 high dc.l $012A0000 ;Sprite 2 low dc.l $012C0000 ;Sprite 3 high dc.l $012E0000 ;Sprite 3 low dc.l $01300000 ;Sprite 4 high dc.l $01320000 ;Sprite 4 low dc.l $01340000 ;Sprite 5 high dc.l $01360000 ;Sprite 5 low dc.l $01380000 ;Sprite 6 high dc.l $013A0000 ;Sprite 6 low dc.l $013C0000 ;Sprite 7 high dc.l $013E0000 ;Sprite 7 low CopListBitplanes dc.l $00E00000 ;Bitplane 0 high dc.l $00E20000 ;Bitplane 0 low dc.l $00E40000 ;Bitplane 1 high dc.l $00E60000 ;Bitplane 1 low dc.l $00E80000 ;Bitplane 2 high NoteBplptrHigh=*-2 dc.l $00EA0000 ;Bitplane 2 low NoteBplptrLow=*-2 CopListColors dc.l $01A20AAA ; Color 17 dc.l $01A40888 ; Color 18 dc.l $01A60666 ; Color 19 dc.l $01A00000 ; Color 16 dc.l $01800000 ; Color 0 CopCol0=*-2 dc.l $01820AAA ; Color 1 dc.l $01840777 ; Color 2 dc.l $01860444 ; Color 3 dc.l $01880CCC ; Color 4 dc.l $018A0A00 ; Color 5 dc.l $018C0000 ; Color 6 dc.l $018E004D ; Color 7 dc.l $01AE0A00 ; Color 23 dc.l $01AA0700 ; Color 21 dc.l $01AC0400 ; Color 22 dc.l $008E2C81 ; Display Window Start 2C/81 dc.l $00902CC1 ; Display Window Stop 2C/C1 dc.l $00920038 ; Display Data Fetch Start dc.l $009400D0 ; Display Data Fetch Stop dc.l $01080000 dc.l $010A0000 dc.l $01020000 ; bplcon1 dc.l $01040024 ; bplcon2 dc.l $2C07FFFE ; Wait for line $2C, pos $07 dc.l $01003200 ; bplcon0 CopListAnalyzer dcb.w 320,0 CopListInsPos dc.l $B807FFFE ; Wait for line $88, pos $07 dc.l $01002200 ; bplcon0 CopListBpl4 dc.l $00E80000 ; Bitplane 4 high dc.l $00EA0000 ; Bitplane 4 low dc.w $0188 ; Color 4 NoteCol dc.w $004D dc.l $B907FFFE ; Wait for line $89, pos $07 dc.l $01003200 ; bplcon0 CopListMark2 dcb.w 672,0 dc.l $E907FFFE ; Wait for line $E9, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $EA07FFFE ; Wait for line $EA, pos $07 dc.l $01040010 ; bplcon2 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $EB07FFFE ; Wait for line $E8, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $EC07FFFE ; Wait for line $EC, pos $07 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $ED07FFFE ; Wait for line $ED, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $EE07FFFE ; Wait for line $EE, pos $07 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $EF07FFFE ; Wait for line $EF, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $F007FFFE ; Wait for line $F0, pos $07 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $F107FFFE ; Wait for line $F1, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $F207FFFE ; Wait for line $F2, pos $07 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $F307FFFE ; Wait for line $F3, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $F407FFFE ; Wait for line $F4, pos $07 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $F507FFFE ; Wait for line $F5, pos $07 dc.l $010AFFD8 ; bpl2mod dc.l $0108FFD8 ; bpl1mod dc.l $F607FFFE ; Wait for line $F6, pos $07 dc.l $010A0000 ; bpl2mod dc.l $01080000 ; bpl1mod dc.l $01B20000 ; Color 1 dc.l $01B40000 ; Color 2 dc.l $01B60000 ; Color 3 dc.l $01BA0000 ; Color 5 dc.l $01BC0000 ; Color 6 dc.l $01BE0000 ; Color 7 dc.l $FFDFFFFE ; Wait for line $FF, pos $DF dc.l $2907FFFE ; Wait for line $29, pos $07 dc.l $01002200 ; bplcon0 dc.l $2C07FFFE ; Wait for line $2C, pos $07 dc.l $01000200 ; bplcon0 dc.l $FFFFFFFE ; Wait for line $FF, pos $FF ; End of copperlist CopList2 dc.l $B607FFFE ; Wait for line $B6, pos $07 dc.l $01002200 ; bplcon0 CopList2Bpl4Ptr dc.l $00E80000 ; Bitplane 4 high dc.l $00EA0000 ; Bitplane 4 low dc.l $0188004D ; Color 4 dc.l $01B200F0 ; LoopSprite color dc.l $01BA00FF ; PlayPos Sprite color dc.l $B707FFFE ; Wait for line $B7, pos $07 dc.l $01003200 ; bplcon0 dc.l $FFDFFFFE ; Wait for line $FF, pos $DF dc.l $2907FFFE ; Wait for line $29, pos $07 dc.l $01002200 ; bplcon0 dc.l $2C07FFFE ; Wait for line $2C, pos $07 dc.l $01000200 ; bplcon0 dc.l $FFFFFFFE ; Wait for line $FF, pos $FF ; End of copperlist PointerSpriteData dc.w 0,0 INCBIN "raw/PTPointer.raw" NoSpriteData dc.w 0,0,0,0 CursorSpriteData dc.w 0,0 dc.w $FFE0,$FFE0,$FFE0,$FFE0,$8020,$0000,$8020,$0000 dc.w $8020,$0000,$8020,$0000,$8020,$0000,$8020,$0000 dc.w $8020,$0000,$8020,$0000,$8020,$0000,$8020,$0000 dc.w $0000,$FFE0,$0000,$FFE0 dc.w 0,0 LineCurSpriteData dc.w 0,0,$0000,$FE00,$0000,$FE00,$0000,$0000,0,0 VUSpriteData1 dc.w $E95B,$EA01 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w 0,0 VUSpriteData2 dc.w $E97F,$EA01 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w 0,0 VUSpriteData3 dc.w $E9A3,$EA01 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w 0,0 VUSpriteData4 dc.w $E9C7,$EA01 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0 dc.w 0,0 LoopSpriteData1 dc.w 0,0 dc.w $F000,0,$F000,0,$F000,0,$F000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$7000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0 dc.w 0,0 LoopSpriteData2 dc.w 0,0 dc.w $F000,0,$F000,0,$F000,0,$F000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$E000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w 0,0 PlayPosSpriteData dc.w 0,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0 dc.w 0,0 ;******** BSS HUNK ******** SECTION ptbss,BSS FileInfoBlock ds.b 256 ;,0 FIB_EntryType EQU FileInfoBlock+4 FIB_FileName EQU FileInfoBlock+8 FIB_FileSize EQU FileInfoBlock+124 FIB_DateStamp EQU FileInfoBlock+132 InfoData ds.b 36 TopMenusBuffer ds.b 2200 TextDataBuffer ds.b 546 TrackBuffer ds.b 256 CmdsBuffer ds.b 256 BlockBuffer ds.b 256 PatternBuffer ds.b 1024 UndoBuffer ds.b 1024 TrackdiskIOExtTD ds.w 1 ds.l 3 TDPortPtr ds.l 1 ds.w 1 Fmt_tja ds.w 1 ds.l 2 ds.b 3 Fmt_hmmm ds.b 1 ds.w 1 FmtDataSize ds.w 2 FmtDataPtr ds.w 2 FmtDiskOffset ds.l 9 SplitTransTable ds.b 38 SplitInstrTable ds.b 38 ModulesPath2 ds.b 64 SongsPath2 ds.b 64 SamplePath2 ds.b 64 ds.l 1 SetupData ds.b 26 SongsPath ds.b 32 ModulesPath ds.b 32 SamplePath ds.b 32 PrintPath ds.b 32 ColorTable ds.w 8 PackMode ds.b 1 ModPackMode ds.b 1 SplitFlag ds.b 1 FilterFlag ds.b 1 TransDelFlag ds.b 1 ShowDecFlag ds.b 1 AutoDirFlag ds.b 1 AutoExitFlag ds.b 1 ModOnlyFlag ds.b 1 MIDIFlag ds.b 1 SplitData ds.b 4 ds.b 4 ds.b 4 ds.b 4 KeyRepDelay ds.w 1 KeyRepSpeed ds.w 1 Accidental ds.b 1 ds.b 1 ExtCommands ds.b 32*8 ; 256 bytes MaxDirEntries ds.w 1 MaxPLSTEntries ds.w 1 MultiModeNext ds.b 4 EffectMacros ds.w 10 RAWIFFMode ds.b 1 IntMode ds.b 1 OverrideFlag ds.b 1 NosamplesFlag ds.b 1 BlankZeroFlag ds.b 1 ShowDirsFlag ds.b 1 ShowPublicFlag ds.b 1 CutToBufFlag ds.b 1 IFFLoopFlag ds.b 1 HHFlag ds.b 1 Tempo ds.w 1 DMAWait ds.w 1 TuneNote ds.w 1 TToneVol ds.w 1 SalvageAddress ds.b 8 PTPath ds.b 32 ; 512 bytes DefaultSpeed ds.w 1 VUMeterColors ds.w 48 AnalyzerColors ds.w 40 ds.b 302 ; Pad to 1024 bytes HelpTextIndex ds.l 256 HelpTextData ds.b 656 InpEvPort ds.b 34 InpEvIOReq ds.b 48 ScopeInfo ds.b 20*4 ScopeSamInfo ds.b 16*31 BlankSample ds.b 320 FileName ds.b 96 NewFileName ds.b 96 SampleFileName ds.b 28 PresetNameText ds.b 22 DirInputName ds.b 30 NewInputName ds.b 30 TempSampArea ds.w 380 SaveColors ds.w 40+48 END