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
|