Atom Nieuws jaargang 1999 nummer 2
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif
pagina 11
Remote Atom   door roland leurs

Remote Atom biedt ons de overbodige luxe om de Atom-in-PC via een "Remote Atom Server" en een seriële verbinding te benaderen vanaf een pc of notebook. We kunnen dus wel gebruik maken van het terminal programma, zonder dat de Atomkaart fysiek in het systeem aanwezig is.

Is dat leuk? Ja, ik vind van wel. Is dat nuttig? Nee, gezien de korte afstand tussen het "client" systeem en de server is er niets nuttigs aan. Waarom dan dit programma?

Dit programma is geschreven met het doel op een nieuwe functie voor het terminal programma. Vanaf versie 4.25 is de source, die toch bijna niemand heeft, gesplitst in twee functionele groepen. De eerste groep van files neemt de afhandeling van de terminal programma commando’s voor haar rekening; de twee groep zorgt voor de communicatie tussen de Atom en het terminal programma. Zo ziet u in onderstaande listing de lees en zendroutine voor de "normale" terminal:

LEESBYTE        PROC    NEAR
                PUSH    DX              ; SAVE GEBRUIKTE REGISTERS
LEESBYTE1:      MOV     DX,PPI_ADDR     ; LAADT STATUSREGISTER ADRES
                ADD     DX,2
                IN      AL,DX           ; LEES STATUSREGISTER
                TEST    AL,00100000B    ; TEST OP INPUT BUFFER FULL
                JNZ     LEESBYTE2       ; SPRING INDIEN EEN BYTE ONTVANGEN
                JMP     SHORT LEESBYTE1
LEESBYTE2:      SUB     DX,2            ; POORTADRES VERLAGEN
                IN      AL,DX           ; LEES DATA
                POP     DX              ; HERSTEL DX REGISTER
                RET                     ; EINDE ROUTINE
LEESBYTE        ENDP

ZENDBYTE        PROC    NEAR
                PUSH    DX              ; SAVE GEBRUIKTE REGISTERS
                PUSH    AX
                MOV     DX,PPI_ADDR     ; LAADT ADRES STATUSREGISTER
                ADD     DX,2
ZENDBYTE1:      IN      AL,DX           ; LEES STATUSREGISTER
                TEST    AL,00000010B    ; TEST OP OUTPUT BUFFER EMPTY
                JZ      ZENDBYTE1       ; SPRING ALS VORIG TEKEN NIET GELEZEN
                DEC     DX              ; POORTADRES VERLAGEN
                POP     AX              ; HAAL DATA VAN STACK
                OUT     DX,AL           ; VERSTUUR DATA
                POP     DX              ; HERSTEL DX
                RET                     ; EINDE ROUTINE
ZENDBYTE        ENDP

De volgende listing toont de routines voor de remote atom terminal:

LEESBYTE        PROC    NEAR
LEESBYTE1:      MOV     AL,5            ; LAADT SERVER COMMANDO
                CALL    SERVER          ; VOER COMMANDO UIT
                TEST    AL,00100000B    ; TEST OP INPUT BUFFER FULL
                JNZ     LEESBYTE2       ; SPRING INDIEN EEN BYTE ONTVANGEN
                JMP     SHORT LEESBYTE1
LEESBYTE2:      MOV     AL,1            ; LAADT SERVER COMMANDO
                CALL    SERVER          ; STUUR NAAR COMMANDO
                RET                     ; EINDE ROUTINE
LEESBYTE        ENDP

ZENDBYTE        PROC    NEAR
                PUSH    AX
ZENDBYTE1:      MOV     AL,5            ; LAADT SERVER COMMANDO
                CALL    SERVER          ; STUUR NAAR SERVER
                TEST    AL,00000010B    ; TEST OP OUTPUT BUFFER EMPTY
                JZ      ZENDBYTE1       ; SPRING ALS VORIG TEKEN NIET GELEZEN
                MOV     AL,2            ; LAADT SERVER COMMANDO
                CALL    SERVER          ; STUUR NAAR SERVER
                POP     AX              ; HAAL DATA VAN STACK
                PUSH    AX              ; NOG EVEN BEWAREN
                CALL    SERVER          ; STUUR DATA NAAR SERVER
                POP     AX              ; HERSTEL AX
                RET                     ; EINDE ROUTINE
ZENDBYTE        ENDP

SERVER          PROC    NEAR
                PUSH    DX              ; BEWAAR GEBRUIKTE REGISTERS
                PUSH    AX
                MOV     DX,PPI_ADDR     ; LAADT ADRES VAN COMPOORT
                ADD     DX,5            ; LINE STATUS REGISTER
ATOMTX1:        IN      AL,DX           ; LEES STATUS
                TEST    AL,20H          ; CONTROLEER OP THRE
                JZ      ATOMTX1         ; SPRING INDIEN NIET GEREED
                SUB     DX,5            ; DATA REGISTER
                POP     AX              ; HERSTEL COMMANDO (in al)
                OUT     DX,AL           ; VERSTUUR COMMANDO
                ADD     DX,5            ; LINE STATUS REGISTER
ATOMTX2:        IN      AL,DX           ; LEES STATUS
                TEST    AL,01H          ; TEST OF BYTE ONTVANGEN IS
                JZ      ATOMTX2         ; NEE, DAN NOG FF WACHTEN
                SUB     DX,5            ; RECEIVE BUFFER
                IN      AL,DX           ; LEES DATA
POP     DX              ; HERSTEL DX REGISTER
                RET                     ; EINDE ROUTINE
SERVER          ENDP

In het laaste stuk wordt de communicatie op geheel andere wijze geregeld. Daar waar de normale terminal een register van de Atomkaart rechtstreeks vanaf de I/O bus leest, stuurt de remote terminal een opdracht via de seriële poort naar de server. Deze opdrachten zijn:
 
Schrijf Lees Offset
0 1 0
2 3 1
4 5 2
6 7 3

Indien de kaart geplaatst is op adres 31C zal het commando 5 dus adres 31E uitlezen, dit is het statusregister van de 8255. Een andere vergelijking die het verschil en toch de overeenkomst laat zien zijn de reset routines. De eerste listing is wederom de normale terminal, direct daarop volgend staat de remote terminal client afgedrukt.

HW_RESET        PROC    NEAR   ; normale Atom-in-PC terminal
                MOV     DX,PPI_ADDR     ; LAADT ADRES COMMAND REGISTER 8255
                ADD     DX,3
                MOV     AL,0EH          ; GEEF RESETPULS
                OUT     DX,AL           ; PC7 LAAG
                MOV     CX,00FFH        ; WACHT KORTE TIJD
RESETPAUSE:     LOOP    RESETPAUSE
                MOV     AL,0FH          ;
                OUT     DX,AL           ; PC7 HOOG
                RET
HW_RESET        ENDP
 

HW_RESET        PROC    NEAR            ; remote atom terminal
                MOV     AL,6            ; LAADT SERVER COMMANDO
                CALL    SERVER          ; STUUR NAAR SERVER
                MOV     AL,0EH          ; LAADT DATA
                CALL    SERVER          ; STUUR NAAR SERVER
                MOV     AL,6            ; LAADT SERVER COMMANDO
                CALL    SERVER          ; STUUR NAAR SERVER
                MOV     AL,0FH          ; LAADT DATA
                CALL    SERVER          ; STUUR NAAR SERVER
                RET                     ; EINDE RESET OPDRACHT
HW_RESET        ENDP

De assembler include file waarin de communicatie routines staan moet de volgende routines hebben:

; **************************************************************************
;                        A T O M I S A . I N C
; **************************************************************************
; Use this module if your Atom-in-PC board is plugged into your workstation.
; All entries are supported, although some routines have No Operation.
; Entries:  AUTO_DETECT   tries to find your Atom-in-PC within the address
;                         range 300h-31Ch. The address must be placed in
;                         PPI_ADDR. If auto-detect fails or no Atom-in-PC
;                         is installed then PPI_ADDR should be 0000h.
;           NEW_ADDRESS   changes the auto-detected address into the
;                         address passed by the DX register. The address must
;                         be placed in PPI_ADDR.
;           HW_INIT       initializes the hardware
;           HW_RESET      resets the hardware
;           LEESBYTE      reads a byte from the Atom-in-PC board
;           ZENDBYTE      sends a byte to the Atom-in-PC board
;           SW_VERSION    returns the version to the Atom-in-PC board
;           INFOPAR       is the routine used by the /? parameter
;           error0        holds your copyright line and textual version info
;           SHUTDOWN      unused by ATOMISA but should be used by RemoteAtom
; **************************************************************************
; Author:   Roland Leurs
; Date:     july 10th, 1999
; **************************************************************************

Bovenstaande routines moeten dus in de file opgenomen worden. Indien ze niet gebruikt worden is een RET instructie voldoende. Als voorbeeld zie je hier de SHUTDOWN routine staan die in de normale terminal niet nodig is, maar wel in remote atom gebruikt wordt om de DTR/RTS signalen te doven zodat de server weet dat er geen client connectie meer is.

SHUTDOWN        PROC    NEAR
                RET                     ; DOET NIETS BIJ ISABUS
SHUTDOWN        ENDP

SHUTDOWN        PROC    NEAR
                MOV     DX,PPI_ADDR     ; LAADT ADRES VAN SERIELE POORT
                ADD     DX,4            ; MODEM CONTROL REGISTER
                MOV     AL,00H          ; CLEAR DTR EN RTS
                OUT     DX,AL           ; SCHRIJF NAAR MCR
                RET                     ; GEEN FUNCTIE
SHUTDOWN        ENDP

Je zal nu wel denken: inderdaad, leuk. Maar wat moet ik er nu mee? Enkele meer serieuze toepassingen zijn:
· module voor AIC koppeling met Atom
· module voor koppeling met Electron of BBC computer
· module voor koppeling met welk ander (zelfgemaakt) processorsysteem dan ook
· module voor netwerk koppeling (dus Netbios over TCP/IP i.p.v. seriële kabel)

We kunnen nu dus andere systemen koppelen met een PC, het enige dat we moeten verzorgen is de communicatie tussen het terminal programma en het processor systeem. We zijn hierin helemaal vrij. Guido kan dus via een eenvoudige manier zijn versterker koppelen aan een PC. Alle instellingen kunnen dan op zijn PC scherm weergegeven en/of gewijzigd worden. Hoever gaat je fantasie?

De 8-bits werkgroep van de Big Ben Club kan een seriële koppeling tussen BBC en PC maken en vervolgens PcDFS (van BBC Basic op Atom-in-PC) aanpassen zodat een BBC gebruik maakt van de PC harddisk (en de muis, en de printer, en ... en ... en ...)

Twee mogelijkheden die ik zelf nog wil uitwerken zijn de netwerk koppeling, zodat ik de volgende zomer met de klaptop in de tuin kan zitten en toch gebruik maken van de Atomkaart die op zolder in een PC draait. Daarnaast ga ik de mogelijkheden bekijken om een interface print te maken die de mogelijkheid biedt om de Atom-in-PC kaart, zonder wijziging van de hardware, geschikt maakt voor communicatie via de seriële poort.
Hierbij denk ik aan een ISA-slot waarop alle noodzakelijke signalen gegenereerd worden door een 16F84 PIC. Op deze mini-ISA komen dan de Atom-in-PC kaart en een 8250 te zitten. Op die manier wil ik de koppeling tussen Atom-in-PC en notebook realizeren. Dat scheelt een halve verhuizing als er weer eens een landdag bezocht wordt....

De voornaamste reden van de splitsing van functionaliteit en communicatie in het terminal programma is dus het beschikbaar maken van een terminal programma voor welk (nog te bouwen) processor systeem dan ook. Bij het uitbreiden van de commando-set hoeven niet steeds weer alle varianten aangepast te worden. Updaten is dan een kwestie van opnieuw assembleren met de juiste include-file.
 

Voor de I/O liefhebbers staat hieronder nog even de Remote Atom Server listing:

                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,13
                DB "Receive Data  *   Transmit Data  *   Client connected on COM1",10,10,13
                DB "Press escape to stop server . . . $"

CSEG            ENDS
                END    REMATOM

Deze files komen binnenkort op de AtomWare CD te staan.
Roland Leurs

../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif