|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 23936 (0x5d80)
Types: TextFile
Names: »L30SRC«
└─⟦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«
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»