-
Notifications
You must be signed in to change notification settings - Fork 4
Registers
Every registers uses the upper 16-bit for communication.
(0x05000500: ASIC_DATA)
This is the data feed for Commands.
You may need to put the necessary data for certain commands, while commands can also return data to this register.
(0x05000504: ASIC_MISC_REG)
Unknown.
(0x05000508: ASIC_CMD)
This is where you send Commands.
(0x05000508: ASIC_STATUS)
Contains 64DD status and interrupt masks.
- Data Request (0x40000000)
- C2 Transfer (0x10000000)
- Buffer Manager Error (0x08000000)
- Buffer Manager Interrupt (0x04000000)
- Mechanic Interrupt (0x02000000)
- Disk Present (0x01000000)
- Busy State (0x00800000)
- Reset State (0x00400000)
- Related to BM? (0x00200000)
- Motor NOT Spinning (0x00100000)
- Head Retracted (0x00080000)
- Write Protect Error (0x00040000)
- Mechanic Error (0x00020000)
- Disk May Have Changed (0x00010000)
The following bits translates to several modes:
- Motor NOT Spinning (0x00100000)
- Head Retracted (0x00080000)
They can tell in whether mode the 64DD drive currently is:
- Sleep Mode:
1 1
(Motor NOT Spinning, Head Retracted) - Standby Mode:
0 1
(Motor Spinning, Head Retracted) - Active Mode:
0 0
(Motor Spinning, Head not retracted)
Reading this register acknowledges the BM Interrupt and releases the CART interrupt afterwards.
This bit is always set when the drive believes that the N64 software should recheck if the disk has been changed.
This means that it is set when the drive is reset (powered on or via the reset register, even when there's no disk inserted), or anytime when a disk has been inserted.
The software masks this status with 0x0000FFFF and if it's not 0, it means the 64DD isn't plugged in.
(0x0500050C: ASIC_CUR_TK)
Tells the current track sent to the drive, ORed with 0x60000000 for being Index Locked.
0x05000510: ASIC_BM_STATUS
Obviously tells the status of the Buffer Manager.
- Running (0x80000000)
- Error (0x04000000)
- Micro Status? (0x02000000)
- Block Transfer (0x01000000)
- C1 Correction (0x00800000)
- C1 Double (0x00400000)
- C1 Single (0x00200000)
- C1 Error (0x00010000)
0x05000510: ASIC_BM_CTL
This is where you send Buffer Manager Control bits, as well as the Sector number.
0xSSNN0000
SS=
- Start Buffer Manager (0x80000000)
- Buffer Manager Mode (0x40000000)
- BM Interrupt Mask (0x20000000)
- Buffer Manager Reset (0x10000000)
- Disable OR Check? (0x08000000)
- Disable C1 Correction (0x04000000)
- Block Transfer (0x02000000)
- Mechanic Interrupt Reset (0x01000000)
NN=
Sector Number to read/write (0x00~59 = Block 0, 0x5A~B3 = Block 1)
0x05000514: ASIC_ERR_SECTOR
- AM Fail (0x80000000)
- Micro Fail (0x40000000)
- Spindle Fail (0x20000000)
- Overrun (0x10000000)
- Offtrack (0x08000000)
- No Disk (0x04000000)
- Clock Unlock (0x02000000)
- Self Stop (0x01000000)
(0x05000518: ASIC_SEQ_STATUS)
Returns what was written to it.
- MSEQ Interrupt Mask (0x80000000)
- MSEQ Enable (0x40000000)
- ??? (0x20000000)
- ??? (0x10000000)
(0x05000518: ASIC_SEQ_CTL)
- MSEQ Interrupt Mask (0x80000000)
- MSEQ Enable (0x40000000)
- ??? (0x20000000)
- ??? (0x10000000)
Every other bit are ignored.
(0x0500051C: ASIC_CUR_SECTOR)
Tells the current sector in the track?
0xSSNN0000
SS=Sector Number (0x00~59 = Block 0, 0x5A~B3 = Block 1)
NN=???
(0x05000520: ASIC_HARD_RESET)
Write 0xAAAA0000 to reset the drive.
This is done by most games (IPL too) after setting the PI.
Wait until the Busy bit is cleared after doing this before doing anything else.
(0x05000528: ASIC_HOST_SECBYTE)
This is where you send the size of the sector MINUS 1 you want to get.
(0x05000530: ASIC_SEC_BYTE)
0xSSBB0000
- SS = Number of sectors in a block MINUS 1, so usually 89 (0x59).
- BB = Number of bytes in each sector INCLUDING C1 data (+ 7 bytes) MINUS 1.
(0x05000540: ASIC_ID_REG)
Returns the following:
-
0x00010000
for Retail? -
0x00030000
for Retail 64DD -
0x00040000
for Development 64DD -
0x00050000
for Writer 64DD