Atom Nieuws jaargang 1999 nummer 2 |
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 commandos 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