PDA

View Full Version : Liveport FDM 180 disk unit for Exidy Sorcerer



JonB
October 10th, 2017, 08:49 AM
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

James0555
October 10th, 2017, 02:50 PM
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

JonB
October 10th, 2017, 09:50 PM
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.

41250


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.

41251


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.

41252

JonB
October 10th, 2017, 11:43 PM
OK, the ROM is identified as Signetics N82S126N PROM (http://pdf1.alldatasheet.com/datasheet-pdf/view/91519/PHILIPS/N82S126N.html). 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:
41258

Lots of missing data there!

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


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:
41259

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

JonB
October 11th, 2017, 02:48 AM
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.

41262

Time to try the ICE, methinks...

James0555
October 11th, 2017, 03:12 AM
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

JonB
October 11th, 2017, 04:09 AM
Actually, DC00 as far as I can tell. I edited post #4.

Disassembled it looks like this:



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.

JonB
October 16th, 2017, 12:41 AM
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.

exidyboy
December 21st, 2019, 02:22 AM
A

Any progress with the Liveport Jon?

JonB
December 21st, 2019, 02:40 AM
No, sir.

It's on the shelf pending an injection of enthusiasm from me. (I got your PM, thanks!)

exidyboy
January 2nd, 2020, 01:12 PM
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?

JonB
January 3rd, 2020, 01:10 AM
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.

exidyboy
January 25th, 2020, 02:13 PM
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?

JonB
January 26th, 2020, 01:03 AM
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

exidyboy
January 26th, 2020, 03:54 PM
Actually, DC00 as far as I can tell. I edited post #4.

Disassembled it looks like this:



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

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

Also a disassembly listing courtesy RedSkullDC.


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

JonB
January 27th, 2020, 12:07 AM
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..