|
**********************************************************************
* 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
|
|