![]() | by Michael Sinz (MKSoft Development) Copyright 1992-2001 - All Rights Reserved Move4K.asm |
by Michael Sinz MKSoft Development Copyright 1992-2001 All Rights Reserved Documentation Enforcer Archive ![]() Source code for the main Enforcer tool: Source code for the MMU tool: Source code for SegTracker: Source code for FindHit: Source code for RebootOff: Source code for Move4K: Source code for LawBreaker:
|
* Enforcer by
* Michael Sinz
*
* Copyright 1992-2001
* All Rights Reserved
*
*****************************************************************************
* *
* Permission is hereby granted to distribute the Enforcer archive *
* containing the executables and documentation for non-commercial purposes *
* so long as the archive and its contents are not modified in any way. *
* *
* Enforcer and related tools are not in the public domain. *
* *
* Enforcer and related tools may not be distributed for a profit. *
* *
*****************************************************************************
*
******* Move4K ****************************************************************
*
* NAME
* Move4K - Moves as much out of the lower 4K of RAM as possible
*
* SYNOPSIS
* On 68040 systems, as much of the lower 4K of CHIP RAM as possible
* is removed from system use.
*
* FUNCTION
* On 68040 systems the MMU page sizes are 4K and 8K. Enforcer
* uses the 4K page size. Since watching for hits of low memory
* is a vital part of Enforcer, this means that the first 4K
* of RAM will be marked invalid. On current systems, only
* the first 1K of RAM is invalid and thus 3K of RAM in that
* first 4K will end up needing to be emulated in Enforcer.
* In order to reduce the overhead that this causes (and the
* major performance loss) this program will try to move as much
* from that first 4K as possible and make any of the free
* memory within the first 4K inaccessible.
*
* Enforcer itself also has this logic, but it may be useful
* to be able to run this program as the first program in
* the Startup-Sequence (*AFTER* SetPatch) to try to limit
* the number of things that may use the lower 4K of RAM.
*
* INPUTS
* Just run it... Can be run from CLI or Workbench
*
* RESULTS
* Any available memory in the lower 4K of CHIP RAM is removed
* plus a special graphics buffer is moved if it needs to be.
* After running this program you may have a bit less CHIP RAM
* than before. You can run this program as many times as you
* wish since it only moves things if it needs to.
*
* NOTES
* This program will do nothing on systems without a 68040.
* It does not, however, check for the MMU and thus it will
* move the lower 4K even if the CPU is not able to run Enforcer.
*
* V39 of the operating system already does have the lowest
* MMU page empty and thus this program will effectively do
* nothing under V39.
*
* SEE ALSO
* "Eloquence is vehement simplicity"
*
* BUGS
* None.
*
*******************************************************************************
*
*******************************************************************************
*
* This program is used to remove as much used memory from the lower 4K as
* possible. It is rather rude hacking, but it should work.
*
include "exec/types.i"
include "exec/execbase.i"
include "exec/macros.i"
include "exec/memory.i"
include "graphics/gfxbase.i"
include "dos/dosextens.i"
*
include "move4k_rev.i"
*
Start: move.l 4,a6
move.w AttnFlags(a6),d1 ; Get CPU flags
btst #AFB_68040,d1 ; Is it a 68040?
beq Exit ; (Cheat: this also checks for
; V37 since 68040 flag does
; not get set in pre-V37 ;^)
*
opt p=68040
*
* The following code is a bit of hacking...
* It moves certain items out of memory that is below the 4K mark...
*
* It also allocates all memory that is below that mark and throws it away
*
hack_alloc: moveq.l #1,d0 ; Allocate 1 byte...
moveq.l #MEMF_CHIP,d1 ; CHIP memory...
JSRLIB AllocVec ; Allocate it...
tst.l d0 ; Did it work?
beq.s hack_alloc_done ; (This should never happen)
bftst d0{0:20} ; Check if in lower 4K
beq.s hack_alloc ; If so, go for another...
move.l d0,a1 ; This one is too far...
JSRLIB FreeVec ; Put it back...
hack_alloc_done:
*
* Now, we check if the MemList header is still in the lower 4K...
*
JSRLIB Forbid ; We must FORBID in here...
lea.l MemList(a6),a3 ; Get MemList...
hack_mem: move.l (a3),a3 ; Get next node...
move.l (a3),d0 ; Check for done...
beq.s hack_mem_done ; If no more, we are done!
move.l a3,d0 ; Get node address...
bftst d0{0:20} ; Is it in the lower 4K?
bne.s hack_mem ; If not, keep looking...
*
* Ah! so this header is in low mem! Ok, we will move it...
*
moveq.l #MH_SIZE,d0 ; Get size to allocate...
moveq.l #0,d1 ; Any memory type...
JSRLIB AllocMem ; Allocate it...
tst.l d0 ; It should always work, but...
beq.s hack_mem_done ; If this ever happens...
move.l d0,a0 ; Store in address register
movem.l (a3),d0-d7 ; Get the whole thing... (8*4)
move.l a0,a3 ; Get new one...
movem.l d0-d7,(a3) ; Make new header a copy...
move.l (a0)+,a1 ; Get LN_SUCC
move.l a3,LN_PRED(a1) ; Link in the bottom
move.l (a0)+,a1 ; Get LN_PRED
move.l a3,LN_SUCC(a1) ; Link in the top...
bra.s hack_mem ; Loop back for more...
hack_mem_done: JSRLIB Permit
*
* Finally, if graphics is V39 or less, do the LastChanceMemory...
*
lea gfxName(pc),a1 ; Get library name...
moveq.l #37,d0 ; Minimum of V37
JSRLIB OpenLibrary ; Open the library...
tst.l d0 ; Did it open?
beq.s no_gfx_hack ; If not, skip it...
move.l d0,a2 ; Store in a2...
move.w LIB_VERSION(a2),d0 ; Get version
sub.w #40,d0 ; Are we over V39?
bcc.s close_gfx ; If so, skip hack...
move.l gb_LastChanceMemory(a2),a0 ; Get semaphore...
JSRLIB ObtainSemaphore ; Get a lock on LCM...
move.l gb_LCMptr(a2),d0 ; Get pointer...
bftst d0{0:20} ; Check if in the 4K
bne.s free_lcm ; If not, free the semaphore
move.l #4096,d0 ; Size of LCM memory...
move.l #MEMF_CHIP,d1 ; Type of memory...
JSRLIB AllocMem ; Allocate it...
move.l d0,d1 ; Did the allocation work?
beq.s free_lcm ; If not, skip...
move.l d0,gb_LCMptr(a2) ; Store new LCM memory...
free_lcm: move.l gb_LastChanceMemory(a2),a0 ; Get semaphore...
JSRLIB ReleaseSemaphore ; Release the lock...
close_gfx: move.l a2,a1 ; Get GfxBase
JSRLIB CloseLibrary ; Close the library
no_gfx_hack:
*
* Now exit but first, reply the startup message as needed...
*
Exit: move.l ThisTask(a6),a4 ; Get our process pointer...
tst.l pr_CLI(a4) ; Are we a CLI?
bne.s Do_Exit ; If not NULL, we are a CLI...
*
* Handle Workbench Startup...
*
lea pr_MsgPort(a4),a4 ; Get message port...
move.l a4,a0 ; We first wait for the WB Startup MSG
JSRLIB WaitPort ; (it should be here very quickly)
move.l a4,a0 ; Now we get the message...
JSRLIB GetMsg ; Get it...
move.l d0,a1 ; Get message pointer...
JSRLIB Forbid ; Forbid... (No register trash)
JSRLIB ReplyMsg ; Reply the startup message...
*
Do_Exit: moveq.l #0,d0
rts
*
VERSTAG
gfxName: dc.b 'graphics.library',0
*
END
| ||
![]() |

visitors to this page.