diff --git a/VAX/VMB-exe-Patch.com b/VAX/VMB-exe-Patch.com new file mode 100644 index 00000000..8d4adbc6 --- /dev/null +++ b/VAX/VMB-exe-Patch.com @@ -0,0 +1,152 @@ +$! +$! This procedure patches the VMB.EXE provided with VAX/VMS V7.3 to +$! support the Boot Block boot functionality provided on all VAX +$! systems which run a ROM based VMB. +$! +$ PATCH /ABSOLUTE /NEW_VERSION /OUTPUT=cp$exe:VMB.EXE cp$src:VMB_orig.EXE +! The native VMB.EXE program historically supported a Boot Block oriented +! boot if Bit 3 of the parameter register (R5) was set when VMB was invoked. +! This Boot Block boot operation reads sector 0 into memory and starts +! execution at offset 2 of the data block in memory. +! When portitions of VMB were migrated into ROM to support the earliest +! MicroVAX system (MicroVAX I) and all subsequent ROM based VMB versions +! the concept of Boot Block booting was extended in these ROM VMB +! implementations. The change in boot block booting functionality included +! several features: +! 1) If a normal boot attempt to a device failed (due to VMB not being +! able to locate a secondary bootstrap program), a boot block boot is +! automatically attempted. If the Bit 3 of R5 was set, then the +! initial search for a secondary boot block was avoided and a boot +! block boot was immediately attempted. +! 2) When performing a boot block boot, the sector 0 contents are examined +! and if these contents conform to the pattern defined for ROM based +! (PRA0) booting, the ROM format Offset, Size, and Starting address +! information is used directly by VMB to load a program into memory +! and control is transferred to that program. If the contents of +! sector 0 do not fit the pattern required for ROM based booting, then +! the code in sector 0 is executed directly starting at offset 2, +! the same as was originally done with the non ROM based VMB versions. +! Note that this extended behavior allows sector 0 to contain very little +! information and quite possibly no actual boot code. +! Developers of alternate operating systems for VAX computers noticed the ROM +! based boot block behavior and changed their installation media AND the disk +! structures to only provide the minimal boot information required on the +! systems with VMB installed in ROM. +! +! Since, when this active development of these alternate operating systems for +! VAX computers was happening, the vast majority of development and new system +! deployments were to hardware which had ROM base VMB, no one noticed that +! older systems which booted with the non ROM based VMB could no longer boot +! from new install media or disks formatted with these operating systems. +! +! This patch addeds the ROM based VMB boot block boot functionality to the +! original dynamically loaded VMB.EXE used by the older systems to boot. +! +! The patch overwrites some VMB code which exists to support NVAX(1302) and +! Neon-V(1701) systems. If simh simulators for these systems are ever built +! an alternate location must be found to accomodate this extended logic +! +define PAA = 08190 ! INIT_ADP_1302 (I think!) +define NEWFIL_OPNERR = PAA+1F ! Replacement to generate File Not Found Error Message +define TRY_BBLOCK = PAA+2B +define OLDFIL_OPNERR = 69A8 ! Original File Not Found Error +define ORIG_BBLOCK_BOOT = 68B6 ! Original code that did Boot Block Boot +define RPB$V_BBLOCK = 3 +define RPB$L_BOOTR5 = 30 +define READFILE = 0120 +define READIN_BOOT = 6A37 +define START_SECOND_HALT = 00BB +define SS$_FILESTRUCT = 08C0 +define SS$_BADCHKSUM = 0808 +define SS$_BADFILEHDR = 0810 +define SS$_BADDIRECTORY = 0828 +dep /long PAA = 0 +dep /long PAA+04 = 0 +dep /long PAA+08 = 0 +dep /long PAA+0C = 0 +dep /long PAA+10 = 0 +dep /long PAA+14 = 0 +dep /long PAA+18 = 0 +dep /long PAA+1C = 0 +dep /long PAA+20 = 0 +dep /long PAA+24 = 0 +dep /long PAA+28 = 0 +dep /long PAA+2C = 0 +dep /long PAA+30 = 0 +dep /long PAA+34 = 0 +dep /long PAA+38 = 0 +dep /long PAA+3C = 0 +dep /long PAA+40 = 0 +dep /long PAA+44 = 0 +dep /long PAA+48 = 0 +dep /long PAA+4C = 0 +dep /long PAA+50 = 0 +dep /long PAA+54 = 0 +dep /long PAA+58 = 0 +dep /long PAA+5C = 0 +dep /long PAA+60 = 0 +dep /long PAA+64 = 0 +dep /long PAA+68 = 0 +dep /long PAA+6C = 0 +dep /long PAA+70 = 0 +dep /long PAA+74 = 0 +dep /long PAA+78 = 0 +dep /long PAA+8C = 0 +dep /long PAA+80 = 0 +dep /long PAA+84 = 0 +dep /long PAA+88 = 0 +dep /long PAA+8C = 0 +dep /long PAA+90 = 0 +dep /long PAA+94 = 0 +dep /long PAA+98 = 0 +dep /long PAA+9C = 0 +dep /ins OLDFIL_OPNERR = ' BRW PAA ' +dep /ins PAA = ' CMPW R0, #SS$_BADCHKSUM ' +dep /ins PAA+05 = ' BEQL TRY_BBLOCK ' +dep /ins PAA+07 = ' CMPW R0, #SS$_FILESTRUCT ' +dep /ins PAA+0C = ' BEQL TRY_BBLOCK ' +dep /ins PAA+0E = ' CMPW R0, #SS$_BADFILEHDR ' +dep /ins PAA+13 = ' BEQL TRY_BBLOCK ' +dep /ins PAA+15 = ' CMPW R0, #SS$_BADDIRECTORY ' +dep /ins PAA+1A = ' BEQL TRY_BBLOCK ' +dep /ins PAA+1C = ' BRW NEWFIL_OPNERR ' +dep /ins NEWFIL_OPNERR = ' PUSHAB L^000069AE ' +dep /ins NEWFIL_OPNERR+6 = ' JMP L^00000294 ' +dep /ins TRY_BBLOCK +' CLRL R8 ' ! Block to read +' MOVL #1,R9 ' ! Size to read +' MOVL R10,R6 ' ! Start of free memory +' JSB L^READFILE ' ! Read the block to R10 +' BLBC R0,TRY_OLD_BBLOCK ' ! Br if error + ! + ! validate the boot block + ! +' MOVZBL B^2(R10),R2 ' ! Get offset to secondary id field +' CMPB B^3(R10),#1 ' ! Next field a BR instruction +' BNEQ TRY_OLD_BBLOCK ' ! Br if no +' MOVAW (R10)[R2],R1 ' ! Address next field +' CMPW (R1),#^x18 ' ! VAX instruction set id? +' BNEQ TRY_OLD_BBLOCK ' ! Br if no, error +' ADDB3 #^x18,B^2(R1),R2 ' ! Get optional value +' MCOMB R2,R2 ' ! Ones's complement it +' CMPB R2,B^3(R1) ' ! Check the check sum byte +' BNEQ TRY_OLD_BBLOCK ' ! Continue if no match +' ADDL3 B^8(R1),B^0C(R1),R2 ' ! Check other words +' ADDL B^10(R1),R2 ' ! Get augment to load address +' CMPL R2,B^14(R1) ' ! Match? +' BNEQ TRY_OLD_BBLOCK ' ! Br if no +' ROTL #10,B^4(R10),R8 ' ! Get secondary image LBN +' MOVL B^8(R1),R9 ' ! Get image size +' ADDL B^0C(R1),R10 ' ! Compute load address +' MOVL B^10(R1),R5 ' ! Compute transfer offset +' BRW READIN_BOOT ' ! Boot block is valid, read file + +'TRY_OLD_BBLOCK:BBS #RPB$V_BBLOCK,B^RPB$L_BOOTR5(R11),OLD_BBLOCK_BOOT' +' BRW NEWFIL_OPNERR ' ! Report error + +'OLD_BBLOCK_BOOT:MOVL #2,R5 ' ! Transfer address from start of block +' JMP L^START_SECOND_HALT ' ! Do it. +exit +dep /ins ORIG_BBLOCK_BOOT = ' BRW TRY_BBLOCK ' ! make BOOT /R5:8 work the same way +update +exit diff --git a/VAX/vax_vmb_exe.h b/VAX/vax_vmb_exe.h index 160715bd..4a03baf7 100644 --- a/VAX/vax_vmb_exe.h +++ b/VAX/vax_vmb_exe.h @@ -1,9 +1,9 @@ #ifndef ROM_vax_vmb_exe_H #define ROM_vax_vmb_exe_H 0 /* - VAX/vax_vmb_exe.h produced at Fri Nov 09 06:40:16 2012 - from VAX/vmb.exe which was last modified at Sun Oct 21 17:12:55 2012 - file size: 44544 (0xAE00) - checksum: 0xFFC014CC + VAX/vax_vmb_exe.h produced at Sun Mar 24 16:38:01 2013 + from VAX/vmb.exe which was last modified at Sun Mar 24 12:24:51 2013 + file size: 44544 (0xAE00) - checksum: 0xFFC014BB This file is a generated file and should NOT be edited or changed by hand. */ #define BOOT_CODE_SIZE 0xAE00 @@ -1685,7 +1685,7 @@ unsigned char vax_vmb_exe[] = { 0x9E,0xCA,0xD8,0x01,0x55,0xD0,0x0C,0x50,0x9E,0x40,0x65,0x51,0x90,0x71,0x52,0x13, 0x05,0x91,0x20,0x52,0x12,0x05,0xF5,0x50,0xF3,0x11,0x0C,0x94,0xA1,0x01,0x7C,0x7E, 0xDD,0x55,0xFB,0x03,0xCF,0x69,0xE9,0x7C,0x7E,0xDD,0x69,0xFB,0x03,0xCF,0x60,0xE9, -0x05,0xE1,0x03,0xAB,0x30,0x0D,0xD0,0x02,0x55,0xD0,0xAB,0x2C,0x58,0xD0,0x01,0x59, +0x05,0xE1,0x03,0xAB,0x30,0x0D,0x31,0x02,0x19,0xD0,0xAB,0x2C,0x58,0xD0,0x01,0x59, 0x31,0x74,0x01,0xE0,0x01,0xAC,0x2C,0x03,0x30,0xCD,0x29,0xE1,0x08,0xAB,0x30,0x16, 0x9F,0xAB,0x68,0xDD,0x27,0x9F,0xCF,0xA0,0x0E,0xFB,0x03,0xCF,0x32,0xE9,0xD4,0x59, 0x9E,0xAB,0x68,0x57,0x11,0x3F,0x9E,0xCF,0x33,0x0E,0x57,0xE1,0x04,0xAB,0x30,0x05, @@ -1700,7 +1700,7 @@ unsigned char vax_vmb_exe[] = { 0x12,0x29,0x95,0xCF,0xDB,0x0D,0x13,0x0B,0x94,0xCF,0xD5,0x0D,0x91,0x30,0xCF,0xD4, 0x0D,0x13,0xA2,0xE1,0x08,0xAB,0x30,0x13,0x7C,0x7E,0x9F,0xCF,0x68,0x0D,0xFB,0x03, 0xCF,0x7D,0xE8,0x90,0x04,0xCF,0xB9,0x0D,0x31,0x35,0xFF,0xB1,0x8F,0x08,0x09,0x50, -0x12,0x06,0x17,0xEF,0x58,0x97,0xFF,0xFF,0x16,0xEF,0xE6,0x98,0xFF,0xFF,0x25,0x42, +0x12,0x06,0x17,0xEF,0x58,0x97,0xFF,0xFF,0x31,0xE5,0x17,0x98,0xFF,0xFF,0x25,0x42, 0x4F,0x4F,0x54,0x2D,0x46,0x2D,0x55,0x6E,0x61,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20, 0x6C,0x6F,0x63,0x61,0x74,0x65,0x20,0x42,0x4F,0x4F,0x54,0x20,0x66,0x69,0x6C,0x65, 0x00,0x7D,0xAB,0x3C,0x58,0xE0,0x01,0xAC,0x2C,0x2A,0xD5,0x58,0x12,0x26,0x16,0xEF, @@ -2083,16 +2083,16 @@ unsigned char vax_vmb_exe[] = { 0x00,0x14,0x20,0xD0,0xA0,0x10,0xA0,0x10,0xD0,0x8F,0x00,0xE0,0xFF,0x0F,0xA0,0x04, 0xD0,0xA0,0x10,0xA0,0x10,0xDA,0x00,0x26,0x7D,0x8E,0x50,0x17,0xBE,0x00,0xD0,0x8F, 0x00,0x00,0x80,0x21,0x54,0x9E,0xAF,0x8C,0x51,0x30,0x94,0xF9,0x05,0x00,0x00,0x00, -0xDE,0x9F,0x00,0x00,0x80,0xE1,0x50,0xDE,0x9F,0x00,0x00,0x00,0xE0,0x53,0x30,0x7A, -0xFA,0x05,0xDE,0x9F,0x00,0x00,0x80,0xE1,0x52,0x30,0xA2,0xFB,0x05,0xDD,0x54,0xDE, -0x9F,0x00,0x00,0x00,0xE0,0x54,0x30,0x3C,0xFC,0xD0,0x8E,0x54,0x05,0xBB,0x04,0xD0, -0x8F,0x00,0x00,0x80,0xE1,0x50,0xD0,0x8F,0x00,0x00,0x00,0xE0,0x51,0x9E,0xEF,0x09, -0x00,0x00,0x00,0x52,0x30,0xBA,0xFA,0xBA,0x04,0x05,0x00,0x00,0xC0,0x24,0x5E,0x7D, -0x50,0x7E,0xEF,0x00,0x04,0x9F,0x40,0x00,0x14,0xE0,0x50,0xC4,0x8F,0x00,0x00,0x08, -0x00,0x50,0xC0,0x8F,0x00,0x00,0x80,0xE1,0x50,0xDA,0x8F,0xE0,0x00,0x00,0x00,0x8F, -0x7F,0x00,0x00,0x00,0xDA,0x8F,0xF6,0x01,0x00,0x00,0x8F,0x71,0x00,0x00,0x00,0xDB, -0x8F,0x7B,0x00,0x00,0x00,0x51,0xC8,0x8F,0xFE,0x00,0x00,0x00,0x51,0xDA,0x51,0x8F, -0x7B,0x00,0x00,0x00,0xD0,0x8F,0x00,0x00,0x00,0xC0,0x9F,0x20,0x00,0x14,0xE0,0xD0, +0xB1,0x50,0x8F,0x08,0x08,0x13,0x24,0xB1,0x50,0x8F,0xC0,0x08,0x13,0x1D,0xB1,0x50, +0x8F,0x10,0x08,0x13,0x16,0xB1,0x50,0x8F,0x28,0x08,0x13,0x0F,0x31,0x00,0x00,0x9F, +0xEF,0xF9,0xE7,0xFF,0xFF,0x17,0xEF,0xD9,0x80,0xFF,0xFF,0xD4,0x58,0xD0,0x01,0x59, +0xD0,0x5A,0x56,0x16,0xEF,0x57,0x7F,0xFF,0xFF,0xE9,0x50,0x45,0x9A,0xAA,0x02,0x52, +0x91,0xAA,0x03,0x01,0x12,0x3B,0x3E,0x42,0x6A,0x51,0xB1,0x61,0x18,0x12,0x32,0x81, +0x18,0xA1,0x02,0x52,0x92,0x52,0x52,0x91,0x52,0xA1,0x03,0x12,0x24,0xC1,0xA1,0x08, +0xA1,0x0C,0x52,0xC0,0xA1,0x10,0x52,0xD1,0x52,0xA1,0x14,0x12,0x14,0x9C,0x10,0xAA, +0x04,0x58,0xD0,0xA1,0x08,0x59,0xC0,0xA1,0x0C,0x5A,0xD0,0xA1,0x10,0x55,0x31,0x26, +0xE8,0xE0,0x03,0xAB,0x30,0x03,0x31,0x96,0xFF,0xD0,0x02,0x55,0x17,0xEF,0x99,0x7E, +0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8F,0x07,0xFF,0xFF,0xEF,0xA0,0x34,0xD0,0x8F,0x00,0xA0,0xFF,0x0B,0xA0,0x04,0xDA, 0x00,0x26,0x7D,0x8E,0x50,0x17,0xBE,0x00,0xD0,0x8F,0x00,0x00,0x80,0xE1,0x54,0x9E, 0xAF,0x8A,0x51,0x30,0xCA,0xF8,0x05,0x00,0xDE,0x9F,0x00,0x00,0x80,0xE1,0x50,0xDE, diff --git a/VAX/vmb.exe b/VAX/vmb.exe index 5f7cb8f8..e35ba397 100644 Binary files a/VAX/vmb.exe and b/VAX/vmb.exe differ diff --git a/sim_BuildROMs.c b/sim_BuildROMs.c index 39961d09..2a765044 100644 --- a/sim_BuildROMs.c +++ b/sim_BuildROMs.c @@ -43,7 +43,7 @@ struct ROM_File_Descriptor { {"VAX/ka620.bin", "VAX/vax_ka620_bin.h", 65536, 0xFF7F930F, "vax_ka620_bin"}, {"VAX/ka630.bin", "VAX/vax_ka630_bin.h", 65536, 0xFF7F73EF, "vax_ka630_bin"}, {"VAX/ka610.bin", "VAX/vax_ka610_bin.h", 16384, 0xFFEF3312, "vax_ka610_bin"}, - {"VAX/vmb.exe", "VAX/vax_vmb_exe.h", 44544, 0xFFC014CC, "vax_vmb_exe"}, + {"VAX/vmb.exe", "VAX/vax_vmb_exe.h", 44544, 0xFFC014BB, "vax_vmb_exe"}, {"swtp6800/swtp6800/swtbug.bin", "swtp6800/swtp6800/swtp_swtbug_bin.h", 1024, 0xFFFE4FBC, "swtp_swtbug_bin"}, };