/ P?S/8 FLOPPY DISK HANDLER / LAST EDIT: 23-FEB-1988 15:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 NON-SYSTEM HANDLER FOR HIGH-DENSITY FLOPPY DISKS. / SUPPORTED HARDWARE: / CESI MDC8 HOST ADAPTER (MINIMUM FIRMWARE REVISION 02). / OMTI 20-D OR 5000 SERIES DISK CONTROLLER (5200, 5400). / TEAC FD55G SERIES 80 TRACK HIGH-DENSITY FLOPPY DRIVES (2, 3). / REQUIRES PDP-8/I PROCESSOR (OR BETTER). / EACH HANDLER UNIT (0 AND 1) ADDRESSES UP TO 4096 BLOCKS (0000-7777). / UNITS 2 AND 3 ARE TYPICALLY ONLY 64 BLOCKS LONG (0000-0077), AND ARE PROVIDED / FOR TOTAL COMPATIBILITY WITH OS/8 USAGE ONLY. / SINCE ONLY TWO UNIT BITS ARE USED, UNITS 4-7 ARE ANOMALOUS AND RESPOND / IDENTICALLY TO ADDRESSING UNITS 0-3. / CALLING SEQUENCE. / THE CALLING SEQUENCE FOR THE NON-SYSTEM HANDLER IS THE STANDARD P?S/8 CALLING / SEQUENCE FOR 128 WORDS/BLOCK DEVICES. THE HANDLER IS RESPONSIBLE FOR ALL / PARAMETERS BEYOND THE USER-SUPPLIED ARGUMENTS: / CDF MYFLD /SET CALLER'S DATA FIELD / CIF HNDFLD /SET HANDLER'S INSTRUCTION FIELD / JMS I (FLPHND) /CALL THE HANDLER / PARAM /PARAMETER POINTER / ERRORRETURN /RETURNS HERE WITH STATUS IN AC IF BAD / GOODRETURN /RETURNS HERE WITH CLEAR AC IF I/O WAS OK / THE PARAMETER LIST MUST BE IN THE SAME FIELD AS THE CALLER: /PARAM, ADDRESS /12-BIT I/O TRANSFER ADDRESS / FUNCTION /FUNCTION WORD / BLOCK /STARTING BLOCK FOR TRANSFER / FUNCTION WORD BREAKDOWN: / BIT[0]: READ IF 0, WRITE IF 1 / BITS[1-5]: PAGE COUNT, 40 IF 0 / BITS[6-8] TRANSFER FIELD / BITS[9-11] LOGICAL UNIT / NOTE: BIT[9] IS IGNORED. / THE CALLING PROGRAM DETERMINES THE DISPOSITION OF I/O ERRORS. DETAILED ERROR / REPORTS CAN BE CONSTRUCTED BY PROGRAMS AWARE OF THE PARTICULARS OF THE MDC8 / STATUS REGISTER. PAGE /START ON A NEW PAGE HERE= . /WHERE WE ARE NOW / DEFINITIONS. DMA= 4000 /DMA INDICATOR XLIST OFF IFNDEF OFF IFNDEF ON IFNDEF FLPHND XLIST ON NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 REVISIO="A&77 /REVISION OF HANDLER / MDC8 IOT DEFINITIONS. IFNDEF DEVCODE /USES 670X BY DEFAULT DSEI= DEVCODE^10+6000 /INTERRUPT ENABLE/DISABLE PER AC[11] DSSF= DEVCODE^10+6001 /SKIP ON DONE FLAG DSCF= DEVCODE^10+6002 /CLEAR DONE FLAG DSHI= DEVCODE^10+6003 /LOAD HIGH-ORDER COMMAND ADDRESS DSGO= DEVCODE^10+6004 /LOAD LOW-ORDER COMMAND AND GO / = DEVCODE^10+6005 /UNUSED DSRS= DEVCODE^10+6006 /READ STATUS DSIM= DEVCODE^10+6007 /INTERFACE MAINTENANCE INSTRUCTION / DEVICE HANDLER HEADER BLOCK. *"F&177;*"L&177;*"P&177 /GROUP NAME *-1 /GROUP COUNT *"F&177;*"L&177;*"P&177 /DEVICE NAME *FLPHND&177 /ENTRY POINT *0000-1 /HIGHEST BLOCK *REVISION /REVISION OF HANDLER *HERE /RESTORE ORIGIN / ENTRY POINT FOR HANDLER. FLPHND, .-. /ACTUAL HANDLER ENTRY POINT CLA /CLEAN UP NOW TAD I FLPHND /GET ARGUMENT POINTER DCA FLPEXIT /STASH IT TAD I FLPEXIT /GET THE TRANSFER ADDRESS DCA TRADDR /STASH IT ISZ FLPEXIT /BUMP TO FUNCTION WORD TAD I FLPEXIT /GET FUNCTION WORD AND (70) /JUST FIELD BITS CLL RTR;RAR /MOVE DOWN DCA TRFLD /STORE (BANK AND) FIELD NL4000 /SET READ/WRITE MASK AND I FLPEXIT /GET READ/WRITE BIT CLL IAC RTL;RAL /10 IF READING, 12 IF WRITING DCA RWCOM /STASH COMMAND TAD I FLPEXIT /GET FUNCTION AGAIN RTR;RTR;RTR /MOVE DOWN PAGE COUNT AND (37) /JUST PAGE BITS SNA /SKIP IF ANY TAD (40) /ELSE USE MAXIMUM DCA SCTCNT /STASH SECTOR COUNT NL0001 /SET LOWER UNIT BIT MASK AND I FLPEXIT /GET THE BIT SZA CLA /SKIP IF OFF TAD (40) /ELSE SET ODD UNIT BIT TAD (100) /GET PAIR BIT DCA SECTHI /STORE HIGH-ORDER ADDRESS AND UNIT NL0002 /SET MIDDLE UNIT MASK AND I FLPEXIT /GET THE BIT CLL RTL;RAL /MOVE UP DCA SECTMD /STORE FOR NOW ISZ FLPEXIT /BUMP TO BLOCK TAD I FLPEXIT /GET THE BLOCK NUMBER DCA SECTLO /STORE AS LOW-ORDER ADDRESS TAD I FLPEXIT /GET IT AGAIN AND (7400) /JUST HIGH-ORDER BITS CLL RTL;RTL;RAL /MOVE DOWN TAD SECTMD /ADD ON UNIT OFFSET BIT DCA SECTMD /STORE AS MIDDLE ADDRESS RDF /GET CALLING FIELD TAD (CIF) /MAKE IT CIF RETURN FIELD DCA FLPEXIT /STORE IN-LINE ISZ FLPHND /BUMP PAST ARGUMENT POINTER JMS LOC8 /FIND OUT WHERE WE ARE LOADED LOC8, .-. /WILL BE OUR OWN PC DSRS /GET STATUS SPA CLA /SKIP IF CONTROLLER IS IDLE JMP .-2 /ELSE WE MIGHT AS WELL WAIT RIF /GET OUR FIELD CLL RTR;RAR /MOVE DOWN (BANK AND) FIELD DSHI /SEND HIGH-ORDER COMMAND ADDRESS DSRS /GET STATUS SMA CLA /SKIP IF BUSY JMP .-2 /ELSE KEEP WAITING DSCF /CLEAR DONE FLAG NOW TAD LOC8 /GET OUR PC TAD (TABLE-LOC8) /ADJUST TO COMMAND TABLE DSGO /GO START IT UP JMS WAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS WAIT /WAIT FOR COMMAND TO COMPLETE ISZ FLPHND /BUMP TO GOOD RETURN FLPEXIT,.-. /WILL BE CIF RETURN FIELD JMP I FLPHND /RETURN TO CALLER WAIT, .-. /WAIT ROUTINE DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA CLA /SKIP IF ANY ERRORS JMP I WAIT /ELSE RETURN DSRS /GET STATUS AGAIN JMP FLPEXIT /TAKE ERROR RETURN THERE / COMMAND TABLE. TABLE, 6!DMA /TABLE LENGTH PLUS DMA INDICATOR RWCOM, .-.&377 /0010 IF READING, 0012 IF WRITING SECTHI, .-.&377 /UNIT BITS AND HIGH-ORDER SECTOR ADDRESS SECTMD, .-.&377 /MIDDLE SECTOR ADDRESS SECTLO, .-.&377 /LOW-ORDER SECTOR ADDRESS SCTCNT, .-.&377 /SECTOR COUNTER (1-40) CONTRL, 0&377 /CONTROL WORD TRFLD, .-.&377 /BANK (0000) AND TRANSFER FIELD (0-7) TRADDR, .-. /TRANSFER ADDRESS PAGE $ /THAT'S ALL FOLK!