=================== C-CODE CUT FROM NOVA_DKP.C =============================== EACH NOVA I/O COMMAND SUPPLIES A REGISTER (AC0/AC1/AC2/AC3) WITH BITS TO TELL THE CONTROLLER WHAT TO DO DOA SELECTS THE DRIVE, TRACK(SURFACE), AND SECTOR, AND SUPPLIES A NEGATIVE SECTOR COUNT DOB PROVIDES THE MEMORY ADDRESS DOC SELECTS THE CYLINDER AND SETS THE COMMAND (READ,WRITE,SEEK,RECAL) DOC ALSO CAN CLEAR DONE FLAGS IN THE CONTROLLER DIA GETS CONTROLLER STATUS DIB AND DIC RETRIEVE VALUES, BUT THESE ARE NOT USED IN IRIS THE FOLLOWING SECTIONS EXPLAIN HOW THE BITS PROVIDED IN THE REGISTERS ARE INTERPRETED BY A STANDARD DG CONTROLLER (AND BY SIMH) NOTE THAT THERE ARE 2 MAJOR FORMATS, DUBBED 'OLD' AND 'NEW' IN THE CODE /* ============== THIS IS SUPPLIED BY THE DOC COMMAND ================== */ /* Unit, surface, sector, count register /* Original format: 2b, 6b, 4b, 4b 5432109876543210 <<<<< BIT# */ UUTTTTTTSSSSXXXX Revised format: 2b, 5b, 5b, 4b 5432109876543210 <<<<< BIT# */ UUTTTTTSSSSSXXXX WHERE U = UNIT BITS / T = TRACK BITS / S = SECTOR BITS / X = COUNT BITS */ #define USSC_V_COUNT 0 (displacement) /* count */ #define USSC_M_COUNT 017 /* 4 BITS */ #define USSC_V_OSECTOR 4 (displacement) /* old: sector */ #define USSC_M_OSECTOR 017 /* 4 BITS */ #define USSC_V_OSURFACE 8 (displacement) /* old: surface */ #define USSC_M_OSURFACE 077 /* 6 BITS */ #define USSC_V_NSECTOR 4 (displacement) /* new: sector */ #define USSC_M_NSECTOR 037 /* 5 BITS */ #define USSC_V_NSURFACE 9 (displacement) /* new: surface */ #define USSC_M_NSURFACE 037 /* 5 BITS */ #define USSC_V_UNIT 14 (displacement) /* unit */ #define USSC_M_UNIT 03 /* 2 bits */ =============================================================================*/ /* ============== THIS IS SUPPLIED BY THE DOA COMMANDS ================== */ /* Flags, command, cylinder register Original format: 5b, 2b, 1b + 8b (surrounding command) 5432109876543210 <<<<< BIT# */ RDDDDMM0CCCCCCCC Revised format: 5b, 2b, 9b 5432109876543210 <<<<< BIT# */ RDDDDMMCCCCCCCCC RDDDD = DONE FLAGS (R=READ/WRITE; D=DRIVE SEEK, EACH BIT IS A DRIVE) MM = MODE (READ, WRITE, SEEK, RECAL) #define FCCY_V_OCYL 0 /* old: cylinder */ #define FCCY_M_OCYL 0377 #define FCCY_V_OCMD 8 /* old: command */ #define FCCY_M_OCMD 3 #define FCCY_V_OCEX 10 /* old: cyl extend */ #define FCCY_OCEX (1 << FCCY_V_OCEX) #define FCCY_V_NCYL 0 /* new: cylinder */ #define FCCY_M_NCYL 0777 #define FCCY_V_NCMD 9 /* new: command */ #define FCCY_M_NCMD 3 #define FCCY_READ 0 #define FCCY_WRITE 1 #define FCCY_SEEK 2 #define FCCY_RECAL 3 #define FCCY_FLAGS 0174000 /* flags */ =============================================================================*/ #define GET_SA(cy,sf,sc,t) (((((cy)*drv_tab[t].surf)+(sf))* \ drv_tab[t].sect)+(sc)) =============================================================================*/ notice that the simh supported drives fall into 2 categories based on whether they use the old or new format The logic for all of them is similar, but the bit placement varies by format and the max# allowed in each area is limited by the drive characteristics /* This controller supports many different disk drive types: type #sectors/ #surfaces/ #cylinders/ new format? surface cylinder drive floppy 8 1 77 no Diablo 31 12 2 203 no Century 111 6 10 203 no 4048 (same as Century 111) Diablo 44 12 4 408 no Century 114 12 20 203 no 4057 (same as Century 114) DS/DD floppy 16 2 77 yes (6097 "quad floppy") 6225 20 2 245 yes 6099 32 4 192 yes 6227 20 6 245 yes 6070 24 4 408 yes 6103 32 8 192 yes 4231 23 19 411 yes