sys7.1-doc-wip/Internal/Asm/GibblyMacros.a
2019-07-27 22:37:48 +08:00

194 lines
6.9 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; 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 wont 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 systems linked patch loader?
beq.s @noLinkedPatchLoader ; <6> If we did, and we couldnt, 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 ; Couldnt 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 Gibblys 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 Gibblys 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 Gibblys 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 Gibblys resource map
move.l SysMapHndl,-(sp) ; <4> Override the system map
_InsertOverrideMap ; <4>
movem.l (sp)+,d0-d2/a0-a2 ; <4>
EndM