ASMB,R,B,L,T,C
      HED BCS DRIVER FOR <91200> VIDEO GENERATOR
* 
*     NAME:   BCS DRIVER FOR 91200 VIDEO GENERATORTOR 
*     SOURCE: 91200-18005 
*     BINARY: 91200-16005 
*     PGMR: JOHN FLORES 
* 
* 
      NAM D.13    91200-16005 REV 1633
      SPC 1 
      ENT D.13,I.13 
      EXT DMAC1,DMAC2,IOERR 
      SUP PRESS EXTRANEOUS LISTING
      SPC 1 
*     THIS DRIVER IS RESPONSIBLE FOR PROCESSING EXEC I/O CALLS FOR
*      THE <91200> VIDEO DISPLAY GENERATOR. IT RECOGNIZES WRITE AND 
*      CONTROL REQUESTS.
      SPC 1 
*     WRITE REQUESTS WILL INITIATE A DMA TRANSFER OF YX 
*      COORDINATES OF POINTS TO BE WRITTEN ON OR ERASED FROM
*      THE VIDEO MONITOR SCREEN BY THE <91200>. 
*      Y=BITS 15-8, X=BITS 7-0. 
      SPC 1 
*     CONTROL REQUESTS ARE USED TO:-
*                   SET COLOR (BLACK FOR SELECTIVE ERASE) 
*                   SET SENSE (VIDEO POLARITY)
*                   PERFORM A BULK ERASE. 
      SPC 1 
*     THE FUNCTION BITS FOR CONTROL REQUESTS ARE DEFINED AS FOLLOWS:- 
      SPC 1 
*     BITS 10, 9, & 6 SELECT COLOR AS FOLLOWS:
      SPC 1 
*            00 XX0  WHITE
*            00 XX1  BLACK (SELECTIVE ERASE)
*            01 XX0  RED                 -----\ 
*            01 XX1  GREEN                     \
*            10 XX0  BLUE                       \ NOT FOR 1 CARD
*            10 XX1  YELLOW (RED & GREEN        /  SYSTEMS
*            11 XX0  MAGENTA (RED & BLUE)      /
*            11 XX1  CYAN (BLUE & GREEN) -----/ 
      SPC 1 
*     BIT 7 IS THE SENSE BIT, IF SET TO 1 IT CAUSES THE VIDEO 
*      OUTPUT OF THE CARD TO INVERT.
      SPC 1 
*     BIT 8 SET TO 1 CAUSES BULK ERASE (TO SENSE PREVIOUSLY SET). 
      SPC 1 
*     WHEN BIT 8 OF THE CONTROL WORD IS SET (TO ERASE), BITS
*      6, 7, 9, & 10 OF THE CONTROL WORD ARE IGNORED. 
      SPC 1 
      SKP 
*     INITIATION SECTION
      SPC 1 
D.13  NOP 
      STA SAVA       SAVE EQT ENTRY ADDRESS 
      STB SAVB       SAVE REQUEST (WORD 2) ADDRESS. 
      LDA SAVA,I     GET FIRST WORD OF EQT. 
      AND M77        ISOLATE DEVICE SELECT CODE.
      STA TVSC       SAVE IT IN TVSC. 
* 
*  DRIVER BUSY TEST 
* 
DXX.1 LDB DFLG       IF DRIVER BUSY,
      SZB            (DFLG NOT=0, THEN
      JMP REJB       REJECT REQUEST.
* 
*  CHECK FOR CONTROL REQUEST
* 
      LDA SAVB,I     GET WORD 2 OF USER REQUEST.
      ALF            ROTATE REQUEST CODE TO LOW A REG.
      AND M17        AND ISOLATE CODE.
      CPA B3         CONTROL REQUEST ???
      JMP CNTRL      YES, PROCESS CONTROL REQUEST.
* 
*  ILLEGAL READ CHECK 
* 
B10   SLA           IF A=1 ,RETURN CODE IS RIGHT
      JMP D.13,I    TO SHOW ILLEGAL READ. 
      SPC 1 
* 
*  CHECK FOR AVAILABLE DMA CHANNEL
* 
      LDB DMAC1     GET DMA INDICATOR WORD. 
      CCE,SZB,RSS   IS DMA DEFINED ?
      JMP NODMA     NO SET ERROR EXIT.
      SSB           YES,IS DMAC1 BUSY ? 
      JMP CH2       YES, TRY DMAC2. 
      STB A         SAVE DMA CH NO. 
      RBL,ERB       SET THIS DMA CH.
      STB DMAC1     BUSY. 
      JMP SDMA
CH2   LDB DMAC2     GET DMA INDICATOR WORD. 
      SZB,RSS       IS DMAC2 DEFINED ?
      JMP *+3       NO,REJECT 
      SSB,RSS       IS DMAC2 BUSY ? 
      JMP *+7       NO. 
      CLB,INB       YES,SET DMA BUSY INDICATOR. 
      JMP REJB+1    AND REJECT. 
NODMA CCB           SET B TO FWA
      ADB SAVB      OF USER CALL. 
      LDB B3        SET A=3 TO SAY NO DMA 
      JMP IOERR     AND HALT. 
      STB A         SAVE DMA CH NO. 
      RBL,ERB       SET THIS DMA CH.
      STB DMAC2     BUSY. 
      SKP 
* 
*  SET DMA COMPLETION INTERRUPT LINK
* 
SDMA  LDB TVSC,I    GET THE CONTENTS OF THE DEVICE INTERRUPT
      STB A,I       LOCATION AND PLUG INTO DMA INTERRUPT LOC. 
      STA CHAN      SAVE DMA NO.
* 
*  CONFIGURE DMA INSTRUCTIONS.
* 
* 
      IOR OTA0      102606/7
      STA DMAO
      XOR B4        102602/3
      STA DMAO1 
      STA DMAO2 
      IOR B300      102702/3
      STA DMAS
      IOR B1200     103702/3
      ADA B4        103706/7
      STA DMASC 
      XOR B5000     106706/7
      STA DMACX 
      XOR B4        106702/3
      STA DMAC      END DMA CONFIGURATION 
* 
*  SET THE DEVICE BUSY FLAG 
* 
      LDA SAVA      GET ADDRESS OF FIRST EQT WORD.
      STA EQT1      AND SAVE IT.
      ISZ SAVA      SET ADDRESS TO WORD 2 OF EQT. 
      LDB M15       ENTRY, SET BIT 15 ON ( A FIELD = 2) 
      LDA SAVA,I    TO SAY BUSY 
      IOR B         AND 
      STA SAVA,I    RESTORE.
* 
*  INITIALIZE TRANSMSSION LOG.
* 
      LDA SAVA      SET ADDRESS OF
      INA           EQT WORD 3
      STA EQTA      IN EQTA 
      STB EQTA,I    INITIALIZE XMISSION LOG.
      SPC 1 
* 
*  OUTPUT DMA CONTROL WORD. 
* 
      LDA TVSC      ASSIGN TV CARD TO DMA AND 
      IOR BIT15     ASK STC AFTER EACH TRANSFER,
DMAO  OTA DMA        BUT NO FINAL CLC.
      IOR STF0      CONFGR STF FOR TV 
      STA STF1
      SKP 
* 
*  OUTPUT USER BUFFER ADDRESS 
* 
      ISZ SAVB      INDEX ADDRESS TO WORD 4.
      ISZ SAVB      OF USER REQUEST.
      LDA SAVB      GET WORD 4 OF 
      LDA A,I       REQUEST.
      RAL,CLE,SLA,ERA (IF INDIRECT, 
      JMP *-2       GET EFFECTIVE ADDRESS 
DMAC  CLC DMA-4     SEND BUFFER ADDRESS DIRECTLY. 
DMAO1 OTA DMA-4     TO ADDRESS REGISTER.
* 
*  OUTPUT USER WORD COUNT 
* 
      ISZ SAVB      INDEX TO WORD 5 OF REQUEST
      LDA SAVB,I    GET WORD 5-BUFFER LENGTH
      STA CHC       SAVE WORD COUNT 
      CMA,INA       SET WORD COUNT TO NEG.
DMAS  STC DMA-4      SEND TWO'S COMPLEMENT OF 
DMAO2 OTA DMA-4      BUFFER LENGTH TO WORD COUNT REG. 
* 
*  FOLLOWING INSTRUCTIONS START DATA TRANSMISSION.
* 
      STA DFLG      SET DFLG BUSY (NOT=0) 
      CLA           A=0, INDICATES OPERATION INITIATE.
STF1  STF TVGEN     READY TV CARD 
DMASC STC DMA,C     TURN ON DMA, BUT
DMACX CLC DMA       PREVENT INTERRUPT FROM IT.
      CLA 
      JMP D.13,I    EXIT TO IOC.
* 
*  CONFIGURE I-0 INSTRUCTIONS FOR TV CARD CONTROL WORD. 
* 
CNTRL LDA TVSC      CONFIGURE I/O INSTRUCTIONS
      IOR MIA0      1024
      STA ERASE 
      IOR B1200     1036
      STA OTATV 
      IOR B100      1037
      STA STCTV 
      XOR B5000     1067
      STA CLCTV     END I/O CONFIGURATION 
* 
*  SET EQT BUSY FLAG
* 
      LDA SAVA      GET ADDRESS OF EQT1 
      STA EQT1      AND SAVE. 
      ISZ SAVA      SET ADDRESS 
      LDA SAVA,I    WORD 2 OF EQT ENTRY.
      IOR M15       SET BIT 15
      STA SAVA,I    OF WORD 2 = 1 
      LDA SAVA      (A-FIELD=2) TO DAY BUSY AND RESTORE.
      SKP 
* 
*  STORE ADDRESS OF EQT 3 IN DRIVER 
* 
      INA           SET ADDRESS OF EQT WORD 3 
      STA EQTA      IN EQTA 
* 
*  CHECK THE USER CONTROL WORD AND RE-CONFIGURE 
*  IT FOR THE TV CARD.
* 
      SPC 1 
      LDA SAVB,I    GET CONTROL WORD (ICNWD). 
      AND =B3700    ISOLATE CONTROL BITS. 
      STA B         SAVE IT IN B REG. 
      BLF,BLF       CHECK BIT 8 
      SLB 
      JMP ERASE     DO BULK 'ERASE' 
      SPC 1 
      LDA EQT1,I
      AND MASK      CHECK FOR 
      SZA,RSS       NON-ZERO SUB-CHANNEL
      JMP GO.ON     IS ZERO - SO COLOR
      LDA B         NOT ZERO - KILL COLOR 
      RAR,ERA       IS COLOR NOT
      SEZ,SLA,RSS    WHITE OR BLACK?
      JMP GO.ON      YES - SO OK! 
      LDA B          NO - SO KILL COLOR TO
      AND MASK2           WHITE ONLY
      STA B 
      SPC 1 
GO.ON CLE,ELB       CALL IS TO SET OR CHANGE
      BRS,BRS       COLOR AND/OR SENSE. 
      CLA           POSITION
      ELA,RAL         CONTROL BITS
      RBR,ERB           6, 9, & 10
      RBL,RBL             FOR TESTING 
      SSB,SLB,RSS   CYAN OR GREEN?
      JMP *+3         NEITHER 
      IOR B1          IT IS CYAN OR GREEN 
      JMP *+4       WHICH?
      SLB,RSS       MAGENTA OR RED? 
      JMP *+5         NEITHER 
      IOR B4          IT IS CYAN/MAGENTA OR GREEN/RED 
      SEZ,RSS       CYAN/MAGENTA OR GREEN/RED?
      IOR B10         IT IS GREEN OR RED
      JMP CLCTV     DONE
      SSB,RSS       YELLOW OR BLACK?
      JMP *+5         NEITHER (IT IS BLUE OR WHITE) 
      IOR B10         IT IS YELLOW OR BLACK 
      SKP 
      SEZ,RSS       YELLOW OR BLACK?
      IOR B5          IT IS BLACK 
      JMP CLCTV     DONE
      SEZ           BLUE OR WHITE?
      IOR B5          IT IS BLUE
CLCTV CLC TVGEN     SWITCH MODE FF
OTATV OTA TVGEN,C    TO STEER OUTPUT TO MODE REG. 
      LDB EQT1       GET ADDRESS OF FIRST EQT WORD. 
      INB            SET TO ADDRESS OF SECOND WORD. 
      LDA B,I        GET SECOND WORD. 
      AND =B77777    CLEAR DEVICE BUSY FLAG AND 
      STA B,I        RESTORE IT.
      LDA M15         DO IMMEDIATE
      JMP D.13,I       COMPLETION 
* 
*  REJECT SECTION 
* 
RCER  CLB,RSS       REQUEST CODE ERROR,(B)=0
RCER2 CLB,INB       CHARACTER REQUEST ILLEGAL FOR 
      BLS,SLB       DRIVER, SETB=2. 
REJB  LDB M15       DRIVER-DEVICE BUSY,(B) SIGN=1,
      CLA,INA       SET(A) NON-ZERO.
      JMP D.13,I    EXIT TO IOC AND REJECT. 
* 
*  ERASE SECTION
* 
ERASE MIA TVGEN     ANY INPUT WILL BULK ERASE 
STCTV STC TVGEN,C   INTERRUPT NEEDED TO COMPLETE. 
      CLA 
      STB ERFLG     SET ERASE FLAG SO THAT I.13 KNOWS 
      STB DFLG      INTERRUPT WAS CAUSED BY ERASE.
      JMP D.13,I    ALSO SET DRIVER BUSY FLAG (DFLG)
      SKP 
* 
*  CONSTANTS AND STORAGE SECTION
* 
TVSC  NOP           STORE CURRENT IO SELECT CODE. 
BIT12 OCT 10000 
BIT15 OCT 100000
OTA0  OTA 0 
STF0  STF 0 
CLC0  CLC 0,C 
MIA0  MIA 0 
B1    OCT 1 
B3    OCT 3 
B4    OCT 4 
B5    OCT 5 
B6    OCT 6 
B7    OCT 7 
B100  OCT 100 
B300  OCT 300 
B1200 OCT 1200
B5000 OCT 5000
BIT11 OCT 4000
MASK  OCT 700 
MASK2 OCT 137771
SAVA  OCT 0 
SAVB  OCT 0 
M15   OCT 100000
M17   OCT 17
M77   OCT 77
CHAN  OCT 0         USED TO SAVE DMA CHANNEL. 
DFLG  OCT 0         SET CONDITION INDICATES DRIVER BUSY.
EQTA  OCT 0 
EQT1  OCT 0 
ERFLG OCT 0         SET CONDITION INDICATES BULK ERASE. 
      SKP 
*     CONTINUATOR SECTION.
      SPC 1 
* 
*  ENTERED BY THE TV CARD INTERRUPT AFTER 
*  COMPLETION OF DMA OR A BULK ERASE. 
* 
I.13  NOP 
      STA SAVAX     SAVE A-REG
      STB SAVBX     SAVE B-REG
      ERA,ALS       SAVE E, 
      SOC           AND 
      STA SAVEX     OVERFLOW
      LDA TVSC      CONFIGURE CLC ON TV CARD
      IOR CLC0      BEFORE
      STA TVCLC     EXIT. 
* 
*  CHECK FOR COMPLETION OF A BULK ERASE OPERATION 
* 
      LDA ERFLG     DOES ERASE FLAG INDICATE BULK ERASE?
      SZA 
      JMP RSTOR     YES, SO RESTORE REGS,CLEAR FLAGS & RETURN.
* 
*  DISMANTLE DMA-DRIVER INTERRUPT LINKAGE 
* 
      LDA DMACX      NO,STORE A CLC INST. IN
      STA CHAN,I    THE DMA INTERRUPT LOCATION. 
* 
*  CLEAR DMA CHANNEL BUSY FLAG. 
* 
      LDA CHAN      GET DMA CHANNEL NO. 
      CPA B6        WAS CH NO.1 USED ?
      STA DMAC1     YES,CLEAR CH NO.1 BUSY FLAG.
      CPA B7       WAS CH NO. 2 USED.?
      STA DMAC2    YES,CLEAR CH NO.2 BUSY FLAG. 
* 
*  RESTORE WORD 3 OF EQT ENTRY AND CLEAR DRIVER BUSY FLAG.
* 
RSTOR LDA EQTA,I   SET A=WORD 3 OF EQT ENTRY
      LDB CHC      SET B=WORD COUNT 
      ADA B        PUT WORD COUNT IN A AND
      STA EQTA,I   RESTORE WORD 3 IN EQT. 
      CLA          CLEAR THE DRIVER 
      STA DFLG     BUSY FLAG
      STA ERFLG    AND THE ERASE FLAG.
* 
*  CLEAR DEVICE BUSY FLAG 
* 
      LDB EQT1       GET ADDRESS OF FIRST EQT WORD. 
      INB            SET TO ADDRESS OF WORD 2.
      LDA B,I        GET SECOND EQT WORD. 
      AND =B77777    CLEAR DEVICE BUSY BIT. 
      STA B,I        AND RESTORE WORD.
      SKP 
* 
*  RESTORE REGISTER SECTION 
* 
      LDA SAVEX    RESTORE
      CLO          E
      SLA,ELA      OVERFLOW,
      STF 1        A, 
      LDA SAVAX    AND B AT TIME OF 
      LDB SAVBX    INTERRUPT. 
TVCLC CLC TVGEN,C   CLEAR CONROL & CLEAR FLAG ON TY CARD  
      JMP I.13,I   RETURN TO IOC. 
      SPC 3 
* 
*  CONSTANTS AND STORAGE SECTION
* 
A     EQU 0        A-REG. 
B     EQU 1        B-REG. 
TVGEN EQU 0        DUMMY SELECT CODE. 
DMA   EQU 6        NOMINAL DMA CHANNEL  
SAVAX OCT 0 
SAVEX OCT 0 
SAVBX OCT 0 
CHC   OCT 0 
TEMP  OCT 0 
      SPC 2 
      END 
                                                                                                                                                                                                                                    