*/ - Routine mit Action


*/ - Routine mit Action

von atarineuling » Do 5. Sep 2013, 08:10
Hallo, guten Tag.
Ich suche bitte eine */ Routine (Mult/DIV) für Action.
Wie kann man die erstellen.
Die Schwäche von ACtion ist ja, wie ich fest stellte das es keine Sin/Cos/Tan gibt.
Dieses möchte ich abschwächen durch eine 2Byte-Mult zu einer 4Byte und wieder mit Div zu einem 2ByteErgebnis
Wenn man dann aus Tabellen den Sin-Wert(10000Fach) wieder durch 10000 Teilen würde,hätte man für diese Funktionen einen Wert im Endergebnis der sich auch in der Genauigkeit der Darstellung in Grafiken usw sehen lassen kann.

Wer kann als ASM-Fachman so etwas bitte realisieren.
Einer aus diesem Forum hat doch beim X-Forth mitgewirkt. Darin gibt es so eine Routine. Leider nur aus Forthworten. Diese muss aber irgendwie aus einem ASM-Code entstanden sein.

Danke

Re: */ - Routine mit Action

von eda70 » Do 5. Sep 2013, 09:19
Im Action-Toolkit gibt es Fließkommaroutinen (REAL.ACT) und damit auch entsprechende Multiplikations und Divisions-Routinen....
Ansonsten würde ich nicht 10.000 fach nehemn sondern 30.000 fach. Damit nutzt man den 2 Byte-Bereich besser aus. Ist die Frage, ob das Mehr an Genauigkeit den Overhead wert ist, denn idR braucht man am Ende eh nciht den reinen Sinus oder Cosinus sondern ein Vielfaches davon...

Re: */ - Routine mit Action

von atarineuling » Do 5. Sep 2013, 12:17
Hallo, danke.

Die Real sind zu langsam.
10000 reicht aus, das entspricht dann 4 Stellen hinter dem Komma.

Hier habe ich schon mal etwas vom C64, da kenn ich mich aus.
Es werden 2 Integer multipliziert, das Ergebnis sind 4Byte. Der erste Schritt.
Es findet in der Zeropage statt.
Jetzt ist die Frage , wer kann das mal bitte in Action umsetzen.
Es werden 10Byte in der Zeropage gebraucht.
Jetzt brauche ich mal die Progger , die ACtion kennen zum umsetzen.

Gruss

Code: Alles auswählen
tmp = $88
tmp2 = $8a
tmp3 = $8c
product = tmp

dmul
    lda #0  ;  1. integer lo/hi
    sta 3
    lda #4
    sta 4

    lda #10 ;  2. integer lo/hi
    sta 5
    lda #0
    sta 6

    ldx #$03
    lda #$00
    sta product+2
    sta product+3
    ldy #$10
shift_r
    lsr 3, x
    ror 2, x
    bcc rotate_r
    lda product+2
    clc
    adc 0, x
    sta product+2
    lda product+3
    adc 1, x
rotate_r
    ror
    sta product+3
    ror product+2
    ror product+1
    ror product
    dey
    bne shift_r
   
    ldx #3
    lda product
    sta 0, x
    lda product + 1
    sta 1, x
    lda product + 2
    sta 2, x
    lda product + 3
    sta 3, x

    ; 4 byte-Ergebnis
    ldx 5  ;  hi Integer
    lda 6

    ldx 3  ;  lo Integer
    lda 4

    rts

*/ - Routine mit Action

von Erhard » Do 5. Sep 2013, 14:41
Hi,

es gibt nur sehr wenig ZP-Adressen, die wirklich frei sind unter ACTION!

Solange Du die Atari Fließkommaroutinen aus dem ROM nicht benutzt, könntest Du die Floating Point Register benutzen (ohne Gewähr).

Ebenfalls benutzen kannst Du sehr eingeschränkt die Speicherstellen $AF bis $A0, aber Vorsicht, ACTION! benutzt die zur Übergaben von Parametern an PROCs und FUNCs, zur Rückgabe von FUNC Ergebnissen usw.

Die Opcodes Deines Assemblerlistings müßtest Du vom C64 übernehmen können, da er die gleiche CPU hat.

Allerdings kenne ich von Atari Assemblern z.B. nicht folgende Syntax:

LSR 3, X

Was macht der Befehl? Oder ist das "Speicherstelle 3 indiziert mit X"?

Ist das ein legaler Opcode? Muß ich heute Abend mal nachschauen.

Absolute Sprünge sind ja glücklicherweise nicht drin.

In ACTION! fügst Du das dann wie folgt ein:

PROC XYZ=*()
[HEX HEX DEC ....]
RETURN

Als Beispiel kannst Du ja Simple PRINT oder die ACTION! RT Library nehmen.

Zur Rückgabe von Ergebnissen empfehlen sich globale Variablen.

Viele Grüße

Erhard

Re: */ - Routine mit Action

von eda70 » Do 5. Sep 2013, 14:58
Erhard hat geschrieben:Ist das ein legaler Opcode? Muß ich heute Abend mal nachschauen.

Yep. Logical Shift Right - ZeroPage, X: $56

Re: */ - Routine mit Action

von atarineuling » Do 5. Sep 2013, 15:13
Jup, danke für die Speicherstelleninfo.

Gruss