Unerklärliches in Action!


Unerklärliches in Action!

von ossidlz » Do 8. Apr 2010, 22:15
Hallo!

Ich beschäftige mich zur Zeit mit der Erlernung von Action! (ich weis: 20 Jahre zu spät). Bei den Fingerübungen (Code bitte nicht auf Perfektion prüfen) auf ein, mir unerklärliches, Verhalten gestossen. Wie leicht zu erkennen ist, soll die Funktion Stellen() die Anzahl der Stellen einer dezimalen Zahl ausgeben. Das funktioniert auch ganz wunderbar bis es plötzlich und unerwartet vollständig schief läuft. Kopiert euch das bitte mal raus und lasst es laufen (der Wertebereich ist schon eingegrenzt). Ich habe schon nach einer logischen Erklärung (Bereichsüberlauf) gesucht, aber ich wüsste nicht wieso hier etwas überlaufen soll (vor allen Dingen bei dieser Zahl). Nicht das die Routine wichtig wäre, aber dieses Verhalten irritiert mich doch massiv! Ich habe das Ganze übrigens auf Emu und Originalhardware (mit Modul und den Softwarehack) getestet.

Helft mir bitte auf die Sprünge.

Karsten

------------------------------------------------------------------------------

BYTE FUNC STELLEN(CARD ZAHL)
CARD ZWISCHEN
BYTE STELLEN

STELLEN=0
ZWISCHEN=ZAHL

IF ZWISCHEN=0 THEN RETURN(1) FI


WHILE ZWISCHEN>0 DO
ZWISCHEN==/10
STELLEN==+1
OD

RETURN (STELLEN)

;-----------------

PROC MAIN()

CARD LOOP
BYTE BDUMMY

GRAPHICS (0)
FOR LOOP=55530 TO 55540 DO
BDUMMY=STELLEN(LOOP)
PRINTC (LOOP)
PRINT (" HAT ")
PRINTB (BDUMMY)
PRINTE (" STELLEN.")
OD
RETURN

Re: Unerklärliches in Action!

von FlorianD » Do 8. Apr 2010, 23:35
Hallo,

vielleicht bist Du einem bekannten Bug aufgesessen: Probier mal das hier
(stammt hierher: http://www.umich.edu/~archive/atari/8bi ... /bugs2.act )
(auch sehr ergiebig: http://wiki.strotmann.de/wiki/Wiki.jsp?page=ACTION )

Leider gibt es bei Action! einige Bugs, die auch mich schon in den Wahnsinn getrieben haben. ABer es ist eine tolle Sprache, die wirklich schnellen Code erzeugt!

16. DIVISION ERRORS -- On old cartridges, neither the "/" operator nor the "MOD" operator works properly under certain conditions.

Affects: Versions 3.0 and 3.1

Fix: Insert the following code into your program before any of your own PROCedure or FUNCtion declarations (this can be done easily using INCLUDE):

Code: Alles auswählen
    ; Copyright (c) 1983 by
    ; Action Computer Services
    ;
    ; Permission is granted to
    ; duplicate and/or distribute
    ; the contents of this file
    ; to ACTION! users.  Copies of
    ; this file may not be sold or
    ; used for monetary gain.

    PROC DivI=*()
    [$20 $A06C $85 $86 $A2 $10
     $26 $82 $26 $83 $26 $86 $26
     $87 $38 $A5 $86 $E5 $84 $A8
     $A5 $87 $E5 $85 $90 $04 $85
     $87 $84 $86 $CA $D0 $E5 $A5
     $82 $2A $26 $83 $A6 $83
     $4C $A032]

    PROC RemI=*()
    [$20 DivI $86A5 $87A6 $60]

    SET $4EA=DivI
    SET $4EC=RemI

Re: Unerklärliches in Action!

von ossidlz » Fr 9. Apr 2010, 08:45
Ich habe den Code mal eingefügt. Das Ergebnis hat mich nicht überzeugt :( . Der Fehler besteht nach wie vor.

Re: Unerklärliches in Action!

von ossidlz » Sa 10. Apr 2010, 13:00
Ich habe gesucht und mir die Variablen ausgeben lassen. Jetzt sieht es mir doch nach Überlauf aus. Allerdings kann ich mir den nicht erklären. So ein Fehler wäre echt unangenehm. Ich schicke jetzt das Listing mit den Prüfungen und dem eingefügten Code, welchen FlorianD empfahl.
Jetzt jemand eine Idee? Wie wird in Action die Festzahlendivision realisiert?

----------------------------------


; Copyright (c) 1983 by
; Action Computer Services
;
; Permission is granted to
; duplicate and/or distribute
; the contents of this file
; to ACTION! users. Copies of
; this file may not be sold or
; used for monetary gain.

PROC DivI=*()
[$20 $A06C $85 $86 $A2 $10
$26 $82 $26 $83 $26 $86 $26
$87 $38 $A5 $86 $E5 $84 $A8
$A5 $87 $E5 $85 $90 $04 $85
$87 $84 $86 $CA $D0 $E5 $A5
$82 $2A $26 $83 $A6 $83
$4C $A032]

PROC RemI=*()
[$20 DivI $86A5 $87A6 $60]

SET $4EA=DivI


BYTE FUNC STELLEN(CARD ZAHL)
CARD ZWISCHEN
BYTE STELLEN

STELLEN=0
ZWISCHEN=ZAHL

IF ZWISCHEN=0 THEN RETURN(1) FI

WHILE ZWISCHEN>0 DO
PRINTC (ZWISCHEN)
PRINT (", ")
ZWISCHEN==/10
STELLEN==+1
OD
PRINTE ("")
RETURN (STELLEN)

;-----------------

PROC MAIN()

CARD LOOP,ANFANG=[32766]
BYTE BDUMMY

GRAPHICS (0) PRINTE ("")

FOR LOOP=ANFANG TO ANFANG+4 DO
BDUMMY=STELLEN(LOOP)
PRINTC (LOOP)
PRINT (" HAT ")
PRINTB (BDUMMY)
PRINTE (" STELLEN.")
PRINTE ("")
OD
---------------------------------------

OssiDlz

Re: Unerklärliches in Action!

von cas » So 11. Apr 2010, 16:21
Hallo OssiDlz,

ich kann leider nicht testen warum Deine Routine die falschen Werte liefert, aber ich kann Dir einen Workaround nennen:

1) mit StrC die ZAHL in eine Zeichenkette (String) umwandeln
2) die Laenge der Zeichenkette zurueckliefern

Ciao

Carsten

Re: Unerklärliches in Action!

von ossidlz » So 11. Apr 2010, 20:03
Hallo cas!

Als Workaround zweifellos gut benutzbar (und viel einfacher als meine Lösung), aber die Frage bleibt trotzdem im Raum stehen ... warum liefert eine simple Division durch 10 eine so gravierend falsche Lösung? Es scheint so, als ob das Vorzeichen beachtet wird. Bei Card dürfte das aber (meiner Meinung nach) gar nicht sein.

Karsten

Re: Unerklärliches in Action!

von FlorianD » Mo 12. Apr 2010, 00:08
vielleicht kann Action! keine CARDs dividieren. Es gibt da auch ein bekanntes Problem mit Multiplizieren, bzw teilen durch 256 (um CARD in INT_low und INT_high Bytes zu wandeln). Guck mal die Links oben durch, ich finde die Stellen so schnell nicht mehr.

Re: Unerklärliches in Action!

von cas » Mo 12. Apr 2010, 03:17
FlorianD hat geschrieben:vielleicht kann Action! keine CARDs dividieren. Es gibt da auch ein bekanntes Problem mit Multiplizieren, bzw teilen durch 256 (um CARD in INT_low und INT_high Bytes zu wandeln). Guck mal die Links oben durch, ich finde die Stellen so schnell nicht mehr.



Der Name des Fixes scheint in diese Richtung zu deuten (DivI = Division Integer). Die Division wird nur fuer INT funktionieren, also nur bis Werte bis 32768.

Dieser Artikel spricht auch davon das ACTION! Integer Division macht:
http://wiki.strotmann.de/wiki/Wiki.jsp? ... 20Tutorial

Du kannst auch mal diese ACTION! Runtime testen:
http://wiki.strotmann.de/wiki/Wiki.jsp? ... e%20Source

Man koennte eine neue Routine DivC erstellen, welche dann CARDs dividieren kann.

Ciao

Carsten

Re: Unerklärliches in Action!

von eda70 » Di 11. Mai 2010, 15:47
Mache gerade ein paar Aufwärm-Übungen in Action! Leider schmiert mir immer wieder der Emu ab:
Code: Alles auswählen
<CIM eincountered>
286  46 2FC3 CIM          A=73 S=c8 X=01 Y=01 P=--*B-I--
Was sagt mir das? Kann das an dem Divisions bzw. Mod-Bug liegen? Hatte gedacht, der liefert einfach falsche Ergebnisse.

EDIT: Jetzt habe ich das Progrämmchen noch 25 mal laufen lassen, jetzt bockt es nicht... - komisch.

Re: Unerklärliches in Action!

von cas » So 16. Mai 2010, 11:11
eda70 hat geschrieben:Mache gerade ein paar Aufwärm-Übungen in Action! Leider schmiert mir immer wieder der Emu ab:
Code: Alles auswählen
<CIM eincountered>
286  46 2FC3 CIM          A=73 S=c8 X=01 Y=01 P=--*B-I--
Was sagt mir das? Kann das an dem Divisions bzw. Mod-Bug liegen? Hatte gedacht, der liefert einfach falsche Ergebnisse.

EDIT: Jetzt habe ich das Progrämmchen noch 25 mal laufen lassen, jetzt bockt es nicht... - komisch.


Ein CIM ist meistens der Versuch einen nicht ausführbaren Madchinensprachebefehl auszuführen. ACTION! generiert richtige Machinensprache, keinen Zwischenkode. Da ist kein Sicherheitsnetzt. Wenn man z.B. eine Speicherstruktur (ARRAY, Record) falsch benutzt und Daten über die Grenzen der Struktur hinausschreibt (Buffer Overflow), dann kommt es zu solchen CIM Fehlern.

-- Carsten

Re: Unerklärliches in Action!

von eda70 » Mo 17. Mai 2010, 21:34
Hm, der Fehler ist jetzt auch nicht mehr reproduzierbar.
Vermutlich saß der Fehler vorm Rechner :)

Re: Unerklärliches in Action!

von funkheld » Di 30. Aug 2011, 19:16
Die Rom-Version 3.6 von 1986 hat bei mir keine Fehlfunktion.

gruss