From 1f23cecf7f2b4fd615ad2249fb7b83098fae9c96 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Fri, 29 Mar 2019 09:35:52 -0700 Subject: [PATCH] initial --- Bonus Junk/MegaBoot.c | 492 ++++++++++++ Open Firmware/install.f | 1 + Open Firmware/ramboot | 1 + Open Firmware/ramboot-src | 1 + Patch Partition/BuildpDES/BuildpDES | 0 .../BuildpDES/TargetDataMacOS.tdt | Bin 0 -> 40374 bytes .../BuildpDES Data/CWSettingsMacOS.stg | Bin 0 -> 3744 bytes Patch Partition/BuildpDES/BuildpDES.SYM | Bin 0 -> 61440 bytes Patch Partition/BuildpDES/BuildpDES.c | 49 ++ Patch Partition/BuildpDES/BuildpDES.mcp | Bin 0 -> 35531 bytes .../BuildpDES/Ephemerboot Installer | Bin 0 -> 27748 bytes Patch Partition/BuildpDES/TemplatepDES.rsrc | 0 .../Ephemerboot Data/CWSettingsMacOS.stg | Bin 0 -> 4158 bytes .../MegaBoot/TargetDataMacOS.tdt | Bin 0 -> 159911 bytes Patch Partition/Ephemerboot.c | 698 ++++++++++++++++++ Patch Partition/Ephemerboot.mcp | Bin 0 -> 37515 bytes Patch Partition/EphemerbootPatch.rsrc | 0 Read Me Second.txt | 1 + machack speech.txt | 1 + 19 files changed, 1244 insertions(+) create mode 100755 Bonus Junk/MegaBoot.c create mode 100755 Open Firmware/install.f create mode 100755 Open Firmware/ramboot create mode 100755 Open Firmware/ramboot-src create mode 100755 Patch Partition/BuildpDES/BuildpDES create mode 100755 Patch Partition/BuildpDES/BuildpDES Data/BuildpDES/TargetDataMacOS.tdt create mode 100755 Patch Partition/BuildpDES/BuildpDES Data/CWSettingsMacOS.stg create mode 100755 Patch Partition/BuildpDES/BuildpDES.SYM create mode 100755 Patch Partition/BuildpDES/BuildpDES.c create mode 100755 Patch Partition/BuildpDES/BuildpDES.mcp create mode 100755 Patch Partition/BuildpDES/Ephemerboot Installer create mode 100755 Patch Partition/BuildpDES/TemplatepDES.rsrc create mode 100755 Patch Partition/Ephemerboot Data/CWSettingsMacOS.stg create mode 100755 Patch Partition/Ephemerboot Data/MegaBoot/TargetDataMacOS.tdt create mode 100755 Patch Partition/Ephemerboot.c create mode 100755 Patch Partition/Ephemerboot.mcp create mode 100755 Patch Partition/EphemerbootPatch.rsrc create mode 100755 Read Me Second.txt create mode 100755 machack speech.txt diff --git a/Bonus Junk/MegaBoot.c b/Bonus Junk/MegaBoot.c new file mode 100755 index 0000000..b226786 --- /dev/null +++ b/Bonus Junk/MegaBoot.c @@ -0,0 +1,492 @@ +#include +#include +#include + +#pragma parameter __D0 VMMap( __A0, __A1 ) +OSErr VMMap( UInt32 log, UInt32 phys ) TWOWORDINLINE( 0x7007, 0xfe0a ); +#pragma parameter __D0 VMUnmap( __A0, __A1 ) +OSErr VMUnmap( UInt32 log, UInt32 key ) TWOWORDINLINE( 0x7008, 0xfe0a ); + +UInt8 gWindowStor[ 0x1fff ]; +UInt32 gWindowPage; + +struct { + UInt8 flags[4]; + DrvQEl dqe; +} gMyDQE; +UInt32 gActualSize = 0x08000000 >> 9; + +typedef struct PhysRun { + UInt32 startPage; + UInt32 numBytes; +} PhysRun; + +PhysRun gRuns[] = { { 0x0c000000 >> 12, 0x08000000 } }; +int gNumRuns = 1; + +extern OSErr __Startup__(); +extern void DriverHeader(); +extern void main(void); +extern void CallBootResource( Handle ); +extern OSErr DriverOpen(); +extern OSErr DriverClose(); +extern OSErr DriverPrime( IOParamPtr:__a0, DCtlPtr:__a1 ); +extern OSErr DriverStatus( CntrlParamPtr:__a0, DCtlPtr:__a1 ); +extern OSErr DriverControl( CntrlParamPtr:__a0, DCtlPtr:__a1 ); +extern void NumToHex( UInt32, UInt8 * ); +void PrintTrap( UInt16 trap ); +void UltimatePatch(); + + +asm OSErr __Startup__() { + subq #4, sp // gimme that return ptr back! + + pea (a3) + _DetachResource // no return value + + move.l a4, -(sp) + jsr SetCurrentA4 // boot block calling conventions are pretty freestyle + + jsr main + + move.l (sp)+, a4 + + move.l (sp), a0 + move.w (a0)+, -(sp) + jsr PrintTrap + addq #2, sp + + move.w (a0)+, -(sp) + jsr PrintTrap + addq #2, sp + + move.w (a0)+, -(sp) + jsr PrintTrap + addq #2, sp + + move.w (a0)+, -(sp) + jsr PrintTrap + addq #2, sp + + move.w (a0)+, -(sp) + jsr PrintTrap + addq #2, sp + + move.w (a0)+, -(sp) + jsr PrintTrap + addq #2, sp +// move.w #dsSystemFileErr, d0; + move.w #resNotFound, d0; + rts +} + +ExitCodeResource(); +} + + +asm void DriverHeader() { + dc.w dNeedLockMask | dStatEnableMask | dCtlEnableMask | dReadEnableMask | dWritEnableMask + dc.w 0 // delay + dc.w 0 // evt mask + dc.w 0 // menu + + dc.w 0x1a + dc.w 0x1e + dc.w 0x28 + dc.w 0x32 + dc.w 0x3c + + dc.b "\p.RAMB0" + +@open: + jmp DriverOpen +@prime: + movem.l a0/a1, -(sp) + jsr DriverPrime + bra.s @finish +@control: + movem.l a0/a1, -(sp) + jsr DriverControl + bra.s @finish +@status: + movem.l a0/a1, -(sp) + jsr DriverStatus + bra.s @finish +@close: + jmp DriverClose + +@finish: + movem.l (sp)+, a0/a1 + move.w 6 (a0), d1 // PB.ioTrap + btst # noQueueBit, d1 + bne.s @rtn + + move.l 0x8fc, -(sp) // jIODone + +@rtn: + move.w d0, 0x10 (a0) // PB.ioResult + rts +} + + +extern OSErr DriverOpen() { + return noErr; +} + + +void PrintTrap( UInt16 trap ) { + UInt8 trapstr[8]; + EnterCodeResource(); + + NumToHex( trap, trapstr ); + ISDebugText( trapstr+4, 4 ); + + ExitCodeResource(); +} + + +asm void UltimatePatch() { + movem.l a0/a1/d0/d1, -(sp) + + move.l 0x12 (sp), a0 + move.w (a0), -(sp) + jsr PrintTrap + addq #2, sp + + movem.l (sp)+, a0/a1/d0/d1 + jmp 0x80000000 +} + + +asm long SetCurrentA4() { + lea __Startup__,a0 + adda.l #305419896,a0 + move.l a0,d0 + exg d0,a4 + rts +} + +extern OSErr DriverPrime( IOParamPtr pb:__a0, DCtlPtr dce:__a1 ) { + OSErr err = noErr; + UInt32 ioPage, ioPen; + int bcnt; + + EnterCodeResource(); + ISDebugStr( ( pb->ioTrap & 0xff ) == aRdCmd? "\pI" : "\pO" ); + + pb->ioActCount = 0; + VMUnmap( gWindowPage, 1 ); + + while ( pb->ioActCount < pb->ioReqCount ) { + UInt32 maxTrans, actTrans; + Ptr disk, buff; + + for ( bcnt = 0, ioPen = dce->dCtlPosition + pb->ioActCount; bcnt < gNumRuns && gRuns[bcnt].numBytes <= ioPen; bcnt++ ) { + ioPen -= gRuns[bcnt].numBytes; + } + if ( bcnt == gNumRuns ) { + err = ioErr; + break; + } + + VMMap( gWindowPage, gRuns[bcnt].startPage + ( ioPen >> 12 ) ); + + maxTrans = 0x1000 - ( ioPen & 0xfff ); + actTrans = pb->ioReqCount - pb->ioActCount; + actTrans = (maxTransioBuffer + pb->ioActCount; + + if ( pb->ioTrap & 0xff == aRdCmd ) { + BlockMoveData( disk, buff, actTrans ); + } else { + BlockMoveData( buff, disk, actTrans ); + } + + VMUnmap( gWindowPage, 1 ); + + pb->ioActCount += actTrans; + } + ISDebugStr( "\pDone" ); + + ExitCodeResource(); + return err; +} + + +extern OSErr DriverControl( CntrlParamPtr pb:__a0, DCtlPtr dce:__a1 ) { + EnterCodeResource(); + ISDebugStr( "\pC" ); + ExitCodeResource(); + return controlErr; +} + +extern OSErr DriverStatus( CntrlParamPtr pb:__a0, DCtlPtr dce:__a1 ) { + EnterCodeResource(); + ISDebugStr( "\pS" ); + ExitCodeResource(); + return statusErr; +} + +extern OSErr DriverClose + + +void main( void ) { + OSErr err = noErr; + VCBPtr bootV; + SInt16 bootD; + CntrlParam pb; + SInt16 myRN; + UInt32 dlong; + EnterCodeResource(); + + InitInterruptSafeDebug(); + * ( (UInt32 *) ( (UInt32) UltimatePatch + 0x16 ) ) = * (UInt32 *) 0x28; + //* ( (UInt32 *) 0x28 ) = (UInt32) &UltimatePatch; + ISDebugStr( "\pRAMB03" ); + Delay( 200, &dlong ); + + gWindowPage = ( (UInt32) &gWindowStor + 0xfff ) >> 12; + HoldMemory( (Ptr) ( gWindowPage << 12 ), 0x1000 ); + VMUnmap( gWindowPage, 1 ); + ISDebugStr( "\pphysical fenestration" ); + + { // close the system file & knock the resource manager silly + //CloseResFile( LMGetSysMap() ); + /*LMSetTopMapHndl( NULL ); + LMSetCurMap( 1 );*/ + LMSetSysMapHndl( NULL ); + LMSetSysMap( 1 ); + } + + { // unmount the boot vol + ISDebugStr( "\pSys closed" ); + pb.ioCompletion = NULL; + + bootV = (VCBPtr) GetVCBQHdr()->qHead; + bootD = bootV->vcbDrvNum; + + pb.ioVRefNum = bootV->vcbVRefNum; + pb.ioNamePtr = NULL; + + //err = PBUnmountVol( (ParmBlkPtr) &pb ); + } + + if ( err == noErr ) { // install our drvr + ISDebugStr( "\pVol unmounted" ); + err = TradInstallDriverFromPtr( (DRVRHeaderPtr) &DriverHeader, 48, 127, &myRN ); + } + + if ( err == noErr ) { + err = OpenDriver( "\p.RAMB0", &myRN ); + } + + if ( err == noErr ) { // find the boot drive & link in after it + DrvQElPtr dqe; + SInt16 highDrive = 0; + + for ( dqe = (DrvQElPtr) GetDrvQHdr()->qHead; dqe->dQDrive != bootD; dqe = (DrvQElPtr) dqe->qLink ) { + if ( dqe->dQDrive > highDrive ) highDrive = dqe->dQDrive; + } + + gMyDQE.dqe.qLink = dqe->qLink; + dqe->qLink = (QElemPtr) &gMyDQE.dqe; + + for ( dqe = (DrvQElPtr) gMyDQE.dqe.qLink; dqe; dqe = (DrvQElPtr) dqe->qLink ) { + if ( dqe->dQDrive > highDrive ) highDrive = dqe->dQDrive; + } + + gMyDQE.flags[0] = 0; // unlocked + gMyDQE.flags[1] = 8; // nonejectable + gMyDQE.flags[2] = 0; // reserved + gMyDQE.flags[3] = 0; // n/a + gMyDQE.dqe.dQDrive = highDrive + 1; + gMyDQE.dqe.dQRefNum = myRN; + gMyDQE.dqe.dQFSID = 0; + gMyDQE.dqe.dQDrvSz = (UInt16) gActualSize; + gMyDQE.dqe.dQDrvSz2 = (UInt32) gActualSize >> 16; + + PrintTrap( myRN ); + } + + if ( err == noErr ) { + HVolumeParam vpb; + DrvQElPtr dqe; + + vpb.ioVRefNum = gMyDQE.dqe.dQDrive; + vpb.ioVolIndex = 0; + vpb.ioNamePtr = NULL; + vpb.ioCompletion = 0; + + err = PBMountVol( (ParmBlkPtr) &vpb ); + + if ( err == noErr ) { + ISDebugStr( "\pmounted RAM disk" ); + err = PBHGetVInfoSync( (HParmBlkPtr) &vpb ); + } + + for ( dqe = (DrvQElPtr) GetDrvQHdr()->qHead; dqe && ( err || vpb.ioVFndrInfo[0] == 0 ); dqe = (DrvQElPtr) dqe->qLink ) { + err = PBUnmountVol( (ParmBlkPtr) &vpb ); + + vpb.ioVRefNum = dqe->dQDrive; + err = PBMountVol( (ParmBlkPtr) &vpb ); + + if ( vpb.ioVRefNum == bootD ) err = dsBadStartupDisk; // no recursion! + + vpb.ioVolIndex = 0; + if ( err == noErr ) { + ISDebugStr( "\pmounted something else" ); + err = PBHGetVInfoSync( (HParmBlkPtr) &vpb ); + } + } + + if ( dqe == NULL ) err = dsBadStartupDisk; + +/* pb.ioVRefNum = 15; //gMyDQE.dqe.dQDrive; + + err = PBMountVol( (ParmBlkPtr) &pb ); + } + + if ( err == noErr ) { + HVolumeParam vpb; + vpb.ioVRefNum = pb.ioVRefNum; + vpb.ioVolIndex = 0; + vpb.ioNamePtr = 0; + vpb.ioCompletion = 0; + + err = PBHGetVInfoSync( (HParmBlkPtr) &vpb );*/ + + if ( err == noErr ) { + LMSetBootDrive( vpb.ioVDrvInfo ); + + ( (WDPBPtr) &vpb )->ioWDDirID = vpb.ioVFndrInfo[0]; + ( (WDPBPtr) &vpb )->ioWDProcID = 'ERIK'; // Erik... that's me ;v) + + err = PBOpenWDSync( (WDPBPtr) &vpb ); + } + + if ( err == noErr ) { + ISDebugStr( "\pFound a System Folder" ); + err = PBSetVolSync( (ParmBlkPtr) &vpb ); + } + } + + if ( err == noErr ) { + ISDebugStr( "\pSet the sys folder" ); + Delay( 60, &dlong ); + /*if ( InitResources() < 0 ) { + err = dsSystemFileErr; + ISDebugStr( "\pNo InitResources() for U" ); + }*/ + LMSetSysMap( OpenResFile( LMGetSysResName() ) ); + + Delay( 60, &dlong ); + if ( LMGetSysMap() == 0 ) err = fnfErr; + } + + if ( err == noErr ) { + Handle boot2; + OSType type; + SInt16 id, rx = 1; + UInt8 check[8]; + + LMSetSysMapHndl( LMGetTopMapHndl() ); + + do { + boot2 = GetIndResource( 'boot', rx ); + err = ResError(); + GetResInfo( boot2, &id, &type, check ); + PrintTrap( id ); + PrintTrap( rx ); + NumToHex( * (UInt32 *) *boot2, check ); + ISDebugText( check, 8 ); + rx++; + } while( err == noErr && * (UInt32 *) *boot2 != 0x204ba025 ); + + Delay( 300, &dlong ); + + ISDebugStr( "\pCalling boot" ); + if ( err == noErr ) { + * ( (UInt32 *) 0x28 ) = (UInt32) &UltimatePatch; + CallBootResource( boot2 ); + } + } + + { + UInt8 errstr[8]; + NumToHex( err, errstr ); + ISDebugText( errstr, 8 ); + + ISDebugStr("\preturning"); + Delay( 600, &dlong ); + } + + ExitCodeResource(); +} + + +asm void CallBootResource( Handle boot2 ) { + movea.l 4 (sp), a3 + movea.l (a3), a0 + jmp (a0) +} + + +void NumToHex( UInt32 num, UInt8 *hex ) { + int ncnt; + + for ( ncnt = 0; ncnt < 8; ncnt++ ) { + int nibble = ( num >> (28-ncnt*4) ) & 0x0f; + nibble += (nibble>9)?('a'-10):'0'; + + hex[ncnt] = nibble; + } +} + + + /*if ( err == noErr ) { + pb.ioVRefNum = gMyDQE.dqe.dQDrive; + + err = PBMountVol( (ParmBlkPtr) &pb ); + } + + if ( err == noErr ) { + ISDebugStr( "\pMounted" ); + + SetVol( NULL, pb.ioVRefNum );*/ + +/*void main(void) { + Ptr windowStor, window; + UInt32 lcnt; + + SetCurrentA4(); + + InitInterruptSafeDebug(); + + ISDebugStr( "\pHello" ); + + Delay(60, &lcnt); + window = (Ptr) ( ( (UInt32) &gWindowStor + 0xfff ) & ~0xfff ); + HoldMemory( window, 0x1000 ); + + VMUnmap( ( (UInt32) window ) >> 12, 1 ); + VMMap( ( (UInt32) window ) >> 12, 0 ); + + for ( lcnt = 0; lcnt < 4; lcnt++ ) { + UInt8 hstr[9]; + *hstr = 8; + + NumToHex( ( (UInt32 *) window )[lcnt], hstr + 1 ); + + ISDebugStr( hstr ); + } + + VMUnmap( ( (UInt32) window ) >> 12, 1 ); + UnholdMemory( window, 0x1000 ); + //Debugger(); + Delay(600, &lcnt); + +}*/() { + return noErr; +} \ No newline at end of file diff --git a/Open Firmware/install.f b/Open Firmware/install.f new file mode 100755 index 0000000..ba21083 --- /dev/null +++ b/Open Firmware/install.f @@ -0,0 +1 @@ +\ Open Firmware script to install Ephemerboot hex 70.0.74.77.a unselect-dev " true" " use-nvramrc?" $setenv " : ram-boot "" hd:,"(5c):tbxi"" $boot ;" nvramrc $setenv " ram-boot" " boot-command" $setenv " 04000000" " ramboot-disk-size" $setenv ." Set nv vars" cr \ No newline at end of file diff --git a/Open Firmware/ramboot b/Open Firmware/ramboot new file mode 100755 index 0000000..c8cc6d8 --- /dev/null +++ b/Open Firmware/ramboot @@ -0,0 +1 @@ + MacRISC Pre-bootloader clips visible RAM to allocate a RAM disk. hex 70.0.74.77.a unselect-dev " /options" find-package drop constant _options " /memory" find-package drop constant _memory 2.00000 constant reboot-reserved-space : boot-tbxj " &device;:&partition;,"(5c):tbxj" 2dup open-dev if $boot then ." RAMBoot: Deferring to selected physical disk. 2drop mac-boot ; struct 4 field >next-run 4 field >start-addr 4 field >byte-count constant /phys-run variable first-phys-run first-phys-run " reg" _memory get-package-property drop begin ( run addr len ) dup while decode-int >r ( run addr len ) rot ( addr len run ) /phys-run alloc-mem dup >r ( addr len run newrun ) swap ! ( addr len ) r> ( addr len newrun ) r> over >start-addr ! ( addr len newrun ) -rot decode-int >r ( newrun addr len ) rot ( addr len newrun ) r> over >byte-count ! dup >start-addr @ ." Encoded range " . dup >byte-count @ ." , " . cr >next-run -rot repeat 2drop off first-phys-run @ begin dup >next-run @ ?dup while nip repeat >r r@ >byte-count @ reboot-reserved-space - dup r@ >byte-count ! r> >start-addr @ + constant reserved-run-start 0 first-phys-run @ begin tuck >byte-count @ + swap >next-run @ ?dup 0= until constant total-ram " ramboot-disk-size" _options get-package-property if ." RAMBoot: could not get prefs from NVRAM" boot-tbxj then \ decode-int decode-string $number drop constant disk-ram 2drop : encode-int+ encode-int encode+ ; : encode-start >start-addr @ encode-int+ ; : encode-count >byte-count @ encode-int+ ; 0 0 encode-bytes total-ram disk-ram - dup 0< if 3drop ." RAMBoot: specified size larger than installed memory." boot-tbxj then first-phys-run @ begin ( addr len rem run ) tuck >byte-count @ ( addr len run rem count ) over < while ( addr len run rem ) >r >r ( addr len ) r@ encode-start r@ encode-count r> r> ( addr len run rem ) over >byte-count @ - swap ( addr len rem run ) >next-run @ repeat swap >r -rot ( rem addr len ) r@ encode-start 2 pick encode-int+ reserved-run-start encode-int+ reboot-reserved-space encode-int+ " /memory" find-device " reg" 2dup delete-property property unselect-dev ( rem ) ." done with /memory" cr dup r@ >start-addr @ + encode-int rot ( addr len rem ) r@ >byte-count @ swap - ?dup 0<> if encode-int+ else 2drop 0 0 encode-bytes then r> >next-run @ ( addr len run ) begin ?dup while >r r@ encode-start r@ encode-count r> >next-run @ repeat " /chosen" find-device " ramboot-phys-ranges" property unselect-dev " /options" find-device " ramboot-checksum" _options get-package-property 0= if " ramboot-checksum" 2dup delete-property property then unselect-dev boot-tbxj  \ No newline at end of file diff --git a/Open Firmware/ramboot-src b/Open Firmware/ramboot-src new file mode 100755 index 0000000..f253414 --- /dev/null +++ b/Open Firmware/ramboot-src @@ -0,0 +1 @@ +hex 70.0.74.77.a unselect-dev " /options" find-package drop constant _options " /memory" find-package drop constant _memory 2.00000 constant reboot-reserved-space : boot-tbxj " &device;:&partition;,"(5c):tbxj" 2dup open-dev if $boot then ." RAMBoot: Deferring to selected physical disk. 2drop mac-boot ; struct 4 field >next-run 4 field >start-addr 4 field >byte-count constant /phys-run variable first-phys-run first-phys-run " reg" _memory get-package-property drop begin ( run addr len ) dup while decode-int >r ( run addr len ) rot ( addr len run ) /phys-run alloc-mem dup >r ( addr len run newrun ) swap ! ( addr len ) r> ( addr len newrun ) r> over >start-addr ! ( addr len newrun ) -rot decode-int >r ( newrun addr len ) rot ( addr len newrun ) r> over >byte-count ! dup >start-addr @ ." Encoded range " . dup >byte-count @ ." , " . cr >next-run -rot repeat 2drop off first-phys-run @ begin dup >next-run @ ?dup while nip repeat >r r@ >byte-count @ reboot-reserved-space - dup r@ >byte-count ! r> >start-addr @ + constant reserved-run-start 0 first-phys-run @ begin tuck >byte-count @ + swap >next-run @ ?dup 0= until constant total-ram " ramboot-disk-size" _options get-package-property if ." RAMBoot: could not get prefs from NVRAM" boot-tbxj then \ decode-int decode-string $number drop constant disk-ram 2drop : encode-int+ encode-int encode+ ; : encode-start >start-addr @ encode-int+ ; : encode-count >byte-count @ encode-int+ ; 0 0 encode-bytes total-ram disk-ram - dup 0< if 3drop ." RAMBoot: specified size larger than installed memory." boot-tbxj then first-phys-run @ begin ( addr len rem run ) tuck >byte-count @ ( addr len run rem count ) over < while ( addr len run rem ) >r >r ( addr len ) r@ encode-start r@ encode-count r> r> ( addr len run rem ) over >byte-count @ - swap ( addr len rem run ) >next-run @ repeat swap >r -rot ( rem addr len ) r@ encode-start 2 pick encode-int+ reserved-run-start encode-int+ reboot-reserved-space encode-int+ " /memory" find-device " reg" 2dup delete-property property unselect-dev ( rem ) ." done with /memory" cr dup r@ >start-addr @ + encode-int rot ( addr len rem ) r@ >byte-count @ swap - ?dup 0<> if encode-int+ else 2drop 0 0 encode-bytes then r> >next-run @ ( addr len run ) begin ?dup while >r r@ encode-start r@ encode-count r> >next-run @ repeat " /chosen" find-device " ramboot-phys-ranges" property unselect-dev " /options" find-device " ramboot-checksum" _options get-package-property 0= if " ramboot-checksum" 2dup delete-property property then unselect-dev boot-tbxj \ No newline at end of file diff --git a/Patch Partition/BuildpDES/BuildpDES b/Patch Partition/BuildpDES/BuildpDES new file mode 100755 index 0000000..e69de29 diff --git a/Patch Partition/BuildpDES/BuildpDES Data/BuildpDES/TargetDataMacOS.tdt b/Patch Partition/BuildpDES/BuildpDES Data/BuildpDES/TargetDataMacOS.tdt new file mode 100755 index 0000000000000000000000000000000000000000..ebaefe1f12ff43bd1f7d2620c11acbd4f6a51660 GIT binary patch literal 40374 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 literal 0 HcmV?d00001 diff --git a/Patch Partition/BuildpDES/BuildpDES Data/CWSettingsMacOS.stg b/Patch Partition/BuildpDES/BuildpDES Data/CWSettingsMacOS.stg new file mode 100755 index 0000000000000000000000000000000000000000..889197f4ef91d62403807ec08b5ba243b7f9a9a1 GIT binary patch literal 3744 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 + + +extern UInt16 DriverChecksum( Handle dH ) { + UInt32 bcnt; + UInt32 sum; + + sum = 0; + for ( bcnt = 0; bcnt < GetHandleSize( dH ); bcnt++ ) { + sum += (UInt8) *( *dH + bcnt ); + sum <<= 1; + if ( sum & 0x10000 ) sum |= 1; + } + + if ( (UInt16) sum == 0 ) { + sum = -1; + PtrToXHand( &sum, dH, 1 ); + + return DriverChecksum( dH ); + } + + return sum; +} + + +void main( void ) { + Handle patch; + PatchDescriptor **pd; + + patch = Get1Resource( 'ptch', 128 ); + DetachResource( patch ); + pd = (PatchDescriptor **) Get1Resource( 'pDES', 128 ); + DetachResource( (Handle) pd ); + + (**pd).patchDescriptorLen = ( GetHandleSize((Handle)pd) + 1 ) & ~1; + (**pd).patchCRC = DriverChecksum( patch ); + (**pd).patchSize = GetHandleSize( patch ); + + OpenResFile( "\pEphemerboot Installer" ); + + RemoveResource( Get1Resource( 'pDES', 128 ) ); + AddResource( (Handle) pd, 'pDES', 128, "\p" ); + + RemoveResource( Get1Resource( 'ptch', 128 ) ); + AddResource( patch, 'ptch', 128, "\p" ); +} \ No newline at end of file diff --git a/Patch Partition/BuildpDES/BuildpDES.mcp b/Patch Partition/BuildpDES/BuildpDES.mcp new file mode 100755 index 0000000000000000000000000000000000000000..e769c8a997c8594b6ca8b7b291897ca453b6c31b GIT binary patch literal 35531 zcmeHQeQX@X6`wtSBq6~G;6exq*^rP}O=G^QfDWa#cQK@~_)stT$~jY>r-s4Ch&DyaB_qE?`mwrZj3AGAt;znR&+ zy*uCD*?0cH-Y4(Q+c$6L&AfT@=FQ%ECzeVjgb;N?7%f6P5EJ6TM}%l-1MNB^WFS${ zks7mxqM1xQl`$ik)SXt$cCuDPx_>I37)y6{9Sk2#O=V)1Ihe7mtjLkuV=*h6H6u}b z!b|S7MyJNdt&BM^HEG9_mgkPaXlC59&4ZS0$0x_VH+9Domf06grwiy(n%Q;S&P2WJ zt_)S8N5p`YOxczx89e0nDLb{tmf}6sj;XAjN}4xWci)xDjCloIW%foV$ETv>)=ag% z+N5!q2dqge6Sd>1Nl%&Am@t~jf@XZyY#$qolQWty`_n|c()M0=lPnPhdP*X-GoFoR zvsQ96VPy)k4kS{ey0m2cL{WBceDY`!(Xr!PCw5%Xv3oa!C)4NwuLzYfLt8q!`%p7a zW%{DA{)1+pg}#L`Oj-#~UjLMxp0dsEL^Q9vBhlDV=oSO3fIkxHm_ZXBDvTsHv8Uf7 zf|(`M#4H~*F}p}jBq|xcc}0fD`yyT41r;k+IQZJL$)bi2SSND5pzku}sOXJn7t`@L z4)G#5y^wZ%tw`ZNCG_B2uW|TN(V+2rkTz=k38bqu{w&hf8h-`p8jZh&^c;bSCL+z@wbsSYy96xKc(;x z%f3+KTamK;fY9|gZIq}84IsT(<42Kh()fKyFVXn7k#5%b%Sg9q{7s~nYW#0VDFaYP zeVD|6Uyjo@iHf>wkzS_pKBU_s5!VGufcY=$;kYa{F!U-STd$sQ_oc&n=&g-0oiRVo! zBos|0o+=Y{oPEKZS}>F9`7>{3%=7-P;#*@vs-`s&9~EJjEc&eR=>Am7ZcWCZTzw(J zE@oSpG2Ba2T@FN(qqqmrT5O^@xZPT#o`2Yo4hXB`guO8P(( z2Yn#@CH*FSBz-IWAblnMG5s*-I6W5vn_plZ*=E+0^;$@vK225t2X%n;s%S%Xpch#c zUi$*?!(rgy%9iC3r*4s`4r~Fos=*+gz=9n;hrp#{7nzrL0)IUYr|ddvNtcnw7hD7y z2s99AV8v;`nF$T)7VFwLj{py^I7I{vo=F3oE6)OuglHLoUCgAVl}B^zqK)Acqs{;V z4FnnpG!SS&u1t%b76y6=G_Zm+kb4fif*S2@YOsd#Y9qiKM8nOgNvoV9^pE@UYv6FGgo3nM4e z+r1#|8S3aPC#Tx{5fm_RaG;~wa?0ILIfGrpgZS0b7u;WiX>Aydh0OBj(n4avwUV=Y zcL6!?vUYO(8&o?v>AddmXnkA z)mzQllaBdnu39)73VFQ+8btUalcB4kD_$8C|m~swDFWauzf; z9`&7aMc!+ZC2Q@UF{>E7gtgT?2CrIKC|}J zg2-XzS{EudE)%oXB0iAqNvG#ENEo3IfOrH_Ddp`Jrj;?paww;!Jx%YHvKiLJ|REceZBJw3yde?N`p@@Bc7 zp1Yg{T2C*i55)Hja+;hUOval_ZJk@f3MyZ(`K<;pcRT;#ShbuA*SS^8sc@ZJy&PXb zHPhQtTj$PEZ|*wR_ZO4u?JXy#!sigxwx`l{`yAy=!<9MD2mD5Awf2^ivwUJa^?bm8 zEKsPCa~=F%<7i@bsr0}8VP7u3oa6Im z)=0_mn;kuIMb&cr8|2QzRm<@WFKei`3ge_|+q2Z-*g3YxjV~*W`{pQT+Og|O-!ZCI zPMOtnxp#ZY<-6l_DgR!BuSe(!g5Q$}AkcuT0e%c58I4c6gq4WYZSD14@8L{aJl z<0m-}>(@ZM@l)_-kQLS-jlTn$@RPX1#A-BF9zUC?+Chl_S z0kX0*AWdYTzkkr%?1t{1-Y(=AIt}TxQKzeP+VF0DZp$Ta0rQ1lj)L2;i`Aog>nL6m zro(S-$7`~Y2zO$YmMsd~&yRT($M88{b<-V3{O%@Qghkwj;U(40+Fb$w84eY?( zZRjU#Ws-+M&0!L6TVF+hu;c^>rZW%|o69@G` zfX?JLbi}`k!+C7<4dC21j_?B<&T9cb0q$(l^Go2)YcszE&h6?5f5br@6aI;V+u;%Z zhof0y!eDva@)KZe$BEnI0SvZ_Ti^lY?k;-USfd97y=|;9415zgz;gsAZgU4P_<3Nx z^_p=vaBhzWFdoE-+wTF4Q#etN0OOlDnZ$rUjng)X3gdaCmudW`NLfFC@pGJDTLj}b zIB9=iu)RA;1^q*u^t>NpzqODWfWHO|C=MK3^iJ{!Cwb|DdjW*w;?f+SGc+Wxmycs( zXO7PqHbs0KH@k9t&ajhw?g<5ROtmxs!C#{=^2)oAkaOpPQV0F~J?nUjqhWih7aE+6Dhu)c|@O>5PLsuo`rO^a6WY<0+@^{oD=rAf|H4 z@zT%rl;fp;8T<_*Y0K>yFg-fZ1b#6MdKRgNzMgb5X=hna554IbTyFq>ynz0Jq9^!) zG!OrJ#DNVP(i!Uxaq{u+q&j%vpN2cM?lxX!BqhZ0%Hci;0WlAivOcKKv+$x z5JSZ475zcf*@@4G7@u!a^si&>>BQdJXtG zNk7&32yh+$A0kha;(wdE)N6r5e}Y`ChsSRQU9Ssn`wQ^TDgN*M9k^a2+};9Qmvdw% zaJ^o*eJ{%SgW`V$xU+URjC$4mP|^R)wT@m#L>a@sspv0t0M~1Z(I?P#7fSl69j8Ip z>x+qJfNOhr{b}HOtuX;R5t{#&UjWzZj)~s^*ZO(%BjB5H04CnXN$Kb0!(12W^~l8g zz+Y2x2TudnYm@kofR8Hr1^)rQ6$ju>=%fAvRsZMj2f-v&2ss=!D*9pSe48YTG}>49 zhAQVO_U~nio~7JYMPK_A@a>9jUx*>1`?2j`pzTofW4v!oGG%i-dZ6hgT(rQSfbR7J z$9AKf%}IMakx#!L{vq_4WI9{Gf1Ene<#>u0CtktT>SQ#5a=dWjbzD7}j23PKbNm44 aZIRxrElxi7HQ;((*7RTC+mhLQfAW8CO~+pV literal 0 HcmV?d00001 diff --git a/Patch Partition/BuildpDES/Ephemerboot Installer b/Patch Partition/BuildpDES/Ephemerboot Installer new file mode 100755 index 0000000000000000000000000000000000000000..3c4fd0eb0fc0aef20aaa2be0b0a58671d132f36e GIT binary patch literal 27748 zcmc(I4|r77weLFTOeP~n9PMDI5?~Ty8#Lxdjd~y>O#VOz2^e5d+Tv$IGMLi<Y~i+uE_kjxKB z{EW)_VInKJbaFUs?_B4JocoECBBGXnEZN@~y@_%!prkv{&-_VfAF|+EIo>Hqtw?w; z`;j`(_nh&Jf75^5*7}XN3dmhZ*1KD5^$jRr&(9d#R3tyrJfx*ak0Y%{dKM{;^gob( zj`S|lzagDRO3EaSL;5Td`b#B9_aRjwEkOD*QWH`;($|stk^Ua(J4pW(=>?=$kq#mK z66qw;ACNwgNzOr|$q9i$PY zGf1FW0bJ!qB+#rBB9$S{Mw*ZG2omU3)*}5K(jd|h(#uGDk={Uh8|l|bzel<#lLO;- z+=Apo`aIG-NHs{H)3FQ*@EmPO7{6mZ62|V>g0ur^7t(&DUmyXl;{&8WAzhX!=Xxa2 zm~$u6ETmc_@H3|wshhO{zt8bM4}P`E7m%tXq?;sJ&zy{)^my|t#HyMg95wT8{-F8X4)droV^>h@0j`*;^EZf<{qfd^Y!Te`#imY?Q! zhgU8NuLyUBfq%iOmCM7ORNcO+E%mYslyr4Bw6=yi8ydgb()M_;p$%9%t?EVL#&FB( zuvMEvD(DHeG=*(A7k9UJRH85FZuxrnk(Rcm_9w)E&Ek@driSitO-n;-`{Pv8($%oM zHOvG8S4;O7I~!Ke?6xMO5zTLifE%q}Zf^@y71+~e)&t!W^TTbcsv4NYmhL%VPZx2` z;&5xYv76=qt%+}L+vz$&E}qhMS_+T4F+jlR9Ceq+|aam zOJrzt~>+M8g^iwzoFT53g+RTq6iEn9?N}WRee%D~%CV&IaN-sOid@a91N$ z&K63-w`>I;%UwFj^)F7P^Lq%NE5ssti43Yv-qwI8X+k z=QERpLR#!F^rjkW4dsCm3dbXeF#rhy4DqBarLJmmcSHB8E}=%C&yKRSeR)G`s2vP! zXoaJJF&S-1XtFRg_S)$`%_Tn{lgPEPAUUiSP(Vjnb1Ba+(8C#%;7!6C)Lc z%8P0}IgIv~VnM3=P>W7nQ@M`3J==a1QR77Fu!Dkh;{&LV1ZmlAdL?BIK?LN^Ugk^b+7fU4Hb`ClR%mRKStcVUmKRe9P8X1#SM25-b7SX9V0Q7{^!k zT!G`WSK!Fkw~(LV_ndw?V#1z23R^De`S+J2GeCck$X5?~^v{w*n?Qj|ooOX$#!rym zk||nrIHInmvLJ=7D?wy~vFGtPD%T~Cn&T-~>t(?C%5MZ+nxJvg6*T5wL1VyQ-%+DB z&R(qQqzCEImqeehbN@$QAJgBX-%3<$@XgN4P5N8p;&Dd%Pq93}LwVuoILQ+SUi6a! zy<%LlNplnGWpx)h`re{EhO1qtJdZX({p;YxdL)chb5HD-k`1yxMlzQ$@*P?d3Zx`Ij@iXw$n9eJgpvqwn*$^e4%!DpE2u>8Cx> ze>u01VSwk#hIb9#0%tvV)2%i(HXFQICi-bY{>y$ihBxlwE9LLgZ!!3ye;fF>|2Cri zO7;Xvvg=oId>6?n-sOe`?}7Xbz4P|=!QMbi@6$}*SKekmL`Ps}z2Mv4KS6KizsWi5CdjtUH1+|0 zAK<3ZiGUivR+>=y*keuIk3Du*8C)Iw8q+vuwRma$WA_(&BN5X8{CU9tB_T^2t~4A5 zfHJzZl%t6;IOm_)?8C6X5o7%77S@3;+%^Q9LHhjf?BmLSOQkOeT*frLs-puzV3&C4G{Y>h zBx=Jm);3}di*T7{%VaZqM`VZiPwj|GMYYkaPy8(;P@M|iBzkEPcoz!N5@UWd z^u;p--Q+j`eO-VhvCd#z1JGC9?zj3tPZ~cJLHrQicEuRyv>>*NG&VQ1JswVRlliAX zCx!g#4cUQ*H(Y~<#Wd-v@C6b4&shF3o{a^U&KbJ-$xqmBgpWqN!}>Wd`N`J?6p}Q` zT~*0*@`6iDL$qV_ya0A17^8g*ttRuGmdn}75GS_ofqZt@kYuEkv>^d zWDnOHx+QxtZ@cZfm8Mr>PLzgCUuew>BDg2p&yqKEmNMB4>?IMT#jo(V5c9~7>~+qJ zZWDgpUk^A#ITX|oYC{e_b6)phyc{cg@$Nx>hjQMJ-lqlZ$Mo&+^Etv!@>oyc?}trW z5x(6%o-DSqjXo!I`Qi4~RV%~udH*Ba^iZ4OSa&xh&k7rPa$-c=G&Q2VatC6idxU)( zx}5Bom%R82%MWz1zW%|~XHT^8T@k;}OJ4Z7O$S=p?x81+AWdCws}H@u=VvB`PPS6y_bE#N8hrI)Bgf|Wfbq`B|n}7|HM4JTkr_HfvrEx{MoRDmTlNW z^@u-CrflabzOxTBrHvc5kKazZMd$>Ulw!nKGIqCcKx&Oo+l_H?JUV7hfPTlBcJR5y zoOivT)z5PR$2@FrkT1`N&ES2#6@Lmn&FssYOj<0POVPrFTJ&7S-oWQSPs+gO5YJiQ zA!1eEr8GWop#@AY`2Q35T-HBhu99dGc#FB}p&L@XO~EKw^B2xhI}l%+F=lE=yx+pZ zO8uuLs^H8j~;Cruw+C-Iit;|wm#|aG9V-tOq{@J?46V`HQ*SF)w+(B@rbjWOyxpmQy~~$1QL? zt2-C57_(y|nhr)in@f3qh)r`+UMa_gi!xD-CZ|4|1!T1#YMZK*f+?RK`u>HTnfLqs-v!IEOExVwN70+_aU*#mbQM4 zsVCVclM7kTgY=;A&)`P{IxY4KY`7{RGX9m(L~DJV#)Z@Z*%tqs@Gt+-g#R73oom9+ zPpywLBCx?X<@n)Ub{S@%xd=4F201jkfpV8<%vdWSK0p8JyN3yaW3>>)lf(myk?jU4=(aL{SY!FcewpK+Yw)ZXI?p`o#yopfrlt5bc0RZ=zDOXx_!jK{ zh?sl#{V5X5hffF3)Dvuv|31x#B`z-H+~R@dTX|22&f@vPEp?^) z_bdHT4DuOdde|2YOeR+`GypMUGs|pV@{iNaxymo*ANUD>{fbsqS=BZ4DrAZ^BlOyj zbt4{X64o=P zu6jvh-I7KV5;Cj}Cu5!V5zkrJgKfeZN8yfZ>Yn6rwvmco zI}bA+b-D9kh3wp4QRqBdQRN(|SnfPsvCes>;yLHJir1VcX1wM+#Pc-!@QnqRV}qN; ze2F#R0}{&|{m-k7bO_JFKOp}c*CU^1=F`o5u4oVb;N23ltfMUUrI3HkR=1YRe!XUq z+W+t(yj#!D$iF4(>l-@M#*R)S&h-nproM@}W)L?U(6-m;1KB`sT!%f7PPMV&akJk| z{NC(WtK$}ds^2(*bure&GX);OpE$#s`F(DyFPAQ=`mDIw#-NvZDB8>t<3yVaHaPPI zy?T3tf4Cv6g(pVT6|1||{*DfH82v^V_AJ3K^gD0sH^J=Jl-{qsakSq|WByt$og3}< zz`q#%zP2j8UrV>G-w(MB^z?u+zGM@WS~fw@2NFqK*(ZAr5AnV&7@i z$DTCmEI7hn;T*$XUvoBwn-D@bbUw40DfoePKH@#+&jzrjWZSpu;h*2cIYJQWnE@{m zY*~g~@5G@S_Jd*9x;SSj<}(uL(@TP84RP>y0T1UbAZd=?gczfd&n~X}5}$wch&=$D zzm4QF42As!_F*4I%;VP4m;3QpOqfE?bn`i1r#V5I@v*>zI@3Q7>EHpE0m}_uKqfgq z2D}*a1?4R$_v6flX%u>+g9rQ!5OerUfa!zZnjWIuC)rnF+~2p+n%8scWvoGzm-IF0 z$NX-@{+B{^F+8Ks?!dZa!hr8LGqgr3)mnI*4j<;eMd_nTLC?^;O`fum{!1=l%bHA_;ypQ3% zU!QErLehEv2JL?*bcpf8p7kFv{eEF*?C&bqNlSTNR^u3RuYfPwo9{sHxV3=I`*?QP zI79HK?1^Q}eX%zQeKhLPhu4UHeuuLW){S!}{5P4N!6?%~C&0IdLzMFejPWSiKNwP+ zGXdkEF-GYm+U!KE0lPH#hUXz}XM;NkJ2CVNxS+2%kMgIUA;+hoD=PZ=>!DMu)2yq& zmoIQTaxbfnWKt7)F#S4{S1RiU>j3v<{uHAO-QQ>EvtRgoG44K&hy80rKj24sJ(pQ8 z)vqU$kU8rG#~L2s!P7 zmxyEd4gaioRMkn}!23Zxm}BC&1SjH$%frT6#L%CLlM?YBka3PRqkw5vpOZIoo%Z}4 z5wq>HqQ0Jb0h7n}9r3&z@d9iOYh}n-!WvQv*ke^&%u}fwvD(vgL+Kn`3~Q}wkAP;e z{7=#A*Qu9ji;@KY^d8z|;r9&r0zaZWFIqvhwh+`(}0ow^|e5DvGWRJ2TUvsS1 z+9Yk9#-7JM8edw|UfsTOCGI$3pshkM=0BD{!~C-!_Y)-ev*V^e6LA&R=kdWNF~)L? z+s$_vkn>oAC@UxjP%f!hCx5G=p2{Huy&}MJp<>ki1M1pP*NZy%B={$z9oMbnIzH3G zSPg&nob!m@2LNI2f3MK{QNK;K`m199+ns>^W3T&Wj zJQH)-Wt3-fdvX7uSG1eSHWCekr@Hh7=sf5u{|WQehO5lbHKX3Ix3uYN(dQf3ciq+$ zW|^A(ek}Usvp*4M4*B5YIc}>vP$%rSe2b77^fgHL%;xeV0deN#0UX9H^cTEwo6n*> z?5o6YEXfN#c7u9JE8SY;S)3&O80_))tHOGt?KCbSe8t{8A(`NWsaRz!CJgDLM1@8piws!~g%^0HuRRAwFhwRB0vBBMj z|3w}8Ok;Qz7~?FQg=2gnJqo_%CzI^&fm7x46|injFL=fK@7mAqVH>YeU+MC#b;+LT zmE@o9o=qHE84(Bj$MrNG_@ONbiKTO`rkP?zxwaS`c2+B@Fd#QJMXGoC+|ScXK%$r zI8YFC=0@B#*@Fq5?t433ZVJ!q`}lkW@_l~BFy@N}DT2M~xmKJ8AH(ZG1@rZJ^%mGX zuG~Jn*FB@6K#D|f-5cRJAv*n5Pt=R_W!Zzh-~{-&kz*>H_eoe+Cjfh2knUb0aGP-@ z;9lT%SgWsv-{gB<$5_@Pu7nRYbfoMh?gP4~+xwy|;xxI5V+Fua^<4;xpi|h}{YO5- z>e*iCNld`IZxQbiUWiQ~d0-3d8fTAyCH#ktr}-*j+!Np*JR+Z|dqrOLy$@+R^O*I8 z`OL8-uPd0h_WsQ0=$v0h^g+8nWAKZm;&>{HiK2yI!$ULoV3V4Q==i@;mSd>Z8= z;(G9f_eg^DS7JWkvFMw?8(YlZvsL!Ycq^HFc-Z9!KbLBKa_Pgv?in~+jR0Tis0?wI zx`z^0JH$i#Fh7&FS1FzG7D-kg?58BOK8g26&3K%4@;I;&xdZv+O8rtC@8X91|FBkD zE#x0#x_bJy@|@3h{EQfj#4Nr!t6I7rYQsJ1mab;*X#UVf97mVGEs$`3LO(+^tx1%Kig1MkUTkDd4TW7}}P z?x358FfQz?-hvob*7|TK%0Xq=Z$+$HdV|o5tB<*srj^cF-0?-++!s4lygg+TPv#vf zE53nWKEP*W8tzB(nvKtH1dSy2jYbCZ!Mk3Lt4buMr2_NBtl{Pr(CHztLfir1dx-G8 zm@7*RdV8sc;i#{6`7oaaAjdnouj%J`EezR8;=ZG8O&EfF=D^Ns{PE@$ph4U-#k|Zg zUgSN9=|tm#bjKc{6Ah^Ar6BIg{1CQ){A>Zo{jd#V-w1S9JV{bqBK46*#EQJ;?M;Sk z_}JHj4%!qAi1l3#`gXuq4Iti>P=?7^qH&q+)33C3J=C^aN{%oMe3#aKzeGz` zL|8UVTa<<`gl=`rjix10mIzD`ha~FOXeKcz6?Iv_+F{InDbH{?)I>p;8YFPvs3L{*}zvhxWVXp z7&a}|62qv&IzqFZC#m6~&8Cjv?o#O%rp2#gZO3cprY(c06Z4y;yfw3jqlo+ z_1F`L4zq7cz9D1+9OjveICrzJJArxgQblC#CQFSrGK)v%eW!Zqz}}<+y|2 z!G0F^@G*~0trR>oY|#sPRb!na<}qndmcOm9ljAc+;Nt)j`tHNn>a_Ks0pAv2PrwEH zVO+%w`ckB_P*RY%39N{o>&z0?M7xvH+3|QJHR%0^#Wc$InhRZV*=Yc z0(e2d!Ja#PS~%WJa9~HN^^dhbBW$7{V@3+;|C|i<|6bLaymg@6h3_;j==N_lFb4i% zjb-@_5eGAj0oXbA^n19R(l5+aJil474q`%=X{YXiZD=3oeHg^aESJsXWf*Imn*}ym4<`h745SA@Y?t$+y;5To)Sls=oawe_>u^E%q1# zI_aU|GfDQHkk!%yxkSfZvKP4vxevJ;c`z=)gypLx+BUSvx~VL;G*|ckP4fi1xwd4h`%n z7{_Ds-KUKN>q>x2`&YGY37$j0q5FIX@O($7KR5av=k+o48@zhYu;(0%MNtN0Ta`^5yI6A? z`x~*QvE7$9eNMdZB5Zz&h;eE;e&;=L>{Z`n~uZ%kcQ$-vPyzD<*xF^7ET~=H8EN<&G+pgi5%4|E%Xq$TiXDr~6nD_D-c1XdV zq@sAWi8z<0+-}hCW_bJ#^Ui-m-72;(3kT{QHXO$K-Jr+95wYW7nzG^GcbRaY-U%Gz zjByl-eGGFPr|- zzUL9JK4*hvj@_wkokfnVkC9XVo)Xt?J^0p86yF6pcrTytfEeH2MsFRi15GYo4;!!w z#QL;idNNspHE?Bba>N{Oo-tl$QQs_b_D!L20E6JWoP&%A+W752$F9^kVToI8-O9{4JflSgXto!^tmS`B~NSn#OVK?8s%jreih|%`) z`?j{Kt*wf-7=O+ZHOl7=xtB0D(r1b9pn%VH39^pp1<(=R>&1BN@ut{6N&lXySe2c; zAHw>ThjJO0`THi`tKf5-AYFfubKpr^hg)#T{8{qk^L}gX44C*{%2~$nV!IKqVjmvx ztnc5h4sQtijq9dHbi~fujeqoM`|sg<1RM3OGWI+vr)j%RTDzz&O=+} z;X`}n1BXt@M-MCV@xxQ)k;B#UnZu3pxx;<(g~MAFI=okL9X_SF*Ft9IIKApt8FpU$ zO*c7fc+5OjeX6oeZ^SwRJ^*J=nfJ%Ce{YHJJpS~I{)!UkGa_Dx>ywlO?@jUE8Ol45 zJCMJ~`)C_ZBWB0<6woIJ?i_dqUX#Dgf0qUOYc1LA$*vQYKCpfBzPPCqI_Mw5UNFAJ zIm_P%`HP`H#yZAX$@e(Z)-jXKb03G8! zJihbFXQKHi7oiL!d_GNiDBp;B=wQyXcoutuOb1}>fgjj~F)U->2UbZ#A!m$_ zrXj&^N&f^GDW7HUi>BhdBzpKy5%#gsv!A5)5MifY=wH4z6LZHF@`VcMzHjfjNEOiA zS9UA4&qkHlvzwKTTD^-74~t=w6YZi=O)U4Q;sU`KJBwvBTBR z!v{Ik-RzI1eUs-k_C;^MCl9=xlwgn^bs4@tJ zEw)+VyL?`hcOcJ4oh*?ufafd;S#3BvbZ3|2OjZ|3AJz@443aEPciK zg>}yCv&D-zr&P@K_e~#)c)d@7Uf2bnHNi0Ptq9@< z-rwpKX9qW}7x*yeW51fu+D=%u!+ZEFFFS0@en#OsKD63fZCRe9?`gu--uJGPw*~1Y zWBr$9%yxKaKNKYQFRsQT_S4!^Q`hi4E%+urLlEE5@m@CkRUPU=Ph*c14ou z4|2O1riMLKhRLxg^VxdO?Zta;hc>`hTarr!41;CFaVyId-6+4G###8`dyZ;4_VO7Q z=w=$wek8UYcr8Alp5L4A&U3r5&%n*|ONuUapEwI^VtmXyvpw_AYvM6@3AlovfQh@* z-6ameV{xyF$H)C`y!PO|!E;+b(8YBr+yi}prKjznmuB!JUyG+` zH@=^=U~e^WYunQL9J6>2(!|eZKL@Osi0@CBI-THo3$gLx5Hd3zS)H>WL)3aZOp=73?7;|#Q!e#kv```bw@L@hU!uTp)a~-j8fleRzlfYSQGF0!L0e&RbZsz^9 z>sK-!U6vEDN8VpP(fb2K$4xrsr|1xOoUXe;v^Vu76CKPu{#o=`V=tLJ%F9X}{&g}r z16b4Y-3-vztS)yQe+1`jynpzQX9_hE11Z^RhtVLw-)n|TAj%CvaV)H=^e`KPB9lAhiMpN=~P@Ij~fdq39S-gQ!b zjClyZpx0tw5@(tG4Ik=bnd>Q-r9P0QK9r??SC;yxv(z_dsqe^KFAZd=FUnj`C$iM{ zXQ{8tQcqdxy_xH!c;e&C61MI&;00WxTW_OM5L#eHQ*>&6%0b{LJ;z#?19}AWQv`%=JV+3d)b1x`oidK$=5zbs3A7W<;( zS=z@k*GpO8OZ8dWZ_8Xy!YGS}lyLuS2wF-v_GdZeZ-?X!%FYO}P@qPJ9& zrF|B>Qg@d2`?A!Z$x?qYOMN19y+oPoX)trWv?Fsp?w(|p%dyP$Qfrp_EN~=G=JvEP zbG_utQlHK4vdBx)v%tyAQokv4J!O+`Ha#E73`ZKuTu<5P^k!}^1vA&v&dl{vZRUE) zGF~Z^xxM7bTu)l&dZ|29Jwi$GF1e-336&Vo9WeMbF)4qG{fa%>}@LW_JN}ltO^Stw*^RQClbUVv(_vIc?YMncr57rMqw$pXaQCL6h zEOY_j&90-aW6F!lK1Yc&;PmChaw0i(Iey0x$J5ST&f44~uHzEr6)JwYP$?f*cuU|Z z`7;v&o(_-uGl|dC-ISO%GBrLeetV)MHh*OP(K+tfi3J@C>J}vy)fFxpaTEmPspWuB zFitM`rc_wwmI}(m|4;}>1qrF(R=MD5XF<7C7&VyU3jYVSfbpZFgNW#WJN za>0Lb;#0Ch^%=Q9mG2b)*A|b}HFP)PgB|7bIi-u++t%b2$}g^ybL129G5LtRPu}G! zluxHskgsscu61(Nq$5*yO+Gzk7yjFb?mU7Oca8xeLxhNMpUCu(KME)x! zKMm)41+A!1DU$C{JSn230!i`}WFHCsABfr;3knniEdvxaSCZk>L54HtD0Fs!gh8Zj NAfpz@YEr$V{{xS|TUh`A literal 0 HcmV?d00001 diff --git a/Patch Partition/BuildpDES/TemplatepDES.rsrc b/Patch Partition/BuildpDES/TemplatepDES.rsrc new file mode 100755 index 0000000..e69de29 diff --git a/Patch Partition/Ephemerboot Data/CWSettingsMacOS.stg b/Patch Partition/Ephemerboot Data/CWSettingsMacOS.stg new file mode 100755 index 0000000000000000000000000000000000000000..09bbfee45d09f16ba65d9564af26d973147e8130 GIT binary patch literal 4158 zcmeHKF>ljA6na@dm6$Xou`T-yj2U2H zp`G{vEQ~NPS7K$Tii8*t8w(5wBm^tGJD+8zDx#zv5b~4k_uad9@1DOq`<>g4(+2<< zfXo3*JqDQGK|Dm;Ng@$cq14QFy{R=kXVYp^t!Yu(v%7xO`~T~hiSeGbe9txQj@8jB zo)fs*O3$aTW_n$VavU=nQCxD`!N9T;T3S4N_>!o@f8{Qqu(;B92 zu_a9x-j$r|Q2(xp?x~~kh&vf-C# zzoTEPmP=01jR*X;1B=a(i$^@oScq(}YC7<#H#$6vb}~f!zF(o-NAzQMd(@x({X$_t z1NKjwcqj$qz#RJbM*Y{KI8k?I4)t8}B&MxC7ZExO$2 j{*Ru##6EEnnp#Kvircqtzd%Tua? literal 0 HcmV?d00001 diff --git a/Patch Partition/Ephemerboot Data/MegaBoot/TargetDataMacOS.tdt b/Patch Partition/Ephemerboot Data/MegaBoot/TargetDataMacOS.tdt new file mode 100755 index 0000000000000000000000000000000000000000..7a1b0a909449791da299c8ac2b82669e9add197a GIT binary patch literal 159911 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ⅇn$ChFDy!&ky=Nno`PGO& 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 +#include +#include +#include + +#pragma parameter __D0 VMMap( __A0, __A1 ) +OSErr VMMap( UInt32 log, UInt32 phys ) TWOWORDINLINE( 0x7007, 0xfe0a ); +#pragma parameter __D0 VMUnmap( __A0, __A1 ) +OSErr VMUnmap( UInt32 log, UInt32 valid ) TWOWORDINLINE( 0x7008, 0xfe0a ); + +Ptr gWindowStor; +UInt32 gWindowPage; +Ptr gDiskWindowPtr; +Ptr gSumWindowPtr, gSum2WindowPtr; + +struct { + UInt8 flags[4]; + DrvQEl dqe; +} gMyDQE; +UInt32 gActualSize = 0; + +typedef struct PhysRun { + UInt32 startPage; + UInt32 numBytes; +} PhysRun; + +PhysRun *gRuns; +UInt32 gNumRuns; + +enum { + kPageSize = 0x1000, + kPageBits = 0xfffff000, + + kSumBoxVolume = kPageSize, // one page per sum box + kSumBoxVolumeLog2 = 12, + kSumBoxSide = 8, // box is square array of lattices + kSumBoxSideLog2 = 3, + kSumBoxDimensions = 4, // plus one more for depth + kSumBoxDepth = 1, // bytes, tho the true depth is in bits + + kSumBytesPerPage = kSumBoxSide * kSumBoxDimensions * kSumBoxDepth, + kSumRatio = kSumBoxVolume / kSumBytesPerPage, + + kMaxDimensions = kSumBoxDimensions +}; +Ptr gCurSumPtr; +UInt32 gCurSumPhys; +UInt32 gSumBase; + +Ptr gCurSum2Ptr; +UInt32 gCurSum2Phys; +UInt32 gSum2Base; + +Ptr gCurSum3Ptr; +Ptr gSum3Ptr; +UInt32 gSum3Size; +Ptr gSum3Str; +UInt32 gSum3StrSize; + + +const char gTreeChosen[] = "Devices:device-tree:chosen"; +const char gPhysRunsProp[] = "ramboot-phys-ranges"; + +const char gTreeOptions[] = "Devices:device-tree:options"; +const char gSumPropertyName[] = "ramboot-checksum"; +RegEntryID gOptionsEntry; + + +extern pascal OSErr main(void); + +extern void DriverHeader(); +extern OSErr DriverOpen(); +extern OSErr DriverClose(); +extern OSErr DriverPrime( IOParamPtr:__a0, DCtlPtr:__a1 ); +extern OSErr DriverStatus( CntrlParamPtr:__a0, DCtlPtr:__a1 ); +extern OSErr DriverControl( CntrlParamPtr:__a0, DCtlPtr:__a1 ); + +extern pascal OSErr GestaltProc( UInt32, SInt32 * ); + +extern void MapDisk( UInt32, Boolean ); +extern void UnmapDisk( void ); + +extern void WriteDiskChecksum( void ); +extern void MakeDiskChecksum( Ptr in, Ptr out ); +extern void MakeChecksum( Ptr in, Ptr out, UInt32 side, int dimensions ); +extern void CorrectDisk( Ptr, Ptr, Ptr, UInt32, int ); + + +extern void PrintHex( UInt32, int ); +void PrintHex( UInt32 num, int size ) { + char out[8]; + int ccnt = size; + + while ( ccnt-- > 0 ) { + int nibble; + + nibble = ( num >> ( ccnt * 4 ) ) & 0xf; + out[7-ccnt] = (nibble<10)? nibble+'0' : nibble-10+'a'; + } + + ISDebugText( (UInt8 *) out + 8 - size, size ); +} + + +extern pascal OSErr main() { + OSErr err = noErr; + SInt16 myRN; + Boolean diskInited; + SInt32 dl; + + EnterCodeResource(); + + InitInterruptSafeDebug(); + ISDebugStr( "\pRAMB05" ); + + if ( GetToolTrapAddress( 0xabe9 ) == GetToolTrapAddress( _Unimplemented ) ) err = paramErr; + + if ( err == noErr ) { + OSErr gerr; + gerr = Gestalt( '¨mb0', &dl ); + + if ( gerr == noErr ) { + ISDebugStr( "\pRAMBoot: deferred by Gestalt" ); + err = paramErr; + + } else err = NewGestalt( '¨mb0', &GestaltProc ); + } + + if ( err == noErr ) { + RegEntryID chosenRE; + + RegistryEntryIDInit( &chosenRE ); + + { + err = RegistryCStrEntryLookup( NULL, gTreeChosen, &chosenRE ); + } + + if ( err == noErr ) { + err = RegistryPropertyGetSize( &chosenRE, gPhysRunsProp, &gNumRuns ); + + if ( err ) ISDebugStr( "\pRAMBoot: RAM disk space not reserved. Please reinstall." ); + } + + if ( err == noErr ) { + gRuns = (PhysRun *) NewPtrSys( gNumRuns ); + err = MemError(); + } + + if ( err == noErr ) { + int rcnt; + + err = RegistryPropertyGet( &chosenRE, gPhysRunsProp, gRuns, &gNumRuns ); + gNumRuns /= sizeof( PhysRun ); + + for ( rcnt = 0; rcnt < gNumRuns; rcnt++ ) { + gRuns[rcnt].startPage /= 0x1000; + } + + for ( rcnt = 0; rcnt < gNumRuns; rcnt++ ) { + gActualSize += gRuns[rcnt].numBytes; + } + } + + RegistryEntryIDDispose( &chosenRE ); + } + + if ( err == noErr ) { + gWindowStor = NewPtrSys( kPageSize * 4 - 1 ); // 3 pages + padding + err = MemError(); + + if ( err == noErr ) { + gDiskWindowPtr = (Ptr) ( ( (UInt32) gWindowStor + kPageSize-1 ) & kPageBits ); + LockMemory( gDiskWindowPtr, kPageSize * 3 ); + gWindowPage = (UInt32) gDiskWindowPtr / kPageSize; + PrintHex( gWindowPage, 8 ); + + gSumWindowPtr = gDiskWindowPtr + kPageSize; + gSum2WindowPtr = gSumWindowPtr + kPageSize; + } + + if ( err == noErr ) { + PhysRun *lastRun = &gRuns[gNumRuns-1]; + UInt32 sumSize, sum2Size; + + #define PaddedSumSize( x ) ( ( ( ( ( x + kPageSize-1 ) / kPageSize ) * kSumBytesPerPage ) + kPageSize-1 ) & kPageBits ) + + sumSize = PaddedSumSize( gActualSize - ( gActualSize / kSumRatio ) ); + sum2Size = PaddedSumSize( sumSize ); + + gActualSize -= sumSize + sum2Size; + lastRun->numBytes -= sumSize + sum2Size; + + gSumBase = ( lastRun->startPage * kPageSize ) + lastRun->numBytes; + gSum2Base = gSumBase + sumSize; + + gSum3Size = ( sum2Size / kPageSize ) * kSumBytesPerPage;// PaddedSumSize( sum2Size ); + gSum3StrSize = gSum3Size * 2; + PrintHex( gSum3StrSize, 4 ); + + #undef PaddedSumSize + } + + if ( err == noErr ) { + RegistryEntryIDInit( &gOptionsEntry ); + + if ( err == noErr ) { + err = RegistryCStrEntryLookup( NULL, gTreeOptions, &gOptionsEntry ); + } + + if ( err == noErr ) { + gSum3Ptr = NewPtrSysClear( gSum3Size ); + err = MemError(); + } + + if ( err == noErr ) { + gSum3Str = NewPtrSysClear( gSum3StrSize ); + err = MemError(); + } + + if ( err == noErr ) { + UInt32 actSize = gSum3StrSize; + err = RegistryPropertyGet( &gOptionsEntry, gSumPropertyName, gSum3Str, &actSize ); + + if ( err==noErr && actSize != gSum3StrSize ) { + ISDebugStr( "\pSum3 size changed?!" ); + PrintHex( actSize, 4 ); + } + } + + if ( err == noErr ) { + int bcnt; + Ptr pen = gSum3Str; + + for ( bcnt = 0; bcnt < gSum3Size; bcnt++ ) { + int nibble = *pen++; + nibble -= nibble>='a'? 'a'-10 : '0'; + gSum3Ptr[bcnt] = nibble << 4; + + nibble = *pen++; + nibble -= nibble>='a'? 'a'-10 : '0'; + gSum3Ptr[bcnt] |= nibble; + } + } + + if ( err == nrNotFoundErr ) { + err = noErr; + diskInited = false; + ISDebugStr( "\pRAMBoot: Master checksum not found. RAM disk data may be damaged." ); + } else diskInited = true; + } + } + + if ( err == noErr /*&& diskInited*/ ) { + UInt32 bcnt; + char badSum[ kSumBytesPerPage ]; + + UnmapDisk(); + + if ( diskInited ) { + ISDebugStr( "\pCorrecting checksum l2" ); + for ( bcnt = 0; bcnt < gActualSize; bcnt += kPageSize * kSumRatio * kSumRatio ) { + MapDisk( bcnt, true ); + + MakeDiskChecksum( gSum2WindowPtr, badSum ); + PrintHex( *(UInt32*) gCurSum3Ptr, 8 ); + PrintHex( *(UInt32*) badSum, 8 ); + CorrectDisk( gSum2WindowPtr, gCurSum3Ptr, badSum, kSumBoxSide, kSumBoxDimensions ); + + UnmapDisk(); + } + } + + ISDebugStr( "\pCorrecting checksum l1" ); + for ( bcnt = 0; bcnt < gActualSize; bcnt += kPageSize * kSumRatio ) { + MapDisk( bcnt, true ); + + MakeDiskChecksum( gSumWindowPtr, badSum ); + CorrectDisk( gSumWindowPtr, gCurSum2Ptr, badSum, kSumBoxSide, kSumBoxDimensions ); + + UnmapDisk(); + } + + ISDebugStr( "\pCorrecting disk" ); + for ( bcnt = 0; bcnt < gActualSize; bcnt += kPageSize ) { + MapDisk( bcnt, true ); + + MakeDiskChecksum( gDiskWindowPtr, badSum ); + PrintHex( *(UInt32*) badSum, 8 ); + CorrectDisk( gDiskWindowPtr, gCurSumPtr, badSum, kSumBoxSide, kSumBoxDimensions ); + + UnmapDisk(); + } + } + + if ( err == noErr ) { + gActualSize /= 512; + err = TradInstallDriverFromPtr( (DRVRHeaderPtr) &DriverHeader, 48, 127, &myRN ); + } + + if ( err == noErr ) { + ISDebugStr( "\pinstalled drvr" ); + err = OpenDriver( "\p.RAMB0", &myRN ); + } + + if ( err == noErr ) { // find the boot drive & link in after it + gMyDQE.flags[0] = 0; // unlocked + gMyDQE.flags[1] = 8; // nonejectable + gMyDQE.flags[2] = 0; // reserved + gMyDQE.flags[3] = 0; // n/a + gMyDQE.dqe.dQDrive = MoreFindFreeDriveNumber( 8 ); + gMyDQE.dqe.dQRefNum = myRN; + gMyDQE.dqe.dQFSID = 0; + gMyDQE.dqe.qType = 1; + gMyDQE.dqe.dQDrvSz = (UInt16) gActualSize; + gMyDQE.dqe.dQDrvSz2 = (UInt32) gActualSize >> 16; + + Enqueue( (QElemPtr) &gMyDQE.dqe, GetDrvQHdr() ); + + if ( /*!LMGetBootDrive() &&diskInited */true ) { + ISDebugStr( "\pSet boot" ); + LMSetBootDrive( gMyDQE.dqe.dQDrive ); + } + ISDebugStr( "\pLoaded drvr" ); + } + + ExitCodeResource(); + + return noErr; +} + + +asm void DriverHeader() { + dc.w dNeedLockMask | dStatEnableMask | dCtlEnableMask | dReadEnableMask | dWritEnableMask | dNeedTimeMask + dc.w 0 // delay + dc.w 0 // evt mask + dc.w 0 // menu + + dc.w 0x1a + dc.w 0x1e + dc.w 0x28 + dc.w 0x32 + dc.w 0x3c + + dc.b "\p.RAMB0" + +@open: + jmp DriverOpen +@prime: + movem.l a0/a1, -(sp) + jsr DriverPrime + bra.s @finish +@control: + movem.l a0/a1, -(sp) + jsr DriverControl + bra.s @finish +@status: + movem.l a0/a1, -(sp) + jsr DriverStatus + bra.s @finish +@close: + jmp DriverClose + +@finish: + movem.l (sp)+, a0/a1 + move.w 6 (a0), d1 // PB.ioTrap + btst # noQueueBit, d1 + bne.s @rtn + + move.l 0x8fc, -(sp) // jIODone + +@rtn: + move.w d0, 0x10 (a0) // PB.ioResult + rts +} + + +extern OSErr DriverOpen() { + return noErr; +} + + +extern OSErr DriverPrime( IOParamPtr pb:__a0, DCtlPtr dce:__a1 ) { + OSErr err = noErr; + UInt32 ioPen; + int bcnt; + + EnterCodeResource(); + //ISDebugStr( ( pb->ioTrap & 0xff ) == aRdCmd? "\pR" : (/*Debugger(),*/ "\pW") ); + + pb->ioActCount = 0; + + while ( pb->ioActCount < pb->ioReqCount ) { + UInt32 maxTrans, actTrans; + Ptr disk, buff; + Boolean read; + + read = ( pb->ioTrap & 0xff ) == aRdCmd; + ioPen = dce->dCtlPosition + pb->ioActCount; + + MapDisk( ioPen, !read ); + + maxTrans = kPageSize - ( ioPen & (kPageSize-1) ); + actTrans = pb->ioReqCount - pb->ioActCount; + actTrans = (maxTransioBuffer + pb->ioActCount; + + //PrintHex( actTrans, 4 ); + //PrintHex( ioPen, 8 ); + //PrintHex( gRuns[bcnt].startPage + ( ioPen >> 12 ), 5 ); + //ISDebugText( (UInt8*) disk, 200 ); + //ISDebugText( (UInt8*) buff, 4 ); + + if ( read ) { + BlockMoveData( disk, buff, actTrans ); + } else { + BlockMoveData( buff, disk, actTrans ); + WriteDiskChecksum(); + } + + UnmapDisk(); + + pb->ioActCount += actTrans; + } + //ISDebugStr( "\pDone" ); + if ( err ) ISDebugStr( "\p(err)" ); + ExitCodeResource(); + return err; +} + + +extern OSErr DriverControl( CntrlParamPtr pb:__a0, DCtlPtr dce:__a1 ) { + OSErr err; + + EnterCodeResource(); + //ISDebugStr( "\pC" ); + + switch( pb->csCode ) { + case kFormat: { + { + gSum3Ptr = NewPtrSysClear( gSum3Size ); + err = MemError(); + + if ( err == noErr ) { + RegistryPropertyDelete( &gOptionsEntry, gSumPropertyName ); + err = RegistryPropertyCreate( &gOptionsEntry, gSumPropertyName, gSum3Ptr, gSum3Size ); + } + } + + if ( err == noErr ) { + UInt32 pcnt, lcnt; + + for ( pcnt = 0; pcnt < gActualSize * 512; pcnt += kPageSize ) { + MapDisk( pcnt, true ); + for ( lcnt = 0; lcnt < kPageSize; lcnt += sizeof(long) ) * (UInt32 *) &gDiskWindowPtr[lcnt] = 0; + UnmapDisk(); + } + + for ( pcnt = 0; pcnt < gActualSize * 512; pcnt += kPageSize * kSumRatio ) { + MapDisk( pcnt, true ); + for ( lcnt = 0; lcnt < kPageSize; lcnt += sizeof(long) ) * (UInt32 *) &gSumWindowPtr[lcnt] = 0; + UnmapDisk(); + } + + for ( pcnt = 0; pcnt < gActualSize * 512; pcnt += kPageSize * kSumRatio * kSumRatio ) { + MapDisk( pcnt, true ); + for ( lcnt = 0; lcnt < kPageSize; lcnt += sizeof(long) ) * (UInt32 *) &gSum2WindowPtr[lcnt] = 0; + UnmapDisk(); + } + + } + break; + } + case kVerify: + err = noErr; + break; + case accRun: + err = PostEvent( diskEvt, gMyDQE.dqe.dQDrive ); + dce->dCtlFlags &= ~dNeedTimeMask; + break; + default: + PrintHex( pb->csCode, 4 ); + err = controlErr; break; + } + + ExitCodeResource(); + return err; +} + +extern OSErr DriverStatus( CntrlParamPtr pb:__a0, DCtlPtr dce:__a1 ) { + OSErr err; + + EnterCodeResource(); + //ISDebugStr( "\pS" ); + + switch( pb->csCode ) { + case kReturnFormatList: + pb->csParam[0] = 1; + (* (UInt32 **) &pb->csParam[1])[0] = gActualSize; + (* (UInt32 **) &pb->csParam[1])[1] = 0; + err = noErr; break; + default: + PrintHex( pb->csCode, 4 ); + err = statusErr; break; + } + + ExitCodeResource(); + return err; +} + +extern OSErr DriverClose() { + return noErr; +} + +extern pascal OSErr GestaltProc( UInt32, SInt32 *resp ) { + *resp = 0; + return noErr; +} + + +extern void MapDisk( UInt32 pos, Boolean sumToo ) { + { + int bcnt; + UInt32 pen; + + for ( bcnt = 0, pen = pos; bcnt < gNumRuns && gRuns[bcnt].numBytes <= pen; bcnt++ ) { + pen -= gRuns[bcnt].numBytes; + } + if ( bcnt == gNumRuns ) { + return; + } + + VMMap( gWindowPage, gRuns[bcnt].startPage + ( pen / kPageSize ) ); + } + + if ( sumToo ) { + UInt32 sumPos, sum2Pos; + { + sumPos = ( pos / kPageSize ) * kSumBytesPerPage; + gCurSumPhys = gSumBase + sumPos; + + VMMap( gWindowPage + 1, gCurSumPhys / kPageSize ); + gCurSumPtr = gSumWindowPtr + ( gCurSumPhys & (kPageSize-1) ); + } + + { + sum2Pos = ( sumPos / kPageSize ) * kSumBytesPerPage; + gCurSum2Phys = gSum2Base + sum2Pos; + + VMMap( gWindowPage + 2, gCurSum2Phys / kPageSize ); + gCurSum2Ptr = gSum2WindowPtr + ( gCurSum2Phys & (kPageSize-1) ); + } + + { + gCurSum3Ptr = gSum3Ptr + ( sum2Pos / kPageSize ) * kSumBytesPerPage; + } + } +} + +extern void UnmapDisk( void ) { + VMUnmap( gWindowPage, 0 ); + VMUnmap( gWindowPage + 1, 0 ); + VMUnmap( gWindowPage + 2, 0 ); +} + + +extern void WriteDiskChecksum( void ) { + OSErr err; + + MakeDiskChecksum( gDiskWindowPtr, gCurSumPtr ); + MakeDiskChecksum( gSumWindowPtr, gCurSum2Ptr ); + MakeDiskChecksum( gSum2WindowPtr, gCurSum3Ptr ); + + { + int bcnt; + + for ( bcnt = 0; bcnt < gSum3Size; bcnt++ ) { + int nibble; + + nibble = ( gSum3Ptr[bcnt] >> 4 ) & 0xf; + gSum3Str[bcnt * 2] = nibble>9? 'a'-10 : '0'; + gSum3Str[bcnt * 2] += nibble; + + nibble = gSum3Ptr[bcnt] & 0xf; + gSum3Str[bcnt * 2 + 1] = nibble>9? 'a'-10 : '0'; + gSum3Str[bcnt * 2 + 1] += nibble; + } + + err = RegistryPropertySet( &gOptionsEntry, gSumPropertyName, gSum3Str, gSum3StrSize ); + } + + if ( err == noErr ) { + err = RegistryPropertySetMod( &gOptionsEntry, gSumPropertyName, kRegPropertyValueIsSavedToNVRAM ); + } + + if ( err ) { + ISDebugStr( "\pcouldn't write nvsum" ); + PrintHex( err, 4 ); + } +} + +extern void MakeDiskChecksum( Ptr in, Ptr out ) { + MakeChecksum( in, out, kSumBoxSide, kSumBoxDimensions ); +} + +extern void MakeChecksum( Ptr data, Ptr sumPtr, UInt32 side, int dimensions ) { + int underBits, overBits, overStart, dcnt, sum; + UInt32 underCount, overCount, ucnt, ocnt, lcnt, loff, off; + + underBits = 0; + overBits = kSumBoxVolumeLog2 - kSumBoxSideLog2; + + for ( dcnt = 0; dcnt < dimensions; dcnt++ ) { + underCount = 1 << underBits; + overCount = 1 << overBits; + overStart = underBits + kSumBoxSideLog2; + + for ( lcnt = 0; lcnt < kSumBoxSide; lcnt++ ) { + sum = 0; + loff = lcnt << underBits; + + for ( ocnt = 0; ocnt < overCount; ocnt++ ) { + off = loff + ( ocnt << overStart ); + for ( ucnt = 0; ucnt < underCount; ucnt++ ) { + sum ^= data[ off + ucnt ]; + } + } + *sumPtr++ = sum; + } + + underBits += kSumBoxSideLog2; + overBits -= kSumBoxSideLog2; + } +} + + +extern void CorrectDisk( Ptr data, Ptr good, Ptr check, UInt32 side, int dimensions ) { + int dcnt; + UInt32 bcnt; + UInt8 bad = 0; + + for ( bcnt = 0; bcnt < side; bcnt++ ) { + if ( good[bcnt] != check[bcnt] ) { +// if ( bad & (good[bcnt]^check[bcnt]) ) ISDebugStr( "\pToo many errors" ); + bad |= good[bcnt] ^ check[bcnt]; + } + //PrintHex( good[bcnt], 2 ); + //PrintHex( check[bcnt], 2 ); + } + + if(bad)PrintHex( bad, 2 ); + + while ( bad ) { + UInt32 coords[ kMaxDimensions ]; + int cubex = bad & -bad; // what's bad & -bad? Bitwise arithmetic! Oh god it's 3:50 am. + bad ^= cubex; + + for ( dcnt = 0; dcnt < dimensions; dcnt++ ) { + Ptr gcr = &good[dcnt*side], ccr = &check[dcnt*side]; // good/check coordinate row + coords[dcnt] = -1; + + for ( bcnt = 0; bcnt < side; bcnt++ ) { + if ( ( gcr[bcnt] ^ ccr[bcnt] ) & cubex ) { + if ( coords[dcnt] != -1 ) { + ISDebugStr( "\px" ); + coords[dcnt] = -1; + break; + } + coords[dcnt] = bcnt; + } + } + + if ( coords[dcnt] == -1 ) { + //ISDebugStr( "\p?" ); + break; + } + } + + if ( dcnt != dimensions ) continue; // from above break; + + { + UInt32 off = 0; + UInt32 dcoeff = 1; + for ( dcnt = 0; dcnt < dimensions; dcnt++ ) { + off += dcoeff * coords[dcnt]; + dcoeff *= side; + } + + PrintHex( ( data[off] & cubex ) != 0, 1 ); + + data[off] ^= cubex; + } + } +} \ No newline at end of file diff --git a/Patch Partition/Ephemerboot.mcp b/Patch Partition/Ephemerboot.mcp new file mode 100755 index 0000000000000000000000000000000000000000..07187cf7e37b008a1ecb4e5a1990a74ec800f1b7 GIT binary patch literal 37515 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