mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-12-01 09:50:31 +00:00
161 lines
6.5 KiB
ArmAsm
161 lines
6.5 KiB
ArmAsm
|
; ROM version of NKConfigurationInfo struct, based on Mac OS ROM 8=9=10.
|
||
|
; Lives at ROM + 0x30d000 (and other addresses on OldWorld).
|
||
|
|
||
|
; From start of ConfigInfo to end of LoMemInit = 4k:
|
||
|
|
||
|
|
||
|
|
||
|
; Auto-align fields
|
||
|
|
||
|
aligning on
|
||
|
|
||
|
|
||
|
|
||
|
import RomTop, RomBtm
|
||
|
import Mac68kRomTop, Mac68kRomBtm
|
||
|
import ExTblTop
|
||
|
import NKTop
|
||
|
import EmTop, EmBtm, EmEntry, EmKernelTrapTable
|
||
|
import OpcodeTblTop, OpcodeTblBtm
|
||
|
|
||
|
|
||
|
|
||
|
ConfigInfo
|
||
|
|
||
|
; These sums are not checked on NewWorld, but :Tools:ToolSource:RiscLayout.c calcs them anyway
|
||
|
dcb.l 8, 0 ; 000 ; ROMByteCheckSums ; ROM Checksums - one word for each of 8 byte lanes
|
||
|
dcb.l 2, 0 ; 020 ; ROMCheckSum64 ; ROM Checksum - 64 bit sum of doublewords
|
||
|
|
||
|
dc.l RomTop-ConfigInfo ; 028 ; ROMImageBaseOffset ; Offset of Base of total ROM image
|
||
|
dc.l RomBtm-RomTop ; 02c ; ROMImageSize ; Number of bytes in ROM image
|
||
|
dc.l 0 ; 030 ; ROMImageVersion ; ROM Version number for entire ROM
|
||
|
|
||
|
; ROM component Info (offsets are from base of ConfigInfo page)
|
||
|
dc.l Mac68kRomTop-ConfigInfo ; 034 ; Mac68KROMOffset ; Offset of base of Macintosh 68K ROM
|
||
|
dc.l Mac68kRomBtm-Mac68kRomTop ; 038 ; Mac68KROMSize ; Number of bytes in Macintosh 68K ROM
|
||
|
|
||
|
dc.l ExTblTop-ConfigInfo ; 03c ; ExceptionTableOffset ; Offset of base of PowerPC Exception Table Code
|
||
|
dc.l 0xc000 ; 040 ; ExceptionTableSize ; Number of bytes in PowerPC Exception Table Code (generous)
|
||
|
|
||
|
dc.l RomTop+0x320000-ConfigInfo ; 044 ; HWInitCodeOffset ; Offset of base of Hardware Init Code (no longer exists)
|
||
|
dc.l 0x10000 ; 048 ; HWInitCodeSize ; Number of bytes in Hardware Init Code
|
||
|
|
||
|
dc.l NKTop-ConfigInfo ; 04c ; KernelCodeOffset ; Offset of base of NanoKernel Code
|
||
|
dc.l 0x10000 ; 050 ; KernelCodeSize ; Number of bytes in NanoKernel Code (too small)
|
||
|
|
||
|
dc.l EmTop-ConfigInfo ; 054 ; EmulatorCodeOffset ; Offset of base of Emulator Code
|
||
|
dc.l EmBtm-EmTop ; 058 ; EmulatorCodeSize ; Number of bytes in Emulator Code
|
||
|
|
||
|
dc.l OpcodeTblTop-ConfigInfo ; 05c ; OpcodeTableOffset ; Offset of base of Opcode Table
|
||
|
dc.l OpcodeTblBtm-OpcodeTblTop ; 060 ; OpcodeTableSize ; Number of bytes in Opcode Table
|
||
|
|
||
|
; Offsets within the Emulator Data Page.
|
||
|
string AsIs
|
||
|
@s dc.b 'NewWorld v1.0' ; 064 ; BootstrapVersion ; Bootstrap loader version info
|
||
|
org @s + 16
|
||
|
|
||
|
dc.l 0xf00 ; 074 ; BootVersionOffset ; offset within EmulatorData of BootstrapVersion
|
||
|
dc.l 0x100 ; 078 ; ECBOffset ; offset within EmulatorData of ECB
|
||
|
dc.l 0x070 ; 07c ; IplValueOffset ; offset within EmulatorData of IplValue
|
||
|
|
||
|
; Offsets within the Emulator Code.
|
||
|
dc.l EmEntry-EmTop ; 080 ; EmulatorEntryOffset ; offset within Emulator Code of entry point
|
||
|
dc.l EmKernelTrapTable-EmTop ; 084 ; KernelTrapTableOffset ; offset within Emulator Code of KernelTrapTable
|
||
|
|
||
|
; Interrupt Passing Masks.
|
||
|
dc.l 0x00200000 ; 088 ; TestIntMaskInit ; initial value for test interrupt mask
|
||
|
dc.l 0xff9fffff ; 08c ; ClearIntMaskInit ; initial value for clear interrupt mask
|
||
|
dc.l 0x00e00000 ; 090 ; PostIntMaskInit ; initial value for post interrupt mask
|
||
|
dc.l 0x808e0000 ; 094 ; LA_InterruptCtl ; logical address of Interrupt Control I/O page
|
||
|
dc.b 6 ; 098 ; InterruptHandlerKind ; kind of handler to use
|
||
|
|
||
|
dc.l 0x5fffe000 ; 09c ; LA_InfoRecord ; logical address of InfoRecord page
|
||
|
dc.l 0x68ffe000 ; 0a0 ; LA_KernelData ; logical address of KernelData page
|
||
|
dc.l 0x68fff000 ; 0a4 ; LA_EmulatorData ; logical address of EmulatorData page
|
||
|
dc.l 0x68080000 ; 0a8 ; LA_DispatchTable ; logical address of Dispatch Table
|
||
|
dc.l 0x68060000 ; 0ac ; LA_EmulatorCode ; logical address of Emulator Code
|
||
|
|
||
|
dc.l LowMemVals-ConfigInfo ; 0b0 ; MacLowMemInitOffset ; offset to list of LowMem addr/data values
|
||
|
|
||
|
|
||
|
;
|
||
|
; Then the pagemap init stuff is filled by the trampoline at boot
|
||
|
;
|
||
|
|
||
|
|
||
|
; Address Space Mapping
|
||
|
dc.l 0 ; 0b4 ; PageAttributeInit ; default WIMG, PP settings for PTE creation
|
||
|
dc.l 0 ; 0b8 ; PageMapInitSize ; size of page mapping info
|
||
|
dc.l 0 ; 0bc ; PageMapInitOffset ; offset to page mapping info (from base of ConfigInfo)
|
||
|
dc.l 0 ; 0c0 ; PageMapIRPOffset ; offset of InfoRecord map info (from base of PageMap)
|
||
|
dc.l 0 ; 0c4 ; PageMapKDPOffset ; offset of KernelData map info (from base of PageMap)
|
||
|
dc.l 0 ; 0c8 ; PageMapEDPOffset ; offset of EmulatorData map info (from base of PageMap)
|
||
|
|
||
|
dcb.l 32, 0 ; 0cc ; SegMap32SupInit ; 32 bit mode Segment Map Supervisor space
|
||
|
dcb.l 32, 0 ; 14c ; SegMap32UsrInit ; 32 bit mode Segment Map User space
|
||
|
dcb.l 32, 0 ; 1cc ; SegMap32CPUInit ; 32 bit mode Segment Map CPU space
|
||
|
dcb.l 32, 0 ; 24c ; SegMap32OvlInit ; 32 bit mode Segment Map Overlay mode
|
||
|
|
||
|
dcb.l 32, 0 ; 2cc ; BATRangeInit ; BAT mapping ranges
|
||
|
|
||
|
dc.l 0 ; 34c ; BatMap32SupInit ; 32 bit mode BAT Map Supervisor space
|
||
|
dc.l 0 ; 350 ; BatMap32UsrInit ; 32 bit mode BAT Map User space
|
||
|
dc.l 0 ; 354 ; BatMap32CPUInit ; 32 bit mode BAT Map CPU space
|
||
|
dc.l 0 ; 358 ; BatMap32OvlInit ; 32 bit mode BAT Map Overlay mode
|
||
|
|
||
|
; Only needed for Smurf
|
||
|
dc.l 0 ; 35c ; SharedMemoryAddr ; physical address of Mac/Smurf shared message mem
|
||
|
|
||
|
dc.l -1 ; 360 ; PA_RelocatedLowMemInit ; physical address of RelocatedLowMem
|
||
|
|
||
|
dc.l 0x330000 - 0x30d000 ; 364 ; OpenFWBundleOffset ; Offset of base of OpenFirmware PEF Bundle
|
||
|
dc.l 0x20000 ; 368 ; OpenFWBundleSize ; Number of bytes in OpenFirmware PEF Bundle
|
||
|
|
||
|
dc.l 0xff800000 ; 36c ; LA_OpenFirmware ; logical address of Open Firmware
|
||
|
dc.l 0x00400000 ; 370 ; PA_OpenFirmware ; physical address of Open Firmware
|
||
|
dc.l 0xfff0c000 ; 374 ; LA_HardwarePriv ; logical address of HardwarePriv callback
|
||
|
|
||
|
; There are still some fixed-location fields here that the Trampoline will populate,
|
||
|
; but the ROM we are building contains just zeros.
|
||
|
|
||
|
|
||
|
|
||
|
;
|
||
|
; Key/value pairs for initializing Low Memory Globals.
|
||
|
; (at the end of ConfigInfo's 4k max size)
|
||
|
;
|
||
|
|
||
|
; A wee little macro to write LoMem key/value pairs *below* the asm location counter
|
||
|
|
||
|
macro
|
||
|
LowMem &addr, &val
|
||
|
@b
|
||
|
org @b - 4
|
||
|
dc.l &val
|
||
|
org @b - 8
|
||
|
dc.l &addr
|
||
|
org @b - 8
|
||
|
endm
|
||
|
|
||
|
|
||
|
; Sentinel zero at end (late address) of list
|
||
|
|
||
|
org 4096 - 4
|
||
|
dc.l 0
|
||
|
org 4096 - 4
|
||
|
|
||
|
|
||
|
; The table (older RISC versions have more in here.)
|
||
|
|
||
|
; The 68k emulator's cold-start vector, points to a "JMP StartBoot"
|
||
|
; instruction in the 68k ROM header. (Normally this value would be
|
||
|
; read from the ROM while it was overlaid on RAM at cold start, but
|
||
|
; why emulate that on a PowerPC?)
|
||
|
|
||
|
; SheepShaver patches the 68k reset vector around this location,
|
||
|
; but assumed offset 0xfd8.
|
||
|
|
||
|
LowMem 0x00000004, 0xffc0002a
|
||
|
|
||
|
LowMemVals
|