                PAGE    ,132
TITLE           REMOTE ATOM SERVER V2.xx

; --------------- versie 1.xx ----------------- augustus 1999 ---------------
; Initiele versie met basis-support.
; --------------- versie 2.xx ----------------- augustus 1999 ---------------
; Geheel herziene versie met basis-support.
; --------------------------------------------------------------------------

CSEG            SEGMENT PARA PUBLIC 'CODE'
                ASSUME  CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG

                ORG     100H
REMATOM:        JMP     SERIAL_INIT

; --------------------------------------------------------------------------
; CONSTANTEN, VARIABELEN EN TABELLEN
; --------------------------------------------------------------------------

COM_ADDR        EQU     3F8H            ; COM1
PPI_ADDR        EQU     31CH            ; BASISADRES VAN ATOMKAART
DELAY           EQU     3000H           ; VERTRAGING VOOR "LED"

STATUS          DB      ?               ; STATUSVLAG

; --------------------------------------------------------------------------
; Initialisatie van seriele poort
; --------------------------------------------------------------------------
SERIAL_INIT:    MOV     DX,COM_ADDR     ; LAADT ADRES COMPOORT
                ADD     DX,3            ; LINE CONTROL REGISTER
                MOV     AL,80H          ; ZET DLAB OP '1'
                OUT     DX,AL           ; SCHRIJF NAAR LCR
                SUB     DL,3            ; DIVISOR LATCH
                MOV     AX,0001H        ; LAADT WAARDE VAN DEELTAL
                OUT     DX,AX           ; SCHRIJF NAAR LATCH
                ADD     DX,3            ; TERUG NAAR LINE CONTROL REGISTER
                MOV     AL,03H          ; NO PARITY, 1 STOPBIT
                OUT     DX,AL           ; SCHRIJF NAAR LCR
                INC     DX              ; MODEM CONTROL REGISTER
                MOV     AL,03H          ; SET DTR EN RTS
                OUT     DX,AL           ; SCHRIJF NAAR MCR

; --------------------------------------------------------------------------
; Scherm opbouw
; --------------------------------------------------------------------------
MESSAGE:        MOV     AX,0003H        ; LAADT CODE VOOR TEKSTMODE
                INT     10H             ; WIS SCHERM
                MOV     BX,0B000H       ; SEGMENT ADRES VAN VIDEO GEHEUGEN
                PUSH    BX              ; OP STACK ZETTEN
                POP     ES              ; TERUGHALEN IN ES
                MOV     BX,8001H        ; OFFSET ADRES VAN VIDEO GEHEUGEN
                MOV     AL,0EH          ; SCHERMKLEUR GEEL
ATTRIB:         MOV     ES:BX,AL        ; ZET ATTRIBUUT
                INC     BX              ; VERHOOG POINTER
                INC     BX              ; VERHOOG POINTER
                CMP     BX,9001         ; VOLDOENDE ADRESSEN GEDAAN
                JNE     ATTRIB          ; NEE, DAN VOLGENDE
                LEA     DX,TEKST        ; LAADT POINTER NAAR TEKST
                MOV     AH,9            ; LAADT DOS FUNCTIE CODE
                INT     21H

INITIALIZE:     MOV     AL,08H          ; LAADT ATTRIBUUT VOOR DISCONNECT
                CALL    CONNECT         ; KLEUR CONNECT TEKST
                MOV     ES:829DH,BYTE PTR 08H     ; "RX LED" UIT
                MOV     ES:82CFH,BYTE PTR 08H     ; "TX LED" UIT

WAIT4CLIENT:    MOV     DX,COM_ADDR     ; LEES BASISADRES COMPOORT
                ADD     DX,6            ; MODEM STATUS REGISTER
                IN      AL,DX           ; LEES STATUS
                AND     AL,0A0H         ; TEST OP RTS/DTR
                CMP     AL,0A0H
                JE      CONNECTED       ; SPRING INDIEN VERBONDEN
                MOV     AH,01H          ; BIOS FUNCTIE: KB SCAN
                INT     16H
                JZ      WAIT4CLIENT     ; SPRING INDIEN GEEN TOETS
                MOV     AH,00H          ; BIOS FUNCTIE: KB LEES
                INT     16H
                CMP     AL,27           ; TEST OP ESCAPE
                JNE     WAIT4CLIENT     ; SPRING INDIEN GEEN ESCAPE
SERVER_STOPPED: RET                     ; EINDE PROGRAMMA

CONNECTED:      MOV     AL,0AH          ; LAADT ATTRIBUUT
                CALL    CONNECT         ; GEEFT CONNECTIE AAN
                MOV     STATUS,0FFH     ; STATUS: CLIENT CONNECTED

; --------------------------------------------------------------------------
; Hoofdlus
; --------------------------------------------------------------------------
SERVER:         MOV     DX,PPI_ADDR     ; ZET BASISADRES VAN ATOM IN DX
                CALL    GET_DATA        ; LEES BYTE VAN CLIENT
                CMP     STATUS,27       ; ESCAPE GEDRUKT?
                JE      SERVER_STOPPED  ; JA, EINDE PROGRAMMA
                CMP     STATUS,00       ; CLIENT VERBINDING VERBROKEN?
                JE      INITIALIZE      ; JA, OPNIEUW BEGINNEN
                XOR     AH,AH           ; MAAK AH 0
                SHR     AL,1            ; SCHUIF EEN POSITIE NAAR RECHTS
                JC      REG_READ        ; INDIEN CARRY DAN NAAR LEESROUTINE

REG_WRITE:      CALL    PUT_DATA        ; STUUR ACK1
                ADD     DX,AX           ; TEL OFFSET OP BIJ BASISADRES ATOM
                CALL    GET_DATA        ; LEES DATA
                CALL    PUT_DATA        ; STUUR ACK2
                OUT     DX,AL           ; SCHRIJF DATA NAAR REGISTER
                JMP     SHORT SERVER    ; LEES VOLGENDE OPDRACHT

REG_READ:       ADD     DX,AX           ; TEL OFFSET OP BIJ BASISADRES ATOM
                IN      AL,DX           ; LEES REGISTER
                CALL    PUT_DATA        ; STUUR NAAR CLIENT
                JMP     SHORT SERVER    ; LEES VOLGENDE OPDRACHT

; --------------------------------------------------------------------------
; Stuur byte naar client
; --------------------------------------------------------------------------
PUT_DATA        PROC    NEAR
                PUSH    DX              ; BEWAAR DX REGISTER
                PUSH    AX              ; BEWAAR DATA
                MOV     DX,COM_ADDR     ; LEES ADRES VAN COMPOORT
                ADD     DX,5            ; LINE STATUS REGISTER
PUT1:           IN      AL,DX           ; LEES STATUS
                TEST    AL,20H          ; TEST OP THRE
                JNZ     PUT2            ; GA DATA LEZEN
                CALL    LED_UIT         ; MAAK "LEDS" UIT
                JMP     SHORT PUT1      ; PROBEER OPNIEUW
PUT2:           POP     AX              ; HERSTEL DATA
                SUB     DX,5            ; TRANSMIT DATA REGISTER
                OUT     DX,AL           ; VERSTUUR DATA
                MOV     ES:82CFH,BYTE PTR 0AH     ; "TX LED" AAN
                MOV     CX,DELAY        ; LAADT VERTRAGING VOOR "LED"
                POP     DX              ; HERSTEL DX REGISTER
                RET                     ; EINDE ROUTINE
PUT_DATA        ENDP

; --------------------------------------------------------------------------
; Lees byte van client
; --------------------------------------------------------------------------
GET_DATA        PROC    NEAR
                PUSH    DX              ; BEWAAR DX REGISTER
                MOV     DX,COM_ADDR     ; LEES ADRES VAN COMPOORT
                ADD     DX,5            ; LINE STATUS REGISTER
GET1:           IN      AL,DX           ; LEES STATUS
                TEST    AL,01H          ; TEST OF DATA ONTVANGEN IS
                JNZ     GET3            ; JA, DAN VERDER
                CALL    LED_UIT         ; MAAK "LEDS" UIT
                INC     DX              ; MODEM STATUS REGISTER
                IN      AL,DX           ; LEES MODEM STATUS
                DEC     DX              ; LINE STATUS REGISTER
                AND     AL,0A0H         ; TEST OP DTR/RTS
                CMP     AL,0A0H         ; TEST OF BEIDE ACTIEF
                JNE     GET5            ; SPRING INDIEN NIET GELIJK
                MOV     AH,01           ; BIOS FUNCTIE: KB SCAN
                INT     16H
                JZ      GET2
                MOV     AH,00           ; BIOS FUNCTIE: KB LEZEN
                INT     16H
                CMP     AL,27           ; TEST OP ESCAPE
                JNE     GET1            ; GA OPNIEUW LEZEN
                MOV     STATUS,27       ; ZET STATUS: ESCAPE GEDRUKT
                JMP     SHORT GET4      ; GA OPNIEUW LEZEN
GET5:           MOV     STATUS,00       ; STATUS: CLIENT DISCONNECTED
                JMP     SHORT GET4
GET2:           JMP     SHORT GET1      ; GA OPNIEUW LEZEN

GET3:           SUB     DX,5            ; RECEIVE DATA BUFFER
                IN      AL,DX           ; LEES ONTVANGEN DATA
                MOV     CX,DELAY        ; LAADT VERTRAGING VOOR "LED"
                MOV     ES:829DH,BYTE PTR 0AH     ; "RX LED" AAN
                CLC                     ; CLEAR CARRY VOOR DATA ONTVANGEN
GET4:           POP     DX              ; HERSTEL DX REGISTER
                RET                     ; EINDE ROUTINE
GET_DATA        ENDP

CONNECT         PROC    NEAR
                MOV     BX,82E1H        ; OFFSET ADRES VAN CONNECT-TEKST
CONNECT1:       MOV     ES:BX,AL        ; SCHRIJF ATTRIBUUT NAAR VIDEO
                INC     BX              ; VERHOOG POINTER
                INC     BX              ; VERHOOG POINTER
                CMP     BX,831FH        ; TEST OP EINDE REGEL
                JNE     CONNECT1        ; SPRING INDIEN NOG KARAKTERS VOLGEN
                RET                     ; EINDE ROUTINE
CONNECT         ENDP

LED_UIT         PROC    NEAR
                DEC     CX              ; VERLAAG TIMER
                CMP     CX,0            ; TIJD VERSTREKEN?
                JNE     LED_BLIJFT_AAN  ; NEE, DAN LEDS NIET UITMAKEN
                MOV     ES:829DH,BYTE PTR 08H     ; "RX LED" UIT
                MOV     ES:82CFH,BYTE PTR 08H     ; "TX LED" UIT
LED_BLIJFT_AAN: RET                     ; EINDE ROUTINE
LED_UIT         ENDP

TEKST:          DB      "             ***************************************************",10,13
                DB      "             * Remote Atom Server V2.0   (c) 1999 Roland Leurs *",10,13
                DB      "             ***************************************************",10,10,13
                DB      "Receive Data  *         Transmit Data  *            Client connected on COM1",10,10,13
                DB      "Press escape to stop server . . . $"

CSEG            ENDS
                END    REMATOM
