Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Retry Befehl für Powerline-MoR-i/o funktioniert nicht Kategorie: Programmierung Basic (von Dietmar, Homepage - 13.01.2005 22:32)
 Als Antwort auf Retry Befehl für Powerline-MoR-i/o funktioniert nicht von Peter - 12.01.2005 22:45

Wie die zusätzlichen "Kunstbefehle" zum Power Line Modem / Remote-IO im einzelnen arbeiten, habe auch ich noch nicht ganz durchschaut. Es handelt sich um Befehle, die ihrerseits aus ganzen Programmsegmenten von Tokenbefehlen aufgebaut sind. Der Retry-Befehl taucht meines Wissen nur im Beispielprogramm NET3.BAS auf.

Das recht harmlos aussehende...

' Port setzen ohne Ruecksicht auf Uebertragungsfehler,
' bei gestoertem Netzzugriff wird die aktuelle BASIC-Zeile
' uebersprungen, der Endzustand von p (ON oder OFF)
' ist somit nicht vorhersehbar
for x = 1 to 10
  p1 = ON
  p1 = OFF
next


...aus NET3.BAS wird vom Compiler CCBASIC in folgendes Token-Ungetüm übersetzt:

003c: 14 00 01    PUSH 1
003f: 19 00       POP BYTEVAR[1]

0041: 14 ff ff    PUSH -1
0044: 05 00 ac    GOSUB 00ac
0047: 14 00 02    PUSH 2
004a: 20          PUT
004b: 29          AND
004c: 14 00 02    PUSH 2
004f: 20          PUT
0050: 29          AND
0051: 14 00 64    PUSH 100
0054: 05 00 ca    GOSUB 00ca
0057: 14 00 01    PUSH 1
005a: 20          PUT
005b: 29          AND
005c: 2b          OR
005d: 20          PUT
005e: 20          PUT
005f: 22          GET
0060: 14 00 00    PUSH 0
0063: 04 00 6c    IF NOT STACK THEN 006c
0066: 05 00 c7    GOSUB 00c7
0069: 03 00 6f    GOTO 006f
006c: 05 00 e0    GOSUB 00e0

006f: 14 00 00    PUSH 0
0072: 05 00 ac    GOSUB 00ac
0075: 14 00 02    PUSH 2
0078: 20          PUT
0079: 29          AND
007a: 14 00 02    PUSH 2
007d: 20          PUT
007e: 29          AND
007f: 14 00 64    PUSH 100
0082: 05 00 ca    GOSUB 00ca
0085: 14 00 01    PUSH 1
0088: 20          PUT
0089: 29          AND
008a: 2b          OR
008b: 20          PUT
008c: 20          PUT
008d: 22          GET
008e: 14 00 00    PUSH 0
0091: 04 00 9a    IF NOT STACK THEN 009a
0094: 05 00 c7    GOSUB 00c7
0097: 03 00 9d    GOTO 009d
009a: 05 00 e0    GOSUB 00e0

009d: 14 00 0a    PUSH 10
00a0: 4a 00 00 ab FORNEXT1 IF BYTEVAR[1]=STACK GOTO 00ab
00a4: 14 00 01    PUSH 1
00a7: 4c 00 00 41 FORNEXT2 ADD BYTEVAR[1],STACK : GOTO 0041


Wenn hingegen Retry verwendet wird...

' Port setzen mit Wiederholung der Anweisung bei
' Uebertragungsfehlern,
' Achtung: ggf. endlos, wenn Remote IO mit Adresse 2
' ueberhaupt nicht erreichbar ist!
for x = 1 to 10
  retry p1 = ON
  retry p1 = OFF
next


...ändert sich entgegen meiner Befürchtungen gar nicht so viel. Nur die Zieladressen zweier GOTO-Befehle werden "gepatcht". Und zwar wird das "GOTO 006f" auf Adresse $0069 zu "GOTO 0041" und das "GOTO 009d" auf Adresse $0097 wird zu "GOTO 006f". So weit so gut. Was mich allerdings irritiert, ist die Tatsache, daß dieser Codeteil niemals ausgeführt wird, denn das vorhergehende "PUSH 0" mit nachfolgendem "IF NOT STACK" wird das GOTO immer überspringen, oder sehe ich das falsch? Sollte es sich dabei etwa wieder um einen Fehler im CCBASIC-Compiler handeln? Es ist möglich, daß das "PUSH 0" beim Einsatz von Retry in "PUSH -1" umgeschrieben gehört.

Peter, wenn Du mir Deinen Programmcode zuschickst, kann ich die erforderlichen Veränderungen vornehmen und Du kannst testen, ob das Problem dadurch behoben ist. Ich hoffe, Du weißt, wie man eine DAT-Datei mit Hilfe des Downloadtools CCDL.EXE zur C-Control überträgt?

Grüße,
Dietmar

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: