Diplomarbeit
Entstehung
Inhalt
Abkürzungen
Einleitung
Recherche
Konzept
Umgebung
Hardware
Software
Funktionsweise
Zusammenfassung
Anhang
Techn. Daten
Platinenlayouts
Schaltplan Hauptplatine
Schaltplan LED
Bestückungsaufdruck
Pinbelegungen
Bauteile
Software-Listings
Literaturverzeichnis
Software-Listings

Hier befindet sich der Teil des Listings, der von mir erstellt wurde. Es handelt sich hierbei um Motorola 6802 Assembler Code. Das Programm wurde mit SLED, einem Freeware-DOS Editor auf einem echten IBM XT Computer erstellt und dann auf diesem Computer Cross-compiliert. Die dabei entstandenen Binaries wurden mit einer Brankamp Library verlinkt und dann auf dem XT mit einem EPROM-Brenner in EPROMS geschossen. Die fertigen Proms wurden dann in das Testgerät gesteckt und die Software dort ausprobiert. Fehlersuche wurde mit einem Hexmonitor durchgeführt, der als Softwarelösung mit der eingebauten kleinen Grafikkarte vorhanden war. Testwerte konnte man sich mit einer LED-Kette anzeigen lassen, die auf die Busplatine gesteckt wurde. Die Hardware für die LED Kette wurde ebenfalls im Rahmen der Diplomarbeit  entwickelt. Die LED-Kette wurde dabei über Portbausteine einfach auf eine bestimmte Adresse gelegt und konnte durch einen Schreibzugriff auf diese Adresse betrieben werden.

**********************************************************************
*  DATUM      !  UHRZEIT    ! NAME
*_____________________________________________________________________
*
*  29.09.89    !  13:05      ! RAM
**********************************************************************
*
*  HAUPTMODULNAME:   MUXTEST FUER NEUE MESSMITTEL-MUX-PLATINE
*
*                    AUTONOM ARBEITENDE MUX-VERWALTUNG.
*
**********************************************************************
*
* DIESES MODUL WIRD ANGESPRUNGEN
*
*      UEBER    JSR MUXINIT:  ZUR INITIALISIERUNG
*      UEBER    JSR MUX   :  FUER DIE HAUPT-MUX-SCHLEIFE
*      INTVE IST DER INTERRUPTVERTEILER UND DARF NUR UEBER EINEN
*      INTERRUPT ANGESPRUNGEN WERDEN (RUECKKEHR MIT RTI)
*
       EXPORT MUXINIT,MUX,INTVE
*
*      ALLE FOLGENDEN EXPORTE NUR DESWEGEN, DAMIT DIE ADRESSEN
*      DER REGISTER IN DER HLD-DATEI EINGETRAGEN WERDEN.
*
       EXPORT KODS,SFTCODE,PLATADR,COUNT,TMP_B,TMP_A,TMP_X,MSAVE1,MSAVE
       EXPORT MON_DA,MESSDTA,SENDDTA,METAB,ANZAHL,MITOME,BARCODE,ZAEHLER
       EXPORT P_ERROR,ERROR,STCKSVE,PARMS,ACIA_OK,SECONDS
*
**********************************************************************
*
*
       LOC    0
*
*
* SPEICHERBEREICH FUER MESSMITTEL-MODUL:
*
*
MSAVE  RMB    2        RETTUNGSREGISTER X
MSAVE1 RMB    2              "
STCKSVE RMB    2        RETTUNGSREGISTER FUER DEN STACK
TMP_X  RMB    2        TEMPORAERE RETTUNGSREGISTER   !!! SCRATCH !!!
TMP_A  RMB    1                    "
TMP_B  RMB    1                    "
COUNT  RMB    2        ZAEHLERREGISTER FUER INTERRUPT: INC ALLE 50 ms.
SECONDS RMB    2        TIMEOUT-DAUER IN SEKUNDEN*20
PLATADR RMB    2        ADRESSE DER AKTUELLEN MPCXXX PLATINE
SFTCODE RMB    1        SOFTWARECODE DER AKTUELLEN PLATINE
KODS   RMB    8        TABELLE DER SOFTWARECODES DER 8 MOEGLICHEN MPCXXX.
*                        ERSTES BYTE FšR PLATINE AUF $7000. $00=NICHT GESTECKT.
MON_DA RMB    1        LED-MONITORPLATINE VORHANDEN:$FF. SONST $00
ZAEHLER RMB    1        ZAEHLER FUER DIGITS BEIM EINLESEN
P_ERROR RMB    1        POSSIBLE-ERROR: WIRD BEI EINEM FEHLER IN ERROR KOPIERT.
ERROR  RMB    1        ENTHAELT FEHLERCODE (NACH EINEM FEHLER), SONST $00.
ACIA_OK RMB    1        $00: ACIA NICHT INITIALISIERT. $FF: ACIA WURDE INIT.
RAMSIZE EQU    40       RAMGROESSE 40 BYTES
MESSDTA RMB    RAMSIZE  SPEICHER FUER MESSMITTELDATEN RESERVIEREN
SENDDTA RMB    RAMSIZE  FUER AUFBEREITETE UND ZU SENDENDE DATEN
PARMS  RMB    20       FUER BELIEBIGE PARAMETERUEBERGABEN AN UNTERPROGRAMME
*
*  KARTENADRESSEN: ADRESS-DIP-SWITCH AUF DER MPCXXX MUSS IN [0..7] SEIN,
*                  DESHALB IST DIP-SWITCH 4 KURZGESCHLOSSEN.
*
MPC262   EQU  $8010  SERIELLE SCHNITTSTELLE ZUR 2090
MPCXXX   EQU  $7000  ERSTE MOEGLICHE ADRESSE FUER INTERFACEPLATINE
MC6840   EQU  $3000  TIMER AUF DER MPC104
MON_LED  EQU  $5000  ADRESSE DES LED-PORTS AUF DER MONITORPLATINE
MON_TST  EQU  $5002  ADRESSE DES TASTER-PORTS DER MONITORPLATINE
*
* KONSTANTEN:
*
* PIA-INITIALISIERUNGSWERTE FUER DATENRICHTUNGS- UND STEUER-REGISTER
* EINGAENGE AUF 0, AUSGAENGE AUF 1!
*
MON_R_A EQU    $FF        RICHTUNG MONITOR-PIA PORT A: LEDS
MON_C_A EQU    $04        STEUERREGISTER: INTERRUPT-EINGAENGE ABGESCHALTET
MON_R_B EQU    $00        RICHTUNG MONITOR-PIA PORT B: TASTER
MON_C_B EQU    MON_C_A
RA2    EQU    %01111110  RICHTUNG PIA2 PORT A: SYLVAC-EPLD, TASTER
CA2    EQU    $04        STEUERREGISTER: INTERRUPT-EINGAENGE ABGESCHALTET
RB2    EQU    %11111111  RICHTUNG PIA2 PORT B: LED-PERIPHERIE
CB2    EQU    CA2
RA1    EQU    %00000000  RICHTUNG PIA1 PORT A: SOFTWARECODE-DIP-SW
CA1    EQU    CA2
RB1    EQU    %11110000  RICHTUNG PIA1 PORT B: OUTPUTS/INPUTS
CB1    EQU    CA2
*
*
       LOC    6
*
*
**********************************************************************
*
*                      MESSMITTELTABELLE.
*      ENTHAELT DIE ADRESSEN DER MESSMITTEL-LESEPROGRAMME.
*
**********************************************************************
*
*                SOFTWARECODE - KODIERSCHALTERSTELLUNG, BEDEUTUNG
METAB  EQU    *
       FDB    MITOME         $01: MITUTOYO (13*4 BIT)
       FDB    BARCODE        $02: DATALOGIC BARCODELESER
       FDB    HELIOS         $03: HELIOS DIGITRIX (17*8 BIT)
ANZAHL EQU    (*-METAB)/2    ANZAHL DER IN DER TABELLE ABGELEGTEN ADRESSEN.
*
*
**********************************************************************
*
*                    INTERRUPTVERTEILERROUTINE
*
**********************************************************************
*
INTVE    EQU  *
         TST  MC6840+1
         BPL  INTVE1
         LDAA #$A7         TIMER STOP
         STAA MC6840
         LDX  COUNT
         INX
         STX  COUNT
         LDAA #$A6         TIMER START
         STAA MC6840
INTVE1   EQU  *
         RTI
*
**********************************************************************
*
*              MUX - INITIALISIERUNGSROUTINEN
*
**********************************************************************
*
*
* LED-PLATINE UND MESSMITTELPLATINEN INITIALISIEREN
*
MUXINIT EQU    *
       SEI              INTERRUPT VERBIETEN
       JSR    RAMLOE   RAMBEREICHE LOESCHEN
       CLR    MON_DA   =0: MONITORPLATINE NICHT GESTECKT.
       LDX    #MON_LED INITIALISIERUNG DER LED-PLATINE
       CLR    1,X      STEUERREGISTER LOESCHEN
       LDAA   1,X      ZUR KONTROLLE LADEN
       CMPA   #$FF
       BEQ    TMINIT   LED-PLATINE NICHT GESTECKT: SOFORT TIMER INIT.
       COM    MON_DA   $FF: MONITORPLATINE IST VORHANDEN.
       CLR    3,X
       LDAA   #MON_R_A DATENRICHTUNGSREGISTER...
       STAA   MON_LED  UND CONTROL-REGISTER PROGRAMMIEREN.
       LDAA   #MON_C_A
       STAA   1,X
       LDAA   #MON_R_B
       STAA   MON_TST
       LDAA   #MON_C_B
       STAA   3,X
       CLR    MON_LED  ALLE LEDS AUS
*
*  TIMERINITIALISIERUNG
*
TMINIT EQU    *
       LDAA   #$C2
       STAA   MC6840
       LDAA   #$81
       STAA   MC6840+1
       LDAA   #$A6
       STAA   MC6840
       LDX    #0
       STX    MC6840+6
       LDX    #$3B
       STX    MC6840+4
       LDX    #$0A
       STX    MC6840+2
       LDAA   #$A7
       STAA   MC6840
*
* NUN DIE MPCXXX-PLATINEN
*
       LDX    #0
       STX    PLATADR  ADRESSE AKTUELLE PLATINE E.M.A.T. INITIALISIEREN
       STX    KODS     KODIERSCHALTERTABELLE LOESCHEN
       STX    KODS+2
       STX    KODS+4
       STX    KODS+6
       CLR    SFTCODE
       LDX    #KODS
       STX    MSAVE1   ADRESSE TABELLE FUER DIE KODIERSCHALTERWERTE MERKEN
       LDX    #MPCXXX
       STX    MSAVE    ADRESSE DER ERSTEN MPCXXX-PLATINE MERKEN
       LDAA   #8       8 ADRESSEN MUESSEN UNTERSUCHT WERDEN
INITLP EQU    *
       LDX    MSAVE    ADRESSE DER AKTUELLEN PLATINE RESTAURIEREN
       CLR    1,X      ERSTES STEUERREGISTER LOESCHEN
       LDAB   1,X      UND ZUR KONTROLLE LADEN
       CMPB   #$FF     =$FF: KARTE NICHT GESTECKT
       BEQ    INITLP1
       CLR    3,X      ALLE STEUERREGISTER DER PIAS LOESCHEN,
       CLR    5,X      (ADRESSIERUNG DER DATENRICHTUNGSREGISTER)
       CLR    7,X
       LDAB   #RA2     RICHTUNG PORT A PIA2
       STAB   0,X
       LDAB   #CA2     CONTROL  PORT A PIA2
       STAB   1,X
       LDAB   #RB2     RICHTUNG PORT B PIA2
       STAB   2,X
       LDAB   #CB2     CONTROL  PORT B PIA2
       STAB   3,X
       LDAB   #RA1     RICHTUNG PORT A PIA1
       STAB   4,X
       LDAB   #CA1     CONTROL  PORT A PIA1
       STAB   5,X
       LDAB   #RB1     RICHTUNG PORT B PIA1
       STAB   6,X
       LDAB   #CB1     CONTROL  PORT B PIA1
       STAB   7,X
       CLR    9,X      PROGRAMMED RESET FUER DIE ACIA
       CLR    ACIA_OK  $00 ZEIGT AN: ACIA MUSS NOCH PROGRAMMIERT WERDEN!
       CLR    2,X      LED UND OPTOKOPPLER AUSSCHALTEN
       LDAA   #$02     SYLVAC-INPUTS UND SCHIEBEREGISTER-EINGANG SPERREN
       STAA   0,X
       CLR    6,X      OUTPUTS AUSSCHALTEN
       LDAB   4,X      SOFTCODE HOLEN
       CMPB   #ANZAHL  SOFTCODE IN DER TABELLE DEFINIERT?
       BLS    SC_ST    JA: SOFTCODE SPEICHERN
       CLRB             NEIN: SOFTCODE=0, DA EINGESTELLTER CODE NICHT DEF.
SC_ST  EQU    *
       LDX    MSAVE1
       STAB   0,X      UND IN DER TABELLE ABLEGEN.
       BEQ    INITLP1  =0? PLATINE DEAKTIVIERT. SFTCODE BLEIBT UNBEEINFLUSST.
       LDAB   #$FF     SFTCODE WIRD HIER VORLAEUFIG MISSBRAUCHT:
       STAB   SFTCODE  $FF ZEIGT AN: MINDESTENS EINE KORREKT INITIALISIERTE
*                        PLATINE GEFUNDEN.
INITLP1 DECA             ALLE 8 ADRESSEN UNTERSUCHT? PIAINIT FERTIG.
       BEQ    PIAEND
       JSR    NEXT
       JMP    INITLP
*
* NUN WIRD AUF DEN TASTENDRUCK EINES PLATINE-SELECT-TASTERS GEWARTET
* NUR PLATINEN MIT EINEM SOFTCODE <>0 WERDEN ABGEFRAGT.
*
PIAEND EQU    *
       LDAA   SFTCODE  SFTCODE=0? KEINE AKTIVE PLATINE GEFUNDEN.
       BEQ    MIST
       LDX    #MPCXXX  STARTADRESSE DER PLATINEN HOLEN
       STX    MSAVE
       LDX    #KODS    ADRESSE DER KODIERSCHALTERTABELLE
       STX    MSAVE1
       LDAA   #8
SRCHLP EQU    *
       LDX    MSAVE1   AKTUELLE ADRESSE IN DER KODIERSCHALTERTABELLE
       LDAB   0,X      ABGELEGTEN SOFTCODE HOLEN
       BEQ    N_PLAT   =0? NAECHSTE PLATINE
       LDX    MSAVE    AKTUELLE PLATINENADRESSE
       LDAB   0,X      TASTER AUSLESEN
       ANDB   #$80
       BEQ    FOUND    GEDRUECKT? PLATINE GEFUNDEN.
N_PLAT EQU    *
       JSR    NEXT     POINTER WEITERSETZEN
       DECA
       BNE    SRCHLP   NOCH NICHT ALLE 8 PLATINEN DURCHSUCHT? WEITERSUCHEN.
       JMP    PIAEND   POINTER NEUSETZEN UND WEITERSUCHEN.
*
FOUND  EQU    *
       LDX    MSAVE
       STX    PLATADR  PLATINENADRESSE MERKEN
       LDAB   #$01
       STAB   2,X      PLATINE-AKTIV-LED EINSCHALTEN, OPTOKOPPLER AUSSCHALTEN
       LDX    MSAVE1
       LDAB   0,X
       STAB   SFTCODE  SOFTWARECODE MERKEN
       RTS              ZUM 10802-MANAGER
*
NEXT   EQU    *
       LDX    MSAVE1
       INX              ZEIGER AUF NAECHSTEN SOFTCODE
       STX    MSAVE1
       LDX    #MSAVE
       LDAB   1,X
       ADDB   #$10     ZEIGER AUF NAECHSTE PLATINENADRESSE
       STAB   1,X      UEBERLAUF KANN NICHT AUFTRETEN, DA DIE MAXIMALE
       LDAB   0,X      PLATINENADRESSE =$9FFF IST, (DARUEBER LIEGEN
       ADCB   #0       DIE EPROMS)
       STAB   0,X
       RTS
*
MIST   EQU    *
       LDAB   MON_DA
       BEQ    MIST2
       LDAB   #%10101010     ERROR ANZEIGEN
       STAB   MON_LED
MIST2  EQU    *
       RTS
*
**********************************************************************
*
*                  MESSMITTEL-LESE-ROUTINEN
*
**********************************************************************
*
*
RAMLOE EQU    *    LOESCHT SENDE UND MESSMITTEL-RAM
       LDAA   #RAMSIZE GROESSE DES ZU LOESCHENDEN BEREICHES
       LDX    #MESSDTA ADRESSE DES ZU LOESCHENDEN BEREICHES
RAMLOE1 EQU    *
       CLR    0,X
       INX
       DECA
       BNE    RAMLOE1
       LDAA   #RAMSIZE
       LDX    #SENDDTA
RAMLOE2 EQU    *
       CLR    0,X
       INX
       DECA
       BNE    RAMLOE2
       RTS
*
*      TIMER-SERVICE-ROUTINEN
*
TIM_NEU EQU    *        TIMER STARTEN MIT ZAEHLER LOESCHEN
       STX    TMP_X    X-REGISTER RETTEN
       LDX    #0       ZAEHLER LOESCHEN
       STX    COUNT
       LDX    TMP_X
TIMSTRT EQU    *        LABEL FUER ERNEUTEN START DES TIMERS
       STX    TMP_X
       LDX    #50000   ALLE 50000 MILLISEKUNDEN EIN INTERRUPT
       STX    MC6840+6
       PSHA
       LDAA   #$A6
       STAA   MC6840   TIMER STARTEN
       PULA
       LDX    TMP_X    X-REGISTER RESTAURIEREN
       CLI              INTERRUPT FREIGEBEN
       RTS
*
TIMSTOP EQU    *
       SEI            INTERRUPT VERBIETEN
       PSHA
       LDAA   #$A7
       STAA   MC6840 TIMER STOPPEN.
       PULA
       RTS
*
*
* TIMEOUTROUTINE. AUFRUF MIT JSR TIMEOUT. BEENDET DIE LAUFENDE ROUTINE, WENN
* DER WERT IN COUNT GROESSER IST ALS DER WERT IN SECONDS UND SPRINGT ZU ERRBLNK.
*
*    ACHTUNG: DIESE ROUTINE ZERSTOERT DEN INHALT DES X-REGISTERS!
*                    (IST DANN ABER SCHNELLER)
*
TIMEOUT EQU    *
       LDX    COUNT
       CPX    SECONDS  IN SECONDS STEHT DIE TIMEOUT-DAUER IN SEKUNDEN*20
       BEQ    TIMOUT1
       RTS
TIMOUT1 EQU    *
       JSR    TIMSTOP  TIMER STOPPEN
       LDX    PLATADR
       LDAA   #$01
       STAA   2,X      OPTO OUT, LED EIN (REQ_NICHT ZURUECKNEHMEN)
       LDAA   10,X     COMMAND-REGISTER ACIA LADEN
       ANDA   #$F3
       STAA   10,X     RTS AUF HIGH SETZEN: ANFORDERUNG ZURUECKNEHMEN.
*
*    ERRBLINK: ZEIGT EINEN FEHLER AN UND BEENDET DAS LAUFENDE LESEPROGRAMM.
*
* IN P_ERROR WIRD EIN FEHLERCODE UEBERGEBEN, DER IN DER VARIABLE ERROR ABGELEGT
* WIRD UND KURZ AUF DER MONITORPLATINE ANGEZEIGT WIRD, WENN DIESE GESTECKT IST.
* ANSCHLIESSEND WIRD DER STACK RESTAURIERT (WIE VOR DEM AUFRUF DER MUXROUTINE)
* UND ZULETZT WIRD ZUM LABEL MUX GESPRUNGEN.
*
ERRBLNK EQU    *          FEHLERCODE STEHT IN P_ERROR.
       JSR    TIMSTOP    TIMER STOPPEN
       LDAA   P_ERROR    FEHLERCODE HOLEN
       STAA   ERROR      FEHLERBEDINGUNG MERKEN
       TST    MON_DA     MONITORPLATINE VORHANDEN?
       BEQ    ERR_END    NEIN: ZUM HAUPTPROGRAMM.
       LDAA   MON_LED
       PSHA               MOMENTANEN LED-ZUSTAND MERKEN
       LDAB   #8         8 MAL BLINKEN
ERRLOOP EQU    *
       LDAA   ERROR
       STAA   MON_LED    FEHLERCODE ANZEIGEN
       LDX    #$4000
ERRLP1 EQU    *
       DEX                KURZE PAUSE
       BNE    ERRLP1
       CLR    MON_LED    LEDS AUS
       LDX    #$6000
ERRLP2 EQU    *
       DEX                KURZE PAUSE
       BNE    ERRLP2
       DECB
       BNE    ERRLOOP
       PULA               ALTEN LED-ZUSTAND RESTAURIEREN
       STAA   MON_LED
ERR_END EQU    *
       LDS    STCKSVE    STACK RESTAURIEREN
       JMP MUX            LESEPROGRAMM BEENDEN.
*
* ALLE LEDS BLINKEN KURZ UND ZEIGEN KORREKTE UEBERTRAGUNG AN.
*              AUFRUF MIT JSR UEB_OK.
*
UEB_OK EQU    *
       CLR    ERROR      KEIN ERROR.
       TST    MON_DA
       BEQ    UEB_END
       LDAA   MON_LED
       PSHA               MOMENTANEN LED-ZUSTAND MERKEN
       LDAA   #$FF
       STAA   MON_LED
       LDX    #$6000
UEBLOOP EQU    *
       DEX
       BNE    UEBLOOP
       PULA
       STAA   MON_LED
UEB_END EQU    *
       RTS                ENDE VON UEB_OK
*
*          ACIA - INITIALISIERUNG AUF DEM INTERFACE.
*
*  IM X-REGISTER STEHT EINE ADRESSE AUF EINEN 2-BYTES PARAMETERBLOCK, DESSEN
*  WERTE ZUR INITIALISIERUNG DER ACIA VERWENDET WERDEN.
*  IN BYTE 0 STEHT DAS COMMAND REGISTER, IN BYTE 1 DAS CONTROL REGISTER.
*
*  ZUR BERECHNUNG DER REGISTERWERTE MUESSEN DIE ERFORDERLICHEN HIER ANGEGEBENEN
*  WERTE FUER JEDES REGISTER VERODERT (ADDIERT) WERDEN.
*
*  BEISPIEL: 1 STOPP-BIT, 7 DATENBITS, EXT.RECEIV.CLK, 9600 BAUD:
*                $80    +     $20   +      $10     +    $0E =  $BE.
*
**********************************************************
*      AUFBAU DES CONTROL-REGISTERS:
*
*      BAUDRATE $00=16*EXTERNAL CLOCK      ALLE WERTE IN BAUD (BIT/SEC)
*                $01=50,   $02=75,   $03=109.92, $04=134.58, $05=150
*                $06=300,  $07=600,  $08=1200,   $09=1800,   $0A=2400
*                $0B=3600, $0C=4800, $0D=7200,   $0E=9600,   $0F=19200
*
*
*      WORTLAENGE IN BITS
*                $00=8 BITS, $20=7 BITS,  $40=6 BITS, $60=5 BITS
*
*      ANZAHL STOPP-BITS
*                $00=1 STOPP-BIT,  $80=1 STOPP-BIT
*                BEI WORTLAENGE=5 BITS UND NO PARITY: $80= 1.5 STOPP-BITS
*                BEI WORTLAENGE=8 BITS UND PARITY  : $80= 1   STOPP-BIT
*
*      RECEIVER CLOCK SOURCE
*                $00: EXTERNAL RECEIVER CLOCK
*                $10: BAUDRATE (IMMER AUF $01 SETZEN, DA AUF DER INTER-
*                                FACEPLATINE KEINE CLOCKSOURCE VORHANDEN)
*
**********************************************************
*        AUFBAU DES COMMAND-REGISTERS:
*
*      PARITY MODE CONTROL
*                $00: UNGERADE PARITAET BEI SENDEN/EMPFANGEN
*                $40: GERADE PARITAET BEI SENDEN/EMPFANGEN
*                $80: SENDEN: PARITY BIT IMMER=1, EMPFANGEN: NO CHECK
*                $C0: SENDEN: PARITY BIT IMMER=0, EMPFANGEN: NO CHECK
*
*      PARITY ENABLE
*                $00: PARITY MODE ABGESCHALTET, KEINE UEBERPRUEFUNG.
*                $20: PARITY MODE EINGESCHALTET
*
*
*      RECEIVER ECHO MODE
*                $00: RECEIVER NORMAL MODE
*                $10: RECEIVER ECHO MODE
*
*      TRANSMITTER INTERRUPT CONTROL
*                $00: RTS HIGH, SENDE-INTERRUPT ABGESCHALTET
*                $04: RTS LOW, SENDE-INTERRUPT EINGESCHALTET
*                $08: RTS LOW, SENDE-INTERRUPT ABGESCHALTET
*                $0C: RTS LOW, SENDE-INTERRUPT ABGESCHALTET,
*                    SENDEABBRUCH AUF TXD.
*
*      INTERRUPT REQUEST ENABLE
*                $00: IRQ EINGESCHALTET,   $02: IRQ ABGESCHALTET
*
*      DATA TERMINAL READY
*              $00: DATA TERMINAL NOT READY,  $01: DATA TERMINAL READY
*
ACIAINI EQU    *
       SEI            INTERRUPT VERBIETEN
       LDX    #PARMS ADRESSE DES PARAMETERBLOCKS
       LDAA   0,X    COMMAND REGISTER
       LDAB   1,X    CONTROL REGISTER
       LDX    PLATADR
       CLR    9,X    PROGRAMMED RESET
       STAA   10,X   COMMAND-REGISTER PROGRAMMIEREN
       STAB   11,X   CONTROL-REGISTER PROGRAMMIEREN
       LDAA   #$FF
       STAA   ACIA_OK MARKIEREN: ACIA WURDE PROGRAMMIERT.
       CLI            INTERRUPT FREIGEBEN.
       RTS
*
*  ENDE DER ACIA-INITIALISIERUNG
*
*
*  RS232-SERVICEROUTINEN
*
*  READONE LIEST EIN ZEICHEN VON DER ACIA UND SCHREIBT ES AN DIE ADRESSE, DIE IM
*  X-REGISTER UEBERGEBEN WURDE. DER TIMER MUSS LAUFEN, DAMIT EIN TIMEOUT ERKANNT
*  WIRD. DAS GELESENE BYTE WIRD AUCH IM A-REGISTER ZURUECKGEGEBEN.
*  IN P_ERROR MUSS DER ERRORCODE FUER TIMEOUT STEHEN.
*
READONE EQU    *
       STX    TMP_X    ADRESSE, WO DAS BYTE HINKOMMEN SOLL, MERKEN
       PSHB
       LDAB   P_ERROR  FEHLERCODE HOLEN
       PSHB   ...UND RETTEN.
READPOL EQU    *
       JSR    TIMEOUT
       LDX    PLATADR
       LDAA   9,X      STATUS LESEN
       BITA   #$08     RECEIVER DATA REGISTER FULL?
       BEQ    READPOL  NEIN: WEITERPOLLEN
*
       LDAB   #2
       STAB   P_ERROR  FEHLERCODE 2: OVERRUN-ERROR
       BITA   #$04
       BNE    READERR
*
       INC    P_ERROR  FEHLERCODE 3: FRAMING-ERROR
       BITA   #$02
       BNE    READERR
*
       INC    P_ERROR  FEHLERCODE 4: PARITY-ERROR
       BITA   #$01
       BNE    READERR
*
* NACH DIESEM SPIESSRUTENLAUF IST ALLES OK.
*
       LDAA   8,X      RECEIVER-DATEN LADEN
       SEI
       LDX    #0
       STX    COUNT    WARTEZEIT NEU SETZEN.
       CLI
       LDX    TMP_X
       STAA   0,X      UND SPEICHERN.
       PULB             ERRORCODE RESTAURIEREN
       STAB   P_ERROR
       PULB             B-REGISTER RESTAURIEREN, RECEIVED DATA IN REGISTER A.
       RTS
*
READERR EQU    *
       LDX    PLATADR
       LDAA   10,X     COMMAND-REGISTER ACIA LADEN
       ANDA   #$F3
       STAA   10,X     RTS AUF HIGH SETZEN: ANFORDERUNG ZURUECKNEHMEN.
       JMP    ERRBLNK
*
*
************************************************
*
*  HELIOS DIGITRIX (17*8 BIT)  SOFTWARECODE #$03
*
*      FEHLERCODES:   1: TIMEOUT
*
************************************************
*
HELIOS EQU    *
       JSR    RAMLOE   SENDE- UND MESSMITTEL-RAM LOESCHEN.
       LDX    #40
       STX    SECONDS  2 SEKUNDEN TIMEOUT.
       LDAA   #1
       STAA   P_ERROR  FALLS FEHLER BEIM ERSTEN DIGIT: CODE 1.
       LDAB   #17      17 DIGITS WERDEN GELESEN
       STAB   ZAEHLER
       LDX    PLATADR
       LDAA   #$03
       STAA   2,X      LED UND OPTOKOPPLER EINSCHALTEN (REQUEST AUF V+)
       LDX    #$8000
HELWAIT EQU    *
       DEX              KURZE WARTESCHLEIFE FUER REQUEST-SIGNAL
       BNE    HELWAIT
       LDX    PLATADR
       LDAA   #$01
       STAA   2,X      LED EIN, OPTOKOPPLER AUS (REQUEST AUF LOW, START!)
       JSR    TIM_NEU  TIMER STARTEN
       LDX    #MESSDTA
       STX    MSAVE1   AKTUELLE ADRESSE IM MESSMITTELRAM MERKEN
       LDAB   #8       8 BIT PRO DIGIT
       JMP    HELTKT1  DIREKT AUF HIGH-PEGEL TESTEN
*
HELDAT1 EQU    *
       LDAB   #8       8 BIT PRO DIGIT
ASCDAT1 EQU    *        IST DER TAKT LOW?
       JSR    TIMEOUT
       LDX    PLATADR
       LDAA   6,X
       ANDA   #$02   TAKT MASKIEREN
       BNE    ASCDAT1
HELTKT1 EQU    *        AUF HIGH-PEGEL TESTEN
       JSR    TIMEOUT
       LDX    PLATADR
       LDAA   6,X
       ANDA   #$02   TAKT ERNEUT LADEN
       BEQ    HELTKT1
*
ASCDATA EQU    *
       LDX    PLATADR
       LDAA   6,X    DATENBIT LADEN...
       SEC
       ANDA   #$01   ...UND MASKIEREN
       BEQ    ASCDAT2 DATENBIT=1? DANN CARRY LOESCHEN (INVERTIERUNG!!)
       CLC
ASCDAT2 EQU    *
       LDX    MSAVE1
       ROL    0,X    WERT UEBER CARRY IN SPEICHER SCHIEBEN.
       DECB
       BNE    ASCDAT1
       INX            NAECHSTES DIGIT.
       STX    MSAVE1
       INC    P_ERROR  BEIM DRITTEN DIGIT P_ERROR=3, 4.DIGIT, ERR=4...
       DEC    ZAEHLER  SCHON ALLE GELESEN?
       BNE    HELDAT1
*
*  EINLESEN DER DATEN BEENDET
*  AUSWERTUNG DER EMPFANGENEN DATEN
*
       JSR    TIMSTOP    TIMER STOPPEN
       LDX    PLATADR
       LDAA   #$01
       STAA   2,X        OPTO OUT, LED EIN (REQUEST ZURUECKNEHMEN)
       LDX    #SENDDTA
       LDAA   #'0
       STAA   0,X    ERSTES BYTE "0"
       INX
       STAA   0,X    ZWEITES BYTE AUCH "0"
       INX
       LDAA   #'A
       STAA   0,X    DRITTES BYTE "A"
       INX
       LDAA   MESSDTA+6  VORZEICHENSTELLE LADEN
       CMPA   #'-
       BEQ    HELDAT3
       LDAA   #'+
HELDAT3 EQU    *
       STAA   0,X    VIERTES BYTE "+/-"
       INX
       LDAA   #$20
       STAA   0,X    ERSTES DATENBYTE SPACE.
       INX
       STX    MSAVE  ANFANGSADRESSE MESSMITTELDATEN SENDEBLOCK
       LDAB   #7     7 DATENBYTES DES MESSMITTELS INCL. DEZIMALPUNKT
       LDX    #MESSDTA+7 ANFAGSADRESSE MESSDATEN
       STX    MSAVE1
*
*  UMSHIFTEN DER DATEN
*
HELDAT4 EQU    *
       LDX    MSAVE1 AKTUELLE ADRESSE MESSMITTELDATEN MESSMITTELBLOCK
       LDAA   0,X    BYTE HOLEN
       INX
       STX    MSAVE1 NAECHSTES BYTE AUS DEM MESSMITTELBLOCK
       LDX    MSAVE
       STAA   0,X    BYTE SCHREIBEN
       INX
       STX    MSAVE  NAECHSTES BYTE IM SENDEDATENBLOCK
       DECB           SCHON ALLE 7 BYTES KOPIERT?
       BNE    HELDAT4 NEIN: WEITERKOPIEREN!
*
       LDAA   #$0D
       STAA   0,X    SENDEDATENBLOCK ABSCHLIESSEN
       JSR    UEB_OK KURZES BLINKEN ZEIGT KORREKTE UEBERTRAGUNG AN.
       RTS            ENDE DER HELIOS-ROUTINE
*
************************************************
*
*  DATALOGIC-BARCODE SOFTWARECODE #$02
*
*      FEHLERCODES:   1: TIMEOUT
*                      2: OVERRUN (RECEIVER-REGISTER NICHT GELESEN)
*                      3: FRAMING
*                      4: PARITY
*                      5: MEHR ALS 22 ZEICHEN EMPFANGEN (INCL. CR,LF)
*
************************************************
*
*
BARCODE EQU    *
       JSR    RAMLOE   SENDE- UND MESSMITTEL-RAM LOESCHEN.
       TST    ACIA_OK  WURDE DIE ACIA SCHON PRGRAMMIERT?
       BNE    BARCOD1  JA: DATEN LESEN!
       LDX    #PARMS   ADRESSE DES PARAMETERBLOCKS
       LDAA   #$63     EVEN PARITY/ PAR. ENABLD./RECEIV.NORM.MODE/RTS HIGH/
       STAA   0,X      TRANSM.INTERR.DISABLD./IRQ DISABLD./DATA TERMINAL READY
       LDAA   #$BE     1 STOP/7 DATA/EXT.RECEIV.CLK/9600 BAUD
       STAA   1,X
       JSR    ACIAINI  ACIA PROGRAMMIEREN.
BARCOD1 EQU    *
       LDX    #40
       STX    SECONDS  NACH 2 SEKUNDEN TIMEOUT.
       LDAA   #1
       STAA   P_ERROR  FEHLERCODE 1 FUER TIMEOUT.
       LDX    PLATADR
       LDAA   10,X     COMMAND-REGISTER LADEN
       ORAA   #$08
       STAA   10,X     RTS AUF LOW SETZEN (DATEN-ANFORDERUNG)
       JSR    TIM_NEU  TIMER STARTEN
       LDX    #MESSDTA
       LDAB   #22      MAXIMAL 22 ZEICHEN WERDEN GELESEN, DANN ABBRUCH.
       STAB   ZAEHLER
BARREAD EQU    *
       JSR    READONE  EIN ZEICHEN LESEN
       CMPA   #$0A     LINE FEED EMPFANGEN?
       BEQ    BARRDY   ENDE DER UEBERTRAGUNG
       INX              NAECHSTES BYTE
       DEC    ZAEHLER  SCHON 22 ZEICHEN GELESEN?
       BNE    BARREAD
*
*  ABBRUCH NACH 22 GELESENEN ZEICHEN.
*  POINTER STEHT AUF DEM 23. ZEICHEN UND WIRD AUF DAS 20. ZEICHEN VERBOGEN.
*
       DEX
       DEX
       DEX              AUSRUFEZEICHEN ALS 20. ZEICHEN EINGEFUEGT.
       LDAA   #'!      KENNUNG, DASS DATEN ABGESCHNITTEN WURDEN
       STAA   0,X
       INX
       LDAA   #$0D     MIT CR ALS 21. BYTE ABSCHLIESSEN
       STAA   0,X
       INX              ZEIGER AUF DAS 22. BYTE
       LDAA   #1
       STAA   P_ERROR  FEHLERCODE FUER TIMEOUT VORBEREITEN
BARMAX EQU    *
       JSR    READONE  SOLANGE LESEN, BIS DASS LF KOMMT.
       CMPA   #$0A     READONE SPEICHERT ALLE BYTES IMMER AN DIE 22. STELLE.
       BNE    BARMAX   WENN ALLE DATEN GELESEN WURDEN, STEHT EIN LF IN BYTE 22.
       LDAA   #5
       STAA   ERROR    ERRCODE 5: MEHR ALS 22 ZEICHEN EMPFANGEN. (INCL. CR,LF)
*
BARRDY EQU    *
       LDX    PLATADR
       LDAA   10,X     COMMAND-REGISTER ACIA LADEN
       ANDA   #$F3
       STAA   10,X     RTS AUF HIGH SETZEN: ANFORDERUNG ZURUECKNEHMEN.
       LDX    #SENDDTA
       LDAA   #'A      KENNUNG BARCODE
       STAA   0,X      IM SENDEDATENBLOCK ABLEGEN
       INX
       STX    MSAVE    SENDEBLOCK-ADRESSE MERKEN
       LDX    #MESSDTA
       STX    MSAVE1   NAECHSTES BYTE
BARCOPY EQU    *
       LDX    MSAVE1   AKTUELLE ADRESSE MESSDATENBLOCK
       LDAA   0,X      BYTE HOLEN
       INX
       STX    MSAVE1   NAECHSTES BYTE
       LDX    MSAVE
       CMPA   #$0D     CR GEFUNDEN?
       BEQ    BCOPEND  KOPIEREN EINSTELLEN.
       STAA   0,X      BYTE KOPIEREN
       INX
       STX    MSAVE    NAECHSTES BYTE
       JMP    BARCOPY
*
BCOPEND EQU    *
       LDAA   #$0D
       STAA   0,X    SENDEDATENBLOCK MIT LF ABSCHLIESSEN.
       JSR    UEB_OK ERFOLG ANZEIGEN.
       RTS
*
************************************************
*
* MITUTOYO-MESSMITTEL (13*4 BIT)   SOFTWARECODE #$01
*
*  FEHLERCODES: 1: ERSTER TAKT NICHT GEKOMMEN
*              2: TAKT BEIM ERSTEN DIGIT NICHT GEKOMMEN
*              3: TAKT BEIM ZWEITEN DIGIT NICHT GEKOMMEN
*                            ... USW. BIS 14.
*
************************************************
*
MITOME EQU    *
       JSR    RAMLOE   SENDE- UND MESSMITTEL-RAM LOESCHEN.
       LDX    PLATADR
       LDAA   #$03
       STAA   2,X      LED UND OPTOKOPPLER EINSCHALTEN (REQUEST_NICHT AUF LOW)
       LDX    #40
       STX    SECONDS  ZWEI SEKUNDEN TIMEOUT.
       JSR    TIM_NEU  TIMER STARTEN
*
*  LESEN DER MITUTOYO-DATEN
*
MITDAT EQU    *
       LDAA   #1
       STAA   P_ERROR  FALLS FEHLER BEIM ERSTEN DIGIT: CODE 1.
       LDX    #MESSDTA
       STX    MSAVE1   AKTUELLE ADRESSE IM MESSMITTELRAM MERKEN
       LDAB   #13      13 DIGITS WERDEN GELESEN
       STAB   ZAEHLER
*
MITDAT1 EQU    *
       LDAB   #4       4 BIT PRO DIGIT
BCDDAT1 EQU    *        AUF STEIGENDE FLANKE AM TAKT WARTEN
       JSR    TIMEOUT
       LDX    PLATADR
       LDAA   6,X
       ANDA   #$02   TAKT MASKIEREN
       BEQ    BCDDAT1
MITTKT1 EQU    *      AUF FALLENDE FLANKE WARTEN
       JSR    TIMEOUT
       LDX    PLATADR
       LDAA   6,X
       ANDA   #$02   TAKT ERNEUT LADEN
       BNE    MITTKT1
*
BCDDATA EQU    *
       LDX    PLATADR
       LDAA   6,X    DATENBIT LADEN...
       CLC
       ANDA   #$01   ...UND MASKIEREN
       BEQ    BCDDAT2 DATENBIT=1? DANN CARRY SETZEN!
       SEC
BCDDAT2 EQU    *
       LDX    MSAVE1
       ROR    0,X    WERT UEBER CARRY IN SPEICHER SCHIEBEN.
       DECB
       BNE    BCDDAT1
       INX            NAECHSTES DIGIT.
       STX    MSAVE1
       INC    P_ERROR  BEIM DRITTEN DIGIT P_ERROR=3, 4.DIGIT, ERR=4...
       DEC    ZAEHLER  SCHON ALLE GELESEN?
       BNE    MITDAT1
*
*  EINLESEN DER DATEN BEENDET.
*
       JSR    TIMSTOP    TIMER STOPPEN
       LDX    PLATADR
       LDAA   #$01
       STAA   2,X        OPTO OUT, LED EIN (REQ_NICHT ZURUECKNEHMEN)
       LDX    #MESSDTA+5 ANFANG MESSMITTELDATEN
       STX    MSAVE1     MERKEN
       LDAB   #7         6 DIGITS + DEZIMALPUNKT NORMIEREN.
*
*  AUSWERTUNG DER EMPFANGENEN WERTE
*
MITDAT2 EQU    *
       LSR    0,X    WERTE NORMIEREN
       LSR    0,X
       LSR    0,X
       LSR    0,X
       INX
       DECB           SCHON ALLE 7 BYTES FERTIG?
       BNE    MITDAT2
*
*  SENDEDATEN VORBEREITEN
*
       LDX    #SENDDTA
       LDAA   #'0
       STAA   0,X    ERSTES BYTE "0"
       INX
       STAA   0,X    ZWEITES BYTE AUCH "0"
       INX
       LDAA   #'A
       STAA   0,X    DRITTES BYTE "A"
       INX
       LDAA   MESSDTA+4  VORZEICHENSTELLE LADEN
       BEQ    MITDAT3
       LDAA   #'-
       JMP    MITDAT4
MITDAT3 EQU    *
       LDAA   #'+
MITDAT4 EQU    *
       STAA   0,X    VIERTES BYTE "+/-"
       INX
       LDAA   #$20
       STAA   0,X    ERSTES DATENBYTE SPACE.
       INX
       STX    MSAVE  ANFANGSADRESSE MESSMITTELDATEN SENDEBLOCK
       LDAB   #6     6 DATENBYTES DES MESSMITTELS...
MITDAT5 EQU    *      ...IN DEN SENDEBLOCK KOPIEREN.
       LDX    MSAVE1 ANFANGSADRESSE MESSMITTELDATEN MESSMITTELBLOCK
       LDAA   0,X    BYTE HOLEN
       ADDA   #$30   IN ASCII WANDELN...
       INX
       STX    MSAVE1 NAECHSTES BYTE AUS DEM MESSMITTELBLOCK
       LDX    MSAVE
       STAA   0,X    BYTE SCHREIBEN
       INX
       STX    MSAVE  NAECHSTES BYTE IM SENDEDATENBLOCK
       DECB           SCHON ALLE 6 BYTES KOPIERT?
       BNE    MITDAT5 NEIN: WEITERKOPIEREN!
       DEX            ZEIGER AUF LETZTES DATENBYTE
       LDAB   MESSDTA+11   ANZAHL KOMMASTELLEN HOLEN
       BEQ    MITDAT7 =0? RECHTSSCHIEBEN UEBERFLUESSIG
MITDAT6 EQU    *
       LDAA   0,X
       STAA   1,X
       DEX
       DECB
       BNE    MITDAT6
MITDAT7 EQU    *
       LDAA   #'.
       STAA   1,X    DEZIMALPUNKT ABLEGEN.
       LDAA   #$0D
       STAA   SENDDTA+12   SENDEDATENBLOCK ABSCHLIESSEN
       JSR    UEB_OK       KURZES BLINKEN ZEIGT KORREKTE UEBERTRAGUNG AN.
       RTS                  ENDE DER MITUTOYO-ROUTINE
*
MEEND  EQU    *
       RTS
*
**********************************************************************
*
*                  MUX-HAUPTVERWALTUNG
*
**********************************************************************
*
*
MUX    EQU    *
       STS    STCKSVE  STACKPOINTER RETTEN (FUER FEHLERFALL)
       LDAA   MON_TST  TASTER AUSLESEN ALS MESSANFORDERUNG (SPAETER FUSSTASTER)
       COMA             INVERTIEREN: TASTER GEDRUECKT, A<>0.
       BEQ    SEL_TST  KEIN TASTER GEDRUECKT? SELECT-TASTER ABFRAGEN.
       JMP    ANFORD   MESSMITTEL SOLL GELESEN WERDEN.
*
*  TEST, OB EIN PLATINE-SELECT-TASTER GEDRšCKT WURDE...
*
SEL_TST EQU    *
       LDX    #MPCXXX  STARTADRESSE DER PLATINEN HOLEN
       STX    MSAVE
       LDX    #KODS    ADRESSE DER KODIERSCHALTERTABELLE
       STX    MSAVE1
       LDAA   #8
SEL_LP EQU    *
       LDX    MSAVE1   AKTUELLE ADRESSE IN DER KODIERSCHALTERTABELLE
       LDAB   0,X      ABGELEGTEN SOFTCODE HOLEN
       BEQ    SEL_LP1  =0? NAECHSTE PLATINE
       LDX    MSAVE    AKTUELLE PLATINENADRESSE
       LDAB   0,X      TASTER AUSLESEN
       ANDB   #$80
       BEQ    SELECT   GEDRUECKT? NEUE PLATINE MUSS SELEKTIERT WERDEN.
SEL_LP1 EQU    *
       JSR    NEXT     POINTER WEITERSETZEN
       DECA
       BNE    SEL_LP   NOCH NICHT ALLE 8 PLATINEN DURCHSUCHT? WEITERSUCHEN.
       RTS    ZUM MX10802-MANAGER
*
SELECT EQU    *
       LDX    PLATADR
       CLR    2,X      LED AUF DER ALTEN PLATINE AUSSCHALTEN
       CLR    6,X      OUTPUTS AUSSCHALTEN
       LDX    MSAVE
       STX    PLATADR  NEUE PLATINENADRESSE MERKEN
       LDAB   #$01
       STAB   2,X      PLATINE-AKTIV-LED EINSCHALTEN, OPTOKOPPLER AUSSCHALTEN
       LDAB   4,X
       STAB   SFTCODE  SOFTWARECODE MERKEN
       CLR    ACIA_OK  ACIA WURDE NOCH NICHT INITIALISIERT.
       RTS    ZUM MX10802-MANAGER
*
* FUSSTASTER WURDE GEDRUECKT.
*
ANFORD EQU    *      BERECHNUNG DER UNTERPROGRAMMADRESSE DES LESEPROGRAMMS
       CLR    ERROR  ZU BEGINN KEIN ERROR.
       CLR    P_ERROR          "
       CLR    MSAVE1 OFFSET IN BYTES AB TABELLENSTART UNTERPROGR.-TABELLE
       LDX    #40
       STX    SECONDS DEFAULTWERT: TIMEOUT IN ZWEI SEKUNDEN.
       LDAA   SFTCODE
       DECA           SOFTCODE=1: KEIN OFFSET IN DER TABELLE (MUSS=0 SEIN)!
       BITA   #$80   HOECHSTES BIT GESETZT?
       BEQ    ANF1   NEIN: MSAVE1 BLEIBT GELOESCHT.
       INC    MSAVE1 HOECHSTES BIT IN BIT 0 HOEHERWERTIGES BYTE SCHREIBEN
ANF1   EQU    *
       ASLA           AKKU MIT 2 MULTIPLIZIEREN (EIN TABELLENEINTRAG=2 BYTES)
       STAA   MSAVE1+1
       LDX    #METAB
       STX    MSAVE  TABELLEN-STARTADRESSE MESSMITTEL MERKEN
       LDAA   MSAVE+1
       ADDA   MSAVE1+1 STARTADRESSE + 2*SFTCODE = TABELLENPLATZ
       STAA   TMP_X+1  NUR ZUM ZWISCHENSPEICHERN
       LDAA   MSAVE
       ADCA   MSAVE1
       STAA   TMP_X
*
*      MSAVE  ENTHAELT DIE ERSTE UNTERPROGRAMMADRESSE IN DER MESSMITTELTABELLE
*      MSAVE1 ENTHAELT DEN (SOFTCODE-1)*2.
*              -1, DA BEI EINER 1 IN SFTCODE NICHT GESPRUNGEN WERDEN SOLL
*              (OFFSET=0)
*              *2, DA DIE EINTRAEGE 2 BYTES GROSS SIND.
*      TMP_X  ENTHAELT DIE 16-BIT-ADDITION DER BEIDEN WERTE. (DEN EIGENTLICHEN
*              TABELLENPLATZ)
*
       LDX    TMP_X  TABELLENPLATZ LADEN
       LDX    0,X    WERT IN DER TABELLE LADEN
       JSR    0,X    ZUM MESSMITTEL-LESEPROGRAMM SPRINGEN.
       RTS
*
       NOP    DUMMYS FUER MOTBIN...
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
 

© 2001 Marcel Sieling, http://www.powerslider.de
   Ich freue mich immer über nette EMails, die ich gerne beantworte.