      +------------------------------------------------------------------------
      |
      |      DISK-DRIVE 1541: ROM-LISTING
      |
      +------------------------------------------------------------------------
      |
      | ROM-Comments were done by Frank Kontros, used with permission.
      |
      |
      | File Manager Routines:
      |
      |   $C100/49408      Turn LED on for current drive
      |   $C118/49432      Turn LED on
      |   $C123/49443      Clear error flags
      |   $C12C/49452      Prepare for LED flash after error
      |   $C146/49478      Interpret command from computer
      |   $C194/49556      Prepare error msg after executing command
      |   $C1BD/49597      Erase input buffer
      |   $C1C8/49608      Output error msg (track and sector 0)
      |   $C1D1/49617      Check input line
      |   $C1E5/49637      Check ':' on input line
      |   $C1EE/49646      Check input line
      |   $C268/49768      Search character in input buffer
      |   $C2B3/49843      Check line length
      |   $C2DC/49884      Clear flags for command input
      |   $C312/49938      Preserve drive number
      |   $C33C/49980      Search for drive number
      |   $C368/50024      Get drive number
      |   $C38F/50063      Reverse drive number
      |   $C398/50072      Check given file type
      |   $C3BD/50109      Check given drive number
      |   $C3CA/50122      Verify drive number
      |   $C440/50240      Flags for drive check
      |   $C44F/50255      Search for file in directory
      |   $C48B/50315      ?
      |   $C4D8/50392      ?
      |   $C5AC/50604      ?
      |   $C63D/50749      Test and initalise drive
      |   $C66E/50798      Name of file in directory buffer
      |   $C688/50824      Copy filename to work buffer
      |   $C6A6/50854      Search for end of name in command
      |   $C6CE/50894      ?
      |   $C6DE/50910      ?
      |   $C7AC/51116      Clear Directory Output Buffer
      |   $C7B7/51127      Create header with disk name
      |   $C806/51206      Print 'blocks free.'
      |   $C817/51223      'Blocks free.'
      |   $C823/51235      Perform [S] - Scratch command
      |   $C87D/51325      Erase file
      |   $C8B6/51382      Erase dir entry
      |   $C8C1/51393      Perform [D] - Backup command (Unused)
      |   $C8C6/51398      Format disk
      |   $C8F0/51440      Perform [C] - Copy command
      |   $C9A1/51617      ?
      |   $C9A7/51623      ?
      |   $C9D5/51669      ?
      |   $C9FA/51706      ?
      |   $CA35/51765      ?
      |   $CA88/51848      Perform [R] - Rename command
      |   $CACC/51916      Check if file present
      |   $CAF8/51960      Perform [M] - Memory command
      |   $CB20/52000      M-R memory read
      |   $CB50/52048      M-W memory write
      |   $CB5C/52060      Perform [U] - User command
      |   $CB84/52100      Open direct access channel, number
      |   $CC1B/52251      Perform [B] - Block/Buffer command
      |   $CC5D/52317      Block commands "AFRWEP"
      |   $CC63/52323      Block command vectors
      |   $CC6F/52335      Get parameters form block commands
      |   $CCF2/52466      Decimal values  1, 10, 100
      |   $CCF5/52469      B-F block free
      |   $CCFE/52478      ?
      |   $CD03/52483      B-A block allocate
      |   $CD36/52534      Read block to buffer
      |   $CD3C/52540      Get byte from buffer
      |   $CD42/52546      Read block from disk
      |   $CD56/52566      B-R block read
      |   $CD5F/52575      U1, Block read without changing buffer pointer
      |   $CD73/52595      B-W block write
      |   $CD97/52631      U2, Block write without changing buffer pointer
      |   $CDA3/52643      B-E block execute
      |   $CDBD/52669      B-P block pointer
      |   $CDD2/52690      Open channel
      |   $CDF2/52722      Check buffer number and open channel
      |   $CE0E/52750      Set pointer for REL file
      |   $CE2C/52780      ?
      |   $CE6E/52846      Divide by 254
      |   $CE71/52849      Divide by 120
      |   $CED9/52953      Erase work storage
      |   $CEE2/52962      Left shift 3-byte register twice
      |   $CEE5/52965      Left shift 3-byte register once
      |   $CEED/52973      Add 3-byte registers
      |   $CEFA/52986      ?
      |   $CF09/53001      ?
      |   $CF1E/53022      ?
      |   $CF8C/53132      Change buffer
      |   $CF9B/53147      Write data in buffer
      |   $CFF1/53233      Write data byte in buffer
      |   $D005/53253      Perform [I] - Initalise command
      |   $D00E/53262      Read BAM from disk
      |   $D042/53314      Load BAM
      |   $D075/53365      Calculate blocks free
      |   $D09B/53403      ?
      |   $D0AF/53423      ?
      |   $D0C3/53443      Read block
      |   $D0C7/53447      Write block
      |   $D0EB/53483      Open channel for reading
      |   $D107/53511      Open channel for writing
      |   $D125/53541      Check for file type REL
      |   $D12F/53551      Get buffer and channel numbers
      |   $D137/53559      Get a byte from buffer
      |   $D156/53590      Get byte and read next block
      |   $D19D/53661      Write byte in buffer and block
      |   $D1C6/53702      Increment buffer pointer
      |   $D1D3/53715      Get drive number
      |   $D1DF/53727      Find write channel and buffer
      |   $D1E2/53730      Find read channel and buffer
      |   $D227/53799      Close channel
      |   $D25A/53850      Free buffer
      |   $D28E/53902      Find buffer
      |   $D2BA/53946      ?
      |   $D2DA/53978      ?
      |   $D307/54023      Close all channels
      |   $D313/54035      Close all channels of other drives
      |   $D339/54073      ?
      |   $D37F/54143      Find channel and allocate
      |   $D39B/54171      Get byte for output
      |   $D44D/54349      Read next block
      |   $D460/54368      Read block
      |   $D464/54372      Write block
      |   $D475/54389      Allocate buffer and read block
      |   $D486/54406      Allocate new block
      |   $D48D/54413      Write dir block
      |   $D4C8/54472      Set buffer pointer
      |   $D4DA/54490      Close internal channel
      |   $D4E8/54504      Set buffer pointer
      |   $D4F6/54518      Get byte from buffer
      |   $D506/54534      Check track and sector numbers
      |   $D552/54610      Get track and sector numbers for current job
      |   $D55F/54623      Check for vaild track and sector numbers
      |   $D572/54642      DOS mismatch error
      |   $D586/54662      Read block
      |   $D58A/54666      Write block
      |   $D599/54681      Verify execution
      |   $D5C6/54726      Additional attempts for read errors
      |   $D676/54902      Move head by half a track
      |   $D693/54931      Move head one track in or out
      |   $D6A6/54950      Attempt command execution multiple times
      |   $D6D0/54992      Transmit param to disk controller
      |   $D6E4/55012      Enter file in dir
      |   $D7B4/55220      OPEN command, secondary addr 15
      |   $D7C7/55239      -Check '*' Last file
      |   $D7F3/55283      -Check '$' Directory
      |   $D815/55317      -Check '#' Channel
      |   $D8F5/55541      Open a file with overwriting (@)
      |   $D940/55616      ?
      |   $D9A0/55712      Open file for reading
      |   $D9E3/55779      Open file for writing
      |   $DA09/55817      Check file type and control mode
      |   $DA2A/55850      Preparation for append
      |   $DA55/55893      Open directory
      |   $DAC0/56000      Close routine
      |   $DB02/56066      Close file
      |   $DB62/56162      Write last block
      |   $DBA5/56229      Directory entry
      |   $DC46/56390      Read block, allocate buffer
      |   $DCB6/56502      Reset pointer
      |   $DCDA/56538      Construct a new block
      |   $DD8D/56717      Write byte in side-sector block
      |   $DD95/56725      Manipulate flags
      |   $DDA6/56742      ?
      |   $DDAB/56747      Verify command code for writing
      |   $DDB7/56759      ?
      |   $DDF1/56817      Write a block of a REL file
      |   $DDFD/56829      Write bytes for following track
      |   $DE0C/56844      Get following track and sector numbers
      |   $DE19/56857      Following track for last block
      |   $DE2B/56875      buffer pointer to zero
      |   $DE3B/56891      Get track and sector
      |   $DE50/56912      Write
      |   $DE57/56919      Read
      |   $DE5E/56926      Write
      |   $DE65/56933      Read
      |   $DE6C/56940      Write
      |   $DE73/56947      Read
      |   $DE95/56981      Get following track and sector from buffer
      |   $DEA5/56997      Copy buffer contents
      |   $DEC1/57025      Erase buffer Y
      |   $DED2/57042      Get side-sector number
      |   $DEDC/57052      Set buffer pointer to side-sector
      |   $DEE9/57065      Buffer pointer for side-sector
      |   $DEF8/57080      Get side sector and buffer pointer
      |   $DF1B/57115      Read side-sector
      |   $DF21/57121      Write side-sector
      |   $DF45/57157      Set buffer pointer in side-sector
      |   $DF4C/57164      Calculate number of blocks in a REL file
      |   $DF66/57190      Verify side-sector in buffer
      |   $DF93/57235      Get buffer number
      |   $DF9E/57246      ?
      |   $DFB7/57271      ?
      |   $DFC2/57282      ?
      |   $DFD0/57296      Get next record iin REL file
      |   $E03C/57404      Write block and read next block
      |   $E07C/57468      Write a byte in a record
      |   $E0AB/57515      Write byte in REL file
      |   $E0F3/57587      Fill record with 0s
      |   $E105/57605      Write buffer number in table
      |   $E120/57632      Get byte from REL file
      |   $E1CB/57803      Get last side-sector
      |   $E207/57863      Perform [P] - Position command
      |   $E2E2/58082      Divide data blocks into records
      |   $E304/58116      Set pointer to next record
      |   $E31C/58140      Expand side-sector
      |   $E44E/58446      Write side-sector and allocate new
      |   $E4FC/58620      Table of Error Messages: 00,     Ok
      |   $E500/58624      Error Message: 20,21,22,23,24,27, Read error
      |   $E50B/58635      Error Message: 52, File too large
      |   $E517/58647      Error Message: 50, Record not present
      |   $E522/58658      Error Message: 51, Overflow in record
      |   $E52F/58671      Error Message: 25,28, Write error
      |   $E533/58675      Error Message: 26, Write protect on
      |   $E540/58688      Error Message: 29, Disk id mismatch
      |   $E546/58694      Error Message: 30,31,32,33,34, Syntax error
      |   $E552/58706      Error Message: 60, Write file open
      |   $E556/58710      Error Message: 63, File exists
      |   $E55F/58719      Error Message: 64, File type mismatch
      |   $E567/58727      Error Message: 65, No block
      |   $E570/58736      Error Message: 66,67, Illegal track or sector
      |   $E589/58761      Error Message: 61, File not open
      |   $E58D/58765      Error Message: 39,62, File not found
      |   $E592/58770      Error Message: 01, Files scratched
      |   $E59F/58783      Error Message: 70, No channel
      |   $E5AA/58794      Error Message: 71, Dir error
      |   $E5AF/58799      Error Message: 72, Disk full
      |   $E5B6/58806      Error Message: 73, Cbm dos v2.6 1541
      |   $E5C8/58824      Error Message: 74, Drive not ready
      |   $E5D5/58837      Indexed words: 09 Error
      |   $E5DB/58843      Indexed words: 0A Write
      |   $E5E1/58849      Indexed words: 03 File
      |   $E5E6/58854      Indexed words: 04 Open
      |   $E5EB/58859      Indexed words: 05 Mismatch
      |   $E5F4/58868      Indexed words: 06 Not
      |   $E5F8/58872      Indexed words: 07 Found
      |   $E5FE/58878      Indexed words: 08 Disk
      |   $E603/58883      Indexed words: 0B Record
      |   $E60A/58890      Prepare error number and message
      |   $E645/58949      Print error message into error buffer
      |   $E680/59008      TALK
      |   $E688/59016      LISTEN
      |   $E69B/59035      Convert BIN to 2-Ascii (error message buffer)
      |   $E6AB/59051      Convert BCD to 2-Ascii (error message buffer)
      |   $E6BC/59068      Write OK in buffer
      |   $E6C1/59073      Print error on track 00,00 to error buffer
      |   $E6C7/59079      Print error on current track to error buffer
      |   $E706/59142      Write error message string to buffer
      |   $E754/59220      Get character and in buffer
      |   $E767/59239      Get a char of the error message
      |   $E775/59253      Increment pointer
      |   $E77F/59263      Dummy subroutine
      |   $E780/59264      Check for auto start - removed
      |   $E7A3/59299      Perform [&] - USR file execute command
      |   $E84B/59467      Generate checksum
      |   $E853/59475      IRQ routine for serial bus
      |   $E85B/59483      Service the serial bus
      |   $E909/59657      Send data
      |   $E99C/59804      DATA OUT lo
      |   $E9A5/59813      DATA OUT hi
      |   $E9AE/59822      CLOCK OUT hi
      |   $E9B7/59831      CLOCK OUT lo
      |   $E9C0/59840      Read IEEE port
      |   $E9C9/59849      Get data byte from bus
      |   $E9F2/59890      Accept byte with EOI
      |   $EA2E/59950      Accept data from serial bus
      |   $EA59/59993      Test for ATN
      |   $EA6E/60014      Flash LED for hardware defects, self-test
      |   $EAA0/60064      Power-up RESET routine
      |   $EBFF/60415      Wait loop
      |   $EC9E/60574      Load dir
      |   $ED23/60707      ?
      |   $ED59/60761      Transmit dir line
      |   $ED67/60775      Get byte from buffer
      |   $ED84/60804      Perform [V] - Validate command
      |   $EDB3/60851      ?
      |   $EDE5/60901      Allocate file blocks in BAM
      |   $EE0D/60941      Perform [N] - New (Format) command
      |   $EEB7/61111      Create BAM
      |   $EEF4/61172      Write BAM if needed
      |   $EF3A/61242      Set buffer pointer for BAM
      |   $EF4D/61261      Get number of free blocks for dir
      |   $EF5C/61276      Mark block as free
      |   $EF88/61320      Set flag for BAM changed
      |   $EF90/61328      Mark block as allocated
      |   $EFCF/61391      Erase bit for sector in BAM entry
      |   $EFE9/61417      Powers of 2
      |   $EFF1/61425      Write BAM after change
      |   $F005/61445      Erase BAM buffer
      |   $F011/61457      ?
      |   $F05B/61531      ?
      |   $F0D1/61649      ?
      |   $F0DF/61663      ?
      |   $F10F/61711      Get buffer number for BAM
      |   $F119/61721      Buffer number for BAM
      |   $F11E/61726      Find and allocate free block
      |   $F1A9/61865      Find free sector and allocate
      |   $F1FA/61946      Find free sectors in current track
      |   $F220/61984      Verify number of free blocks in BAM
      |   $F24B/62027      Establish number of sectors per track
      |   $F258/62040      Dummy subroutine
      |
      | Disk Controller Routines:
      |
      |   $F259/62041      Initialise disk controller
      |   $F2B0/62128      IRQ routine for disk controller
      |   $F2F9/62201      Head transport
      |   $F36E/62318      Execute program in buffer
      |   $F37C/62332      Bump, find track 1 (head at stop)
      |   $F393/62355      Initialise pointer in buffer
      |   $F3B1/62385      Read block header, verify ID
      |   $F410/62480      Preserve block header
      |   $F418/62488      Work Return value 01 (OK) into queue
      |   $F41B/62491      Work Return value 0B (READ ERROR) into queue
      |   $F41E/62494      Work Return value 09 (READ ERROR) into queue
      |   $F423/62499      Job optimisation
      |   $F4CA/62666      Test command code further
      |   $F4D1/62673      Read sector
      |   $F50A/62730      Find start of data block
      |   $F510/62736      Read block header
      |   $F556/62806      Wait for SYNC
      |   $F56E/62830      Test command code further
      |   $F575/62837      Write data block to disk
      |   $F5E9/62953      Calculate parity for data buffer
      |   $F5F2/62962      Convert buffer of GCR data into binary
      |   $F691/63121      Test command code further
      |   $F698/63128      Compare written data with data on disk
      |   $F6CA/63178      Command code for find sector
      |   $F6D0/63184      Convert 4 binary bytes to 5 GCR bytes
      |   $F77F/63359      GCR (5-bit) nybble table
      |   $F78F/63375      Convert 260 bytes to 325 bytes group code
      |   $F7E6/63462      Convert 5 GCR bytes to 4 binary bytes
      |   $F8A0/63648      Conversion table GCR to binary - high nybble
      |   $F8C0/63680      Conversion table GCR to binary - low nybble
      |   $F8E0/63712      Decode 69 GCR bytes
      |   $F934/63796      Convert block header to GCR code
      |   $F969/63849      Error entry disk controller
      |   $F97E/63870      Turn drive motor on
      |   $F98F/63887      Turn drive motor off
      |   $F99C/63900      Job loop disk controller
      |   $F9CB/63947      ?
      |   $F9D9/63961      ?
      |   $FA05/64005      Move head to next track
      |   $FA1C/64028      Calculate number of head steps
      |   $FA3B/64059      Move stepper motor short distance
      |   $FA4E/64078      Load head
      |   $FA63/64099      ?
      |   $FA7B/64123      Prepare fast head movement
      |   $FA97/64151      Fast head movement
      |   $FAA5/64165      Prepare slow head movement
      |   $FAC7/64199      Formatting
      |   $FDA3/64931      Write SYNC 10240 times, erase track
      |   $FDC3/64963      Read/write ($621/$622) times
      |   $FDD3/64979      Attempt counter for formatting
      |   $FDE5/64997      ?
      |   $FDF5/65013      Copy data from overflow buffer
      |   $FE00/65024      Switch to reading
      |   $FE0E/65038      Write $55 10240 times
      |   $FE30/65072      Convert header in buffer 0 to GCR code
      |   $FE67/65127      Interrupt routine
      |   $FE85/65157      Constant: Directory track
      |   $FE86/65158      Constant: Start of bam
      |   $FE87/65159      Constant: Length of bam per track
      |   $FE88/65160      Constant: End of bam
      |   $FE89/65161      Table of command words
      |   $FE95/65173      Low  byte of command addresses
      |   $FEA1/65185      High byte of command addresses
      |   $FEAD/65197      Bytes for syntax check
      |   $FEB2/65202      File control methods "RWAM"
      |   $FEB6/65206      File types "DSPUL"
      |   $FEBB/65211      Names of file types: 1st letter "DSPUR"
      |   $FEC0/65216      Names of file types: 2nd letter "EERSE"
      |   $FEC5/65221      Names of file types: 3rd letter "LQGRL"
      |   $FECA/65226      Error LED bit value
      |   $FECD/65229      Masks for bit command
      |   $FED1/65233      Number of sectors per track
      |   $FED5/65237      'A' marker for 1541 format
      |   $FED6/65238      4 track ranges
      |   $FED7/65239      Number of tracks
      |   $FED8/65240      Tracks on which sector numbers change
      |   $FEDB/65243      Control bytes for head postion
      |   $FEE0/65248      Buffer address high bytes
      |   $FEE6/65254      ROM checksum
      |   $FEE7/65255      From UI command $EB22, to reset (Without RAM/ROM test)
      |   $FEEA/65258      Patch for diagnostic routine from $EA7A
      |   $FEF3/65267      Delay loop for serial bus in 1541 mode, from $E97D
      |   $FEFB/65275      Patch for data output to serial bus, from $E980
      |   $FF01/65281      U9 vector, switch 1540/1541
      |   $FF10/65296      Patch for reset routine, from $EAA4
      |   $FF20/65312      Patch for listen to serial bus, from $E9DC
      |   $FF2F/65327      Unused
      |   $FFE6/65510      Format  [C8C6]
      |   $FFE8/65512      Turn motor off [F98F]
      |   $FFEA/65514      USER vectors: UA, U1  [CD5F]
      |   $FFEC/65516      USER vectors: UB, U2  [CD97]
      |   $FFEE/65518      USER vectors: UC, U3  [0500]
      |   $FFF0/65520      USER vectors: UD, U4  [0503]
      |   $FFF2/65522      USER vectors: UE, U5  [0506]
      |   $FFF4/65524      USER vectors: UF, U6  [0509]
      |   $FFF6/65526      USER vectors: UG, U7  [050C]
      |   $FFF8/65528      USER vectors: UH, U8  [050F]
      |   $FFFA/65530      USER vectors: UI, U9  [FF01]
      |   $FFFC/65532      Hardware vectors: RESET [EAA0]
      |   $FFFE/65534      Hardware vectors: IRQ   [FE67]
      |
      +------------------------------------------------------------------------