C= commodore 64 

Commodore 1541 Drive ROM addresses

;       Commodore 1541 / OC-118 Disk Drive ROM Map
;       V1.0    1 Sep 1994


; Note: This Memory map is collected from the 1541 disassembly
;   which was made by Peter Weighill. I cannot guarantee accuracy
;   of all details.
;

; Data types in headers (for reassembler):
;
;       DATA            Misc data
;       TEXT            String terminated with 00
;       WORD            Vectors in LO/HI byte pairs
;       CHIP            I/O Area
;       EMPTY           ROM containing AA's or FF's
;
 

c000    Unused                                  EMPTY

;c100   File Manager Routines

c100    Turn LED on
c118    Turn LED on
c123    Clear error flags
c12c    Prepare for LED flash after error
c146    Interpret command from computer
c194    Prepare error msg after executing command
c1bd    Erase input buffer
c1c8    Output error msg (track and sector 0)
c1d1    Check input line
c1e5    Check input line
c1ee    Check input line
c268    Search character in input buffer
c2b3    Check line length ptr in command
c2dc    Clear flags for command input
c312    Preserve drive number
c33c    Search for drive number
c368    Get drive number
c38f    Reverse drive number
c398    ?
c3bd    Check drive number
c3ca    Verify drive number
c440    Flags for drive check                   DATA
c44f    Search for file in directory
c63d    Test and initalise drive
c66e    Name of file in directory buffer
c688    ?
c6a6    Search for end of name in command
c6ce    ?
c6de    ?
c7ac    Clear Directory Output Buffer
c7b7    Create header with disk nmae
c806    Print 'blocks free.'
c817    'Blocks free.'                          DATA
c823    Perform [S] - Scratch command
c87d    Erase file
c8b6    Erase dir entry
c8c1    Perform [D] - Backup command (Unused)
c8c6    Format disk
c8f0    Perform [C] - Copy command
ca88    Perform [R] - Rename command
cacc    Check if file present
caf8    Perform [M] - Memory command
cb20    M-R memory read
cb50    M-W momory write
cb5c    Perform [U] - User command
cb84    Open direct access channel, number
cc1b    Perform [B] - Block/Buffer command
cc5d    Block commands "AFRWEP"                 DATA
cc63    Block command vectors                   WORD
cc6f    Get parameters form block commands
ccf2    Decimal values  1, 10, 100              DATA
ccf5    B-F block free
ccfe    ?
cd03    B-A block allocate
cd36    ?
cd3c    Get byte from buffer
cd42    Read block from disk
cd56    B-R block read
cd5f    U1, Block read without changing buffer pointer
cd73    B-W block write
cd97    U2, Block read without changing buffer pointer
cda3    B-E block execute
cdbd    B-P block pointer
cdd2    Open channel
cdf2    Check buffer number and open channel
ce0e    Set pointer for REL file
cd2c    ?
cd6e    Divide by 254
ce71    Divide by 120
cdd9    Erase work storage
dee2    Left shift 3-byte register twice
cee5    Left shift 3-byte register once
ceed    ?
cefa    ?
cf09    ?
cf1e    ?
cf8c    Change buffer
cf9b    Write data in buffer
cff1    Write data byte in buffer
d005    Perform [I] - Initalise command
d00e    ?
d042    Load BAM
d075    Calculate blocks free
d09b    ?
d0c3    Read block
d0c7    Write block
d0eb    Open channel for reading
d107    Open channel for writing
d125    Check for file type REL
d12f    Get buffer and channel numbers
d137    Get a byte from buffer
d156    Get byte and read next block
d19d    Write byte in buffer and block
d1c6    Increment buffer pointer
d1d3    Get drive number
d1df    Find write channel and buffer
d1e2    Find read channel and buffer
d227    Close channel
d25a    Free buffer
d28e    Find buffer
d307    Close all channels
d313    Close all channels of other drives
d339    ?
d37f    Find channel and allocate
d39b    Get byte for output
d44d    Read next block
d460    Read block
d464    Write block
d475    Allocate buffer and read block
d486    Allocate new block
d48d    Write dir block
d4c8    Set buffer pointer
d4da    Close internal channel
d4e8    Set buffer pointer
d4f6    Get byte from buffer
d506    Check track and sector numbers
d552    Get track and sector numbers for current job
d55f    Check for vaild track and sector numbers
d572    DOS mismatch error
d586    Read block
d58a    Write block
d599    Verify execution
d5c6    Additional attempts for read errors
d676    Move head by half a track
d693    Move head one track in or out
d6a6    Attempt command execution multiple times
d6d0    Transmit param to disk controller
d6e4    Enter file in dir
d7b4    OPEN command, secondary addr not 15
d8f5    Open a file with overwriting
d9a0    Open file for reading
d9e3    Open file for writing
da09    Check file type and control mode
da2a    Preparation for append
da55    Open directory
dac0    Close routine
db02    Close file
db62    Write last block
dba5    Directory entry
dc46    Read block, allocate buffer
dcb6    Reset pointer
dcda    Construct a new block
dd8d    Write byte in side-sector block
dd95    Manipulate flags
ddab    Verify command code for writing
ddb7    ?
ddf1    Write a block of a REL file
ddfd    Write bytes for following track
de0c    Get following track and sector numbers
de19    Following track for last block
de2b    buffer pointer to zero
de3b    Get track and sector
de50    Write (?)
de57    R
de5e    W
de65    R
de6c    W
de73    R
de95    Get following track and sector from buffer
dea5    Copy buffer contents
dec1    Erase buffer Y
ded2    Get side-sector number
dedc    Set buffer pointer to side-sector
dee9    Buffer pointer for side-sector
def8    Get side sector and buffer pointer
df1b    Read side-sector
df21    Write side-sector
df45    Set buffer pointer in side-sector
df4c    Calculate number of blocks in a REL file
df66    Verify side-sector in buffer
df93    Get buffer number
dfd0    Get next record iin REL file
e03c    Write block and read next block
e07c    Write a byte in a record
e0ab    Write byte in REL file
e0f3    Fill record with 0s
e105    Write buffer number in table
e120    Get byte from REL file
e1cb    Get last side-sector
e207    Perform [P] - Position command
e2e2    Divide data blocks into records
e304    Set pointer to next record
e31c    Expand side-sector
e44e    Write side-sector and allocate new
e4fc    Table of error messages                 DATA
;       Format: error numbers
;               description
;       (with start and end letters +$80)  If value AND $7F less
;        than $10 then look up text in pointer table.
;

;e4fc   Ok
;e500   Read error
;e50b   File too large
;e517   Record not present
;e522   Overflow in record
;e52f   Write error
;e533   Write protect on
;d540   Disk id mismatch
;e546   Syntax error
;e552   Write file open
;e556   File exists
;e55f   File type mismatch
;e567   No block
;e570   Illegal track or sector
;e589   File not open
;e58d   File not found
;e592   Files scratched
;e59f   No channel
;e5aa   Dir error
;e5af   Disk full
;e5b6   Cbm dos v2.6 1541
;e5c8   Drive not ready

e5d5    Indexed words                           DATA
;       Format: index number
;               description

e60a    Prepare error number and message
e645    Print error message into error buffer
e680    TALK
e688    LISTEN
e69b    Convert BIN to 2-Ascii (error message buffer)
e6ab    Convert BCD to 2-Ascii (error message buffer)
e6bc    Write OK in buffer
e6c1    Print error on track 00,00 to error buffer
e6c7    Print error on current track to error buffer
e706    Write error message string to buffer
e754    Get character and in buffer
e767    Get a char of the error message
e775    Increment pointer
e77f    ?
e780    Check for auto start removed
e7a3    Perform [&] - USR file execute command
e84b    Generate checksum
e853    IRQ routine for serial bus
e85b    Service the serial bus
e909    Send data
e99c    DATA OUT lo
e9a5    DATA OUT hi
e9ae    CLOCK OUT hi
e9b7    CLOCK OUT lo
e9c0    Read IEEE port
e9c9    Get data byte from bus
e9f2    Accept byte with EOI
ea2e    Accept data from serial bus
ea59    Test for ATN
ea6e    Flash LED for hardware defects, self-test
eaa0    Power-up RESET routine
ebff    Wait loop
ec9e    Load dir
ed23    ?
ed59    Transmit dir line
ed67    Get byte from buffer
ed84    Perform [V] - Validate command
edb3    ?
ede5    Allocate file blocks in BAM
ee0d    Perform [N] - New (Format) command
eeb7    Create BAM
eef4    Write BAM if needed
ef3a    Set buffer pointer for BAM
ef4d    Get number of free blocks for dir
ef5c    Mark block as free
ef88    Set flag for BAM changed
ef90    Mark block as allocated
efcf    Erase bit for sector in BAM entry
efe9    Powers of 2                             DATA
eff1    Write BAM after change
f005    Erase BAM buffer
f011    ?
f05b    ?
f0df    ?
f10f    Get buffer number for BAM
f119    Buffer number for BAM
f11e    Find and allocate free block
f1a9    Find free sector and allocate
f1fa    Find free sectors in current track
f220    Verify number of free blocks in BAM
f24b    Establish number of sectors per track
f258    Dummy subroutine

;
;f259   Disk Controller Routines
;

f259    Initialise disk controller
f2b0    IRQ routine for disk controller
f2f9    Head transport
f36e    Execute program in buffer
f37c    Bump, find track 1 (head at stop)
f393    Initialise pointer in buffer
f3b1    Read block header, verify ID
f410    Preserve block header
f418    Work Return value 01 (OK) into queue
f41b    Work Return value 0B (READ ERROR) into queue
f41e    Work Return value 09 (READ ERROR) into queue
f423    Job optimisation
f4ca    Test command code further
f4d1    Read sector
f50a    Find start of data block
f510    Read block header
f556    Wait for SYNC
f56e    Test command code further
f575    Write data block to disk
f5e9    Calculate parity for data buffer
f5f2    Convert buffer of GCR data into binary
f691    Test command code further
f698    Compare written data with data on disk
f6ca    Command code for find sector
f6d0    Convert 4 binary bytes to 5 GCR bytes
f77f    GCR (5-bit) nybble table                DATA
f78f    Convert 260 bytes to 325 bytes group code
f7e6    Convert 5 GCR bytes to 4 binary bytes
f8a0    Conversion table GCR to binary - high nybble
;       $FF means invalid
f8c0    Conversion table GCR to binary - low nybble
;       $FF means invalid
f8e0    Decode 69 GCR bytes
f934    Convert block header to GCR code
f969    Error entry disk controller
f97e    Turn drive motor on
f98f    Turn drive motor off
f99c    Job loop disk controller
f9cb    ?
f9d9    ?
fa05    Move head to next track
fa1c    Calculate number of head steps
fa3b    Move stepper motor short distance
fa4e    Load head
fa63    ?
fa7b    Prepare fast head movement
fa97    Fast head movement
faa5    Prepare slow head movement
fac7    Formatting
fda3    Write SYNC 10240 times, erase track
fdc3    Read/write ($621/$622) times
fdd3    Attempt counter for formatting
fde5    ?
fdf5    Copy data from overflow buffer
fe00    Switch to reading
fe0e    Write $55 10240 times
fe30    Convert header in buffer 0 to GCR code
fe67    Interrupt routine

fe85    Constands for disk format
fe85    Directory track                         DATA
fe86    Start of bam                            DATA
fe87    Length of bam per track                 DATA
fe88    End of bam                              DATA
fe89    Table of command words                  DATA
;       "VIDMBUP&CRSN"
;       Validate, Initialise, D(Backup unused),
;       Memory, Block, User,
;       Position, ∧USR execute, Copy,
;       Rename, Scratch, New (Format).

fe95    Low  byte of command addresses          DATA
fea1    High byte of command addresses          DATA
fead    Bytes for syntax check                  DATA
feb2    File control methods "RWAM"             DATA
feb6    File types "DSPUL"                      DATA
febb    Names of file types                     DATA
febb    1st letter "DSPUR"                      DATA
fec0    2nd letter "EERSE"                      DATA
fec5    3rd letter "LQGRL"                      DATA
feca    Error LED bit value                     DATA
fecd    Masks for bit command                   DATA
fed1    Number of sectors per track             DATA
fed5    Constands for disk format               DATA
fed5    'A' marker for 1541 format              DATA
fed6    4 track ranges                          DATA
fed7    Number of tracks                        DATA
fed8    Tracks on which sector numbers change   DATA
fedb    Control bytes for head postion          DATA
fee0    Buffer address high bytes               DATA
fee6    ROM checksum                            DATA

fee7    From UI command $EB22, to reset
;       Without RAM/ROM test
feea    Patch for diagnostic routine from $EA7A
fef3    Delay loop for serial bus in 1541 mode, from $E97D
fefb    Patch for data output to serial bus, from $E980
ff01    U9 vector, switch 1540/1541
ff10    Patch for reset routine, from $EAA4
ff20    Patch for listen to serial bus, from $E9DC
ff2f    Unused                                  EMPTY

ffe6    Format  [C8C6]
ffe8    Turn motor off [F98F]

ffea    USER vectors
ffea    UA, U1  [CD5F]
ffec    UB, U2  [CD97]
ffee    UC, U3  [0500]
fff0    UD, U4  [0503]
fff2    UE, U5  [0506]
fff4    UF, U6  [0509]
fff6    UG, U7  [050C]
fff8    UH, U8  [050F]
fffa    UI, U9  [FF01]

fffc    Hardware vectors
fffc    RESET [EAA0]
fffe    IRQ   [FE67]




Converted to a human readable format by the IIRG