DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦6f7ab20b7⟧ TextFile

    Length: 29312 (0x7280)
    Types: TextFile
    Names: »L30MRG«

Derivation

└─⟦b07da7239⟧ Bits:30005188 8" CR80 Floppy CR80FD_0185 ( CR/D/253 CP L3050 I/F test NIC/558/0-D10200 COPY OF CR/D/315 )
    └─⟦ddc1b7150⟧ 
        └─ ⟦this⟧ »L3050.L30MRG« 

TextFile

LIST
;-----------------------------------------------------------------------
; CARD DECK IDENTIFICATION NUMBER:  CR/C/0125
;       MODULE IDENTIFICATION:      NIC/558
;       VERSION:     02
;       DATED:       771207/FR
;
;       COMMUNICATIONS PROCESSOR TEST DRIVE SYSTEM
;
; CPTDS - L3050 I/F TEST PROGRAM
;
;       5.3 SPECIAL DRIVER NARRATIVE.
;       ------------------------------
;       THIS MODULE OF THE CP TEST DRIVE SYSTEM (CPTDS) WILL BE USED TO
;       LOOP ON SELECTED COM'DS IN ORDER TO VERIFY THE FUNCTION OF THE
;       L3050 I/F. THE MODULE WILL REPLACE THE SUPERVISOR OF THE
;       CP TEST DRIVE COMPUTER PROGRAM. ALL OTHER APPLICATION MODULES
;       WILL NOT BE USED.
;       THE IOX SIMULATOR (OR L3050 I/F MODULE TESTER) SHOULD HAVE THE
;       DEVICE ADDRESS #06.
;
;       THE PROGRAM WILL ASK THE OPERATOR FOR THE INPUT REQUIRED TO
;       DETERMINE WHICH COM'D SEQUENCE TO LOOP UPON.
;       UPON DETECTION OF A LINE FEED THE PROGRAM WILL START SERVICING
;       THE CP WITH DEVICE ADDRESS #40 FOLLOWED BY CP WITH ADDR #80.
;       THIS WILL BE REPEATED ENDLESSLY AS LONG AS THE PROGRAM IS ACTIVE.
;       THE PROGRAM IS ABLE LOOPING ON ALL VALID COMMANDS.
;
;       A.ADDRESSING.

;       THE SPECIAL DRIVER SHALL BE ACTIVATED BY THE MONITOR UPON
;       INITIALIZATION OF THE SYSTEM.
;
;       B.ENTRY CONDITION.
;       THE SPECIAL DRIVER SHALL BE ENTERED AS A CONSEQUENCE OF IT
;       ACTIVATING ITSEFF DURING THE INITIALIZATION PHASE.
;
;       C.EXIT CONDITIONS.
;       THE MODULE WILL NEVER GIVE UP CPU TIME OR CONTROL TO ANY OTHER
;       PROCESS IN THE SYSTEM IF IT HAS BEEN ACTIVATED.
;
;       D.SPECIAL STORAGE. NONE.
;
;       E.PROCCESSING.
;       E1.INITIALIZATION.
;          INITIATE: THE SPECIAL DRIVER IS CREATED, I.E. MADE KNOWN TO
;             THE MONITOR (MON) AS IF IT WAS THE SUPERVISOR MODULE.
;             LOCAL DATA AREAS ARE CLEARED.
;          READOC:   UPON WRITING '>' ON THE OC THE PROGRAM EXPECTS DATA
;                    TO BE ENTERED AS DESCRIBED BELOW. A CARRIAGE
;                    RETURN SHALL FLAG END OF CONTROL COM'D.
;       E2.LOOP MODE.
;          CPDRIVER:
;             THE SPECIAL DRIVER IS CONTROLLED THROUGH THE CHARACTERS
;             KEYED IN BY THE OPERATOR VIA THE OC KEYBOARD. THE BELOW
;             DESCRIBE INPUT AND ACTION BY PROGRAM.
;
;             1) OI: OFR INVALID
;                    A LOOP WILL BE SET UP ON AN INVALID OFR COM'D.
;                    THE STATUS WILL BE PRINTED AS FOR 5 (SEE BELOW).
;
;             2) DM: DEV MASTER CLEAR.
;                DI: DEV INTERRUPT PERMIT.
;                    A LOOP IS SET UP ON THE RECEIVED DEV COM'D.
;                    THE DISTANCE BETWEEN THE COM'DS ISSUED TO THE CP
;                    WILL BE ABOUT 150 USECS.
;
;             3) E : EOB
;                    LOOP ON EOB (H/W). EN EOB COMMAND WILL BE ISSUED
;                    TO THE L3050 I/F EACH 150 USEC.
;
;             4) DS: DEVICE STOP
;                    LOOP ON DEVICE STOP (H/W) - ELSE AS 2
;
;             5) O0: OFR 0
;                O1: OFR 1
;                O2: OFR 2
;                O3: OFR 3
;                    A LOOP IS SET UP ON A SET OF OFR COM'DS ALL OF
;                    WHICH INVOLVE DATA TO BE TRANSFERRED TO AND FROM
;                    THE L3050 I/F OF THE CP SYSTEM. TWO OFRS WITH
;                    NON-IDENTICAL DATA TO BE TRANSFERRED SHALL BE USED
;                    WHILE THE REVERSE WILL BE IDENTICAL.
;                    THE OFRS USED ARE ALL BUILT-IN THE PROGRAM.
;                    EACH LOOP IS INITIATED BY A MASTER RESET COM'D
;                    TO BE FOLLOWED WITHIN 1 MSEC BY THE OFR COM'D.
;                    THE BUILT-IN OFR COM'D WILL BE SENT TO THE CP AND
;                    AFTER 1 MSEC THE DMA REQUESTS BE SERVED BY ENBL CP
;                    READ IF ANY INTR'PTS PENDING AND IF NOT SERVE THE
;                    AUTO OUTPUT TO THE MP I/F SIMULATOR. THE DMA WILL
;                    BE COMPLETED BY THE CP ACKNOWLEDGE INTERRUPT.
;                    HERE UPON A REVERSE BOOT (OFR COM'D TYPE 8) IS
;                    STARTED BY SENDING THE COM'D TO THE CP, WAIT 1 MSEC
;                    AND THEN SERVE THE DMA REQUESTS UNTIL THE RECEIPT
;                    OF THE CP ACKNOWLEDGE INTR'PT.
;                    A COMPARISON BETWEEN THE REVEIVED DATA AND THOSE
;                    ACTUALLY SENT ARE PERFORMED. THE STATUS OF THIS
;                    COMPARISON WILL BE SAVED FOR EACH RUN.
;                    AFTER LOOPCNT-1 (DEFAULT 1000) TEST RUNS THE
;                    RESULT WILL BE PRINTED AND THE INDICATORS RESET.
;                    THIS WILL BE REPEATED INDEFINITELY.
;
;                    IT MUST BE NOTED THAT THE PROGRAM DOES NOT USE THE
;                    INTERRUPT GENERATED BY THE INDICATOR AND REQUEST
;                    OF THE MP I/F SIMULATOR H/W BUT IN THE EVENT OF
;                    OF A MISSING REQUEST A LOOP OF 5 MES IS SET UP
;                    TO TAKE CARE OF THIS.
;
;                    IF THE NUMBER ENTERED AFTER THE 'OFR' IS NON-ZERO
;                    AN EOB WILL BE SENT TO THE CP SYSTEM WHEN 7 DATA
;                    (CP-)WORDS ARE LEFT TO BE TRANSFERRED. 1 WILL
;                    INTODUCE AN EOB IN THE MP TO CP TRANSFER (AUTO
;                    OUTPUT) WHILE 2 WILL INTRODUCE AN EOB IN THE CP TO
;                    MP TRANSFER (AUTO INPUT MODE).
;                    3 WILL INTRODUCE EOBS IN BOTH DIRECTIONS.
;                    THE EOBS ARE SENT SUCH THAT THE LAST 7 CP-WORDS
;                    WILL NEVER BE TRANSMITTED.
;
;             6) MR: MASTER RESET.
;                    LOOP ON MASTER RESET (AS FOR 4).
;
;             7) MC: MASTER CLEAR.
;                    A SINGLE DEV MASTER CLEAR COM'D IS SENT TO BOTH
;                    CPS. UPON THIS THE PROGRAM WILL ASK FOR FURTHER
;                    DATA.
;
;
;       5.3.3. SPECIAL DRIVER INTERFACES.
;       ---------------------------------
;       A.INPUT DATA.
;       WHEN THE PROCESS HAS BEEN ACTIVATED CONTROL IS NOT LEFT OVER
;       TO ANY OTHER PROCESS.
;
;
;       B.OUTPUT
;       WHEN LOOPING ON NON-OFR COM'DS NO OUTPUT WILL BE DONE EXCEPT
;       THE COM'DS SENT TO THE CP SYSTEM.
;       THE OFR LOOP WILL AFTER EACH RUN HAVE ITS STATUS PRINTED ON THE
;       LINE PRINTER:
;
;             ...1.... BINARY PATTERN  DESCRIBING A NUMBER OF CONDITIONS
;                    WHICH ARE CHECKED DURING EACH TEST LOOP. HIGH MEANS
;                    THAT THE CORRESPONDING CONDITION HAS BEEN PRESENT.
;                    THE BIT PATTERN IS TO BE INTERPRETED AS FOLLOWS:
;                     0  WORD RECEIVED NOT MATCHING THAT SENT
;                     4  REQUEST RECEIVED IN INTERVAL 105 USEC - 5 MEC.
;                     5  NO REQUEST RECEIVED AFTER 5 MSECS.
;                     6  OVERRUN, I.E. TOO MANY REQ'S RECEIVED.
;
;             DDDDD  TOTAL NUMBER OF REQUESTS RECOGNIZED BY THE PROCESS
;                    DURING THE TOTAL LOOP. THIS WILL HAVE TO EQUAL
;                        2*(NO OF LOOPS)*(2+(WORDCOUNT/2)+1+1)
;                        WORDCOUNT BEING THE NO OF DATA WORDS INVOLVED
;                        IN THE BOOT LOADING USED - OFR 2/8.
;
;             2*HHHH HEX DUMP OF THE INTEGRATED CP ACKNOWLEDGE INTR'PT
;                    RECEIVED AFTER EACH DMA TRANSFER. THE FIRST WILL
;                    FOR THE AUTO OUTPUT (MP->CP) WHILE THE SECOND IS
;                    FOR THE AUTO INPUT (CP->MP) DATA TRANSFER.
;
;             8*DDDD COUNTERS ASSOCIATED WITH THE BIT PATTERN DESCRIBED
;                    ABOVE.. EACH TIME THE SPECIFIC CONDITION HAS BEEN
;                    PRESENT THE ASSOCIATED COUNTER WILL BE INCREASED
;                    BY ONE.
;
;             HHHH   HEX DUMP OF INTEGRATED STATUS BEFORE ENABLE
;             HHHH   HEX DUMP OF STATUS FOR MP -> CP AFTER ENABLE
;             HHHH   HEX DUMP OF STAUTS FOR CP -> MP AFTER ENABLE
;
;
;       THE PROGRAM CAN BE PATCHED IN THE PROCEDURE 'XFERERR' TO PRINT
;       FAULTY DATA RECEIVED BY THE CP SYSTEM. NOTE THAT IN THIS PRINT
;       -OUT DATA MATCHING IN FRONT OF WORD-IN-ERROR WILL ALL HAVE BEEN
;       ZEROED. ALSO ONE LINE WILL BE PRINTED FOR EACH ERROR DETECTED.
;
;       LARGE PARTS OF THE PROGRAM HAS BEEN DIRECTLY COPIED FROM THE
;       CPTDS MODULE 'MP I/F DRIVER'.
;
;-----------------------------------------------------------------------
BEGIN   MODULE #3007
NOLIST
; ; AU000069 0 0000  LEVEL 1  NAMES:
USE BASE
  ROL:=    #004F
  RI:=     #0053
  OLTO:=   #0056
  GNBF:=   #0040
  RRL:=    #004E
  RTI:=    #006F
  WA:=     #006A
  GNIB:=   #0076
  TFRW:=   #0061
  RWI:=    #006E
  WPSLP:=  #005C
  INCH:=   #0073
  WE:=     #0052
  RL:=     #004D
  WPSTLP:= #005C
  SOLT:=   #004B
  SRLT:=   #004A
  GNOB:=   #0077
  RNBF:=   #0041
  RSCOC:=  #0059
  TODQB:=  #0074
  WL:=     #0069
  GPB:=    #006C
  RBF:=    #0043
  LPERR:=  #005F
  GLET:=   #0047
  DMLP:=   #005E
  WSCOC:=  #0058
  OTCH:=   #0072
  TFRC:=   #0062
  LPER:=   #005F
  LNIQ:=   #0046
  GBS:=    #0042
  RIWE:=   #0054
  SCH:=    #006D
  WBF:=    #0044
  GBST:=   #0065
  REL:=    #0050
  CPP:=    #006B
  OLTF:=   #0056
  RBF1:=   #0067
  CRP:=    #0055
  RLET:=   #0048
  WSCLP:=  #005B
  RLI:=    #0064
  LNOQ:=   #0045
  WDSLP:=  #005D
  TFOP:=   #0060
  INQ:=    #0070
  RLWE:=   #0051
  ERR:=    #0063
  RCPU:=   #0075
  WPSOC:=  #005A
  WDSTLP:= #005D
  INDQB:=  #0071
  SLET:=   #0049
  SELT:=   #004C
  MCX:=    #0000
  RHXP:=   #0057
  GNBA:=   #0066
  WBF1:=   #0068
USE #0
; ; AU000165 0 0015  LEVEL 1  NAMES:
  BIT2=    #0004
  BIT3=    #0008
  DRV=     #0007
  BIT4=    #0010
  BIT5=    #0020
  BIT6=    #0040
  IDLE=    #FFFF
  BIT7=    #0080
  LGSTUS=  #000B
  GSTNCC=  #0000
  LGHEX=   #0002
  BIT12=   #1000
  LGERR=   #0001
  BIT13=   #2000
  LGMSB=   #0007
  BIT14=   #4000
  BIT15=   #8000
  LGMPHX=  #0008
  ROUT=    #0000
  LGMAX=   #000C
  LTTYP=   #0001
  LGITA2=  #0005
  LTU=     #0009
  LGITA5=  #0006
  LTMS1=   #0004
  SUP=     #0003
  LTMS2=   #0005
  LTMS3=   #0006
  CQE=     #0002
  LTMS4=   #0007
  LGCST=   #0003
  FQE=     #0000
  CSTMPL=  #000C
  LGASCI=  #0004
  XT=      #001E
  GSTMPL=  #0100
  LGCOMD=  #000A
  LQE=     #0001
  LTLNK=   #0000
  LOG=     #0005
  LTSND=   #0003
  ORD=     #0001
  LGMAD=   #0009
  LTRCV=   #0002
  EXPR=    #0002
  CR=      #0004
  LTH=     #000A
  BIT0=    #0001
  SIM=     #0006
  BIT1=    #0002
USE BASE
  SYSMPI:= #16E7
  DRVTMX:= #0002
  A:=      #000C
  OCILPN:= #00F0
  ICPLPN:= #0018
  SYSERR:= #0A07
  IDPLPN:= #006C
  CRILPN:= #00C0
  DRVXMX:= #0003
  DRVFQE:= #0000
  TSTLPN:= #00FC
  IOILPN:= #0144
  BDWCNT:= #0000
  SYSCR:=  #1FA7
  SYSGO:=  #04D7
  SYSCPT:= #4800
  SYSNUE:= #11A7
  SYSLTH:= #2C47
  SYSMON:= #04F7
  SYSRTC:= #0E47
  SYSOLO:= #0EE7
  SYSSIM:= #2627
  ESGLPN:= #000C
  LPDLPN:= #00CC
  LOGLPN:= #0120
  SYSMXI:= #1927
  ODPLPN:= #009C
  DRVXBF:= #0001
  LPILPN:= #00D8
  SYSIOX:= #2A27
  SYSDBA:= #11A7
  MPILPN:= #0078
  BDRSIZ:= #0013
  SYSLMT:= #0020
  ERRLPN:= #0024
  CRLPN:=  #0114
  MXCLPN:= #0090
  LTHLPN:= #0150
  MONLPN:= #0000
  RTCLPN:= #0048
  SIMLPN:= #012C
  BDRBIN:= #0012
  BDWSIZ:= #0015
  DRVTCR:= #0004
  PWFLPN:= #003C
  MXILPN:= #0084
  SYSSMT:= #0009
  SYSTSM:= #3FF7
  IOXLPN:= #0138
  DRVXCR:= #0005
  DBALPN:= #0060
  SYSLTU:= #2F47
  BDRDAT:= #0001
  LTLLPN:= #0030
  SYSOCD:= #4657
  SYSSUP:= #1DE7
  SYSEND:= #57FF
  DRVBDB:= #0001
  SYSMUX:= #3AE7
  SYSCMI:= #1DE7
  SYSCRD:= #4317
  SYSICP:= #09C7
  SYSPEG:= #F000
  BDWFQE:= #0011
  SYSIDP:= #22E7
  BDWDAT:= #0001
  DRVSIZ:= #0006
  TSMLPN:= #00A8
  SYSPMB:= #57FF
  LTULPN:= #015C
  SYSESG:= #0E07
  SYSLPD:= #4517
  BDRCNT:= #0011
  BDRMAX:= #0000
  OCDLPN:= #00E4
  SYSLOG:= #2267
  SUPLPN:= #0108
  SYSODP:= #33E7
  SYSOPE:= #3C67
  CMILPN:= #0054
  CRDLPN:= #00B4
USE #0
LIST
REQST= #0,  INDIC= #1    ;      MP I/F STATUS BITS
;
DEVCTL=BIT7+BIT4
EOBCTL=BIT7+BIT1
OFRCTL=BIT7+BIT3
STPCTL=BIT7+BIT0
;
;
COMDXFER= BIT3
ENBLXFER= BIT4
BYTEXFER= BIT5
CLRSETUP= COMDXFER+ENBLXFER
DEVSETUP= COMDXFER+BYTEXFER+2
ENBSETUP= ENBLXFER+BYTEXFER+0
EOBSETUP= COMDXFER+BYTEXFER+1
OFRSETUP= COMDXFER+BYTEXFER+5
STPSETUP=EOBSETUP
XFERSETUP=BYTEXFER+3
; ;PRCGEN1
;-----------------------------------------------------------------------
;       GENERATE PROCESS DESCRIPTOR FOR FIRST PROCESS.
;-----------------------------------------------------------------------
NOLIST
; DATED 771128/FR

        LOC=-SYSSMHLGT
NAME:   XNAME1     ; SUBMODULE NAME
        XNAME2
PRCCNT: XPRTOT     ; NUMBER OF PROCESSES
SBMLGT: XTOTAL     ; SUBMODULE LENGTH
RELPRG: XSTOTAL    ; RELATIVE PROGRAM ADDRESS
PRCBL:  XWDS0      ; PROCESS BLOCK LENGTH: THE NUMBER OF WORDS FROM AND
                   ; INCLUDING PRCBL TO AND INCLUDING THE LAST ITEM IN
                   ; THE PROCESS LOAD MODULE DATA
TRXLGT: XTXLGT0    ; NUMBER OF WORDS TO BE TRANSFERRED TO THE PROCESS
                   ; EXECUTION AREA FROM THE PROCESS LOAD MODULE AREA.
PRCLGT: XLGT0      ; PROCESS LENGTH: THE NUMBER OF WORDS FROM AND
                   ; INCLUDING SR0 TO AND INCLUDING THE LAST ITEM IN
                   ; THE INITIATED PROCESS AT EXECUTION TIME.
PRCID:  XID0       ; LOGICAL PROCESS IDENTIFICATION NUMBER, 1 WORD
SR0:    0          ; SAVE AREA FOR REGISTER 0, 1 WORD
SR1:    0          ; SAVE AREA FOR REGISTER 1, 1 WORD
SR2:    0          ; SAVE AREA FOR REGISTER 2, 1 WORD
SR3:    0          ; SAVE AREA FOR REGISTER 3, 1 WORD
SR4:    0          ; SAVE AREA FOR REGISTER 4, 1 WORD
SR5:    0          ; SAVE AREA FOR REGISTER 5, 1 WORD
SR6:    0          ; SAVE AREA FOR REGISTER 6, 1 WORD
SR7:    0          ; SAVE AREA FOR REGISTER 7, 1 WORD
BAS:    0          ; SAVE AREA FOR DATA BASE       REGISTER, 1 WORD
MBAS:   0          ; SAVE AREA FOR MODIFY          REGISTER, 1 WORD
PRG:    0          ; SAVE AREA FOR PROGRAM BASE    REGISTER, 1 WORD
PRPC:   XPRPC0     ; SAVE AREA FOR PROGRAM COUNTER REGISTER, 1 WORD
TIM:    XTIM0      ; SAVE AREA FOR TIME
PSW:    XMASK0     ; SAVE AREA FOR PROCESS STATUS WORD, 1 WORD
PRCLNK: 0          ;  PROCESS LINK, CONTAINS BAS OF THE NEXT LOWER LEVEL
                   ;  PROCESS
LINTACT:XERROR0    ;  ADDRESS OF ROUTINE FOR PROCESSING LOCAL INTERRUPTS
LINTRET:0          ;  RETURN LINK FOR LOCAL INTERRUPT AND SOME MONITOR
                   ;  FUNCTIONS
LINTCAUS:          ;  CAUSE CODE LOCAL INTERRUPT:
        0          ;                       0  FOR A TIMER INTERRUPT
                   ;                       1  FOR AN ILLEGAL INSTRUCTION
                   ;                          OR TRAP
                   ;                       2  FOR A HARDWARE TIME OUT
                   ;                       3  FOR A MEMORY PARITY ERROR
DEV:    0          ;  ADDRESS AND PRIORITY (8 BIT) OF INTERRUPTING
                   ;  IO-DEVICE. WILL CONTAIN -1 IF THE PROCESS WAS
                   ;  LOADED BECAUSE OF A CPU INTERRUPT OR BECAUSE
                   ;  ANOTHER PROCESS EXECUTED A LDP INSTRUCTION.
TIMRSET:XTIM0      ;  TIME REGISTER RESET VALUE
TSWITCH:0          ;  TEST SWITCH
GSTPTR: 0          ;  POINTER TO GST
        XPRCNT= 1, XTOT=0
LIST
;
L3050CTL: <:  :>     ;   RECEIVED CONTROL CHARACTERS
        0            ;   FIRST RECEIVED CHAR (RIGHTMOST)
        0            ;   SECND RECEIVED CHAR (RIGHTMOST)
;
COMD:   0
;
BOOT:   BOOT2
BOOT2:  0, 0, 0, 0       ;   FIRST FOUR WORDS (LETTER DUMMY)
        1, 21, 2, PRIBUF ;   OFR COM'D BOOT CP FROM MP
BOOT2S: 0, 0, 0, 0,      1,  21, 2, SECBUF
BOOT8:  0, 0, 0, 0,      1,  21, 1*#100+8, INBUF
;
;
IOXSIMADDR: #06      ;   DEVICE ADDRESS OF THE IOX SIMULATOR MODULE
DEVICEADDR: #80      ;   VALID CP ADDRESSES #40 & #80
;
USEC:   75           ;   COUNTER FOR 150 USEC DELAY
MSEC1:  500          ;   COUNTER FOR 1 MSEC DELAY
MSEC2:  1000         ;      2 MSEC DELAY
MSEC5:  2500         ;      5 MSEC DELAY
MSEC20: 10000, 60000 ;      20 AND 120 MSECS DELAY
;-----------------------------------------------------------------------
;
        1000         ;   NO OF LOOP BETWEEN PRINT-OUTS
LOOPCNT:0
;
REQSTS: 0            ;   NO OF REQ'STS RECEIVED
CPINTRPT:0           ;   INTEGRATED STATUS FROM CP, MP TO CP TRANSFER
        0            ;                -             CP TO MP (DUMP)
;
ERROR:  #0000        ;   NON ZERO MEANS ERROR DETECTED
COUNT:  0            ;   BIT 0  NO OF WORDS RECEIVED MISMATCHING SENT
        0            ;   BIT 1 COUNT
        0            ;   BIT 2 COUNT
        0            ;   BIT 3 COUNT
        0            ;   BIT 4  NO OF MISSING REQUESTS
        0            ;   BIT 5  MISSING REQUEST AFTER 2 MSECS
        0            ;   BIT 6  TOO MANY REQUESTS RECEIVED,I.E. EOB
        0            ;   BIT 7
;
STBYTE: 0            ;   IOX SIMULATOR STATUS BEFORE ENABLE
;                    ;   IOX STATUS AFTER ENABLE
        0            ;                        IF MP -> CP
        0            ;                        IF CP -> MP
;
        0, REPEAT 53 ;   FORCE PROGR AM TO START AT #3100
        0, REPEAT 10 ;
STACK:  0
;
HEADER: BYTES
        <:<13> ID    STATUS      REQ'S    INTR'T       -    OVER MS'N:>
              <:G  LONG   -     -     -   MATCH  ENBL MP-CP CP-MP<13>:>
              BYTES=2*(LOC-1-HEADER)
;
PRIBUF: #1000, #F00, #0FF, 16   ;   START ADDR, SECTION, BASE, COUNT
        #0101, #1010, #2222, #3333, #4444, #5555, #6666, #7777
        #8888, #9999, #AAAA, #BBBB, #CCCC, #DDDD, #EEEE, #FFFF
        #FFF8, 0     ;   CORRESPONDING CHECKSUM
;
SECBUF: #0FF8, #0F0, #F00, 16   ;   START ADDR, SECTION, BASE, COUNT
        #FEEF, #EDDE, #DCCD, #CBBC, #BAAB, #A99A, #9889, #8778
        #7667, #6556, #5445, #4334, #3223, #2112, #1001, #0FF7
        #FFFF, 0     ;   CORRESPONDING CHECKSUM
;
; ;PRCGEN2
NOLIST
        XWDS0=LOC+SR0-PRCBL, XTOT=XTOT+LOC+SR0-NAME, XTXLGT0=XWDS0-3
LIST
LOGMSG: LOC=LOC+1    ;   ALLOCATE FOR NO OF CHARS TO BE PRINTED
        LOC=LOC+100  ;   ALLOCATE FOR PRINT BUFFER
HEXDUMP:LOC=LOC+1    ;   6 BYTES IN EACH HEX WORD
;
        LOC=LOC+6    ;   ALLOCATE FOR HEX DUMP
INBUF:  LOC=LOC+128
; ;PRCGEN3
NOLIST
        XLGT0=LOC
LIST
USE PROG
LOC=0
;-----------------------------------------------------------------------
INITIALIZE:
        MOV   PRCID             R3  ;   OWN PROCESS LOGICAL NO
        MOV   BAS               R4  ;
        MON   CRP
        MON   ERR
        MOVC  ORD               R0  ;   ACTIVATE OWN PROCESS
        MON INQ, MON ERR
;
        MON   WPSTLP
              10,<:DRV SPECIAL  771207<13>:>
        MON   RTI
;
        MOVC  <:<13>:>          R0
        MON   WSCOC
;
        MOVC  LOGMSG            R4  ;   POINT START OUTPUT AREAS
        MOVC  <:  :>            R0  ;
        MOVC  INBUF-LOGMSG      R2  ;   FOR I:=1 UNTIL AREA CLEARED
INIT5:  MOV          R0         X4  ;      BLANK OFF OUTPUT AREA
        ADDC  1                 R4  ;      POINT NEXT
        SOB          R2  INIT5      ;   END FOR UNTIL;
        MOVC  LOGMSG            R4  ;   POINT START OUTPUT BUFFER
        MOVC  4+3*6+2+8*6+3*6+1 X4  ;   PREPARE BYTE COUNT
;-----------------------------------------------------------------------
;
;       THE BELOW CODE WILL READ DATA FROM THE OC AND CODE THE RECEIVED
;       DATA AS FOLLOWS: THE FIRST CHAR WILL BE MERGED WITH THE FIRST
;       CHARACTER AFTER A SPACE. THIS WILL MAKE UP THE KEY TO BE USED
;       WHEN DETERMINING THE LOOP TO BE SET UP:
;             O0, O1, O2, O3, OI, DM, DI, E , DS, MR, MC.
;       THE CONTROL WORD IS SAVED IN L3050CTL
;
;-----------------------------------------------------------------------
CPCLEAR:
        MOVC  <:>:>             R0
        MON   WSCOC
        MOVC  <: :>             R0
        MOVC  128               R5  ;   FOR I:=1 UNTIL 128
CPCL5:                              ;   DO
        MOV          R0 INBUF-1.X5  ;      RESET INCOMING DATA AREA
        SOB          R5  CPCL5      ;   END FOR UNTIL INBUF CLEARED;
;
        MOVC  INBUF             R4  ;   DO UNTIL CHAR <CR> MET
READOC: MON   RSCOC                 ;      GET SINGLE CHAR FROM OC
        MON   WSCOC                 ;
        MON   WSCLP                 ;   REPEAT ON LP;
        MOV          R0         X4  ;      SAVE ENTERED CHAR
        INEP         R0  <:<13>:>   ;      IF <CR> THEN
        ADDC  1                 R4  ;      POINT NEXT OUTPUT ADDR
        JMP              READOC     ;   END DO UNTIL <CR>;
;
        MOVC  <: :>             X4  ;   ELIMINATE THE <CR>;
        MOVC  INBUF             R4  ;   DO UNTIL FIRST SPACE MET
REA10:  INEP         X4  <: :>      ;
        ADDC  1                 R4  ;         POINT NEXT RECEIVED CHAR
        JMP              REA10      ;   END DO UNTIL SPACE;
;
        MOV   1.     X4         R0  ;   GET FIRST CHAR AFTER SPECE;
        MOV          R0  L3050CTL+2 ;   SAVE SECOND READ CHAR
        SLL          R0  8          ;   SET UP AS MOST SIGNIFICANT
        MOV   INBUF             R1  ;   GET FIRST RECEIVED CHAR
        MOV          R1  L3050CTL+1
        IOR          R1         R0  ;   MERGE
        MOV          R0  L3050CTL   ;      AND SAVE AS LOOP CONTROL;
;
        MOVC  128               R5  ;   FOR I:=1 UNTIL 128
REA80:                              ;   DO
        CLR             INBUF-1.X5  ;      RESET INCOMING DATA AREA
        SOB          R5  REA80      ;   END FOR UNTIL INBUF CLEARED;
;
;
; PRINT HEADER FOR TEST OUTPUT
;
CPDRIVER:
        MOVC  HEADER            R6  ;   POINT TO HEADER
        IEQ          X6  0          ;   IF NOT FIRST TIME
        JMP              CPD80      ;      THEN SKIP HEADER;
        MOV   L3050CTL+1        R0  ;
        INE          R0  <:O:>      ;   IF NON-OFR
        JMP              CPD80
        MOVC  <:<13>:>          R0
        MON   WSCOC                 ;   LINE FEED ON CR & LP;
        MON   WSCLP
        MON   WDSTLP                ;   GO PRINT HEADER ON LP
        MOVC  <:-:>             R0
        MOV   HEADER            R2  ;   FOR I:=1 UNTIL HEADER LENGTH
CPD50:  MON   WSCLP                 ;   DO
        SOB          R2  CPD50      ;      PRINT BARS UNDERNEATH;
        MOVC  HEADER            R6
        CLR              0.     X6  ;   FLAG END
CPD80:
        MOV   DEVICEADDR        R5  ;   GET CURRENT CP DEVICE ADDR
        IEQ          R5  #80        ;   IF OLD DEVICE ADDR IN COM'D #80
        MOVC  #00               R5  ;      THEN RESET;
        ADDC  #40               R5  ;   DETERMINE NEXT CP DEVICE ADDR;
        MOV          R5  DEVICEADDR ;
;
        MOV   L3050CTL          R7  ;   POINT CONTROL LETTER
        IEQ          R7  <:O0:>, JMP OFRLOOP; OFR NORMAL
        IEQ          R7  <:O1:>, JMP OFRLOOP; OFR, EOB MP TO CP
        IEQ          R7  <:O2:>, JMP OFRLOOP; OFR, EOB CP TO MP
        IEQ          R7  <:O3:>, JMP OFRLOOP; OFR, OEB BOTH DIRECTIONS
        IEQ          R7  <:OI:>, JMP OFRLOOP; OFR INVALID
        IEQ          R7  <:DI:>, JMP DEVCMD ; DEV INTERRUPT PERMIT
        IEQ          R7  <:DM:>, JMP DEVCMD ; DEV MASTER CLEAR
        IEQ          R7  <:DS:>, JMP STPCMD ; DEVICE STOP
        IEQ          R7  <:E :>, JMP EOBCMD ; EOB
        IEQ          R7  <:MR:>, JMP CLRCMD ; MASTER RESET
        INE          R7  <:MC:>,JMP CPCLEAR ; ILLIGAL ID
;
; MASTER CLEAR BOTH CPS AND RETURN FOR MORE DATA;
        MOVC  #40<8             R1  ;   CP DEVICE ADDRESSS
        MOVC  #C0<8+DEVCTL      R2  ;   FOLLOWED BY COM'D AND DATA BYTE;
        MOVC  DEVSETUP          R3  ;   SET UP MP I/F CONTROL BYTE
        JMP          S5  FILLIF
        MOVC  #80<8             R1  ;   CP DEVICE ADDRESSS
        MOVC  #C0<8+DEVCTL      R2  ;   FOLLOWED BY COM'D AND DATA BYTE;
        MOVC  DEVSETUP          R3  ;   SET UP MP I/F CONTROL BYTE
        JMP          S5  FILLIF
        JMP              CPCLEAR
;
;-----------------------------------------------------------------------
;
;       LOOP ON SINGLE COM'D
;
;-----------------------------------------------------------------------
;
CLRCMD:                             ; COM'D&ENBL LINE HIGH AT SAME TIME
        MOVC  CLRSETUP          R3  ;   SET UP FOR MASTER RESET OF CP
        JMP              SIN90
;
DEVCMD:                             ;ADDR, COM'D, DATA (1)
        MOV   DEVICEADDR        R1  ;   DEVICE ADDR
        SLL          R1  8          ;      FIRST TO BE SENT;
        MOVC  #C0<8+DEVCTL      R2  ;   FORCE MASTER CLEAR
        MOV   L3050CTL          R7  ;   GET CONTROL
        IEQ          R7  <:DI:>     ;   IF INTERRUPT PERMIT
        MOVC  #A0<8+DEVCTL      R2  ;      THEN CHANGE DAT1 FIELD
        MOVC  DEVSETUP          R3  ;   SETUP MP SIM GO COM'D
        JMP              SIN90
;
EOBCMD:                             ;ADDR, COM'D
        MOV   DEVICEADDR        R2
        ADDC  EOBCTL<8          R2  ;   CONTROL BYTE SECOND
        MOVC  EOBSETUP          R3  ;   SETUP MP SIM GO COM'D
        JMP              SIN90
;
STPCMD:                             ;ADDR,COM'D
        MOV   DEVICEADDR        R2
        ADDC  STPCTL<8          R2  ;   DEVICE STOP COM'D SETUP
        MOVC  STPSETUP          R3  ;   SETUP MP SIM GO COM'D
;
SIN90:
        JMP          S5  FILLIF
        MOV   USEC              R5  ;   FOR I:=0 UNTIL 150 USEC
SIND5:  SOB          R5  SIND5      ;      DO WAIT;
        JMP              CPDRIVER
;-----------------------------------------------------------------------
;
; SECTION FOR LOOPING ON BUILT-IN OFR COM'DS.
;
;-----------------------------------------------------------------------
OFRLOOP:
        MOVC  STBYTE+8-LOOPCNT  R5  ;   FOR I:=1 UNTIL AREA SIZE
OFR01:                              ;   DO
        CLR           LOOPCNT-1.X5  ;      CLEAR OFF WORD
        SOB          R5  OFR01      ;   END CLEARING AREA;
;
        MOVC  STACK             R7
        MOV   BOOT              R5  ;   FIRST XFER MODE BEING MP TO CP
;
OFR10:
        MOV          R5  COMD       ;   SAVE POINTER TO XFER 'LETTER'
;
; SEND MASTER RESET (MASTER CLEAR IF PATCHED) TO THE CP
        MOVC  CLRSETUP          R3  ;   RISE COM'D AND ENBL LINE AT
        JMP              OFR15      ;*** SKIP THE DEV MASTER CLEAR ***
        MOV   DEVICEADDR        R1  ; ADDR, COM'D, DATA BYTE
        SLL          R1  8          ;   DEVICE ADDRESS FIRST
        MOVC  #C0<8+DEVCTL      R2  ;   FORCE A DEV MASTER CLEAR
        MOVC  DEVSETUP          R3  ;   SETUP FOR A DEV COM8D TO GO
        JMP          S5  FILLIF     ;   GO SEND COM'D
        MOV   MSEC20            R5  ;   FOR I:=1 UNTIL 20 MSEC
        JMP              MPD20      ;   DO
OFR15:
        JMP          S5  FILLIF     ;      SIMULTANEOUSLY
        MOV   MSEC1             R5  ;   FOR I:=0 UNTIL 1 MSEC
MPD20:  SOB          R5  MPD20      ;      DO WAIT;
;
;  SEND THE OFR TO THE CP
;
        MOV   DEVICEADDR        R2
        MOVC  OFRCTL<8          R0  ;   OFR COM'D BYTE SECOND TO BE SENT
        IOR          R2         R0  ;      MERGED WITH DEVICE ADDRESS
        MOV   COMD              R5  ;      THEN GET BUILT-IN OFR'S;
        MOVL  LTMS2. X5         R12 ;
        SWP                     R1  ;      R1:= DAT FIELDS
        MOV   L3050CTL+2        R5  ;   GET TYPE CONTROL
        IEQ          R5  <:I:>      ;   IF INVALID OFR
        MOVC  #25               R2  ;      THEN FORCE SO;
        MOVC  OFRSETUP          R3
        JMP          S5  FILLIF
        MOV   MSEC1             R5  ;   FOR I:=0 UNTIL 1 MSEC
MPD30:  SOB          R5  MPD30      ;      DO WAIT;
;
        MOV   COMD              R5  ;   POINT TO SIM'S LETTER
        MOV   LTMS4. X5         R6  ;   POINT ASSICIATED BUFFER
        MOV   LTMS2. X5         R4  ;   SET UP LOOP COUNT
;------------------------------------------------------
;
; WAIT FOR REQUEST, SEND ENABLE, SEND/RECEIVE DATA
;
;------------------------------------------------------
OFR40:                              ;   FOR I:=1 UNTIL INTR'PT RECEIVED
        MOVC  0                 R5
        MOV   IOXSIMADDR        R2
        SIO          R0         R2
        SBZ          R0  REQST      ;   IF REQUEST FROM CP MISSING
        JMP              OFR50      ;   THEN
        MOV   ERROR. X5         R1  ;      GET FLAGS
        SETS         R1  4
        MOV          R1  ERROR. X5  ;      SAVE STATUS;
        INC              COUNT+4.X5 ;      UPDATE NO OF MISSING
        MOV   MSEC5             R0  ;      DO UNTIL 5 MSECS ELAPSED
MPD45:  SOB          R0  MPD45      ;         WAIT;
        SIO          R0         R2  ;      GET INDICATORS
        SBZ          R0  REQST      ;      IF REQUEST STILL MISSING
        JMP              OFR50      ;      THEN
        SETS         R1  5          ;         FLAG MISSING REQST
        MOV          R1  ERROR. X5  ;         SAVE STATUS
        INC          COUNT+5.   X5  ;            UPDATE NO OF NOGO'S;
        JMP              OFR90      ;      NO MORE WORK THIS LOOP;
OFR50:                              ;   END LOOK FOR REQ'ST
        INC              REQSTS.X5  ;   INDICATE NEW REQUEST SEEN BY MP
        MOV   STBYTE            R1  ;      GET OLD I/F STATUS
        IOR          R0         R1  ;         INTEGRATE WITH NEW ONE
        MOV          R1  STBYTE     ;         AND SAVE ;
;
        MODC  BIT12+BIT13
        SIO          R0         R2  ;   CLEAR STATUS AND COUNT
        MOV   DEVICEADDR        R2
        SLL          R2  8
        MOVC  ENBSETUP          R3
        JMP          S5  FILLIF
;
        MOV   IOXSIMADDR        R2  ;
        SIO          R0         R2  ;   GET STATUS OF IOX SIM I/F
        SBZ          R0  INDIC      ;   IF NO INDICATOR
        JMP              OFR80      ;   THEN
        MOV   COMD              R5  ;   POINT SIM'S LETTER
        MOV   LTMS3. X5  R5
        SBZ          R5  8          ;   IF MP TO CP MODE
        JMP              CPELSE     ;   THEN
CPTHEN:
        MOV   STBYTE+1          R1  ;      GET OLD I/F STATUS
        IOR          R0         R1  ;         INTEGRATE WITH NEW ONE
        MOV          R1  STBYTE+1   ;         AND SAVE ;
        MOVL  0.     X6         R12
        MOVC  XFERSETUP         R3
        JMP          S5  FILLIF
        JMP              CPDONE
CPELSE:                             ;   ELSE SERVE CP TO MP MODE
        MOV   STBYTE+2          R1  ;      GET OLD I/F STATUS
        IOR          R0         R1  ;         INTEGRATE WITH NEW ONE
        MOV          R1  STBYTE+2   ;         AND SAVE ;
        MODC  #300
        RIO          R0         R2
        MODC  #200
        RIO          R1         R2
        SRL          R1  8
        SRLL         R0  8
;
        MODC  #100
        RIO          R1         R2
        MODC  #000
        RIO          R2         R2
        SRL          R2  8
        SRLL         R1  8
        MOVL         R01 0.     X6
;
CPDONE:
        INE          R4  11         ;   IF TIME TO CHECK IF EOB TO GO
        JMP              OFR70      ;   THEN
        MOV   L3050CTL+2        R0  ;      GET OFR CONTROL TYPE
        XTR          R0  2          ;      ISOLATE EOB CONTROL BITS;
        MOV   COMD              R2  ;      GET TYPE OF OFR LOOP;
        SEQP         R2  BOOT8      ;      IF DURING MP TO CP DMA
        IBN          R0  0          ;         AND EOB TO BE INTRODUCED
        SETS         R0  2          ;
        SNEP         R2  BOOT8      ;         OR DURING CP TO MP DMA
        IBN          R0  1          ;            AND EOB TO BE INTROD
        SETS         R0  2          ;
        IBZ          R0  2          ;
        JMP              OFR70      ;      THEN
        MOV   DEVICEADDR        R2  ;         SET UP DEVICE ADDRESS,
        ADDC  EOBCTL<8          R2  ;            CONTROL BITS FOR CP
        MOVC  EOBSETUP          R3  ;         SETUP TO BE EOB
        JMP          S5  FILLIF     ;         GO SEND TO CP
OFR70:                              ;   END TIME TO SEND EOB;
;
        ADDC  2                 R6  ;      POINT NEXT LOCATION IN BUFF
        ADDC  -2                R4  ;   UPDATE NO OF WORDS LEFT IN XFER
        SLT          R4  -1         ;   IF NO MORE DATA LEFT THEN EOB
        JMP              OFR40
        MOVC  0                 R5  ;
        MOV   ERROR. X5         R0
        SETS         R0  6          ;   FLAG EOB ERROR
        INC              COUNT+6.X5 ;
        MOV          R0  ERROR. X5
        JMP              OFR40      ;   END DO WHILE REQUESTS FROM CP;
;------------------------------------------------------
;
; READ THE INTR'PT BYTE FROM THE CP
;
;------------------------------------------------------
OFR80:                              ;   INTR'PT RECEIVED FROM CP
        MODC  #300
        SIO          R0         R2  ;
        MOVC  CPINTRPT          R1  ;   POINT MP TO CP STATUS WORD
        MOV   COMD              R5  ;   GET CURRENT TYPE OF TRANSFER
        IEQ          R5  BOOT8      ;   IF AUTO INPUT (CP TO MP DUMP)
        ADDC  1                 R1  ;      THEN POINT THAT STATUS WORD;
        IOR          R0         X1  ;   INTEGRATE STATUS INTO OLD ONE;
;
OFR90:
        MODC  BIT12+BIT13
        SIO          R0         R2  ;   RESET COUNTER ANS STATUS
        MOV   COMD              R5
        INEP         R5  BOOT8      ;   IF LAST WAS MP TO CP BOOT LOAD
        MOVC  BOOT8             R5  ;   THEN REVERSE
        JMP              OFR99
                                    ;   ELSE CHECK IF XFER OK
        MOV   BOOT              R4  ;      POINT MP->CP BOOT LETTER
        MOV   LTMS4. X4         R4  ;         START OF OUTBOUND BUFFER;
        MOVC  BOOT8             R6  ;      POINT CP->MP BOOT LETTER
        MOV   LTMS2. X6         R3  ;         NO OF DATA RECEIVED
        MOV   LTMS4. X6         R6  ;         START INBOUND BUFFER;
        MOVC  0                 R5  ;      COMPENSATE OWN BASE
        MOV   ERROR. X5         R1
OFR95:                              ;      DO UNTIL ALL XFER'D COMPARED
        MOV   0.     X4         R0  ;         GET OUTBOUND
        XOR          X6         R0  ;         COMPARE TO RECEIVED ONE
        INEP         R0  0          ;         IF NOT MATCHING
        JMP          S5  XFERERR    ;         THEN GO FLAG SO;
        MOVC  0                 R5
        MOV          R5         X6  ;   RESET RECEIVE FIELD
        INCD         R4         R6
        SOB          R3  OFR95      ;      END DO UNTIL;
        MOV          R1  ERROR
;
        INC              LOOPCNT.X5
;
        MOV   BOOT              R0  ;   GET CURRENT TYPE OF BOOT COM'D
        MOVC  BOOT2             R5  ;   POINT PRIMARY BOOT LETTER
        IEQ          R0         R5  ;   IF CURRENT IDENTICAL TO PRIMARY
        MOVC  BOOT2S            R5  ;      THEN FORCE SECONDARY NEXT;
        MOV          R5  BOOT       ;   SAVE POINTER  MP TO CP LETTER;
;
; CHECK IF TIME TO PRINT STATUS
;
        MOV   LOOPCNT           R0  ;   GET LOOPCOUNT
        MOV   LOOPCNT-1         R1  ;   FLAG WHEN TIME TO RRINT
        IEQ          R0         R1  ;   IF NO OF LOOP MATCHES
        JMP              LOGDATA    ;      THEN GO LOG STATUS;
OFR99:                              ;   END SETTING MODE UP;
        JMP              OFR10      ;   GO PERFORM NEXT TEST LOOP;
;-----------------------------------------------------------------------
;
; PROCEDURE PREPARE THE MP IOX SIMULATOR BUFFERS AND SEND DATA TO L3050
;
;       PLEASE REFER NIC/557 - IOX SIM DRIVER
;
FILLIF:
        STC   3
        MOV   IOXSIMADDR        R1  ;   GET PROPER DEVICE ADDRESS
        ADDC  #500              R1  ;
        MOVC  4                 R2
FILLLOOP:
        CIO          X7         R1
        ADDC  1                 R7
        ADDC  #100              R1
        SOB          R2  FILLLOOP
        JMP                     X5
;
;-----------------------------------------------------------------------
;
; PROCEDURE FOR LOGGING AND RESETTING THE STATUS INDICATORS
;
;       RETURN:
;             CPDRIVER
;
LOGDATA:
        MOVC  <:<10>:>          R0
        MON   WSCLP                 ;   FORCE NEW LINE
        MOVC  4                 R0  ;   SET UP HEX BUFFER CHAR COUNT
        MOV          R0  HEXDUMP
        MOV   DEVICEADDR        R0  ;   GET CURRENT CP DEVICE
        MOVC  HEXDUMP+1         R5  ;   POINT FIRST CHAR
        JMP          S6  HEX00
        MOVC  HEXDUMP           R6  ;   GO TO PRINT
        MON   WDSTLP                ;      ON LP;
;
        MOVC  <: :>             R0  ;   BLANK OFF
        MON   WSCLP
        MON   WSCLP
        MOV   ERROR             R1  ;   GET ERROR FLAGS
        MOVC  8                 R2  ;   FOR I:=1 UNTIL 8
LOG10:                              ;   DO
        MOVC  <:1:>             R0  ;      DEFAULT HIGH
        IBZ          R1  7          ;      IF LOW
        MOVC  <:.:>             R0  ;         THEN ADJUST ACCORDINGLY;
        MON   WSCLP                 ;      PRINT STATUS ON LP
        SLL          R1  1          ;      REMOVE PRINTED BIT;
        SOB          R2  LOG10      ;   END FOR UNTIL 16
;
        MOVC  LOGMSG+3          R5  ;   POINT DEDICATED OUTPUT AREA
        MOV   REQSTS            R0  ;   GET NO OF REQ'STS RECEIVED
        JMP          S6  LOGDEC6    ;      AND GO PRINT;
        MOV   CPINTRPT          R0
        JMP          S6  HEX        ;   GO CONVERT TO HEX
        MOV   CPINTRPT+1        R0
        JMP          S6  HEX    ;
        MOVC  <:  :>            X5  ;   SEPARATE BY BLANK
        ADDC  1                 R5
;
        MOV   COUNT+7           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT+6           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT+5           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT+4           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT+3           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT+2           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT+1           R0
        JMP          S6  LOGDEC6    ;
        MOV   COUNT             R0  ;
        JMP          S6  LOGDEC6    ;
        MOV   STBYTE            R0  ;   GET INTEGRATED BEFORE ENBL
        JMP          S6  HEX        ;      STATUS CONVERTED TO ASCII
        MOV   STBYTE+1          R0  ;   GET MP -> CP AFTER ENABLE
        JMP          S6  HEX        ;      STATUS CONVERTED TO ASCII
        MOV   STBYTE+2          R0  ;   GET CP -> MP AFTER ENABLE
        JMP          S6  HEX        ;      STATUS CONVERTED TO ASCII
;
        MOVC  LOGMSG            R6
        MON   WDSTLP                ;   PRINT CONVERTED NUMBERS ON LP;
        JMP              CPDRIVER   ;   GO NEW TEST RUN;
;-----------------------------------------------------------------------
;
; PROCEDURE FOR CONVERTING A 16-BIT BINARY TO DECIMAL ASCII;
LOGDEC6:
        MOVC  <: :>             X5  ;   ALL NUMBERS BELOW 64 KW
        MOVC  5                 R2  ;   FIRST BYTE RIGHTMOST
        MOVC  10000             R3  ;   SET UP DIVIDEND
        MOVC  0                 R4
LOGD10:
        MOVC  0                 R1
        DIV          R3         R0
        ADDC  <:0:>             R0
        IBZP         R2  #0         ;   IF EVEN
        MOV          R0         X5
        JMP   LOGD50
        SWP                     R0
        IOR          R0         X5
        ADDC  1                 R5
LOGD50:
        MOV          R1         R0
        MOVC  10                R1
        DIV          R1         R3
        SOB          R2  LOGD10
        JMP                     X6  ;   RETURN TO CALLER;
;
;-----------------------------------------------------------------------
; PROCEDURE CONVERT FROM BINARY TO HEX ASCII;
;
;       REGISTERS    CALL               EXIT
;             R0     BINARY             KEPT
;             R1,R7   -                 DESTROYED (WORK)
;             R5     POINT OUTPUT       SAME+3 (AFTER HEX)
 ;             R6     LINK               KEPT
;       RETURN
;             LINK
;-----------------------------------------------------------------------
HEX:
        MOVC  <:  :>            X5  ;   FIRST TO BE 2 BLANKS
        ADDC  1                 R5  ;   ADDRESS FIRST HEX OUT-CHAR
HEX00:
        MOVC  4                 R7  ;   FOR I:=1 UNTIL 4
HEX10:                              ;   DO
        SLC          R0  4          ;   POSITION NXT ITEM
        MOV          R0         R1  ;
        XTR          R1  4          ;   ISOLATE ITEM
        IGE          R1  10         ;   IF 'A-F'
        ADDC  <:A:>-<:0:>-10    R1  ;   THEN COMPENSATE;
        ADDC  <:0:>             R1  ;   FORCE ITEM TO ASCII
        IBZP         R7  #0         ;   IF EVEN
        MOV          R1         X5  ;      THEN FIRST CHAR RIGHTMOST
        JMP   HEX90                 ;      ELSE
        SWP                     R1  ;         POSITION NEW AS LEFTMOST
        IOR          R1         X5  ;         CONCATENATE CHARS;
        ADDC  1                 R5  ;
HEX90:  SOB          R7  HEX10      ;   END FOR UNTIL;
        JMP                     X6  ;   RETURN TO CALLER
;
;-----------------------------------------------------------------------
; PROCEDURE DATA SENT AND DATA RECEIVED NOT MATCHING
;
;       THIS PROCEDURE CAN BE PATCHED TO WRITE THE BUFFER EACH TIME
;       AN ERROR IN A TRANSFER HAS BEEN DETECTED;
;
XFERERR:
        SETS         R1  0          ;         THEN FLAG MISMATCH
        MOV   COUNT+0           R0  ;   GET NO OF ERRORS DETECTED
        ADDC  1                 R0  ;      UPDATE
        MOV          R0  COUNT+0
        JMP                     X5  ;*** NOP TO ENABLE PRINT-OUT ***
        STC   6                     ;   SAVE REGS
        MOV          R7  STACK      ;      REG 7 AS WELL
        MOVC  <:<10>:>          R0  ;   FOR NEW LINE
        MON   WSCLP
        MOVC  <: :>             R0  ;   BLANK OFF
        MON   WSCLP
        MON   WSCLP
        MON   WSCLP
        MON   WSCLP
        MON   WSCLP
        MON   WSCLP
        MOVC  4                 R0  ;   NO OF BYTES INVONVED
        MOV          R0  HEXDUMP    ;   PREPARE BUFFER
        MOVC  INBUF             R4  ;      POINT FIRST OF RECEIVED DATA
        MOVC  BOOT8             R5  ;   POINT RECEIVE LETTER
        MOV   LTMS2. X5         R2  ;   FOR I:=1 UNTIL NO OF DMA WORDS
XFE10:                              ;   DO
        MOVC  HEXDUMP+1         R5  ;      POINT DEDICATED BUFER
        MOV          X4         R0  ;   GET NEXT ITEM
        JMP          S6  HEX00      ;      GO CONVERT BINARY TO ASCII
        MOVC  HEXDUMP           R6
        MON   WDSTLP
        ADDC  1                 R4  ;      POINT NEXT BUFFER LOCATION
        SOB          R2  XFE10      ;   END FOR UNTIL DONE
        MOV   STACK             R7  ;   RE-ESTABLISH STACL POINTER
        UNS   6                     ;
        JMP                     X5  ;   RETURN CALLER;
;---------------------------------------
LOCALINT:
        MON   ERR
USE BASE
XNAME1=<:TS:>, XNAME2=<:T:>
XPRPC0= INITIALIZE
XMASK0= #E000
XERROR0=LOCALINT
; ;PRCGEN4
NOLIST
        XNAME1=0, XNAME2=0
        XID0=0, XID1=0, XID2=0
        XPRPC0=0, XPRPC1=0, XPRPC2=0
        XTIM0=0, XTIM1=0 XTIM2=0
        XMASK0=#8000, XMASK1=#8000, XMASK2=#8000
        XERROR0=0, XERROR1=0, XERROR2=0
        XPRTOT= XPRCNT,  XSTOTAL=XTOT
        XTOTAL=XSTOTAL+LOC
LIST
;FF\f


END
 ;PRCGEN4
NOLIST
        XNAME1=0, XNAME2=0