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

⟦26ec7fcc0⟧ TextFile

    Length: 23936 (0x5d80)
    Types: TextFile
    Names: »L30SRC«

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.L30SRC« 

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
; $MONNAM:
; $CPTDS:
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:
;
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:
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
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:
;FF\f


END
«eof»