C     MLOAD - LOADS THE MICRO WITH CODE GENERATED FROM THE ASSEMBLER A8080
C
C
C
C     FRED S. PARMENTER
C     MASS. COLLEGE OF PHARMACY, 179 LONGWOOD AVE., BOSTON, MA. 02215
C     CONTACT ME FOR ANY QUESTIONS ABOUT THE PROGRAM, NOTING ERRORS OR
C     JUST COMMENTS.
C
C     617-732-2926
C
C     APRIL 28, 1980  VERSION #3
C
C
C     THIS PROGRAM LOADS THE MICRO WITH THE CONTENTS OF A FILE
C     NAMED FILNAM.  FILNAM MUST HAVE BEEN WRITTEN ENTIRELY WITH PRWF$$
C     AND NEED ONLY BEGIN LIKE:
C
C     I3E00%0E06CD01E8....ETC
C
C     WHERE THE % SIGN ABOVE STANDS FOR A C.R.
C
C
C     THE FORMAT OF THE COMMAND LINE IS:
C
C     OK, MLOAD TRNAME -AMLC #A -PRINT #P
C
C     WHERE TRNAME IS THE FILE NAME WHICH IS BEING DUMPED TO THE MICRO
C     THIS PARAMETER IS REQUIRED
C     #A IS THE AMLC LINE NUMBER OF THE READER
C     #P IS EITHER A 1 OR A 0 REPRESENTING WHETHER OR NOT THE MICRO'S
C     RESPONSE SHOULD BE DISPLAYED ON THE TERMINAL
C     NEITHER VALUE NEED BE SPECIFIED UNLESS THE DEFAULT VALUE IS INCORRECT
C
C
      INTEGER TRNAME(16),AMLC,STATUS(2),JUNK(2),PRINT,BINARY(30),TOTAL,
     *TRLEN
      LOGICAL OK
      DATA AMLC/10/,TOTAL/0/,TRLEN/16/,PRINT/1/
C
C     ATTACH TO THE HOME UFD, READ THE COMMAND LINE, SET AMLC AND
C     OPEN THE FILE TO BE DUMPED
C
      CALL ATCH$$(0,0,0,0,0,IC)
      CALL RDTK1('-INFO',5,OK,0,0)
      IF(OK)GO TO 200
      CALL RDTK2(2,TRNAME,TRLEN,OK)
      IF(.NOT.OK)GO TO 200
      CALL OF1(1,TRNAME,TRLEN,1,$200)
      CALL RDTK1('-AMLC',5,OK,AMLC,1)
      CALL RDTK1('-PRINT',6,OK,PRINT,1)
C
C     GRAB CONTROL OF THE INTEL'S PROCESSOR TO PREPARE FOR A MEMORY DUMP
C
      CALL INIT(AMLC,PRINT)
C
C     START READING THE FILE, THIRTY WORDS AT A TIME
C
10    CALL PRWF$$(1,1,LOC(BINARY),30,000000,IREAD,ICODE)
      IF(ICODE.NE.0.AND.ICODE.NE.1)CALL ERRPR$(0,ICODE,0,0,0,0)
      IF(IREAD.EQ.0)GO TO 100
30    DO 35 I=1,IREAD
      CALL T$AMLC(AMLC,LOC(BINARY(I)),2,3,STATUS)
35    CALL WAIT(.05)
      TOTAL=TOTAL+IREAD
      CALL EMPTY(AMLC,PRINT,2*IREAD,500)
      IF(PRINT.NE.0)CALL TONL
      GO TO 10
100   CALL OF1(4,0,0,1,0)
C
C     LET'S SEE IF FOR SOME REASON THERE ARE CHARACTERS LEFT IN
C     THE INPUT BUFFER
C
      CALL EMPTY(AMLC,PRINT,0,500)
      CALL TONL
      CALL TONL
      CALL TOHEX(TOTAL)
      CALL TNOUA(' HEX (  ',8)
      WRITE(1,50)TRNAME
50    FORMAT(I4 ,' DECIMAL )  WORDS WERE ON ',16A2)
      CALL EXIT
200   WRITE(1,210)AMLC,PRINT
210   FORMAT('THE PROPER COMMAND LINE IS:'//
     *'OK, MLOAD TRNAME -AMLC #A -PRINT #P'//
     *'WHERE TRNAME IS THE NAME OF THE FILE WHICH IS GOING TO BE '/
     *'DUMPED TO THE MICRO.  THIS PARAMETER IS REQUIRED.  THE OTHERS '/
     *'ARE NOT IF THEIR DEFAULT VALUES ARE ACCEPTABLE'//
     *'#A IS THE NUMBER OF THE AMLC LINE TO WHICH THE MICRO IS CONNEC',
     *'TED (',I2,')'/
     *'#P IS EITHER 1 OR 0 DEPENDING ON WHETHER OR NOT YOU WANT'/
     *'THE MICRO',2H'S,' RESPONSES SHOWN ON YOUR TERMINAL (',I1,')')
      CALL EXIT
      END
C
C     SUBROUTINE INIT
C
      SUBROUTINE INIT(AMLC,TERMIO)
      INTEGER AMLC,STATUS(2),BEGIN(19),TERMIO
      DATA BEGIN/'X S 3 D 0 0 Y S 3 C 3 D   C F   C 9 Y '/
C
C     NOW TRY TO PUT MICRO AT MONITOR LEVEL
C
10    CALL MONTST(AMLC,TERMIO,ICODE)
      IF(ICODE.NE.1)GO TO 10
C
C     NOW BEGIN RESETING MICRO
C
      ICR=SHFT(:215,-8)
      BEGIN(7)=ICR
      BEGIN(19)=ICR
      DO 25 I=1,19
      CALL T$AMLC(AMLC,LOC(BEGIN(I)),1,3,STATUS)
25    CALL WAIT(.05)
C
C     NOW READ THHE MICRO UNTIL IT STOPS SENDING
C
      CALL EMPTY(AMLC,TERMIO,19,80)
      RETURN
      END
C
C     THIS SUBROUTINE WAITS X SECONDS BEFORE RETURNING
C
      SUBROUTINE WAIT(X)
      INTEGER TIM(15)
      CALL TIMDAT(TIM,15)
      Y=60*TIM(4)+TIM(5)+TIM(6)/330.
10    CALL TIMDAT(TIM,15)
      Z=60*TIM(4)+TIM(5)+TIM(6)/330.
      IF(Z-Y.GT.X)RETURN
      GO TO 10
      END
C
C
C     THIS SUBROUTINE READS INFORMATION IN FROM THE MICRO'S BUFFER
C
C     IF TERMIO IS NON-ZERO IT DISPLAYS WHAT WAS READ IN
C     IF IMIN IS NON-ZERO IT WILL WAIT INDEFINITELY UNTIL IT HAS READ
C             IN AT LEAST IMIN CHARACTERS
C     IF IMIN IS ZERO IT WILL WAIT .13 SECONDS, AND IF THE INPUT BUFFER
C             IS STILL EMPTY IT WILL RETURN.  OTHERWISE IT WILL
C             WAIT UNTIL THERE IS A SILENT INTERVAL OF AT LEAST .13 SECONDS
C     IN NO CASE HOWEVER WILL MORE THAN IMAX CHARACTERS BE READ IN
C
      SUBROUTINE EMPTY(AMLC,TERMIO,IMIN,IMAX)
      INTEGER AMLC,TERMIO,STATUS(2),BUFFER(40)
      IN=0
C
C     LET'S SEE IF THERE IS A CHARACTER IN THE BUFFER
C
10    CALL T$AMLC(AMLC,0,0,4,STATUS)
      IF(STATUS(1).NE.0)GO TO 20
C
C     LET'S WAIT A BIT AND TRY AGAIN
C
      CALL WAIT(.13)
      CALL T$AMLC(AMLC,0,0,4,STATUS)
      IF(STATUS(1).NE.0)GO TO 20
      IF(IMIN.EQ.0.OR.IN.GE.IMIN)RETURN
      GO TO 10
C
C     NOW LET'S READ WHAT'S THERE BEING CAREFUL NOT TO READ MORE THAN
C     EITHER 80 CHARACTERS OR A TOTAL OF IMAX
C
20    ICOUNT=MIN0(80,IMAX-IN,STATUS(1))
      CALL T$AMLC(AMLC,LOC(BUFFER),ICOUNT,1,STATUS)
      IF(TERMIO.NE.0)CALL TNOUA(BUFFER,ICOUNT)
      IN=IN+ICOUNT
      IF(IN.EQ.IMAX)RETURN
      GO TO 10
      END
C
C     SUBROUTINE TO TEST THAT THE MICRO IS AT THEE MONITOR LEVEL
C     THIS ROUTINE MAY NOT RETURN IF THE MICRO IS IGNORING
C     CHARACTERS COMING AT IT FROM PRIME
C
      SUBROUTINE MONTST(AMLC,TERMIO,ICODE)
      INTEGER AMLC,STATUS(2),TERMIO
      ICODE=0                /* FAILURE CODE
      JUNK='::'
10    CALL T$AMLC(AMLC,LOC('H'),1,3,STATUS)
      CALL WAIT(.13)
      CALL T$AMLC(AMLC,0,0,4,STATUS)
      IF(STATUS(1).EQ.0)GO TO 10
C
C     THE MICRO HAS STARTED TO SEND DATA
C
20    CALL T$AMLC(AMLC,LOC(JUNK),1,1,STATUS)
      IF(TERMIO.NE.0)CALL TNOUA(JUNK,1)
      CALL T$AMLC(AMLC,0,0,4,STATUS)
      IF(STATUS(1).NE.0)GO TO 20
      CALL WAIT(.2)
      CALL T$AMLC(AMLC,0,0,4,STATUS)
      IF(STATUS(1).NE.0)GO TO 20
C
C     THE MICRO HAS STOPPED SENDING DATA
C
      JUNK=SHFT(JUNK,-1,9)
      ITEST=SHFT('.',-1,9)
      IF(JUNK.NE.ITEST)RETURN
      ICODE=1                /* SUCCESS CODE
      RETURN
      END
