Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main Page
Community Portal
Village Pump
Recent Changes
Upload File
Help
Help Contents
Editing Guide
Repair Guide Template
Sandbox
Browse Wiki
๐ Service Manuals
๐ Schematics
๐ Apple
๐ฎ Nintendo
๐ Sega
โก Troubleshooting
Search
Search
Appearance
Create account
Log in
Personal tools
Not logged in
Talk
Contributions
Create account
Log in
Editing
Diagnostic Serial Console
(section)
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
=== ROM-Based Diagnostic Code Architecture === The SE/30's diagnostic capabilities are implemented through sophisticated 68000 assembly language routines embedded within the system ROM at address 0x40800000. These diagnostic routines operate independently of Mac OS, providing direct hardware access and component-level testing through carefully structured assembly code that bypasses normal operating system abstractions. '''Boot Sequence and Diagnostic Entry Points (from ROM disassembly projects):''' <pre> ; SE/30 ROM Boot Vector Table (typical structure) ORG $40800000 ; ROM base address DC.L $40810000 ; Initial stack pointer DC.L BOOT_START ; Initial program counter DC.L BUS_ERROR_HANDLER ; Bus error vector DC.L ADDR_ERROR_HANDLER; Address error vector ; ... additional vectors BOOT_START: ; Disable interrupts and initialize CPU state ORI.W #$0700,SR ; Disable all interrupts MOVE.L #$40810000,A7 ; Set stack pointer ; Test ROM checksum first BSR ROM_CHECKSUM_TEST TST.L D0 BNE ROM_FAILURE ; Initialize diagnostic state MOVE.L #DIAGNOSTIC_VARS,A6 ; Base pointer for diagnostic variables CLR.L ERROR_CODE(A6) ; Clear error accumulator ; Begin hardware initialization sequence BSR INIT_VIA_CHIPS BSR INIT_SCC_SERIAL BSR INIT_MEMORY_CONTROLLER ; Start memory testing if in diagnostic mode BTST #DIAG_MODE_BIT,SYSTEM_FLAGS BNE DIAGNOSTIC_MAIN ; Normal boot continues here... BRA NORMAL_BOOT_SEQUENCE </pre> '''Serial Diagnostic Interface Handler:''' <pre> DIAGNOSTIC_SERIAL_HANDLER: ; Check for incoming serial command MOVE.B SCC_STATUS,D0 ; Read SCC status register BTST #RX_READY_BIT,D0 ; Check receive ready BEQ.S CHECK_OUTPUT ; No input, check output ; Read command character MOVE.B SCC_DATA,D0 ; Get character from SCC CMPI.B #'*',D0 ; Check for command prefix BNE.S STORE_DATA ; Not command, store as data ; Process diagnostic command BSR READ_COMMAND_STRING BSR PARSE_DIAGNOSTIC_CMD BSR EXECUTE_DIAGNOSTIC BRA.S SEND_RESPONSE STORE_DATA: ; Store data for memory operations MOVE.L CURRENT_DATA_PTR(A6),A0 MOVE.B D0,(A0)+ MOVE.L A0,CURRENT_DATA_PTR(A6) RTS CHECK_OUTPUT: ; Check if we need to send data TST.B OUTPUT_PENDING(A6) BEQ.S HANDLER_EXIT BSR SEND_DIAGNOSTIC_DATA HANDLER_EXIT: RTS </pre> '''Diagnostic Command Parser:''' <pre> PARSE_DIAGNOSTIC_CMD: ; Input: Command string in buffer pointed to by A0 ; Parse command type (*T, *L, *D, *M, etc.) MOVE.B 1(A0),D0 ; Get command character after '*' CMPI.B #'T',D0 ; Test command? BEQ HANDLE_TEST_CMD CMPI.B #'L',D0 ; Location set command? BEQ HANDLE_LOCATION_CMD CMPI.B #'D',D0 ; Data deposit command? BEQ HANDLE_DEPOSIT_CMD CMPI.B #'M',D0 ; Memory read command? BEQ HANDLE_MEMORY_READ CMPI.B #'G',D0 ; Go/execute command? BEQ HANDLE_EXECUTE_CMD ; Unknown command MOVE.L #CMD_ERROR,RESPONSE_PTR(A6) RTS HANDLE_TEST_CMD: ; Parse test number (*T0001, *T0002, etc.) ADDQ.L #2,A0 ; Skip "*T" BSR PARSE_HEX_NUMBER ; Parse test number into D0 MOVE.L D0,TEST_NUMBER(A6) ; Dispatch to appropriate test CMPI.L #$0001,D0 BEQ DATA_BUS_TEST CMPI.L #$0002,D0 BEQ MOD3_RAM_TEST CMPI.L #$0003,D0 BEQ ADDRESS_LINE_TEST ; ... additional test dispatches RTS </pre> The diagnostic ROM implementation utilizes direct register manipulation and bus control to achieve precise hardware validation impossible through higher-level software interfaces. Memory allocation operates through direct address specification rather than dynamic allocation, with the system using register A6 for return address management during early boot phases when no stack is available. Critical timing relationships are maintained through carefully calculated instruction cycles and NOPs to ensure proper hardware setup and response timing.
Summary:
Please note that all contributions to RetroTechCollection may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
RetroTechCollection:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Search
Search
Editing
Diagnostic Serial Console
(section)
Add topic