2 Fragen zu Action!


2 Fragen zu Action!

von FlorianD » So 25. Jun 2006, 13:16
Hallo,

1. Frage

Ist dieser Fehler(?) bekannt

PROC MAIN()
CARD M
BYTE N

CARD=$FFFF
N=M/256
PRINTB(N)
RETURN

Ausgabe 0 (!) sollte 255 sein. Wenn man N auch als CARD definiert, dasselbe Ergebnis. Ich habs nach laaaaangem Suchen dann mit N=m RSH 8 hingekriegt, weiß aber immer noch nicht, ob es mein oder Actions!s Fehler ist.

2. Frage
Geht das so?

BYTE ARRAY BUFFER(128)
BYTE BH,BL

BH=BUFFER/256
BL=BUFFER-256*BH

Habe ich dann die Adresse von BUFFER in BH/BL?

Danke für die Hilfe im Voraus!

Florian

von FlorianD » So 25. Jun 2006, 13:44
noch eine Frage: kann man das Action!-Modul irgendwie softwareechnisch ausschalten?

Re: 2 Fragen zu Action!

von cas » So 25. Jun 2006, 16:17
FlorianD hat geschrieben:Hallo,

1. Frage

Ist dieser Fehler(?) bekannt

PROC MAIN()
CARD M
BYTE N

CARD=$FFFF
N=M/256
PRINTB(N)
RETURN

Ausgabe 0 (!) sollte 255 sein. Wenn man N auch als CARD definiert, dasselbe Ergebnis. Ich habs nach laaaaangem Suchen dann mit N=m RSH 8 hingekriegt, weiß aber immer noch nicht, ob es mein oder Actions!s Fehler ist.


das ist ACTION!s Fehler, aber der war mir bisher nicht bekannt. Wie es scheint rechnet der Devisionsbefehl falsch, wenn durch 256 devidiert wird und das Highbyte > 128 ($80) ist. Dann ist das Ergebnis um 1 grösser als erlaubt.

Es gibt zwar eine Anmerkung von ACS, das der Divisiionsbefehl in der cartridge fehlerhaft ist, aber der Fix

http://www.strotmann.de/twiki/bin/view/ ... ION_ERRORS

behebt das Problem nicht. Auch in der Runtime scheint der Fehler zu sein.

Meine Lösung zum ermitteln des Highbytes:

Code: Alles auswählen
BYTE FUNC HIGH(CARD value)
  BYTE b = $0101
  CARD c = $0100
  c = value
RETURN (b)

PROC MAIN()
  CARD m
  BYTE c
  m = $FFFF
  b = HIGH(m)
  PRINTB(b)
RETURN

Re: 2 Fragen zu Action!

von cas » So 25. Jun 2006, 16:26
FlorianD hat geschrieben:2. Frage
Geht das so?

BYTE ARRAY BUFFER(128)
BYTE BH,BL

BH=BUFFER/256
BL=BUFFER-256*BH

Habe ich dann die Adresse von BUFFER in BH/BL?

Danke für die Hilfe im Voraus!

Florian


Wegen des Fehlers im Divisionsbefehl funktioniert dies nur für Addressen bis $8000. Besser ist:

Code: Alles auswählen

PROC MAIN()
  BYTE ARRAY buffer(128)
  CARD addr
  BYTE bh, bl
 
  addr = buffer
  PRINTF("Address: %H %E", addr)

  bh = HIGH(addr)
  bl = addr
  PRINTF("HIGH: %H %E", bh)
  PRINTF("LOW : %H %E", bl)
RETURN



Überprüfen kannst Du die Werte im ACTION! Monitor:

erst compilieren, dann "? buffer" zeigt die Adresse von "buffer" im Speicher, inkl. Inhalt (byte / card).

von cas » So 25. Jun 2006, 19:22
Anonymous hat geschrieben:das kapier ich nicht, obwohl ich jetzt schon 5 Minuten draufstarre

BYTE FUNC HIGH(CARD value)
BYTE b = $0101
CARD c = $0100
c = value
RETURN (b)

PROC MAIN()
CARD m
BYTE c
m = $FFFF
b = HIGH(m)
PRINTB(b)
RETURN

-was macht das byte c in main? nichts, oder? muß das b heissen, denn b ist nicht definiert?


Sorry, ja, sollte "b" heissen.

-was tut die func high in den Speicherzellen $0100 und $0101 ? ist da was spezielles? oder sollen b und c mit $0101 und $0100 initialisiert werden, dann sollte das doch BYTE c=[$0101] heissen, oder?


BYTE b = $0101
CARD c = $0100

Die 1 Byte Variable "b" wird an Speicherstelle $101 gelegt (oberer Stack). Die 2 Byte (Card) Variable "c" wird nach Speicherstelle $100 gelegt. Der 6502 speichert immer Lowbyte/Highbyte (LSB, MSB). Es wird also die 16 Bit (Card) Zahl "c" an Speicherstelle $100 geschrieben, und dann wird das Byte an Speicherstelle $101 gelesen. Somit bekommen wir das Highbyte zurück, weil ab $100 ja LowByte, HighByte im Speicher legen. Das ergibt als Assemblercode:

Code: Alles auswählen
STX   $124e  ; "value" speichern "BYTE FUNC High(CARD value)"
STA   $124d
LDA   $124e ; "value" wird "c" zugewiesen ("c = value")
STA   $0101
LDA   $124d
STA   $0100
LDA   $0101 ; highbyte von "c" wird geladen (= "b")
STA   $a0     ; und als returnwert zurückgegeben ("RETURN (b)")
RTS


Ich gebe zu, das ist getrickst, aber kürzer und schneller (Ausführungszeit) bekommt man es warscheinlich nicht hin.

so langsam nervt mich Action!. Immer wenn ich was machen will, klemmt es irgendwo im Compiler oder ist ein Bug versteckt. Ich komme nicht dazu, meine Probleme zu lösen, sondern muss mich 90 Minuten damit beschäftigen, warum $FFFF/$FF=$0 ist und nicht $FF, wie es sein sollte.


Die Lernkurve ist steil, insb. wenn man noch nie low-level "C" programmiert hat. Aber es lohnt sich. Wenn Probleme auftauchen, schreib einfach. Oder schaue Dir ACTION! quellcode im Wiki an.

Ciao

Carsten