/PROGRAM FAILSA.PA /--------------------- / / / / FAILSAFE - A DISK / MAGTAPE UTILITY FOR USE WITH OS/8. / ---------------------------------------------------- / / PETER LEMKIN / NATIONAL INSTITUTES OF HEALTH / BETHESDA, MD 20014. / / / JAN 22, 1971 / REVISED DECEMBER 4, 1972 / / / / / /ABSTRACT /------------- /THERE IS A NEED IN A DISK BASED OPERATING SYSTEM TO DO PERIODIC /DUMPS OF THE DISK IN ORDER TO EASILY RECOVER FROM SYSTEM /CRASHES WHICH DESTROY THE DISK FILES. FAILSAFE IS A PDP8 UTILITY /PROGRAM WHICH CAN BE USED TO SAVE (OR RESTORE) ONE OR MORE RF08 DISK /PLATTERS ONTO (OR FROM) A TU20 MAGTAPE. THE FAILSAFE PROGRAM IS /CURRENTLY BEING USED WITH A PS/8 SYSTEM RUNNING ON A LINC8 /WITH A 4 PLATTER RF08 AND TC58/TU20 MAGTAPE, BUT IT SHOULD BE /COMPLETELY COMPATIBLE WITH OS/8. / / / / / / /**PAGE / /INTRODUCTION /----------- /FAILSAFE FOR THE PDP8 MOVES INFORMATION IN BULK /BETWEEN THE 9 TRACK TAPE DRIVE (TU20) AND ANY 1 OR ALL OF THE 4 /THE RF08 DISK PLATTERS. A HEADER IS ASSOCIATED WITH EACH /TAPE AND IS TERMINATED WITH A "!" ON INPUT.(ONLY 1 FAILSAFE/MAGTAPE) /1. CONTROL/D RESTARTS THE FAILSAFE PROGRAM. /2. RUBOUT DELETES THE LAST CHARACTER TYPED ON HEADER INPUT. / CONTROL/D RESTARTS IT. /3. WHEN IT IS FINISHED IT BOOTSTRAPS IN THE OS/8 SYSTEM FROM THE / DISK. / TO CHANGE THE BOOTSTRAP, CHANGE THE CODE IN SECTION F.7. / FAILSAFE WAS ASSEMBLED USING PAL8. / / / /REQUIRED HARDWARE: /----------------- / 8K OR GREATER PDP8. / TU20 MAGTAPE (SETUP FOR 9 TRACK TAPE , BUT COULD MODIFY / (WITH SLIGHT CHANGE FOR 7 TRACK TAPE.) / RF08 DISK 1 TO 4 PLATTERS OR DF32 (NEEDS TO BE MODIFIED / SLIGHTLY FOR DF32 OR RK8.). / / /STARTING ADDRESS: 200 /----------------------- / / / /CORE REQUIRED: <0,2377> FOR PROGRAM /--------------- / <10000,17777> FOR I/O BUFFER. / / / / /OPERATION: /------------ /1. UPON STARTING, IT TYPES OUT FAILSA.V04 AND THE DATE IT / WAS CREATED. /2. IT ALSO TYPES OUT "9 TAPE ONLINE?" AS A REMINDER TO PUT THE 9 / TRACK TAPE ON LINE. /3. IT THEN TYPES "SAVE OR RESTORE?Y/N". / "S" CARRIAGE RETURN WILL SET FAILSAFE UP TO SAVE THE DISK ONTO / THE MAGTAPE. I.E. DSK==>MAGTAPE. / "R" CARRIAGE RETURN WILL SET UP FAILSAFE TO RESTORE THE DISK / FROM THE MAGTAPE. I.E. DSK<==MAGTAPE. /4. IF YOU TYPED "S" , IT WILL THEN ASK YOU FOR A TAPE HEADER WHICH / MUST BE LESS THAN 4096 CHARACTERS. THIS MAY CONTAIN ANY CHARACTER / EXCEPT RUBOUT WHICH DELETES THE LAST CHARACTER TYPED, / CONTROL/D WHICH RESTARTS FAILSAFE, / OR "!" WHICH TERMINATES THE HEADER INPUT FROM THE TELETYPE. /5. IF YOU TYPED "R", IT WOULD HAVE READ THE HEADER ON THE MAGTAPE / WHICH WAS PUT THERE PREVIOUSLY AND TYPED IT ON THE TELETYPE. THIS / IS SO THAT YOU MAY MAKE NOTE OF THE INFORMATION WITH WHICH YOU / WILL RESTORE THE DISK. /6. IN EITHER CASE, IT WILL THEN ASK: / "DISK FIELD: 0/1/2/3/A:" / WHICH IS A REQUEST FOR THE PLATTER (0,1,2 OR 3 SAVE OR RESTORE / ONLY A SINGLE PLATTER, "A" SAVES ALL 4 PLATTERS) ON WHICH THE / FAILSAFE OPERATION WILL TAKE PLACE. /7. IF YOU HAD PREVIOUSLY TYPED "R", IT WILL ASK YOU "REALLY?Y/N:" / TO MAKE SURE THAT YOU REALLY WANT TO OVERWRITE THE DISK. IT WILL / ONLY GO AHEAD AND RESTORE THE DISK IF YOU ANSWER "Y". OTHERWISE IT /WILL RESTART FAILSAFE. /8. WHEN IT IS FINISHED, IT WILL REWIND THE MAGTAPE AND TYPE "DONE!". /9. IT THEN BOOTSTRAPS IN OS/8 FROM THE DISK. / /**PAGE / / / / / FIELD 0 PT08=0 /IF A PT08 CTY: IS BEING USED, THEN SET PT08=1, ELSE 0. IFNZRO PT08 < PKCC=6402 PKSF=6401 PKRB=6406 PTLS=6416 PTSF=6411 > / THE FOLLOWING DOES NOPS FOR NO PT08. IFZERO PT08 < PKCC=CLA PKSF=NOP PTLS=NOP PTSF=SKP PKRB=CLA > / / DSK0=0000 DSK1=0100 DSK2=0200 DSK3=0300 DSKALL=7777 DATFLD=10 BUFSIZ=0 /4096 MODULO 4096 DSKRD=4000+DATFLD DSKWRT=2000+DATFLD TAPRD=20 TAPWRT=40 /THE DISK INSTRUCTIONS DIML=6615 DISK=6623 DFSC=6622 DXAL=6643 DFSE=6621 / / / *100 MODE, 0 /SAVE=0000, RESTORE =7777 DSKFLD, 0 /THE FIELD OR FIELDS (A) TO BE SAVED OR RESTORED. *200 FSTART, CLA CDF 00 /F.0 SET UP FAILSAFE, REWIND THE TAPE / JMS MSG 215;212 "F;"A;"I;"L;"S;"A;".;"V;"0;"5;215;212 "1;"2;"/;"0;"4;"/;"7;"2;215;212 "9;" ;"T;"A;"P;"E;" ;"O;"N;" ;"L;"I;"N;"E;"?;215;212 "^;"D;" ;"T;"O;" ;"R;"E;"S;"T;"A;"R;"T;215;212 0000 / JMS MAGTAP; 0; 0; 10; 0 / / /F.1 ASK IF SAVE OR RESTORE THE DSK: S/R?: F1, JMS MSG 215;212 "S;"A;"V;"E;" ;"O;"R;" ;"R;"E;"S;"T;"O;"R;"E;" ;"?;"S;"/;"R;": 0000 / / / / /F.2 TEST IF IT IS S OR R? F2, JMS TTYI /GET CHAR. TAD (-"S SZA CLA JMP F2R /NO DCA MODE /YES, SET MODE = 0000==>SAVE JMS F2CR /GO TEST FOR CR JMS GHEDER /GET HEADER TO THE TAPE JMP F3 /CONTINUE NEXT STEP / / / / / F2R, TAD 10 TAD (-"R SZA CLA JMP F1 /NO TRY AGAIN CLA CMA /YES, SET MODE=7777 ==>RESTORE DSK DCA MODE JMS F2CR /GO TEST FOR CR JMS RHEDER /PRINT THE TAPE HEADER. JMP F3 /CONTINUE NEXT STEP. / / / / / F2CR, 0 JMS TTYI TAD (-215 SZA CLA JMP F1 /TRY AGAIN JMS MSG /PRINT THE LF 212 0000 JMP I F2CR /RETURN / / / / *400 /F.3 ASK WHICH PLATTER IS TO BE SAVED. F3, JMS MSG 215;212 "D;"I;"S;"K;" ;"P;"L;"A;"T;"T;"E;"R " ;" ;"0;"/;"1;"/;"2;"/;"3;"/;"A;": 0000 /F.4 INPUT THE FIELD F4, JMS TTYI TAD (-260 SZA CLA JMP F41 /NO TAD (DSK0 DCA DSKFLD JMP F4CR F41, TAD 10 TAD (-261 SZA CLA JMP F42 /NO TAD (DSK1 DCA DSKFLD JMP F4CR F42, TAD 10 TAD (-262 SZA CLA JMP F43 TAD (DSK2 DCA DSKFLD JMP F4CR F43, TAD 10 TAD (-263 SZA CLA JMP F4A TAD (DSK3 DCA DSKFLD JMP F4CR F4A, TAD 10 TAD (-"A SZA CLA JMP F3 /NO TRY AGAIN TAD (DSKALL DCA DSKFLD F4CR, JMS TTYI /GET CR TAD (-215 SZA CLA JMP F3 /NO RESTART JMS MSG /PRINT CR, LF 215;212 0000 JMP F5 /CONTINUE NEXT PAGE / / / *600 /F.5 TEST AND SET UP THE PLATTER COUNT IN "ALL". /IF DSKFLD=7777, SET ALL=4 ELSE =1. /IF DSKFLD=7777, SET DSKFLD=0000. / F5, CLA TAD DSKFLD SMA CLA JMP ONE DCA DSKFLD /ZERO IT IF 7777. TAD (-4 SKP ONE, TAD (-1 DCA ALL /# PLATTERS TO DO. / / / /F.6 DO THE I/O BUT TEST THE MODE FOR R/S FIRST. F6, CLA TAD (-100 /64 DOUBLE TRACKS/PLATTER. DCA TRACKS /SET TRACK COUNTER F6RENT, TAD MODE SZA CLA JMP F6R /RESTORE DSK F6S, CLA /SAVE THE DSK TAD TRACKS /SET HI DSK ADDRESS. TAD (100 /MAKE COUNT O ==>77. TAD DSKFLD DCA HIDRD /SAVE IN DSK CALL /DO THE DSK READ NOW. JMS DISKIO DSKRD /READ INTO FIELD 1. BUFSIZ 0 /CORE ADDRESS HIDRD, 0 /HI DSK ADDRESS 0 /LOW DSK ADDRESS JMP F6S /ERROR TRY AGAIN. /THE READ FROM DSK WAS OK, NOW PUT ON TAPE. JMS MAGTAP /WRITE FIELD 1 ONTO TAPE. BUFSIZ 0 40 /WRITE DATFLD /CHECK FOR A WRITE ERROR. JMS TNTX /WRITE ERROR? 1 SKP /YES, TRY AGAIN JMP F6D /NO, GET NEXT BLOCK. /BACKUP THE TAPE TO TRY AGAIN. JMS MAGTAP 1 /BACKUP 1 RECORD 0 70 /BACKSPACE DATFLD /CHECK IT JMS MAGTAP BUFSIZ 0 30 /READ-COMPARE DATFLD /SEE IF READ-COMPARE ERROR JMS TNTX 2 JMP F6 /YES, TRY AGAIN. JMP F6D /NO, SEE IF DONE. / / / / /RESTORE THE DSK F6R, CLA TAD TRACKS TAD (100 /COUNT TRACKS 0 TO 77. TAD DSKFLD /ADDRESS THE PROPER PLATTER DCA HIDWT /PUT IN DSK CALL /READ THE 9 TRACK TAPE. JMS MAGTAP BUFSIZ 0 20 DATFLD /SEE IF READ ERROR? JMS TNTX 1 SKP /YES, GO TRY AGAIN. JMP F6RR /NO, CONTINUE /YES, BACKSPACE 1 RECORD AND TRY AGAIN. JMS MAGTAP 1 0 70 0 JMP F6R /TRY AGAIN. / /IT WAS OK, WRITE THE DSK. F6RR, CLA JMS DISKIO DSKWRT BUFSIZ 0 /CORE ADDRSS HIDWT, 0 /HI DSK ADDRESS 0 JMP F6RR /BAD WRITE , TRY AGAIN. JMP F6D /DONE, GET NEXT BLOCK. / / / /SEE IF DONE. F6D, ISZ TRACKS /DID ALL THE TRACKS? JMP F6RENT /NO, DO THE NEXT TRACK FOR THIS PLATTER. /SET UP NEXT PLATTER CLA TAD (100 /DSKFLD <== DSKFLD + 100 TAD DSKFLD DCA DSKFLD / /TEST IF FINISHED ALL 4 DSKS ON A "ALL". ISZ ALL /# DSKS TO DO. JMP F6 /NO, BACK FOR THE NEXT PLATTER JMP F7 /YES, DONE/// / / / /CONSTANTS TRACKS, 0 ALL, 0 / / / *1000 /F.7 EPILOGUE /WRITE EOF IF A SAVE F7, CLA TAD MODE SZA CLA JMP F7NOT JMS MAGTAP 0 0 50 /WRITE EOF ON 9 TAPE DATFLD /REWIND THE TAPE F7NOT, JMS MAGTAP 0 0 10 DATFLD JMS MSG 215;212 "D;"O;"N;"E;"!;215;212 0000 /BOOTSTRAP IN THE DISK MONITOR. F7Q, CLA PKCC KCC /CLEAR THE TTY FLAG. JMS MSG 215;212 "P;"S;"8;" ;"M;"O;"N;"I;"T;"O;"R 0000 / DO THE RF08 BOOTSTRAP... CDF CIF 00 DIML /CLEAR EXTENDED MEMORY BITS DXAL /CLEAR EXTENDED DISK ADDRESS BITS TAD (7600 DCA I (7750 TAD (6603 DCA I (7751 TAD (6622 DCA I (7752 TAD (5352 DCA I (7753 TAD (5752 DCA I (7754 JMP 7750 /GO START THE BOOTSTRAP / / / / / / / / / / /**PAGE / *1200 /GET THE HEADER FROM THE TTY. /SUBROUTINE GHEDER /GET THE TAPE HEADER INTO THE 1ST RECORD OF TAPE. /TERMINATE WITH A "!". / GHEDER, 0 JMS MAGTAP; 0; 0; 50; 0 /WRITE AN EOF IN FRONT OF THE TAPE. JMS MSG 215;212 "E;"N;"T;"E;"R;" ;"H;"E;"A;"D;"E;"R;215;212 "E;"N;"D;" ;"I;"T;" ;"W;"I;"T;"H;" ;"";"!;"";215;212 0000 CLA CMA /INITIAL THE BUFFER POINTER. DCA 11 /PDL GH1, JMS TTYI /GET A CHAR DCA GHC /IS IT RUBOUT, (DELETE LAST CHARACTER.) TAD GHC TAD (-377 /RUBOUT SZA CLA JMP GH1B /NO /YES, FIX UP POINTER TAD (-1 TAD 11 DCA 11 TAD 11 DCA 13 /TEMP SAVE TAD 11 /SET UP ZERO POINTER DCA 14 /ZERO TEMP POINTER. TAD (-1 TAD 12 DCA 12 CDF DATFLD TAD I 13 /GET IT DCA PNTIT CLA DCA I 14 /ZERO IT CDF 00 JMS MSG "( PNTIT, 0 /PRINT CHARACTER ") 0 JMP GH1 /FINISHED BUFOUT, GET NEXT CHARACTER. GH1B, TAD GHC TAD (-"! /DONE? SNA CLA JMP GH2 /YES TAD GHC CDF DATFLD DCA I 11 /PUSH IT DCA I 12 /FOLLOW BY A ZERO CDF 00 JMP GH1 /CONTINUE /DONE, LEAVE IT GH2, CDF DATFLD DCA I 11 DCA I 12 CDF 00 GH3, JMS MAGTAP BUFSIZ 0 40 /WRITE 4096 CHARACTERS. DATFLD JMP I GHEDER /RETURN ALL DONE. GHC, 0 /DUMY CHAR. / / / / *1400 /SUBROUTINE RHEDER /GET THE HEADER AND PRINT IT. RHEDER, 0 JMS MAGTAP; 1; 0; 60; 0 /READ PAST THE EOF IN FRONT OF THE TAPE. JMS MAGTAP BUFSIZ 0 20 /READ 4096 CHARACTERS. DATFLD /SET POINTERS CLA CMA DCA 11 RH1, CLA CDF DATFLD TAD I 11 /GET THE CHAR CDF 00 SNA /DONE? =0000 JMP RH2 /YES, DONE. TLS /NO PRINT IT PTSF /ALSO ON PT08 TSF JMP .-1 TCF KSF /STOP IT? JMP RH1 /NO /MAKE SURE? RH2, KCC JMS MSG 215;212 "R;"E;"A;"L;"L;"Y;"?;"Y;"/;"N;": 0000 JMS TTYI TAD (-"Y SZA CLA JMP F1 /NO RESTART FAILSAFE JMP I RHEDER /ALL-OK, GO AHDEAD AND DO IT. / *2000 /SUBROUTINE MAGTAP /THE 9TRACK TAPE I/O SUBROUTINE FOR THE /TC58 AND TU20A ON A LINC8 WAS ORIGINALLY /WRITTEN BY HOWARD SHAPIRO AND MODIFIED BY /P. LEMKIN. /THE SUBROUTINE ENABLES THE USER TO READ, WRITEM /READ-COMPARE, SPACE BACKWARD OR FORWARD, REWIND , OR /WRITE END OF FILE. /THE CALLING SEQUENCE IS: / JMS MAGTAP / N1 /# OF WORDS IN READ/WRITE, # RECORDS IN SPACING. / N2 /STARTING CORE ADDRESS FOR READ/WRITE / N3 /COMMAND....SEE TABLE BELOW / N4 /DATA FIELD FOR READ/WRITE 00, 10, OR 20. / NORMAL RETURN / /::::::COMMAND TABLE:::::: / NOP 00 / REWIND 10 / READ 20 / READ-COMPARE 30 / WRITE 40 / WRITE END FILE 50 / SPACE FORWARD 60 / SPACE BACKWARD 70 / / /NOTE: ALL I/O IS DONE ON UNIT 0, IN 9TRACK MODE /(I.E. NOT IMAGE MODE). WITH ODD PARITY AND 800 BPI DENSITY. / / THERE ARE 5 ROUTINES OF INTERREST: /1. SUBROUTINE MAGTAP IS USED TO DO I/O. /2. SUBROUTINE TNTX IS USED TO TEST THE TAPE STATUS / AFTER IT IS FINISHMD. /3. SUBROUTINE TINT IS USED TO SERVICE THE TAPE UNIT WHEN IT IS / FINISHED. /4. SUBROUTINE WTRDY IS USED TO WAIT UNTIL THE / TAPE UNIT IS READY. /5. SUBROUTINE GOTAPE IS USED BY MAGTAP TO EXECUTE THE TAPE COMMAND. / /& MTCR=6711 MTSF=6701 MTTR=6721 MTAF=6712 MTLC=6716 MTGO=6722 MTRS=6706 / MAGTAP, 0 /9 TRACK TAPE ROUTINE CLA RDF TAD LCIF DCA LLX JMS WTRDY /WAIT READY CLA /TRANSMIT N1 TAD I MAGTAP CIA DCA I WCLOC ISZ MAGTAP STA /TRANSMITT N2 TAD I MAGTAP DCA I CALOC ISZ MAGTAP TAD I MAGTAP /FORM COMMANND WITH N3 TAD CCMD /GET MASK DCA TN1 /SAVE COMMAND ISZ MAGTAP TAD I MAGTAP DCA TN2 CDF 00 JMS GOTAPE /EXECUTE TN1, 0 TN2, 0 /DATA FIELD ARG FOR GOTAPE ISZ MAGTAP JMS WTRDY /WAIT FOR TAPE IOF LLX, CIF 00 JMP I MAGTAP /RETURN CCMD, 0607 /COMMAND MASK LCIF, CIF 00 / / / / /SUBROUTINE WTRDY /IS USED TO WAIT UNTIL THE MAGTAP IS READY. /IF IT IS LONGER THAN A FEW SECONDS , IT TYPES A MESSAGE /TO THE OPERATOR TELLING HIM THAT 9TRACK IS TAKING TOO LONG. /CALLING SEQUENCE: / JMS WTRDY / NORMAL RETURN /TAPE UNIT READY / ****ERROR RETURN TYPES MESSAGE AND GOES TO ORVIL**** /& WTRDY, 0 /WAIT TAPE READY CLA RDF TAD LCIF DCA WT1 CDF 00 /WAIT AND TEST IF EXCEED TIME LIMIT. CLA TAD (-100 DCA WTRA /MAIN WAIT LOOP WTLOOP, ISZ WTRA SKP NOP /ERROR NORMALLY FOR 9TRACK TAPE. WTLP2, ISZ WTRB SKP JMP WTLOOP /BACK TO BIG LOOP MTCR /IS THE CONTROL READY? JMP WTLP2 /NO MTTR /IS THE DRIVE READY? JMP WTLP2 /NO /YES TO BOTH****** WT1, CIF 00 JMP I WTRDY /RETURN WTRA, 0 WTRB, 0 / / / / /SUBROUTINE GOTAPE /IS CALLED BY MAGTAP TO EXECUTE THE TAPE COMMAND. /CALLING SEQUENCE: / JMS GOTAPE / COMMAND / DATA FIELD / NORMAL RETURN /& GOTAPE, 0 /PERFORM TAPE OPERATION MTAF /CLEAR TAPE CONTROL REGS TAD I GOTAPE /GET COMMAND MTLC /LOAD COMMAND CLA ISZ GOTAPE CLA TAD I GOTAPE /GET DATA FIELD MTGO /GO ALREADY MTSF JMP .-1 /WAIT THERE JMS TINT /FIX FLAGS ISZ GOTAPE JMP I GOTAPE /RETURN / / / /SUBROUTINE TINT /IS USED TO SERVICE THE MAGTAPE. /IT SAVES THE STATUS OF THE MAGTAP AT THE TIME OF /COMPLETION AND CLEARS THE COMMAND AND INTERRUPT REGISTERS. /CALLING SEQUENCE: / JMS TINT / NORMAL RETURN / /& TINT, 0 /TAPE SERVICE ROUTINE CALLED CLA CLL TPSRVC, MTRS /GET TAPE STATUS DCA TSTAT /STATUSS TO TSTAT 6724 /GET COMMAND REG DCA TCOM /COMMAND TO TCOM MTAF /CLEAR STATUS AND COMMAND REGS JMP I TINT /RETURN TSTAT, 0 /HOLDS LAST STATUS TCOM, 0 /HOLDS LAST COMMAND WCLOC, 7752 /WORD COUNT LOCATION CALOC, 7753 /CURRENT ADDRESS LOCATION / /...................................................... / / /SUBROUTINE TNTX /SENSE TAPE CONDITION - THIS ROUTINE IS CALLED BY THE USER /TO DETECT ERRORS, END FILE, BEGINNING OR END OF TAPE. IN /ORDER FOR IT TO WORK PROPERLY,AN INTERRUPT MUST HAVE OC- /CURRED AND HAVE BEEN PROCESSED BY TINT. HOWEVER, IF TNTX /IS CALLED WHILE THE TAPE IS STIILL BUSY, IT WILL WAIT FOR /TAPE TO BECOME READY. /CALLING SEQUENCE: / JMS TNTX / N4 / CONTINUE HERE IF CONDITION HOLDS / CONTINUE HEEE IF CONDITION DOES NOT HOLD / / N4 SPECIFIES THE CONDITION SOUGHT AS FOLLOWS: / N4 CONDITION / --- ----------- / 0 FLATNESS OF EARTH / 1 READ OR WRITE ERROR / 2 READ-COMPARE ERROR / 3 END FILE / 4 BEGINNING OF TAPE / 5 END OF TAPE / /& TNTX, 0 CLA RDF TAD LCIF DCA TN3 /SAVE RETURN FLD JMS WTRDY /WAIT TAPE READY CLA TAD I TNTX /FORM STATUS MASK ADDRESS CDF 00 TAD TN4 DCA TN5 ISZ TNTX TAD TSTAT /GET STATUS AND I TN5 /AND WITH MASK SNA /SKIP IF CONDITION HOLDS ISZ TNTX /FIX RETURN IF CONDITION DOES NOT HOLD TN3, CIF 00 JMP I TNTX /RETURN TN4, TCOND /MASK LIST BASE ADDR. TN5, 0 /A OF MASK USED TCOND, 0 /MASKS FOR SENSE TAPE CONDIYION 1616 /READ OR WRITE ERROR 1636 /READ-COMPARE ERROR 0100 /EOF 1000 /BOT 0040 /EOT /HERE ENDETH THE 9 TRACK TAPE PACKAGE / / /............................................ / *2200 TTYI, 0 GOTOTT, KSF JMP GOTOPT KRB JMP DOITNOW GOTOPT, PKSF JMP GOTOTT PKRB AND (177 TAD (200 /FORCE ON THE PARITY BIT... DOITNOW, TLS /PRINT IT PTLS /ALSO ON PT08 TSF JMP .-1 /TEST IF CONTROL/D, IF SO RESTART DCA 10 TAD 10 TAD (-204 /CONTROL/D SNA CLA JMP FSTART /YRES RESTART TAD 10 /NO CONTINUE JMP I TTYI /RETURN / / MSG, 0 CLA TAD I MSG SNA JMP MSGEX TLS PTLS TSF JMP .-1 ISZ MSG JMP MSG+1 MSGEX, ISZ MSG JMP I MSG /EXIT / / / / / /SUBROUTINE DISKIO /USED TO DO DISK INPUT/OUTPUT LIKE MAGTAP /THIS SUBROUTINE WAS TAKEN FROM THE EXAMPLE IN THE /1970 DEC SMALL COMPUTER HANDBOOK "INTRODUCTION /TO PROGRAMMING". /CALLING SEQUENCE: / JMS DISKIO / FUNCT, 0 /X0=READ,X1=WRITE,(X=0=7 MEMORY FIELD). / WDCT, 0 /+WORD COUNT / CORE, 0 /CORE LOCATION / DSKHI, 0 /HIGH ORDER 8 BITS / DSKLO, 0 /LOW ORDER 12 BITS / JMP ERROR /ERROR RETURN AC=ERROR CONDITION / NORMAL RETURN /AC=0000. /& / DISKIO, 0 CLA CLL TAD I DISKIO DIML /LOAD EXTENDED MEMORY BITS CLA TAD I DISKIO SMA CLA STL RTL /+2 TAD (3 TAD (6600 DCA RORW /6603=READ, 6605=WRITE ISZ DISKIO TAD I DISKIO /GET THE WORD COUNT CIA DCA I (7750 /SAVE -WORD COUNT ISZ DISKIO TAD I DISKIO /GET THE STARTING ADDRESS. DCA I (7751 /SAVE CURRENT ADDRESS ISZ DISKIO TAD I DISKIO /GET LOWER DSK ADDRESS. ISZ DISKIO DXAL /LOAD HI ORDER 8 BITS OF ADDDRESS CLA TAD I DISKIO RORW, 0 /READ OR WRITE DFSC /DONE? JMP .-1 DFSE /YES , SKIP ON ERROR ISZ DISKIO /SET UP NORMAL RETURN ISZ DISKIO /BUMP EXTRA PLACE. JMP I DISKIO /RETURN / / / $