############################################################################## I (Mike Douglas) wrote the CP/M 2.2 BIOS and created the disk images you are referring to for the North Star MDS-A1 controller. This is the older, single density controller. The BIOS is definitely configured for 64 directory entries (extents). The BIOS is here: http://deramp.com/downloads/process...e/northstar_sd_controller/disk_images/cpm2.2/ Your diskdef was close, you just needed to remove the sector skew. I experimented with cpmtools this morning and it appears that a skew of 0 or 1 gives the same results. I'm assuming 0 means "no skew" which results in sectors incrementing by 1, which of course, is the same as specifying a skew of 1 which also increments by 1. # Northstar Single Density Micro-Disk System MDS-A1, A2, etc. diskdef mdsa1 seclen 256 blocksize 1024 tracks 35 maxdir 64 boottrk 3 sectrk 10 skew 1 os 2.2 end It's much easier to create and modify these disk images by actually running the disk images under SIMH. I added support for the North Star single density controller to SIMH a number of years ago. I also created a custom CUTER PROM to load into SIMH that maps calls to CUTER for console I/O to the Altair ports that SIMH supports. Let me know if you want to go that route and I can help you out. -- Mike Douglas, Nov 4, 2018 ############################################################################### For the Northstar .NSI images that are on Bitsavers, the Dave Dunfield Site (and other sites) I've conjured up cpmtools and libdsk definitions for the 87K, 175K, and 350K floppy images in .NSI format. -- Larry Kraemer, Dec 13, 2018 ############################################################################### # Northstar Micro-Disk System MDS-A1 - SSSD 48 tpi 5.25" - 256 x 10 diskdef mdsad87 seclen 256 tracks 35 sectrk 10 blocksize 1024 maxdir 64 skew 1 boottrk 3 os 2.2 end #libdskrc data below [mdsad87] Description = Northstar Micro-Disk System MDS-A1 - SSSD 48 tpi 5.25" - 256 x 10 #Sides = Alt Cylinders = 35 Heads = 1 Sectors = 10 SecBase = 1 SecSize = 256 DataRate = SD #RWGap = 12 #FmtGap = 23 # Northstar Micro-Disk System MDS-A-D 175 - SSDD 48 tpi 5.25" - 512 x 10 diskdef mdsad175 seclen 512 blocksize 1024 tracks 35 maxdir 64 boottrk 2 sectrk 10 skew 5 os 2.2 end #libdskrc data below [mdsad175] Description = Northstar Micro-Disk System MDS-A-D 175 - SSDD 48 tpi 5.25" - 512 x 10 #Sides = Alt Cylinders = 35 Heads = 1 Sectors = 10 SecBase = 1 SecSize = 512 DataRate = DD #RWGap = 12 #FmtGap = 23 # Northstar Micro-Disk System MDS-A-D 350 - DSDD 48 tpi 5.25" - 512 x 10 diskdef mdsad350 seclen 512 blocksize 1024 tracks 70 maxdir 64 boottrk 2 sectrk 10 skew 5 os 2.2 end [mdsad350] Description = Northstar Micro-Disk System MDS-A-D 350 - DSDD 48 tpi 5.25" - 512 x 10 Sides = Alt Cylinders = 35 Heads = 2 Sectors = 10 SecBase = 1 SecSize = 512 DataRate = DD #RWGap = 12 #FmtGap = 23 ############################################################################### TEST FILE #1 - 89600 Bytes - CPM22b14-48K-SDC-HORIZON.NSI cpmls -f mdsad87 -D CPM22b14-48K-SDC-HORIZON.NSI cpmls -f mdsad87 -T raw,mdsad87 -D CPM22b14-48K-SDC-HORIZON.NSI cpmls -f mdsad87 -T logical,mdsad87 -D CPM22b14-48K-SDC-HORIZON.NSI cpmls -f mdsad87 -D CPM22b14-48K-SDC-HORIZON.NSI Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- ASM .COM 8K 64 COPY .COM 2K 14 DDT .COM 5K 38 DUMP .COM 1K 4 ED .COM 6K 48 LOAD .COM 2K 16 MOVCPM .COM 11K 84 PCGET .COM 1K 7 PCPUT .COM 1K 7 PIP .COM 8K 58 STAT .COM 6K 42 SUBMIT .COM 3K 17 SYSGEN .COM 1K 8 USERHRZ .ASM 8K 58 14 Files occupying 63K, 15K Free. ############################################################################### cpmcp -f mdsad87 CPM22b14-48K-SDC-HORIZON.NSI 0:USERHRZ.ASM . cpmcp -f mdsad87 -T logical,mdsad87 CPM22b14-48K-SDC-HORIZON.NSI 0:USERHRZ.ASM . cpmcp -f mdsad87 -T raw,mdsad87 CPM22b14-48K-SDC-HORIZON.NSI 0:USERHRZ.ASM . ;---------------------------------------------------------------- ; USERHRZ.ASM MAR 2, 1981 ; ; Updated 11-13-15 by M Douglas for use with ; CP/M 2.2 for single density North Star controller ; ; This USER AREA is for a Horizon computer ; as used with CP/M 2.2 for single density North Star ; ; It may be used as a prototype for modification. ; ; USER area location (180h bytes long) ; 0500h from start of BIOS ; 1B00h from start of CP/M ; 2500h in memory after loading or running MOVCPM ; 1C00h offset in the disk image file ; ; IOBYTE location: 1Dh from start of USER area ; ; To install this patch: ; 1) Set MSIZE immediately below and assemble this file. ; 2) Run MOVCPM and save the image to a file (e.g., CPM.COM) ; as prompted, ; 3) Use DDT to install the patch in the CP/M image: ; A>DDT CPM.COM ; -IUSERHRZ.HEX ; -R7200 (replace 7200 with value of "OFFSET" below) ; -G0 ; A>SYSGEN (hit return at source prompt to use ; image in memory, then follow remaining ; prompts). ; ; IOBYTE behavior in this code ; ; CON device (bits 1,0): ; 00 - TTY left serial port* ; 01 - CRT right serial port ; 10 - BAT batch mode ; 11 - UC1 parallel port ; ; RDR device (bits 3,2): ; 00 - TTY left serial port* ; 01 - PTR right serial port ; 10 - UR1 parallel port ; 11 - UR2 parallel port ; ; PUN device (bits 5,4): ; 00 - TTY left serial port* ; 01 - PTP right serial port ; 10 - UP1 parallel port ; 11 - UP2 parallel port ; ; LST device bits (7,6): ; 00 - TTY left serial port* ; 01 - CRT right serial port ; 10 - LPT parallel port ; 11 - UL1 parallel port ; ; *default setting, see HORIOB below ;---------------------------------------------------------------- ;Change MSIZE to the memory size desired. MSIZE EQU 48 ;Distribution system ; BIOS and USER area equates BIOSLEN equ 1200h ;length of the BIOS USROFF equ 0500h ;offset of USER area in BIOS USRAREA equ MSIZE*1024 - BIOSLEN + USROFF IOBYT equ 3 ;IOBYTE in CP/M OFFSET equ 2500h-USRAREA ;offset to overlay SYSGEN image ORG USRAREA ;Origin of this program ;THE JUMP TABLE FOLLOWING MUST BE PRESENT AND ;THE SEQUENCE OF JUMPS MAY NOT BE CHANGED JMP HCINIT ;Initialize I/O ports JMP HWINIT ;Warm boot init JMP HCONST ;Console status JMP HCONIN ;Console input JMP HCONOUT ;Console output JMP HLIST ;Printer output JMP HPUNCH ;Punch output JMP HREADER ;Reader input JMP HLISTST ;Printer status DW HORLEN ;Length of USER AREA HORIOB: DB 0 ;Initial IOBYT value DB 0,0,0 ;Reserved ;YOU MAY MAKE ANY CHANGES DESIRED FROM THIS POINT ON. ;KEEP THE TOTAL USER AREA UNDER 384 BYTES. ;LOGICAL I/O ROUTINES ;Each logical I/O routine loads the IOBYT at address 3, ;rotates the proper two bit field into bits 0 and 1, ;and calls the DSPCH routine which selects one ;of the four physical drivers from the table following ;depending on the value of bits 0 and 1. ;The HLIST routine has been fully commented to aid you. HCONST: ;Select console status routine. LDA IOBYT CALL DSPCH DW CINST0 ;Left serial DW CINST1 ;Right serial DW HLISTST ;Batch mode DW CINST2 ;Parallel port HCONIN: ;Select console input routine. LDA IOBYT CALL DSPCH DW CIN0 ;Left serial DW CIN1 ;Right serial DW HREADER ;Batch mode DW CIN2 ;Parallel port HCONOUT: ;Select console output routine. LDA IOBYT CALL DSPCH DW COUT0 ;Left serial DW COUT1 ;Right serial DW HLIST ;Batch mode DW COUT2 ;Parallel port HLIST: ;Select a list driver. LDA IOBYT ;Load IOBYT from address 4. RLC ;Rotate LIST selection bits RLC ;into bit position 0 and 1. CALL DSPCH ;Call dispatcher. ;The dispatcher selects a routine from the table ;following depending on the value of bits 0-1. ;The selected routine will return to the caller. DW COUT0 ;00B = Left serial DW COUT1 ;01B = Right serial DW COUT2 ;10B = Parallel port DW COUT2 ;11B = Parellel port HPUNCH: ;Select as PUNCH driver. LDA IOBYT RRC RRC RRC RRC CALL DSPCH DW COUT0 DW COUT1 DW COUT2 DW COUT2 HREADER: ;Select a READER driver. LDA IOBYT RRC RRC CALL DSPCH DW CIN0 DW CIN1 DW CIN2 DW CIN2 HLISTST: ;List status not implemented. XRA A RET DSPCH: ;Select routine from table of caller. ANI 3 ;Mask IOBYT and RLC ;mult times 2. MOV E,A ;Put index into MVI D,0 ;DE register. POP H ;get addr of table DAD D ;and add index. MOV E,M ;Get addr of routine INX H ;into MOV D,M ;DE first, XCHG ;then put into HL PCHL ;and transfer control. ;PHYSICAL STATUS ROUTINES CINST0: ;Left serial port status. IN 3 ANI 2 RZ ;No key MVI A,0FFH RET ;Char ready CINST1: ;Right serial port status. IN 5 ANI 2 RZ ;No key MVI A,0FFH RET ;Char ready CINST2: ;Parallel port status. IN 6 ANI 2 RZ MVI A,0FFH RET ;PHYSICAL INPUT ROUTINES CIN0: ;Left serial port input. IN 3 ANI 2 JZ CIN0 IN 2 ANI 7FH RET CIN1: ;Right serial port input. IN 5 ANI 2 JZ CIN1 IN 4 ANI 7FH RET CIN2: ;Parallel port input. IN 6 ;Motherboard status ANI 2 JZ CIN2 IN 0 ;Read keyboard PUSH PSW ;Save char MVI A,30H OUT 6 ;Reset PI flag POP PSW ANI 7FH RET ;PHYSICAL OUTPUT ROUTINES COUT0: ;Left serial port output. IN 3 ANI 1 JZ COUT0 MOV A,C OUT 2 RET COUT1: ;Right serial port output. IN 5 ANI 1 JZ COUT1 MOV A,C OUT 4 RET COUT2: ;Parallel port output. IN 6 ;Motherboard status ANI 1 JZ COUT2 MVI A,20H ;Reset PO flag OUT 6 ;Output char MOV A,C ;Load accumulator TIN1: ORI 80H ;Set strobe false OUT 0 ;and send character XRI 80H ;Toggle strobe OUT 0 ;Output XRI 80H ;and toggle again OUT 0 ANI 7FH ;Mask to ASCII RET ;HORIZON HARDWARE INITIALIZATION HWINIT: ;Warm boot initialization. DB 0,0,0 ;May be patched RET HCINIT: ;Cold boot initialization. LDA HORIOB ;Get initial IOBYT STA IOBYT ;and store CALL HUINIT ;User init routine ;Init motherboard and set up serial ports. XRA A OUT 6 OUT 6 OUT 6 OUT 6 ;Init left serial port (Standard console). MVI A,0CEH ;Set 2 stop bits OUT 3 ;to first serial port MVI A,37H ;CMMD: RTS ER RXF DTR TXEN OUT 3 ;to first port ;Init right serial port. MVI A,0CEH ;Set 2 stop bits OUT 5 ;to second serial port MVI A,37H ;Same command OUT 5 ;to second port ;0CEH sets 2 stop, 8 data bits, 16X clock, no parity. ;04EH sets 1 stop, 8 data bits, 16X clock, no parity. ;Parity initialization. MVI A,40H ;Disarm parity logic OUT 0C0H LXI H,0 MVI A,0E0H ;Loop to set parity for first 56K of RAM. TINCP: MOV B,M ;Read byte MOV M,B ;Put back with parity set INR L ;Next memory location JNZ TINCP INR H ;Next 256 byte page CMP H ;up to 0E0H JNZ TINCP ;Enable parity logic on memory board. MVI A,41H OUT 0C0H ;Clear input buffers on serial ports. IN 2 IN 4 ;Init parallel port. MVI A,30H OUT 6 ;Reset parallel port PI flag MVI A,60H ;Code to set PO flag OUT 6 MVI A,0DH ;Output a carriage return JMP TIN1 ;to parallel port ;SPECIAL INITIALIZATION FOR USER HUINIT: RET HORLEN EQU $-USRAREA ;LENGTH END ############################################################################### TEST FILE #2 - 179200 Bytes - C223_56.NSI Code: cpmls -f mdsad175 -D C223_56.NSI cpmls -f mdsad175 -T raw,mdsad175 -D C223_56.NSI cpmls -f mdsad175 -T logical,mdsad175 -D C223_56.NSI cpmls -f mdsad175 -D C223_56.NSI Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- ASM .COM 8K 64 CONFIG .COM 6K 48 COPY .COM 4K 30 CPM56 .COM 10K 80 DDT .COM 5K 38 DISKDEF .LIB 7K 50 DUMP .ASM 5K 34 DUMP .COM 1K 4 ED .COM 7K 52 FILECOPY.COM 1K 7 FORMAT .COM 2K 15 HORUSER .ASM 6K 46 LOAD .COM 2K 14 LOTTO .NBP 2K 10 MEMR .COM 3K 18 MEMR .DOC 9K 67 MOVCPM .COM 11K 88 NS5BAS .COM 17K 130 NSDD .COM 6K 41 PIP .COM 8K 58 READ-ME .DOC 6K 41 SAVEUSER.COM 1K 6 SETCPM .COM 6K 45 STAT .COM 6K 41 SUBMIT .COM 2K 10 SYSGEN .COM 2K 12 USER .ASM 11K 82 XSUB .COM 1K 6 28 Files occupying 155K, 8K Free. ############################################################################### TEST FIle #3 - 358400 Bytes - N22A_56.NSI Code: cpmls -f mdsad350 -D N22A_56.NSI cpmls -f mdsad350 -T raw,mdsad350 -D N22A_56.NSI cpmls -f mdsad350 -T logical,mdsad350 -D N22A_56.NSI cpmls -f mdsad350 -D N22A_56.NSI Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- ASM .COM 8K 64 COPY .COM 4K 17 DDT .COM 6K 38 DIRDUMP .COM 2K 11 DUMP .COM 2K 4 ED .COM 8K 52 FCOPY .COM 2K 4 FCOPY .MAC 4K 32 FINPUT .COM 2K 4 FINPUT .MAC 6K 36 FORMAT .COM 2K 16 FPRINT .COM 2K 3 FPRINT .MAC 6K 33 LOAD .COM 2K 14 NEWBIOS .COM 2K 3 NEWBIOS .MAC 6K 39 PIP .COM 8K 58 R STAT .COM 6K 41 R SUBMIT .COM 2K 10 SYSGEN .COM 2K 7 XSUB .COM 2K 6 21 Files occupying 84K, 254K Free. ############################################################################### cpmcp -f mdsad350 N22A_56.NSI 0:NEWBIOS.MAC . cpmcp -f mdsad350 -T raw,mdsad350 N22A_56.NSI 0:NEWBIOS.MAC . cpmcp -f mdsad350 -T logical,mdsad350 N22A_56.NSI 0:NEWBIOS.MAC . .PHASE 0DA00H .Z80 ; ; ;***** USER AREA ***** USER AREA ***** USER AREA ***** ; MICROANGELO BASIC INPUT OUTPUT SYSTEM ; PERFORMS CHARACTER INPUT/OUTPUT FOR THE ; CP/M SEQUENTIAL DEVICES - CONSOLE & LIST ; ;THESE ROUTINES ARE FOR MICROANGELO SYSTEM(56K MEMORY) ;MAY BE REPLACED IN EITHER THE SYSGEN-RAM-IMAGE AT ; 3200H-33FFH, OR IN SECTOR 8 (IN THE SYSTEM TRACK AREA), ; ; ;****** BEGINNING OF JUMP VECTOR ********************** ; JP INIT ;COLD BOOT INIT (USART & PARITY SETUP) JP CONTST ;CONSOLE TEST FOR INPUT JP CINL ;CONSOLE INPUT (PARRALLEL PORT) JP COUTL ;CONSOLE OUTPUT(MICROANGELO PORT) PRTSER: JP COUTR ;SERIAL PRINTER(RIGHT SERIAL PORT) JP COUTL ;PUNCH TO CONSOLE JP CINL ;PAPER TAPE READER FROM CONSOLE JP PRTTST ;TEST PRINTER STATUS - NULL IMPLEMENTATION PRTPAR: RET ;PARALLEL PRINTER (IF CPMGEN TOLD PARALLEL) ;*** CPMGEN ALTERS BIOS+10H TO JUMP TO "PRTSER" OR "PRTPAR" ; DEPENDING UPON PRINTER INTERFACE ANSWER. ; ;****** END OF DEFINED JUMP VECTOR **************************** ; ; ; ; ;*** MICROANGELO I/O ROUTINES *** ; ;INPUT FROM KEYBOARD ATTACHED TO PARRALLEL PORT *** CINL: IN A,(06H) AND 02H JP Z,CINL IN A,(00H) PUSH AF LD A,30H OUT (06H),A POP AF CP 99H ;SWITCH UPPER CASE? JP Z,ALP NOP NOP LD C,A LD A,(UPP) CP 00H JP NZ,UPPER LD A,C RET ALP: LD A,(UPP) XOR (0FFH) LD (UPP),A JP CINL UPPER: LD A,61H LP3: CP C JP Z,YES INC A CP 7BH JP NZ,LP3 LD A,C RET YES: RES 5,C LD A,C RET ; ;CONSOLE INPUT PENDING TEST CONTST: IN A,(06H) ;GET LEFT USART STATUS NOP ;ROOM FOR PATCHING AND 02H RET Z LD A,(0FFH) RET ; ;OUTPUT TO CONSOLE VIA MICROANGELO PORT. ;NOTE HANDLING OF -LF- AND -CR- AND CURSOR ADDRESSING COUTL: LD A,C CP 81H JP Z,CADD LD A,(AFLG) CP 00H JP NZ,SKIP LD A,C CP 0DH JP Z,CR CP 0AH JP Z,LF LD C,A LP11: IN A,(0F1H) AND 01H JP NZ,LP11 LD A,C OUT (0F0H),A RET CR: CALL READ LD C,81H CALL LP11 LD C,D CALL LP11 LD C,00H CALL LP11 RET LF: CALL READ LD B,C LD C,80H CALL LP11 LD C,00H CALL LP11 LD C,0DH CALL LP11 CALL READ LD C,81H CALL LP11 LD C,D CALL LP11 LD C,B CALL LP11 RET READ: LD C,82H CALL LP11 CALL RD1 LD D,A CALL RD1 LD C,A RET RD1: IN A,(0F1H) AND 02H JP Z,RD1 IN A,(0F0H) RET CADD: LD C,A LD A,02H LD (AFLG),A JP LP11 SKIP: LD A,(AFLG) DEC A LD (AFLG),A JP LP11 AFLG: NOP UPP: NOP ; ;OUTPUT TO LEFT SERIAL PORT (PRINTER) COUTR: IN A,(03H) NOP AND 01H JP Z,COUTR LD A,C NOP OUT (02H),A RET ;NULL IMPLEMENTATION OF PRINTER TEST PRTTST: XOR A ;LEAVE ZERO IN A RET ;DONE ; ;*********** INITIALIZATION CODE **************** ;******* PERFORMED ONLY ON COLD BOOTSTRAP ******* INIT: NOP ;THREE NOP'S FOR PATCHING NOP NOP ; ;INITIALIZE MOTHER BOARD AND SERIAL PORTS XOR A OUT (06H),A OUT (06H),A OUT (06H),A OUT (06H),A ;STANDARD (LEFT) SERIAL PORT INITIALIZATION LD A,0CEH ;2 STOP BITS, 16X CLOCK OUT (03H),A ;& 8 DATA BITS, NO PARITY LD A,37H ;CMD: RTS,ER,RXF,DTR,TXEN OUT (03H),A ;SECONDARY(RIGHT)SERIAL PORT INITIALIZATION LD A,0CEH ;2 STOP BITS, 16X CLOCK OUT (05H),A ;& 8 DATA BITS, NO PARITY LD A,37H ;CMD: RTS,ER,RXF,DTR,TXEN OUT (05H),A ; ;PARITY INITIALIZATION LD A,40H ;DISABLE PARITY LOGIC OUT (0C0H),A ;BEFORE READING UNWRITTEN RAM LD HL,00H ;PREPARE TO CYCLE THROUGH RAM LD A,0E0H ;END OF 56K OF RAM ;LAST 8K NOT DONE TO AVOID MDS DISK CONTROLLER ;SO ABOVE LINE AVOIDS STD E800H, ALSO F0,F8,... TINPAR: LD B,(HL) LD (HL),B INC L JP NZ,TINPAR INC H CP H JP NZ,TINPAR ; ;PARITY ALL CORRECT, ENABLE PARITY TESTING TINU: LD A,41H ;TURN PARITY ON OUT (0C0H),A ;ON RAM BOARDS ; ;REMOVE ANY JUNK APPEARING IN INPUT PORTS IN A,(02H) ;FROM STD PORT IN A,(04H) ;FROM SECOND PORT ; ;INIT PARALLEL PORT AND ANY PRINTER ON IT LD A,30H ;RESET PAR. INPUT FLAG OUT (06H),A LD A,60H ;SET PAR. INPUT FLAG OUT (06H),A LD A,01H ;RESTART MICROANGELO OUT (0F1H),A LD A,00H OUT (0F1H),A LD A,0DH OR (80H) OUT (00H),A XOR (80H) OUT (00H),A XOR (80H) OUT (00H),A RET ; ; ; THE LAST 80H BYTES OF THIS 512 BYTE USER AREA IS NEEDED ; BY THE DISK BIOS FOR TWO SPECIAL PURPOSES. ; 1. SUPPORT NON-STANDARD DISK CONTROLLER PROM ADDRESSES ; 2. AUTOSTART HDBOOT AND SUPPLY THE WORK-FILE PATHNAME ; FOR NORTH STAR HARD DISK SYSTEMS. ; ; IF YOU HAVE NEITHER A NORTH STAR HARD DISK ; NOR A NON-STANDARD MDS PROM ADDRESSES, ; THEN YOU MAY FREELY OVERWRITE THE AREA AND USE THE ; ENTIRETY OF SECTOR 8 IN THE SYSTEM TRACK AREA. ; ; IF YOU DO HAVE A HARD DISK OR NON-STANDARD MDS PROMS, ; THEN YOU MUST LEAVE THE LAST 80H BYTES INTACT. ; IN THE SYSGEN RAM IMAGE, YOU MUST LEAVE 3380H THRU ; 33FFH UNMODIFIED, USE ONLY 3200H-337FH FOR YOUR ; REPLACEMENT USER AREA ###############################################################################