mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 04:31:30 +00:00
194 lines
6.9 KiB
Plaintext
194 lines
6.9 KiB
Plaintext
;
|
||
; File: GibblyMacros.a
|
||
;
|
||
; Contains: macros for use in CPU Gibbly source
|
||
;
|
||
; Written by: Dean Yu
|
||
;
|
||
; Copyright: © 1990-1992 by Apple Computer, Inc., all rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <7> 6/30/92 DTY Pop 'lodr' off the stack.
|
||
; <6> 6/27/92 DTY #1033818: Now that Gibblies are initially placed underneath the
|
||
; system resource map, some extra steps need to be taken to get
|
||
; the linked patch loader from the System file. Now, if a linked
|
||
; patch loader is not found in the Gibbly, use the one in the
|
||
; System. SysErr only if a 'lodr' resource is not found in the
|
||
; System file.
|
||
; <5> 6/24/92 DTY #1033818 <csd>: Gibblies are no longer the top resource map when
|
||
; MakeGibblyResident is called. Look for the Gibbly at the bottom
|
||
; of the resource chain, and unset the twoDeepBit on the map above
|
||
; it.
|
||
; <4> 6/2/92 FM Fix the DoStandardBoot macro to put a copy of the handle to the
|
||
; 'boot' 3 resource in A3 because thats what 'boot' 3 resources
|
||
; expect. Otherwise we would be detaching the handle in a3 when
|
||
; DoStandardBoot is called.
|
||
; <3> 4/8/92 DTY Add conditionals that set ROMMapInsert instead of calling
|
||
; _UseResFile if &lpchResFile is 1. This is how Gibblies can
|
||
; specify ROM resources.
|
||
; <2> 2/21/92 DTY Keep the use of &ptblResID and &lpchResFile consistent.
|
||
; <1> 2/6/92 DTY first checked in
|
||
|
||
include 'SysErr.a'
|
||
include 'Traps.a'
|
||
INCLUDE 'SysPrivateEqu.a'
|
||
include 'Private.a'
|
||
include 'ResourceMgrPriv.a'
|
||
|
||
;
|
||
;
|
||
; DoStandardBoot: Boot the machine with the 'boot' 3 resource from the System file.
|
||
;
|
||
; In order to call this macro correctly you should have the following registers
|
||
; set up with the values passed in to your Gibbly. If you don't, the 'boot' 3 that
|
||
; is being called won't work correctly.
|
||
;
|
||
; Registers passed in from boot blocks:
|
||
; A4 = dirID of the startup application (for pre-7.0 systems; used by the remote booting INIT)
|
||
; A5 = pointer to globals (SP + 400)
|
||
; A6 = pointer to boot blocks (used by the remote booting INIT)
|
||
|
||
Macro
|
||
DoStandardBoot
|
||
move.l ExpandMem,a0
|
||
move.b ExpandMemRec.emScanOverrideMaps(a0),-(sp) ; Save current override state
|
||
clr.b ExpandMemRec.emScanOverrideMaps(a0) ; Turn off overrides explicitly since SetScanOverride may not be implemented yet.
|
||
|
||
subq #2,sp
|
||
_CurResFile ; Remember current resource map
|
||
clr.w -(sp)
|
||
_UseResFile ; Get 'boot from System file.
|
||
|
||
subq #4,sp
|
||
move.l #'boot',-(sp)
|
||
move.w #3,-(sp)
|
||
_Get1Resource
|
||
move.l (sp)+,d1 ; Save 'boot' handle in D1 where it won’t get trashed by _UseResFile
|
||
bz.s @noBootResource
|
||
|
||
_UseResFile ; Restore the previous resource map
|
||
move.l ExpandMem,a0
|
||
move.b (sp)+,ExpandMemRec.emScanOverrideMaps(a0) ; Restore override state
|
||
|
||
move.l d1,a3 ; Boot code expects handle in A3 on entry
|
||
move.l (a3),d0
|
||
_StripAddress
|
||
move.l d0,a0
|
||
jmp (a0) ; Jump to the boot code.
|
||
|
||
@noBootResource:
|
||
move.w #dsBadPatch,d0
|
||
_SysError
|
||
EndM
|
||
|
||
;
|
||
; LoadLinkedPatchesFrom: Load the linked patches from the specified resource file.
|
||
;
|
||
|
||
Macro
|
||
LoadLinkedPatchesFrom &lpchResFile
|
||
|
||
subq #2,sp
|
||
_CurResFile ; Get the current resource file
|
||
|
||
if &lpchResFile = '#1' then
|
||
move.w #MapTrue,ROMMapInsert
|
||
endif
|
||
move.w &lpchResFile,CurMap ; Get 'lpch' resources from this file.
|
||
|
||
subq #4,sp
|
||
@getLinkedPatchLoader&lpchResFile
|
||
move.l #'lodr',-(sp)
|
||
move.w #-16385,-(sp)
|
||
_GetResource ; Use the first linked patch loader we can find.
|
||
move.l (sp),d0
|
||
bnz.s @stripLoaderAddress&lpchResFile ; Uniquely identify this label in case caller is loading lpchs from several files.
|
||
|
||
move.w SysMap,d0 ; <6> Get system resource map
|
||
cmp.w CurMap,d0 ; <6> Did we just try to get the system’s linked patch loader?
|
||
beq.s @noLinkedPatchLoader ; <6> If we did, and we couldn’t, bomb out
|
||
move.w SysMap,CurMap ; <6> If we tried to get a linked patch loader from the Gibbly, and failed, try to use the one from the system
|
||
bra.s @getLinkedPatchLoader&lpchResFile ; <6>
|
||
|
||
@noLinkedPatchLoader
|
||
moveq #dsBadPatch,d0 ; Couldn’t find the patch loader code
|
||
_SysError
|
||
|
||
@stripLoaderAddress&lpchResFile
|
||
if &lpchResFile = '#1' then
|
||
move.w #MapTrue,ROMMapInsert
|
||
endif
|
||
move.w &lpchResFile,CurMap ; Get 'lpch' resources from this file.
|
||
|
||
move.l d0,a0
|
||
move.l (a0),d0
|
||
_StripAddress
|
||
move.l d0,a0
|
||
jsr (a0) ; Call the loader
|
||
|
||
_ReleaseResource ; Done with the linked patch loader
|
||
_UseResFile ; Restore the current resource map
|
||
EndM
|
||
|
||
;
|
||
; LoadRangeOfLinkedPatchesFrom: Load a range of linked patches from the specified resource file
|
||
;
|
||
|
||
Macro
|
||
LoadRangeOfLinkedPatchesFrom &lpchResFile,&ptblResID
|
||
|
||
if &lpchResFile = '#1' then
|
||
move.w #MapTrue,ROMMapInsert
|
||
endif
|
||
|
||
subq #4,sp
|
||
move.l #'ptbl',-(sp) ; This macro is resource based.
|
||
move.w &ptblResID,-(sp) ; Push the resource ID of the 'ptbl' resource
|
||
_GetResource
|
||
move.l (sp),d0
|
||
bnz.s @gotPatchRangeHandle&ptblResID
|
||
moveq #dsBadPatch,d0
|
||
_SysError
|
||
|
||
@gotPatchRangeHandle&ptblResID
|
||
move.l d0,a3 ; Get handle to 'ptbl' resource
|
||
move.l (a3),d0
|
||
_StripAddress ; Strip it for grins
|
||
move.l d0,a3 ; Linked patch loader wants a pointer to a range table in A3.
|
||
|
||
LoadLinkedPatchesFrom &lpchResFile ; Load the linked patches from this resource file
|
||
|
||
_ReleaseResource ; Done with the 'ptbl' resource
|
||
EndM
|
||
|
||
;
|
||
; MakeGibblyResident: Turns the Gibbly’s resource map into an override map for the system.
|
||
; This macro assumes that there will be at least two resource maps in the resource chain,
|
||
; and that the Gibbly’s resource map is the one at the bottom of the chain.
|
||
;
|
||
|
||
Macro
|
||
MakeGibblyResident
|
||
movem.l d0-d2/a0-a2,-(sp) ; <4>
|
||
move.l SysMapHndl,a1 ; <4>
|
||
@findBottomResourceMap: ; <4>
|
||
move.l (a1),a0 ; <4>
|
||
move.l mNext(a0),d0 ; <4> Get the next map
|
||
bz.s @gotBottomResourceMap ; <4> Assume the resource map at the bottom of the chain is the Gibbly’s map
|
||
move.l a1,a2 ; <4> Remember the map above the one at the bottom
|
||
move.l d0,a1 ; <4>
|
||
bra.s @findBottomResourceMap ; <4> Find the map at the bottom
|
||
|
||
; Got the resource map at the bottom of the chain. Clear the twoDeepBit in the map above it.
|
||
|
||
@gotBottomResourceMap: ; <4>
|
||
move.l (a2),a0 ; <4>
|
||
bclr #twoDeepBit,mInMemoryAttr(a0) ; <4> The map above it will now be the bottom map, so clear out the twoDeep bit.
|
||
move.l a1,-(sp) ; <4> A1 has a handle to the Gibbly’s resource map
|
||
move.l SysMapHndl,-(sp) ; <4> Override the system map
|
||
_InsertOverrideMap ; <4>
|
||
movem.l (sp)+,d0-d2/a0-a2 ; <4>
|
||
EndM
|
||
|
||
|