* DP$X - MAY 29 2007 - VERSION 1.01 * * DRIVER FOR THE MOVING HEAD DISK. * * SEE FOR HARDWARE AND PROGRAMMING DETAILS THE HONEYWELL SERIES 16 MANUAL: * MOVING-HEAD DISK, OPTIONS 4613,4651 AND 4720 * PROGRAMMERS' REFERENCE MANUAL * DOC NUMBER: CA38 / 701300725228 * * THE DRIVER IS CONFIGURED FOR 4 * DP-4651 CONNECTED TO DMC CHANNEL 1. * DISC SIZE = 1662976 BYTES AND IS FORMATTED WITH 12 (OR 6) SECTORS OF * 256 (OR 512) BYTES PER TRACK * THE DISC HAS 200 + 3 CYLINDERS AND 2 HEADS; CYLINDER 0 IS AT THE RIM. * TOTAL NUMBER OF SECTORS: 200 * 2 * 12 = 4800 (FOR 203 CYLS: 4872) * (WHEN FORMATTED WITH 6 SECTORS PER TRACK, THE TOTAL NUMBER OF SECTORS IS * 2400 FOR THE 200 CYLINDERS, OR 2036 FOR THE 203 CYLINDERS). * * THE DRIVER SUPPORTS 4 UNITS MAXIMUM * * BY ADAPTING THE CONSTANTS AS DEFINED FOR THE DISC PARAMETERS IN THIS DRIVER * (REFLECTING THE 4651 DISC TYPE AND FORMATTED WITH 12 * 128 WORD SECTORS * PER TRACK) THE DRIVER CAN BE USED FOR ANOTHER DISC TYPE AND/OR ANOTHER FORMAT. * * HONEYWELL X16 16 BIT COMPUTER SOFTWARE * * THE SOURCE IS CREATED BY: THEO ENGEL (THEO.ENGEL@HETNET.NL) * * CALLING SEQUENCE: * CALL DP$W / DP$R (W=WRITE BLOCK, R=READ BLOCK) * DEC UNIT NUMBER (0..3) * DEC BLOCK NUMBER (0..4799) * DAC BLOCK BUFFER ADDRESS (POINTER TO 128 WORD BUFFER) * ERROR RETURN (A=STATUS NE 0) * NORMAL RETURN (A=0) * * DRIVER INITIALIZATION: * CALL DP$I * OCT RESULT * NORMAL RETURN * * RESULT IN BITS<9:16> * UNIT 3 BIT9 =1 UNIT NOT AVAILABLE ELSE 0 * UNIT 3 BIT10 =1 SEEK ERROR ELSE 0 * UNIT 2 BIT11 =1 UNIT NOT AVAILABLE ELSE 0 * UNIT 2 BIT12 =1 SEEK ERROR ELSE 0 * UNIT 1 BIT13 =1 UNIT NOT AVAILABLE ELSE 0 * UNIT 1 BIT14 =1 SEEK ERROR ELSE 0 * UNIT 0 BIT15 =1 UNIT NOT AVAILABLE ELSE 0 * UNIT 0 BIT16 =1 SEEK ERROR ELSE 0 * SUBR DP$R READ BLOCK SUBR DP$W WRITE BLOCK SUBR DP$I INIT DRIVER FOR ALL UNITS REL EJCT ******************* * DISC PARAMETERS * ******************* * DP-4651 CONSTANTS (FORMAT 12*128 WORD SEQUENTIAL BLOCKS PER TRACK) NC EQU 200 NUMBER OF CYLINDERS NH EQU 2 NUMBER OF HEADS PER UNIT SPT EQU 12 12 SECTORS PER TRACK (FORMATTED) SPC EQU 24 SECTORS PER CYLINDER (NH*SPT) SL EQU 128 SECTOR LENGTH: 128 WORDS (FORMATTED) BPW EQU 2 2 BYTES PER WORD SMAX EQU 4800 MAX SECTORS (NC*NH*SPT) * * DP-4651 CONSTANTS (FORMAT 6*256 WORD SEQUENTIAL BLOCKS PER TRACK) *NC EQU 200 NUMBER OF CYLINDERS *NH EQU 2 NUMBER OF HEADS PER UNIT *SPT EQU 6 6 SECTORS PER TRACK (FORMATTED) *SPC EQU 12 SECTORS PER CYLINDER (NH*SPT) *SL EQU 256 SECTOR LENGTH: 256 WORDS (FORMATTED) *BPW EQU 2 2 BYTES PER WORD *SMAX EQU 2400 MAX SECTORS (NC*NH*SPT) * BMAX DEC SMAX+0 MAX NUMBER OF SECTORS BLM1 DEC SL-1 SECTOR LENGTH - 1 SCYL DEC SPC+0 SECTORS PER CYLINDER STRK DEC SPT+0 SECTORS PER TRACK * * CONTROLLER / DRIVES CONNECTED TO MULTIPLEX CHANNEL 1 MSTR EQU '20 DMC START ADDRESS CHANNEL 1 MEND EQU '21 DMC END ADDRESS CHANNEL 1 * CYL OCT 0 REQUESTED CYLINDER HEAD OCT 0 REQUESTED HEAD SECT OCT 0 REQUESTED SECTOR IN TRACK ADDR OCT 0 SECTOR ADDRESS PATTERN IN TRACK AS FORMATTED * ***************** * ADDR / FORMAT * ***************** * TO LOCATE A SECTOR IN A TRACK, ADDR MUST HAVE THE SECTOR ADDRESS PATTERN OF * THE SECTOR IN THE TRACK AS WRITTEN BY FORMAT!. * IT IS EITHER A SEQUENTUAL ADDRESS OR A GEOMETRIC ADDRESS. * SEQUENTUAL ADDRESSES ARE STARTING WITH ADDRESS 0 IN TRACK-0 AND ENDING WITH * MAX-SECTOR-NUMBER-1 IN THE LAST TRACK. SO WHEN FORMATTED WITH 6 SECTORS * PER TRACK, THE SECTOR ADDRESS IN TRACK-0 ARE 0,1,2,3,4,5, IN TRACK-1 ARE * 6,7,8,9,10,11, ETC. AND IN THE LAST TRACK MAX-6, MAX-5, MAX-4, MAX-3, MAX-2, * MAX-1. * GEOMETRIC ADDRESSES ARE TO BE PROCUCED FROM THE COMBINATION OF CYL-HEAD-SECT, * WHERE CYL IS BITS<1:8>, HEAD IS BITS<9:13> AND SECT IS THE SECTOR NUMBER * OF THE SECTOR IN THE TRACK BITS<14:16> (SO THIS ADDRESS TYPE CAN BE USED * FOR MAX 8 SECTORS PER TRACK.) * * THIS DRIVER USES DISCS FORMATTED WITH SEQUENTIAL ADDRESSES. THE READ/WRITE * BLOCK DRIVER ROUTINES ARE CALLED WITH A SEQUENTIAL (LOGICAL) BLOCK NUMBER, * WHICH IS MAPPED BY THE ROUTINE CVBN TO A PHYSICAL CYLINDER/HEAD/SECTOR * NUMBER. THE BLOCK IS LOCATED BY USING THE CALCULATED CYLINDER/HEAD, AND USES * THE LOGICAL BLOCK NUMBER FOR ADDR TO LOCATE THE SECTOR IN THE TRACK * (ISO OF THE CALCULATE DSECTOR ADDRESS). * WHEN THE DISC IS FORMATTED WITH GEOMETRIC ADDRESSES, THE CYLINDER/HEAD/SECTOR * VALUES CALCULATED BY CVBN MUST BE USED TO PRODUCE ADDR IN ORDER TO LOCATE THE * SECTOR IN HE TRACK. THE ROUTINE CVBN HAS TO BE ADAPTED TO OBTAIN SUPPORT FOR * THIS TYPE OF FORMATTED SECTOR ADDRESSES EJCT * WORKING STORAGE AND CONSTANTS * CMD OCT 0 SET READ='100000 OR WRITE='000000 UNIT OCT 0 SAVED UNIT NUMBER FOR PRODUCING SETUP WORDS RTRY OCT 0 RETRY COUNTER CCYL EQU * CURRENT CYLINDER OCT 0 DRIVE 0 OCT 0 DRIVE 1 OCT 0 DRIVE 2 OCT 0 DRIVE 3 EJCT * DRIVE INITILIZATION DP$I DAC ** INIT THE DRIVER FOR 4 UNITS LLL 32 CLEAR A AND B STA* DP$I CLEAR RESULT STA UNI NUN JST CAL CALIBRATE UNIT UNI OCT 0 NUMBER OF UNIT TO INITIALIZE JMP IERR ERROR RETURN SR LRL 2 NORMAL RETURN (A=0); SHIFT RESULT TO B IRS UNI NEXT UNIT LDA UNI SUB =4 SZE JMP NUN NEXT UNIT LLL 8 GET RESULT FOR THE 4 UNITS STA* DP$I AND SAVE IRS DP$I JMP* DP$I IERR SKS '425 BUSY ? JMP *-1 OCP '1125 GET STATUS INA '1025 JMP *-1 LGR 9 SAVE UNIT AVAILABLE BIT AND SEEK ERROR BIT JMP SR EJCT * READ BLOCK DP$R DAC ** ENTRY POINT READ BLOCK ROUTINE LDA DP$R MOVE LINK STA DP$W LDA ='100000 SET READ COMMAND JMP SCMD * * WRITE BLOCK DP$W DAC ** ENTRY POINT WRITE BLOCK ROUTINE CRA SET WRITE COMMAND SCMD STA CMD LDA =-3 STA RTRY SET RETRY COUNTER LDA* DP$W GET UNIT NUMBER STA 0 X = UNIT NUMBER LGL 11 STA UNIT UNIT NUMBER FOR SETUP WORDS IRS DP$W POINT TO BLOCK NUMBER LDA* DP$W GET BLOCK NUMBER IRS DP$W POINT TO BLOCK BUFFER ADDRESS STA BN BLOCK NUMBER * BECAUSE SEEK IS USING 8-BIT OFFSETS, WRONG OFFSETS BIGGER THAN 8 BITS * MIGHT NOT BE DETECTED BY THE HARDWARE. THEREFOR THIS ADDITIONAL TEST. SPL WITHIN RANGE ? JMP ERR1 BLOCK NUMBER NOT SUPPORTED (<0) SUB BMAX WITHIN RANGE ? SMI JMP ERR1 BLOCK NUMBER NOT SUPPORTED (TOO BIG) JST CVBN CONVERT BLOCK NUMBER TO PHYSICAL CYL-HEAD-SECTOR BN OCT 0 STORED REQUESTED BLOCK NUMBER * SEEK TO REQUESTED CYLINDER NEXT OCP '1725 ENABLE IO BUS MODE; ALSO ENTRY FOR A RETRY LDA 0 UNIT NUMBER LGL 6 ADD SKS SKS UNIT NOT SEEKING? STA SKS0 STA SKS1 SKS '425 CONTROLLER BUSY ? JST TERR ERROR? SKS0 OCT 0 UNIT NOT SEEKING ? JST TERR ERROR? LDA CCYL,1 CURRENT CYLINDER SUB CYL REQUESTED CYLINDER SMI JMP RIM REQUESTED CYLINDER <= CURRENT CYLINDER => D=1 TCA REQUESTED CYLINDER > CURRENT CYLINDER => D=0 JMP AUT * REQUESTED CYLINDER <= CURRENT CYLINDER => D=1 RIM SNZ JMP SIO REQUESTED CYLINDER = CURRENT CYLINDER ADD ='400 SET D=1 AUT ADD UNIT = SETUP WORD FOR DIRECT SEEK OCP '125 DIRECT SEEK OTA '25 OUTPUT SEEK SETUP WORD JST TERR SKS '425 CONTROLLER BUSY ? JST TERR TEST FOR ERROR SKS1 OCT 0 WAIT FOR SEEKING COMPLETE JST TERR TEST FOR ERRORS LDA CYL STA CCYL,1 SAVE CURRENT CYLINDER = REQUESTED CYLINDER * SET MULTIPLEX CHANNEL FOR I/O TRANSFER SIO LDA* DP$W GET BLOCK BUFFER ADDRESS ERA CMD FLAG=0 FOR WRITE; FLAG=1 FOR READ STA MSTR DMC START ADDRESS ERA CMD RESET FLAG IF SET ADD BLM1 BLOCK LENGTH - 1 STA MEND DMC ENDING ADDRESS * START I/O TRANSFER LDA CMD MAKE 1ST SETUP WORD CMA ANA ='100000 READ/WRITE BIT ERA UNIT ERA HEAD OCP '625 START IO OTA '25 OUTPUT 1ST SETUP WORD JST TERR LDA ADDR 2ND SETUP WORD, FORMATTED SECTOR ADDRESS OTA '25 OUTPUT 2ND SETUP WORD JST TERR * WAIT FOR TRANSFER READY OCP '1325 ENABLE DMC/DMA MODE LDA ='10000 MASK BIT SMK '20 SKS '125 WAIT FOR END OF RANGE INTERRUPT SKP YES, INTERRUPT JMP *-2 SKS '425 CONTROLLER BUSY ? JST TERR CHECK FOR ERRORS OCP '1425 ACKNOWLEDGE INTERRUPT CRA RETURN OK IRS DP$W IRS DP$W NORMAL RETURN JMP* DP$W EJCT * TEST FOR ERRORS DURING THE EXECUTION OF A DRIVE COMMAND * DP$W IS POINTING TO THE BLOCK BUFFER ADDRESS TERR DAC ** IAB SAVE A SKS '325 ERROR ? JMP YES LDA TERR SUB =2 STA TERR IAB RESTORE A JMP* TERR * ERROR YES IRS RTRY RETRY ? JMP CALI YES * RETRY/RECALIBRATION DOES NOT HELP ERR SKS '425 BUSY ? JMP *-1 OCP '1125 GET STATUS INA '1025 JMP *-1 A = DISC UNIT STATE ERRX IRS DP$W BLOCK NUMBER TOO BIG JMP* DP$W DRIVER ERROR RETURN ERR1 LDA ='1002 SEEK OUT OFF RANGE STATUS JMP ERRX * RECALIBRATE, AND RESTART THE REQUESTED DRIVER COMMAND CALI LDA UNIT LGR 11 STA UN UNIT NUMBER JST CAL CALIBRATE THE DRIVE UN OCT 0 UNIT NUMBER JMP ERR ERROR DURING CALIBRATION JMP NEXT RETRY THE DRIVER COMMAND EJCT * CALIBRATE A DISC UNIT; SEEK TO CYLINDER 0 * CALLING SEQUENCE: * JST CAL * OCT UNIT NUMBER * ERROR RETURN * NORMAL RETURN (A=0) * CAL DAC ** LDA* CAL UNIT NUMBER STA 0 X = UNIT NUMNER LGL 6 ADD SKS SKS UNIT SEEKING ? STA SKS2 SKS '425 CONTROLLER BUSY ? JMP *-1 SKS2 OCT 0 UNIT SEEKING ? JMP *-1 OCP '1725 USE THE IO BUS OCP '25 GO TO CYLINDER 0 LDA* CAL UNIT NUMBER LGL 11 OTA '25 OUTPUT SETUP WORD JMP *-1 SKS '425 CONTROLLER BUSY ? JMP *-1 SKS '325 ERROR ? JMP CERR YES * WE ARE ON CYLINDER 0 ON THIS UNIT CRA STA CCYL,1 SAVE CURRENT CYLINDER NUMBER IRS CAL NORMAL RETURN CERR IRS CAL ERROR RETURN JMP* CAL SKS SKS '1125 UNIT 0 NOT SEEKING? EJCT * CONVERT BLOCK NUMBER TO PHYSICAL CYL - HEAD - SECTOR * BLOCK NUMBER = (LOGICAL) SEQUENTIAL SECTOR NUMBER * BLOCKS AND SECTORS HAVE EQUAL LENGTH * * CALLING SEQUENCE: * X = UNIT NUMBER * JST CVBN * OCT BLOCK NUMBER TO CONVERT * * THE ROUTINE FILLS THE WORDS CYL AND HEAD WITH THE CALCULATED VALUES TO * LOCATE THE TRACK IN WHICH THE REQUESTED BLOCK LIVES. * FOR LOCATING THE SECTOR IN THE TRACK, THE SEQUENTIAL BLOCK NUMBER IS USED AS * THE PATTERN (WRITTEN BY FORMAT) TO LOCATE THE SECTOR AND IS STORED THEREFOR * AS THE 4RD VALUE IN THE WORD ADDR. * WHEN GEOMETRIC ADDRESS ARE USED TO IDENTIFY SECTORS IN THE TRACK, * CYL/HEAD/SECT HAVE TO BE COMBINED IN ADDR (CYL = BITS<1:8>, HEAD = BITS<9:13> * SECT = ) * CVBN DAC ** CRA STA CYL STA HEAD LDA* CVBN GET BLOCK NUMBER TO CONVERT * CALCULATE REQUESTED CYLINDER = BLOCKNUMBER / SECTORS PER CYL * THE REMAINDER = SECTOR NUMBER IN THE CALCULATED CYLINDER CSUB SUB SCYL SECTORS PER CYLINDER SPL JMP H IRS CYL JMP CSUB * REMAINDER = SECTOR NUMBER IN THE CALCULATED CYLINDER H ADD SCYL = REMAINDER * CALCULATE REQUESTED HEAD = SECTOR NUMBER IN CYLINDER / SECTORS PER TRACK * REMAINDER = SECTOR NUMBER IN TRACK HSUB SUB STRK SECTORS PER TRACK SPL JMP S IRS HEAD JMP HSUB * REMAINDER = SECTOR NUMBER IN TRACK S ADD STRK STA SECT * SHIFT HEAD TO PLACE FOR USING IT IN SETUP WORDS LDA HEAD LGL 6 STA HEAD * * STORE THE PATTERN USED TO IDENTIFY THE SECTOR IN THE TRACK IN ADDR ***** ADAPT IF DISCS ARE USED FORMATTED WITH GEOMETRIC SECTOR ADDRESSES ***** LDA* CVBN STA ADDR STORE SECTOR ADDRESS PATTERN IRS CVBN JMP* CVBN FIN END