Parts
The 717260 patch consist of three parts:
- A ROM Extension (REx) patch as an embedded installer package
- A ROM patch as an embedded installer package
- A patch installer
The parts are combined into one Newton installer package. The patch installer is triggering the installation of the first two embedded packages.
Files
The files in the package can be split into four groups. The patch packages are constructed out of NSOF stream objects, which in turn are either extracted from the original patch verbatim, or generated by the Newton C++ tools by linking compiled code together.
Generic and common files
- include/Bytecode.a: Assember macros to generate NewtonScript bytecode
- include/package.a: Macros to control package attributes
- include/page.a: Macros for MMU page mapping
- include/project.a: Definitions for the patch areas
- include/sound.a: Not used
- include/stream.a: Macros to generate NSOF streams
- Makefile: The MPW makefile which controls compilation of the patche code
- common.txt: Common definition for the NTK projects
- RegisterPatchOriginal.stream: NSOF stream containing the original binary code for the RegisterPatch function. This stream is included in the REx and ROM patch packages verbatim.
REx Patch
The REx patch part patches the ROM extension found at address 0x01e00000.
- RExStrmHead.s: Preamble for the REx patch
- RExMMU.s: MMU remapping
- RExPatch.s: Actual patch data
- RExPatch.txt: Text file with the install script and other scripts for the REx patch NTK project
- RExPatch: NTK project file used to generate the REx patch package
ROM Patch
The ROM patch part patches the jump tables starting at 0x01a00000.
- ROMStrmHead.s: Preable for the ROM patch NSOF stream
- ROMMMU.s: MMU page mappings for the ROM patch
- Patch1.s to Patch6.s: Actual patch data
- ROMPatch.txt: Install script and other scripts for the ROM patch NTK package
- ROMPatch: NTK project file used to generate the ROM patch package
Patch Installer
- PatchMungerOriginal.stream: Original NSOF stream containing the binary code for installing patch packages
- TestPatch.txt: Install and other scripts for the overall patch package
- TestPatch: NTK project file for the overall patch package
Memory Layout
The ROM and REx patches are combined into sequential areas. This is the layout of the ROM patch:
% Physical Address % Virtual Address % Source File % Section %
%------------------%-----------------%-------------%---------%
% 0x00000000 % % ROMMMU.s % MMU patch table, 8192 bytes of patch entries to patch 2048 MMU pages %
% 0x00002000 % 0x01d80000 % Patch1.s % %
% 0x00003000 % 0x01ae0000 % Patch2.s % %
% 0x00004000 % 0x01b40000 % Patch3.s % %
% 0x00005000 % 0x01a8c000 % Patch4.s % %
% 0x00006000 % 0x01bac000 % Patch5.s % %
% 0x00007000 % 0x01c11000 % Patch6.s % %
Patch Example
Below is an example of how the TClassOneModem::PrepareCommand is patched. The function implementation is located at address 0x0006399c in the MP2x00 US ROM, and the jumptable entry is at address 0x01a16b3c. Patching the function is achieved by letting the jump table entry point to the patched function.
The ROMMMU.s file contains the first step for this, it maps the page starting at 0x01A16000 to RAM:
; patches of 0x2000
DontLoadPages 22 ; 0x01A00000 - 0x01A15000
LoadPage 2 ; 0x01A16000 needs to be patched
DontLoadPages 9 ; 0x01A17000 - 0x01A1F000
The next step is in Patch1.s, it contains the new page for address 0x01A16000:
L01D80B00
reORG SETA {PC} - 0x1A16B00
...
B 0x001B9AA8 + reORG
B 0x01B40C5C + reORG ; patch from 0x0006399C, address of the original function
B 0x001E0F68 + reORG
...
And the final part is in Patch6.s, where the new code for the TClassOneModem::PrepareCommand function is located at address 0x01B40C5C:
L01B40C3C
STMFD sp!,{R0,LR}
...
STMFD sp!,{R0,R1,LR}
BL 0x0006399C ; call to the original function, new code follows
LDMFD sp!,{R1,R2,LR}
TEQ R2,#15
MOVNE PC,LR
LDR R2,[R1,#1932]
ADD R2,R2,#0x000007D0
STR R2,[R1,#1932]
MOV PC,LR
Compiling the Patch
Prerequisites are MPW, the Newton C++ tools and NTK. The steps to recreate the package are:
- Download and extract the patch
- Start MPW and set the current directory to the location of the patch
- Use the make command to compile the ROMPatch and RExPatch targets:
- Make ROMPatch
- Make RExPatch
- Launch NTK
- Open the RExPatch project and create the RExPatch package
- Open the ROMPatch project and create the ROMPatch package
- Open the TestPatch project and create the TestPatch package
|