2023-05-22 16:17:35 +02:00
|
|
|
include "exec/libraries.i"
|
|
|
|
include "exec/memory.i"
|
|
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
; startup code
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
|
|
|
|
IF FW_LMB_EXIT_SUPPORT
|
|
|
|
fail "FW_LMB_EXIT_SUPPORT cannot be provided"
|
|
|
|
ENDC
|
|
|
|
|
|
|
|
trackmo_AppInit:
|
|
|
|
lea fw_Base(pc),a4
|
|
|
|
lea fw_BasePtr(pc),a0
|
|
|
|
move.l a4,(a0)
|
|
|
|
PUTMSG 10,<"*** FW Base %p, FW BasePtr %p">,a4,a0
|
|
|
|
|
|
|
|
move.l 4.w,a6
|
|
|
|
IF FW_TD_FREE_MEM_HACK
|
|
|
|
; try to free trackdisk buffers. These are attached to the task structure of the trackdisk.device tasks.
|
|
|
|
; The trackdisk.device does not support expunge, so this is the best hack I can think of.
|
|
|
|
; (This will only return a small non-continuous block of chip mem, about 17 KB for each drive).
|
|
|
|
CALL Forbid
|
|
|
|
.tdloop
|
|
|
|
lea .trackdiskname(pc),a1
|
|
|
|
CALL FindTask
|
|
|
|
tst.l d0
|
|
|
|
beq.s .notd
|
|
|
|
move.l d0,a1
|
|
|
|
PUTMSG 10,<"Removing trackdisk.device task %p">,a1
|
|
|
|
CALL RemTask
|
|
|
|
bra.s .tdloop
|
|
|
|
.notd CALL Permit
|
|
|
|
ENDC
|
|
|
|
|
|
|
|
cmp.l MaxLocMem(a6),a6
|
|
|
|
blt.s .nofast ; exec is NOT is fast memory -> not safe to claim whole chipmem
|
|
|
|
; claim available fast mem
|
|
|
|
move.l #(MEMF_LARGEST|MEMF_FAST),d1
|
|
|
|
CALL AvailMem
|
|
|
|
move.l d0,d2
|
|
|
|
beq.s .nofast
|
2024-10-09 00:38:45 +02:00
|
|
|
move.l #MEMF_FAST|MEMF_CLEAR,d1
|
2023-05-22 16:17:35 +02:00
|
|
|
CALL AllocMem
|
|
|
|
move.l d0,fw_FastMemStack(a4)
|
|
|
|
bne.s .goodmem
|
|
|
|
.memerr
|
|
|
|
move.w #$800,$dff180
|
|
|
|
bra.s .memerr
|
|
|
|
.nofast
|
|
|
|
move.l #(MEMF_LARGEST|MEMF_CHIP),d1
|
|
|
|
CALL AvailMem
|
|
|
|
move.l d0,d2
|
|
|
|
move.l #(MEMF_CHIP|MEMF_CLEAR),d1
|
|
|
|
CALL AllocMem
|
|
|
|
move.l d0,fw_ChipMemStack(a4)
|
|
|
|
add.l d2,d0
|
|
|
|
move.l d0,fw_ChipMemStackEnd(a4)
|
|
|
|
|
|
|
|
move.l #(MEMF_LARGEST|MEMF_ANY),d1
|
|
|
|
CALL AvailMem
|
|
|
|
move.l d0,d2
|
|
|
|
move.l #MEMF_CLEAR,d1
|
|
|
|
CALL AllocMem
|
|
|
|
move.l d0,fw_FastMemStack(a4)
|
|
|
|
add.l d2,d0
|
|
|
|
move.l d0,fw_FastMemStackEnd(a4)
|
|
|
|
bra.s .altmem
|
|
|
|
.goodmem
|
|
|
|
add.l d2,d0
|
|
|
|
move.l d0,fw_FastMemStackEnd(a4)
|
|
|
|
|
|
|
|
; since our stuff is probably all in fast mem right now, we can take over the complete chipmem
|
|
|
|
lea $400.w,a0
|
|
|
|
move.l a0,fw_ChipMemStack(a4)
|
|
|
|
move.l MaxLocMem(a6),fw_ChipMemStackEnd(a4)
|
|
|
|
.altmem
|
|
|
|
|
|
|
|
bsr trackmo_GetVbr
|
|
|
|
move.l a0,fw_VBR(a4)
|
|
|
|
;move.l $6c(a0),fw_OldSystemVBlankIRQ(a4)
|
|
|
|
|
|
|
|
lea $dff000,a5
|
|
|
|
|
|
|
|
move.w vposr(a5),d0
|
|
|
|
btst #9,d0
|
|
|
|
beq.s .noaga
|
|
|
|
move.w #-1,fw_AgaChipset(a4)
|
|
|
|
.noaga
|
|
|
|
|
|
|
|
move.w #$7fff,d0
|
|
|
|
move.w d0,intena(a5)
|
|
|
|
move.w d0,intena(a5)
|
|
|
|
move.w d0,intreq(a5)
|
|
|
|
move.w d0,intreq(a5)
|
|
|
|
move.w #DMAF_MASTER|DMAF_ALL,dmacon(a5)
|
|
|
|
move.w d0,adkcon(a5)
|
|
|
|
move.w #%0000111100000000,potgo(a5)
|
|
|
|
|
|
|
|
move.l a4,fw_PartFwBase(a4)
|
|
|
|
move.l a4,fw_PrimaryFwBase(a4)
|
|
|
|
move.l a4,a6 ; from now on, a6 is supposed to be our framework pointer, a5 is _custom
|
|
|
|
|
|
|
|
bsr fw_InitMemoryManagement
|
|
|
|
|
|
|
|
IF FW_MULTITASKING_SUPPORT
|
|
|
|
bsr fw_InitTasks
|
|
|
|
move.l #ft_SIZEOF,d0
|
|
|
|
bsr fw_AllocFast
|
|
|
|
move.l a0,fw_TrackloaderTask(a6)
|
|
|
|
ENDC
|
|
|
|
|
|
|
|
moveq.l #mfw_copperlistend-mfw_copperlist,d0
|
|
|
|
bsr fw_AllocChip
|
|
|
|
move.l a0,d0
|
|
|
|
move.l d0,fw_BaseCopperlist(a6)
|
|
|
|
move.l d0,a1
|
|
|
|
|
|
|
|
lea mfw_copperlist(pc),a0
|
|
|
|
moveq.l #(mfw_copperlistend-mfw_copperlist)/4-1,d7
|
|
|
|
.cpyloop
|
|
|
|
move.l (a0)+,(a1)+
|
|
|
|
dbra d7,.cpyloop
|
|
|
|
|
|
|
|
subq.l #4,a1
|
|
|
|
move.l a1,fw_EmptySprite(a6)
|
|
|
|
|
|
|
|
lea fw_vblank_standard_irq(pc),a0
|
|
|
|
move.l a0,fw_DefaultIRQ(a6)
|
|
|
|
|
|
|
|
bsr fw_SetBaseCopper
|
|
|
|
|
|
|
|
IF FW_SINETABLE_SUPPORT
|
|
|
|
bsr fw_InitSineTable
|
|
|
|
ENDC
|
|
|
|
|
|
|
|
bsr fw_InitTrackLoader
|
|
|
|
bsr fw_InitDos
|
|
|
|
|
|
|
|
IF FW_MUSIC_SUPPORT
|
2024-09-15 17:43:33 +02:00
|
|
|
IF (FW_MUSIC_PLAYER_CHOICE>=4)&&(FW_MUSIC_PLAYER_CHOICE<=6)
|
2023-05-22 16:17:35 +02:00
|
|
|
bsr fw_MusicAlloc
|
|
|
|
ENDC
|
|
|
|
ENDC
|
|
|
|
|
|
|
|
bsr fw_PushMemoryState
|
|
|
|
|
|
|
|
movem.l fw_EmptyRegs(a6),d0-d7/a0-a4
|
|
|
|
rts
|
|
|
|
|
|
|
|
IF FW_TD_FREE_MEM_HACK
|
|
|
|
.trackdiskname
|
|
|
|
dc.b 'trackdisk.device',0
|
|
|
|
even
|
|
|
|
|
|
|
|
trackmo_GetVbr:
|
|
|
|
suba.l a0,a0
|
|
|
|
move.w AttnFlags(a6),d0
|
|
|
|
btst #AFB_68010,d0
|
|
|
|
beq.s .novbr
|
|
|
|
lea .getvbr(pc),a5
|
|
|
|
CALL Supervisor
|
|
|
|
.novbr rts
|
|
|
|
|
|
|
|
machine mc68010
|
|
|
|
.getvbr
|
|
|
|
movec.l vbr,a0
|
|
|
|
rte
|
|
|
|
machine mc68000
|
|
|
|
ENDC
|
|
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
|
|
|
|
trackmo_AppShutdown:
|
|
|
|
bsr fw_SetBaseCopper
|
|
|
|
bsr fw_TrackloaderDiskMotorOff
|
|
|
|
rts
|