Hamazing/source/framework/os_startupcode.asm
chrisly42 9c48c11cd1 Big "squashed" update to latest version of Framework.
- Bugfix: WaitForFrame was completely broken. Now also caters for race-condition that would have waited one extra frame.
- Bugfix: InitPart would overwrite innocent memory (reported by Gigabates and Losso)
- Bugfix: Palette LERP had wrong bias.
- Removed extra paths in include statement, use default include paths instead
- Added Raspberry Casket no-jitter background calc mode (FW_MUSIC_PLAYER_CHOICE = 6)
- Updated Raspberry Casket to V2.0 presto branch (WIP)
- Removed fw_FrameCounterLong, use fw_FrameCounter-2 for debug purposes
- Support for blue noise palette LERPing (like in Is Real). Provide your own blue noise table (4 KB), stuff it into fw_BlueNoiseTablePtr, set FW_PALETTE_LERP_SUPPORT to 2
- Music tick routine is now replaceable during runtime (fw_MusicTickRoutine)
- Support for softints and audio interrupts
- LMB exit can also be disabled dynamically when using FW_LMB_EXIT_SUPPORT = 2 and fw_DisableLMBExit != 0
- Added LSP Micro support and LSP Nano (custom format that uses note pitches instead of periods)
- Minor other things
2024-09-15 17:43:33 +02:00

490 lines
13 KiB
NASM

include "exec/memory.i"
include "dos/dosextens.i"
include "workbench/startup.i"
include "graphics/gfxbase.i"
IF FW_DO_FANCY_WORKBENCH_STUFF
include "graphics/view.i"
ENDC
include "uae/uaestuff.i"
IFND CHIPMEM_SIZE
CHIPMEM_SIZE = 4
ENDC
IFND FASTMEM_SIZE
FASTMEM_SIZE = 4
ENDC
bsr os_AppInit
IF FW_LMB_EXIT_SUPPORT
lea -4(sp),a0
move.l a0,fw_DemoAbortStackPointer(a6)
ENDC
PUTMSG 10,<"%d: Entrypoint: %p">,fw_FrameCounter-2(a6),#entrypoint
bsr entrypoint
PUTMSG 10,<"%d: Part terminated">,fw_FrameCounter-2(a6)
bra os_AppShutdown
;--------------------------------------------------------------------
; startup code
;--------------------------------------------------------------------
os_AppInit:
PUTMSG 10,<"AppInit %ld, %ld">,#CHIPMEM_SIZE,#FASTMEM_SIZE
IFGT DEBUG_DETAIL
UAEExitWarp
ENDC
move.l 4.w,a6
IF DEBUG_DETAIL
move.l #MEMF_CHIP,d1
CALL AvailMem
PUTMSG 10,<"Chip memory free: %ld bytes">,d0
move.l #MEMF_CHIP|MEMF_LARGEST,d1
CALL AvailMem
PUTMSG 10,<"Chip memory largest: %ld bytes">,d0
move.l #MEMF_FAST,d1
CALL AvailMem
PUTMSG 10,<"Fast memory free: %ld bytes">,d0
move.l #MEMF_FAST|MEMF_LARGEST,d1
CALL AvailMem
PUTMSG 10,<"Fast memory largest: %ld bytes">,d0
ENDC
IFEQ FW_HD_TRACKMO_MODE
IFD pd_SIZEOF
move.l #pd_SIZEOF,d0
PUTMSG 10,<"Allocating framework memory (%ld) WITH PART data: %ld bytes">,#fw_SIZEOF,d0
ELSE
move.l #fw_SIZEOF,d0
PUTMSG 10,<"Allocating framework memory: %ld bytes (NO part data!)">,d0
ENDC
move.l d0,d2
move.l #MEMF_PUBLIC|MEMF_CLEAR,d1
CALL AllocMem
move.l d0,fw_BasePtr
bne.s .cont
moveq.l #ERROR_NO_FREE_STORE,d0
addq.w #4,sp
rts
.cont move.l d0,a4
move.l d0,fw_OrigBaseMemAllocAddr(a4)
move.l d2,fw_OrigBaseMemAllocLength(a4)
ELSE
move.l #fw_SIZEOF+6,d0 ; for InitData LVO
move.l d0,d2
move.l #MEMF_PUBLIC|MEMF_CLEAR,d1
CALL AllocMem
tst.l d0
beq.s .error
move.l d0,a0
move.w #%0100111011111001,(a0)+
move.l #fw_InitPart,(a0)+
move.l a0,fw_BasePtr
bra.s .cont
.error
moveq.l #ERROR_NO_FREE_STORE,d0
addq.w #4,sp
rts
.cont move.l a0,a4
move.l d0,fw_OrigBaseMemAllocAddr(a4)
move.l d2,fw_OrigBaseMemAllocLength(a4)
ENDC
move.l a4,fw_PartFwBase(a4)
move.l a4,fw_PrimaryFwBase(a4)
suba.l a1,a1
CALL FindTask
move.l d0,a2
tst.l pr_CLI(a2)
bne.s .cli
lea pr_MsgPort(a2),a0
CALL WaitPort
lea pr_MsgPort(a2),a0
CALL GetMsg
move.l d0,fw_WBMessage(a4)
.cli
moveq.l #ERROR_NO_FREE_STORE,d7
move.l #CHIPMEM_SIZE+(mfw_copperlistend-mfw_copperlist),d0
addq.l #7,d0
and.w #-8,d0
move.l d0,d2
move.l d0,fw_OrigChipMemAllocLength(a4)
move.l #MEMF_CHIP|MEMF_PUBLIC|MEMF_CLEAR,d1
CALL AllocMem
move.l d0,fw_OrigChipMemAllocAddr(a4)
beq os_AppAbort
move.l d0,fw_ChipMemStack(a4)
add.l d2,d0
move.l d0,fw_ChipMemStackEnd(a4)
IF FW_SINETABLE_SUPPORT
move.l #FASTMEM_SIZE+(1024+256)*2,d0
ELSE
move.l #FASTMEM_SIZE,d0
ENDC
move.l d0,d2
move.l d0,fw_OrigFastMemAllocLength(a4)
move.l #MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR,d1
CALL AllocMem
move.l d0,fw_OrigFastMemAllocAddr(a4)
beq os_AppAbort
move.l d0,fw_FastMemStack(a4)
add.l d2,d0
move.l d0,fw_FastMemStackEnd(a4)
IF DEBUG_DETAIL
move.l #MEMF_CHIP,d1
CALL AvailMem
PUTMSG 10,<"Chip memory free: %ld bytes">,d0
move.l #MEMF_CHIP|MEMF_LARGEST,d1
CALL AvailMem
PUTMSG 10,<"Chip memory largest: %ld bytes">,d0
move.l #MEMF_FAST,d1
CALL AvailMem
PUTMSG 10,<"Fast memory free: %ld bytes">,d0
ENDC
IF 0
PUTMSG 10,<"OpenResource">
move.w #ERROR_LOCK_COLLISION,d7
lea .ciabname(pc),a1
CALL OpenResource
move.l d0,fw_CiaBResource(a4)
beq os_AppAbort
move.l a6,a5
move.l d0,a6
PUTMSG 10,<"AddICRVector">
lea fw_SysFriendlyInterrupt(a4),a1
lea .nopirq(pc),a0
move.l a0,IS_CODE(a1)
moveq.l #CIAICRB_TB,d0
CALL AddICRVector
tst.l d0
beq.s .gottimer
move.l a5,a6
bra os_AppAbort
; No turning back at this point!
.gottimer
PUTMSG 10,<"AbleICR">
moveq.l #CIAICRF_TB,d0
CALL AbleICR
ENDC
lea $dff000,a5
exg a4,a6 ; from now on, a6 is supposed to be our framework pointer, a5 is _custom
IF FW_MULTITASKING_SUPPORT
bsr fw_InitTasks
ENDC
IF FW_DYNAMIC_MEMORY_SUPPORT
bsr fw_InitMemoryManagement
IF (FW_STANDALONE_FILE_MODE==0)|FW_HD_TRACKMO_MODE
IF FW_MULTITASKING_SUPPORT
move.l #ft_SIZEOF,d0
bsr fw_AllocFast
move.l a0,fw_TrackloaderTask(a6)
ENDC
ENDC
moveq.l #mfw_copperlistend-mfw_copperlist,d0
bsr fw_AllocChip
move.l a0,a1
move.l a0,fw_BaseCopperlist(a6)
ELSE
IF (FW_STANDALONE_FILE_MODE==0)|FW_HD_TRACKMO_MODE
IF FW_MULTITASKING_SUPPORT
move.l fw_FastMemStack(a6),a0
move.l a0,fw_TrackloaderTask(a6)
lea ft_SIZEOF(a0),a0
move.l a0,fw_FastMemStack(a6)
ENDC
ENDC
move.l fw_ChipMemStack(a6),a1
lea mfw_copperlistend-mfw_copperlist(a1),a0
move.l a0,fw_ChipMemStack(a6)
ENDC
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)
IF FW_SINETABLE_SUPPORT
bsr fw_InitSineTable
ENDC
IF FW_HD_TRACKMO_MODE
move.l #diskimage,fw_TrackBuffer(a6)
bsr fw_InitDos
IF FW_DYNAMIC_MEMORY_SUPPORT
IF FW_MUSIC_SUPPORT
IF (FW_MUSIC_PLAYER_CHOICE>=4)&&(FW_MUSIC_PLAYER_CHOICE<=6)
bsr fw_MusicAlloc
ENDC
ENDC
bsr fw_PushMemoryState
ENDC
ELSE ; FW_DYNAMIC_MEMORY_SUPPORT
IF FW_MUSIC_SUPPORT
IF (FW_MUSIC_PLAYER_CHOICE>=4)&&(FW_MUSIC_PLAYER_CHOICE<=6)
bsr fw_MusicAlloc
bsr fw_PushMemoryState
ENDC
ENDC
ENDC ; FW_DYNAMIC_MEMORY_SUPPORT
move.w vposr(a5),d0
btst #9,d0
beq.s .noaga
move.w #-1,fw_AgaChipset(a6)
.noaga
exg a4,a6 ; from now on, a4 is our framework pointer, a6 is exec
move.l a6,a5
PUTMSG 10,<"LoadView">
movea.l IVBLIT+IV_DATA(a5),a6 ; graphics.library
move.l a6,fw_GfxBase(a4)
move.l gb_ActiView(a6),fw_OldGfxView(a4)
IF FW_DO_FANCY_WORKBENCH_STUFF
CALL OwnBlitter
move.l a5,a6
;CALL Forbid
lea fw_SysFriendlyInterrupt(a4),a1
lea os_SysFriendlyVbl(pc),a0
move.l a0,IS_CODE(a1)
move.l a4,IS_DATA(a1)
moveq.l #INTB_VERTB,d0
CALL AddIntServer
PUSHM a4-a6
lea $dff000,a5
exg a4,a6
bsr preentrypoint
POPM
lea fw_SysFriendlyInterrupt(a4),a1
moveq.l #INTB_VERTB,d0
CALL RemIntServer
clr.l fw_VBlankIRQ(a4)
;CALL Permit
move.l fw_GfxBase(a4),a6
CALL DisownBlitter
suba.l a1,a1
CALL LoadView
CALL WaitTOF
ELSE
suba.l a1,a1
CALL LoadView
CALL WaitTOF
ENDC
CALL OwnBlitter
move.l a5,a6
CALL Forbid
CALL Disable
PUTMSG 10,<"OS off">
bsr os_GetVbr
lea $dff000,a5
exg a4,a6 ; from now on, a6 is supposed to be our framework pointer, a5 is _custom
move.l a0,fw_VBR(a6)
IF FW_SOFT_IRQ_SUPPORT
move.l $64(a0),fw_OldSystemSoftIRQ(a6)
ENDC
move.l $6c(a0),fw_OldSystemVBlankIRQ(a6)
IF FW_AUDIO_IRQ_SUPPORT
move.l $70(a0),fw_OldSystemAudioIRQ(a6)
ENDC
move.w #$7fff,d4
move.w intenar(a5),d0
move.w d4,intena(a5)
move.w d4,intena(a5)
or.w #INTF_SETCLR,d0
move.w intreqr(a5),d1
move.w d4,intreq(a5)
move.w d4,intreq(a5)
or.w #INTF_SETCLR,d1
move.w dmaconr(a5),d2
move.w #DMAF_MASTER|DMAF_ALL,dmacon(a5)
or.w #DMAF_SETCLR,d2
move.w adkconr(a5),d3
move.w d4,adkcon(a5)
or.w #ADKF_SETCLR,d3
movem.w d0-d3,fw_OldControls(a6)
bsr fw_SetBaseCopper
movem.l fw_EmptyRegs(a6),d0-d7/a0-a4
rts
IF 0
.nopirq
move.w #$f00,$dff180
rts
.ciabname
dc.b 'ciab.resource',0
even
ENDC
IF FW_DO_FANCY_WORKBENCH_STUFF
os_SysFriendlyVbl:
addq.w #1,fw_FrameCounter(a1)
move.l fw_VBlankIRQ(a1),d0
beq.s .skip
PUSHM a2-a4/d2-d7
move.l a1,a6
lea $dff000,a5
move.l d0,a0
jsr (a0)
POPM
move.l a5,a0
moveq.l #0,d0
.skip rts
ENDC
os_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
;--------------------------------------------------------------------
os_AppAbort:
addq.l #4,sp
move.l 4.w,a6
move.l fw_BasePtr(pc),a4
bra os_CleanUp
os_AppShutdown:
PUTMSG 10,<"AppShutdown">
IF FW_MUSIC_SUPPORT
bsr fw_StopMusic
ENDC
BLTWAIT
bsr fw_SetBaseCopper
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.l fw_VBR(a6),a0
IF FW_SOFT_IRQ_SUPPORT
move.l fw_OldSystemSoftIRQ(a6),$64(a0)
ENDC
move.l fw_OldSystemVBlankIRQ(a6),$6c(a0)
IF FW_AUDIO_IRQ_SUPPORT
move.l fw_OldSystemAudioIRQ(a6),$70(a0)
ENDC
movea.l fw_GfxBase(a6),a0 ; graphics.library
move.l $26(a0),cop1lc(a5)
move.l $26(a0),cop2lc(a5)
move.w d0,copjmp1(a5)
movem.w fw_OldControls(a6),d0-d3
move.w d3,adkcon(a5)
move.w d2,dmacon(a5)
move.w d1,intreq(a5)
move.w d0,intena(a5)
move.l a6,a4
move.l 4.w,a6
CALL Enable
CALL Permit
move.l a6,a5
movea.l fw_GfxBase(a4),a6 ; graphics.library
CALL DisownBlitter
move.l fw_OldGfxView(a4),a1
CALL LoadView
IF 0
move.l fw_CiaBResource(a4),a6
move.l fw_SysFriendlyInterrupt(a4),a1
moveq.l #CIAICRB_TB,d0
CALL RemICRVector
ENDC
move.l a5,a6
PUTMSG 10,<"OS on">
IF FW_DO_FANCY_WORKBENCH_STUFF
PUSHM a4-a6
exg a4,a6
bsr postentrypoint
POPM
ENDC
moveq.l #0,d7
os_CleanUp:
move.l fw_OrigFastMemAllocAddr(a4),d0
beq.s .nofreefast
move.l d0,a1
move.l fw_OrigFastMemAllocLength(a4),d0
CALL FreeMem
.nofreefast
move.l fw_OrigChipMemAllocAddr(a4),d0
beq.s .nofreechip
move.l d0,a1
move.l fw_OrigChipMemAllocLength(a4),d0
CALL FreeMem
.nofreechip
move.l fw_WBMessage(a4),d2
move.l fw_OrigBaseMemAllocAddr(a4),a1
move.l fw_OrigBaseMemAllocLength(a4),d0
CALL FreeMem
tst.l d2
beq.s .nowb
CALL Forbid
move.l d2,a1
CALL ReplyMsg
.nowb
PUTMSG 10,<"Done with code %d">,d7
move.w d7,d0
ext.l d0
rts