Here's the SPR files as requested for BDOS3, BIOS3, BNKBDOS3, BNKBIOS3 and RESBDOS3:
View attachment SPR Files.zip
View attachment SPR Files.zip
link bnkbios3=bios3,scb[b,os,nr]
OK, well I tried the LINK command, as I expect it to be, on my virtual H89. The resulting BNKBIOS3.SPR is not corrupt. Unsure how this happened, so maybe we need to review your link procedure. What command did you use to create BNKBIOS3.SPR? Was it only made from BIOS3.rel and SCB.rel? I used:
Code:link bnkbios3=bios3,scb[b,os,nr]
A>LINK BNKBIOS3=BIOS3,SCB[B,OS,NR]
O>
O>a:link bnkbios3=bios3-2,scb[b,os,nr]
LINK 1.31
@SEC FE5C @MIN FE5B @DATE FE58 @HOUR FE5A
@BNKBF FE35 @AIVEC FE26 @CIVEC FE22 @ERMDE FE4B
@AOVEC FE28 @COVEC FE24 @LOVEC FE2A @MXTPA FE62
@FX FE43 @MEDIA FE54 @CRDMA FE3C @BFLGS FE57
@CRDSK FE3E @ERDSK FE51 @RESEL FE41 @USRCD FE44
@VINFO FE3F @MLTIO FE4A
ABSOLUTE 0000
CODE SIZE 0B12 (0000-0B11)
DATA SIZE 0C59 (0C00-1858)
COMMON SIZE 0000
USE FACTOR 16
O>a:dump bnkbios3.spr
CP/M 3 DUMP - Version 3.0
0000: 00 59 18 00 00 00 00 00 00 00 12 0B 00 00 00 00 .Y..............
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0100: C3 F0 01 C3 1A 03 C3 59 05 C3 2C 05 C3 10 05 C3 .......Y..,.....
0110: 6B 00 C3 6B 00 C3 6A 00 C3 8F 05 C3 74 05 C3 92 k..k..j.....t...
0120: 05 C3 97 05 C3 9C 05 C3 EB 05 C3 18 06 C3 67 00 ..............g.
0130: C3 A7 05 C3 25 05 C3 6A 00 C3 67 00 C3 63 00 C3 ....%..j..g..c..
0140: 66 00 C3 E9 01 C3 ED 01 C3 EE 01 C3 C5 01 C3 EF f...............
0150: 01 C3 CA 01 C3 A3 05 C3 C9 01 C3 00 00 C3 00 00 ................
Press RETURN to continue
O>
Looking at the pattern of corruption, it is as if those 9 bytes got zeroed sometime before GENCPM relocated them. The bitmap in the SPR tells GENCPM to add F4 (in this case) to certain bytes, turning C3 00 00 00 00 00... into C3 00 F4 00 00 F4... But, GENCPM probably does not have a bug (it works elsewhere). That being said, when I run GENCPM on these SPR files, I get the same corruption. It may take some reflection to figure out what might be going wrong.
It is also just possible that one (or more) .SPR files contain something later on that ends up over the 'top of' the jump table when GENCPM relocates them? So, even though the .SPR file contains the 'correct' jump table (ready for relocation) something else is being loaded after the BIOS CSEG 'over the top of' it. Just a thought.
Dave
A 'decent' tool shouldn't allow anything to be overwritten - or at least should generate a warning.
The way SPR files seem to work is that there is one bit for each byte that needs relocating - so this shouldn't really happen. I am just having a look at the SPR bitmap now to see if something has gone silly though.
Can you post the GENCPM.DAT file (this should be the default answer file that is being used).
Dave
A>type gencpm.dat
PRTMSG = Y
PAGWID = 4F
PAGLEN = 17
BACKSPC = N
RUBOUT = Y
BOOTDRV = A
MEMTOP = FF
BNKSWT = Y
COMBAS = C0
LERROR = Y
NUMSEGS = 03
MEMSEG00 = 00,80,00
MEMSEG01 = 00,C0,02
MEMSEG02 = 00,C0,03
MEMSEG03 = 00,C0,04
MEMSEG04 = 00,C0,05
MEMSEG05 = 00,C0,06
MEMSEG06 = 00,C0,07
MEMSEG07 = 00,C0,08
MEMSEG08 = 00,C0,09
MEMSEG09 = 00,C0,0A
MEMSEG0A = 00,C0,0B
MEMSEG0B = 00,C0,0C
MEMSEG0C = 00,C0,0D
MEMSEG0D = 00,C0,0E
MEMSEG0E = 00,C0,0F
MEMSEG0F = 00,C0,10
HASHDRVA = Y
HASHDRVB = Y
HASHDRVC = Y
HASHDRVD = Y
HASHDRVE = Y
HASHDRVF = Y
HASHDRVG = Y
HASHDRVH = Y
HASHDRVI = Y
HASHDRVJ = Y
HASHDRVK = Y
HASHDRVL = Y
HASHDRVM = Y
HASHDRVN = Y
HASHDRVO = Y
HASHDRVP = Y
ALTBNKSA = N
ALTBNKSB = N
ALTBNKSC = N
ALTBNKSD = N
ALTBNKSE = N
ALTBNKSF = N
ALTBNKSG = N
ALTBNKSH = N
ALTBNKSI = N
ALTBNKSJ = N
ALTBNKSK = N
ALTBNKSL = N
ALTBNKSM = N
ALTBNKSN = N
ALTBNKSO = N
ALTBNKSP = N
NDIRRECA = 01
NDIRRECB = 01
NDIRRECC = 01
NDIRRECD = 01
NDIRRECE = 01
NDIRRECF = 01
NDIRRECG = 01
NDIRRECH = 01
NDIRRECI = 01
NDIRRECJ = 01
NDIRRECK = 01
NDIRRECL = 01
NDIRRECM = 01
NDIRRECN = 01
NDIRRECO = 01
NDIRRECP = 01
NDTARECA = 01
NDTARECB = 01
NDTARECC = 01
NDTARECD = 01
NDTARECE = 01
NDTARECF = 01
NDTARECG = 01
NDTARECH = 01
NDTARECI = 01
NDTARECJ = 01
NDTARECK = 01
NDTARECL = 01
NDTARECM = 01
NDTARECN = 01
NDTARECO = 01
NDTARECP = 01
ODIRDRVA = A
ODIRDRVB = A
ODIRDRVC = A
ODIRDRVD = A
ODIRDRVE = A
ODIRDRVF = A
ODIRDRVG = A
ODIRDRVH = A
ODIRDRVI = A
ODIRDRVJ = A
ODIRDRVK = A
ODIRDRVL = A
ODIRDRVM = A
ODIRDRVN = A
ODIRDRVO = A
ODIRDRVP = A
ODTADRVA = A
ODTADRVB = A
ODTADRVC = A
ODTADRVD = A
ODTADRVE = A
ODTADRVF = A
ODTADRVG = A
ODTADRVH = A
ODTADRVI = A
ODTADRVJ = A
ODTADRVK = A
ODTADRVL = A
ODTADRVM = A
ODTADRVN = A
ODTADRVO = A
ODTADRVP = A
OVLYDIRA = Y
OVLYDIRB = Y
OVLYDIRC = Y
OVLYDIRD = Y
OVLYDIRE = Y
OVLYDIRF = Y
OVLYDIRG = Y
OVLYDIRH = Y
OVLYDIRI = Y
OVLYDIRJ = Y
OVLYDIRK = Y
OVLYDIRL = Y
OVLYDIRM = Y
OVLYDIRN = Y
OVLYDIRO = Y
OVLYDIRP = Y
OVLYDTAA = Y
OVLYDTAB = Y
OVLYDTAC = Y
OVLYDTAD = Y
OVLYDTAE = Y
OVLYDTAF = Y
OVLYDTAG = Y
OVLYDTAH = Y
OVLYDTAI = Y
OVLYDTAJ = Y
OVLYDTAK = Y
OVLYDTAL = Y
OVLYDTAM = Y
OVLYDTAN = Y
OVLYDTAO = Y
OVLYDTAP = Y
CRDATAF = N
DBLALV = Y
I keep wanting to blame this on SPR content, as daver2 suggests, but I can't reason it out. The SPR files are binary images with an appended bitmap to indicate where relocatable addresses are. So, the SPR cannot back-up the location counter like a REL file could. I could not find any such anomaly in the REL file, plus we know the SPR file is correct. I'm looking at my virtual H89 memory right now, after the GENCPM. Can't find the BIOS, but it is trial and error mostly. My thought is to either try running it under SID or else use the simulation debug tools to try and figure it out. Unfortunately, GENCPM is written in PL/M so it is more difficult to debug on a binary level.
I've made some progress. Using SID to run GENCPM, I was able to determine that the corruption (zeroing of 9 bytes) occurs somewhere between loading BNKBIOS3.SPR and relocating the image (exclusive). So, after the load the jump table is OK, but before the call to relocate it is corrupt. I'll run a few more times and see if I can bisect to where it is happening.
CP/M V3.0 Loader
Copyright (C) 1982, Digital Research
BNKBIOS3 SPR F400 0C00
BNKBIOS3 SPR B300 0D00
RESBDOS3 SPR EE00 0600
BNKBDOS3 SPR 8500 2E00
59K TPA
BIOS3: Preparing MMU...
BIOS3: Initialising SIO...
Z80 MINICOM II CP/M Plus BIOS 1.0.0 by J.Nock 2017
CP/M Plus Copyright 1982 (c) by Digital Research
CP/M Error On /: Invalid Drive
BDOS Function = 15 File = CCP C.OM
ccp$fcb: .DB 0,'CCP COM',0,0,0,0