ASMB,R,L,C,F HED RTE-B 7970 DEVICE SUBROUTINE A-29102-60008-1 REV. B NAM MTTDR,7 A-29102-60008-1 REV. B * * * * ENT MTTRD,MTTRT,MTTPT,MTTFS * * ***************************************************** * * RELOC. TAPE: 29102-60008 * LISTING: A-29102-60008-1 * SOURCE TAPE: 29102-80008 * ******************************************************* * * * *****EXTERNAL SYMBOLS***** * * **UTILITY ROUTINES** * EXT .ENTR,ERROR,.DST,EXEC,.STOP * * **EXTERNAL CONSTANTS** * EXT .2,.3,B200,M2 EXT .4 * * * * * * SUP PRESS LISTING SKP * * **ENTRY FORMATS AND FUNCTIONS** * * MTTRD(IUNIT,FPVAR,NI,IEOF,NT) * MTTRT(IUNIT,FPVAR,NI,IEOF,NT) * IUNIT=MAG TAPE LOGICAL UNIT NUMBER * FPVAR=FIRST VARIABLE OF ARRAY ELEMENT * TO BE TRANSFERRED TO/FROM CORE * NI=NO. OF VARIABLES TO BE TRANSFERRED * IEOF=END OF FILE FLAG RETURNED BY DRIVER * 0=NO END OF FILE * 1=END OF FILE * NT=ACTUAL NO. OF VARIABLES TRANSFERRED * * MTTPT(IUNIT,IF,IR) * IF=FILE SPACING PARAMETERS * +IF=FORWARD IF FILES * -IF=BACKWARD IF FILES * IR=RECORD SPACING PARAMETER * +IR=FORWARD IR RECORDS * -IR=BACKWARD IR RECORDS * * MTTFS(IUNIT,FUNC) * FUNC=TAPE FUNCTION * 0=GAP * 1=END OF FILE AND GAP * 2=REWIND * 3=REWIND/STANDBY * * FPVAR IS A FLOATING POINT PARAMETER, ALL OTHER * PARAMETERS ARE INTEGER. CONVERSION WORDS MUST * BE INCLUDED IN BRANCH TABLE * HED READ AND WRITE FUNCTIONS A-29102-60008-1 REV. A * MTTRT NOP WRITE ENTRY LDB .2 SET ENTRY FLAG STB STAT SAVE TEMPORARILY LDB MTTRT STB MTTRD JMP MTTRD+1 JUMP TO PSEUDO ENTRY SPC 2 UNIT BSS 1 VAR BSS 1 NI BSS 1 EOF BSS 1 NT BSS 1 * MTTRD NOP READ ENTRY JSB .ENTR DEF UNIT LDB STAT GET ENTRY FLAG CPB .2 WRITE? RSS YES. CLB,INB NO,READ STB CMDC SET COMMAND CODE * LDA UNIT,I IOR COMWD STA CONWD LDB CMDC WRITE? SLB JMP MT1 JSB STAT READ STATUS AND .4 YES! SZA WRITE RING? JMP REJ NO! MT1 STA STAT CLEAR ENTRY FLAG LDA NI,I CONVERT NO. OF VARIABLES STA NT,I ALS TO STA NII WORDS *CHECK FOR VALID VARIABLES DLD VAR,I LOAD FIRST VARIABLE JSB .DST ATTEMPT TO RESTORE DEF VAR,I LDB VAR STB VARA SET UP READ/WRITE ADDRESS ADB NII ADB M2 STB BFLAG DLD BFLAG,I LOAD LAST VARIABLE JSB .DST ATTEMPT TO RESTORE DEF BFLAG,I CLB STB EOF,I ZERO EOF FLAG JSB EXEC MAG TAPE REQUEST DEF *+5 DEF CMDC DEF CONWD VARA DEF * DEF NII STA STAT1 SAVE STATUS BRS CONVERT WORDS TO NO. OF SSB CMB,INB VARIABLES TRANSFERED LDA CMDC IS THIS AREAD OR A WRITE? SLA,RSS JMP MTTRD,I WRITE! SO RETURN STB NT,I SAVE NO. OF VARIABLES TRNSFD LDA STAT1 GET STATUS AND B200 SZA EOF ENCOUNTERED ON A READ? JMP EOFT YES! JMP MTTRD,I RETURN * * EOFT CLA,INA TURN ON EOF FLAG STA EOF,I JMP MTTRD,I RETURN SKP HED POSITION CONTROL A-29102-60008-1 REV. A SPC 2 UNITP NOP FPOS NOP RPOS NOP SPC 1 MTTPT NOP JSB .ENTR DEF UNITP LDB FPOS,I FILE POSITION COUNT SZB,RSS IF ZERO GOTO RECORD SKIP JMP RC1 SSB FORWARD OR BACK? JMP BACKF BACK! CMB,INB LDA B1300 FORWARDSPACE FILE FILE JSB SKIP SKIP FILE RC1 LDB RPOS,I RECORD POSITION COUNT SZB,RSS IF ZERO RETURN JMP MTTPT,I SSB FORWARD OR BACK? JMP BACKR BACK! CMB,INB LDA B300 FORWARD RECORD RCRD JSB SKIP SKIP RECORDS JMP MTTPT,I RETURN * BACKF LDA B1400 BACKFILE STA BFLAG SET BACK MOTION FLAG JMP FILE * BACKR LDA B200 BACK RECORD STA BFLAG SET BACK MOTION FLAG JMP RCRD * SPC 2 * * SKIP RECORD OR FILE * * ON ENTRY A=CONWD, B=COUNT * SKIP NOP IOR UNITP,I STUFF IN LOG UNIT STA CONWD STB COUNT SKIP1 JSB EXEC SKIP A RECORD OR A FILE DEF *+3 DEF .3 DEF CONWD ISZ COUNT DECREMENT COUNT AND SKIP IF DONE JMP SKIP1 NOT DONE YET! CLA STA BFLAG CLEAR BACK MOTION FLAG JMP SKIP,I RETURN SKP BEOT1 LDA .2 ILLEGAL REQUEST ERROR JMP ERR * REJ LDA .3 NO WRITE RING ERROR JMP ERR SPC 5 * * READ STATUS OF UNIT * STAT NOP JSB EXEC DEF *+4 DEF .13 DEF CONWD DEF STAT1 LDA STAT1 JMP STAT,I SKP HED ERROR MESSAGE PROCESSOR A-29102-60008-1 REV. A SPC 3 * * ERROR MESSAGE PROCESSOR * * ON ENTRY A = 1 NO LOGICAL UNIT FOUND * 2 ILLEGAL TAPE MOTION REQUEST * 3 NO WRITE RING * * ERROR MESSAGE IS OF THE FORMAT: * * ERROR MAGTP-X IN LINE NN * * WHERE X IS DESCRIBED ABOVE * NN IS THE LINE NO. WHERE THE ERROR OCCURRED * * ERR STA CODE JSB ERROR OUTPUT ERROR MESSAGE DEF *+3 DEF CODE DEF MGTPA JSB .STOP TERMINATE EXECUTION OF PROGRAM * * SKP HED CONTROL FUNCTIONS A-29102-60008-1 REV. A UNITF NOP FUNC NOP SPC 1 MTTFS NOP JSB .ENTR TRANSFER ARG ADDR DEF UNITF LDA FUNC,I FUNCTION CODE ADA M4 SSA,RSS JMP BEOT1 BAD REQUES! LDA FUNC,I ADA FUNCA ADD IN ADDRESS OF FUNCTION LIST LDA 0,I GET FUNCTION CODE FOR EXEC IOR UNITF,I OR IN LU # STA CONWD PUT IN EXEC REQUEST JSB EXEC PERFORM FUNCTION DEF *+3 DEF .3 DEF CONWD JMP MTTFS,I RETURN * HED MAG TAPE I/O OF PROGRAMS A-29102-60008-1 REV. A ******************************************************************** * THE RTE MAG TAPE DRIVER IS NOT COMPATIBLE WITH THE PROGRAM * LISTING ROUTINE IN BASIC. THE PROGRAM LISTING ROUTINE * OUTPUTS EACH LINE OF BASIC SOURCE IN PIECES, DEPENDING * ON AN HONESTY MODE DRIVER TO BLOCK THE LINE UP INTO ONE * RECORD. THAT IS, BASIC ASSUMES THAT THE SEVERAL PIECES WILL * NOT BE WRITTEN AS SEPARATE RECORDS, BUT AS CONTINUOUS DATA * WITH A (CRLF) TERMINATING THE RECORD. TO TERMINATE A RECORD * BASIC OUTPUTS A (CRLF). THIS IS FINE FOR PAPER TAPE,CRT,TTY, * AND TODS IN GENERAL, BUT THE RTE MAG TAPE DRIVER DOESNT WORK LIKE * THAT. * TO SOLVE THIS PROBLEM, THE FOLLOWING CODE BLOCKS UP * ALL THE PIECES OF A SINGLE LINE INTO A BUFFER (CALLED THE * BLOCK BUFFER). WHEN BASIC ATTEMPTS TO OUTPUT A (CRLF) * TO TERMINATE A RECORD, "FLUSH" GETS CALLED AND THE BLOCK BUFFER * GETS OUTPUT TO MAG TAPE. "MAGIO" IS CALLED WHEN BASIC TRYS TO * OUTPUT EACH PIECE. ******************************************************************** ENT MAGIO,FLUSH EXT B377,.10,INVSC,SWLST,CRLF1,LYNC1 EXT LSTIT,TYPE,TSTIT,DOIO,CRLF,L.RDR EXT B100,FRMTO,INDCK,.32 ***** * PROVIDE MAG TAPE I/O FOR COMMANDS * * ENTER HERE WHEN RECOGNIZING MAG TAPE MNEMONIC * IN COMMAND. * ON ENTRY: * .A.= NEXT CHAR FROM INPUT LINE * .B.= LU NBR OF MAG TAPE (FROM MNEM TBL) * ***** * MG.TP NOP STA TEMPA SAVE .A. (NEXT CHAR) STB TEMPB SAVE .B. (LU NBR) LDA FRMTO SZA,RSS IS THIS OPERATION "FROM" OR "ON" JMP ONMAG "ON" * ** READ PROGRAM FROM MAG TAPE * FRMAG LDA MG.TP MAKE IT LOOK LIKE L.RDR WAS STA L.RDR CALLED INSTEAD OF MG.TP LDA A.RDR JSB INDCK TRACE DOWN INDIRECTS INA STA TEMP1 SAVE ADDRESS OF L.RDR+1 LDA TEMPA RESTORE .A. LDB TEMPB RESTORE .B. JMP TEMP1,I * ** SET UP OTHER NAMES FOR MG.TP * MAGT1 EQU MG.TP MAGT2 EQU MG.TP MAGT3 EQU MG.TP MAGT4 EQU MG.TP A.RDR DEF L.RDR * ** MAKE THEM ENTRY POINTS * ENT MAGT1,MAGT2,MAGT3,MAGT4 * * ** PUT PROGRAM ON MAG TAPE * ONMAG LDA TEMPA CPA .10 END OF INPUT LINE? RSS JMP INVSC NO, ERROR LDA CWMSK IOR 1 BUILD CONTROL WORD STA MAGCW STA FLOU1 JSB SWLST SWITCH TO MAG TAPE DEVICE DEF MAGIO LDA M2 THIS SETS UP STA CRLF1 SPECIAL PROCESSING LDA AFLSH TO RE-DIRECT "CRLF" CALLS STA LYNC1 TO "FLUSH" FOR DUMPING BLOCK BUFFER JSB BINIT INITIALIZE BLOCK BUFFER JSB LSTIT OUTPUT THE PROGRAM LDA MAGCW GET LU# IOR B100 BUILD CONTROL WORD STA TEMPB AND SAVE IT JSB EXEC OUTPUT EOF DEF *+3 DEF .3 DEF TEMPB JMP MG.TP,I * AFLSH DEF FLUSH TEMPA NOP TEMPB NOP CWMSK OCT 20000 * SKP ***** * ** MAGIO ** SET UP A MAG TAPE DEVICE * AND HANDLE EACH PIECE OF OUTPUT DATA * BY PUTTING IT INTO A BLOCK BUFFER * * ON ENTRY: * .A.= # CHARS IN THIS PIECE * .B.= ADDRESS OF PIECE BUFFER * ***** NOP FIRST THREE WORDS DEC -73 SET UP MAG TAPE DEVICE MAGCW NOP MAGIO NOP REST BLOCKS OU OUTPUT PIECES STA TEMPA SAVE NBR CHARS TIHS PIECE STB TEMPB SAVE ADDRESS OF BUFFER STB NXPTR INITIALIZE PIECE BUFFER POINTER UPDAT LDA TEMPA STA NXCNT SET UP CTR FOR ISZING CMA,INA ADA TYPE STA TYPE CLA STA NXCTR INITIALIZE "CHARS READ " CNTR JSB TSTIT IF THIS PIECE OVERFLOWS LINE, SZA,RSS DO CRLF AND START WITH NEW LINE JMP UPDAT LDA BKCNT NEXT CHAR AN ODD OR EVEN CHAR SLA IN BLOCKING BUFFER? JMP SECND ODD CHAR FIRST CLA EVEN CHAR, START NEW WORD STA BKPTR,I JSB NXCHR GET CHAR FROM PIECE BUFFER ALF,ALF POSITION IT STA BKPTR,I ISZ BKCNT INCREMENT BLOCK CHAR COUNT ISZ NXCNT END OF PIECE? RSS JMP MAGIO,I YES, RETURN SECND JSB NXCHR NEXT CHAR FROM PIECE BUFFER IOR BKPTR,I INSERT IT IN BLOCK BUFFER STA BKPTR,I ISZ BKPTR BUMP BLOCK BUFFER POINTER ISZ BKCNT COUNT CHAR IN BLOCK BUFFER ISZ NXCNT END OF PIECE BUFFER? JMP FIRST NO, KEEP GOING JMP MAGIO,I YES RETURN * SKP ***** * ** NXCHR ** GET NEXT CHAR FROM PIECE BUFFER * NXCTR NOP NBR CHARS READ FROM PIECE BUFFER NXPTR NOP POINTER TO WORD WITH NEXT CHAR NXCNT NOP COUNTER TO ISZ FOR TERMINATION TEST * ***** NXCHR NOP LDA NXCTR ISZ NXCTR SLA JMP NX2ND NX1ST LDA NXPTR,I NEXT CHAR IS FIRST IN WORD ALF,ALF AND B377 JMP NXCHR,I * NX2ND LDA NXPTR,I NEXT CHAR IS SECOND IN WORD ISZ NXPTR AND B377 JMP NXCHR,I * * ***** * ** FLUSH ** FLUSH THE BLOCK BUFFER * * THIS ROUTINE GETS CALLED IN LIEU OF CRLF * ACTUALLY A CALL TO CRLF GETS RE DIRECTED HERE * ***** FLUSH NOP LDA BKCNT .A. = NBR CHARS IN BLOCK BUFFER SZA,RSS IF BLOCK BUFFER EMPTY, JMP FLOU2 RETURN IMMEDIATELY SLA,RSS IF EVEN NBR CHARS, JMP FLOU3 DO OUTPUT ISZ BKCNT IF NOT, LDA BKPTR,I PAD OUT WORD WITH BLANK IOR .32 STA BKPTR,I LDA BKCNT FLOU3 LDB BKBFA .B.= ADDRESS OF BLOCK BUFFER CMA,INA JSB DOIO DO OUTPUT FLOU1 NOP (SET UP IN MG.TP) JSB BINIT INITIALIZE BLOCK BUFFER FLOU2 CLA STA TYPE LDB CRLF RETURN JMP 1,I SKP ***** * ** BINIT ** INITIALIZE BLOCK BUFFER * BKBFA DEF BKBUF ADDRESS OF BLOCK BUFFER BKBUF BSS 36 BLOCK BUFFER BKPTR NOP POINTER TO WORD FOR NEXT CHAR BKCNT NOP NUMBER OF CHARS IN BLOCK BUFFER * ***** BINIT NOP CLA STA BKCNT LDA BKBFA STA BKPTR JMP BINIT,I * TEMP1 NOP HED CONSTANTS AND STORAGE A-29102-60008-1 REV. A CMDC OCT 0 COMMAND CODE NII OCT 0 NO. OF WORDS IN TRANSFER CONWD OCT 0 EXEC CONTROL WORD B1300 OCT 1300 B300 OCT 300 .13 DEC 13 COUNT OCT 0 FILE/RECORD COUNTER STAT1 OCT 0 STATUS WORD FUNCA DEF *+1 ADDRESS OF FUNCTION CNTRL WORDS OCT 1200 COMWD OCT 100 READ/WRITE CONTROL WORD OCT 400 OCT 500 MGTPA DEC 5 MAG TAPE MESSAGE ASC 3,MAGTP CODE OCT 0 ERROR CODE NO. BFLAG OCT 0 BACK MOTION FLAG B1400 OCT 1400 M4 OCT -4 END