;**********************************************************************;; MODUL PRINX: ;; SUBDRIVER TIL SERIELLE X-ON, X-OFF STYREDE PRINTERE;                                                      AA-10.06.1982;; COPYRIGHT (C) 1981 BY DANSK DATA ELEKTRONIK APS;; FULD REENTRANT KODE;;**********************************************************************        BRANCH          ; SUBDRIVERNE PLACERES I GRENEN (MBANK)       COND       SYMB       PRINK ;PRINX:: ;;****************************************************************************; SUBDRIVER FOR SERIELLE X-ON,X-OFF PRINTERE;****************************************************************************;                        ;AT ENTRY: -> PRINTBUFFER ON STACKPXXIN::                 ;          BUFFERLENGTH IN C        IF      PXX         POP     H        MOV     A,M        CPI     '<'        JNZ     UDPR1   ;JUMP IF NO COMMANDSCMLOP:        INX     H       ;IGNORE COMMANDS        DCR     C        MOV     A,M        CPI     '>'        JNZ     CMLOP         INX     H        DCR     CUDPR1:        CALL    PRNT    ;PRINT                        ;TERMINATE WITH LF        LXI     H,PRBUF        CALL    GETRN        MVI     M,LF        MVI     C,1     ;BUFFERLENGTH        CALL    PRNT         JMP     FEJL0    ;EXIT  ;****************************************************************************;       PRINT ROUTINE;****************************************************************************;PRNT:                   ;C=BUFFERLENGTH, HL->BUFFERSTART        XCHG        LXI     H,PBUFA        CALL    PUTX    ;STORE BUFFERADDRESS FOR INTERRUPT ROUTINE         XCHG        MVI     B,0     ;BC:=BUFFERLENGTH         DCR     C        DAD     B       ;HL->BUFFER END        INR     C         RZ              ;RETURN ON EMPTY BUFFER         MVI     A,' 'PTSN[:                  ;SKIP TRAILING BLANKS        CMP     M        JNZ     PTSLU        DCX     H        DCR     C        RZ              ;RETURN ON EMPTY BUFFER        JMP     PTSN[PTSLU:                  ;C=BUFFERLENGTH        LXI     H,PBUFL        CALL    GETRN        MOV     M,C     ;STORE BUFFERLENGTH FOR INTERRUPTROUTINE                 CALL    F]INH\  ;GET MESSAGE FROM POOL - ANSWER SEMAPHORE = AUX. SEM.        PUSH    D       ;STACK -> BYTE -2        PUSH    H       ;STACK -> BYTE 2        LXI     H,PMESG        CALL    PUTX    ;STORE MESSAGE ADDRESS FOR INTERRUPTROUTINE         POP     H       ;HL->BYTE 2        LXI     D,#6000 ;WAIT FOR APP. 1 MINUTE  *************        MOV     M,E        INX     H        MOV     M,D        INX     H        MVI     M,1     ;STATUS:=1         CALL    PIDENT  ;REPORT PRINTER ACTIVE - A:=PRINTER NUMBER         POP     D       ;CLEAR STACK        RNZ             ;UNKNOWN PRINTER        PUSH    D         MOV     B,A     ;B:=PR. NUMBER         DI         LDA     PINST        ORA     B        STA     PINST         MVI     A,15        CALL    POUTI   ;OPEN TRANSMITTER AND RECEIVER         IF      NOT+SPC1!PFLSE        LDA     IMASK   ;GIV PRINTEREN LOV TIL AT AFBRYDE        ORI     40      ;P] NIVEAU 60        STA     IMASK        OUT     INTRP        ENDIF        IF      NOT+PFLSE&SPC1        RIM             ;READ INTERRUPT MASK        ANI     6       ;TILLAD AFBRYDELSER P] NIVEAU 5.5 (BIT 0 = 0)        ORI     8        SIM             ;SET INTERRUPT MASK        ENDIF          EI         LXI     B,SLEEP ;SEND MESSAGE TO CLOCK        POP     H        CALL    SEND\PTSLU2:        CALL    VENTH   ;WAIT FOR MESSAGE FROM CLOCK                        ;DE->BYTE 0, HL->BYTE -2        DI        PUSH    H        LXI     D,6        DAD     D       ;HL->STATUS BYTE (4)        MOV     A,M     ;A:=STATUS        ORA     A        POP     H        PUSH    PSW        LXI     B,POOL  ;RETURN MESSAGE        CALL    SND2          POP     PSW        JNZ     PFMEX   ;PRINTING DID NOT SUCCEED         EI              ;PRINTING SUCCEEDED         LXI     H,PFEJL        CALL    GETRN        MOV     A,M        ORA     A        RZ              ;NO ERROR MESSAGE TO ERASE         MVI     M,0        LXI     B,SLTLN ;ERASE ERROR MESSAGE        JMP     FJLSK PFMEX:                  ;WRITE ERROR MESSAGE        MVI     A,10    ;DISABLE TRANSMITTER AND RECEIVER        CALL    POUTI        EI              ;YOU CAN ENABLE SINCE THIS PRINTER IS DEAD !!                        ;SEND NEW MESSAGE TO THE CLOCK        CALL    F]INH\  ;GET MESSAGE FROM POOL - ANSWER SEMAPHORE = AUX. SEM.        PUSH    D       ;STACK -> BYTE -2        PUSH    H       ;STACK -> BYTE 2        LXI     H,PMESG        CALL    PUTX    ;STORE MESSAGE ADDRESS FOR INTERRUPTROUTINE         POP     H       ;HL->BYTE 2        LXI     D,#6000 ;WAIT FOR 60 SEC   *************************        MOV     M,E        INX     H        MOV     M,D        INX     H        MVI     M,1     ;STATUS:=1         LXI     B,SLEEP        POP     H        CALL    SEND\         MVI     A,14    ;ENABLE RECEIVER        CALL    POUTI         LXI     H,PFEJL        CALL    GETRN        MOV     A,M     ; SE OM DER VAR EN FEJL OGS] SIDST        ORA     A          JNZ     PTSLU2  ; PR\V IGEN UDEN FEJLUDSKRIFT          MVI     M,1     ; HUSK AT DER ER EN SKRIVERFEJL        LXI     B,FJLMP ; BC->FEJLMEDDELELSE        CALL    FJLSK   ;        JMP     PTSLU2         END