ASMB,R,Q,C * NAME: DBKUP * SOURCE: 92067-18340 * RELOC: 92067-16340 * PGMR: S.P.K.,J.S.W. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM DBKUP,3,99 92067-16340 REV.2013 800109 * OFF-LINE DISC BACKUP UTILITY EXT $LIBR,$LIBX,EXEC,COR.A SUP A EQU 0 B EQU 1 * * KB BSS 8194 TRACK BUFFER * NSUB NOP # OF SUBCHANNELS ON 7905 DISC UNIT ISIZE NOP SIZE OF REC READ FROM DISC JSIZE NOP SIZE OF RECORD READ FROM OR WRITTEN TO MT INCR NOP INCREMENTS FOR SECTOR COUNT M24K NOP VRFLG NOP DOSDF NOP TEMP NOP TEMP1 NOP TEMP2 NOP SUB# NOP TRACK NOP TRCK1 NOP UN#IT NOP SUNIT NOP DUNIT NOP SVTPN NOP HEADR BSS 140 AHDR DEF HEADR TAPEN EQU HEADR+36 SVTYP EQU HEADR+38 SYSTP EQU HEADR+40 IREC EQU HEADR+41 TRKMP EQU HEADR+42 AMAP1 DEF HEADR+42 AMAP2 DEF HEADR+43 ATB31 NOP ATB32 NOP SUB1# EQU KB JB EQU KB+2 C1 EQU JB C2 EQU JB+1 C3 EQU JB+2 C4 EQU JB+3 C5 EQU JB+4 C6 EQU JB+6 C7 EQU JB+8 C8 EQU JB+9 LB EQU KB+2048 MB EQU LB+2048 NB EQU MB+2048 * * * AKB DEF KB AJB DEF JB ALB DEF LB AMB DEF MB ANB DEF NB LABEL BSS 128 LABEL BUFFER FOR DOS SUBCHNLS ALABL DEF LABEL D128 DEC 128 #SECT DEC 96 SECTOR PER TRACK * * * YE ASC 1,YE D1 DEC 1 D2 DEC 2 D3 DEC 3 D4 DEC 4 D5 DEC 5 D6 DEC 6 D7 DEC 7 D8 DEC 8 D9 DEC 9 D10 DEC 10 D11 DEC 11 D12 DEC 12 D13 DEC 13 D14 DEC 14 D15 DEC 15 D16 DEC 16 D17 DEC 17 D19 DEC 19 D20 DEC 20 D21 DEC 21 D22 DEC 22 D23 DEC 23 D25 DEC 25 D28 DEC 28 D30 DEC 30 D36 DEC 36 D140 DEC 140 D96 DEC 96 D410 DEC 410 D411 DEC 411 D2048 DEC 2048 D6144 DEC 6144 D8192 DEC 8192 TKSIZ DEC 6122 TRACK SIZE INIT TO 6144 * N1 DEC -1 N2 DEC -2 TST05 DEF *+1 * N411 DEC -411 # TACK SURFACE N1234 DEC -1234 MAX #TRACK DISC N4 DEC -4 # OF SURFACES N3 DEC -3 HIGHEST HEAD # * ASC 2, 410 ASC 2,1233 * ASC 1, 2 ASC 1, 3 * * * 7906 SPECIFICATION * DEC -411 DEC -1645 DEC -5 DEC -4 ASC 2, 410 ASC 2,1644 ASC 1, 3 ASC 1, 4 * * * 7920 SPEC-- 823 TACK/SURF, 5 HEADS * N823 DEC -823 N4116 DEC -4116 N6 DEC -6 N5 DEC -5 ASC 2, 822 ASC 2,4115 ASC 1, 4 ASC 1, 5 * * * 7925 SPEC-- 9 HEADS,823 TRACKS/SURFACE * DEC -823 DEC -7407 DEC -10 DEC -9 ASC 2, 822 ASC 2,7407 ASC 1, 8 ASC 1, 9 * * END OF DISC PARAMETER * SECTR NOP #SPTR NOP # OF SPARE TRACKS FOR SUBCHNL CSPAR NOP BASE ADDR OF SPARE TRACK POOL UBADC NOP # OF USED SPARES PT#TR NOP CYLINDER # H#AD NOP HEAD # ITLU EQU D1 OPERATOR CONSOLE LU MTLU EQU D8 MAG TAPE LU SORCE ASC 3,SOURCE DEST ASC 3,DEST SAVE ASC 2,SAVE COPY ASC 2,COPY CLF CLF 0 JSBCI NOP MTRCN NOP DBKUP LIA 1 READ SWTCH REGISTER CONTENT SZA,RSS 0? JMP NOCNF YES - RE-CONFIGURATION OF MT AND TTY IS NOT STA SWREG DESIRED JSB CNFIG RE-CONFIGURE RTE-M FOR MT AND TTY CHANNELS JMP STRT1 * NOCNF JSB WRITE DISC BACKUP UTILITY DEF MSG1 DEF D10 LDA CLF INSERT CLF INSTR IN TRAP CELL FOR DVR05 DEVICE ADA .12 STA .12,I NOCN1 JSB QTASK TASK? TASK=0 - SAVE, 1=RESTORE LDA TASK CPA D2 IS TASK COPY? JMP STRT1 YES LDA MTRCN NO, THEN IS RECONFIGURATION OF MT CHANNEL REQRD? SZA JSB CNFIG YES * STRT1 DLD AMAP1 DST ATB31 CLA STA VFLAG STA VRFLG STA DOSDF STA RTFLG INA STA M24K LDA TASK IS TASK RESTORE? CPA D1 JMP RSTOR HANDLE RESTORE SEPARATELY CLA INITIALIZE RECORD SIZE INDICATOR STA IREC JSB QDISC QUERY DISC FEATURES JSB V6144 VERIFY POSSIBLE W/ 6144 WORD BUF? SZA JMP SACO1 YES,ASK IF LARGE BUFFER SIZE IS DESIRED? JSB WRITE DEF ERR0 DEF D5 JSB WRITE NO, GIVE WARNING MESSAGE DEF MSG25 WARNING - MEM SIZE TOO SMALL FOR VERIFY W/ DEF D23 6144 WORD BUF CLA STA M24K M24K=0 IF VERIFY W/ 6144 WORD BUF NOT POSSIBLE * = 1 OTHERWISE SACO1 JSB QUERY DEF MSG24 6144 WORD BUFFER DESIRED? DEF D13 DEF EXP6 REPLY YES OR NO DEF D10 LDA RBUF WHAT IS THE RESPONSE? CPA YE JMP SAC20 NO LDA D2048 STA JSIZE SIZE OF BUFFER TO BE READ OR WRITTEN TO MT LDA D32 STA INCR JMP SACO2 SAC20 LDA TKSIZ YES STA JSIZE LDA #SECT GET SECTOR PER TRACK STA INCR INCREMENT = 96 SECTORS CLA,INA IREC=1 TO INDICATE 6144 WORD REC SIZE STA IREC LDA M24K VERFIFY POSSIBLE? SZA,RSS JMP SACO3 NO * WANT VERIFY? SACO2 JSB QUERY DEF MSG17 VERIFY? DEF D4 DEF EXP6 REPLY YES OR NO DEF D10 LDA RBUF CPA YE YES? ISZ VRFLG VRFLG=1 INDICATES THAT VERIFY IS DESIRED SACO3 LDA TASK TASK? SZA SAVE? JMP SACO4 NO, COPY CLA STA FILEN FILE# INITIALIZED TO 0 JSB WRITE SET UP HEADER RECORD AND WRITE IT ON MT DEF MSG15 FILE ID? DEF D4 SACO9 LDA N36 STA COUNT COUNTER LDA SPACE CLEAR FILE ID BUFFER LDB AHDR ADDRESS OF HEADER RECORD STA B,I INB POINT TO NEXT WORD IN FILE ID BUFFER ISZ COUNT INCREMENT COUNT JMP *-3 IF ALL 36 WORDS NOT CLEARED, CLEAR NEXT ONE JSB EXEC READ RESPONSE IN HEADER BUFFER DEF *+5 DEF D1 DEF RITLU ITLU+400B DEF HEADR DEF D36 LDA HEADR HELP NEEDED? CPA QUES ?? RSS JMP SACO8 NO JSB WRITE YES-EXPLAIN DEF EXP15 ENTER MT FILE ID OF MAX 72 CHAR DEF D17 JMP SACO9 ASK FOR FILE ID AGAIN * SACO8 JSB MTNR MT READY? JSB WRING WRITE RING IN? JSB POSN POSITION MAG TAPE CLA,INA TAPE# = 1 STA TAPEN LDA SDTYP SOURCE DISC TYPE STA HEADR+37 LDA COTYP COPY TYPE CMA,INA -VE TO INDICATE OFF-LINE SAVE STA HEADR+38 JSB EXEC WRITE HEADER RECORD ON MT DEF *+5 DEF D2 DEF MTLU DEF HEADR DEF D140 * SACO4 LDA TKSIZ 6144 WORD BUFFERS TO READ & WRITE ON DISC STA ISIZE LDA SDTYP SOURCE DISC TYPE? CPA D7900 7900 DISC? RSS YES JMP SAC05 NO, 7905 OR 7920 LDA PLATR PLATR # INDICATES SUBCHANNEL # FOR 7900 DISC STA SUB# SACO0 JSB TSTC0 FIND SIZE OF SUBCHANNEL STB NTRCK SIZE (# OF TRACKS) RETURNED IN AREG CLA STA TRACK STA KB+1 SACO5 OTA 1 OUTPUT TRACK # TO SWITCH REGISTER LDA SUNIT SOURCE UNIT FOR DISC DRIVER STA UN#IT CLA SECTOR # = 0 STA SECTR LDB AJB CORE ADDRESS OF BUFFER JSB RD00 READ A TRACK FROM 7900 DISC LDA TASK TASK IS SAVE? SZA JMP SACO6 NO,COPY JSB WRTMT YES WRITE RECORD ON MAG TAPE JMP SACO7 SACO6 LDA DUNIT SET UP UNIT # FOR DESTINATION DISC STA UN#IT LDB AJB CORE ADDRESS OF BUFFER JSB WR00 WRITE TRACK ON 7900 DEST DISC SACO7 ISZ TRACK GO TO NEXT TRACK LDA TRACK STA KB+1 CPA NTRCK ALL TRACKS IN SUB# READ? RSS JMP SACO5 NO, DO NEXT ONE LDA COTYP YES, DONE IF COPY TYPE IS FROM-TO CPA D2 UNIT COPY? RSS JMP DONE NO, SO DONE LDA SUB# YES, SUBCHNL # SZA JMP DONE SUB# = 1, THEREFORE DONE ISZ SUB# SUB#=0, SO SAVE OR COPY SUB# 1 LDA SUB# JMP SACO0 * * SOURCE DISC IS 7905 OR 7920 * SAC05 LDA ATB32 # OF SUBCHNLS IS STORED IN FIRST WORD OF TMT ADA N1 LDA A,I SSA IF -VE CONVERT IT TO A +VE # CMA,INA STA NSUB # OF DEFINED SUBCHNLS IN TRACK MAP TABLE CLA STA SUB# FIRST SUB# = 0 SAC09 JSB TSTC5 GET # TRACKS & BASE ADDR OF SPARE TRK POOL LDA ATB32 # OF SUBCHNLS ENTRY IN AREG ADA N1 LDA A,I SSA,RSS IF TRACK SPARING IS DESIRED, THIS ENTRY IS -VE JMP SAC08 ENTRY IS +VE SO NO TRACK SPARING IS DESIRED JSB NSPRS TRCK SPARING WANTED,FIND # SPARE TRACKS FOR SUB# STA #SPTR # OF SPARES RETURNED IN A REG SAC08 CLA STA UBADC # OF USED SPARES STA TRACK COUNTER FOR TRACK # STA SECTR SECTOR # STA KB+1 SAC07 OTA 1 LDB SUB# CURRENT SUBCHNL# BLS SUB#*2 ADB SUB# SUB#*3 ADB ATB32 ADD ADDR OF TRACK MAP TABLE STB DIST1 ADDR OF TRACK MAP INFO FOR SUB# LDA SUNIT STA UN#IT SET UP SOURCE UNIT # FOR DRIVER JSB RD05 READ A RECORD FROM 7905 SOURCE DISC LDA TASK TASK? SZA SAVE? JMP SAC06 NO, COPY JSB WRTMT YES, WRITE RECORD ON TAPE JMP SAC10 SAC06 LDA DOSDF WAS THE DEFECTIVE TRACK FLAG FOR SZA DOS DISC TURNED ON? JMP INIEW YES, GO SPARE THIS TRACK TOO LDA DUNIT WRITE DATA ON DESTINATION DISC UNIT STA UN#IT LDB AJB JSB WR05 WRITE TRACK ON 7905 DISC SAC10 ISZ TRACK INCREMENT TRACK# LDA TRACK STA KB+1 CPA NTRCK ALL TRACKS IN SUB# SAVED OR COPIED? RSS JMP SAC07 NO DO THIS TRACK LDA SYSTP YES - SYSTEM TYPE? SZA,RSS RTE? JMP SAC11 LDA COTYP DOS SYSTEM - COPY TYPE? CPA D2 UNIT? JSB LBCNG YES, UPDATE USER LABEL ON SUB# TO REFLECT # OF * BAD TRACKS AND NEXT AVAILABLE SPARE ENTRIES SAC11 ISZ SUB# GO TO NEXT SUBCHNL LDA SUB# CPA NSUB ALL SUBCHNLS DEFINED HAVE BEEN SAVED OR COPIED? JMP DONE YES JMP SAC09 NO, SAVE OR COPY THIS SUB# * * TASK IS TO RESTORE MAG TAPE * RSTOR CLA STA FILEN FILE # INITIALIZED TO 0 STA EOFLG END OF FILE FLAG INITIALIZED TO 0 JSB MTNR MT READY? JSB POSN ASK FOR FILE# AND POSITION MT TO IT JSB PRNTH READ AND PRINT HEADR INFO DEF HEADR ADDRESS OF HEADER BUFFER JMP RSTR2 CORRECT TAPE JSB WRITE MOUNT CORRECT TAPE DEF MSG26 DEF D9 JSB PAUSE TAPE IS NOT OK, WAIT FOR USER TO MOUNT JMP RSTOR RIGHT TAPE, POSITION, PRINT HEADER, ETC. AGAIN * RSTR2 LDA SVTYP SSA CMA,INA IF COPY TYPE IS -VE CONVERT TO +VE STA COTYP LDA HEADR+37 STA SDTYP READ SOURCE DISC TYPE FROM HEADER STA DTYPE DEST DISC TYPE IS SAME AS SOURCE DISC TYPE * * LDB D6144 INIT TRACK SIZE TO 6144 CPA D7925 IS IT A 7925 LDB D8192 YES, SET TRACK SIZE TO 8192 CPA A7925 IS IT 7925 (ON LINE SAVE) LDB D8192 STB TKSIZ TRACK SIZE LDB D96 INIT SECTOR CPA D7925 LDB D128 SET SECTOR PER TRACK TO 128 CPA A7925 LDB D128 STB #SECT * * JSB QDISC QUERY DISC FEATURES LDA TKSIZ INITIALIZE ISIZE TO 6144 STA ISIZE LDB IREC BUFFER SIZE OF SAVE RECORDS? SZB,RSS REC=6144 WORDS? JMP RSTR8 STA JSIZE YES, SET UP SIZE AND INCR FOR MAG TAPE RECORDS LDA #SECT STA INCR INCREMENTS FOR SECTOR #'S JSB V6144 CAN VERIFY BE DONE W/ 6144 WORD BUFFER? SZA JMP RSTR3 YES, MEMORY IS >= 24K JSB WRITE DEF ERR0 WARNING-- DEF D5 JSB WRITE NO, SEND WARNING MESSAGE DEF MSG25 WARNING-MEM SIZE TOO SMALL FOR VERIFY W/ 6144 DEF D23 WORD BUFFER JMP RSTR4 RSTR8 LDB D2048 REC SIZE IS 2048 WORDS STB JSIZE LDB D32 STB INCR * WANT VERIFY? RSTR3 JSB QUERY DEF MSG17 VERIFY? DEF D4 DEF EXP6 REPLY YES OR NO DEF D10 LDA RBUF CHECK RESPONSE CPA YE YES? ISZ VRFLG VERIFY WANTED, TURN FLAG ON TO INDICATE THIS * * RSTR4 LDA N1 SET SUBCHNL# TO -1 STA SUB# LDA SVTYP WAS SAVE DONE ON-LINE OR OFF-LINE? SSA JMP RSTR7 OFF-LINE SAVE LDA TRKMP LDB SDTYP ON-LINE SAVE - SOURCE DISC TYPE? CPB D7900 7900? JMP RSTR6 YES SSA,RSS IF FIRST WORD +VE THEN USER DEFINED TRACK MAP ISZ ATB32 START OF TRACK MAP INFO IS INCREMENTED BY 1 JMP RSTR9 RSTR6 SSA SOURCE DISC WAS A 7900 ISZ ATB31 USER DEFINED TRACK MAP TABLE JMP RST10 RSTR7 LDA SDTYP OFF-LINE SAVE - SOURCE DISC TYPE? CPA D7900 7900? JMP RST10 YES RSTR9 LDA ATB32 COMPUTE # OF SUBCHANNELS DEFINED ADA N1 IN TRACK MAP TABLE LDA A,I SSA # OF SUBCHNLS -VE? CMA,INA YES, CONVERT IT TO +VE STA NSUB # OF SUBCHNLS DEFINED ON 7905 SOURCE DISC RST10 JSB RDMT READ ALL RECORDS FROM MT THAT BELONG LDA EOFLG TO SAME TRACK -- GET END OF FILE FLAG SZA,RSS SET? JMP RST17 NO LDA SDTYP YES CPA D7900 7900 DISC? JMP DONE YES, THEN DONE LDA COTYP CPA D2 UNIT COPY? RSS JMP DONE NO, THEN DONE LDA SYSTP SZA,RSS DOS SYSTEM? JMP DONE NO, THEN DONE JSB LBCNG UPDATE LABELS ON DOS SUBCHNL JMP DONE RST17 LDA KB+1 WAS THIS TRACK USUCCESSFULLY SAVED? SSA,RSS JMP RST11 NO ELA,CLE,ERA CLEAR SIGN BIT STA TRACK JSB WRITE YES - PRINT WARNING MESSAGE DEF ERR0 WARNING - DEF D5 JSB WRITE DEF MSG30 TRACK AT FOLLOWING LOC WAS NOT SAVED SUCCESSFULLY DEF D25 LDA TRACK LDB SDTYP SOURCE DISC TYPE CPB D7900 7900 DISC? JMP RST12 YES JSB PTRK5 PRINT LOCTION OF TRACK JMP RST14 RST12 LDA KB FIND REAL TRACK # ELA,CLE,ERA CLEAR SIGN BIT ADA ATB31 ADD ADDRESS OF TRACK MAP TABLE LDA A,I FIRST TRACK # OF SUBCHANNEL ADA TRACK ADD RELATIVE TRACK # JSB PTRK0 PRINT LOC OF TRACK FOR 7900 DISC RSS RST11 STA TRACK RST14 LDA TRACK OTA 1 OUTPUT TRACK # TO SWITCH REGISTER CLA SECTOR # = 0 STA SECTR LDA DUNIT SET UNIT # FOR DRIVER STA UN#IT LDA SDTYP SOURCE DISC TYPE? CPA D7900 7900 DISC? JMP RST15 YES LDA DOSDF NO, IS THIS A DOS DISC AND IF SO WAS THE PREVIOUS SZA TRACK DEFECTIVE? JMP INIEW YES, THEN MARK THIS ONE DEFECTIVE & SPARE IT LDA SUB# SAVE ORIGINAL VALUE OF SUB# STA SUB LDA KB IS THIS A NEW SUBCHNL? ELA,CLE,ERA CLEAR SIGN BIT CPA SUB# JMP RST16 NO, IT IS SAME AS BEFORE STA SUB# JSB TSTC5 GET #TRCKS & BASE SPARE POOL ADDR FOR SUB# LDA ATB32 TRACK MAP TABLE ADDRESS ADA N1 LDA A,I IF VALUE -VE THEN TRACK SPARING DESIRED SSA,RSS JMP RST16 TRACK SPARING NOT DESIRED LDB SYSTP SZB,RSS DOS SYSTEM? JMP RST18 NO, RTE LDA SUB WAS ORIGINAL VALUE -1? SSA JMP RST19 YES,THEN DONT CHANGE ANY LABELS LDB SUB# STB SUB SAVE NEW VALUE OF SUB# STA SUB# JSB LBCNG UPDATE LABELS ON DOS SUBCHNL JMP RST19 RST18 JSB NSPRS FIND # OF SPARE TRACKS ALLOWED FOR THIS SUB# STA #SPTR RST19 CLA STA UBADC INITIALIZE # OF USED SPARES TO 0 RST16 JSB WR05 WRITE RECORD ON 7905 DISC RSS RST15 JSB WR00 DISC IS 7900 - WRITE REC ON IT JMP RST10 READ NEXT RECORD FROM MT * * TASK IS COMPLETED, NOW CHECK IF VERIFY REQUESTED * DONE LDA TASK WAS TASK SAVE? SZA JMP DONE1 NO LDA MTLU ADA .100 SET UP CONTROL WORD FOR EOF MARK STA TEMP1 JSB EXEC YES THEN WRITE AN EOF MARK ON MT DEF *+3 DEF D3 DEF TEMP1 EOF MARK DONE1 LDA VRFLG LOAD VERIFY FLAG SZA JMP VERFY IT IS ON, SO VERIFY DATA JUST TRANSFERRED JMP EXIT TERMINATE UTILITY * * ENTER HERE WHEN UTILITY HAS TO BE ABORTED * EXITU JSB WRITE DEF MSG20 DISC BACKUP UTILITY IS ABORTED DEF D15 JMP NOCN1 ASK FOR NEXT TASK EXIT JSB WRITE TASK COMLETED DEF MSG19 DEF D7 LDA TASK TASK IS COPY? CPA D2 JMP NOCN1 YES THEN DONE JSB MTNR MAG TAPE READY? JSB REWND NO, DONT REWIND MAG TAPE JMP NOCN1 ASK FOR NEXT TASK * * * VERIFY DATA * VERFY ISZ VFLAG VFLAG=1 TO INDICATE VERIFY OPERATION JSB WRITE INFORM USER THAT DATA IS NOW BEING VERIFIED DEF MSG31 VERIFYING DEF D5 LDA JSIZE SET UP SIZE DISC BUFFER TO MATCH MT BUFFER STA ISIZE LDA TASK CPA D2 TASK IS COPY? JMP VRF10 YES, HANDLE IT SEPARATELY LDA TAPEN TAPE# STA SVTPN SAVE TAPE# INDICATING LAST TAPE USED CPA D1 TAPE# = 1? JMP VERF3 YES VERF1 JSB WRITE NO DEF MSG29 MOUNT TAPE# 1 DEF D7 JSB REWND JSB PAUSE WAIT FOR USER TO MOUNT FIRST TAPE JSB MTNR MT READY? JSB POSN POSITION IT TO FILE# IN FILEN JSB PRNTH PRINT HEADER AND ASK OK ON TAPE DEF HEADR ADDRESS OF BUFFER FOR HEADER REC JMP VERF4 TAPE OK JMP VERF1 TAPE NOT OK - TRY AGAIN * VERF3 JSB MTNR MT READY? JSB POSN POSITION MT TO FILEN JSB EXEC DEF *+5 DEF D1 DEF MTLU READ HEADER RECORD DEF HEADR DEF D140 * VERF4 LDA TASK SZA TASK WAS SAVE? JMP VERF5 NO - IT WAS RESTORE LDB SDTYP SOURCE DISC TYPE STB DSCTP LDB SUNIT SOURCE DISC UNIT # STB UN#IT JMP VLOOP VERF5 LDB DTYPE DESTINATION DISC TYPE STB DSCTP LDB DUNIT DEST UNIT# STB UN#IT LDA COTYP IS IT A FR-TO? CPA D3 RSS JMP VLOOP NO LDA DSUB# YES, THEN DEST SUB# STA SUB# LDA DPLTR DEST PLATTER # STA PLATR VLOOP CLA SECTOR # IS 0 STA SECTR INA STA VRFLG RESET VRFLG VLP1 LDA MTLU EOT REACHED? ADA .600 STA TEMP2 CONTROL WORD FOR DYNAMIC STATUS OF MT JSB EXEC FIND DYNAMIC STATUS OF MT DEF *+3 DEF D3 DEF TEMP2 AND .40 AREG HAS STATUS WORD CPA .40 IF BIT 5 IS ON, EOT HAS BEEN REACHED RSS JMP VERF6 EOT NOT REACHED LDA SVTPN EOT REACHED CPA TAPEN IS THIS EOF TOO? JMP VDONE ALL TAPES HAVE BEEN VERIFIED, DONE JSB WRITE ASK FOR NEXT TAPE TO BE MOUNTED DEF MSG18 EOT READCHED, MOUNT NEXT TAPE DEF D14 JSB REWND REWIND MAG TAPE VERF7 JSB PAUSE WAIT FOR TAPE TO BE MOUNTED JSB MTNR MAG TAPE READY? JSB REWND REWND MAG TAPE JSB PRNTH PRINT HEADER REC INFO & ASK IF OK DEF HEADR JMP VERF6 TAPE OK JSB WRITE MOUNT CORRECT TAPE DEF MSG26 DEF D9 JMP VERF7 RIGHT TAPE NOT MOUNTED, WAIT AGAIN VERF6 LDA JSIZE ADD 2 WORDS FOR HEADER INFO ADA D2 STA TEMP1 JSB MTNR MAG TAPE READY? JSB EXEC READ RECORD FROM MAG TAPE DEF *+5 DEF D1 DEF MTLU DEF KB DEF TEMP1 SZB,RSS EOF REACHED? JMP VDONE YES LDA TASK SAVE? SZA,RSS JMP VRF32 YES LDA COTYP CPA D3 FROM - TO COPY? JMP VRF30 YES VRF32 LDA KB NO ELA,CLE,ERA CLEAR SIGN BIT STA SUB# VRF30 LDA KB+1 ELA,CLE,ERA CLEAR SIGN BIT STA TRACK OTA 1 OUTPUT TRACK # TO SWITCH REG LDA JSIZE IS BUFFER SIZE 6144 WORDS? CPA TKSIZ JMP VERF2 YES THEN USE BUFFER AT END OF SUBROUTINES LDB AJB ADB JSIZE CORE BUFFER ADDRESS RSS VERF2 LDB AVBUF CCE E REG = 1 FOR READ OPERATION CLA STA INIT1 CLEAR INIT BIT FOR DISK DRIVER LDA DSCTP DISC TYPE? CPA D7900 7900 DISC? JMP VERF8 YES LDA TASK SAVE? SZA,RSS JMP VRF19 YES LDA COTYP CPA D3 FROM - TO COPY? JMP VRF12 YES VRF19 LDA SUB# SET UP TRACK MAP ADDRESS FOR SUB# ALS ADA SUB# SUB#*3 ADA ATB32 JMP VRF18 VRF12 LDA AFRMP SET UP DIST1 FOR FROM - TO COPY INA VRF18 STA DIST1 TRACK MAP FOR DISC DRIVER TO USE LDA TRACK JSB DISK5 NO,7905 OR 7920 DISC,READ REC FROM IT JMP VERF9 VERF8 LDA COTYP CPA D3 FROM - TO COPY? JMP VRF11 YES LDA ATB31 SET UP REAL TRACK ADDRESS ADA SUB# LDA A,I A REG HAS BASE TRACK ADDR RSS VRF11 LDA FTRCK REAL TRACK ADDRESS FOR DEST DISC ADA TRACK OF FROM-TO COPY IN A REG JSB DISK0 7900 DISC, READ RECORD FROM IT VERF9 LDA VRFLG HAS A VERIFY ERROR BEEN DETECTED IN THIS TRACK? SSA,RSS JSB CMPAR NO, THEN COMPARE THE 2 BUFFERS JMP VRF22 SUCCESSFUL COMPARE CCA STA VRFLG UNSUCCESSFUL COMPARE VRF22 LDA SECTR ADA INCR INCREMENT SECTOR COUNT CPA #SECT ALL 96 SECTOR FOR TRACK VERIFIED? JMP VLOOP YES STA SECTR NO, VERIFY NEXT PORTION OF TRACK JMP VLP1 * * TASK WAS COPY * VRF10 CLA STA TRACK INITIALIZE TRACK AND SECTOR COUNTERS STA SECTR LDA JSIZE SET SIZE OF BUF TO WHAT USER HAD SEPCIFIED STA ISIZE LDB SDTYP STB DSCTP CPB D7900 7900 DISC? JMP VRF15 YES CLA STA SUB# SUB#=0 INITIALLY VLP4 JSB TSTC5 FIND # OF TRACKS IN SUBCHNL VLP3 LDA SUB# ALS ADA SUB# MULTIPLY SUB# 3 TIMES ADA ATB32 ADDR OF TRACK MAP INFO FOR SUBCHNL STA DIST1 LDA TRACK OTA 1 OUTPUT TRACK # TO SWITCH REG LDA SUNIT STA UN#IT SET UNIT # FOR DISC DRIVER LDB AJB CORE ADDR OF BUFFER LDA TRACK CCE E REG =1 FOR READ JSB DISK5 READ REC FROM 7905 DISC LDA COTYP CPA D3 FROM - TO COPY? RSS JMP VRF25 NO LDA AFRMP YES INA SET UP DIST1 FOR FROM TO COPY DEST SUBCHNL STA DIST1 VRF25 LDA DUNIT SET DEST UNIT# FOR DISC DRIVER STA UN#IT DEST UNIT LDA ISIZE SIZE OF BUFFER? CPA TKSIZ 6144 WORDS? JMP VRF16 YES LDB AJB NO, 2048 WORDS ADB ISIZE CORE ADDRESS OF BUFFER FOR DEST DISC RSS VRF16 LDB AVBUF USE BUFFER AT END OF SUBROUTINES LDA TRACK CCE E REG = 1 FOR READ JSB DISK5 READ FROM DEST DISC JSB CMPAR COMPARE THE TWO RECORDS RSS SUCCESSFUL COMPARE RETURN JMP VRF13 USUCCESSFUL COMPARE, VERIFY NEXT TRACK LDA SECTR ADA INCR INCREMENT SECTOR COUNT CPA #SECT ALL 96 SECTORS VERIFIED? JMP VRF13 YES STA SECTR NO, VERIFY NEXT PORTION OF TRACK JMP VLP3 VRF13 ISZ TRACK INCREMENT TRACK COUNTER LDA TRACK CPA NTRCK ALL TRACKS VERIFIED? JMP VRF14 YES CLA NO STA SECTR SECTOR COUNT TO 0 JMP VLP3 VRF14 ISZ SUB# LDA SUB# CPA NSUB ALL SUBCHNLS VERIFIED? JMP EXIT YES CLA STA TRACK STA SECTR LDA SUB# JMP VLP4 NO THEN VERIFY NEXT SUBCHNL * * DISC IS 7900 * VRF15 LDA PLATR PLATR # SAME AS FIRST SUB# STA SUB# VLP7 JSB TSTC0 FIND # OF TRACKS IN SUB# STB NTRCK # OF TRACKS RETURNED IN A REG CLA STA TRACK INITIALIZE TRACK AND SECTOR TO 0 VLP6 STA SECTR LDA TRACK OTA 1 OUTPUT TRACK # TO SWITCH REG VLP5 LDA SUNIT STA UN#IT SET UP SOURCE UNIT # FOR DISC DRIVER LDB AJB CORE ADDRESS FOR BUFFER CCE E REG=1 FOR READ LDA ATB31 SET UP REAL TRACK ADDRESS ADA SUB# LDA A,I BASE TRACK ADDR FOR SUB# ADA TRACK ADD RELATIVE TRACK ADDRESS JSB DISK0 CALL DISC DRIVER SSA WAS THIS TRACK MARKED DEFECTIVE? JMP VRF20 YES, FORGET IT, VERIFY NEXT ONE LDA DUNIT SET UP DEST UNIT # FOR DRIVER STA UN#IT LDA ISIZE BUFFER SIZE? CPA TKSIZ 6144 WORDS? JMP VRF17 YES LDB AJB ADB ISIZE ADDR OF BUFF FOR DEST DISK READ RSS VRF17 LDB AVBUF USE BUFFER AT END OF SUBROUTINES CCE E REG = 1 FOR READ LDA COTYP CPA D3 FROM - TO COPY? RSS JMP VRF26 NO LDA PLATR SAVE PLATTER # STA TBUF LDA SUB# SAVE SUBCHNL # STA TBUF+1 LDA DPLTR YES, SET UP PLATR AND SUB# STA PLATR LDA DSUB# STA SUB# LDA TRACK SET UP REAL TRACK ADDRESS IN A REG ADA FTRCK ADD BASE TRACK # TO RELATIVE TRACK # RSS VRF26 LDA TRCK1 REAL TRACK ADDRESS FOR OTHER THAN FROM-TO COPY JSB DISK0 READ BUF FROM DEST DISC VRF31 JSB CMPAR COMPARE TWO BUFFERS RSS SUCCESSFUL COMPARE JMP VRF20 UNSUCCESSFUL COMPARE, VERIFY NEXT TRACK LDA SECTR ADA INCR INCREMENT SECTOR COUNT CPA #SECT ALL 96 SECTORS VERIFIED? JMP VRF20 YES STA SECTR NO, VERIFY NEXT PORTION OF TRACK LDA COTYP IS IT A FROM-TO COPY? CPA D3 RSS JMP VLP5 DLD TBUF RESTORE STA PLATR PLATTER# STB SUB# AND SUBCHANNEL # JMP VLP5 VRF20 LDA COTYP IS IT A FROM-TO COPY? CPA D3 RSS JMP VRF33 DLD TBUF YES, RESTORE SOURCE STA PLATR PLATTER # STB SUB# SUBCHANNEL # VRF33 ISZ TRACK INCREMENT TRACK COUNTER LDA TRACK CPA NTRCK ALL TRACKS IN SUB# VERIFIED? JMP VRF21 YES CLA NO, THE SECTOR IS 0 JMP VLP6 VRF21 LDA SUB# IF SUB#=1, THEN DONE SZA JMP EXIT LDA COTYP CPA D3 FROM-TO COPY? JMP EXIT YES, THEN DONE ISZ SUB# YES - VERIFY NEXT SUBCHNL LDA SUB# JMP VLP7 * VDONE JSB REWND DONE VERIFYING JMP EXIT * VFLAG NOP DSCTP NOP * * * CNFIG NOP ROUTINE TO CONFIGURE RTE-M OP SYSTEM LDA MTRCN ONLY MAG TAPE TO BE CONFIGURED? SZA JMP CNFG3 YES JSB $LIBR TURN OFF ALL INTERRUPTS NOP AND MEMORY PROTECT FENCE CLF 0 LDA .15,I SAVE JSB CIC,I INSTR IN TEMP LOC STA JSBCI LDA CLF INSERT CLF INSTR IN MT TRAP CELLS ADA .23 STA .23,I INA STA .24,I LDA INTBA ADDRESS OF INTERRUPT TABLE LDB INTAD MAKE A COPY OF INT. TABLE IN USER AREA JSB .MVW MOVE WORDS SUBROUTINE DEF INTLG LENGTH OF BUFFER TO BE MOVED NOP LDA SWREG GET CONTENTS OF SW REG ELA,CLE,ERA CLEAR SIGN BIT STA SWREG LDA CN1 CONFIGURE I O INSTR TO CONSOLE SC ADA SWREG STA CN1 LDA CN2 ADA SWREG STA CN2 LDA CN3 ADA SWREG STA CN3 LDA MRSET MASTER RESET WORD CN1 CLF 0 CN2 OTA 0 CN3 SFS 0 FLAG IS SET ONLY IF 12966 CARD JMP CNFG0 SYSTEM CONSOLE USES DVR00 * SYSTEM CONSOLE USES DVR05 TYPE DRIVER LDA EQTA ADDRESS OF FIRST EQT ENTRY ADA D30 ADDRESS OF DVR05 (3RD) EQT ENTRY STA SYSTY CHANGE SYSTEM TTY EQT TO POINT TO EQT#3 * CHANGE DRT ENTRIES TO HAVE LU 1 POINT TO EQT #3 LDA DRT,I AND .3700 ADA D3 EQT# 3 IN IST ENTRY OF DRT STA DRT,I LDB DRT ADB D8 POINT TO LU 9 LDA B,I AND .1777 INA POINT LU 9 TO EQT # 1 STA B,I * LDA CLF INSERT CLF INSTR IN TRAP CELL FOR DVR00 DEVICE ADA .15 STA .15,I JMP CNFG1 CNFG0 LDA CLF INSERT CLF INSTR IN TRAP CELL FOR DVR05 DEVICE ADA .12 STA .12,I CNFG1 JSB SCHNG CHANGE SELECT CODE ENTRIES IN EQT & INT TABLE DEF SWREG DEF SYSTY,I JSB INTON TTY CONFIGURED - TURN ON ALL INTERRUPTS CNFG2 JSB WRITE DISK BACKUP UTILITY DEF MSG1 DEF D10 JSB QTASK QUESTION TASK TO BE DONE LDA TASK CPA D1 TASK=RESTOR? JMP CNFG3 YES, JUMP SZA,RSS TASK=SAVE? JMP CNFG3 YES ISZ MTRCN SET FLAG TO INDICATE MT NOT RECONFIGURED JMP CNFIG,I CONFIGURATION DONE * *TASK IS EITHER SAVE OR RESTORE *CONFIGURE MAG TAPE CHANNEL * CNFG3 JSB QCHNL DEF MSG14 MT CHANNEL #? DEF D9 LDA CHANL MT CHANNEL # STA MCHNL LDA EQTA BEGINNING OF EQT TABLES ADA D15 STA EQTAD ADDR OF EQT ENTRY FOR MT JSB $LIBR TURN OFF INTERRUPTS AND MEM PROTECT FENCE NOP CLF 0 JSB SCHNG CONFIGURE NEW MT CHANNEL BY CHANGING SC # DEF MCHNL IN EQT TABLE AND INTERRUPT TABLE ENTRIES DEF EQTAD,I JSB INTON TURN ON ALL INTERRUPTS, ETC. LDA MTRCN ONLY MT HAD TO BE CONFIGURED? SZA,RSS JMP CNFIG,I NO, THEN RETURN CLA YES, THEN CLEAR MTRCN FLAG STA MTRCN * JMP CNFIG,I RETURN * INTAD DEF INTA INTERRUPT TABLE ADDRESS INTA EQU LABEL INTERRUPT TABLE ENTRIES .15 OCT 15 PRE CONFIGURED SELECT CODE OF CONSOLE .12 OCT 12 .23 OCT 23 .24 OCT 24 MRSET OCT 150077 MASTER RESET WORD FOR CONSOLE .3700 OCT 3700 DRT EQU 1652B DEVICE REFERENCE TABLE SWREG NOP EQTAD NOP ADDRESS OF A EQT ENTRY MCHNL NOP MAG TAPE CHANNEL # INTBA EQU 1654B INTERRUPT TABLE ADDRESS IN SYSTEM INTLG EQU 1655B LENGTH OF INTERRUPT TABLE EQTA EQU 1650B ADDR OF EQT TABLE ENTRIES SYSTY EQU 1675B * * * INTON - ROUTINE TO TURN ON INTERRUPTS AND MEMORY PROTECT FENCE * CALLING SEQUENCE: JSB INTON * * INTON NOP JSB $LIBX LIBRARY ROUTINE TO TURN ON INTERRUPTS DEF INTON RETURNS TO LOCATION AFTER JSB INTON INSTRUCTION * * * INT0N - ROUTINE TO TURN ON INTERRUPTS AND CLEAR FLAG FOR * 7900 DISC CHANNEL * CALLING SEQUENCE: JSB INT0N * * INT0N NOP DSK70 CLF 1 CLC 6 JSB $LIBX TURN ON INTERRUPTS DEF INT0N RETURN * * INT5N - ROUTINE TO TURN ON ALL INTERRUPTS AND MEMORY PROTECT * FENCE * CALLING SEQEUNCE: JSB INT5N * * INT5N NOP DSK71 CLF 1 CLC 6 JSB $LIBX LIBRARY ROUTINE TO TURN ON INTERRUPTS DEF INT5N RETURN TO LOCATION AFTER JSB INTON * * *SCHNG - ROUTINE TO CHANGE SC# ENTRIES IN EQT & INTERRUPT TABLE *CALLING SEQUENCE - JSB SCHNG * DEF SC# NEW SELECT CODE # * DEF EQTAD ADDRESS OF EQT TABLE ENTRY * WHERE CHANGE IS TO BE MADE * SCHNG NOP LDA SCHNG,I BRING IN NEW SELECT CODE # LDA A,I STA NEWSC ISZ SCHNG LDA SCHNG,I ADDRESS OF EQT ENTRY JSB RMOVI REMOVE ANY INDIRECTS STA EQTAD STA B VALUE RETURNED IN A REG ADB D3 LDA B,I CONTENTS OF WORD 4 OF EQT TABLE AND .77 STA OLDSC PRE CONFIGURED SC FOR DEVICE LDA B,I AND .1777 ZERO OUT OLD SC ADA NEWSC INSERT NEW SC IN SLOT STA B,I REPLACE WORD 4 OF EQT TABLE CLA STA TEMP LDA INTAD CHECK IF OLD SC CONTROLLER TOOK UP 2 I/O SLOTS ADA OLDSC ADA N6 INA POINT TO OLDSC+1 ENTRY IN INTERRUPT TABLE LDA A,I GET EQTAD FROM IT CPA EQTAD ISZ TEMP OLDSC CONTROLLER DOES TAKE UP 2 I/O SLOTS LDA INTBA CLEAR ENTRY IN INT TABLE FOR OLD CHANNEL ADA OLDSC ADA N6 LDB A,I GET CONTENTS OF INTERRUPT TABLE AT OLDSC CPB EQTAD IS IT SAME AS THIS EQT ENTRY? RSS YES, THEN CLEAR IT JMP SCHN5 NO, THEN DO NOT CLEAR LDB CLF ADB OLDSC STB OLDSC,I STORE CLF INSTR IN TRAP CELL CLB CLEAR INT TABLE ENTRY CORRESPONDING TO OLDSC STB A,I SCHN5 LDB TEMP TWO ENTRIES TO BE GIVEN NEW EQTAD? SZB,RSS JMP SCHN1 NO INA YES LDB A,I ANY OTHER DEVICE ASSIGNED TO THIS SC? CPB EQTAD RSS NO, CLEAR CONTENTS OF OLDSC IN INTERRUPT TABLE JMP SCHN1 YES, SET UP NEW SELECT CODE ENTRIES LDB CLF INSERT CLF INSTR IN NEXT ENTRY ADB OLDSC INB ISZ OLDSC STB OLDSC,I CLB CLEAR CORRESPONDING INT TABLE ENTRY STB A,I SCHN1 LDA INTBA CHANGE NEW SC SLOT IN INT TABLE TO POINT ADA NEWSC TO EQT ENTRY ADA N6 LDB EQTAD STB A,I LDB JSBCI STORE JSB CIC,I INSTR IN TRAP CELL STB NEWSC,I CORRESPONDING TO NEWSC LDB TEMP CONTROLLER NEEDS 2 I/O CHANNELS? SZB,RSS JMP RSCHN NO RETURN INA YES CHANGE NEXT ENTRY LDB EQTAD STB A,I LDB JSBCI JSB CIC,I INSTR IN NEWSC+1 TRAP CELL ISZ NEWSC STB NEWSC,I * RSCHN ISZ SCHNG RETURN JMP SCHNG,I * OLDSC NOP NEWSC NOP DCHNL NOP SCHNL NOP .77 OCT 77 * * QCHNL - ROUTINE TO FIND CHANNEL # FOR GIVEN UNIT & TEST IF IT IS * BETWEEN 10-77 OCTAL * CALLING SEQUENCE - JSB QCHNL * DEF MSGX MESG ADDR TO ASK USER FOR CHANNEL # * DEF DN # OF WORDS IN MESSAGE * * QCHNL NOP LDA QCHNL,I STA TEMP1 ADDR OF MESSAGE ISZ QCHNL LDB QCHNL,I ADDR OF MESSAGE LENGTH LDB B,I MESS LENGTH STB TEMP2 JSB QUERY DEF TEMP1,I XXXX CHANNEL #? DEF TEMP2 LENGTH OF MESSAGE DEF EXP4 REPLY OCTAL 10 TO 77 DEF D10 LENGTH OF EXPLNAITON JSB GINIT CONVERT ASCII TO OCTAL LDA D2 2 CHARACTERS TO BE CONVERTED JSB GETOC CONVERT 2 CHARACTERS FROM RDBUF JMP EXPL ERROR RETURN STA CHANL OCTAL VALUE RETURNED IN A REG LDB CHANL ADB .N10 ADD -10B SSB LESS THAN 10B? JMP EXPL YES, EXPLAIN RESPONSE AND ASK AGAIN LDB CHANL ADB .N100 SSB,RSS CHANNEL# > 77B? JMP EXPL YES, EXPLAIN AGAIN ISZ QCHNL JMP QCHNL,I RETURN * CHANL NOP .N10 OCT -10 .N100 OCT -100 * * * QDISC - ROUTINE TO QUERY DISC FEATURES AND CONFIGURE IT * CALLING SEQUENCE : JSB QDISC * QDISC NOP CLA STA IFLAG LDA TASK TASK? CPA D1 RESTORE? JMP DESTN YES DLD SORCE SET UP MESSAGE TO SAY DST MSG4 SOURCE DISC CHANNEL #? DST MSG21 SOURCE DISC DRIVE#? LDA SORCE+2 STA MSG4+2 STA MSG21+2 JSB QCHNL SOURCE DISC CHANNEL #? DEF MSG4 DEF D11 JSB QDUTP SOURCE DISC TYPE? DEF MSG5 DEF D9 DEF MSG21 AND UNIT #? DEF D10 LDA DTYPE STA SDTYP SOURCE DISC TYPE LDA DUNIT STA SUNIT SOURCE UNIT # LDA CHANL STA SCHNL SOURCE DISC CHANNEL # JSB DCNFG CONFIGURE SOURCE DISC * * FIND TYPE OF SAVE OR COPY * QDSC5 LDA TASK SZA TASK? JMP QDSC3 TASK IS COPY DLD SAVE SET UP MESG TO SAY TYPE OF SAVE? JMP QDSC4 QDSC3 DLD COPY SET UP MESSAGE TO SAY 'TYPE OF COPY?' QDSC4 DST MSG3+4 JSB QUERY DEF MSG3 TYPE OF COPY? DEF D7 DEF EXP3 REPLIES ARE: UN,FR DEF D9 LDB RBUF CPB UN JMP QDSC6 UNIT COPY CPB FR RSS JMP EXPL ERRONEOUS REPLY - EXPLAIN AND ASK AGAIN LDA D3 FROM-TO COPY RSS QDSC6 LDA D2 UNIT COPY STA COTYP LDB SDTYP SOURCE DISC TYPE? CPB D7900 7900? RSS YES JMP QDSC2 NO CPA D3 FROM-TO COPY? JMP FRMTO YES JMP TMT01 NO, UNIT COPY, BUILD 7900 TRACK MAP TABLE * * DISC IS 7905 OR 7920 QDSC2 LDB SUNIT FIND DISC TYPE BY PULLING STATUS JSB STAT5 STA SDTYP GET DISC TYPE JSB MSINS CONFIGURE EXPL MESGS FOR DISC TYPE JSB QUERY FIND SYSTEM TYPE DEF MSG7 RTE OR DOS DISC? DEF D8 DEF EXP7 REPLIES ARE: RT,DO DEF D9 LDB RBUF CPB RT JMP QDSC1 RTE DISC CPB DO JMP DOS DOS DOSC JMP EXPL EXPLAIN AND ASK AGAIN QDSC1 CLA SYSTEM TYPE=0 FOR RTE STA SYSTP LDA COTYP COPY TYPE? CPA D3 FROM-TO COPY? JMP FRMTO YES JSB QUERY YES, RTE DISC DEF MSG6 WANT TRACK SPARING? DEF D10 DEF EXP6 REPLY YES OR NO DEF D10 LDB RBUF CPB YE JMP TRKSP YES, ASK FOR TRACK MAP INFO FOR SOURCE DISC UNIT * TRACK MAP INFO ( DEFAULT ) FOR UNIT COPY CLA,INA STA AMAP1,I # OF SUBCHANNELS IS 1 LDA AUNIT ADDR OF START OF TRCK MAP TBL LIST LDB SDTYP SOURCE DISC TYPE? CPB D7905 7905A? JMP QMOVE YES, THEN MOVE INTO ATB32 CPB D7906 7906? ADA D3 YES, TRCK MAP TBL STARTS AT AUNIT+3 CPB D7920 7920? ADA D6 YES,TRCK MAP TBL STARTS AT AUNIT+6 CPB D7925 ADA D9 QMOVE LDB ATB32 JSB .MVW MOVE 3 WORDS FOR TRCK MAP TABLE DEF D3 NOP JMP RQDSC RETURN * * TRACK MAP INFORMATION * * TRKSP CLA STA SYSTP JSB WRITE SEND MESSAGE TO TTY DEF MSG8 ENTER FOLL. TM INFO. FOR SOURCE UNIT ONLY DEF D28 JSB DSETU BUILD TRACK MAP TABLE FOR 7905 SOURCE DISC UNIT JMP RQDSC RETURN * DOS LDA D1 STA SYSTP SYSTP=1 FOR DOS SYSTEM LDA COTYP COPY TYPE? CPA D3 FROM-TO COPY? JMP FRMTO YES ****ENTER TRACK MAP INFO FOR DOS DISC JSB QUERY DEF MSG32 # OF SUBCHNLS TO BE COPIED? DEF D14 DEF EXP32 REPLY 1 TO 3 DEF D6 JSB CVTST CONVERT # OF SUBCHNLS TO DECIMAL & TEST DEF D1 ITS VALIDITY DEF NSUB DEF N4 LDA NSUB NSUB HAS # OF SUBCHNLS SZA,RSS JMP EXPL IT IS 0, EXPLAIN AND ASK AGAIN ALS MULTIPLY BY 2 ADA NSUB A REG HAS NSUB*3 INA STA TEMP TEMP HAS # WORDS TO BE MOVED IN TMT LDB NSUB CMB,INB MAKE #SBCHNLS -VE TO INDICATE LDA ADOSM TRACK SPARING IS DESIRED STB A,I # OF SUBCHNLS ENTERED IN TRCK MAP TBL LDB ATB32 ADDRESS OF BEGINNING OF $TB32 ADB N1 TRACK MAP TABLE JSB .MVW MOVE TEMP # WORDS FROM DOS MAP TO $TB32 DEF TEMP NOP JMP RQDSC RETURN * *FROM-TO COPY TO BE MADE * FRMTO LDA D3 STA COTYP COPY TYPE IS 3 LDA SDTYP CPA D7900 DISC TYPE 7900? JMP FRMT1 YES LDA IFLAG DOING DEST DISC QUERY? SZA,RSS JMP FRMT7 NO JSB QUERY YES DEF MSG9B TO CYLINDER#? DEF D7 DEF EXP9 REPLY 0 TO 410 (OR 821) DEF D7 JMP FRMT6 FRMT7 JSB QUERY DISC IS 7905 DEF MSG9 FROM CYLINDER #? DEF D8 DEF EXP9 REPLY 0 TO 410 (OR 821) DEF D7 FRMT6 JSB CVTST DEF D2 DEF FCYL CONVERT AND TEST CYLINDER # DEF C1 LDA IFLAG SZA DO NOT DO FOLLOWING IF QUERYING FOR DEST DISC JMP FRMT5 FOR FROM - TO COPY LDA SYSTP SZA RTE DISC? JMP FRDOS NO DOS DISC JSB QUERY DEF MSG10 # OF TRACKS? DEF D6 DEF EXP10 REPLY 1 TO 1233(OR 4111) DEF D8 JSB CVTST CONVERT AND TEST IF # OF TRACKS IS BET 0-1233 DEF D2 DEF NTRCK # OF TRACKS DEF C2 LDA NTRCK SZA,RSS = 0? JMP EXPL YES EXPLAIN AND ASK AGAIN JMP FRMT5 FRDOS JSB QUERY DEF MSG10 # OF TRACKS? DEF D6 DEF EX10B REPLY 1 TO 200 DEF D7 JSB CVTST CONVERT AND TEST DEF D2 DEF NTRCK DEF N201 LDA NTRCK SZA,RSS # OF TRACKS = 0? JMP EXPL YES, EXPLAIN AND ASK AGAIN ALS NTRCK*2 STA NTRCK FRMT5 JSB QUERY DEF MSG11 NUMBER OF SURFACES? DEF D7 DEF EXP11 REPLY 1 TO 3(OR 5) DEF D6 JSB CVTST CONVER AND TEST DEF D1 DEF NSRFC DEF C3 LDA NSRFC SZA,RSS # OF SURFACES = 0? JMP EXPL YES, EXPLAIN AND ASK AGAIN JSB QUERY DEF MSG12 STARTING HEAD#? DEF D8 DEF EXP12 REPLY 0 TO 2(OR 4) DEF D6 JSB CVTST CONVERT AND TEST DEF D1 DEF STRTH STARTING HEAD DEF C4 * BUILD TRACK MAP TABLE FOR FROM-TO COPY LDA IFLAG QUERYING DEST DISC FOR FROM-TO COPY? SZA JMP FRM15 YES LDB ATB32 NO ADB N1 RSS FRM15 LDB AFRMP ADDRESS OF TMT FOR DEST SUBCHNL FOR FR-TO COPY LDA D1 STA B,I INB LDA FCYL STA B,I FROM CYLINDER STORED IN TMT LDA NSRFC # OF SURFACES ALF ROTATE TO BRING THEM TO BIT 3 ADA STRTH ADD STARTING HEAD# ALF,ALF NOW BITS 12-15 IS # SURFACES,BITS 8-11 HEAD# ADA DUNIT BITS 0-3 UNIT # INB STA B,I STORE INTO TRACK MAP TABLE LDA NTRCK # OF TRCKS INB STA B,I STORE IN TMT JMP RQDSC RETURN * * DISC IS 7900 FRMT1 LDA IFLAG QUERYING DEST DISC FOR FROM-TO COPY? SZA,RSS JMP FRM20 NO JSB QUERY YES DEF MSG9C TO TRACK#? DEF D5 DEF EXP9A REPLY O TO 202 DEF D7 JMP FRM21 * FRM20 JSB QUERY DEF MSG9A FROM TRACK #? DEF D7 DEF EXP9A REPLY 0 TO 202 DEF D7 FRM21 JSB CVTST CONVERT AND TEST DEF D2 DEF FTRCK DEF N203 FRMT2 LDA IFLAG QUERYING DEST DISC FOR FROM-TO COPY? SZA,RSS JMP FRM10 NO LDB ATB31 YES, THEN FIND # OF TRACKS READ FROM SOURCE DISC ADB D8 LDA B,I SZA IS IT 0 FOR SUBCHNL 0? JMP FRM12 NO, THEN THIS IS IT INB YES , THEN SUBHNL 1 MUST BE THE RIGHT ONE LDA B,I FRM12 STA NTRCK JMP FRM11 TEST IF LAST TRACK IS WITHIN BOUNDS FRM10 JSB QUERY DEF MSG10 # OF TRACKS DEF D6 DEF EX10A REPLY 1 TO (203-FROM TRACK#) DEF D14 JSB CVTST CONVER AND TEST IF # TRCKS IS BET 0 AND 203 DEF D2 DEF NTRCK DEF N204 LDA NTRCK SZA,RSS = 0? JMP EXPL YES EXPLAIN AND TRY AGAIN FRM11 ADA FTRCK TEST IF LAST TRACK TOO LARGE ADA N204 SSA JMP FRMT3 LST TRCK IS WITHIN BOUNDS JSB WRITE DEF ERR5 LAST TRACK TOO LARGE DEF D10 LDA IFLAG SZA JMP FRMT1 QUERYING DEST DISC FOR FROM-TO COPY JMP FRMT2 ASK QUESTION AGAIN FRMT3 JSB QUERY DEF MSG13 PLATTER #? DEF D5 DEF EXP13 REPLIES ARE: 0,1 (0-FIXED,1-REMOVABLE) DEF D19 JSB GINIT CONVERT TO DECIMAL LDA N2 -VE CHARACTER COUNT FOR CONVERSION TO DECIMAL JSB GETOC JMP EXPL ERROR RETURN LDB IFLAG SZB,RSS QUERYING DEST DISC FOR FRM-TO COPY? JMP FRM25 NO STA DPLTR DEST PLATR # FOR FROM TO COPY STA DSUB# DEST SUB# FOR FROM-TO COPY SZA TEST IT CPA D1 JMP RQDSC RETURN BECAUSE IT IS 0 OR 1 JMP EXPL ERROR TRY AGAIN FRM25 STA PLATR SZA,RSS 0? JMP TMT00 YES CPA D1 = 1? JMP TMT00 YES JMP EXPL EXPLAIN AND ASK AGAIN * CONSTRUCT TRACK MAP TABLE FOR 7900 FROM-TO OR UNIT COPY TMT01 LDA D203 # OF TRACKS FOR UNIT COPY STA NTRCK CLA FIRST TRACK FOR UNIT COPY IS 0 STA FTRCK STA SUB# FIRST SUBCHNL FOR UNIT COPY IS 0 STA PLATR JMP TMT03 TMT00 LDA PLATR SUB# FOR FROM-TO COPY STA SUB# TMT03 CLA CLEAR TMT LDB ATB31 STA B,I INB STA B,I ADB D7 STA B,I INB STA B,I TMT02 LDA ATB31 ADA SUB# POINT TO 0 OR 1 SUBCHNL PART IN TMT LDB FTRCK FIRST TRACK STB A,I STORE IN TMT ADA D8 LDB NTRCK STB A,I STORE # OF TRACKS LDA SUB# SZA SUB# = 1? JMP RQDSC YES, THEN DONE LDA COTYP NO, THEN UNIT COPY? CPA D2 RSS JMP RQDSC NO, RETURN ISZ SUB# YES, MAKE ENTRIES FOR NEXT SUBCHNL JMP TMT02 * * IF TASK IS SAVE-RETURN, IF TASK IS COPY WORK ON DEST SBCHNL * RQDSC LDA IFLAG WAS QUERYING DEST DISC FOR FROM-TO COPY? SZA,RSS JMP RQDS1 NO CLA YES THEN CLEAR FLAG STA IFLAG JMP QDISC,I RETURN RQDS1 LDA TASK SZA,RSS SAVE? JMP QDISC,I YES - RETURN * DESTN DLD DEST SET UP MESSAGE TO SHOW DST MSG4 'DEST DISC CHANNEL#?' DST MSG21 'DEST DISC DRIVE#?' LDA DEST+2 STA MSG4+2 STA MSG21+2 LDA TASK CPA D2 TASK IS COPY? JMP DEST2 YES, THEN DONT QUERY DEST DISC CHANL # JSB QCHNL WORK ON DESTINATION DISC DEF MSG4 DEST DISC CHANNEL#? DEF D11 LDA CHANL STA DCHNL JSB DCNFG CONFIGURE DEST DISC CHANNEL DEST2 JSB QUNIT QUERY DEST DISC TYPE AND UNIT # DEF MSG21 QUERY DEST DISC UNIT # DEF D10 LDA DTYPE DISC TYPE IS 7900? CPA D7900 JMP DEST3 YES, THEN DO NOT GET STATUS LDB DUNIT DESTINATION DISC UNIT# JSB STAT5 FIND DEST DISC TYPE STA DTYPE JSB MSINS CONFIGURE EXPL MESSAGES DEST3 LDA COTYP CPA D3 FROM - TO COPY? RSS JMP QDISC,I RETURN CLA,INA YES STA IFLAG SET IFLAG TO INDICATE QUERYING DEST DISC JMP FRMTO FOR FROM TO COPY * PLATR DEC 0 DPLTR NOP DSUB# NOP NTRCK NOP FTRCK NOP FCYL NOP STRTH NOP NSRFC NOP COTYP NOP DO ASC 1,DO RT ASC 1,RT UN ASC 1,UN FR ASC 1,FR D203 DEC 203 N201 DEC -201 N203 DEC -203 N204 DEC -204 AUNIT DEF *+1 DEC 0 OCT 30000 DEC 1233 * DEC 0 .4000 OCT 40000 DEC 1644 * DEC 0 OCT 50000 DEC 4115 * DEC 0 OCT 110000 DEC 7407 * FRMAP BSS 4 AFRMP DEF FRMAP DOSMP DEC -3 DEC 0 M0100 OCT 10000 D400 DEC 400 DEC 0 OCT 10400 DEC 400 DEC 0 OCT 11000 DEC 400 ADOSM DEF DOSMP * * * STAT5 - ROUTINE TO PULL STATUS FOR SOURCE 7905,7905B OR 7920 * SOURCE UNIT & DETERMINE DISC TYPE FROM BITS 9-12 OF * STATUS WORD 2 * BITS 9-12 = 0 THEN 7905B * = 1 THEN 7920 * = 2 * = 3 7925A * CALLING SEQUENCE: JSB STAT5 * B REG = SOURCE UNIT # * RETURNS: A REG = SOURCE DISC TYPE * * STAT5 NOP LDA STACC CONFIGURE STATUS REQUEST COMMAND AND .1777 CLEAR BITS 0-5 ADA B ADD SOURCE UNIT # STA STACC ST5T2 JSB $LIBR TURN OFF INTERRUPTS NOP CLF 0 JSB STATW ROUTINE TO BRING STATUS JSB INT5N CPB .1002 DISC NOT READY? JMP ST5T1 YES, THEN SEND MESSAGE LSL 3 B REG HAS STATUS WORD 2 CLA BRING BITS 9-12 OF B REG INTO A REG RRL 4 A REG HAS SOURCE DISC TYPE JMP STAT5,I RETURN ST5T1 JSB WRITE SEND 'READY DISC ' MESSAGE DEF MS4 DEF D5 JSB PAUSE JMP ST5T2 TRY AGAIN * .1002 OCT 100002 * * * MSINS - ROUTINE TO MOVE APPROPRIATE BOUNDARY PARAMETERS * INTO A COMMON BUFFER AREA FOR 7905A,7905B OR * 7920 DISCS. ROUTINE CONFIGURES EXPANATION * MESSAGES FOR THESE PARAMETERS * CALLING SEQUNCE: JSB MSINS * A REG = DISC TYPE * * MSINS NOP LDB TST05 START OF PARAMETER LIST CPA D7906 A REG HAS DISC TYPE ADB D10 7905B DISC,PARM LIST IS TST05+10 CPA D7920 7920? ADB D20 YES,PARM LIST IS TST05+20 CPA D7925 ADB D30 LDA B TRANSFER SOURCE ADDRESS INTO A REG LDB AJB DESTINATION ADDRESS JSB .MVW MOVE 10 WORD PARAMETER LIST DEF D10 NOP DLD C5 SET UP EXLANATION MESSAGES DST EXP9+5 DST EXMS3+11 DLD C6 DST EXP10+6 DST EXMS3+6 LDA C7 STA EXP12+5 STA EXMS3+16 LDA C8 STA EXP11+5 STA EXMS3+20 JMP MSINS,I RETURN * * * QDUTP - ROUTINE TO QUERY DISC TYPE & DISC DRIVE (UNIT) # * AND TEST BOTH VALUES * CALLING SEQUENCE: JSB QDUTP * DEF MSGX MESSAGE TO ASK FOR DISC TYPE * DEF DX LENGTH OF MESSAGE * DEF MSGY MESSAGE TO ASK FOR DISC DRIVE # * DEF DY LENGTH OF MESSAGE * RETURNS: DISC TYPE IN DTYPE & DISC DRIVE # IN DUNIT * * QDUTP NOP LDA D96 INIT #SECT TO 96 STA #SECT LDA D6144 STA TKSIZ LDA QDUTP,I FETCH MESG ADDR TO QUERY DISC TYPE STA TEMP1 ISZ QDUTP LDA QDUTP,I FETCH MESG LENGTH LDA A,I ACTUAL VALUE IN A REG STA TEMP2 JSB QUERY DEF TEMP1,I XXXX DISC TYPE? DEF TEMP2 DEF EXP5 REPLIES ARE:7900,7905,7906,7920,7925 DEF D19 JSB GINIT CONVERT DISC TYPE FROM ASCII TO INTEGER LDA N4 JSB GETOC CONVERT JMP EXPL ERROR RETURN STA DTYPE CPA D7900 7900 DISC? JMP QDUT1 YES FIND DRIVE # CPA A7905 7905? JMP QDUT1 YES CPA A7906 7906? JMP QDUT1 YES CPA A7925 7925? JMP #7925 CPA A7920 7920? JMP QDUT1 JMP EXPL NO, EXPLAIN AND ASK AGAIN * #7925 LDA D128 STA #SECT LDA D8192 STA TKSIZ * FIND UNIT # FOR DISC QDUT1 ISZ QDUTP FETCH NEXT TWO PARAMETERS JMP QUNT1 QUNIT NOP 2ND ENTRY POINT TO FIND UNIT # ONLY LDA QUNIT SET UP RETURN ADDRESS STA QDUTP QUNT1 LDA QDUTP,I STA TEMP1 MESG ADDR TO ASK FOR DISC DRIVE# ISZ QDUTP LDA QDUTP,I LDA A,I MESG LENGTH IN A REG STA TEMP2 LDA DTYPE DISC TYPE? CPA D7900 7900? RSS JMP QUNT2 NO 7905 OR 7920 * QUERY FOR 7900 DISC UNIT# JSB QUERY DEF TEMP1,I XXXXX DISC DRIVE#? DEF TEMP2 DEF EX21A REPLY 0 TO 3 DEF D6 JSB CVTST CONVERT AND TEST FOR VALIDITY OF RESPONSE DEF D1 DEF DUNIT IS UNIT# < 4 & >= 0? DEF N4 JMP RQDUT RETURN * QUERY FOR 7905 DISC UNIT# QUNT2 JSB QUERY DEF TEMP1,I UNIT#? DEF TEMP2 DEF EXP21 REPLY 0 TO 7 DEF D6 JSB CVTST CONVERT UNIT# FROM ASCII TO DECIMAL DEF D1 AND TEST IF < 8 & >= 0 DEF DUNIT DEF N8 * RETURN RQDUT ISZ QDUTP JMP QDUTP,I RETURN * DTYPE NOP SDTYP NOP N8 DEC -8 D7900 DEC 7900 D7905 DEC 2 D7920 DEC 1 D7906 DEC 0 D7925 DEC 3 A7905 DEC 7905 A7920 DEC 7920 A7906 DEC 7906 A7925 DEC 7925 * * * QTASK - ROUTINE TO FIND TASK TO BE PERFORMED * * QTASK NOP CLA STA TASK INITIALIZE TASK TO 0 JSB QUERY DEF MSG2 TASK? DEF D3 DEF EXP2 REPLIES ARE: SAVE,RESTORE,COPY DEF D13 LDA RBUF CPA SA TASK IS SAVE? JMP QTASK,I YES, TASK=0 FOR SAVE CPA RE RESTORE? JMP QRSTR YES CPA RW JMP $REW CPA CO COPY? RSS JMP EXPL NO, EXPLAIN AND ASK AGAIN LDA D2 TASK = 2 FOR COPY STA TASK RSS QRSTR ISZ TASK TASK=1 FOR RESTORE JMP QTASK,I RETURN * $REW JSB REWND JMP QTASK+1 TASK DEC 0 SA ASC 1,SA RE ASC 1,RE CO ASC 1,CO RW ASC 1,RW * * * DCNFG - ROUTINE TO CONFIGURE DISC CHANNEL * * DCNFG NOP LDA DTYPE DISC TYPE? CPA D7900 7900? RSS JMP C7905 NO * CONFIGURE 7900 DISC LDA I#OTC END OF INSTRUCTION LIST LDB LST1 BEGINNING OF INSTRUCTION LIST JSB DCHCN CONFIGURE DATA CHANNEL ISZ CHANL CONFIGURE COMMAND CHANNEL LDA I#OTE LDB LST2 BEG OF INST LIST JSB DCHCN JMP DCNFG,I RETURN * CONFIGURE 7905 DISC C7905 LDA I/OTC END OF INST LIST LDB LST3 BEG OF INST LIST JSB DCHCN JMP DCNFG,I RETURN * * * POSN - ROUTINE TO POSITION MAG TAPE AT DESIRED FILE# BET 1-8 * CALLING SEQUENCE: JSB POSN * * POSN NOP LDA FILEN FILEN IS 0? SZA JMP POSN2 NO THEN POSITION TO FILE# IN FILEN POSN1 JSB QUERY DEF MSG16 MT FILE#? DEF D5 DEF EXP16 REPLY 1 TO 8 DEF D6 JSB CVTST DEF D1 CONVERT FILE# FROM ASCII TO DECIMAL DEF FILEN AND TEST IF 0FILEN > 0 & <= 8 DEF N9 LDA FILEN FILEN=0? SZA,RSS ISZ FILEN YES, DEFAULT = 1 * REWIND MAG TAPE POSN4 JSB MTNR MAG TAPE READY? JSB REWND REWIND MAG TAPE * POSITION MAG TAPE LDA FILEN CPA D1 IF FILEN=1, THEN ALREADY POSITIONED JMP POSN,I SO RETURN ADA N1 # OF EOF MARKS TO BE FOUND CMA,INA NEGATE VALUE STA PTEMP LOOPF LDA MTLU SET UP CONTROL WORD FOR DYNAMIC STATUS REQ ADA .600 STA TEMP1 JSB EXEC DEF *+3 DEF D3 DEF TEMP1 SLA IS MAG TAPE STILL REWINDING? JMP LOOPF YES, THEN WAIT FOR IT TO COMPLETE LDA D3 SET UP REQUEST CODE SO THAT ERRORS ARE RETURNED ADA MSIGN TO THE UTILITY PROGRAM STA TEMP1 LDA MTLU SET UP CONTROL WORD FOR FORWARD SPACE I FILE CMND ADA .1300 STA TEMP2 JSB EXEC DEF *+3 DEF TEMP1 DEF TEMP2 FORWARD SPACE 1 FILE JMP ERPOS ERROR RETURN LDA MTLU SET UP CONTROL WORD FOR DYNAMIC STATUS REQUEST ADA .600 STA TEMP1 JSB EXEC DEF *+3 DEF D3 EOT SEEN? DEF TEMP1 AND .40 EOT BIT = 1 IN STATUS WORD? CPA .40 JMP ERPOS YES ERROR - FILE NOT FOUND ISZ PTEMP NO NEXT FILE TO BE FORWARDED? JMP LOOPF YES JMP POSN,I NO - MT IS POSITIONED - RETURN * POSN2 LDA SVTPN WAS LAST TAPE# = 1? CPA D1 RSS YES, THEN BACKSPACE TO THIS FILE JMP POSN4 NO, THEN POSITION FROM BEGINING OF TAPE LDA FILEN JUST WANT TO BACKSPACE TO BEGINING OF THIS FILE CPA D1 IS FILE#=1? JMP POSN3 YES THEN JUST REWIND LDA .200 SET UP FUNCTION WORD FOR ADA MTLU BACK SPACING ONE RECORD (EOF RECORD) STA TEMP1 JSB EXEC BACK SPACE ONE RECORD DEF *+3 DEF D3 DEF TEMP1 LDA .1400 SET UP FUNCTION WORD FOR BACKSPACING 1 FILE ADA MTLU STA TEMP1 JSB EXEC BACK SPACE ONE FILE DEF *+3 DEF D3 DEF TEMP1 LDA .300 SET UP FUNCTION WORD TO FORWARD SPACE ONE RECORD ADA MTLU STA TEMP1 JSB EXEC FORWARD SPACE ONE RECORD (EOF OF PREVIOUS FILE) DEF *+3 DEF D3 DEF TEMP1 JMP POSN,I RETURN POSN3 JSB REWND FILE # = 1 JMP POSN,I RETURN * ERROR - FILE NOT FOUND ERPOS JSB REWND REWIND MAG TAPE JSB WRITE DEF ERR1 FILE NOT FOUND DEF D7 JMP POSN1 ASK AGAIN * FILEN NOP PTEMP NOP N9 DEC -9 .400 OCT 400 .200 OCT 200 .300 OCT 300 .1400 OCT 1400 * * * REWND - ROUTINE TO REWIND MAG TAPE * CALLING SEQUENCE: JSB REWND * * REWND NOP LDA MTLU ADA .400 SET UP CONTROL WORD FOR REWIND STA TEMP1 JSB EXEC REWIND MAG TAPE DEF *+3 DEF D3 DEF TEMP1 JMP REWND,I RETURN * * * PRNTH - ROUTINE TO READ AND PRINT HEADER RECORD FROM MT FILE * CALLING SEQUENCE: JSB PRNTH * DEF HEADR ADDR OF BUFFER TO HOLD HEADER RECORD * RETURN: TO LOC P IF NORMAL RETURN * TO LOC P+1 OTHERWISE * * PRNTH NOP LDA PRNTH,I STA TEMP ADDR OF BUF FOR HEADER RECORD JSB EXEC DEF *+5 READ HEADER RECORD FROM MAG TAPE DEF D1 DEF MTLU DEF TEMP,I DEF D140 HEADER RECORD IS 140 WORDS LONG JSB WRITE DEF FILID FILE ID: DEF D4 JSB WRITE DEF TEMP,I PRINT TITLE FROM FIRST 36 WORDS OF HEADER DEF D36 LDA TEMP ADA D36 POINT TO TAPE# LDA A,I TAPE # IN A REG STA TEMP SAVE TAPE## JSB DCASC CONVERT TAPE# FROM DECIMAL TO ASCII DEF *+4 DEF TAPE#+4 DEF D1 DEF TEMP JSB WRITE TAPE#: XX DEF TAPE# DEF D5 JSB QUERY DEF OK OK? DEF D2 DEF EXP6 REPLY YES OR NO DEF D10 LDA RBUF CPA YE IS IT OK? JMP RPRNT YES - NORMAL RETURN TO P ISZ PRNTH NO - RETURN TO P+1 RPRNT ISZ PRNTH JMP PRNTH,I RETURN * FILID ASC 4,FILE ID: TAPE# ASC 5,TAPE#: XX OK ASC 2,OK? * * * PAUSE - ROUTINE TO WAIT FOR USER TO TAKE ACTION ASKED BY * UTILITY AND RESTART UTILITY BY TYPIN 'GO' * CALLING SEQUENCE: JSB PAUSE * * PAUSE NOP JSB WRITE DEF MSG27 RSTRT UTILITY BY ENTERING 'GO' DEF D16 PAUS1 JSB READ READ RESPONSE LDA RBUF CPA GO 'GO'? JMP PAUSE,I YES,RETURN JMP PAUS1 NO, WAIT FOR 'GO' RESPONSE * GO ASC 1,GO * * * QUERY - ROUTINE TO ASK QUESTION, READ RESPONSE, * EXPLAIN IF NECESSARY, AND ASK AGAIN * CALLING SEQUENCE: JSB QUERY * DEF MSG MESSAGE ADDRESS * DEF DN MESSAGE LENGTH * DEF EXP EPLANATION MESSAGE ADDRESS * DEF DN " " LENGTH * RETURNS: RESPONSE IN RBUF * * QUERY NOP QURY1 LDA QUERY LEAVE RETURN ADDRESS IN QUERY STA SAVEQ LDA A,I GET MESSAGE ADDRESS JSB RMOVI REMOVE INDIRECTS STA QTMP1 ISZ SAVEQ LDA SAVEQ,I GET MESSAGE LENGTH STA QTMP2 JSB WRITE WRITE MESSAGE ON USER TTY DEF QTMP1,I ADDR OF MESSAGE AND MESG LENGTH ADDRESSES DEF QTMP2,I ISZ SAVEQ POINT TO EXPLANATIOON MESSAGE PARM JSB READ READ USER RESPONSE FROM TTY LDA RBUF CPA QUES "??"? JMP EXPL YES - USER NEEDS HELP IN ANSWERING LDA QUERY NO - RETURN ADA D4 JMP A,I B REG HAS # OF WORDS IN RESPONSE * EXPLANATION REQUIRED EXPL LDA SAVEQ,I EXPLANATION MESSAGE ADDRESS STA QTMP1 ISZ SAVEQ LDA SAVEQ,I EXPLANATION MESSAGE LENGTH STA QTMP2 JSB WRITE DEF QTMP1,I DEF QTMP2,I JMP QURY1 ASK AGAIN AND READ RESPONSE AGAIN * QUES ASC 1,?? SAVEQ NOP QTMP1 NOP QTMP2 NOP * * * READ - ROUTINE TO READ USER RESPONSE FROM TTY * CALLING SEQUENCE: JSB READ * RETURNS: REPONSE IN RBUF, # OF WORDS IN REPONSE IN B REG * * READ NOP LDA N36 STA RCNT COUNTER LDA SPACE LDB ARBUF ADDRESS OF READ BUFFER STA B,I STORE 0 IN RBUF INB ISZ RCNT JMP *-3 JSB EXEC DEF *+5 DEF D1 DEF RITLU ITLU+400B DEF RBUF DEF D36 READ 36 WORDS FROM TTY LDA RBUF CPA AB USER WANTS TO ABORT PROGRAM? JMP EXITU YES JMP READ,I NO - RETURN * RBUF EQU LABEL+90 ARBUF DEF RBUF RITLU OCT 401 AB ASC 1,AB SPACE ASC 1, N36 DEC -36 RCNT NOP * * * WRITE - ROUTINE TO WRITE MESSAGES ON TTY * CALLING SEQUENCE: JSB WRITE * DEF MSG MESSAGE * DEF DN LENGTH OF MESSAGE * * WRITE NOP LDA WRITE,I GET FIRST PARAMETER-MESSAGE ADDR JSB RMOVI STA WTMP1 ISZ WRITE LDA WRITE,I GET 2ND PARAMETER-MESSAGE LENGTH JSB RMOVI STA WTMP2 JSB EXEC WRITE MESSAGE ON TTY DEF *+5 DEF D2 DEF ITLU DEF WTMP1,I MESSAGE DEF WTMP2,I MESSAGE LENGTH ISZ WRITE RETURN ADDRESS JMP WRITE,I RETURN * WTMP1 NOP WTMP2 NOP * * * CVTST - ROUTINE TO CONVERT ASCII TO DECIMAL AND TEST IF VALUE * IS >= 0 & <= UPPER LIMIT SUPPLIED BY CALLING ROUTINE * CALLING SEQUENCE: JSB CVTST * DEF # OF CHARACTERS IN BUFFER TO BE CONVERTED * DEF VARIABLE HOLD CONVERTED DEC VALUE * DEF -(UPPER LIMIT+1) * * CVTST NOP LDA CVTST,I FETCH ADDR OF FIRST PARAMETER LDA A,I # OF CHAR IN BUF TO BE CONVERTED STA NCHAR JSB GINIT CONVERT ASCII TO DECIMAL LDA NCHAR ALS A REG HAS # OF CHARACTERS TO BE CONVERTED CMA,INA -VE FOR DECIMAL CONVERSION JSB GETOC CONVERT JMP EXPL ERROR RETURN STA NUMBR DECIMAL #, NOW TEST IT ISZ CVTST GET ADDRESS OF SECOND PARRAMETER LDB CVTST,I ADDR OF SECOND PARAMETER STA B,I STORE DEC VALUE IN 2ND PARAMETER SSA CONVERTED VALUE < 0? JMP EXPL YES, EXPLAIN AND ASK FOR RESPONSE AGAIN ISZ CVTST LDB CVTST,I ADDR OF 3RD PARAMETER LDB B,I -(UPPER LIMIT+1) ADA B VALUE > UPPER LIMIT? SSA,RSS JMP EXPL YES, EXPLAIN AND ASK AGAIN ISZ CVTST JMP CVTST,I RETURN * NCHAR NOP NUMBR NOP * * * V6144 - ROUTINE TO DETERMINE IF SIZE OF PHYSICAL MEMORY IS LARGE * ENOUGH TO ENABLE VERIFY WITH 6144 WORD BUFFER SIZE * CALLING SEQUENCE: JSB V6144 * RETURN: A REG = 0 IF 6144 WORD BUF VERFIFY NOT POSSIBLE * =1 OTHERWISE * * V6144 NOP JSB $LIBR TURN OFF ALL INTERRUPTS NOP AND MEMORY PROTECT FENCE CLF 0 LDA LWA24 CHANGE LWA MEM OF BG PART IN BASE PAGE STA BGLWA TO INDICATE BG PART SIZE IS 24K LDA PATRN PATTERN OF 177777 TO WRITE IN LOC 57777 LDB LWA24,I SAVE ORIGINAL CONTENTS STA LWA24,I LOC 57677 LDA LWA24,I READ THE CONTENTS OF LOC STB LWA24,I STORE BACK CONTENTS CPA PATRN COMPARE, IF AREG = PATRN THEN MEM SIZE>=24K RSS JMP V2048 MEM NOT LARGE ENOUGH TO HOLD 2 6144 WORD BUFS JSB INTON LEAVE THE BASE PAGE LOC OF BG LWA AT 57777 LDA XEQT ID SEGMENT OF THIS UTILITY JSB COR.A FIND FIRST WORD AVAILABLE OF FREE MEM STA AVBUF ADDR OF 2ND BUF FOR VERIFY IF BUF SIZE=6144 CLA,INA RETURN WITH A REG = 1 JMP V6144,I RETURN * VERIFY NOT POSSIBLE WITH BUFFER SIZE OF 6144 WORDS V2048 LDA LWA16 CHANGE LWA TO 16K STA BGLWA STORE IT IN BASE PAGE LOCATION JSB INTON TURN ON INTERRUPTS AND MEM PROTECT FENCE CLA RETURN WITH A REG = 0 JMP V6144,I RETURN * AVBUF NOP XEQT EQU 1717B LWA24 OCT 57677 LWA OF 24K MEM LWA16 OCT 37677 LWA OF 16K MEM BGLWA EQU 1777B LWA IN BG MEM PATRN OCT 177777 * * * NSPRS - ROUTINE TO FIND # OF SPARES FOR A GIVEN SUBCHANNEL(SUB#) * CALLING SEQUENCE: JSB NSPRS * ASSUMED THAT SUB# HAS SUBCHANNEL # * RETURNS: A REG WITH # OF SPARES FOR SUB# * * NSPRS NOP CLA CLEAR IFLAG STA IFLAG LDA D411 INITIALIZE POSSIBLE # OF SPARES STA NSPTR LDA SUB# LDB ADR ADDR OF TABLE WITH HD#,CYL#,#SRFCES,HEAD BUF INFO JSB ABSAD TO BE SUPPLIED BY ABSAD ROUTINE LDA SUB# FIND ENDING CYL# AND HEAD# ALS MULTIPLY BY 2 ADA SUB# SUB#*3 ADA ATB32 7905 TRACK MAP TABLE STA DIST2 ADDR OF TM INFO FOR SUB# ADA D2 A REG POINTS TO # OF TRACKS IN SUB# LDA A,I A REG HAS # OF TRACKS ADA N1 LAST TRACK IN SUB# LDB DIST2 JSB DADTR FIND ABSOLUTE ADDR OF LAST TRACK IN SUB# LDA PT#TR CYLINDER # RETURNED IN A REG STA ECYL END CYLINDER FOR SUB# BLF,BLF MOVE HEAD# TO LOW HALF STB EHEAD HEAD# FOR LAST TRACK * * # OF SPARES IS DETERMINED BY GOING THROUGH AND COMPARING * FISRT AND LAST CYLINDERS AND # OF SURFACES COVERED BY SUB# * AND ALL SUBCHANNELS ON SAME UNIT AS SUB# * LDA NSUB IF THERE IS ONLY ONE SUBCHANNEL DEFINED CPA D1 CALCULATE # OF SPARES JMP NSPR4 CLA STA SUB FIRST SUBCHANNEL IS 0 NSPR1 CPA SUB# IS IT SUB#? JMP NSPR9 YES, THEN LOOK AT NEXT SUBCHANNEL LDB ADR1 TABLE ADDRESS FOR ABSOLUTE TRACK ADDRESS AND JSB ABSAD HEAD BUFFER FOR SUB LDA UNIT UNIT#'S FOR THE 2 SUBCHNLS SAME? CPA UNIT1 RSS JMP NSPR9 NO, THEY ARE DIFFERENT - TRY NEXT SUBCHNL LDA ECYL YES, COMPARE END CYL OF SUB# AND FIRST CPA SCYL1 CYL OF SUB - ARE THEY THE SAME? JMP NSPEQ YES CMA,INA NO THEN FIRST CYL OF SUB < ENC CYL OF SUB#? ADA SCYL1 SSA IF NEGATIVE YES JMP NSPLT YES ADA N1 STA NSPCL POSSIBLE # OF SPARE CYLINDERS JSB SMHED BOTH SUBCHANNELS HAVE ANY SURFACE IN COMMON? SZA,RSS JMP NSPR4 NO,THEN CALCULATE # SPARE CYL AGAIN CCA YES,SET FLAG TO CALCULATE SP TRKS BET FIRST STA IFLAG HEAD OF SUB# AND SUB JMP NSP12 DO NOT RE-CALCULATE # OF SPARE CYL NSPR4 LDB ECYL NO,END CYLINDER OF SUB# CMB,INB ADB D410 410-ECYL=POSSIBLE # OF SPARE CYLINDERS LDA SDTYP SOURCE DISC TYPE? CPA D7925 = 7925? RSS CPA D7920 7920? ADB D412 YES,THEN POSSIBLE # SPARE CYL=822-ECYL STB NSPCL NSP12 CLA CALCULATE # SPARES ON ECYL BETWEEN STA TEMP EHEAD AND LAST SURFACE # LDB EHEAD NSPR6 CPB D8 IS IT THE LAST SURFACE? JMP NSPR3 YES INB NO, CHECK NEXT SURFACE LDA AHD GET VALUE OF NEXT ENTRY IN HEAD BUFFER ADA B LDA A,I SZA IS IT INCLUDED FOR THIS SUBCHNL? ISZ TEMP YES, INCREMENT EXTRA # SPARES BY 1 JMP NSPR6 TRY FOR NEXT SURFACE NSPR3 ISZ IFLAG WAS FLAG SET TO -1? JMP NSP15 NO, THEN DONE LDA AHD EVALUATE #0OF SPARES AFTER EHEAD STA TEMP1 SAVE ADDRESS OF HEAD BUFFER FOR SUB# LDB AHD1 STB TEMP2 SAVE ADDRESS OF HEAD BUFFER FOR SUB NSPR8 LDA TEMP1,I GET VALUE OF ENTRY IN HEAD BUFFER SZA,RSS JMP NSPR7 THIS SURFACE NOT INCLUDED IN SUB# LDB TEMP2,I SURFACE INCLUDED IN SUB? SZB JMP NSP15 YES, THEN NO MORE EXTRA SPARES ISZ TEMP NO, THEN THIS IS AN EXTRA SPARE NSPR7 ISZ TEMP1 TRY NEXT SURFACE ISZ TEMP2 JMP NSPR8 NSP15 CLA CLEAR IFLAG STA IFLAG LDA NSPCL #L OF POSSIBLE SPARE CYLINDERS LDB NSRF # OF SPARE CYLINDERS * # OF SURFACES CMB,INB = # OF SPARE TRACKS STB COUNT NSPR2 ISZ COUNT RSS JMP NSPR5 ALL SURFACES ACCOUNTED FOR ADA NSPCL ADD # OF SPARE CYLINDERS ONE MORE TIME JMP NSPR2 NSPR5 ADA TEMP ADD ANY EXTRA SPARES LDB NSPTR # OF SPARE TRACKS EVALUATED PREVIOUSLY CMB,INB NEW-OLD ADB A NEW # SPARES > OLD # SPARE? SSB STA NSPTR NO, NSPTR=NEW # SPARES JMP NSPR9 ON TO THE NEXT SUBCHANNEL * * END CYLINDER OF SUB# = START CYLINDER OF SUB * NSPEQ JSB SMHED BOTH SUBCHANNELS HAVE ANY HEAD# 'S IN COMMON? SZA JMP NSPER YES - ERROR CONDITION JMP NSPR4 EVALUATE POSSIBLE # OF SPARE CYLINDERS * *START CYLINDER OF SUB < END CYLINDER OF SUB# * NSPLT JSB SMHED SPAN SAME HEADS? SZA,RSS JMP NSPR4 EVALUATE POSSIBLE SPARE CYLINDERS LDB SUB BLS SUB*2 ADB SUB SUB*3 ADB ATB32 MAP ADDRESS FOR SUB LDA B ADA D2 POINTER TO # OF TRACKS IN SUB LDA A,I # OF TRACKS IN SUB ADA N1 LAST TRACK # IN SUB JSB DADTR FIND ABSOLUTE ADDR OF LAST TRACK IN SUB LDA SCYL START CYL OF SUB# CMA,INA ADA PT#TR END CYL OF SUB - START CYL OF SUB# SSA,RSS END CYL OF SUB>=START CYL OF SUB#? JMP NSPER YES - ERROR CONDITION JMP NSPR4 NO EVALUATE POSSIBLE SPARE CYLINDERS * NSPR9 ISZ SUB INCREMENT SUBCHNL COUNT LDA SUB CPA NSUB DONE LOOKING AT ALL SUBCHANNELS RSS JMP NSPR1 NO, REPEAT PROCESS AGAIN NSP10 LDA NSPTR RETURN LDB NSUB IF THERE IS ONLY ONE SUBCHNL CPB D1 DEFINED, CHECK # OF SPARES RSS ONE SUCHNL DEFINED JMP NSPRS,I RETURN, MORE THAN 1 SUBCNLS DEFINED CMA,INA -VE OF # OF SPARES FOR THIS SUBCHNL ADA D10 IS IT > 10? SSA JMP NSP11 YES , THEN LIMIT THEM TO 10 LDA NSPTR NO, KEEP THEM AS NSPTR JMP NSPRS,I RETURN NSP11 LDA D10 LIMIT # OF SPRES TO 10 STA NSPTR JMP NSPRS,I RETURN * * ERROR CONTDITION * NSPER JSB WRITE DEF ERR0 WARNING -- DEF D5 JSB WRITE DEF ERR6 SUBCHANNELS OVERLAP ON SOURCE UNIT DEF D16 CLA RETURN WITH # OF SPARES AS 0 STA NSPTR JMP NSPRS,I * D412 DEC 412 ADR DEF *+1 HEAD NOP UNIT NOP SCYL NOP NSRF NOP HD BSS 9 AHD DEF HD ADR1 DEF *+1 HEAD1 NOP UNIT1 NOP SCYL1 NOP NSRF1 NOP HD1 BSS 9 AHD1 DEF HD1 ECYL NOP EHEAD NOP COUNT NOP NSPCL NOP NSPTR NOP SUB NOP * * * ABSAD - ROUTINE FINDS ABSOLUTE ADDRESS OF FIRST TRACK OF A GIVEN * SUBCHANNEL - SETS UP HEAD BUFFER FOR IT IE. IF SUBCHNL * IS DEFINED TO USE 2 SURFACES, SAY 1 & 2, THEN HDBUF=0, * HDBUF+1=1, HDBUF+2=1 * CALLING SEQUENCE: JSB ABSAD * A REG = SUBCHANNEL # * B REG = ADDR OF TABLE WITH FOLLOWING FORMAT: * ATBLE DEF *+1 ADDR OF TABLE * HEAD BSS 1 STARNG HEAD# FOR SBCHNL * UNIT BSS 1 UNIT# FOR SUBCHNL * SCYL BSS 1 STARTING CYL # * NSRFC BSS 1 # OF SURFACEES FOR SBCHNL * HDBUF BSS 5 HEAD BUFFER FOR SUBCHNL * RETURNS: TABLE FILLED UP WITH APPROPRIATE EENTRIES FOR SUBCHANNEL * * ABSAD NOP STA SUB SAVE SUBCHANNEL # STB ADDR SAVE ADDRESS OF TABLE ALS MULTIPLY SUB BY 2 ADA SUB SUB*3 ADA ATB32 ADDR POINTING TO TRACK MAP INFO FOR SUB LDB A THIS ADDR HAS TO BE IN B REG FOR DADTR ROUTINE CLA FIND ABSOLUTE ADDR OF FIRST TRACK IN SUBCHNL JSB DADTR IE. TRACK 0 BLF,BLF MOVE HEAD # TO LOW HALF STB ADDR,I HEAD# LDB ADDR INB STA B,I UNIT # INB LDA PT#TR STA B,I CYLINDER# INB LDA NSRFC STA B,I NUMBER OF SURFACES INB STB HDBUF HEAD BUFFER CLA STA COUNT COUNTER TO INDEX INTO HDBUF ABSA1 LDA HDBUF CLEAR HEAD BUFFER ADA COUNT CLB STB A,I CLEAR AN ENTRY IN HDBUF LDB COUNT CPB D8 ALL 9 ENTRIES DONE JMP ABSA2 YES ISZ COUNT NO, CLEAR NEXT ENTRY JMP ABSA1 * ABSA2 CLA,INA COUNT IS COUNTER FOR #0OF SURFACES COVERED STA COUNT INITIALIZE IT TO 1 LDA ADDR,I GET STARTING HEAD FROM THE TABLE ADA HDBUF ABSA3 CLB,INB AND STORE 1 IN HDBUF+COUNT STB A,I LDB ADDR ADB D3 GET # OF SURFACES FOR SUBCHNL LDB B,I CPB COUNT ALL SURFACES ACCOUNTED FOR? JMP ABSAD,I YES - RETURN LDB SDTYP DISC TYPE? CPB D7905 7905 DISC? LDB D2 YES, THEN HEADS 0-2 CPB D7906 7906 DISC? LDB D3 YES THEN HEADS 0-3 CPB D7920 7920 DISC? LDB D4 YES, THEN HEADS 0-4 CPB D7925 LDB D8 ABSA4 ADB HDBUF B REG HAS LAST AVAIL HEAD # CPB A CURRENT HEAD#># HEADS AVAIL ON DISC? JMP ERROR YES,ERROR ISZ COUNT NO, DO NEXT SURFACE INA JMP ABSA3 * ERROR JSB DCASC DEF *+4 DEF ERR7+14 CONVERT SUBCHANNEL # TO ASCII DEF D1 DEF SUB JSB WRITE DEF ERR7 IMPROPERLY DEFINED SUBCHANNEL XX DEF D15 JMP EXITU ABORT UTILITY * ADDR NOP HDBUF NOP * * * SMHED - ROUTINE TO DETERMINE IF THERE IS A COMMON SURFACE * USED BY 2 SUBCHANNELS * CALLING SEQUENCE: JSB SMHED * ASSUMED THAT HD & HD1 ARE TWO HEAD BUFFERS FOR THE SUBCHNLS * RETURNS: A REG = 0 IF NO COMMON SURFACES FOUND * = 1 OTHERWISE * * SMHED NOP CLA A REG IS COUNTER SMHD1 LDB AHD ADB A LDB B,I SZB,RSS HD+A REG=1? JMP SMHD2 NO, SUBCHNL DOES NOT USE THIS SURFACE LDB AHD1 DOES THE 2ND SUBCHNL ALSO USE THIS SURFACE? ADB A LDB B,I SZB,RSS YES, IF B REG = 1 JMP SMHD2 NO, SO TRY FOR NEXT SUBCHNL CLA,INA EQUAL SO RETURN 1 IN A REG JMP SMHED,I * SMHD2 CPA D8 ALL NINE SURFACES LOOKED AT? JMP SMHD3 YES INA NO, INCREMENT A JMP SMHD1 LOOK AT NEXT SURFACE (HEAD POSITION) * SMHD3 CLA NO COMMON SURFACE RETURN WITH A REG = 0 JMP SMHED,I RETURN * * * FLGDS - ROUTINE TO FLAG A DEFECTIVE TRACK AND SPARE IT TO * A GIVEN TRACK # * CALLING SEQUENCE: JSB FLGDS * A REG HAS TRACK# OF SPARE TO BE USED * ASSUME: ADDR OF LOC TO GO TO IF A DEFECTIVE SPARE IS FOUND * IS SET UP IN INITE LOC AND DEFECTIVE TRACK# IS IN TRACK * * FLGDS NOP STA SPTRK SAVE SPARE TRACK # LDB FLGDF SET INIT1 WORD TO FLAG TRACK DEFECTGIVE STB INIT1 LDB DIST1 TRACK MAP ADDR FOR SUB# JSB DADTR GET ABSOLUTE TRACK ADDR FOR SPARE TRACK LDA PT#TR A HAS CYLINDER #, DST CYLA2 B REG HAS HEAD# CLA,INA STA RTFLG SET RETURN FLAG LDA TRACK DEFECTIVE TRACK# LDB AJB CORE ADDR OF BUFFER CLE REG E=0 FOR WRITE JSB DISK5 SET UP DEFECTIVE TRACK DLD CYLAD SAVE THESE TWO WORDS DST TBUF FOR LATER USE CLA,INA DO A FAKE WRITE TO FIND STA IFLAG STATUS OF SPARE TRACK STA RTFLG SET RETURN FLAG LDA FLMSK CHANGE FILE MASK TO NO AUTO SPARING STA FILMK CLA STA INIT1 CLEAR INIT WORD LDA SPTRK SPARE TRACK # LDB AJB ADDRESS OF BUFFER CLE E REG=0 FOR WRITE JSB DISK5 WRITE LDA FLMSK+1 RESTORE FILE MASK TO AUTO SPARE STA FILMK LDA STATB CHECK STATUS RAL,RAL IS THE DEFECTIVE BIT ON THE SSA SPARE TRACK SET? JMP FLGD1 YES, THEN HONOR IT LDA D2 NO THEN MARK THE SPARE TRACK STA IFLAG WITHOUT SEEKING AGAIN DLD TBUF SET UP TO FLAG THE SPARE TRACK DST CYLA2 LDA KB PROTECT BIT ON SAVED TRACK SET? SSA,RSS JMP INIEV NO LDA FLGPS YES, SO FLAG TRACK SPARED AND PROTECTED RSS INIEV LDA FLGSP SET SPARE FLAG BUT NOT PROTECT STA INIT1 SET INIT1 WORD FOR DRIVER FLGD1 CLA,INA SET RETURN FLAG STA RTFLG LDA SPTRK CLE REG E = 0 FOR WRITE LDB AJB JSB DISK5 FLAG THE SPARED TRACK CLA CLEAR IFLAG STA IFLAG JMP FLGDS,I RETURN * SPTRK NOP RTFLG NOP * * * RDTP - IF EOT HAS NOT BEEN REACHED A REC OF LENGTH JSIZE+2 * IS READ FROM MAG TA E, IF EOT HAD BEEN REACHED ROUTINE * ASKS USER TO MOUNT NEXT TA E AND THEN READS REC * CALLING SEQUENCE: JSB RDTP * A REG CONTAINS ADDRESS OF BUFFER INTO * WHICH REC HAS TO BE READ * RETURNS: EOFLG=0 IF EOF HAS NOT BEEN REACHED * =1 IF EOF HAS BEEN REACHED * * RDTP NOP STA ABUF ADDRESS OF BUFFER JSB EOT EOT DETECTED DURING PREVIOUS READ OPERATION SZA,RSS JMP RDTP1 NO, READ REC RDTP2 JSB MTNR MAG TAPE READY? JSB REWND REWIND NEW MAG TAPE JSB PRNTH PRINT INFO. ON HEADER REC - TAPE OK? DEF HEADR JMP RDTP1 TAPE OK JSB WRITE MOUNT CORRECT TAPE DEF MSG26 DEF D9 JSB PAUSE WAIT FOR RIGHT TAPE TO BE MOUNTED JMP RDTP2 PRINT HEADER INFO AGAIN RDTP1 LDA JSIZE SIZE OF BUFFER WITHOUT HEADER WORDS ADA D2 ADD HEADER WORDS STA TEMP1 SIZE OF BUFFER TO BE READ FROM MT JSB MTNR MAG TAPE READY? JSB EXEC READ RECORD DEF *+5 DEF D1 DEF MTLU DEF ABUF,I DEF TEMP1 SZB,RSS EOF SEEN? ISZ EOFLG YES, THEN SET EOF FLAG JMP RDTP,I B REG HAS # OF WORDS TRANSMITTED, RETURN * SIZE NOP ABUF NOP EOFLG NOP * * * WRTTP - ROUTINE TO WRITE RECORD ON MAG TAPE IF EOT HAS NOT * BEEN REACHED, IF EOT SEEN, ASK USER TO MOUNT NEW TAPE * CALLING SEQUENCE: JSB WRTTP * A REG HAS ADDRESS OF BUFFER TO BE WRITTEN * * WRTTP NOP STA ABUF SAVE ADDRESS OF BUF JSB EOT EOT HAS BEEN REACHED? SZA,RSS JMP WRTP1 NO,CONTINUE WITH WRITE ISZ TAPEN YES, INCREMENT TAPE # JSB WRING WRITE RING ON MAG TAPE? JSB EXEC WRITE HEADER RECORD ON NEW MT DEF *+5 DEF D2 DEF MTLU DEF HEADR DEF D140 * WRTP1 LDA JSIZE ADA D2 DATA WORDS + 2 WORDS OF HEADER INFO STA TEMP1 JSB MTNR MAG TAPE READY? JSB EXEC WRITE RECORD ON MT DEF *+5 DEF D2 DEF MTLU DEF ABUF,I DEF TEMP1 JMP WRTTP,I RETURN * * * RDMT - IF BUFFER SIZE SPECIFIED BY USER IS 2048 WORDS THEN * THIS ROUTINE READS 3 RECORDS FROM MT TO MAKE UP A * 6144 WORD BUFFER TO WRITE ON DISC * CALLING SEQUENCE: JSB RDMT * * RDMT NOP LDA AKB FIRST READ A JSIZE REC FROM MT JSB RDTP INTO KB BUFFER LDA EOFLG EOF DETECTED? SZA JMP RDMT,I YES, THEN RETURN LDA JSIZE NO, CHECK IF JSIZE IS 2048 WORDS CPA D2048 RSS YES,READ MORE JMP RDMT,I NO, WE HAVE 8192 OR 6144 WORD RECORD DLD KB+2048 SAVE LAST TWO WORDS OF KB, THEY WILL BE OVERLAYED DST RTEMP BY TWO HEADER WORDS OF NEXT RECORD TO BE READ LDA ALB ADDRESS OF NEXT BUFFER JSB RDTP READ JSIZE RECORD DLD RTEMP LOAD THE SAVED WORDS AND STORE THEM BACK DST KB+2048 IN THEIR ORIGINAL LOC DLD LB+2048 SAVE LAST TWO WORDS OF LB BUF DST RTEMP LDA AMB BUFFER FOR THIRD REC JSB RDTP READ ANOTHER JSIZE REC FROM MT DLD RTEMP RESTORE BACK THE LAST TWO WORDS OF LB DST LB+2048 LDA TKSIZ CPA D8192 RSS JMP RDMT,I RETURN * DLD MB+2048 DST RTEMP LDA ANB JSB RDTP DLD RTEMP DST MB+2048 JMP RDMT,I RTEMP BSS 2 * * * WRTMT - ROUTINE TO WRITE EITHER 6144 WORD RECORD OR IF * JSIZE IS LESS THAN 6144, BREAK BUFFER INTO 3 2048 * RECORDS AND WRITE THEM ON MAG TAPE * CALLING SEQUENCE: JSB WRTMT * * WRTMT NOP LDA AKB BUFFER CONTAINING 6144 WORD DATA JSB WRTTP WRITE JSIZE WORDS FROM IT ON TAPE LDA JSIZE IS JSIZE = 6144 WORDS? CPA D2048 RSS IF JSIZE=2048,READ MORE RECORDS JMP WRTMT,I YES, THEN WHOLE BUFFER WRITTEN TO MT DLD KB NO,DO NEXT PORTION OF BUFFER DST LB STORE THE TWO HEADER WORDS FROM KB IN LB & LB+1 LDA ALB WRITE LB BUFFER TO MT JSB WRTTP DLD KB LAST PORTION OF BUFFER TO BE WRITTEN DST MB WRITE HEADER WORDS FOR MB BUFFER LDA AMB WRITE MB BUFFER TO TAPE JSB WRTTP LDA TKSIZ CPA D8192 RSS JMP WRTMT,I RETURN * * TRACK SIZE IS 8192, READ ONE MORE RECORD * DLD KB DST NB LDA ANB JSB WRTTP JMP WRTMT,I * * EOT - ROUTINE TO CHECK IF EOT HAS BEEN DETECTED, IF SO * ASK USER TO MOUNT NEXT TAPE * CALLING SEQUENCE: JSB EOT * RETURNS: 0 IN A REG IF EOT HAS NOT BEEN DETECTED * 1 IN A REG IF EOT HAS BEEN DETECTED * * EOT NOP LDA MTLU SET CONTROL WORD FOR DYNAMIC STATUS REQUEST ADA .600 STA TEMP1 CONTROL WORD JSB EXEC DEF *+3 DEF D3 DYNAMIC STATUS FOR MT DEF TEMP1 AND .40 IF BIT 5 IS ON EOT HAS BEEN REACHED CPA .40 JMP EOT1 EOT REACHED CLA EOT NOT REACHED JMP EOT,I RETURN WITH A REG = 0 * EOT1 JSB WRITE INFORM USER THAT EOT HAS BEEN DETECTED DEF MSG18 EOT HAS BEEN REACHED, MOUNT NEXT TAPE DEF D14 JSB REWND JSB PAUSE ENTER 'GO' WHEN READY JSB MTNR MT READY? CLA,INA JMP EOT,I RETURN WITH A REG = 1 * .40 OCT 40 .100 OCT 100 .600 OCT 600 .1300 OCT 1300 * * * MTNR - ROUTINE TO TEST IF MAG TAPE IS READY * CALLING SEQUENCE: JSB MTNR * * MTNR NOP MTNR1 LDA .600 ADA MTLU FUNCTION CODE FOR DYNAMIC STATUS REQUEST STA TEMP JSB EXEC DYNAMIC STATUS REQUEST DEF *+3 DEF D3 DEF TEMP SLA,RSS BIT SET? JMP MTNR,I NO, RETURN JSB WRITE MAG TAPE NOT READY DEF MSG23 DEF D6 JSB PAUSE JMP MTNR1 * * * WRING - ROUTINE TO CHECK IF WRITE RING IS PRESENT ON MAG TAPE * CALLING SEQUENCE: JSB WRING * * WRING NOP WRNG1 LDA .600 ADA MTLU SET UP CONTROL WORD FOR DYNAMIC STATUS REQUEST STA TEMP JSB EXEC DEF *+3 DEF D3 DEF TEMP AND D4 SZA,RSS WRITE RING ON? JMP WRING,I YES JSB WRITE NO, THEN SEND MESSAGE TO USER DEF ERR2 NO WRITE RING, WRITE ENABLE MT DEF D15 JSB PAUSE JSB MTNR JMP WRNG1 DID USER REALLY WRITE ENABLE MT? * * * * .MVW - MOVES SPECIFIED # OF WORDS FROM ONE LOCATION TO NEXT * CALLING SEQUENCE: JSB .MVW * DEF #WRDS # OF WORDS TO BE MOVED * A REG = ADDRESS OF SOURCE BUFFER * B REG = ADDRESS OF DESTINATION BUFFER * * .MVW NOP STA .TMP1 SAVE ADDR OF SOURCE BUFFER STB .TMP2 SAVE ADDR OF DEST BUFFER LIA 6 FIND OUT IF THE COMPUTER IS A 2100 OR EARLIER SZA,RSS JMP NMX0 YES, IT IS NOT AN MX OR XE CCA ADA .MVW POINT A REG TO JSB .MVW INSTR STA .MVW MAKE THIS THE RETURN ADDRESS LDA MVW GET MVW INSTR STA .MVW,I REPLACE JSB .MVW WITH MVW MICRO INSTRUCTION LDA .TMP1 RESTORE CONTENTS OF A REG JMP .MVW,I RETURN AND EXECUTE MVW INSTR NMX0 LDA .MVW,I ADDR OF # OF WORDS TO BE MOVED LDA A,I # OF WORDS TO BE MOVED STA COUNT CLA STA .TEMP MLOOP LDA .TMP1 ADDR OF SOURCE BUF ADA .TEMP INDEX INTO BUF LDA A,I GET WORD TO BE MOVED LDB .TMP2 ADB .TEMP INDEX INTO DEST BUFFER STA B,I MOVE WORD INTO DEST BUFFER ISZ .TEMP LDA .TEMP CPA COUNT ALL WORDS MOVED? RSS JMP MLOOP ISZ .MVW ISZ .MVW RETURN JMP .MVW,I * .TEMP NOP .TMP1 NOP .TMP2 NOP MVW MVW 0 * * * .CMW - ROUTINE TO COMPARE TWO BUFFERS * CALLING SEQUENCE: JSB .CMW * DEF #WRDS # OF WORDS * A REG = BUFFER 1 ADDRESS * B REG = BUFFER 2 ADDRESS * RETURN: IF BUFFERS EQUAL TO P LOC * IF BUFFERS NOT EQUAL TO P+1 LOC * * .CMW NOP STA .TMP1 STB .TMP2 SAVE ADDRESSES OF THE TWO BUFFERS TO BE COMPARED LIA 6 IS IT A 2100 OR EARLIER COMPUTER? SZA,RSS JMP NMX01 YES CCA NO, REPLACE JSB INSTR WITH CMW INSTR ADA .CMW STA .CMW JSB INSTR IS RETURN ADDRESS LDA CMW STA .CMW,I REPLACE JSB .CMW INSTR WITH CMW MICRO INSTR LDA .TMP1 RESTORE A REGISTER JMP .CMW,I NMX01 LDA .CMW,I GET # OF WORDS TO BE COMPARED LDA A,I STA COUNT ISZ .CMW ISZ .CMW SUCCESSFUL COMPARE RETURN LOACATION CLA STA .TEMP INDEX FOR THE TWO BUFFERS CMWLP LDA .TMP1 ADA .TEMP LDA A,I A REG HAS WORD TO BE COMPARED LDB .TMP2 ADB .TEMP LDB B,I B REG HAS CORRESPONDING WORD FROM 2ND BUFFER CPA B RSS JMP .CMW1 NO MATCH, RETURN TO P+1 ISZ .TEMP MATCH, THEREFORE COMPARE NEXT 2 WORDS LDA .TEMP CPA COUNT ALL WORDS COMPARED? JMP .CMW,I YES THEN RETURN JMP CMWLP NO THEN COMPARE NEXT TWO WORDS .CMW1 ISZ .CMW ISZ .CMW JMP .CMW,I RETURN * CMW CMW 0 * * * RD00 - ROUTINE TO READ RECORD FROM 7900 DISC * CALLING SEQUENCE: JSB RD00 * * RD00 NOP CLA CLEAR INIT FLAG STA INIT1 LDA TRACK SET TRACK ADDRESS TO REAL TRACK# LDB ATB31 ADDR OF TRACK MAP TABLE ADB SUB# LDB B,I BASE TRACK ADDR ADA B BASE+RELATIVE TRACK # LDB AJB ADDRESS OF BUFFER IN CORE CCE E REG = 1 FOR READ JSB DISK0 READ FROM 7900 DISC SSA,RSS IF A IS -VE, DATA ERROR OR PARITY ERROR JMP RD001 NO ERROR LDA KB+1 TURN ON SIGN BIT OF KB+1 ADA MSIGN TO INDICATE DATA WAS READ UNSUCCESSFULLY STA KB+1 SAVE IT IN HEADER INFO. FOR BUFFER * RD001 LDB SUB# LDA STATB TRACK JUST READ IS WRITE PROTECTED? ELA,CLE,ERA CLEAR SIGN BIT FROM STATUS WORD CPA .2010 DATA PROTECT SWITCH AND FLAGGED CYL BITS ON? JMP RD002 YES CPA .10 JUST FLAGGED CYL BIT ON? RD002 ADB MSIGN YES, TURN ON SIGN BIT STB KB STORE FOR HEADER INFO OF TRACK JMP RD00,I RETURN * MSIGN OCT 100000 .2010 OCT 2010 .10 OCT 10 * * * WR00 - ROUTINE TO WRITE RECORD ON 7900 DISC * CALLING SEQUENCE: JSB WR00 * * WR00 NOP LDB MSIGN LDA KB SAVE RECORD WAS WRITE PROTECTED? ELA CHECK SIGN BIT SEZ ADB M1000 YES, ADD PROTECT FLAG BIT IN INIT WORD STB INIT1 SET UP INIT1 FOR 7900 DISC DRIVER CLE,ERA CLEAR SIGN BIT STA SUB# LDA KB+1 CLEAR SIGN BIT FROM 2ND HEADER WORD ELA,CLE,ERA STA TRACK TRACK# LDA COTYP CPA D3 FROM - TO COPY? RSS JMP WR01 NO LDA PLATR YES, THEN SET UP PLATR & SUB# LDB SUB# FOR DEST DISC FOR FROM-TO COPY DST TBUF LDA DPLTR DESTINATION PLATR STA PLATR LDA DSUB# DESTINATION SUB# STA SUB# LDA TRACK ADA FTRCK BASE + RELATIVE TRACK ADDRESS JMP WR02 WR01 LDA TRACK LDB ATB31 ADB SUB# LDB B,I ADA B REAL TRACK ADDRESS WR02 LDB AJB ADDRESS OF CORE BUFFER CLE E REG=0 FOR WRITE JSB DISK0 ASK DRIVER TO WRITE REC LDA COTYP CPA D3 COPY TYPE FROM TO ? RSS JMP WR00,I NO DLD TBUF YES THEN RESTORE ORIGINAL SUB# AND PLATR VALUES STA PLATR FOR SOURCE DISC STB SUB# JMP WR00,I RETURN * M1000 OCT 1000 * * * RD05 - ROUTINE TO READ DATA FROM 7905 DISC * CALLING SEQUENCE: JSB RD05 * * RD05 NOP CLA SET INIT1 BIT TO 0 STA INIT1 LDA TRACK LDB AJB CORE BUFFER ADDRESS CCE SET E REG=1 FOR READ JSB DISK5 ASK DRIVER TO READ RECORD FROM 7905 DISC CPA PATRN ILLEGAL SPARE ENCOUNTERED? RSS JMP RD052 NO LDA COTYP IS IT A FROM-TO COPY? CPA D3 JMP RD051 YES, THEN GIVE ILLEGAL SPARE ERROR MESSAGE LDB ATB32 NO, TRACK SPARING REQUESTED? ADB N1 LDB B,I B REG HAS FIRST WORD OF TRACK MAP TABLE SSB,RSS JMP SAC10 NO, THEN SKIP THIS REC DO NEXT ONE RD051 JSB WRITE GIVE ERROR MESSAGE DEF ERR12 ILLEGAL SPARE AT: DEF D9 LDA TRACK PRINT TRACK LOC JSB PTRK5 JSB QUERY DEF MSG28 CONTINUE? DEF D5 DEF EXP6 REPLY YES OR NO DEF D9 LDA RBUF WHAT IS THE RESPONSE? CPA YE RSS JMP EXITU DOES NOT WISH TO CONTINUE ABORT UTILITY LDA KB+1 MARK TRACK DEFECTIVE ADA MSIGN STA KB+1 JMP RD05,I RETURN RD052 LDB SUB# LDA STATB GET STATUS WORD AND .4000 TRACK JUST READ WAS PROTECTED? CPA .4000 ADB MSIGN YES, TURN ON BIT 15 OF KB STB KB JMP RD05,I RETURN * * * * WR05 - ROUTINE TO WRITE ON 7905 DISC * CALLING SEQUENCE: JSB WR05 * * WR05 NOP LDA COTYP CPA D3 FROM - TO COPY? RSS JMP WR050 LDA AFRMP YES, THEN DEST TRACK MAP TABLE IS DIFFERENT INA STA DIST1 SET UP FOR DISC DRIVER CLA STA SUB# SUB# ALWAYS 0 FOR FROM - TO COPY JMP WR058 WR050 LDA KB ELA,CLE,ERA CLEAR SIGN BIT STA SUB# CALCULATE TRACK MAP ADDRESS FOR SUB# ALS ADA SUB# SUB#*3 ADA ATB32 STA DIST1 LDA ATB32 IS TRACK SPARING REQUIRED? ADA N1 LDA A,I SSA,RSS JMP WR058 NO LDA FLMSK YES, THEN FIRST WRITE W/OUT AUTO STA FILMK TRACK SPARING WR058 CLA,INA STA IFLAG IFLAG=1 IF THIS IS WRITE FOR STATUS PURPOSES LDB AJB CORE ADDRESS OF BUFFER CLA STA INIT1 SET UP INIT1 WORD FOR DISK DRIVER LDA DUNIT STA UN#IT UNIT # FOR DRIVER LDA KB+1 CLEAR SIGN BIT ON TRACK ADDRESS ELA,CLE,ERA STA TRACK CLE E REG=0 FOR WRITE JSB DISK5 WRITE DATA ON DISC LDB IFLAG IS THIS WRITE WITH TRACK SPARING? SSB JMP WR056 YES CPA PATRN NO,TRIED TO WRITE ON SPARED TRACK? RSS JMP WR051 NOT AN ILLEGAL SPARE JSB WRITE YES, GIVE ERROR MESSAGE DEF ERR12 ILLEGAL SPARE AT: DEF D9 LDA TRACK REPORT LOACATION OF TRACK JSB PTRK5 JSB QUERY DEF MSG28 CONTINUE? DEF D5 DEF EXP6 REPLY YES OR NO DEF D9 LDA RBUF WHAT IS THE RESPONSE? CPA YE RSS JMP EXITU DOES NOT WISH TO CONTINUE CLA CONTINUE, CLEAR IFLAG STA IFLAG JMP WR05,I RETURN WR051 LDA KB SSA,RSS WRITE PROTECT NEEDED? JMP WR053 LDB STATB YES LDA FLGPT WRITE PROTECT FLAG IN A SSB SPARED TRACK? LDA FLGPS YES, WRITE PROTECT + SPARED FLAG IN A JMP WR055 WR053 LDA STATB DEST TRACK WAS WRITE PROTECTED AND .4000 GET P BIT FROM STATUS CPA .4000 RSS SET THEN CLEAR IT JMP RWR05 NOT SET - RETURN LDB STATB IF DEST TRACK WAS WRITE PROTECTED LDA M1400 WIPE OUT WP STATUS-PLAIN INITIALIZE SSB SPARE BIT TURNED ON? LDA FLGSP YES, RESTORE SPARE STATUS BUT NOT PROTECT WR055 STA INIT1 LDA D2 SET IFLAG TO DO WRITE WITHOUT SEEK STA IFLAG WR057 LDB AJB CORE BUFFER ADDRESS LDA TRACK CLE REG E=0 FOR WRITE? JSB DISK5 IFLAG = 2 TO WRITE WITHOUT SEEK RWR05 CLA STA IFLAG CLEAR IFLAG JMP WR05,I * TRACK SPARING IS DESIRED WR056 LDA FLMSK+1 RESTORE FILE MASK TO AUTO TRACK SPARE STA FILMK LDA STATB IS THE DEFECTIVE BIT SET ON TRACK? RAL,RAL SSA JMP WR057 YES, THEN SPARE TRACK LDA FLGPT PROTECT FLAG + INITIALIZE LDB KB PROTECT FLAG ON ON SAVED TRACK? SSB,RSS LDA M1400 NO PLAIN INITIALIZE JMP WR055 RE-WRITE THE TRACK * IFLAG NOP FLMSK OCT 107400 FILE MASK WITHOUT AUTO SPARE OCT 107404 FILE MASK WITH AUTO SPARE * * * CMPAR - ROUTINE TO MAKE WORD TO WORD COMPARISON OF TWO BUFFERS * CALLING SEQUENCE: JSB CMPAR * AJB & AJB+JSIZE ARE ASSUMED TO BE ADDRESSES OF THE 2 BUFFERS * BUFFER LENGTH IS JSIZE * RETURNS: TO LOC P IF SUCCESSFUL COMPARE * TO LOC P+1 IF UNSUCCESSFUL COMPARE * * CMPAR NOP LDA AJB A REG HAS ADDR OF FIRST BUFFER LDB JSIZE SIZE OF EACH BUFFER CPB TKSIZ 6144 WORD BUFFER? JMP CMPR2 YES ADB A NO, ADDRESS OF 2ND BUFFER IN B REG RSS CMPR2 LDB AVBUF ADDR OF 2ND BUFFER FOR BUF OF 6144 WORDS JSB .CMW COMPARE JSIZE WORDS DEF JSIZE NOP JMP CMPAR,I SUCCESSFUL COOMPARE, RETURN * NOP JSB WRITE COMPARE ERROR DEF MSG22 VERIFY ERROR AT: DEF D8 LDA TRACK LDB DSCTP CPB D7900 JMP CMPR1 JSB PTRK5 JMP CMPR3 CMPR1 LDA TRCK1 JSB PTRK0 CMPR3 ISZ CMPAR RETURN TO P+1 JMP CMPAR,I RETURN * * * LBCNG - ROUTINE TO CHANGE # OF BAD TRACKS AND NEXT AVAILABLE * SPARE TRACK INFO ON USER LABEL OF A DOS SUBCHANNEL * CALLING SEQUENCE: JSB LBCNG * * LBCNG NOP LDA D128 STA ISIZE SIZE OF 1 BLOCK FOR DISC DRIVER CLA STA SECTR STA INIT1 LDB ALABL READ FIRST TRACK IN SUBCHNL CCE JSB DISK5 LDA ALABL ADA D3 LABEL WORD LDB ASYST SYSTEM ASCII WORDS JSB .CMW COMPARE BUFFERS WHOSE ADDRESSES ARE IN A & B REG DEF D3 NOP JMP LBCN1 SUCCESSFUL COMPARE NOP JMP USER NO MATCH SO USER SUBCHANNEL LBCN1 LDA LABEL+64 TRACK # IS IN UPPER BYTE ALF,ALF BRING IT TO LOWER BYTE ALS MULTIPLY IT BY 2 LDB ALABL CCE JSB DISK5 READ TRACK WITH USER LABEEL ON IT * USER LDA UBADC # OF USED SPARES IN A REG ARS DIVIDE BY 2 STA LABEL+65 UPDATE # OF USED SPARE TRACKS WORD IN USER LABEL LDA UBADC CMA,INA BASE SPARE POOL ADDRESS - # USED SPARES = ADA CSPAR NEXT AVAILABLE SPARE TRACK ARS DIVIDE BY 2 STA LABEL+66 UPDATE NEXT AVAIL SPARE TRCK WORD IN USER LABEL LDA TRCK1 LDB ALABL CLE JSB DISK5 WRITE UPDATED USER LABEL BACK ON DISC LDA TKSIZ STORE BACK ORIGINAL SIZE OF BUFFER FOR DRIVER STA ISIZE JMP LBCNG,I RETURN * ASYST DEF SYSTM SYSTM ASC 3,SYSTEM * TBCHN NOP TEMP DSIZE NOP DISK SIZE - NO. OF TRACKS SDS# NOP # SECTORS/TRACK FOR SYSTEM DISC$ DERCN NOP DISK ERROR COUNTER * "/E" ASC 1,/E SKP SPC 3 * SUBROUTINE TO TEST LEGALITY OF * A SUBCHANNEL. THE TEST CONSISTS * OF LOOKING FOR THE DESIRED * CHANNEL IN THE TRACK MAP. * CALLING SEQUENCE * * P-1 ERROR RETURN * P JSB TSTCH * P+2 NORMAL RETURN CHANNEL IN A SIZE IN B SPC 1 * A ON ENTRY IS ASSUMED TO BE THE SUBCHANNEL TO BE CHECKED. * ERROR EXIT IS P-1 * IF THE SUBCHANNEL IS LEGAL IT IS RETURNED IN A * AND B IS THE NUMBER OF TRACKS ON THAT CHANNEL SPC 1 TSTC0 NOP LDB ATB31 GET TABLE ADDRESS ADB A ADD SUBCHANNEL ADB D8 STEP TO # TRACKS LDB B,I GET # TRACKS IN B JMP TSTC0,I RETURN B= # TRACKS * * LST1 DEF *+1 I#OTB DEF DSK51 DEF DSK52 DEF DSK53 DEF DSK54 DEF DSK55 DEF DSK57 DEF DSK58 DEF DSK59 DEF DSK60 DEF DSK61 DEF DSK#R I#OTC DEF * LST2 DEF *+1 I#OTD DEF DSK01 DEF DSK02 DEF DSK03 DEF DSK04 DEF DSK05 DEF DSK07 DEF DSK08 DEF DSK09 DEF DSK10 DEF DSK11 DEF DSK16 DEF DSK70 I#OTE DEF * * S#EKC OCT 30000 R/DCM OCT 20000 DSK#R OCT 120000 T#AC0 NOP * * * * THE DISKD SUBROUTINE IS THE MAIN DISC INPUT/OUTPUT DRIVER. * IT SETS UP THE COMPLETE TRANSFER AND READS OR WRITES * 128 WORD SECTORS ON THE DISC. IT WAITS UNTIL THE TRANSFER * IS COMPLETE. STATUS IS DONE AFTER EACH TRANSFER FOR WRITE * PROTECT ERRORS THE OPERATOR IS ASKED TO TURN ON THE SWITCH. * FOR DEFECTIVE CYLINDER ERRORS THE IRRECOVERABLE ERROR ERR40 IS * TAKEN. FOR NOT READY ERRORS THE OPERATOR IS NOTIFIED. * FOR OTHER ERRORS TEN TRIES ARE MADE. IF THE ERROR STILL EXIST * AND: * * A - IF THE INIT FLAG IS SET EXIT TO INITE INDIRECT * * B - ELSE NOTIFY OPERATOR AND HALT * A= DISC ADDRESS -64 WORD/SECT BASIS- * B= DISC STATUS * SPC 3 * CALLING SEQUENCE * B = CORE ADDRESS * E = 1 FOR READ * E = 0 FOR WRITE * * RETURN - ALWAYS NORMAL--REGS. MEANINGLESS SPC 3 DISK0 NOP STA TRCK1 RBL,ERB SET THE READ/WRITE BIT STB MADDR AND SAVE THE ADDRESS LDB SUB# GET SUBCHANNEL NUMBER CLE,ERB B IS UNIT NOT E IS HIGH HEAD BIT LDB UN#IT GET UNIT NUMBER ADB M0100 SET COMMANDS LDA INIT1 ADD INIT FLAG TO WRITE ADA B COMMAND STA W#CMD AND SET WRITE COMMAND ADB M0100 READ STB R/DCM SET READ ADB M0100 STB S#EKC SEEK CLA,SEZ,CLE,RSS IF E = 0 INA SET HEAD 2 LDB SECTR GET SECTOR BRS B IS ACTUAL SECTOR STB H#AD SAVE ADB N24 SUBTRACT NUMBER ON A SIDE SSB,RSS IF POSITIVE STB H#AD RESET SECTOR ELA MOVE IN LOW HEAD BIT ALF,ALF ROTATE ADA H#AD AND ADD THE SECTOR STA H#AD SAVE HEAD/SECTOR ADDRESS TRY00 JSB $LIBR TURN OFF INTERRUPTS NOP CLF 0 RTRY0 LDA N10 RESET 10 TRY COUNTER STA EDCNT DSK16 STF 1 SET FLAG FOR STATUS JSB STATC GO DO STATUS AND .100 CHECK READY BIT SZA IF SET JMP NR#RR GO TELL THE MAN * LDA TRCK1 SET TRACK TO A JSB SEEK AND SEEK THE RECORD LDB MADDR SET THE CORE ADDRESS TO B LDA R/DCM SET FOR READ SSB,RSS WRITE? LDA W#CMD YES - RESET TO WRITE DSK01 CLC 1 SET UP COMMAND DSK02 OTA 1 SEND COMMAND DSK51 STF 0 SET FOR WRITE CLE,SSB READ? DSK52 STC 0,C YES / RESET FOR READ LDA DSK#R GET DMA WORD OTA 6 ASSIGN DMA CLC 2 SET FOR ADDRESS OTB 2 SEND ADDRESS LDA ISIZE SET LENGTH TO -ISIZE CMA,INA STC 2 SET FOR LENGTH OTA 2 SEND IT STC 6,C START DMA DSK03 STC 1,C START DRIVE CLC 6 JSB STATC GET STATUS STA STATB SAVE SLA JMP DERRC STATUS NOT OK-CHECK FOR ERRORS JSB INT0N STATUS OK - TURN ON INTERRUPTS JMP DISK0,I RETURN * DERRC RAL,CLE,ERA CLEAR SIGN BIT CPA .11 WRITE PROTECT ERROR? JMP WRPT0 YES - GO TELL HIM * CPA .31 DEFECTIVE CYLINDER? RSS JMP DERRD NO - CHECK FOR OTHER ERRORS JSB INT0N TURN ON INTERRUPTS LDA N1 POSSIBLE ONLY DURING READ JMP DISK0,I RETURN WITH A REG = -1 * DERRD AND .100 ISOLATE READY BIT SZA READY? JMP NR#RR NO - GO TELL HIM * CLA AND JSB SEEK ZERO ISZ DERCN STEP TOTAL ERROR COUNT ISZ EDCNT TIME THIS OP COUNTER JMP DSK16 NOT TEN YET GO TRY AGAIN * JMP IN#ER BAD TRACK REPORT IT * WRPT0 JSB INT0N TURN ON INTERRUPTS JSB WRITE WRITE PROTECT SWITCH IS OFF DEF MES32 ASK USER TO TURN IT ON DEF D11 JSB PAUSE WAIT FOR TURN ON JMP TRY00 TRY AGAIN. SPC 1 NR#RR JSB INT0N TURN ON INTERRUPTS JSB WRITE DISC IS NOT READY DEF MS4 SEND THE WORD TO THE MAN DEF D5 JSB PAUSE PAUSE JMP TRY00 ON RESTART RETRY SPC 1 SPC 2 SEEK NOP SEEK ROUTINE DSK57 OTA 0 SEND TRACK DSK58 STC 0,C SET DATA TO SHOW TRACK SEND ALF,ALF TRACK TO HIGH A ADA UN#IT ADD THE UNIT NUMBER LDB S#EKC GET SEEK COMMAND DSK09 CLC 1 SET UP COMMAND CHANNEL DSK10 OTB 1 SEND COMMAND DSK11 STC 1,C TELL CONTROLLER LDB H#AD GET HEAD/SECTOR ADDRESS DSK59 SFS 0 READY? JMP DSK59 WAIT * DSK60 OTB 0 SEND HEAD/SECTOR DSK61 STC 0,C START JSB STATC GET STATUS JMP SEEK,I RETURN SPC 2 STATC NOP WAIT AND STATUS ROUTINE DSK04 SFS 1 WAIT FOR FLAG JMP DSK04 * STF 6 CLEAR DMA DSK05 CLC 1 CLEAR CONTROLLER DSK53 STC 0,C SET DATA FOR LDA UN#IT STATUS DSK07 OTA 1 SEND STATUS REQUEST DSK08 STC 1,C START DSK54 SFS 0 WAIT FOR JMP DSK54 STATUS * DSK55 LIA 0,C GET STATUS AND JMP STATC,I RETURN SPC 2 LASK NOP NSEC NOP * * BAD TRACK TO BE REPORTED * IN#ER JSB INT0N TURN ON INTERRUPTS LDA STATB GET STATUS AND MASK SEEK CHECK AND M440 SZA,RSS CHECK END OF CYLINDER BITS JMP IN#E0 IF NOT SET CONTINUE WITH BAD TRACK REPORTING JSB WRITE DEF ERR8 IF SET GIVE ERROR MESSAGE AND ABORT UTILITY DEF D22 UNRECOVERABLE DISC ERROR-EOC OR SEEK CHECK JMP EXITU ABORT UTILITY * IN#E0 LDA VFLAG VERIFYING? SZA YES JMP DISK0,I YES, RETURN JSB WRITE REPORT BAD TRACK DEF ERR9 DEF D7 LDA TRCK1 JSB PTRK0 PRINT LOC OF TRACK JSB QUERY DEF MSG28 CONTINUE? DEF D5 DEF EXP6 REPLY YES OR NO DEF D9 LDA RBUF CPA YE RSS JMP EXITU ABORT UTILITY LDA N1 YES THEN RETURN WITH -1 IN A REG JMP DISK0,I * .11 OCT 11 .31 OCT 31 N10 DEC -10 N24 DEC -24 * * PTRK0 - ROUTINE TO PRINT TRACK # AND PLATTER # OF A TRACK ON * OPERATOR CONSOLE * CALLING SEQUENCE: JSB PTRK0 * A REG = TRACK# * * PTRK0 NOP STA TEMP1 SAVE TRACK# JSB DCASC CONVERT TRACK # TO ASCII DEF *+4 DEF TRKAD+3 DEF D2 DEF TEMP1 TRACK# JSB DCASC CONVERT PLATTER # TO ASCII DEF *+4 DEF TRKAD+10 DEF D1 DEF SUB# PLATTER # (SUBCHNL #) JSB DCASC CONVERT UNIT # TO ASCII DEF *+4 DEF TRKAD+15 DEF D1 DEF UN#IT UNIT# JSB WRITE SEND TRACK LOCATIONS TO TTY DEF TRKAD DEF D16 JMP PTRK0,I RETURN * TRKAD ASC 16,TRACK# , PLATTER# , UNIT# * * TBUF BSS 5 TEMP BUFFER DC EQU 0 HED MH RTGEN - CONSTANTS AND ADDRESSES * INITE DEF INIER FOR DISK ERROR INIT1 NOP INITILIZATION FLAG FOR DRIVER DIST1 NOP DIST2 NOP * INTMP NOP TEMP FOR INITILIZATION ROUTINES MS3 ASC 6,SUBCHNL 00? EXMS3 ASC 21,REPLY 1 TO 1233, 0 TO 410, 0 TO 2, 1 TO 3 MES1 ASC 20,# TRKS, FIRST CYL #, HEAD #, # SURFACES * HED INTERACTIVE DISC SET UP SECTION * * THE FOLLOWING MESSAGES ARE PRINTED DURING THE INITIALIZATION * PHASE, WITH THE SPECIFICATIONS FOR EACH VALID RESONSE. * * * MESSAGE RESPONSE * * MH DISC CHANL? ENTER 2 OCTAL DIGITS * * # TRKS, FIRST CYL#, HEAD #, # SURFACES ON SUBCHNL: * 0? * . ENTER FOUR DECIMAL NOS. * . SEPERATED BY A COMMA * . OR * . /E * 32? * DSETU NOP ENTRY POINT FOR QUESTION SECESSION. STB30 JSB WRITE DEF MES1 #TRKS, FIRST CYL#, HEAD#, #SURFACES DEF D20 LDA ATB32 SET ADDRESSES STA SDS# FOR INPUT STA INTMP AND CLEAR LOOPS LDB N96 CLEAR (32 SUBCHNNL- 3 WORDS EACH) CLA THE TB30. STA INTMP,I TRACK ISZ INTMP MAP INB,SZB STEP COUNT - DONE? JMP TB30. NO - CLEAR NEXT WORD * STA INIT1 CLEAR INIT FLAG STA NSUB SET 0 DEFINED SUBCHANNELS TB30A STB INTMP SAVE CURRENT UNIT JSB DCASC CONVERT DECIMAL SBCHNL# TO ASCII DEF *+4 DEF MS3+4 INSERT THE ASCII CHARACTERS IN MESSAGE DEF D1 DEF INTMP JSB QUERY DEF MS3 SUBCHNL XX? DEF D6 DEF EXMS3 DEF D21 LDA RBUF GET FIRST CPA "/E" /E? JMP TB30Y YES - GO CHECK FURTHER * JSB GINIT NO - REINITIALIZE LBUF SCAN LDA N4 CONVERT 4 DIGITS JSB GETOC DECIMAL JMP EXPL ERROR - * STA TBCHN SET # TRACKS IN TEMP SZA,RSS IF ZERO JMP TB30B GO UPDATE POINTERS * JSB GETAL NOT ZERO - GET NEXT CHARACTER CPA BLANK COMMA IN? RSS YES - SKIP JMP EXPL NO - ERROR * LDA N3 SET FOR JSB GET 3 DECIMAL DIGITS AND CONVERT STA SDS#,I THE CYL # FOR TRACK 0. CCA GET 1 DIGIT JSB GET HEAD NUMBER STA B SAVE ADA N9 MUST BE LESS THAN 5. SSA,RSS WELL? JMP EXPL NO - BITCH * BLF,BLF PUT IN ITS PLACE STB BSHED AND SAVE LDA N2 NOW GET # SURFACES 2 DIGIT JSB GET MUST BE 1 TO 5. STA B SZA ADA N10 SSA,RSS WELL? JMP EXPL NOT GOOD! BITCH BLF,BLF MOVE TO HIGH BLF END AND ADB BSHED COMBINE WITH HEAD ADB SUNIT ADD UNIT# STB BSHED TB30C ISZ SDS# STEP TO HEAD/UNIT WORD. LDA BSHED AND STA SDS#,I SALT IT AWAY. ISZ SDS# NOW THE # TRACKS LDA TBCHN WORD STA SDS#,I SALT IT AWAY. STA DSIZE SET ALSO FOR ASSUMPTION ISZ NSUB STEP TOTAL SUBCHANNEL COUNT TB30B ISZ SDS# STEP TABLE ISZ INTMP STEP SUBCHANNEL TB30F LDB INTMP IF CURRENT SUBCHANNEL CPB D32 IS 32 THEN JMP TB30Y DONE SO GO EXIT * JMP TB30A NOT 32 - GO ASK FOR NEXT ONE * SPC 1 * SPC 1 * TB30Y LDA NSUB NO - GET NUMBER OF CHANNELS SZA,RSS IS IT 0? JMP EXPL YES, THEN ASK AGAIN CMA,INA DEFINED LDB ATB32 ADB N1 STA B,I STORE -VE # OF SUBCHANNELS IN TRACK MAP TABLE JMP DSETU,I RETURN * * SPC 1 BSHED NOP N96 DEC -96 D32 DEC 32 SPC 1 GET NOP GET SUBROUTINE CHECKS FOR EXISTANCE STA TBUF AND GETS NEXT JSB GETAL INPUT NUMBER CPA BLANK PASS NUMBER TYPE ECT FLAG IN A RSS LINE NOT EMPTY SO SKIP JMP EXPL EMPTY LINE SO ERROR * LDA TBUF GET TYPE/ # DIGITS JSB GETOC GET NUMBER JMP EXPL CONVERSION ERROR BITCH * JMP GET,I ELSE RETURN SKP SPC 3 * SUBROUTINE TO TEST LEGALITY OF * A SUBCHANNEL. THE TEST CONSISTS * OF LOOKING FOR THE DESIRED * CHANNEL IN THE TRACK MAP. * CALLING SEQUENCE * * P-1 ERROR RETURN * P JSB TSTC5 * P+2 NORMAL RETURN CHANNEL IN A SIZE IN B SPC 1 * A ON ENTRY IS ASSUMED TO BE THE SUBCHANNEL TO BE CHECKED. * ERROR EXIT IS P-1 * IF THE SUBCHANNEL IS LEGAL IT IS RETURNED IN A * AND B IS THE NUMBER OF TRACKS ON THAT CHANNEL SPC 1 TSTC5 NOP LDB COTYP CPB D2 UNIT COPY? RSS JMP TST55 NO LDB SYSTP SZB,RSS DOS DISC? JMP TST55 NO,RTE LDB D400 # OF TRACKS FOR A DOS SUBCHNL STB NTRCK LDB D409 BASE SPARE POOL ADDR FOR DOS SUBCHNL STB CSPAR JMP TSTC5,I RETURN TST55 LDB A NUMBER TO B BLS INDEX INTO THE ADB A SUBCHNL# * 3 ADB ATB32 MAP TABLE ADDRESS ADB D2 STEP TO # TRACKS LDB B,I GET # TRACKS IN B STB NTRCK STB CSPAR JMP TSTC5,I RETURN * D409 DEC 409 SKP * * INSERT CHNL NO. IN INSTRUCTION * * THE DCHCN SUBROUTINE SETS THE CURRENT DISK CHANNEL * NOS. IN THE I/O INSTRUCTIONS. * * CALLING SEQUENCE: * A = ADDRESS OF END OF INSTRUCTION ADDRESS LIST * B = ADDRESS OF INSTRUCTION ADDR LIST * JSB DCHCN * * DCHCN NOP STA TBUF ADDR OF END OF INSTRUCTION ADDR LIST STB TBUF+1 ADDR OF BEGINNING OF INSTRUCTION ADDR LIST LOOPC LDB TBUF+1 CPB TBUF COMPARE ADDR OF BEG WITH END OF INST LIST JMP DCHCN,I THEY MATCH, ALL INSTRUCTIONS CONFIGURED LDB B,I GET INSTRUCTION ADDRESS LDA B,I GET INSTURCTION AND .1777 MASK OUT THE OLD CHANNEL# IOR CHANL INSERT NEW CHANNEL# STA B,I STORE IT BACK ISZ TBUF+1 MOVE DOWN TO THE NEXT INSTR JMP LOOPC REPEAT PROCEDURE * .1777 OCT 177700 * * LST3 DEF *+1 I/OTB DEF DSKDR DEF DSK20 DEF DSK21 DEF DSK22 DEF DSK24 DEF DSK25 DEF DSK26 DEF DSK27 DEF DSK28 DEF DSK29 DEF DSK71 I/OTC DEF * * * FLGPT OCT 41400 FLGDF OCT 21400 FLGSP OCT 101400 FLGPS OCT 141400 PROTECT AND SPARE WA#KE OCT 113000 PT#SK OCT 101200 PT#AD OCT 106000 PT#T2 NOP PT#H2 NOP OCT 107404 FILE MASK R#DCM OCT 102400 P#EN OCT 101400 DSKDR ABS DC DMA CON WORD HED MH RTGEN COMMON I/O DISC DRIVER * THE DISKD SUBROUTINE IS THE MAIN DISC INPUT/OUTPUT DRIVER. * IT SETS UP THE COMPLETE TRANSFER AND READS OR WRITES * 128 WORD SECTORS ON THE DISC. IT WAITS UNTIL THE TRANSFER * IS COMPLETE. STATUS IS DONE AFTER EACH TRANSFER FOR WRITE * PROTECT ERRORS THE OPERATOR IS ASKED TO TURN ON THE SWITCH. * FOR UNDEFINED ERRORS OR ERRORS THAT SHOULD NOT HAPPEN SUCH AS * DEFECTIVE CYLINDER ERRORS THE IRRECOVERABLE ERROR ERR40 IS * TAKEN. FOR NOT READY ERRORS THE OPERATOR IS NOTIFIED. * FOR OTHER ERRORS TEN TRIES ARE MADE. IF THE ERROR STILL EXIST * AND: * * CALLING SEQUENCE * A = TRACK # * B = CORE ADDRESS * E = 1 FOR READ * E = 0 FOR WRITE * * RETURN - ALWAYS NORMAL--REGS. MEANINGLESS SPC 3 DISK5 NOP STA TRCK1 RBL,ERB SET THE READ/WRITE BIT STB MADDR AND SAVE THE ADDRESS LDA RTFLG IS RETURN FLAG SET? SZA JMP DISK3 YES, THEN DO NOT CHANGE ORIGINAL RETURN LOC LDA DISK5 SAVE ORIGINAL RETURN ADDRESS STA RDSK5 DISK3 CLA STA RTFLG CLEAR THE RETURN FLAG LDA ISIZE CONVERT SIZE TO -VE CMA,INA STA SIZE * DISK1 LDA TRCK1 A REG HAS TRACK # LDB DIST1 GET ADDRESS OF JSB DADTR TRANSLATE THE TRACK ADDRESS LDA UN#IT LDB #UNST SET # TO CONFIGURE COUNTER STB UNCOU LDB UNITC GET UNIT CONFIGURE ADDRESS NXUN XOR B,I AND CONFIGURE THE UNIT NUMBERS AND M17 OF COURSE THIS XOR B,I CODE WORKS STA B,I INB ISZ UNCOU DONE? JMP NXUN NO TRY AGAIN * LDA IFLAG IS THIS WRITE WITH TRACK SPARING AND SSA AND TRACK HAS DEFECTIVE BIT MARKED? ISZ IFLAG YES, THEN SET IFLAG=0 RSS NO JMP INITE,I THEN HONOR IT AND SPARE TRACK * LDA WRTCM GET THE WRITE COMMAND ADA INIT1 ADD THE INIT CODE STA W#CMD AND SET IT LDA PT#TR GET THE CYLINDER LDB SECTR SECTOR BRS ADJUST OUT THE 64 WORD JASS ADB H#AD PUT IN THE HEAD DST CYLAD SET THE SEEK ADDRESSES LDA INIT1 GET THE INIT CODE CPA FLGSP IF SPARING OR RSS DOING A DEFECTIVE TRICK CPA FLGPS RSS CPA FLGDF THEN JMP TRY05 SKIP THE SECOND ADDRESS SET UP * LDA CYLAD ELSE DST CYLA2 SET UP THE ADDRESS RECORD COMMAND LDA N10 DISK ERROR COUNT INITIALIZED TO -10 STA DERCN USED FOR CYLINDER COMPARE ERRORS TRY05 JSB $LIBR TURN OFF INTERRUPTS NOP CLF 0 * RTRY LDA N10 SET THE ERROR STA EDCNT COUNTER TO 10 TRIES OVER JSB STATW GET STATUS RBR,SLB,RBL READY? JMP NRERR NO SO LONG * SLB IF DRIVE BUSY JMP OVER WAIT FOR IT * LDB MADDR GET THE CORE ADDRESS LDA R#DCM PRESET FOR READ SSB WRITE? JMP DISK2 NO, DO STANDARD ADDRESSING LDA W#CMD YES RESET TO WRITE LDB IFLAG IF WRITING FOR 2ND TIME JUST DO ADDR REC CPB D2 JMP WPCAL YES JUST DO ADDRESS RECORD (NO SEEK) * DISK2 LDB MADDR JSB XFER STANDARD TRANSFER DEF WAITC-1 ADDRESS OF COMMAND TABLE DEF R/WCM ADDRESS OF END OF TABLE CKSTA STB STAT2 SAVE STATUS-2 WORD STA STAT1 SAVE STATUS PORTION OF STAT1 WORD LDB IFLAG COMING HERE FOR FIRST TIME WRITE WHEN CPB D1 TRACK SPARING IS NOT REQUIRED? RSS JMP CKSTB NO, CHECK FOR ERRORS LDA ATB32 IS THIS WRITE WITH TRACK SPARING? ADA N1 LDA A,I SSA,RSS JMP CKSTB NO, THEN CHECK STATUS LDB STAT2 STATUS WORD 2 LDA STAT2 SSA ERROR? JMP ST2ER YES, PROCESS IT AND .100 SZA WRITE PROTECT SWITCH ON? JMP WRPTM YES CCA YES, SET IFLAG=-1 STA IFLAG TO HAVE WR05 CHECK FOR D BIT IN STATUS JSB INT5N TURN ON INTERRUPTS JMP DISK5,I RETURN CKSTB LDA STAT1 RESTORE STATUS WORDS LDB STAT2 ADA CTABA INDEX WITH STATUS INTO JMP A,I STATUS XFER TABLE * WPCAL LDB MADDR JSB XFER WRITE PROTECT TRANSFER DEF ADRES-1 START WITH THE ADDRESS RECORD DEF R/WCM STILL END SAME PLACE JMP CKSTA GO DO STATUS CHECK * * CTABA DEF *+1 CODE ERROR DISPOSITION JMP ENDOK 00 NO ERROR - TEST FOR VERIFY JSB FAULT 01 ILLEGAL OP - PROGRAM FAULT JSB FAULT 02 UNIT AVAIL. PROGRAM FAULT JSB FAULT 03 CONTROLLER JSB FAULT 04 SHOULD JSB FAULT 05 NEVER JSB FAULT 06 SEND THESE ERRORS JMP RECAL 07 CYL COMPARE TRY TO RECAL. JMP ERRDS 10 PARITY ERROR TRY AGAIN JMP CMPER 11 HEAD/SECTOR? SEND ERROR JSB FAULT 12 I/O PROGRAM (WHO? ME?) PROGRAM FAULT JSB FAULT 13 UN IMPLEMENTED CODE FAULT JMP EOCYL 14 END OF CYL. BAD # SECT/TRK JSB FAULT 15 UN IMPLEMENTED CODE FAULT JMP ERRDS 16 OVER RUN JUST RETRY JMP ERRDS 17 CORRECTABLE ERROR DON'T EVEN TRY JMP SPARE 20 ILLEGAL SPARE JMP INERR 21 DEFECTIVE TRACK - REPORT JMP ST2ER 22 ACCESS NOT READY - STATUS 2 ERROR JMP ST2ER 23 STATUS 2 GO CHECK JSB FAULT 24 UN IMPLEMENTED FAULT JSB FAULT 25 ERROR CODEDS JMP ST2ER 26 ILLEGAL WRITE TEST ST 2 JMP UWAIT 27 WAIT FOR THE UNIT. * * ERRDS ISZ EDCNT STEP OPERATION ERROR COUNT JMP OVER OK TRY AGAIN JSB INT5N TURN ON INTERRUPTS LDA VFLAG VERIFYING? SZA JMP DISK5,I YES, RETURN JMP INITE,I GO TO SPARING ROUTINE WHETHER READ OR WRITE * * STATUS-2 ERROR POSSIBLE CONDITIONS ARE: * NO ERROR SO JUST RETRY AT ERRDS * NOT READY GO TO KNRERR TO WAKE HIM UP * PROTECTED SEND TURN ON SWITCH MESSAGE * * * ST2ER LDA MADDR INITIALIZING? (IE.WRITING?) SSA JMP ST2 NO LDA B YES, STATUS -2 TO A AND M40 KEEP /FORMAT BITS SZA,RSS SET?? JMP FRMT IF SWITCH OFF GO BITCH LDA STAT2 NO, THEN WRITE PROTECT SWITCH ON? AND .100 SZA JMP WRPTM YES, THEN ASK USER TURN IT OFF * ST2 SSB,RSS IF NOT STATUS 2 ERROR JMP ERRDS JUST COUNT IT AND TRY AGAIN LDA B GET THE STATUS WORD AGAIN AND D4 ISOLATE THE SEEK CHECK BIT SZA IF SET THEN WE HAVE A BAD ADDRESS JMP EOCYL SO GO RESTART THE GEN. * JMP NRERR MUST BE NOT READY * FRMT JSB INT5N TURN ON INTERRUPTS JSB WRITE DEF MES33 TURN ON FORMAT SWITCH DEF D11 LDA STAT2 PROTECT SWITCH ON? AND .100 SZA JMP WRPT2 YES ASK USER TO TURN IT OFF JMP WRPT3 NO, THEN WAIT FOR USER TO TURN FORMAT SWITCH ON * WRPTM JSB INT5N TURN ON INTERRUPTS WRPT2 JSB WRITE WRITE PROTECT SWITCH IS OFF DEF MES32 TELL THE USER TO TURN IT ON DEF D11 WRPT3 JSB PAUSE WAIT FOR TURN ON JMP TRY05 TRY AGAIN. NRERR JSB INT5N TURN ON INTERRUPTS JSB WRITE DISC IS NOT READY DEF MS4 SEND THE WORD TO THE MAN DEF D5 JSB PAUSE JMP TRY05 ON RESTART RETRY * FAULT NOP ENTRY FOR TRACE BACK ONLY JSB INT5N TURN ON INTERRUPTS JMP EXITU SHOULD NEVE GET HERE SPARE JSB INT5N TURN ON INTERRUPTS CCA RETURN WITH ALL 1'S IN A REG JMP DISK5,I HAD TRIED TO READ OR WRTIE ON SPARED TRCK * THE DRIVER ENTERS HERE AFTER 10 TRIES HAVE FAILED TO INITILIZE THE * DISC. EOCYL JSB INT5N TURN ON INTERRUPTS JSB WRITE ELSE SEND BAD SPECIFICATION DEF ERR8 UNRECOVERABLE DISC ERROR-EOC OR SEEK CHE DEF D22 LDA TRCK1 TRACK TYRING TO SEEK JSB PTRK5 PRINT MORE INFO ON TRACK * ABRT? LDA MADDR READ OPERATION? SSA JMP INIEU YES, ASK IF WANT TO CONTINUE * LDA ATB32 WRITE, THEN TRACK SPARING? ADA N1 LDA A,I SSA JMP EXITU YES, THEN ABORT UTILITY JMP INIEU NO, ASK IF WANT TO CONTINUE * INERR JSB INT5N TURN ON INTERRUPTS * INIER CLA CLEAR IFLAG STA IFLAG LDA SYSTP TYPE OF SYSTEM OF DISC? SZA RTE DISC? JMP INIED NO, DOS INBSP JSB WRITE PRINT HEADER FOR BAD TRACK DEF ERR9 BAD TRACK AT: DEF D7 LDA TRACK RTE DISC JSB PTRK5 CONVERT BAD TRACK ADDR TO ASCII LDA MADDR CORE ADDRESS OF BUFFER SSA READ OPERATION JMP INIEU YES LDA ATB32 NO ADA N1 LDA A,I SSA TRACK SPARING WANTED? JMP INIET YES INIEU JSB QUERY NO, ENCOUNTERED BAD TRACK ON A READ OPER DEF MSG28 OR WRITE WITHOUT TRACK SPARING DEF D5 ASK OF USER WANTS TO CONTINUE WITH TASK DEF EXP6 REPLY YES OR NO DEF D9 LDA RBUF CHECK RESPONSE CPA YE RSS JMP EXITU USER DOES NOT WISH TASK TO CONTINUE,ABOR LDA KB+1 YES, MARK BIT 15 OF KB+1=1 ADA MSIGN STA KB+1 INDICATING DATA IS DEFECTIVE JMP DISK5,I RETURN * TRACK IS NOW REPORTED TO THE OPERATOR INIET LDA NSPTR # OF SPARE TRACKS FOR SUB# CPA UBADC OUT OF SPARES? RSS JMP INIEZ NO JSB DCASC YES DEF *+4 CONVERT SUBCHANNEL # TO ASCII DEF ERR4+16 DEF D1 # OF ASCII WORDS TO BE PUT IN BUFFER DEF SUB# SUBHANNEL # TO BE CONVERTED JSB WRITE SEND MESSAGE TO USER DEF ERR4 OUT OF SPARES FOR SUBCHNL XX DEF D17 JMP EXITU UTILITY IS ABORTED * INIEZ LDA AINXS SET DRIVER ABORT ADDRESS TO NEXT SPARE E STA INITE LDA CSPAR BASE ADDRESS OF SPARE TRACK POOL ADA UBADC ADD # USED SO FAR-INDICATES TRACK USED A JSB FLGDS FLAG TRACKS DEFECTIVE AND SPARED RESPECT JSB WRITE REPORT THE USED SPARE TRACK DEF SPMS SPARED TO: DEF D5 LDA SPTRK SPARE TRACK # JSB PTRK5 PRINT THE ADDR OF SPARE TRACK ISZ UBADC INCREMENT # OF USED SPARE TRACKS LDA AINIE RESET THE INIT ABORT ADDRESS FOR DRIVER STA INITE JMP RDSK5,I RETURN TO ORIGINAL LOC * * SPARED TRACK WAS BAD * NIXSP JSB WRITE BAD TRACK AT: DEF ERR9 DEF D7 LDA UBADC ADDR OF BAD TRACK ADA CSPAR JSB PTRK5 ISZ UBADC INCREMENT # SPARES USED JMP INIET SPARE THE PREVIOUS SPARE TRACK * * DOS DISC * INIED LDA MADDR SSA READ OPERATION? JMP INIEG YES LDA TRACK NO, WRITE ERA SEZ EVEN TRACK? JMP INIEC ODD TRACK DO NOT PRINT BAD TRACK MESSAGE INIEG JSB WRITE PRINT BAD TRACK HEADER DEF ERR9 DEF D7 LDA TRACK JSB PTRK5 SEND THE BAD TRACK # LDA MADDR READ OPERATION? SSA JMP INIEU ASK IF USER WANTS UTILITY TO CONTINUE INIEC LDA UBADC WRITE OPERATION CPA D10 ALL 10 SPARE TRACKS USED UP? RSS JMP INIEE NO, THEN SPARE TRACK JMP INIET YES, OUT OF SPARES * INIEE LDA ANXSD ADDRESS OF LOC TO GO TO IN A STA INITE DEFECTIVE SPARE IS FOUND LDA TRACK ODD OR EVEN TRACK#? ERA CHECK BIT 0 SEZ BIT 0 ON? JMP INODD YES, THEN TRACK IS ODD LDA UBADC NO CMA,INA BASE SPARE TRACK ADDR - # OF USED SPARES ADA CSPAR -1 = ADDR OF NEXT TRACK TO BE USED AS SPA ADA N1 JSB FLGDS FLAG TRACKS DEFECTIVE AND SPARES JSB WRITE DEF SPMS SPARED TO DEF D5 LDA SPTRK TO REPORT THE USED SPARE JSB PTRK5 CONVERT THE TRACK ADDRESS TO ASCII ISZ DOSDF TURN THE DOS DEFECTIVE TRACK FLAG ON LDA AINIE RESET THE INIT ABORT ADDRESS FOR DRIVER STA INITE JMP RDSK5,I RETURN TO ORIGINAL LOC * FIRST TRACK WAS EVEN, SO 2ND TRACK HAS TO BE MARKED DEFECTIVE TOO * INIEW CLA CLEAR DOS DEFECTIVE TRACK FLAG STA DOSDF LDA UBADC # OF USED SPARES CMA,INA BASE SPARE TRACK ADDR-# OF USED SPARES ADA CSPAR A REG HAS TRACK # OF SPARE TRACK TO BE U LDB ANXSD SET INIT ABORT ADDRESS FOR DRIVER STB INITE JSB FLGDS FLAG TRACKS DEFECTIVE AND SPARED LDA UBADC BUT DO NOT REPORT IT ADA D2 INCREMENT # OF USED SPARES BY 2 STA UBADC LDA AINIE RESET INIT ABORT ADDRESS STA INITE JMP RDSK5,I RETURN TO ORIGINAL LOC * FIRST TRACK WAS ODD INODD LDA UBADC # OF USED SPARE TRACKS CMA,INA CONVERT IT TO -VE # ADA CSPAR BASE ADDR OF SPARE TRACK POOL LDB ANXSD SET INIT ABORT BIT FOR DRIVER STB INITE JSB FLGDS FLAG IT DEFECTIVE AND SPARED LDA AINIE RESET INIT ABORT ADDRESS FOR DRIVER STA INITE LDA DUNIT DESTINATION UNIT # STA UN#IT SET UNIT # FOR DRIVER CLA,INA SET IFLAG SO THAT DRIVER DOES NOT PROCESS ERRORS STA IFLAG LDA TRACK TRACK # JUST FOUND DEFECTIVE ADA N1 ADD -1 TO IT STA TRACK TRACK # OF EVEN # TRACK ALREADY WRITTEN LDB AJB BUFFER ADDRESS JSB RD05 READ THE EVEN NUMBERED TRACK FROM DEST U CLA CLEAR IFLAG STA IFLAG LDA ANXSE SET INIT ABORT ADDRESS FOR DRIVER STA INITE LDA UBADC # OF USED SPARES CMA,INA ADA CSPAR A REG HAS SPARE TRACK TO BE USED ADA N1 -1 MAKES IT EVEN TRACK # JSB FLGDS FLAG TRACKS DEFECTIVE AND SPARED JSB WRITE DEF ERR9 PRINT BAD TRACK HEADER DEF D7 LDA TRACK JSB PTRK5 JSB WRITE DEF SPMS SPARED TO: DEF D5 LDA SPTRK DIVIDE SPARE TRACK# BY 2 JSB PTRK5 PRINT LOC OF SPARE TRACK ON TTY LDA UBADC ADA D2 UPDATE # OF SPARES USED STA UBADC ISZ TRACK SET TRACK # BACK TO ORIGINAL # LDA AINIE RESET INIT ABORT ADDRESS STA INITE JSB RDSK5,I RETURN TO ORIGINAL LOC * ENTER HERE IF A SPARE IS BAD NXSPD LDA UBADC # OF USED SPARES ADA D2 INCREMENT IT BY 2 STA UBADC JMP INIEC * ENTER HERE IF A BAD SPARE IS FOUND AND IT IS EVEN # TRACK * AND ITS CORRESPONDING ODD TRACK HAS BEEN ALREADY SPARED NXSPE LDA UBADC ADA D2 STA UBADC ISZ TRACK JSB RD05 READ THE ODD SPARED TRACK DATA BACK IN A JMP INIEC AND REDO SPARING USING NEXT TWO TRACKS * AINIE DEF INIER AINXS DEF NIXSP ANXSD DEF NXSPD ANXSE DEF NXSPE M1400 OCT 1400 M440 OCT 440 SPMS ASC 5,SPARED TO: * WRTCM OCT 4000 ENDC OCT 12400 VERCM OCT 3400 CALC OCT 600 WAITX OCT 13000 M40 OCT 40 STAT1 NOP STAT2 NOP * * * UWAIT WAIT FOR UNIT TO BECOM AVAILABLE * * UWAIT LDA WAITX SEND THE WAIT UWAT1 JSB OUTCC COMMAND JSB WAITF AND WAIT JMP OVER OK NOW TRY IT * * * RECAL RECALABLRATE THE DISC ON CYLINDER COMAPRE ERRORS * RECAL ISZ DERCN INCREMENT DISC ERROR COUNT JMP RECL1 NOT 10 YET CMPER JSB INT5N ERROR ENCOUNTERED 10 TIMES JSB WRITE DEF ERR13 CYLINDER OR HEAD/SECT COMPARE ERROR AT: DEF D20 LDA TRCK1 JSB PTRK5 PRINT TRACK ADDRESS JMP ABRT? ABORT OR CONTINUE? RECL1 LDA CALC GET COMMAND JMP UWAT1 GO SEND IT * * ENDOK AFTER A SUCCESFUL TRANSFER WE MUST DO AND END * TO ALLOW OTHER CPU'S TO ACCESS THE CONTROLLER. * EXCEPT IF WE JUST READ A CHUNCK TO WRITE PROTECT IT. * ALSO IF DOING INITIALIZE AND NOT FLAGING DEFECTIVE DO * A VERIFY TO CHECK FOR ERRORS. * * ENDOK LDA INIT1 GET THE INIT FLAG SZA,RSS IF CLEAR JMP ENDSX JUST GO SEND THE END * RAL,SLA IF SPARING JMP SPARA GP SET UP SPARE ADDRESS * RAL,SLA IF JUST PROTECTING JMP STDAD USE STANDARD ADDRESS * RAL,SLA IF FLAGING DEFECTIVE JMP ENDSX DON'T EVEN CHECK * STDAD LDB SIZE EITHER STRAIGHT INIT. OR CMB,INB PROTECT LSR 7 SET UP THE STB VERCO SECTOR COUNT LDA VERCM SEND VERIFY COMMAND JSB XFER AND GO DEF WAITC-1 DO IT DEF VERCO SZA ANY ERROR IS JMP ERRDS BAD NEWS * * ENDSX LDA ENDC GET THE END COMMAND JSB OUTCC SEND IT JSB INT5N TURN ON INTERRUPTS JMP DISK5,I AND EXIT * * SPARA SETS ADDRESSES TO VERIFY A SPARE TRACK * SPARA DLD CYLA2 USE THE REAL DST CYLAD ADDRESS FOR SEEK JMP STDAD GO TRY THE VERIFY * * * XFER THE TRANSFER ROUTINE * DOES DMA SET UP,AND SENDS A SERIES OF WORDS TO THE DISC * CONTROLLER, THEN STATUS IS DONE USING STATW. * * CALLING SEQUENCE: * * A= COMMAND FOR THE XFER READ/WRITE INIT ETC. * B= ADDRESS WITH DIRECTION BIT SET FOR DMA * JSB XFER * DEF COMMAND LIST * DEF LAST COMMAND (ALSO DMA COMMAND) * * XFER NOP STA R/WCM SET THE READ WRITE COMMAND LDA DSKDR SET UP THE OTA 6 DMA CLC 2 OTB 2 STC 2 LDA SIZE OTA 2 LDB XFER,I GET THE HEAD OF THE LIST ISZ XFER STEP TO THE END ADDRESS NXTC INB STEP TO THE FIRST COMMAND LDA B,I GET THE WORD CPB ACTCM IF ACTION COMMAND CCE,RSS SKIP TO THE CLC RAL,CLE,SLA,ERA ELSE CLEAR THE SIGN AND IF SET DSK20 CLC DC TELL THE CONTROLLER IT IS A COMMAND DSK21 OTA DC,C SEND THE WORD CPB XFER,I IF THIS IS THE ACTION WORD STC 6,C START THE DMA DSK22 STC DC AND THE CONTROLLER SEZ IF NOT A COMMAND SKIP THE FLAG WAIT JSB WAITF WAIT FOR THE FLAG STF 6 STOP THE DMA CPB XFER,I DONE? RSS YES SKIP JMP NXTC NO GO DO THE NEXT ONE * JSB WAITF THIS WAIT IS ONLY NEEDED FOR VERIFY ISZ XFER STEP TO EXIT ADDRESS JSB STATW GET THE STATUS WORDS JMP XFER,I AND GET OUT * * XFER COMMAND TABLE * WAITC OCT 113000 SEEKC OCT 101200 MUST CONFIGURE TO UNIT CYLAD NOP CYLINDER ADDRESS HDSCT NOP HEAD AND SECTOR ADRES OCT 106000 NEEDS UNIT CYLA2 NOP CYLINDER ADDRESS FOR ADDRESS RECORD HDSC2 NOP FILMK OCT 107404 FILE MASK/SPARING ONLY R/WCM OCT 102400 READ/WRIT COMMAND VERCO NOP VERIFY COUNT * * END OF LIST * * UNIT CONFIGURE LIST * UNITC DEF *+1,I DEF WAITX DEF WA#KE DEF SEEKC DEF VERCM DEF CALC DEF ADRES ACTCM DEF R/WCM DEF STACC DEF WRTCM DEF R#DCM DEF PT#SK DEF PT#AD DEF P#EN #UNST ABS UNITC-*+1 NUMBER IN THE LIST * * * DADTR ROUTINE TO TRANSLATE A TRACK ADDRESS INTO CYL,HEAD * UNIT TO BE STORED AT: * CYL AT: PT#TR * HEAD AT: H#AD ALSO RETURNED IN B. * # HEAD/CYL AT: NSRFC * * CALLING SEQUENCE: * * LDA TRACK SET TRACK ADDRESS IN A. * LDB MAPAD SET MAP ADDRESS IN B. * JSB DADTR CALL * RETURN A=UNIT#, B=HEAD * * DADTR NOP STB H#AD SAVE THE ADDRESS INB BUMP TO THE HEAD/UNIT STA DTEMP SAVE THE TRACK ADDRESS STB UNCOU SAVE UNIT ADDRESS LDA B,I GET AND ISOLATE ALF # HEADS PER CYL AND M17 STA PT#TR SAVE IT STA NSRFC # OF HEADS/CYLINDER CLB DIVIDE # TRACKS LDA DTEMP BY DIV PT#TR NUMBER OF HEADS/CYL ADA H#AD,I ADD BASE CYLINDER ADDRESS STA PT#TR SET THE CYLINDER ADDRESS BLF,BLF PUT HEAD ADDRESS IN IT'S PLACE ADB UNCOU,I ADD THE BASE HEAD ADDRESS LDA B PUT INTO A TO AND M74C ISOLATE STA H#AD STORE IT AS PROMISED SWP GET UNIT# FROM LOW B AND M377 ISOLATE UNIT# JMP DADTR,I RETURN B=HEAD, A=UNIT# * M377 OCT 377 DTEMP NOP * * STATW RETURNS STATUS AS FOLLOWS: * * STATB FULL STATUS 1 WORD * A ERROR CODE (MAX=27) FROM STATUS 1 * B STATUS 2 WORD * * STATW NOP LDA STACC GET STATUS COMMAND JSB OUTCC SEND IT JSB WAITF WAIT FOR FLAG DSK24 LIA DC,C GET WORD 1 JSB WAITF WAIT FOR FLAG DSK25 LIB DC,C GET WORD 2 STA STATB SAVE WORD 1 ALF,ALF ROTATE AND M37 ISOLATE CPA M37 ATTENTION? JMP STATW+1 YES TRY AGAIN * JMP STATW,I NO - RETURN * * * OUTCC OUTPUT A COMMAND WORD * OUTCC NOP DSK26 CLC DC SEND "HERE COME DE WORD" DSK27 OTA DC,C SEND DE WORD DSK28 STC DC SET UP IN CASE IT IS NEEDED JMP OUTCC,I RETURN * * * WAITF WAITS FOR A FLAG * WAITF NOP DSK29 SFS DC HERE YET JMP *-1 NO KEEP TRYING * JMP WAITF,I YES RETURN * * M37 OCT 37 STACC OCT 1400 M17 OCT 17 M74C OCT 7400 MADDR NOP MEMORY ADDRESS FOR CURRENT TRANSFER UNCOU NOP DCMND NOP DISC ADDRESS FOR CURRENT TRANSFER EDCNT NOP ERROR COUNT FOR CURRENT TRANSFER STATB NOP W#CMD NOP RDSK5 NOP MES32 ASC 11,TURN OFF DISC PROTECT MES33 ASC 11,TURN ON FORMAT SWITCH MS4 ASC 5,READY DISC * * * * PTRK5 - PRINT LOCATION OF TRACK ON TTY * CALLING SEQUENCE: JSB PTRK5 * A REG = TRACK# * * PTRK5 NOP STA TEMP1 SAVE TRACK # LDB DIST1 FIND PHYSICAL TRACK ADDRESS JSB DADTR LDA ATB32 IF TRACK SPARING IS DESIRED TEHN ADA N1 LDA A,I SSA,RSS SBCHNL #'S ARE REAL, OTHERWISE MADE UP B JMP PTR55 TRACK SPARING NOT DESIRED LDA SYSTP DOS SYSTEM? SZA,RSS JMP PTR52 NO LDA TEMP1 YES, THEN DIVIDE TRACK # BY 2 ARS FOR DOS LOGICAL TRACK # STA TEMP1 PTR52 JSB DCASC CONVERT SUBCHANNEL # TO ASCII DEF *+4 DEF TRAD1+4 DEF D1 DEF SUB# SUBCHANNEL # JSB DCASC CONVERT LOGICAL TRACK# TO ASCII DEF *+4 DEF TRAD1+10 DEF D2 DEF TEMP1 TRACK# JSB WRITE PRINT SUBCHNL AND TRACK#'S DEF TRAD1 DEF D12 * PTR55 JSB DCASC CONVERT CYLINDER # TO ASCII DEF *+4 DEF TRAD2+2 DEF D2 DEF PT#TR CYLINDER # LDA H#AD ALF,ALF STA HEAD JSB DCASC CONVERT HEAD # TO ASCII DEF *+4 DEF TRAD2+8 DEF D1 DEF HEAD HEAD # JSB DCASC CONVERT UNIT# TO ASCII DEF *+4 DEF TRAD2+13 DEF D1 DEF UN#IT UNIT# JSB WRITE PRINT ABSOLUTE ADDRESS OF TRACK DEF TRAD2 DEF D14 JMP PTRK5,I RETURN * TRAD1 ASC 12,SBCHNL# , TRACK# TRAD2 ASC 14,CYL# , HEAD# , UNIT# * * * GETAL - GET CHAR FROM RBUF, RETURN IN A * CALLING SEQUENCE: JSB GETAL * RETURNS: CURRENT CHAR IN A REG * * GETAL NOP LDA CMFLG CMFLG=COMMA-IN FLAG SZA,RSS SKIP IF NO COMMA IN JMP BLRET RETURN BLANK LDB BUFUL GET U/L FLAG IGNOR LDA CURAL,I GET CHAR FROM LBUF SZB SKIP IF LOWER CHAR ALF,ALF ROTATE TO LOWER AND M377 ISOLATE LOWER CHAR CMB,SZB RESET U/L, SKIP IF UPPER CHAR ISZ CURAL INCR RBUF ADDRESS STB BUFUL SAVE U/L FLAGE CPA BLANK CHAR=BLANK? RSS JMP COMIN COMMA IN? ISZ MAXC INCREMENT MAX CHAR COUNT JMP IGNOR IGNORE BLANKS JMP BLRET RETURN WITH BLANK COMIN CPA COMMA CHAR=COMMA? ISZ CMFLG RESET FLAG TO SHOW COMMA IN (SKIPS) JMP GETAL,I RETURN WITH NON-BLANK CHAR BLRET LDA BLANK REPLACE WITH BLANK CHAR JMP GETAL,I RETURN WITH BLANK * COMMA OCT 54 BLANK OCT 40 BUFUL NOP CMFLG NOP COMMA FLAG=-1/0 = NOT IN/IN * * * GETOC - CONVERT OCT/DEC ASCII TO BINARY - CONVERTS THE NEXT CHAR * IN RBUF FROM ASCII TO THEIR BINARY (DECIMAL OR OCTAL) VALUE * CALLING SEQUENCE: JSB GETOC * A REG = MAX. NO. OF CHARS IN CONVERSION REQUEST. IF A IS * +VE, THE REQUEST IS FOR OCTAL, IF A IS -VE, THE * REQUEST IS FOR DECIMAL * RETURN: P - INVALID DIGIT OR OVERFLOW IN CONVERSION * P+1 - A = CONVERTED # * * GETOC NOP LDB N8 GET OCTAL RANGE SSA SKIP IF OCTAL REQUEST LDB N10 GET DECIMAL RANGE STB DRANG SET DIGIT RANGE SSA,RSS SKIP IF DECIMAL REQUEST CMA,INA SET REQUEST COUNT TO -VE STA MAXC SET MAX. NO OF DIGITS CCA STA DIFLG SET DATA-IN FLAG=NO DATA IN STA CMFLG SET COMMA-IN FLAG CLA STA OCTNO OCTNO=OCTAL # GETNX JSB GETAL GET CHAR FROM RBUF CPA BLANK CHAR = BLANK? (COMMA IN) JMP ENDOC YES-RETURN ADA .N60 SUBTRACT 60B FROM CHAR STA TCHAR SAVE CHAR SSA SKIP IF VALID LOWER LIMIT JMP DGERR INVALID DIGIT ADA DRANG CLE,SSA,RSS JMP DGERR ISZ DIFLG INCR DATA-IN FLAG, SKIP NOP LDA OCTNO GET PREVIOUS OCT NO ADA A SET A = OCT NO * 2 ADA A SET A = OCTNO * 4 LDB DRANG GET DIGIT RANGE CPB N10 RENGE=DECIMAL? ADA OCTNO SET A = OCTNO * 5 ADA A SET A = OCTNO * 10/8 ADA TCHAR SET A = NEW OCTAL NO. STA OCTNO SEZ TEST FOR OVERFLOW JMP DGERR INVALID NO. ISZ MAXC SKIP IF ALL DIGITS PROCESSED JMP GETNX GET NEXT DECIMAL DIGIT ISZ GETOC INCR RETURN ADDRESS LDA OCTNO GET OCTAL EQUIVALENT DGERR JMP GETOC,I RETURN ENDOC ISZ DIFLG SKIP - NO DATA IN JMP *-4 DATA IN - NORMAL RETURN JMP GETOC,I RETURN - ERROR * TCHAR NOP MAXC NOP DIFLG NOP DATA-IN FLAG = -1/0 = NOT IN/IN DRANG NOP DIGIT RANGE OCTNO NOP OCTAL # * * * GINIT - INITIALIZE CHAR TRANSFER - ROUTINE SETS THE CURRENT * ADDRESS AND UPPER/LOWER FLAG FOR SCANNING RBUF * CALLING SEQUENCE: JSB GINIT * * GINIT NOP LDA ARBUF ALBUF = ADDR OF RBUF STA CURAL SET CURRENT RBUF ADDRESS CCB STB BUFUL BUFUL=BUFFER U/L FLAG JMP GINIT,I * .N60 OCT -60 CURAL NOP * * * DCASC - ROUTINE CONVERTS DECIMAL NUMBERS TO ASCII * CALLING SEQUENCE: JSB DCASC * DEF *+4 RETURN ADDRESS * DEF PARM1 PARM1 IS VARIABLE NAME TO CONTAIN * DEF PARM2 PARM2 IS MAX # OF WORDS IN PARM1 * DEF PARM3 PARM3 IS THE DEC# TO BE CONVERTED * * DCASC NOP CLA STA DFLAG STA CWORD LDA DCASC,I STA RETRN ISZ DCASC LDA DCASC,I STA INAM BUFFER ADDRESS ISZ DCASC LDA DCASC,I LDA A,I ADA N1 STA NWORD LENGTH OF BUFFER-1 LDA INAM BUFFER TO BE BLANKED LOOP0 LDB SPACE STB A,I BLANK OUT A WORD IN BUFFER LDB CWORD USE CWORD AS COUNTER TO POINT IN TO BUFFER CPB NWORD ALL WORDS IN BUFFER DONE? JMP DCAS1 YES, GO ON INA ISZ CWORD INCREMENT COUNTER JMP LOOP0 DCAS1 ISZ DCASC LDA DCASC,I LDA A,I LOAD INTEGER TO BE CONVERTED LOOP CLB DIV D10 DIVIDE INTEGER BY BASE 10 STA QOTNT QOTNT IS USED TO EXTRACT REMAINING DIGITS ADB .60 B REG CONTAINS REMAINDER WHICH IS THE LATEST DIGIT * TO BE CONVERTED BY ADDING OCTAL 60 STB BYTE ASCII INTEGER SAVED LDA DFLAG CHECK TO SEE IF THIS IS A LOW ORDER BYTE SZA LOW ORDER BYTE IF IFLAG=0, ELSE HIGH ORDER BYTE JMP HIGH LDA BYTE STA CWORD STORE BYTE IN LOWER HALF OF CWORD LDA QOTNT GET READY TO EXTRACT AND CONVERT NEXT DIGIT ISZ DFLAG SET FLAG TO INDICATE WORKING ON HIGH ORDER BYTE JMP LOOP START CONVERSION AGAIN HIGH LDA BYTE BIT 0 NOT SET IF HIGH ORDER BYTE ALF,ALF STORE BYTE IN UPPER HALF OF CWORD ADA CWORD STA CWORD LDA NWORD ADA INAM REG A POINTS TO BUFFER WHERE CWORD IS PLACED LDB CWORD STB A,I LDA NWORD SZA,RSS HAS THE BUFFER BEEN FILLED? JMP RETRN,I YES,RETURN TO CALLING ROUTINE ADA N1 NO,DECREASE NWORD TO POINT TO NEXT WORD IN BUFFER STA NWORD CLA STA DFLAG CLEAR FLAG TO INDICATE WORKING ON LOW ORDER BYTE LDA QOTNT GET READY TO EXTRACT NEXT DIGIT SZA IF QOTNT=0 THEN NO MORE DIGITS LEFT TO CONVERT JMP LOOP JMP RETRN,I * RETRN NOP NWORD NOP CWORD NOP QOTNT NOP BYTE NOP INAM NOP DFLAG NOP ADWRD DEF CWORD .60 OCT 60 * * * RMOVI - REMOVES INDIRECTS FROM ADDRESSES PASSED AS PARAMETERS * CALLING SEQUENCE: JSB RMOVI * A REG = ADDR WHOSE INDIRECTS HAVE TO BE REMOVED * RETURNS: ADDRESS WITHOUT INDIRECTS IN A REG * * RMOVI NOP ROUTINE TO REMOVE INDIRECTS FROM DEF ADDRESSES RSS MOREI LDA A,I REG A HAS INDIRECT ADDRESS RAL,CLE,SLA,ERA JMP MOREI STILL AN INDIRECT ADDRESS JMP RMOVI,I * * * ***** MESSAGES ****** * * MSG1 ASC 10,DISC BACKUP UTILITY MSG2 ASC 3,TASK? EXP2 ASC 13,REPLIES ARE: SA,RE,CO,RW MSG3 ASC 7,TYPE OF XXXX? EXP3 ASC 9,REPLIES ARE: UN,FR MSG4 ASC 11, DISC CHANNEL#? EXP4 ASC 10,REPLY 10 TO 77 OCTAL MSG5 ASC 9,SOURCE DISC TYPE? EXP5 ASC 19,REPLIES ARE:7900,7905,7906,7920,7925 MSG6 ASC 10,WANT TRACK SPARING? EXP6 ASC 10,REPLIES ARE: YES,NO MSG7 ASC 8,RTE OR DOS DISC? EXP7 ASC 9,REPLIES ARE: RT,DO MSG8 ASC 28,ENTER TRACK MAP INFO FOR SOURCE DISC UNIT AS SHOWN BELOW MSG9 ASC 8,FROM CYLINDER#? MSG9A ASC 7,FROM TRACK #? MSG9B ASC 7,TO CYLINDER #? MSG9C ASC 5,TO TRACK#? EXP9 ASC 7,REPLY 0 TO 410 EXP9A ASC 7,REPLY 0 TO 202 MSG10 ASC 6,# OF TRACKS? EXP10 ASC 8,REPLY 1 TO 1233 EX10A ASC 14,REPLY 1 TO (203-FROM TRACK#) EX10B ASC 7,REPLY 1 TO 200 MSG11 ASC 7,# OF SURFACES? EXP11 ASC 6,REPLY 1 TO 3 MSG12 ASC 8,STARTING HEAD#? EXP12 ASC 6,REPLY 0 TO 2 MSG13 ASC 5,PLATTER #? EXP13 ASC 19,REPLIES ARE: 0,1 (0-FIXED,1-REMOVABLE) MSG14 ASC 9,MAG TAPE CHANNEL#? MSG15 ASC 4,FILE ID? EXP15 ASC 17,ENTER 72 CHAR MAX MT FILE ID MSG16 ASC 5,MT FILE#? EXP16 ASC 6,REPLY 1 TO 8 MSG17 ASC 4,VERIFY? MSG18 ASC 14,EOT REACHED, MOUNT NEXT TAPE MSG19 ASC 7,TASK COMPLETED MSG20 ASC 15,DISC BACKUP UTILITY IS ABORTED MSG21 ASC 10,SOURCE DISC DRIVE#? EXP21 ASC 6,REPLY 0 TO 7 EX21A ASC 6,REPLY 0 TO 3 MSG22 ASC 8,VERIFY ERROR AT: MSG23 ASC 6,MT NOT READY MSG24 ASC 13,TRACK SIZE BUFFER DESIRED? MSG25 ASC 23,MEM SIZE TOO SMALL FOR VERIFY W/ 6144 WORD BUF MSG26 ASC 9,MOUNT CORRECT TAPE MSG27 ASC 16,RESTART UTILITY BY ENTERING 'GO' MSG28 ASC 5,CONTINUE? MSG29 ASC 7,MOUNT TAPE# 1 MSG30 ASC 25,TRACK AT FOLLOWING LOC WAS NOT SAVED SUCCESSFULLY MSG31 ASC 5,VERIFYING MSG32 ASC 14,# OF SUBCHNLS TO BE COPIED? EXP32 ASC 6,REPLY 1 TO 3 ERR0 ASC 5,WARNING -- ERR1 ASC 7,FILE NOT FOUND ERR2 ASC 15,NO WRITE RING, WRITE ENABLE MT ERR4 ASC 17,OUT OF SPARE TRACKS FOR SUBCHNL ERR5 ASC 10,LAST TRACK TOO LARGE ERR6 ASC 16,SUBCHNLS ON SOURCE UNIT OVERLAP ERR7 ASC 15,IMPROPERLY DEFINED SUBCHNL: ERR8 ASC 22,UNRECOVERABLE DISC ERROR-EOC OR SEEK CHECK ERR9 ASC 7,BAD TRACK AT: ERR12 ASC 9,ILLEGAL SPARE AT: ERR13 ASC 20,CYLINDER OR HEAD/SECT COMPARE ERROR AT: END DBKUP