ASMB,R,B,L,C
      HED RTE DIGITAL POWER SUPPLY DRIVER DVR70 
      NAM DVR70,0 
      ENT I.70,C.70 
      EXT $LIST 
* 
* 
* 
*  14908-60001 REV A  BINARY TAPE (RELOCATABLE) 
*  14908-80001 REV A  SOURCE TAPE 
*  14908-90001 REV A  LISTING (WITH CROSS REF.) 
*  14908-90002 REV A  SMALL PROGRAM MANUAL
* 
* 
*  REVISION A (UNRELEASED)         JULY 1972, MING U. CHANG 
*  REVISION A (RELEASED)           NOV 1974, BOB HARRISON 
* 
* 
      SKP 
      HED DVR70  I N I T I A T O R       RWH 11/74
I.70  NOP         ENTRY POINT 
      JSB SETIO   (A) CONTAINS CHANNEL NUMBER 
*                                 GO TO CONFIGURATION ROUTINE 
      LDA EQT12,I GET SCHEDULE FLAG 
      SZA         IS FLAG DEFINED YET?
      JMP CONT    YES, SKIP DEFINITION SECTION
      LDA CHANL   PUT IO CHANNEL INTO A. SET UP 
      ADA N6       INDEX INTO INTERRUPT TABLE 
      ADA INTBL     TO GET THE SCHEDULE WORD
      LDB A,I     PUT SCHEDULE WORD INTO B
      CMB,SSB,INB IF WORD=0 THEN NO PROGRAM 
      CCB         IF NO PR, SET -1 IN EQT9
      STB EQT12,I SET + ADDR IN EQT12 IF USER PR  
      LDB EQT1    SET DVR70 EQT ENTRY INTO
      STB A,I     THE INTERRUPT TABLE 
      LDA EQT12,I GET EQT12 
      SSA         USR PR IN SYS, EQT13 BIT 10=1 
      JMP CONT    NO USR PR IN SYS, EQT13 BIT 10=0
      LDA EQT13,I GET EQT13 
      IOR B2000   SET BIT 10=1
      STA EQT13,I RESTORE EQT13, BIT 10=1 
CONT  LDA EQT6,I  GET CONTROL WORD OF REQUEST 
      AND B77     ISOLATE REQUEST CODE (FRST 6 BITS)
      CPA D3      IS IT A CONTROL REQUEST?
      JMP CNTRL   YES, CHECK FUNCTION 
      LDA EQT6,I  GET CONTROL WORD OF REQUEST 
      STA B       SAVE IN B 
      AND B700    ISOLATE K,V,M BITS
      CPA KVM     BINARY TRANSMISSION ONLY
      JMP IOTYP   O.K.
REJ1  LDA B1      REJECT ILLEGAL READ/WRITE CALL
      JMP I.70,I  RETURN
* 
*     CONTROL REQUEST 
* 
CNTRL LDA EQT6,I  GET CONTROL WORD OF REQUEST 
      AND B7700   ISOLATE FUNCTION CODE 
      CPA B2000   SCHEDULE USER'S PROGRAM?
      JMP USER    YES 
      CPA B2100   N0, UNSCHEDULE USER'S PROGRAM?
      JMP NOUSR   YES 
      JMP REJ2    NEITHER, THEN ILLEGAL 
USER  LDA EQT12,I CHECK FOR USER PROGRAM IN SYS 
      SSA         USER PROGRAM IN SYS, CONTINUE 
      JMP REJ2    NO USER PR IN SYS, BAD REQUEST
      LDA EQT13,I GET EQT 13
      IOR B2000   SET BIT 10 ON 
      STA EQT13,I RESTORE EQT 13, BIT 10=1
      JMP DONE    RETURN
NOUSR LDA EQT13,I GET EQT 13
      AND B1757   CLEAR BIT 10
      STA EQT13,I RESTORE EQT 13, BIT 10=0
DONE  LDA B4      IMMEDIATE COMPLETION
      JMP I.70,I  RETURN
REJ2  LDA B2      REJECT ILLEGAL CONTROL CALL 
      JMP I.70,I  RETURN
* 
*     READ OR WRITE 
* 
IOTYP LDA B       GET CONTROL WORD FROM "B" TO "A"
      AND B77     ISOLATE FIRST 6 BITS
      CPA B2      IS IT WRITE?
      JMP WRITE   YES 
      CPA B1      IS IS READ? 
      JMP READ    YES 
      JMP REJ1    NEITHER, THEN ILLEGAL 
* 
*     READ REQUEST
* 
READ  LDB EQT7,I  GET BUFFER ADDRESS
      LDA EQT13,I GET COMPLETE STATUS WORD FROM DVS 
      STA B,I     PUT LATCH/LIMIT STATUS INTO BUFFER  
      LDA B4      (A)=4, IMMEDIATE COMPLETION 
      CLB,INB     LOAD ONE WORD TRANSMITTED IN "B"
      JMP I.70,I  RETURN
* 
*     WRITE REQUEST 
* 
WRITE LDA EQT8,I  CHECK VALIDITY OF BUFFER LENGTH 
      SZA         REJECT ZERO 
      SSA         REJECT NEGATIVE 
      JMP REJ1
      SLA,ARS     REJECT ODD COUNT-DIVIDE BUFFL BY 2
      JMP REJ1
      CMA,INA     SET RUNNING COUNT NEGATIVE
      STA EQT9,I    IN EQT12
CLC.1 CLC PS,C    SET CHANNEL TO TIMING MODE  
OTA.1 OTA PS      INITIALIZE OPERATION
      JSB OUT     GO DO OUTPUT
      LDA EQT5,I  GET STATUS FROM EQT5
      AND M1774   CLEAR LATCH/LIMIT STATUS U00-U07
      STA EQT5,I  STORE LATCH/LIMIT STATUS IN EQT5
      CLA         (A)=0, OPERATION INITIALIZED
      JMP I.70,I  RETURN
      HED DVR70  COMMON ROUTINES AND CONSTANTS      RWH 11/74 
* 
*     MAIN OUTPUT ROUTINE 
* 
OUT   NOP         ENTRY POINT 
      LDB EQT7,I  GET BUFFER ADDRESS
      STB ADDR    SAVE IT 
      INB         MAKE ADDRESS OF SECOND WORD 
      LDA B,I     GET CONTROL WORD
      STA CONTR   SAVE IT 
      AND LOW3    ISOLATE UNIT #
      CMA         MAKE UNIT NUMBER NEGATIVE +(-1) 
      CLB,INB 
      INA,SZA,RSS 
      JMP *+3 
B5000 BLS         DESIGNATE CURRENT UNIT IN BIT 0-7 
      JMP *-3 
      STB EQT10,I SAVE CURRENT UNIT MASK IN EQT10 
      LDA CONTR   GET PROGRAMMING RANGE INFO
      AND KVM     CHECK PROGRAMMING RANGE 
      SZA         BIT(6)=0, HI RANGE  
      JMP LOWRG   BIT(6)=1, LO RANGE
      LDA EQT11,I GET RANGE FLAG FROM EQT11 
      CMB         INVERT CURRENT UNIT MASK  
      AND B         AND CLEAR STORED RANGE BIT
      STA EQT11,I     STORE HI RANGE BIT IN EQT11 
OK    LDB ADDR,I  GET PROGRAMMING DATA  
      LDA EQT13,I GET COMPLETE DCPS STATUS
      AND EQT10,I DETERMINE IF UNIT IN LATCH/LIMIT
      STA PSTAT   STORE UNIT STATUS 
      SZA         NOT IN LATCH/LIMIT, GOOD
      JMP TMTCK   DO WE PROGRAM ZERO FIRST? 
BACK  LDA CONTR     GET CONTROL WORD
CLC.2 CLC PS,C    INITIALIZE WORD SEQUENCE
STC.1 STC PS      ENABLE TIMING INTERRUPT 
OTB.1 OTB PS      OUTPUT FIRST WORD 
OTA.2 OTA PS      OUTPUT SECOND WORD
      LDA EQT13,I GET EQT13 
      AND RST     RESET TIMEOUT STATUS
      STA EQT13,I RESTORE EQT13 
      LDA PSTAT   GET UNIT'S PREVIOUS STATUS
      SZA,RSS     UNIT WAS IN LATCH/LIMIT-DELAY 
      JMP OUT,I   RETURN
      LDA EQT4,I  GET EQT4 (SYS HANDLES TMOUT)
      IOR D4096   TURN BIT 12 ON
      STA EQT4,I  RESTORE EQT4 (DVR HANDLES TMOUT)
      JMP OUT,I   RETURN
TMTCK LDA EQT13,I GET EQT13 
      AND D6144   ISOLATE BITS 11 AND 12
      SZA         NOT A TIMEOUT RETURN
      RSS         A TIMEOUT RETURN
      JMP WAIT    PROGRAM 0 FIRST AND TIMEOUT 
      CLA         INDICATE NO LATCH CONDITION 
      STA PSTAT    EVEN THOUGH IN 2ND LATCH 
      JMP BACK    NORMAL CONTINUE 
LOWRG LDA EQT11,I GET RANGE FLAG
      AND B       WAS IT LOW RANGE BEFORE?
      SZA         NO, SO PROGRAM 0 ON X1 FIRST  
      JMP OK      YES, NO PROBLEM 
      LDA EQT11,I WAS HIGH RANGE
      IOR B       SET PROPER BIT (0 TO 7) TO 1
      STA EQT11,I   STORE LOW RANGE FOR CURRENT UNIT
      LDA EQT13,I GET COMPLETE DCPS STATUS
      AND EQT10,I DETERMINE IF UNIT IN LATCH/LIMIT
      STA PSTAT   STORE UNIT STATUS 
WAIT  CCA         BACKUP RUNNING COUNT
      ADA EQT9,I  
      STA EQT9,I   BY 1 
      LDA M2      BACKUP BUFFER ADDR. 
      ADA EQT7,I    BY 2
      STA EQT7,I
      ISZ EQT8,I  INCREMENT BUFFER LENGTH 
      ISZ EQT8,I    BY 2
      CLB         PROGRAM ZERO OUTPUT 
      JMP BACK      IN LOW RANGE FIRST
      SKP 
* 
*     SYSTEM COMMUNICATION AREA 
* 
EQT1  EQU 1660B   FOR ALARM INTERRUPT 
EQT4  EQU 1663B   FOR 50 MS DELAY 
EQT5  EQU 1664B   FOR STATUS BITS 
EQT6  EQU 1665B   FOR REQUEST CODE
EQT7  EQU 1666B   FOR BUFFER ADDRESS
EQT8  EQU 1667B   FOR BUFFER LENGTH 
EQT9  EQU 1670B   FOR SCHEDULING PROGRAM
EQT10 EQU 1671B   UNIT MASK 
EQT11 EQU 1672B   RANGE FLAG
EQT12 EQU 1771B   RUNNING COUNT 
EQT13 EQU 1772B   COMPLETE STATUS WORD
EQT15 EQU 1774B   IF ALARM INTERRUPT, ZEROED
INTBL EQU 1654B   FWA OF INTERRUPT TABLE
* 
*     CONSTANTS AND STORAGES
* 
ADDR  BSS 1       BUFFER ADDRESS
CONTR BSS 1       RANGE, LATCH/LIMIT SETTING,UNIT#
CHANL NOP         STORAGE FOR CHANNEL NUMBER
UNIT# NOP         STORAGE FOR ID WD 2 ADDRESS 
CHAN# NOP         STORAGE FOR ID WD 3 ADDRESS 
PSTAT NOP         STORAGE FOR PREVIOUS STATUS 
LOW3  OCT 7 
LOW8  OCT 377 
B1    OCT 1 
B4    OCT 4 
B77   OCT 77
B700  OCT 700 
M1774 OCT 177400
M2    OCT -2
B7700 OCT 7700
B2000 OCT 2000
B2100 OCT 2100
B1757 OCT 175777
D3    DEC 3 
N6    OCT -6
D15   DEC 15
D8    DEC 8 
RST   OCT 163777
D4096 DEC 4096
D6144 DEC 6144
D5    DEC -5
B     EQU 01
A     EQU 00
PS    EQU 00
KVM   OCT 100 
B2    OCT 2 
B1100 OCT 1100
LIAIN LIA PS
* 
*     CONFIGURATION ROUTINE 
* 
SETIO NOP         ENTRY POINT. "A" REG HAS CHAN # 
      STA CHANL   SAVE CHANNEL NUMBER 
      IOR LIAIN   MAKE LIA PS 
      STA LIA.1 
      STA LIA.2 
      ADA KVM     MAKE OTA PS 
      STA OTA.1 
      STA OTA.2 
      ADA KVM     MAKE STC PS 
      STA STC.1 
      STA STC.2 
      ADA B5000   MAKE CLC,C PS 
      STA CLC.1 
      STA CLC.2 
      STA CLC.3 
      STA CLC.4 
      STA CLC.5 
      XOR B1100   MAKE OTB PS 
      STA OTB.1 
      LDA EQT13,I GET EQT 13
      AND B2000   ISOLATE BIT 10
      STA B       SAVE BIT 10 CONDITION 
LIA.1 LIA PS      READ LATCH/LIMIT STATUS FROM DPS
      IOR B       RE-ENTER BIT 10 CONDITION 
      STA EQT13,I SAVE IN EQT13 
      AND LOW8    ISOLATE BITS 0-7
      STA B       SAVE LOWER 8 STATUS BITS
      LDA EQT5,I  GET PREVIOUS EQT STATUS WORD
      AND M1774   CLEAR LOWER 8 BITS (PREV. STATUS) 
      IOR B       UPDATE EQT STATUS WORD
      STA EQT5,I  STORE LATCH/LIMIT STATUS IN EQT5
      JMP SETIO,I RETURN
      HED DVR70      C O N T I N U A T O R      RWH  11/74
C.70  NOP         ENTRY POINT 
      JSB SETIO   CONFIGURE I/O INSTR.
      LDB EQT1,I  CHECK SUSPENSION LIST 
      SZB,RSS     IF ZERO, ALARM INTERRUPT
      JMP ALARM 
      LDA EQT4,I  GET EQT 4, CHECK TMOUT STATUS 
      AND D6144   ISOLATE BITS 11 & 12
      SZA,RSS     11 & 12 # 0, CONTINUE CHECKING
      JMP NEXT    11 & 12 = 0, NORMAL CONTINUE
      CPA D6144   CHECK FOR TIMEOUT 
      RSS         WAS A TIMEOUT, CONTINUE 
      JMP TMTRQ   11=0,12=1 TIMEOUT REQUIRED
      IOR EQT13,I SAVE TIMEOUT INFORMATION
      STA EQT13,I RESTORE EQT13 
      LDA EQT4,I  GET EQT4
      AND RST     RESET BITS 11,12, NORMAL CONT.
      STA EQT4,I  RESTORE EQT 4 
NEXT  ISZ EQT9,I  END OF RUNNING COUNT? 
      JMP OUTPT   NO, CONTINUE
* 
*     TERMINATION SECTION 
* 
CLC.3 CLC PS,C    ASSIGN ALARM INTERRUPT
LIA.2 LIA PS        MODE
STC.2 STC PS      ENABLE INTERRUPT
      LDB EQT8,I  BUFFER LENGTH=TRANSMISSION LOG
      CLA         (A)=0, NORMAL TERMINATION 
      JMP C.70,I  TERMINATION RETURN
* 
*     CONTINUATION
* 
OUTPT ISZ EQT7,I
      ISZ EQT7,I  UPDATE BUFFER ADDRESS 
      JSB OUT     OUTPUT NEXT WORD-PAIR 
EXIT  ISZ C.70    CONTINUATION RETURN 
      JMP C.70,I
* 
*     50 MS TIMEOUT REQUIRED
* 
TMTRQ LDA D5      GET TIMING CONSTANT 
      STA EQT15,I SET SYSTEM CLOCK TO 50 MS 
      JMP EXIT    RETURN, WAIT FOR TIMEOUT
* 
*     ALARM INTERRUPT 
* 
ALARM LDA EQT4,I  GET EQT 4 
      AND D6144   ISOLATE BITS 11 & 12
      SZA         BITS 11,12=0 NOT A TIMEOUT
      JMP SCHED   WAS A TMT, WAITING FOR PROGRM 
      LDA EQT5,I  GET EQT 5 FOR STATUS CHECK
      AND LOW8    ISOLATE LOWER 8 BITS
      SZA,RSS     IF NOT ZERO, LATCH/LIMIT
      JMP *+3     NO CHANGE, THEREFORE SPURIOUS 
      JMP SCHED   LATCHED/LIMITED, SCHED ALARM PROG.  
CLC.4 CLC PS,C    DISABLE INTERRUPT 
      CLB         SET SYSTEM TIME OUT CLOCK 
      STB EQT15,I  TO ZERO  
      JMP EXIT    GO TO CONTINUATION EXIT 
* 
*     SCHEDULE USER'S PROGRAM, IF ANY 
* 
*          ADDRESS OF ID WORD 2 PUT IN PROG. B-REGISTER,  
*     LATEST LATCH/LIMIT STATUS PUT IN ID WORD 2, BITS 0-7
*     (CORRESPONDING TO UNITS 0-7) AND OCTAL CHANNEL NUMBER 
*     PUT IN BITS 10-15 
* 
SCHED LDA EQT13,I GET EQT 13
      AND B2000   CHECK IF USER PROGRAM SCHEDULED 
      SZA,RSS     USER PROGRAM IN SYSTEM, CONTINUE
      JMP CLC.4   NO USER PROGRAM, RETURN 
      LDB EQT12,I GET ADDRESS OF ID SEGMENT 
      STB SCH     PUT ADDRESS INTO $LIST CALL 
      ADB D15     ADD 15
      LDB B,I     GET STATUS OF USERS PROGRAM 
      SZB         WAS IT DORMANT? 
      JMP NDORM   NO, WAIT 50 MS AND TRY AGAIN
      LDA EQT4,I  GET EQT 4 
      AND RST     RESET BITS 11 & 12
      STA EQT4,I  RESTORE EQT4(SYS HANDLES TMTOUT)
      JSB $LIST   MAKE CALL TO SCHEDULE PROGRAM 
      OCT 101     ID SEGMENT ADDR CODE + SCHED REQ
SCH   NOP         STORE ID SEGMENT ADDRESS HERE 
      LDB EQT12,I GET ADDRESS OF ID SEGMENT WD 1
      INB         B=ADDRESS OF ID WORD 2
      STB UNIT#   UNIT# CONTAINS ADDR OF ID WORD 2  
      INB         B=ADDRESS OF ID WORD 3
      STB CHAN#   CHAN# CONTAINS ADDR OF ID WORD 3  
      ADB D8      B=ADDR OF PROG. B-REG (ID WD 11)
      LDA UNIT#   PUT ADDRESS OF WD 2 IN "A"
      STA B,I     PUT ADDRESS OF WD 2 IN PROG. B-REG
      LDA EQT4,I  GET CHANNEL NUMBER
      AND B77     ISOLATE LOWER 6 BITS
      STA CHAN#,I STORE CHANNEL NUMBER IN ID WORD 3 
      LDA EQT5,I  GET UNITS IN LATCH/LIMIT
      AND LOW8    ISOLATE LOWER 8 BITS
      STA UNIT#,I STORE STATUS IN ID WORD 2 
      JMP CLC.4   RETURN
* 
NDORM LDA EQT4,I  GET EQT4(SYS HANDLES TMTOUT)
      IOR D4096   TURN BIT 12 ON
      STA EQT4,I  RESTORE EQT4 (DVR HANDLES TMTOUT) 
      LDA D5      GET TIMING CONSTANT 
      STA EQT15,I  IN EQT 15
CLC.5 CLC PS,C    CLEAR INTERRUPT 
      JMP EXIT    RETURN (WAIT FOR TIMEOUT) 
* 
      END 
                                                                                                                                                                                                    