                PAGE    ,132
TITLE           ACORN ATOM PRINTER CONNECTION

;         Dit programma leest een byte van de acia en stuurt dit door naar
;         de printer. Hierbij wordt de hardware direct aangestuurd om het
;         programma zo snel mogelijk te maken. Gebruikt worden COM2 en LPT1.

CSEG            SEGMENT PARA PUBLIC 'CODE'
                ASSUME  CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG

                ORG     100H
API:            JMP     APC_INSTALL

COMPOORT        EQU     1       ; COM2 WORDT GEBRUIKT (0=COM1)

COMBASE         = 3F8H-COMPOORT*100H    ; BASISADRES GEBRUIKTE POORT
THR             = COMBASE               ; TRANSMIT HOLDING REGISTER
RBR             = COMBASE               ; RECEIVE BUFFER REGISTER
IER             = COMBASE + 1           ; INTERRUPT ENABLE REGISTER
IIR             = COMBASE + 2           ; INTERRUPT IDENTIFICATION REGISTER
LCR             = COMBASE + 3           ; LINE CONTROL REGISTER
MCR             = COMBASE + 4           ; MODEM CONTROL REGISTER
LSR             = COMBASE + 5           ; LINE STATUS REGISTER
MSR             = COMBASE + 6           ; MODEM STATUS REGISTER
IRQ             = 0CH - COMPOORT        ; IRQNUMMER VOOR SERIEELE POORT

PRNPOORT        EQU     0       ; LPT1 WORDT GEBRUIKT (1=LPT2)

PRNBASE         = 378H-PRNPOORT*100H    ; BASISADRES GEBRUIKTE POORT
PROUT           = PRNBASE               ; PRINTER DATA REGISTER
PS              = PRNBASE + 1           ; PRINTER STATUS REGISTER
PRCTRL          = PRNBASE + 2           ; PRINTER CONTROL REGISTER

PIC             = 20H                   ; INTERRUPT CONTROLLER
IMR             = PIC+1                 ; INTERRUPT MASK REGISTER
INTMASK_COM     = 0EFH+COMPOORT*8       ; INTERRUPT MASKER

; --------------------------------------------------------------------------
; Onderstaand stuk moet na installatie resident blijven.
; --------------------------------------------------------------------------

APC             PROC    FAR
                PUSH    AX              ; SAVE GEBRUIKTE REGISTERS
                PUSH    BX
                PUSH    DX
                PUSHF
                MOV     DX,RBR          ; I/O REGISTER ADRES NAAR DX
                IN      AL,DX           ; LEES HET ONTVANGEN TEKEN
                MOV     BX,AX           ; ZET TEKEN TIJDELIJK IN BX
                MOV     DX,PS           ; I/O REGISTER ADRES NAAR DX
                IN      AL,DX           ; LEES PRINTER STATUS
                MOV     DX,THR          ; I/O REGISTER ADRES NAAR DX
                OUT     DX,AL           ; STUUR STATUS TERUG
                AND     AL,80H          ; TEST BUSY BIT
                JZ      APC_END         ; SPRING INDIEN NIET GEREED
                MOV     AX,BX           ; DATA TERUG NAAR AX REGISTER
                MOV     DX,PROUT        ; I/O REGISTER ADRES NAAR DX
                OUT     DX,AL           ; VERSTUUR DATA NAAR PRINTER
                MOV     DX,PRCTRL       ; LAADT PRINTER CONTROL REGISTER
                IN      AL,DX           ; LAADT PRINTER INSTELLING
                OR      AL,00000001B    ; ZET STROBE BIT
                OUT     DX,AL           ; STUUR STROBE SIGNAAL NAAR PRINTER
                AND     AL,11111110B    ; RESET STROBE BIT
                OUT     DX,AL           ; WIS STROBE SIGNAAL NAAR PRINTER
APC_END:        MOV     AL,20H          ; GEEF END OF INTERRUPT COMMANDO
                OUT     PIC,AL
                POPF                    ; HERSTEL GEBRUIKTE REGISTERS
                POP     DX
                POP     BX
                POP     AX
                IRET                    ; EINDE PROGRAMMA, TERUG NAAR DOS
APC             ENDP

KEEP            EQU THIS BYTE

; --------------------------------------------------------------------------
; Onderstaand stuk mag na installatie vrijgegeven worden.
; --------------------------------------------------------------------------

MSG_INST        DB      'ATOM PRINTER CONNECTION V1.00 IS GEINSTALLEERD',10,13
                DB      'TRANSMISSIE PROTOCOL= COM2,9600,N,8,1',10,10,13
                DB      '(c) Roland Leurs 1993',10,10,13,'$'

APC_INSTALL     PROC    NEAR
INITPORT:       MOV     AH,0            ; INIT COMMANDO
                MOV     AL,11100011B    ; INSTELLING = 9600,N,8,1
                MOV     DX,COMPOORT     ; NUMMER VAN SERIEELE POORT
                INT     14H
                CLI                     ; GEEN INTERRUPTS MEER TOESTAAN
                MOV     DX,IER          ; I/O REGISTER ADRES NAAR DX
                MOV     AL,01H          ; UITVOERWAARDE NAAR AL
                OUT     DX,AL           ; ENABLE ACIA INTERRUPTS
                MOV     DX,MCR          ; I/O REGISTER ADRES NAAR DX
                MOV     AL,0BH          ; UITVOERWAARDE NAAR AL
                OUT     DX,AL           ; ACTIVEER DTR SIGNAAL EN OUT2
                MOV     DX,OFFSET APC   ; NIEUWE INTVECTOR ZETTEN
                MOV     AX,2500H+IRQ
                INT     21H
                MOV     DX,IMR          ; I/O REGISTER ADRES NAAR DX
                IN      AL,DX           ; LEES IMR
                AND     AL,INTMASK_COM  ; ENABLE INTERRUPT VAN COMPOORT
                OUT     DX,AL           ; ZET NIEUWE INTERRUPT MASKER
                STI                     ; INTERRUPTS WEER TOESTAAN
                MOV     AH,9            ; GEEF MELDING
                LEA     DX,MSG_INST
                INT     21H
                MOV     DX,OFFSET KEEP  ; OFFSET ADRES VAN HET LAATSTE BYTE
                ADD     DX,15           ; BEREKEN AANTAL RESIDENTE PARAGRAPHS
                MOV     CL,4
                SHR     DX,CL
                MOV     AX,3100H        ; PROGRAMMA BEEINDIGEN
                INT     21H
APC_INSTALL     ENDP

CSEG            ENDS
                END     API
