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 
                                                                                      