Skip to content
LuigiBlood edited this page Nov 9, 2023 · 19 revisions

Every registers uses the upper 16-bit for communication.

Data

(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.

Misc Register

(0x05000504: ASIC_MISC_REG)
Unknown.

Command

(0x05000508: ASIC_CMD)
This is where you send Commands.

Status

(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)

Drive Modes

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)

BM Interrupt

Reading this register acknowledges the BM Interrupt and releases the CART interrupt afterwards.

Disk May Have Changed

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.

64DD Presence Check

The software masks this status with 0x0000FFFF and if it's not 0, it means the 64DD isn't plugged in.

Current Track

(0x0500050C: ASIC_CUR_TK)
Tells the current track sent to the drive, ORed with 0x60000000 for being Index Locked.

Buffer Manager Status

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)

Buffer Manager Control

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)

Sector Error Status

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)

Micro Sequencer Status

(0x05000518: ASIC_SEQ_STATUS)
Returns what was written to it.

- MSEQ Interrupt Mask  (0x80000000)
- MSEQ Enable          (0x40000000)  
- ???                  (0x20000000)  
- ???                  (0x10000000)

Micro Sequencer Control

(0x05000518: ASIC_SEQ_CTL)

- MSEQ Interrupt Mask  (0x80000000)
- MSEQ Enable          (0x40000000)  
- ???                  (0x20000000)  
- ???                  (0x10000000)

Every other bit are ignored.

Current Sector

(0x0500051C: ASIC_CUR_SECTOR)
Tells the current sector in the track?
0xSSNN0000

SS=Sector Number (0x00~59 = Block 0, 0x5A~B3 = Block 1)
NN=???

Hard Reset

(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.

Sector Size

(0x05000528: ASIC_HOST_SECBYTE)
This is where you send the size of the sector MINUS 1 you want to get.

Sectors per Block, Full Size

(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.

ID

(0x05000540: ASIC_ID_REG)
Returns the following:

  • 0x00010000 for Retail?
  • 0x00030000 for Retail 64DD
  • 0x00040000 for Development 64DD
  • 0x00050000 for Writer 64DD
Clone this wiki locally