• Please review our updated Terms and Rules here

Liveport FDM 180 disk unit for Exidy Sorcerer

JonB

Veteran Member
Joined
Jan 26, 2014
Messages
1,652
Location
South Herefordshire, UK
Hello

I just got a Liveport FDM 180 disk unit. Plugs into the Sorcerer's S100 expansion port. Has anyone got any documentation for it? I have the two sheet user guide but I'm seeking something more technical.

Cheers
JonB
 
Do you have a picture on the control board - the unit I had years ago (not sure who made it) was a exidy card and 2 MPI drives(IIRC) with a boot cartridge after power on you had to issue go e800 or something like that.

Jim
 
It's not the same unit. The boot ROM is integrated into the drive itself, apparently.


Front of drive. Looks like a Tandon TM100 unit, save for the mechanical lock button and hard sectored disks.

IMG_0999.jpg


S-100 interface adapter. Has no markings (on component side). I assume the labelled ICs are ROMs of some sort, which get put at BC00h in the Sorcerer's memory map. I would like to find out the purpose of the DIP switch. Possibly to locate the ROM in Sorcerer memory? The value is 00100001 or 10000100 depending on the orientation; that is 21h or 84h. The edge connector to the left hand side connects via a ribbon cable to the Sorcerer's S-100 expansion bus.

IMG_0998.jpg


There is a fat ribbon cable running across the top of the drive that joins the S-100 adapter to the drive controller board (pictured below). The cable on the left connects to the (presumed) Shugart interface on the drive. The board is marked "Liveport Ltd 1980 Copyright D C Stevens". An edge connector on the left presumably allows additional drives to be connected.

IMG_0997.jpg
 
Last edited:
OK, the ROM is identified as Signetics N82S126N PROM. There are two of them on the S-100 board, labelled 3E and 4E respectively. These are 256x4 ROMs, there are two of them, giving 256 bytes for the Sorcerer's disk boot code.

Does not look like my EPROM reader (TOP 853) can handle these...

However - the DIP switch does appear to locate the boot ROM in memory. I tried turning the first switch off and the Sorcerer reports RAMTOP at 5BFF; looking at the memory from 5C00 - 5CFF appears to show the ROM content. Definitely something odd going on in the upper memory decoding on the Sorcerer's mainboard.

With ROM located at DE00h:
IMG_1001.jpg

Lots of missing data there!

EDIT: Better ignore that! It's DC00, and I can see the ROM there with the ICE. Duhh.. :headslap:

Code:
DC00   F2 2F A2 00 F9 3F C9 CD-A2 0F EB 2A A0 0F 2E 00    ./...?.....*....
DC10   E5 0F 1D 00 01 EF E1 0E-12 0F 06 BD EB 3F 3B 1A    .............?;.
DC20   70 BF C0 23 10 0F C0 E1-20 AF 00 11 00 0F 19 22    p..#.... ......"
DC30   A2 0F 36 A0 C0 DF 00 00-00 0F 00 2A A2 0F 7E E6    ..6........*....
DC40   80 CF A9 00 7E EF 0F A8-C0 AF 00 23 B6 FF B7 00    ...........#....
DC50   23 7F AF EB 00 0F 00 00-12 7F 23 88 47 1F 77 23    #.........#.G.w#
DC60   88 4F 0D C2 C2 0F 1A B8-C0 2F A2 00 32 2F 23 7E    .O......./..2/#.
DC70   20 EF 24 EE 20 CF D4 00-0C 5F CD 49 00 2F 7E 2B     .$. ...._.I./.+
DC80   E6 2F EE 20 C0 DF 00 23-78 EF 08 2B C0 0F 01 06    ./. ...#x..+....
DC90   00 3F 61 0E 09 CF 49 01-04 CF FC 00 22 7F E6 08    .?a...I....."...
DCA0   29 CF 19 01 36 6F 0E 0F-C1 4F 01 C3 01 0F 21 5F    )...6o...O....!_
DCB0   01 CF 37 01 C0 DF 00 2A-60 0F 22 A4 00 CF 37 01    ..7....*`."...7.
DCC0   C0 DF 00 2A A0 0F 11 0C-00 1F D1 E9 E1 EF 01 86    ...*............
DCD0   00 CF A6 00 E1 CF 37 01-E1 7F 23 B6 E0 CF 7E E6    ......7...#.....
DCE0   20 7F C2 51 01 0F 4F 3E-F1 DF 01 B7 C0 5F 01 0D     ..Q..O>....._..
DCF0   C0 5F 01 C9 00 0F 00 00-00 0F 00 00 00 CF A6 00    ._..............
With ROM located at 5C00h:
IMG_1002.jpg

So I think the boot ROMs look intact, which is good. There appears to be some oddness around the screen display too - some values are flickering and the address changes from 5Cnn to 1Cnn.

Calling the boot code at 5C00 caused the drive light to flicker and the head carriage appears to be making some weak attempt at moving, but the motor doesn't start. I have seen the motor fire up before though. The head carriage and motor may need lubrication, I have not yet opened the drive up for a service.

[Edit 2: I wasn't able to recreate the drive activity, but I have serviced the head carriage..]
 
Last edited:
Well I take it back. The CPU is in a socket (circled in red).

You can also see all the patch wires for the memory upgrade (circled in yellow). Fortunately I have the instructions for this, so should be able to derive the circuit.

IMG_1004.jpg

Time to try the ICE, methinks...
 
For the DIP switch settings could be negative logic so they could DE or EB but my bet would be DE - which could mean your boot address could be DE00.

Jim
 
Actually, DC00 as far as I can tell. I edited post #4.

Disassembled it looks like this:

Code:
DC00 F2 2F A2       JP P,A22F
DC03 00             NOP
DC04 F9             LD SP,HL
DC05 3F             CCF
DC06 C9             RET
DC07 CD A2 0F       CALL 0FA2
DC0A EB             EX DE,HL
DC0B 2A A0 0F       LD HL,(0FA0)
DC0E 2E 00          LD L,00
DC10 E5             PUSH HL
DC11 0F             RRCA
DC12 1D             DEC E
DC13 00             NOP
DC14 01 EF E1       LD BC,E1EF
DC17 0E 12          LD C,12
DC19 0F             RRCA
DC1A 06 BD          LD B,BD
DC1C EB             EX DE,HL
DC1D 3F             CCF
DC1E 3B             DEC SP
DC1F 1A             LD A,(DE)
DC20 70             LD (HL),B
DC21 BF             CP A
DC22 C0             RET NZ
DC23 23             INC HL
DC24 10 0F          DJNZ DC35
DC26 C0             RET NZ
DC27 E1             POP HL
DC28 20 AF          JR NZ,DBD9
DC2A 00             NOP
DC2B 11 00 0F       LD DE,0F00
DC2E 19             ADD HL,DE
DC2F 22 A2 0F       LD (0FA2),HL
DC32 36 A0          LD (HL),A0
DC34 C0             RET NZ
DC35 DF             RST 18
DC36 00             NOP
DC37 00             NOP
DC38 00             NOP
DC39 0F             RRCA
DC3A 00             NOP
DC3B 2A A2 0F       LD HL,(0FA2)
DC3E 7E             LD A,(HL)
DC3F E6 80          AND 80
DC41 CF             RST 08
DC42 A9             XOR C
DC43 00             NOP
DC44 7E             LD A,(HL)
DC45 EF             RST 28
DC46 0F             RRCA
DC47 A8             XOR B
DC48 C0             RET NZ
DC49 AF             XOR A
DC4A 00             NOP
DC4B 23             INC HL
DC4C B6             OR (HL)
DC4D FF             RST 38
DC4E B7             OR A
DC4F 00             NOP
DC50 23             INC HL
DC51 7F             LD A,A
DC52 AF             XOR A
DC53 EB             EX DE,HL
DC54 00             NOP
DC55 0F             RRCA
DC56 00             NOP
DC57 00             NOP
DC58 12             LD (DE),A
DC59 7F             LD A,A
DC5A 23             INC HL
DC5B 88             ADC A,B
DC5C 47             LD B,A
DC5D 1F             RRA
DC5E 77             LD (HL),A
DC5F 23             INC HL
DC60 88             ADC A,B
DC61 4F             LD C,A
DC62 0D             DEC C
DC63 C2 C2 0F       JP NZ,0FC2
DC66 1A             LD A,(DE)
DC67 B8             CP B
DC68 C0             RET NZ
DC69 2F             CPL
DC6A A2             AND D
DC6B 00             NOP
DC6C 32 2F 23       LD (232F),A
DC6F 7E             LD A,(HL)
DC70 20 EF          JR NZ,DC61
DC72 24             INC H
DC73 EE 20          XOR 20
DC75 CF             RST 08
DC76 D4 00 0C       CALL NC,0C00
DC79 5F             LD E,A
DC7A CD 49 00       CALL 0049
DC7D 2F             CPL
DC7E 7E             LD A,(HL)
DC7F 2B             DEC HL
DC80 E6 2F          AND 2F
DC82 EE 20          XOR 20
DC84 C0             RET NZ
DC85 DF             RST 18
DC86 00             NOP
DC87 23             INC HL
DC88 78             LD A,B
DC89 EF             RST 28
DC8A 08             EX AF,AF'
DC8B 2B             DEC HL
DC8C C0             RET NZ
DC8D 0F             RRCA
DC8E 01 06 00       LD BC,0006
DC91 3F             CCF
DC92 61             LD H,C
DC93 0E 09          LD C,09
DC95 CF             RST 08
DC96 49             LD C,C
DC97 01 04 CF       LD BC,CF04
DC9A FC 00 22       CALL M,2200
DC9D 7F             LD A,A
DC9E E6 08          AND 08
DCA0 29             ADD HL,HL
DCA1 CF             RST 08
DCA2 19             ADD HL,DE
DCA3 01 36 6F       LD BC,6F36
DCA6 0E 0F          LD C,0F
DCA8 C1             POP BC
DCA9 4F             LD C,A
DCAA 01 C3 01       LD BC,01C3
DCAD 0F             RRCA
DCAE 21 5F 01       LD HL,015F
DCB1 CF             RST 08
DCB2 37             SCF
DCB3 01 C0 DF       LD BC,DFC0
DCB6 00             NOP
DCB7 2A 60 0F       LD HL,(0F60)
DCBA 22 A4 00       LD (00A4),HL
DCBD CF             RST 08
DCBE 37             SCF
DCBF 01 C0 DF       LD BC,DFC0
DCC2 00             NOP
DCC3 2A A0 0F       LD HL,(0FA0)
DCC6 11 0C 00       LD DE,000C
DCC9 1F             RRA
DCCA D1             POP DE
DCCB E9             JP HL
DCCC E1             POP HL
DCCD EF             RST 28
DCCE 01 86 00       LD BC,0086
DCD1 CF             RST 08
DCD2 A6             AND (HL)
DCD3 00             NOP
DCD4 E1             POP HL
DCD5 CF             RST 08
DCD6 37             SCF
DCD7 01 E1 7F       LD BC,7FE1
DCDA 23             INC HL
DCDB B6             OR (HL)
DCDC E0             RET PO
DCDD CF             RST 08
DCDE 7E             LD A,(HL)
DCDF E6 20          AND 20
DCE1 7F             LD A,A
DCE2 C2 51 01       JP NZ,0151
DCE5 0F             RRCA
DCE6 4F             LD C,A
DCE7 3E F1          LD A,F1
DCE9 DF             RST 18
DCEA 01 B7 C0       LD BC,C0B7
DCED 5F             LD E,A
DCEE 01 0D C0       LD BC,C00D
DCF1 5F             LD E,A
DCF2 01 C9 00       LD BC,00C9
DCF5 0F             RRCA
DCF6 00             NOP
DCF7 00             NOP
DCF8 00             NOP
DCF9 0F             RRCA
DCFA 00             NOP
DCFB 00             NOP
DCFC 00             NOP
DCFD CF             RST 08
DCFE A6             AND (HL)
DCFF 00             NOP

..which seems at least partially corrupted to me.
 
Hello

I just got a Liveport FDM 180 disk unit. Plugs into the Sorcerer's S100 expansion port. Has anyone got any documentation for it? I have the two sheet user guide but I'm seeking something more technical.

Cheers
JonB

Correction... The Sorcerer's expansion port is not strictly S100; it's just that Exidy produced an expansion box that had an S-100 rack inside, and this plugged into the Sorcerer's non S-100 expansion port.
 
Let me know what you need.

You're still looking for additional technical documentation and you still have fears that the onboard firmware is corrupt?
Was this Sorcerer and the drives originally a 'matched set' that worked in the past?
 
You're still looking for additional technical documentation and you still have fears that the onboard firmware is corrupt?

Yes and yes.

Was this Sorcerer and the drives originally a 'matched set' that worked in the past?

Yes, it was a (previously) working drive unit supplied with the Sorcerer.. I suspect many issues - not least of which, the 50 way cable which connects the Sorcerer to the drive. Very old and stiff. But I was able to see the ROM content on the drive, assuming it wasn't corrupt. If you review the thread you can see the screenshots and disk boot ROM dumps.
 
Yes, it was a (previously) working drive unit supplied with the Sorcerer.. I suspect many issues - not least of which, the 50 way cable which connects the Sorcerer to the drive. Very old and stiff. But I was able to see the ROM content on the drive, assuming it wasn't corrupt. If you review the thread you can see the screenshots and disk boot ROM dumps.

I would be happy to send you some connectors if you want want to make up a new cable.
Do you have many disk of software for this setup?
 
Hi exidyboy

I have some software - three boot disks I believe, which may or may not be readable. I sent them to a friend to be imaged, not sure if he managed it or not (I've just asked via email). There's no need to send connectors halfway round the world, I can probably cobble something together! But the Sorcerer and its drive are in deep hibernation at the moment, so no time soon.

Cheers
JonB
 
Actually, DC00 as far as I can tell. I edited post #4.

Disassembled it looks like this:

Code:
DC00 F2 2F A2       JP P,A22F
DC03 00             NOP
DC04 F9             LD SP,HL
DC05 3F             CCF
DC06 C9             RET
DC07 CD A2 0F       CALL 0FA2
DC0A EB             EX DE,HL
DC0B 2A A0 0F       LD HL,(0FA0)
DC0E 2E 00          LD L,00
DC10 E5             PUSH HL
DC11 0F             RRCA
DC12 1D             DEC E
DC13 00             NOP
DC14 01 EF E1       LD BC,E1EF
DC17 0E 12          LD C,12
DC19 0F             RRCA
DC1A 06 BD          LD B,BD
DC1C EB             EX DE,HL
DC1D 3F             CCF
DC1E 3B             DEC SP
DC1F 1A             LD A,(DE)
DC20 70             LD (HL),B
DC21 BF             CP A
DC22 C0             RET NZ
DC23 23             INC HL
DC24 10 0F          DJNZ DC35
DC26 C0             RET NZ
DC27 E1             POP HL
DC28 20 AF          JR NZ,DBD9
DC2A 00             NOP
DC2B 11 00 0F       LD DE,0F00
DC2E 19             ADD HL,DE
DC2F 22 A2 0F       LD (0FA2),HL
DC32 36 A0          LD (HL),A0
DC34 C0             RET NZ
DC35 DF             RST 18
DC36 00             NOP
DC37 00             NOP
DC38 00             NOP
DC39 0F             RRCA
DC3A 00             NOP
DC3B 2A A2 0F       LD HL,(0FA2)
DC3E 7E             LD A,(HL)
DC3F E6 80          AND 80
DC41 CF             RST 08
DC42 A9             XOR C
DC43 00             NOP
DC44 7E             LD A,(HL)
DC45 EF             RST 28
DC46 0F             RRCA
DC47 A8             XOR B
DC48 C0             RET NZ
DC49 AF             XOR A
DC4A 00             NOP
DC4B 23             INC HL
DC4C B6             OR (HL)
DC4D FF             RST 38
DC4E B7             OR A
DC4F 00             NOP
DC50 23             INC HL
DC51 7F             LD A,A
DC52 AF             XOR A
DC53 EB             EX DE,HL
DC54 00             NOP
DC55 0F             RRCA
DC56 00             NOP
DC57 00             NOP
DC58 12             LD (DE),A
DC59 7F             LD A,A
DC5A 23             INC HL
DC5B 88             ADC A,B
DC5C 47             LD B,A
DC5D 1F             RRA
DC5E 77             LD (HL),A
DC5F 23             INC HL
DC60 88             ADC A,B
DC61 4F             LD C,A
DC62 0D             DEC C
DC63 C2 C2 0F       JP NZ,0FC2
DC66 1A             LD A,(DE)
DC67 B8             CP B
DC68 C0             RET NZ
DC69 2F             CPL
DC6A A2             AND D
DC6B 00             NOP
DC6C 32 2F 23       LD (232F),A
DC6F 7E             LD A,(HL)
DC70 20 EF          JR NZ,DC61
DC72 24             INC H
DC73 EE 20          XOR 20
DC75 CF             RST 08
DC76 D4 00 0C       CALL NC,0C00
DC79 5F             LD E,A
DC7A CD 49 00       CALL 0049
DC7D 2F             CPL
DC7E 7E             LD A,(HL)
DC7F 2B             DEC HL
DC80 E6 2F          AND 2F
DC82 EE 20          XOR 20
DC84 C0             RET NZ
DC85 DF             RST 18
DC86 00             NOP
DC87 23             INC HL
DC88 78             LD A,B
DC89 EF             RST 28
DC8A 08             EX AF,AF'
DC8B 2B             DEC HL
DC8C C0             RET NZ
DC8D 0F             RRCA
DC8E 01 06 00       LD BC,0006
DC91 3F             CCF
DC92 61             LD H,C
DC93 0E 09          LD C,09
DC95 CF             RST 08
DC96 49             LD C,C
DC97 01 04 CF       LD BC,CF04
DC9A FC 00 22       CALL M,2200
DC9D 7F             LD A,A
DC9E E6 08          AND 08
DCA0 29             ADD HL,HL
DCA1 CF             RST 08
DCA2 19             ADD HL,DE
DCA3 01 36 6F       LD BC,6F36
DCA6 0E 0F          LD C,0F
DCA8 C1             POP BC
DCA9 4F             LD C,A
DCAA 01 C3 01       LD BC,01C3
DCAD 0F             RRCA
DCAE 21 5F 01       LD HL,015F
DCB1 CF             RST 08
DCB2 37             SCF
DCB3 01 C0 DF       LD BC,DFC0
DCB6 00             NOP
DCB7 2A 60 0F       LD HL,(0F60)
DCBA 22 A4 00       LD (00A4),HL
DCBD CF             RST 08
DCBE 37             SCF
DCBF 01 C0 DF       LD BC,DFC0
DCC2 00             NOP
DCC3 2A A0 0F       LD HL,(0FA0)
DCC6 11 0C 00       LD DE,000C
DCC9 1F             RRA
DCCA D1             POP DE
DCCB E9             JP HL
DCCC E1             POP HL
DCCD EF             RST 28
DCCE 01 86 00       LD BC,0086
DCD1 CF             RST 08
DCD2 A6             AND (HL)
DCD3 00             NOP
DCD4 E1             POP HL
DCD5 CF             RST 08
DCD6 37             SCF
DCD7 01 E1 7F       LD BC,7FE1
DCDA 23             INC HL
DCDB B6             OR (HL)
DCDC E0             RET PO
DCDD CF             RST 08
DCDE 7E             LD A,(HL)
DCDF E6 20          AND 20
DCE1 7F             LD A,A
DCE2 C2 51 01       JP NZ,0151
DCE5 0F             RRCA
DCE6 4F             LD C,A
DCE7 3E F1          LD A,F1
DCE9 DF             RST 18
DCEA 01 B7 C0       LD BC,C0B7
DCED 5F             LD E,A
DCEE 01 0D C0       LD BC,C00D
DCF1 5F             LD E,A
DCF2 01 C9 00       LD BC,00C9
DCF5 0F             RRCA
DCF6 00             NOP
DCF7 00             NOP
DCF8 00             NOP
DCF9 0F             RRCA
DCFA 00             NOP
DCFB 00             NOP
DCFC 00             NOP
DCFD CF             RST 08
DCFE A6             AND (HL)
DCFF 00             NOP

..which seems at least partially corrupted to me.

I've obtained a dump of the PROMs for you from another owner of the drive.
View attachment FD180.dat.zip

It does indeed appear that the low order nybble is flapping around in your dump for some reason.

Also a disassembly listing courtesy RedSkullDC.

Code:
RAM:DC00             ; ---------------------------------------------------------------------------
RAM:DC00
RAM:DC00             DISK_ENTRY:
RAM:DC00 F3                          di
RAM:DC01 21 A2 00                    ld      hl, 0A2h        ; Do a call and return to detect where we are running from
RAM:DC04 F9                          ld      sp, hl
RAM:DC05 36 C9                       ld      (hl), 0C9h
RAM:DC07 CD A2 00                    call    FDD_IO_ADDRESS
RAM:DC0A EB                          ex      de, hl          ; DE = $00A2
RAM:DC0B 2A A0 00                    ld      hl, (word_A0)   ; HL now contains return address off stack $DC0A
RAM:DC0E 2E 00                       ld      l, 0
RAM:DC10 E5                          push    hl              ; HL = $DC00
RAM:DC11 01 1D 00                    ld      bc, 1Dh
RAM:DC14 09                          add     hl, bc          ; HL = $DC1D
RAM:DC15 E5                          push    hl
RAM:DC16 E1                          pop     hl
RAM:DC17 0E 1A                       ld      c, 1Ah
RAM:DC19 09                          add     hl, bc          ; HL = $DC37
RAM:DC1A 06 BD                       ld      b, 0BDh
RAM:DC1C EB                          ex      de, hl          ; DE = $DC37, HL = $00A2
RAM:DC1D 3B                          dec     sp
RAM:DC1E 3B                          dec     sp
RAM:DC1F 1A                          ld      a, (de)         ; Copy $DC37 code to $00A2
RAM:DC20 77                          ld      (hl), a
RAM:DC21 BE                          cp      (hl)            ; check we are writing to RAM
RAM:DC22 C0                          ret     nz
RAM:DC23 23                          inc     hl
RAM:DC24 13                          inc     de
RAM:DC25 05                          dec     b
RAM:DC26 C0                          ret     nz              ; loop to $DC1E while B not ZERO
RAM:DC27 E1                          pop     hl              ; $DC00
RAM:DC28 2A A0 00                    ld      hl, (word_A0)
RAM:DC2B 11 00 02                    ld      de, 200h        ; $DE00
RAM:DC2E 19                          add     hl, de
RAM:DC2F 22 A2 00                    ld      (FDD_IO_ADDRESS), hl ; Controller accessed through 3 mem address ($DE00-$DE02)
RAM:DC32 36 A0                       ld      (hl), 0A0h
RAM:DC34 C3 D4 00                    jp      boot_disk       ; Jumpt to relocated code in RAM

# Following code is relocated to RAM.
# It does not execute here.


RAM:DC37             DISK_CODE:
RAM:DC37 00                          nop
RAM:DC38 00                          nop
RAM:DC39 00                          nop
RAM:DC3A 00                          nop
RAM:DC3B 2A A2 00                    ld      hl, (FDD_IO_ADDRESS)
RAM:DC3E 7E                          ld      a, (hl)
RAM:DC3F E6 80                       and     80h
RAM:DC41 CA A9 00                    jp      z, wait_data_available
RAM:DC44 7E                          ld      a, (hl)
RAM:DC45 E6 0F                       and     0Fh
RAM:DC47 A8                          xor     b
RAM:DC48 C2 A9 00                    jp      nz, wait_data_available
RAM:DC4B 23                          inc     hl
RAM:DC4C B6                          or      (hl)
RAM:DC4D F2 B7 00                    jp      p, loc_B7
RAM:DC50 23                          inc     hl
RAM:DC51 7E                          ld      a, (hl)
RAM:DC52 AF                          xor     a
RAM:DC53 EB                          ex      de, hl
RAM:DC54 06 00                       ld      b, 0
RAM:DC56 00                          nop
RAM:DC57 00                          nop
RAM:DC58 1A                          ld      a, (de)
RAM:DC59 77                          ld      (hl), a
RAM:DC5A 23                          inc     hl
RAM:DC5B 88                          adc     a, b
RAM:DC5C 47                          ld      b, a
RAM:DC5D 1A                          ld      a, (de)
RAM:DC5E 77                          ld      (hl), a
RAM:DC5F 23                          inc     hl
RAM:DC60 88                          adc     a, b
RAM:DC61 47                          ld      b, a
RAM:DC62 0D                          dec     c
RAM:DC63 C2 C3 00                    jp      nz, read_2_bytes
RAM:DC66 1A                          ld      a, (de)
RAM:DC67 B8                          cp      b
RAM:DC68 C9                          ret
RAM:DC69             ; ---------------------------------------------------------------------------
RAM:DC69
RAM:DC69             RELOC_D4:
RAM:DC69 2A A2 00                    ld      hl, (FDD_IO_ADDRESS)
RAM:DC6C 36 20                       ld      (hl), 20h ; ' '
RAM:DC6E 23                          inc     hl
RAM:DC6F 7E                          ld      a, (hl)
RAM:DC70 2B                          dec     hl
RAM:DC71 E6 24                       and     24h ; '$'
RAM:DC73 EE 20                       xor     20h ; ' '
RAM:DC75 C2 D4 00                    jp      nz, boot_disk
RAM:DC78 0E 5E                       ld      c, 5Eh ; '^'
RAM:DC7A CD 49 01                    call    sub_149
RAM:DC7D 23                          inc     hl
RAM:DC7E 7E                          ld      a, (hl)
RAM:DC7F 2B                          dec     hl
RAM:DC80 E6 24                       and     24h ; '$'
RAM:DC82 EE 20                       xor     20h ; ' '
RAM:DC84 C2 D4 00                    jp      nz, boot_disk
RAM:DC87 23                          inc     hl
RAM:DC88 7E                          ld      a, (hl)
RAM:DC89 E6 08                       and     8
RAM:DC8B 2B                          dec     hl
RAM:DC8C CA 07 01                    jp      z, SEEK_00
RAM:DC8F 06 08                       ld      b, 8
RAM:DC91 36 61                       ld      (hl), 61h ; 'a'
RAM:DC93 0E 0F                       ld      c, 0Fh
RAM:DC95 CD 49 01                    call    sub_149
RAM:DC98 05                          dec     b
RAM:DC99 C2 FC 00                    jp      nz, loc_FC
RAM:DC9C 23                          inc     hl
RAM:DC9D 7E                          ld      a, (hl)
RAM:DC9E E6 08                       and     8
RAM:DCA0 2B                          dec     hl
RAM:DCA1 C2 19 01                    jp      nz, AT_TRACK_00
RAM:DCA4 36 60                       ld      (hl), 60h ; '`'
RAM:DCA6 0E 0F                       ld      c, 0Fh
RAM:DCA8 CD 49 01                    call    sub_149
RAM:DCAB C3 07 01                    jp      SEEK_00
RAM:DCAE             ; ---------------------------------------------------------------------------
RAM:DCAE 21 5F 01                    ld      hl, 15Fh
RAM:DCB1 CD 37 01                    call    sub_137
RAM:DCB4 C2 D4 00                    jp      nz, boot_disk
RAM:DCB7 2A 69 02                    ld      hl, (word_269)
RAM:DCBA 22 A4 00                    ld      (word_A4), hl
RAM:DCBD CD 37 01                    call    sub_137
RAM:DCC0 C2 D4 00                    jp      nz, boot_disk
RAM:DCC3 2A A4 00                    ld      hl, (word_A4)
RAM:DCC6 11 0C 00                    ld      de, 0Ch
RAM:DCC9 19                          add     hl, de
RAM:DCCA D1                          pop     de
RAM:DCCB E9                          jp      (hl)
RAM:DCCC             ; ---------------------------------------------------------------------------
RAM:DCCC E5                          push    hl
RAM:DCCD EB                          ex      de, hl
RAM:DCCE 01 86 00                    ld      bc, 86h
RAM:DCD1 CD A6 00                    call    DO_DISK_IO      ; on entry DE = Buffer Address, C = words to read
RAM:DCD4 E1                          pop     hl
RAM:DCD5 C2 37 01                    jp      nz, sub_137
RAM:DCD8 E5                          push    hl
RAM:DCD9 7E                          ld      a, (hl)
RAM:DCDA 23                          inc     hl
RAM:DCDB B6                          or      (hl)
RAM:DCDC E1                          pop     hl
RAM:DCDD C9                          ret
RAM:DCDE             ; ---------------------------------------------------------------------------
RAM:DCDE 7E                          ld      a, (hl)
RAM:DCDF E6 20                       and     20h ; ' '
RAM:DCE1 79                          ld      a, c
RAM:DCE2 C2 51 01                    jp      nz, loc_151
RAM:DCE5 07                          rlca
RAM:DCE6 4F                          ld      c, a
RAM:DCE7 3E FF                       ld      a, 0FFh
RAM:DCE9 D6 01                       sub     1
RAM:DCEB B7                          or      a
RAM:DCEC C2 54 01                    jp      nz, loc_154
RAM:DCEF 0D                          dec     c
RAM:DCF0 C2 52 01                    jp      nz, loc_152
RAM:DCF3 C9                          ret
RAM:DCF4             ; ---------------------------------------------------------------------------
RAM:DCF4 00                          nop
RAM:DCF5 00                          nop
RAM:DCF6 00                          nop
RAM:DCF7 00                          nop
RAM:DCF8 00                          nop
RAM:DCF9 00                          nop
RAM:DCFA 00                          nop
RAM:DCFB 00                          nop
RAM:DCFC 00                          nop
RAM:DCFD C3 A6 00                    jp      DO_DISK_IO      ; on entry DE = Buffer Address, C = words to read
RAM:DCFD             ; ---------------------------------------------------------------------------


#Code from DC37 once it has been re-located to $00A0


RAM:00A0 00 00       word_A0:        dw 0                    ; DATA XREF: RAM:DC0B↓r
RAM:00A0                                                     ; RAM:DC28↓r
RAM:00A2 00 00       FDD_IO_ADDRESS: dw 0                    ; CODE XREF: RAM:DC07↓p
RAM:00A2                                                     ; DATA XREF: DO_DISK_IO↓r ...
RAM:00A4 00 00       word_A4:        dw 0                    ; DATA XREF: DO_DISK_IO+7F↓w
RAM:00A4                                                     ; DO_DISK_IO+88↓r ...
RAM:00A6
RAM:00A6             ; =============== S U B R O U T I N E =======================================
RAM:00A6
RAM:00A6             ; on entry DE = Buffer Address, C = words to read
RAM:00A6
RAM:00A6             DO_DISK_IO:                             ; CODE XREF: sub_137+5↓p
RAM:00A6                                                     ; RAM:0168↓j ...
RAM:00A6 2A A2 00                    ld      hl, (FDD_IO_ADDRESS) ; Set to $DE00 in this case
RAM:00A9
RAM:00A9             wait_data_available:                    ; CODE XREF: DO_DISK_IO+6↓j
RAM:00A9                                                     ; DO_DISK_IO+D↓j ...
RAM:00A9 7E                          ld      a, (hl)
RAM:00AA E6 80                       and     80h
RAM:00AC CA A9 00                    jp      z, wait_data_available
RAM:00AF 7E                          ld      a, (hl)
RAM:00B0 E6 0F                       and     0Fh
RAM:00B2
RAM:00B2             loc_B2:
RAM:00B2 A8                          xor     b
RAM:00B3 C2 A9 00                    jp      nz, wait_data_available
RAM:00B6 23                          inc     hl
RAM:00B7
RAM:00B7             loc_B7:                                 ; CODE XREF: DO_DISK_IO+12↓j
RAM:00B7                                                     ; RAM:DC4D↓j
RAM:00B7 B6                          or      (hl)
RAM:00B8 F2 B7 00                    jp      p, loc_B7
RAM:00BB 23                          inc     hl
RAM:00BC 7E                          ld      a, (hl)
RAM:00BD AF                          xor     a
RAM:00BE EB                          ex      de, hl          ; HL now == Buffer Address, DE = IO Reg address
RAM:00BF 06 00                       ld      b, 0
RAM:00C1 00                          nop
RAM:00C2 00                          nop
RAM:00C3
RAM:00C3             read_2_bytes:                           ; CODE XREF: DO_DISK_IO+28↓j
RAM:00C3                                                     ; RAM:DC63↓j
RAM:00C3 1A                          ld      a, (de)
RAM:00C4 77                          ld      (hl), a
RAM:00C5 23                          inc     hl
RAM:00C6 88                          adc     a, b            ; simple CRC byte
RAM:00C7 47                          ld      b, a
RAM:00C8 1A                          ld      a, (de)
RAM:00C9 77                          ld      (hl), a
RAM:00CA 23                          inc     hl
RAM:00CB 88                          adc     a, b
RAM:00CC 47                          ld      b, a
RAM:00CD 0D                          dec     c
RAM:00CE C2 C3 00                    jp      nz, read_2_bytes
RAM:00D1 1A                          ld      a, (de)         ; Compare CRC
RAM:00D2 B8                          cp      b
RAM:00D3
RAM:00D3             locret_D3:
RAM:00D3 C9                          ret
RAM:00D4             ; ---------------------------------------------------------------------------
RAM:00D4
RAM:00D4             boot_disk:                              ; CODE XREF: DO_DISK_IO+3A↓j
RAM:00D4                                                     ; DO_DISK_IO+49↓j ...
RAM:00D4 2A A2 00                    ld      hl, (FDD_IO_ADDRESS) ; Set to $DE00 in this case
RAM:00D7 36 20                       ld      (hl), 20h ; ' ' ; Activate Drive #0
RAM:00D9 23                          inc     hl
RAM:00DA 7E                          ld      a, (hl)
RAM:00DB 2B                          dec     hl
RAM:00DC E6 24                       and     24h ; '$'
RAM:00DE EE 20                       xor     20h ; ' '
RAM:00E0 C2 D4 00                    jp      nz, boot_disk
RAM:00E3 0E 5E                       ld      c, 5Eh ; '^'
RAM:00E5 CD 49 01                    call    sub_149
RAM:00E8 23                          inc     hl
RAM:00E9 7E                          ld      a, (hl)
RAM:00EA 2B                          dec     hl
RAM:00EB E6 24                       and     24h ; '$'
RAM:00ED EE 20                       xor     20h ; ' '
RAM:00EF C2 D4 00                    jp      nz, boot_disk
RAM:00F2 23                          inc     hl
RAM:00F3 7E                          ld      a, (hl)
RAM:00F4 E6 08                       and     8
RAM:00F6 2B                          dec     hl
RAM:00F7 CA 07 01                    jp      z, SEEK_00
RAM:00FA 06 08                       ld      b, 8
RAM:00FC
RAM:00FC             loc_FC:                                 ; CODE XREF: DO_DISK_IO+5E↓j
RAM:00FC                                                     ; RAM:DC99↓j
RAM:00FC 36 61                       ld      (hl), 61h ; 'a' ; Step In command
RAM:00FE 0E 0F                       ld      c, 0Fh
RAM:0100 CD 49 01                    call    sub_149
RAM:0103 05                          dec     b
RAM:0104 C2 FC 00                    jp      nz, loc_FC
RAM:0107
RAM:0107             SEEK_00:                                ; CODE XREF: DO_DISK_IO+51↑j
RAM:0107                                                     ; DO_DISK_IO+70↓j ...
RAM:0107 23                          inc     hl
RAM:0108 7E                          ld      a, (hl)
RAM:0109 E6 08                       and     8               ; TRACK_00 status bit
RAM:010B 2B                          dec     hl
RAM:010C C2 19 01                    jp      nz, AT_TRACK_00
RAM:010F 36 60                       ld      (hl), 60h ; '`' ; Step OUT command
RAM:0111 0E 0F                       ld      c, 0Fh
RAM:0113 CD 49 01                    call    sub_149
RAM:0116 C3 07 01                    jp      SEEK_00
RAM:0119             ; ---------------------------------------------------------------------------
RAM:0119
RAM:0119             AT_TRACK_00:                            ; CODE XREF: DO_DISK_IO+66↑j
RAM:0119                                                     ; RAM:DCA1↓j
RAM:0119 21 5F 01                    ld      hl, 15Fh
RAM:011C CD 37 01                    call    sub_137
RAM:011F C2 D4 00                    jp      nz, boot_disk
RAM:0122 2A 69 02                    ld      hl, (word_269)
RAM:0125 22 A4 00                    ld      (word_A4), hl
RAM:0128 CD 37 01                    call    sub_137
RAM:012B C2 D4 00                    jp      nz, boot_disk
RAM:012E 2A A4 00                    ld      hl, (word_A4)
RAM:0131 11 0C 00                    ld      de, 0Ch
RAM:0134 19                          add     hl, de
RAM:0135 D1                          pop     de
RAM:0135             ; End of function DO_DISK_IO
RAM:0135
RAM:0136 E9                          jp      (hl)            ; jump to loaded boot sector code
RAM:0137
RAM:0137             ; =============== S U B R O U T I N E =======================================
RAM:0137
RAM:0137
RAM:0137             sub_137:                                ; CODE XREF: DO_DISK_IO+76↑p
RAM:0137                                                     ; DO_DISK_IO+82↑p ...
RAM:0137 E5                          push    hl
RAM:0138 EB                          ex      de, hl
RAM:0139 01 86 00                    ld      bc, 86h
RAM:013C CD A6 00                    call    DO_DISK_IO      ; on entry DE = Buffer Address, C = words to read
RAM:013F E1                          pop     hl
RAM:0140 C2 37 01                    jp      nz, sub_137
RAM:0143 E5                          push    hl
RAM:0144 7E                          ld      a, (hl)
RAM:0145 23                          inc     hl
RAM:0146 B6                          or      (hl)
RAM:0147 E1                          pop     hl
RAM:0147             ; End of function sub_137
RAM:0147
RAM:0148             ; ---------------------------------------------------------------------------
RAM:0148 C9                          ret
RAM:0149
RAM:0149             ; =============== S U B R O U T I N E =======================================
RAM:0149
RAM:0149
RAM:0149             sub_149:                                ; CODE XREF: DO_DISK_IO+3F↑p
RAM:0149                                                     ; DO_DISK_IO+5A↑p ...
RAM:0149 7E                          ld      a, (hl)
RAM:0149             ; End of function sub_149
RAM:0149
RAM:014A             ; ---------------------------------------------------------------------------
RAM:014A E6 20                       and     20h ; ' '
RAM:014C 79                          ld      a, c
RAM:014D C2 51 01                    jp      nz, loc_151
RAM:0150 07                          rlca
RAM:0151
RAM:0151             loc_151:                                ; CODE XREF: RAM:014D↑j
RAM:0151                                                     ; RAM:DCE2↓j
RAM:0151 4F                          ld      c, a
RAM:0152
RAM:0152             loc_152:                                ; CODE XREF: RAM:015B↓j
RAM:0152                                                     ; RAM:DCF0↓j
RAM:0152 3E FF                       ld      a, 0FFh
RAM:0154
RAM:0154             loc_154:                                ; CODE XREF: RAM:0157↓j
RAM:0154                                                     ; RAM:DCEC↓j
RAM:0154 D6 01                       sub     1
RAM:0156 B7                          or      a
RAM:0157 C2 54 01                    jp      nz, loc_154
RAM:015A 0D                          dec     c
RAM:015B C2 52 01                    jp      nz, loc_152
RAM:015E C9                          ret
RAM:015F             ; ---------------------------------------------------------------------------
RAM:015F 00                          nop
RAM:0160             ; ---------------------------------------------------------------------------
RAM:0160 00                          nop
RAM:0161 00                          nop
RAM:0162 00                          nop
RAM:0163 00                          nop
RAM:0164 00                          nop
RAM:0165 00                          nop
RAM:0166 00                          nop
RAM:0167 00                          nop
RAM:0168 C3 A6 00                    jp      DO_DISK_IO      ; on entry DE = Buffer Address, C = words to read
RAM:0168             ; ---------------------------------------------------------------------------
RAM:016B 00                          db    0
 
Oh. Now that is useful! I’m going to have to move the Sorcerer up the priority ladder. Now in second place, behind an Intel MDS..
 
Back
Top