DECLARE FUNCTION COM13% () DECLARE FUNCTION COM24% () DECLARE SUB Anzeige (Ergebnis%) '-- com3und4.bas ----------------------------------------------- >>fst'01<< - ' - Demo, wie man COM 3 und COM 4 in QBasic/Quickbasic/ usw. nutzen kann ' (durch Manipulation der Basisadressen im BIOS-Datenbereich) ' - Achtung COM 1/COM 3 sowie COM 2/COM 4 benutzen jeweils denselben ' Interrupt. Dadurch ist die gleichzeitige Nutzung eingeschraenkt. ' Also z.B. nicht COM 3 nutzen, wenn an COM 1 die Maus haengt!!! ' - PUBLIC DOMAIN '-- V 20020614 ------------------------------ http://home.arcor.de/steini63 - CLS : PRINT PRINT "COM 3 und COM 4 mit QBasic / QuickBasic / ... nutzen >>fst'02<<" LOCATE 8 'FUNCTION COM13% aufrufen = COM 3 fuer COM 1 einsetzen 'Rueckgabewert ist die Nr. des COM-Ports der mit COM1 angesprochen 'werden kann oder <= 0 bei einem Fehler (-3 = COM 3 nicht vorhanden): Ergebnis% = COM13% CALL Anzeige(Ergebnis%) 'Jetzt kann COM 3 geoeffnet werden; Beispiel: 'OPEN "COM1:600,N,7,1,RS,CS,DS,CD" FOR RANDOM AS #1 ' ^ ! 'Erneuter Aufruf stellt Originalzustand her: Ergebnis% = COM13% CALL Anzeige(Ergebnis%) PRINT "------------------------------------------------------------------------" PRINT 'FUNCTION COM24% aufrufen = COM 4 fuer COM 2 einsetzen 'Rueckgabewert ist die Nr. des COM-Ports der mit COM2 angesprochen 'werden kann oder <= 0 bei einem Fehler (-4 = COM 4 nicht vorhanden): Ergebnis% = COM24% CALL Anzeige(Ergebnis%) 'Jetzt kann COM 4 geoeffnet werden; Beispiel: 'OPEN "COM2:2400,N,8,1,RS,CS,DS,CD" FOR RANDOM AS #1 ' ^ ! 'Erneuter Aufruf stellt Originalzustand her: Ergebnis% = COM24% CALL Anzeige(Ergebnis%) SUB Anzeige (Ergebnis%) 'wertet den Rckgabewert von COM13% und COM24% aus und 'zeigt entsprechende Meldungen an. SELECT CASE Ergebnis% CASE 1 PRINT "Tausch COM 1 - COM 3 zurueckgesetzt." CASE 2 PRINT "Tausch COM 2 - COM 4 zurueckgesetzt." CASE 3 PRINT "COM 3 jetzt mit OPEN COM1:... nutzbar!" CASE 4 PRINT "COM 4 jetzt mit OPEN COM2:... nutzbar!" CASE IS < 0 PortNr% = Ergebnis% * -1 PRINT "FEHLER! COM"; PortNr%; "nicht gefunden." CASE ELSE PRINT "Umbestimmter Fehler!" END SELECT PRINT END SUB FUNCTION COM13% 'Ueberschreibt die I/O Basisadresse von COM 1 im BIOS-Datenbereich, mit der 'Basisadresse von COM 3 und macht so COM 3 nutzbar. Bei erneutem Aufruf wird 'der Originalzustand wieder hergestellt. Die FUNCTION liefert folgende Werte: ' 1 = Originalzustand COM 1 = COM 1 ' 3 = COM 3 als COM 1 ansprechbar '-1 = COM 1 nicht gefunden '-3 = COM 3 nicht gefunden STATIC COM1l%, COM1h%, COM3l%, COM3h%, COMx% DEF SEG = 0 'BIOS-Datensegment setzen 'Beim ersten Aufruf Originaladressen sichern: IF COMx% = 0 THEN COM1l% = PEEK(&H400) 'LowByte Basisadresse COM 1 COM1h% = PEEK(&H401) 'HighByte Basisadresse COM 1 COM3l% = PEEK(&H404) 'LowByte ˙Basisadresse COM 3 COM3h% = PEEK(&H405) 'HighByte Basisadresse COM 3 COMx% = 1 END IF 'Wenn COM 1 nicht vorhanden: IF COM1l% + COM1h% = 0 THEN COMx% = -1 'Wenn COM 3 nicht vorhanden: IF COM3l% + COM3h% = 0 THEN COMx% = -3 IF COMx% = 1 THEN 'Wenn noch nicht getauscht .. POKE &H400, COM3l% 'LowByte von COM 3 in Datenbereich von COM 1 schreiben POKE &H401, COM3h% 'HighByte von COM 3 in Datenbereich von COM 1 schreiben COMx% = 3 'Rueckgabewert setzen ELSEIF COMx% = 3 THEN 'Wenn bereits getauscht war ... POKE &H400, COM1l% 'Originaladressen wieder herstellen POKE &H401, COM1h% ' COMx% = 1 'Rueckgabewert setzen END IF DEF SEG 'Segment wieder herstellen COM13% = COMx% END FUNCTION FUNCTION COM24% 'Ueberschreibt die I/O Basisadresse von COM 2 im BIOS-Datenbereich, mit der 'Basisadresse von COM 4 und macht so COM 4 nutzbar. Bei erneutem Aufruf wird 'der Originalzustand wieder hergestellt. Die FUNCTION liefert folgende Werte: ' 2 = Originalzustand COM 2 = COM 2 ' 4 = COM 4 als COM 2 ansprechbar '-2 = COM 2 nicht gefunden '-4 = COM 4 nicht gefunden STATIC COM2l%, COM2h%, COM4l%, COM4h%, COMx% DEF SEG = 0 'BIOS-Datensegment setzen 'Beim ersten Aufruf Originaladressen sichern: IF COMx% = 0 THEN COM2l% = PEEK(&H402) 'LowByte Basisadresse COM 2 COM2h% = PEEK(&H403) 'HighByte Basisadresse COM 2 COM4l% = PEEK(&H406) 'LowByte ˙Basisadresse COM 4 COM4h% = PEEK(&H407) 'HighByte Basisadresse COM 4 COMx% = 2 END IF 'Wenn COM 2 nicht vorhanden: IF COM2l% + COM2h% = 0 THEN COMx% = -2 'Wenn COM 4 nicht vorhanden: IF COM4l% + COM4h% = 0 THEN COMx% = -4 IF COMx% = 2 THEN 'Wenn noch nicht getauscht .. POKE &H402, COM4l% 'LowByte von COM 4 in Datenbereich von COM 2 schreiben POKE &H403, COM4h% 'HighByte von COM 4 in Datenbereich von COM 2 schreiben COMx% = 4 'Rueckgabewert setzen ELSEIF COMx% = 4 THEN 'Wenn bereits getauscht war ... POKE &H402, COM2l% 'Originaladressen wieder herstellen POKE &H403, COM2h% ' COMx% = 2 'Rueckgabwert setzen END IF DEF SEG 'Segment wieder herstellen COM24% = COMx% END FUNCTION