AAAA AAAA
for even rows5555 5555
for odd rows (ASCII UUUU
) 22 97 000640 FEFE0698
0 01 000010 FEFE06A8 ; sRsrcType 0020=CatDock 0001=TypStation 0001=DrSWApple 0001=DrHWDeskBar
1 02 000014 FEFE06B0 ; sRsrcName "Dock_Station_Apple_DuoDock"
2 50 00002C FEFE06CC ; sRsrcUnknown
3 FF 000000 FEFE06A4 ; endOfList
FEFE06CC: 0000 0882
which is 2178 bytes. It appears to contain code (you can tell by the multiple occurrences of Nu
which is the ASCII for a common 68K instruction 0x4E75 which is RTS
.7FFF FFFF
and vertical sides (multiple of 4000 0001
). Since the picture is not 100% clear, you might look for variations that begin or end at different pixels, such as 7FFF FFFE
and 4000 0002
.xxd -b -c 4 "$thefile" | perl -pE 's/ //g; s/\w+:(\w{32}).*/$1/; s/0/ /g; s/1/██/g;'
RussSWC!
signature mentioned at #63 ROMSigLo
, ROMSigHi
at address 0xFEFFFFE4.0003=CatDisplay 0001=TypVideo 0001=DrSWApple 0020=DrHWVSC
is in the DuoDock DeclData.Display_Video_Apple_VSC
Display_Video_Apple_ViSC
0020=CatDock 0001=TypStation 0001=DrSWApple 0001=DrHWDeskBar
"Dock_Station_Apple_DuoDock"
0001=CatBoard 0000=TypBoard 0000=DrSWBoard 0000=DrHWBoard
"Macintosh Duo Dock"
DeskBar
in VSCDeclData.a of supermario but it's a little different.Dock_Desk_Apple_ViSC/Keystone
sRsrcDock
which points to the code in VSCDockingHandler.a of supermario._CopyBits
? Probably dockBootHook
.sRsrcDockStart=$((0x6d0))
sRsrcDockSize=$((0x0882))
selectortablestart=$((0x6fe))
selectortablesize=$((0xc8))
IFS=$'\n'
dd if="$thefile" bs=1 skip="$selectortablestart" count="$selectortablesize" 2> /dev/null | xxd -o "$selectortablestart" -c 8 | perl -nE '
if (/(.{8}): .{9} (.{4}) (.{4}) (....)..../) {
$selectorAddr = hex($1);
$selector = $4;
$data = hex($2 . $3);
$addr = $data + $selectorAddr + 4;
printf("%04x: '"'"'%s'"'"' ", $selectorAddr, $selector);
if ($addr >= '${selectortablestart}' + '${selectortablesize}' && $addr < '${sRsrcDockStart}' + '${sRsrcDockSize}') {
printf("code: %04x\n", $addr);
} else {
printf("data: %04x\n", $data);
}
}
'
06fe: 'dock' data: 001c
0706: 'sltc' data: 3000
070e: 'sccr' data: fee08000
0716: 'sccw' data: fee08000
071e: 'scc#' data: 0003
0726: 'scsi' data: fee02000
072e: 'sdma' data: fee04000
0736: 'shsk' data: fee06000
073e: 'snd ' data: 0011
0746: 'sctp' data: 0001
074e: 'vers' data: 1018002
0756: '....' data: 0000
075e: 'lock' code: 07ce
0766: 'ejct' code: 07de
076e: 'ejsw' code: 07ea
0776: 'dicn' code: 0802
077e: 'hdwr' code: 090c
0786: 'init' code: 092c
078e: 'mhz ' code: 0a92
0796: 'powr' code: 0adc
079e: 'pctl' code: 0af8
07a6: 'diag' code: 0b38
07ae: 'slep' code: 0bbe
07b6: 'wake' code: 0c1e
07be: 'boot' code: 0ca2
# Use capstone disassembler to look at the code for the 'boot' selector.
# Note: capstone doesn't understand A-Traps.
bootStart=$((0x0ca2))
cstool m68k $(dd if="$thefile" bs=1 skip=$bootStart count=$((sRsrcDockStart + sRsrcDockSize - bootStart)) 2> /dev/null | xxd -p -c 99999999) | perl -pE 's/^ *(\w+) ((?: [0-9a-f]{2})+) (.*)/\1:\2\t\3/' > bootcode.txt
fefe0d52 : 2d78 0904 fffc MOVE.L $00000904,-4(A6)
fefe0d58 : 4bee fff8 LEA -8(A6),A5
fefe0d5c : 21cd 0904 MOVE.L A5,$00000904
fefe0d60 : 1f38 08f3 MOVE.B $000008f3,-(A7) ;
fefe0d64 : 486e fff4 PEA -12(A6)
fefe0d68 : a86e _InitGraf ; InitGraf
fefe0d6a : 11df 08f3 MOVE.B (A7)+,$000008f3
fefe0d6e : 486e febe PEA -322(A6)
fefe0d72 : a86f _OpenPort ; OpenPort
fefe0d74 : 41ee feb0 LEA -336(A6),A0
fefe0d78 : 43fa 00d4 LEA +212(PC) {$fefe0e4e},A1
fefe0d7c : 20c9 MOVE.L A1,(A0)+
fefe0d7e : 30fc 0004 MOVE.W #$0004,(A0)+
fefe0d82 : 7420 MOVEQ #$20,D2
fefe0d84 : 302e fec6 MOVE.W -314(A6),D0
fefe0d88 : d06e feca ADD.W -310(A6),D0
fefe0d8c : 9042 SUB.W D2,D0
fefe0d8e : e240 ASR.W #1,D0
fefe0d90 : 322e fec8 MOVE.W -312(A6),D1
fefe0d94 : d26e fecc ADD.W -308(A6),D1
fefe0d98 : 9242 SUB.W D2,D1
fefe0d9a : e241 ASR.W #1,D1
fefe0d9c : 30c0 MOVE.W D0,(A0)+
fefe0d9e : 30c1 MOVE.W D1,(A0)+
fefe0da0 : d042 ADD.W D2,D0
fefe0da2 : d242 ADD.W D2,D1
fefe0da4 : 30c0 MOVE.W D0,(A0)+
fefe0da6 : 30c1 MOVE.W D1,(A0)+
fefe0da8 : 7640 MOVEQ #$40,D3
fefe0daa : d683 ADD.L D3,D3
fefe0dac : 486e feb0 PEA -336(A6)
fefe0db0 : 486e fec0 PEA -320(A6)
fefe0db4 : 486e feb6 PEA -330(A6)
fefe0db8 : 2f17 MOVE.L (A7),-(A7)
fefe0dba : 4267 CLR.W -(A7)
fefe0dbc : 42a7 CLR.L -(A7)
fefe0dbe : a8ec _CopyBits ; CopyBits
fefe0dc0 : d7ae feb0 ADD.L D3,-336(A6) ; set up image offset
fefe0dc4 : 4483 NEG.L D3 ; set up d3 for next image flip
fefe0dc6 : 611a BSR $fefe0de2 ; SCSI check again
fefe0dc8 : 57cc ffe2 DBEQ D4,$fefe0dac ; check D4 and go blit again
fefe0dcc : 486e febe PEA -322(A6)
fefe0dd0 : a87d _ClosePort ; ClosePort
fefe0dd2 : 21ee fffc 0904 MOVE.L -4(A6),$00000904
fefe0de2 : 7aff MOVEQ #$FF,D5 ; d5 = $ff
fefe0de4 : 3d45 fe9a MOVE.W D5,-358(A6) ;
fefe0de8 : 554f SUBQ.W #2,A7 ;
fefe0dea : 3f3c 0001 MOVE.W #$0001,-(A7) ; $01 = SCSIGet
fefe0dee : a815 _SCSIDispatch ; SCSIDispatch
fefe0df0 : 4a57 TST (A7) ;
fefe0df2 : 664c BNE $fefe0e40 ;
fefe0df4 : 3f3c 0001 MOVE.W #$0001,-(A7) ; SCSI ID = $0001
fefe0df8 : 3f3c 0002 MOVE.W #$0002,-(A7) ; $02 = SCSISelect
fefe0dfc : a815 _SCSIDispatch ; SCSIDispatch
fefe0dfe : 4a57 TST (A7) ;
fefe0e00 : 663e BNE $fefe0e40 ;
fefe0e02 : 7a01 MOVEQ #$01,D5 ; d5 = $01
fefe0e04 : 486e fe92 PEA -366(A6) ;
fefe0e08 : 3f3c 0006 MOVE.W #$0006,-(A7) ;
fefe0e0c : 3f3c 0003 MOVE.W #$0003,-(A7) ; $03 = SCSICmd
fefe0e10 : a815 _SCSIDispatch ; SCSIDispatch
fefe0e12 : 4a57 TST (A7) ;
fefe0e14 : 660a BNE $fefe0e20 ;
fefe0e16 : 486e fe9c PEA -356(A6) ;
fefe0e1a : 3f3c 0005 MOVE.W #$0005,-(A7) ; $05 = SCSIRead
fefe0e1e : a815 _SCSIDispatch ; SCSIDispatch
fefe0e20 : 486e fe9a PEA -358(A6) ;
fefe0e24 : 486e fe98 PEA -360(A6) ;
fefe0e28 : 703c MOVEQ #$3C,D0 ;
fefe0e2a : 2f00 MOVE.L D0,-(A7) ;
fefe0e2c : 3f3c 0004 MOVE.W #$0004,-(A7) ; $04 = SCSIComplete
fefe0e30 : a815 _SCSIDispatch ; SCSIDispatch
fefe0e32 : 4a6e fe9a TST -358(A6) ;
fefe0e36 : 6608 BNE $fefe0e40 ;
fefe0e38 : 7a00 MOVEQ #$00,D5 ; d5 = $00
fefe0e3a : 544f ADDQ.W #2,A7 ;
fefe0e3c : 4a45 TST D5 ;
fefe0e3e : 4e75 RTS ;
fefe0e40 : 701e MOVEQ #$1E,D0 ;
fefe0e42 : d0b8 016a ADD.L $0000016a,D0 ;
fefe0e46 : b0b8 016a CMP.L $0000016a,D0 ;
fefe0e4a : 6efa BGT $fefe0e46 ;
fefe0e4c : 60ec BRA $fefe0e3a ;
Out of curiosity, what SCSI IDs are you using for images on your ZuluSCSI? Just one image of ID=0, or are there other images present?Maybe I'm reading this wrong but the call to SCSI Select seems to be hard coded to check SCSI Target ID = 1? My Duo's internal ID = 0. There's no drive in the Duo Dock but looking at the manual for the Duo Dock, it suggests if you put a hard disk inside, to set the ID = 1.
Out of curiosity, what SCSI IDs are you using for images on your ZuluSCSI? Just one image of ID=0, or are there other images present?
[12ms] Platform: ZuluSCSI RP2040
[12ms] FW Version: 25.02.11-release Feb 11 2025 17:57:30
[13ms] SCSI termination is determined by the DIP switch labeled "TERM"
[14ms] Flash chip size: 16384 kB
[14ms] SCSI target/disk mode selected by DIP switch, acting as a SCSI disk
[21ms] SD card detected, FAT64 volume size: 29548 MB
[21ms] SD MID: 0x27, OID: 0x50 0x48
[21ms] SD Name: SD32G
[21ms] SD Date: 2/2024
[22ms] SD Serial: 0x7748C502
[23ms] Speed grade set to Default, skipping reclocking
[24ms] Reading configuration from zuluscsi.ini
[24ms] Active configuration:
[24ms] -- SelectionDelay = 255
[25ms] -- EnableUnitAttention = No
[25ms] -- EnableSCSI2 = Yes
[25ms] -- EnableSelLatch = No
[25ms] -- MapLunsToIDs = No
[26ms] -- EnableParity = Yes
[58ms] Finding images in directory /:
[59ms] -- Opening /HD0.img for id:0 lun:0
[59ms] DBG ---- Image file is contiguous, SD card sectors 24640 to 1560639
[60ms] ---- Configuring as disk drive drive
[60ms] ---- Read prefetch enabled: 8192 bytes
[61ms] -- Platform supports ROM drive up to 16028 kB
[61ms] ---- ROM drive image not detected
[62ms] SCSI ID: 0, BlockSize: 512, Type: 0, Quirks: 0, Size: 768000kB
[71ms] Clock set to: 125000000Hz
[71ms] Initialization complete!
[1891ms] DBG -- BUS_BUSY
[1891ms] DBG -- BUS_FREE
[2854ms] DBG -- BUS_BUSY
[2854ms] DBG -- BUS_FREE
[3818ms] DBG -- BUS_BUSY
[3818ms] DBG -- BUS_FREE
[4783ms] DBG -- BUS_BUSY
[4783ms] DBG -- BUS_FREE
[5747ms] DBG -- BUS_BUSY
[5747ms] DBG -- BUS_FREE
[6712ms] DBG -- BUS_BUSY
[6712ms] DBG -- BUS_FREE
[7676ms] DBG -- BUS_BUSY
[7676ms] DBG -- BUS_FREE
[8640ms] DBG -- BUS_BUSY
[8640ms] DBG -- BUS_FREE
[9604ms] DBG -- BUS_BUSY
[9604ms] DBG -- BUS_FREE
[10569ms] DBG -- BUS_BUSY
[10569ms] DBG -- BUS_FREE
[11533ms] DBG -- BUS_BUSY
[11533ms] DBG -- BUS_FREE
[12498ms] DBG -- BUS_BUSY
[12498ms] DBG -- BUS_FREE
[13462ms] DBG -- BUS_BUSY
[13462ms] DBG -- BUS_FREE
[14426ms] DBG -- BUS_BUSY
[14426ms] DBG -- BUS_FREE
[15391ms] DBG -- BUS_BUSY
[15391ms] DBG -- BUS_FREE
[16355ms] DBG -- BUS_BUSY
[16355ms] DBG -- BUS_FREE
[17319ms] DBG -- BUS_BUSY
[17319ms] DBG -- BUS_FREE
[18284ms] DBG -- BUS_BUSY
[18284ms] DBG -- BUS_FREE
[19248ms] DBG -- BUS_BUSY
[19248ms] DBG -- BUS_FREE
[20212ms] DBG -- BUS_BUSY
[20212ms] DBG -- BUS_FREE
[21177ms] DBG -- BUS_BUSY
[21177ms] DBG -- BUS_FREE
[22141ms] DBG -- BUS_BUSY
[22141ms] DBG -- BUS_FREE
[22618ms] DBG -- BUS_BUSY
[22619ms] DBG -- BUS_FREE
[23097ms] DBG -- BUS_BUSY
[23097ms] DBG -- BUS_FREE
[23575ms] DBG -- BUS_BUSY
[23575ms] DBG -- BUS_FREE
[24053ms] DBG -- BUS_BUSY
[24053ms] DBG -- BUS_FREE
[24531ms] DBG -- BUS_BUSY
[24531ms] DBG -- BUS_FREE
[25009ms] DBG -- BUS_BUSY
[25009ms] DBG ---- SELECTION: 0
[25011ms] DBG ---- COMMAND: Read6
[25011ms] DBG ------ OUT: 0x08 0x00 0x00 0x00 0x01 0x00
[25011ms] Toolbox enabled = 0
[25012ms] DBG ------ Read 1x512 starting at 0
[25013ms] DBG ---- DATA_IN
[25013ms] DBG ---- Total IN: 512 OUT: 0 CHECKSUM: 31398
[25014ms] DBG ---- STATUS: 0 GOOD
[25018ms] DBG ---- MESSAGE_IN
[25018ms] DBG ------ IN: 0x00
I've been following your interesting research! Just a thought, what if you enable debug mode with both HD0 and HD1 active? I wonder if that'll print more diagnostic info about what else is happening with ID 1 that is presumably holding things up.
Internal ZuluSCSI Duo Drive (no internal Dock drive) - I get the strange icon again and stalls for 10 seconds before it boots from the duo drive. This is the scenario I've been having issues with.
Internal PHYSICAL SCSI Duo Drive (no internal Dock drive) - no delay and no icon, boots after a few seconds.
[12ms] Platform: ZuluSCSI RP2040
[12ms] FW Version: 25.03.19-release Mar 19 2025 16:54:38
[13ms] SCSI termination is determined by the DIP switch labeled "TERM"
[14ms] Flash chip size: 16384 kB
[14ms] SCSI target/disk mode selected by DIP switch, acting as a SCSI disk
[18ms] SDIO checksum error in reception: block 0 calculated 0xF1726FF07055E00F expected 0x97B80CCB0A39C1FF
[19ms] SdioCard::readSector(0x00000000) failed: 6
[20ms] SDIO checksum error in reception: block 0 calculated 0xF1726FF07055E00F expected 0x97B80CCB0A39C1FF
[21ms] SdioCard::readSector(0x00000000) failed: 6
[22ms] SDIO checksum error in reception: block 0 calculated 0xE7E931FD4567CA38 expected 0x6878B1DCB3B18C1F
[23ms] SdioCard::readSector(0x00000000) failed: 6
[23ms] SDIO checksum error in reception: block 0 calculated 0x0F000F0FF00FF00F expected 0xFFFFFFFFFFFFFFFF
[24ms] SdioCard::readSector(0x00000000) failed: 6
[25ms] DBG SD card init failed, sdErrorCode: 6 sdErrorData: 0
[30ms] SD card init succeeded after retry
[32ms] SD card detected, FAT64 volume size: 29548 MB
[32ms] SD MID: 0x27, OID: 0x50 0x48
[33ms] SD Name: SD32G
[33ms] SD Date: 2/2024
[33ms] SD Serial: 0x7748C502
[34ms] Speed grade set to Default, skipping reclocking
[35ms] Reading configuration from zuluscsi.ini
[36ms] Active configuration:
[36ms] -- SelectionDelay = 255
[36ms] -- EnableUnitAttention = No
[37ms] -- EnableSCSI2 = Yes
[37ms] -- EnableSelLatch = No
[37ms] -- MapLunsToIDs = No
[38ms] -- EnableParity = Yes
[83ms] Finding images in directory /:
[84ms] -- Opening /HD0.img for id:0 lun:0
[84ms] DBG ---- Image file is contiguous, SD card sectors 24640 to 1560639
[84ms] ---- Configuring as disk drive drive
[85ms] ---- Drive geometry from image size: SectorsPerTrack=60 HeadsPerCylinder=16 total sectors 1536000 (divisible)
[86ms] ---- Read prefetch enabled: 8192 bytes
[88ms] -- Opening /HD1.img for id:1 lun:0
[90ms] ---- WARNING: file /HD1.img is not contiguous. This will increase read latency.
[91ms] ---- Configuring as disk drive drive
[91ms] ---- Drive geometry from image size: SectorsPerTrack=60 HeadsPerCylinder=16 total sectors 1536000 (divisible)
[93ms] ---- Read prefetch enabled: 8192 bytes
[93ms] -- Platform supports ROM drive up to 16028 kB
[94ms] ---- ROM drive image not detected
[94ms] SCSI ID: 0, BlockSize: 512, Type: 0, Quirks: 0, Size: 768000kB
[95ms] SCSI ID: 1, BlockSize: 512, Type: 0, Quirks: 0, Size: 768000kB
[110ms] Clock set to: 125000000Hz
[110ms] Initialization complete!
[1710ms] DBG ---- SELECTION: 1
[1711ms] DBG ---- COMMAND: Read6
[1711ms] DBG ------ OUT: 0x08 0x00 0x00 0x00 0x01 0x00
[1712ms] Toolbox enabled = 0
[1712ms] DBG ------ Read 1x512 starting at 0
[1713ms] DBG ---- DATA_IN
[1714ms] DBG ---- Total IN: 512 OUT: 0 CHECKSUM: 31398
[1714ms] DBG ---- STATUS: 0 GOOD
[1719ms] DBG ---- MESSAGE_IN
[1719ms] DBG ------ IN: 0x00
[1720ms] DBG -- BUS_FREE
[2198ms] DBG -- BUS_BUSY
... a bunch of SCSI commands against ID = 1 and then ...
[4242ms] DBG -- BUS_FREE
[4242ms] DBG ---- SELECTION: 0
[4243ms] DBG ---- COMMAND: Read6
[4243ms] DBG ------ OUT: 0x08 0x00 0x00 0x00 0x01 0x00
[4244ms] DBG ------ Read 1x512 starting at 0
[4245ms] DBG ---- DATA_IN
[4246ms] DBG ---- Total IN: 512 OUT: 0 CHECKSUM: 31398
[4246ms] DBG ---- STATUS: 0 GOOD
[4252ms] DBG ---- MESSAGE_IN
[4252ms] DBG ------ IN: 0x00