/OS/8 HANDLER TO EMULATE SYKES 7250 FLOPPY DISK ON LSI-11 / /ADAPTED FROM AUXB.PA, SYKES # 9995B0210B JULY 16, 1975 / /RON LARKIN, BOB SCHOR JULY, 1978 / / /USED IN CONJUNCTION WITH LSI-11 RUNNING "SYKES", WHICH CAUSES PDP-11 /TO APPEAR TO BE A SYKES DISK, AND TO WRITE SYKES-FORMAT FLOPPY FILES / /TRANSFER IS VIA PARALLEL INTERFACE BETWEEN PDP-8L AND LSI-11 IN SMITH HALL / /INTERFACE CHARACTERISTICS -- / / SKP11 = 6161 SKIP IF PDP-8 FLAG IS HIGH / PUT11 = 6162 SEND AC TO PDP-11, LOWERING PDP-8 FLAG / GET11 = 6164 RECEIVE FROM PDP-11 INTO AC, LOWERING FLAG / /THE INTERFACE HAS ONLY ONE FLAG FOR EACH DEVICE, SO ASYNCHRONOUS I/O IS /NOT POSSIBLE. HOWEVER, SYNCHRONOUS I/O CAN BE ACCOMPLISHED, USING THE /CONCEPT OF "MASTER" AND "SLAVE" DEVICE. / / MASTER WAITS FOR TRANSFER FROM SLAVE. / WHEN FLAG IS RAISED, MEANS SLAVE HAS DATA TO SEND / SLAVE TRANSFERS DATA TO MASTER. / WHEN FLAG IS RAISED, MEANS MASTER HAS ACCEPTED OFFERING / /MASTER CAN "VOLUNTARILY" BECOME SLAVE BY WAITING FOR FLAG, BUT NOT /ACCEPTING DATA, BUT IMMEDIATELY SWITCHING TO SLAVE STATUS AND DOING /FIRST TRANSFER. /SLAVE CAN "DEMAND" TO BE MASTER BY SENDING ANY DATA, THEN WAITING FOR /FLAG WHICH SIGNALS THAT NEWLY-DEMOTED "SLAVE" HAS DATA TO SEND. / /NEEDLESS TO SAY, BOTH MASTER AND SLAVE HAVE TO BE SYNCHRONIZED-- /THE MASTER MUST KNOW WHEN TO IGNORE THE "DEMAND" FROM THE SLAVE WHICH /SIGNALS THE CHANGE OF STATUS / /IF THE PDP-8 "START" SWITCH IS PRESSED, ITS FLAG GETS LOWERED AND THE /PDP-11 FLAG GETS RAISED. HENCE THE DEFAULT INITIALIZATION IS PDP-8 /MASTER, PDP-11 SLAVE. MOST OF THE TRANSFERS ARE DONE IN THE OPPOSITE /SENSE, WITH THE PDP-11 AS MASTER, SO THAT AFTER BOTH PROGRAMS EXIT, THE /PDP-11 REMAINS MASTER. THE PDP-11 PROGRAM "SYKES" EXPECTS THAT THE PDP-8 /IS MASTER WHEN IT IS FIRST CALLED, AND DEMANDS MASTER STATUS FOR ITSELF. /SHOULD IT ALREADY BE MASTER, THIS WILL RESULT IN ITS IGNORING THE FIRST /COMMAND FROM THE PDP-8, WHICH IS ALWAYS A "RESET", WHICH MAY BE SAFELY /IGNORED THE FIRST TIME. / / /SYKES DISK CONVENTIONS -- / /PDP-8 WORD OF 12 BITS (MSB 0, LSB 11) IS STORED AS A PAIR OF BYTES / BYTE 1 BITS 0 1 2 3 4 5 6 7 / BYTE 2 BITS 8 9 10 11 ? ? ? ? / /COMMANDS -- / 7600 RESET, CLEAR OUT INTERFACE (RESETS SOFTWARE POINTERS) / 4XX TRACK/SECTOR, READ/WRITE COMMAND PAIR (ALWAYS SENT IN PAIRS) / 0 SEND/RECEIVE BYTE-PAIR / 603 TERMINATE I/O, OUPUTTING PARTIAL BUFFER ON WRITE / /PROTOCOL -- / /HANDLER FIRST ISSUES "RESET", THEN SENDS TWO WORDS OF TRACK/SECTOR INFORMATION / 4XX TRACK NUMBER = XX & 177, FROM 0-76 (DECIMAL) / 4YY SECTOR NUMBER = YY & 37, FROM 1-26 (DECIMAL) / READ/WRITE = YY & 40 (0 = READ, 40 = WRITE) /FOR EVERY PDP-8 WORD OF DATA TO BE TRANSFERRED TO OR FROM SYKES (PDP-11), /PDP-8 INITIATES A REQUEST BY SENDING A NULL (0) WORD. TWO BYTES ARE THEN /TRANSFERRED TO OR FROM (DETERMINED BY THE READ/WRITE BIT) THE DEVICE. /BEFORE EXITING FROM THE HANDLER, A "TERMINATE" IS SENT. / / /THIS HANDLER IS INTERFACED TO OS/8 BY "BUILD". ITS STRUCTURE CONFORMS TO THE /DESCRIPTION IN THE OS/8 HANDBOOK, CHAPTER 2, "BUILD" SECTION. / /IN ADDITION TO USING BUILD TO ADD THE HANDLER TO THE SYSTEM, WE MUST TELL PIP /HOW MANY BLOCKS ARE ON THE DEVICE, AS FOLLOWS: / .GET SYS PIP / .ODT / 13655/XXXX 7046 /WHERE 55 (136NN) IS THE DEVICE TYPE, 7046 = -476 (DECIMAL) BLOCKS / / / /INTERFACE IOT DEFINITIONS / SKP11= 6161 /SKIP ON PDP-8 FLAG HIGH PUT11= 6162 /SEND AC TO PDP-11 GET11= 6164 /READ FROM PDP-11 INTO AC / /MISCELLANEOUS DEFINITIONS / FIXMRI IDX = ISZ /INDEX INSTRUCTION, COUNTS WITHOUT SKIP FIXMRI EXIT = JMP I 0 /SUBROUTINE EXIT / / / EJECT / /HEADER BLOCK FOR HANDLER / / -N N = NUMBER OF HANDLERS IN FILE / DEVICE XXXX TWO-WORD GROUP NAME (6-BIT ASCII) / DEVICE YYYY TWO-WORD DEVICE NAME (6-BIT ASCII) / DCB DEVICE CONTROL BLOCK / BIT 0 = 1 FILE-STRUCTURED / BITS 3-8 = 55 DEVICE TYPE / ENTRY OFFSET OFFSET OF HANDLER ENTRY FROM START OF PAGE / 0 LAST TWO WORDS ALWAYS ZERO / 0 / *0 / -1 /1 HANDLER DEVICE SY11 /GROUP NAME DEVICE DX1 /DEVICE NAME 4550 /FILE-STRUCTURED, DEVICE 55 SYKES-200 /ENTRY OFFSET 0 /ALWAYS ZER0 0 /ALWAYS ZERO / / /MAIN BODY OF HANDLER / /HANDLERS ARE CALLED AS FOLLOWS -- / JMS I ENTRY / FCNTRL /FUNCTION CONTROL WORD / /BIT 0 = 0 FOR INPUT, 1 FOR OUTPUT / /BITS 1-5 = NUMBER OF 128-WORD RECORDS TO TRANSFER / /BITS 6-8 = MEMORY FIELD FOR TRANSFER / BUFFER /BUFFER ADDRESS / BLOCK /STARTING BLOCK NUMBER / JMP ERR /ERROR RETURN LOCATION / (...) /NORMAL RETURN, I/O COMPLETE / *200 / /ON ENTRY, GET PARAMETERS FROM USER / SYKES, 0 /ENTRY POINT CLA CLL RDF /BUILD RETURN FIELD INSTRUCTION TAD (CIF CDF DCA RTNCIF /SAVE FOR RETURN TAD K7600 /ISSUE "RESET" TO DEVICE JMS TO11 /SEND TO PDP-11 TAD I SYKES /GET FUNCTION WORD DCA TEMP /SAVE IT IDX SYKES TAD I SYKES /GET BUFFER ADDRESS DCA BUFPTR /SAVE POINTER IDX SYKES / /OS/8 BLOCK NUMBERS ARE CONVERTED INTO SYKES TRACK/SECTOR NUMBERS AS FOLLOWS -- / /EACH OS/8 BLOCK IS 256 WORDS LONG, EACH SYKES SECTOR IS 128 BYTES LONG /SINCE EACH PDP-8 WORD TAKES TWO BYTES, THERE ARE 4 SECTORS PER OS/8 BLOCK /BLOCK NUMBERS START FROM 0, TRACK AND SECTOR NUMBERS FROM 1 /EACH TRACK HAS 32 (26 DECIMAL) SECTORS /THUS / TRACK = (BLOCK * 4)/32 + 1 / SECTOR = MOD (BLOCK * 4, 32) + 1 / /DIVISION WILL BE ACCOMPLISHED BY REPEATED SUBTRACTION / DCA TRACK /INITIALIZE QUOTIENT TAD I SYKES /GET BLOCK COUNT CLL RTL /* 4 IDX TRACK /INCREMENT QUOTIENT FIRST TAD (-32 /SUBTRACT DIVISOR SMA /CHECK FOR NEGATIVE JMP .-3 /LOOP TAD (400+32+1 /MAKE SECTOR COMMAND DCA SECTOR IDX SYKES / /NOTE THAT TRACK AND SECTOR NOW CONFORM TO THE ABOVE CONVENTION, WITH THE /ADDITION OF 400 TO SECTOR TO MAKE IT THE APPROPRIATE COMMAND / /NOW PROCESS FUNCTION WORD / TAD TEMP /RETRIEVE FUNCTION RAL /* 2 TRANSFORMS IT TO WORD COUNT, R/W BIT TO LINK AND K7600 /SAVE ONLY WORD COUNT BITS SZA /SKIP IF WC = 0, FULL-FIELD READ CIA /MAKE - (WORD COUNT) DCA WDCNT /AND SAVE TAD TEMP /RETRIEVE FUNCTION AND K70 /SAVE FIELD BITS TAD (CDF /BUILD CDF TO DATA BUFFER DCA TEMP /SAVE AND EXECUTE TEMP, CDF /SET BUFFER FIELD / /AT THIS POINT, SET-UP IS FINISHED /HANDLER RETURN (NOW) IS TO ERROR POINT / /START ACTUAL I/O BY ISSUING TRACK AND SECTOR COMMANDS / TAD TRACK /GET TRACK TAD (400 /MAKE COMMAND JMS TO11 /SEND TO DEVICE SZL /LINK STILL HAS R/W BIT, 0 = READ, 1 = WRITE TAD K40 /MAKE WRITE COMMAND IF LINK SET TAD SECTOR /BUILD SECTOR COMMAND JMS TO11 /SEND TO DEVICE / /DISPATCH TO READ OR WRITE BLOCKS / SNL CLA /SKIP TO WRITE JMP READ /GO READ / /COME HERE TO WRITE BLOCKS ON DEVICE /TRANSFERS BYTE-PAIRS TO DEVICE / WRITE, TAD I BUFPTR /GET WORD FROM BUFFER JMS BYTEIT /BREAK UP INTO BYTES AND SEND BYTE TO DEVICE RAR /BRING LINK, BIT 8 OF PDP-8 WORD, INTO AC JMS BYTEIT /SEND SECOND BYTE IDX BUFPTR /BUMP BUFFER POINTER K40, 40 /CONSTANT, DUMMY "AND" CLA /CLEARS ACC FOR NEXT TIME ISZ WDCNT /COUNT WORDS JMP WRITE /AND LOOP / /COME HERE TO EXIT FROM HANDLER / SQUIT, TAD (603 /ISSUE TERMINATE JMS TO11 /SEND TO DEVICE IDX SYKES /BUMP PAST ERROR RETURN K177, 177 /CONSTANT, DUMMY "AND" RTNCIF, HLT /SET INSTRUCTION FIELD EXIT SYKES /AND RETURN / / /SUBROUTINE TO PICK APART WORD FROM PDP-8 INTO BYTES /ROTATES 4 TO RIGHT, SENDS LOWER 8 BITS / BYTEIT, 0 RTR /ROTATE 4 RIGHT RTR DCA TEMP /SAVE TEMPORARILY TAD TEMP AND (377 /KEEP ONE BYTE'S WORTH JMS TO11 /SEND TO DEVICE TAD TEMP /RESTORE AC EXIT BYTEIT /AND EXIT, WITH LINK AND AC ROTATED 4 TIMES / / /COME HERE TO READ BLOCKS FROM DEVICE / /PROTOCOL IS TO SEND NULL BYTE TO REQUEST DATA, DEMAND "MASTER" STATUS, /ACCEPT BYTE-PAIR, THEN BECOME "SLAVE" AGAIN / READ, JMS TO11 /SEND NULL BYTE TO REQUEST DATA, STATUS SWITCH PUT11 /DEMAND MASTER STATUS JMS FROM11 /GET A BYTE AND (377 /KEEP 8 BITS CLL RTL /MOVE THEM UP RTL /TO TOP 8 PDP-8 BITS DCA TEMP /AND SAVE JMS FROM11 /GET SECOND BYTE RTR /SHOVE DOWN INTO LOWER 4 BITS RTR AND (17 /ONLY KEEP LOWER 4 BITS TAD TEMP /COMBINE WITH UPPER 8 DCA I BUFPTR /AND SAVE IDX BUFPTR /BUMP BUFFER POINTER K70, 70 /CONSTANT, DUMMY "AND" JMS WAIT11 /NOW WAIT FOR 11 TO BECOME MASTER AGAIN ISZ WDCNT /COUNT WORDS JMP READ /AND LOOP JMP SQUIT /TERMINATE AT END OF BLOCK / / /SUBROUTINES FOR PDP-11 COMMUNICATION / /TO11 SENDS AC TO 11, WAITS, RETURNS WITH AC CLEAR, LINK UNCHANGED / TO11, 0 PUT11 /SEND AC TO 11 JMS WAIT11 /WAIT FOR 11 TO ACCEPT K7600, 7600 /CLEAR, ALSO USEFUL CONSTANT EXIT TO11 /RETURN, AC CLEAR, LINK UNCHANGED / /FROM11 WAITS FOR 11, THEN ACCEPTS A WORD / FROM11, 0 JMS WAIT11 /WAIT FOR 11 TO SEND GET11 /GET THE WORD EXIT FROM11 /RETURN WITH WORD IN AC / /WAIT11 WAITS FOR 11 FLAG TO COME UP /IF PDP-11 IS MASTER, MEANS 11 HAS ACCEPTED PDP-8'S OFFERING /IF PDP-8 IS MASTER, MEANS 11 HAS OFFERING FOR PDP-8 TO ACCEPT / /ROUTINE MAINTAINS AC AND LINK, WHILE CHECKING KEYBOARD FOR CTRL C /IF TROUBLE RECURS, THE KEYBOARD ROUTINE CAN BE ELIMINATED BY /REPLACING "JMP .+2" AT WAIT11+2 WITH "JMP .-1" / WAIT11, 0 SKP11 /CHECK FLAG JMP .+2 /SKIP IF NOT READY, CHECK KBD EXIT WAIT11 /EXIT WHEN 11 FLAG COMES UP DCA TEMPAC /SAVE AC DURING KBD CHECK KRB /READ KBD AND K177 /KEEP ASCII TAD (200-3 /CHECK FOR 3 = CTRL C AND K177 /MASK OFF CARRIES SNA CLA /SKIP IF NOT CTRL C JMP .+3 /JMP IF CTRL C TAD TEMPAC /RESTORE AC JMP WAIT11+1 /CONTINUE WAITING / /COME HERE ON CTRL C, RETURN TO OS/8 / CDF CIF 0 /GO TO OS/8 EXIT K7600 /NOW!!! / / TRACK, 1 /TRACK SECTOR, 0 /SECTOR BUFPTR, 0 /BUFFER POINTER WDCNT, 0 /WORD COUNT TEMPAC, 0 /TEMPORARILY HOLDS AC DURIND KBD READ / / / $$$