Alle Floatbefehle von Basic kann man nutzen für GEOS2.5


  • spacer
  • 480 Views 23 replies

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Alle Floatbefehle von Basic kann man nutzen für GEOS2.5

    Jetzt klappt es mit dem Floatbefehl von Basic für GEOS2.5
    Kann jetzt alle Basic-Floatbefehle in GEOS2.5 nutzen. Sinus..Cosinus..Mult..DIV usw.

    Kann die Werte(String) von $100 nach $7f40 verlagern.
    Test ist 2xPI.
    Wie kann ich jetzt bitte die Werte in GEOS darstellen?

    Danke.
    Gruss

    Die Funktion in ASM für GEOS für den cc65 :

    Source Code

    1. .export _bildschirm
    2. .export _linie
    3. .export _schleife
    4. .export _bason
    5. .export _basoff
    6. .export _adrpi
    7. .export _adr2pi
    8. .export _adr10
    9. .export _ramfac
    10. .export _facstr
    11. .include "geosmac.inc"
    12. .include "jumptab.inc"
    13. .include "geossym.inc"
    14. .include "const.inc"
    15. .include "geossym2.inc"
    16. .include "inputdrv.inc"
    17. .include "printdrv.inc"
    18. .include "diskdrv.inc"
    19. .include "dio.inc"
    20. _bason:
    21. sei
    22. ldx #$37
    23. stx $01
    24. rts
    25. _basoff:
    26. ldx #$36
    27. stx $01
    28. cli
    29. rts
    30. _adrpi:
    31. lda #$a8
    32. ldy #$ae
    33. rts
    34. _adr2pi:
    35. lda #$09
    36. ldy #$e3
    37. rts
    38. _adr10:
    39. lda #$f9
    40. ldy #$ba
    41. rts
    42. _ramfac:
    43. jsr 48034
    44. rts
    45. _facstr:
    46. jsr 48605
    47. rts
    48. _schleife:
    49. schl:
    50. jmp schl
    51. rts
    52. _linie:
    53. LoadW r3,50
    54. LoadB r11L,100
    55. LoadW r4,300
    56. lda #%11111111
    57. jsr HorizontalLine
    58. rts
    59. _bildschirm:
    60. lda #0
    61. jsr SetPattern
    62. LoadB dispBufferOn,ST_WR_FORE | ST_WR_BACK
    63. ldy #5
    64. back:
    65. lda RecTabelle,y
    66. sta r2L,y
    67. dey
    68. bpl back
    69. jsr Rectangle
    70. rts
    71. RecTabelle:
    72. .byte 0
    73. .byte 199
    74. .word 0
    75. .word 319
    Display All

    Der cc65 Code:

    C Source Code

    1. #include <geos.h>
    2. #include <conio.h>
    3. #include <stdlib.h>
    4. #include <stdio.h>
    5. #include <ctype.h>
    6. #include <peekpoke.h>
    7. struct window wholeScreen = {0, SC_PIX_HEIGHT-1, 0, SC_PIX_WIDTH-1};
    8. unsigned int x;
    9. unsigned int xx;
    10. unsigned char y;
    11. int main(void)
    12. {
    13. SetPattern(0);
    14. InitDrawWindow(&wholeScreen);
    15. Rectangle();
    16. y=0;
    17. xx=0x7f40+9;
    18. InitForIO();
    19. __asm__ ("jsr _bason");
    20. __asm__ ("jsr _adr2pi");
    21. __asm__ ("jsr _ramfac");
    22. __asm__ ("jsr _facstr");
    23. __asm__ ("jsr _basoff");
    24. DoneWithIO();
    25. for (x=0x7f40; x<xx; x++) {
    26. POKE(x,PEEK(256+y));
    27. y=y+1;
    28. }
    29. cgetc ();
    30. return 0;
    31. }
    Display All
    Images
    • Bild2.jpg

      27.07 kB, 312×322, viewed 6 times

    The post was edited 1 time, last by spacer ().

  • daybyter wrote:

    Könnte man das nicht so umsetzen?


    flpout() geht nicht in GEOS , weil du auf dem Screen nicht einfach Printen kannst.

    Gruss




    <EDIT MOD>Bitte in Zukunft die Zitat Funktion nutzen, das macht das Lesen viel einfacher zum Nachvollzieher, wer was geschrieben hat. Einfach das " GänsefüsschenIcon in der Bearbeitungsleiste klicken im Text des benutzers, den man zitieren will. Danke.

    The post was edited 1 time, last by syshack: Bitte in Zukunft die Zitat Funktion nutzen, das macht das Lesen viel einfacher zum Nachvollzieher, wer was geschrieben hat. Einfach das " GänsefüsschenIcon in der Bearbeitungsleiste klicken im Text des benutzers, den man zitieren will. Danke. ().

  • wweicht wrote:

    Na bitte, kaum macht man es richtig, schon funktionierts .
    Nur bedingt... ich hab jetzt mal "Just4Fun" das Programm in den MegaAss übersetzt, siehe unten.

    Kurzum: Ja es "geht"... :thumbup: *ABER* ist aus meiner Sicht doch noch sehr experimentell:

    Die obige Routine führt z.B. keine Berechnungen durch. Es wandelt nur die Konstante pi*2 in einen String ab $0100 um. Daher scheint es zu funktionieren.

    Aber schon die Routine MOVMF=$BBA2=ramfac=48034 zerstört gleich zu Beginn curPattern von GEOS. Kann man ja verschmerzen. SetPattern wieder aufrufen und gut ist.

    Dann hab ich wirklich mal etwas berechnet und SQR=$BF71 ergänzt. Auch das funktioniert, aber nur bis PutString. SQR ist eine Float-Routine und zerstört u.a. einige GEOS-Systemadressen mit Angaben zum aktuellen Zeichensatz. Lässt sich mit UseSystemFont wieder korrigieren.

    Ich hab jetzt nicht mehr weiter getestet. Prinzipiell funktioniert es (war ja klar, ROM-Routinen aufzurufen hat schon immer funktioniert) aber man müsste erstmal prüfen welche GEOS-Register die BASIC-Routinen zerstören und die hinterher wieder zurücksetzen. Entweder über eine generelle Schleife die einfach mal alle GEOS-Register innerhalb der ZeroPage sichert (Holzhammer-Methode) oder man erstellt eine Dokumentation in der zu jeder FLPT-Routine angegeben wird welche GEOS-Register zerstört werden. Z.B.

    ;----------------------------------------------------
    ; MOVMF = $BBA2
    ; Funktion: MFLPT-Konstante in FAC1 laden.
    ; Zerstört: AKKU, XREG, YREG, curPattern, a2L
    ;----------------------------------------------------

    Das MegaAss-Handbuch gibt einem ja die gleichen Informationen für die GEOS-Routinen. Ohne solche Informationen wird das programmieren zum Russischen Roulette.

    Abgesehen davon werden direkte Einsprungadressen im BASIC-ROM verwendet die nicht in einer Srungtabelle (wie bei den I/O-Routinen im Kernal) aufgeführt sind. Die Kernal-I/O-Routinen sind im "Commodore 64 Programmer's Reference Guide" als "User Callable KERNAL Routines" aufgeführt... für BASIC-Routinen gibt es so etwas nicht. Wenn es da angepasste ROMs gibt wird das schon schwierig.

    Für die BASIC-Funktionen gibt es aber immerhin die ROM-Tabelle mit den Adressen zu den BASIC-Kommandos. An Stelle von

    Source Code

    1. jsr SQR ;$BF71

    könnte man das hier verwenden:

    Source Code

    1. :vecSQR=$a05e
    2. lda vecSQR +0
    3. ldx vecSQR +1
    4. jsr CallRoutine

    Bei $A05E steht die Adresse für SQR=$BF71. Das wäre zumindest etwas sicherer für die Funktionen.

    Ich hab zum Spaß auch mal geoBasic ausprobiert. Damit lassen sich auch FLPT-Berechnungen durchführen. Ist zwar wohl nie wirklich fertig geworden und kommt wohl auch nicht mit GEOS-MP3 zurecht (fummelt auch wieder im GEOS-Kernal rum...) aber das geoBasic-Programm konnte ich dann auch als Anwendung abspeichern. Da reicht ein

    Source Code

    1. 10 print sin(1)

    um einen FLPT-Wert auszugeben. Danach kehrt die Anwendung wieder zum DeskTop zurück.


    Ich finde das zwar 'ne gute Idee, auch die Umsetzung für den cc65, aber das war bisher nur ein "Proof-of-concept". Damit man *ALLE* FLPT-Routinen nutzen kann fehlt eine ordentliche Doku, die Adressen der einzelnen Funktionen sollten auch alle mal aufgelistet und getestet werden. Zusätzliche Einsprünge direkt in die BASIC-ROM-Routinen sollten entsprechend deklariert werden, ggf. mit Testroutine ob dort auch die richtige Routine liegt.

    Source Code

    1. if .p
    2. t "TopSym"
    3. t "TopMac"
    4. :P6510 = $01
    5. :MFLPT_PI2 = $e309
    6. :MOVMF = $bba2
    7. :FACSTR = $bddd
    8. :FLTBUF = $0100
    9. :SQR = $bf71
    10. endif
    11. n "FloatDemo"
    12. f APPLICATION
    13. o $0400
    14. p MainInit
    15. z $80 ;Nur GEOS64.
    16. :MAIN php
    17. sei
    18. PushB P6510
    19. LoadB P6510,$37
    20. lda #<MFLPT_PI2
    21. ldy #>MFLPT_PI2
    22. jsr MOVMF
    23. jsr SQR
    24. jsr FACSTR
    25. PopB P6510
    26. plp
    27. ;MOVMF, SQR und FACSTR sind ROM-Routinen die teilweise
    28. ;GEOS-Register für die Funktionen nutzen und zerstören.
    29. ;MOVMF mindestens $22/23 = curPattern
    30. ;Andere FLPT-Routinen zerstören auch die Register
    31. ; :baseLineOffset = $0026
    32. ; :curSetWidth = $0027
    33. ; :curSetHight = $0029
    34. ; :curIndexTable = $002a
    35. ; usw...
    36. lda #$00
    37. jsr SetPattern
    38. jsr UseSystemFont
    39. LoadW r0,FLTBUF
    40. LoadW r11,10
    41. LoadB r1,20
    42. jsr PutString
    43. cli
    44. clc
    45. jsr StartMouseMode
    46. jsr MouseUp
    47. jsr UpdateMouse
    48. ::loop1 lda mouseData
    49. beq :loop1
    50. ::loop2 lda mouseData
    51. bne :loop2
    52. jsr ClearMouseMode
    53. jmp EnterDeskTop
    Display All
  • Leider gibt es die float.h und die math.h nicht mehr für dieses Programm:
    Real-Zahlen und Funktionen im cc65 nutzen...zur Umsetzung

    Ich habe auch die Daten gesichert und wieder zurückgeschrieben für GEOS bei den Berechungen.
    Ich habe auch geschaut wo GEOS was stehen hat und die Floatroutine dort etwas benutzt.
    Das sind viele...und ist mühselig.
    Für den seltenen Anwender ist die Spielerei nichts.
    Darum haben damals die GEOS-Erfinder die Finger davon gelassen.

    Gibt es für das geoBasic irgendwo den Sourcecode?
    Vielleicht waren die Float bei geoBasic selbst gestrickt ohne in das Basic zu gehen.

    Danke.
    Gruss

    The post was edited 8 times, last by spacer ().

  • spacer wrote:

    Gibt es für das geoBasic-Programm irgendwo den Sourcecode?
    Keine Ahnung, glaube es aber nicht. Aber ich hab das D64 von hier verwendet (etwas nach unten scrollen). Da gibts auch ein paar zusätzliche Infos.

    spacer wrote:

    Darum haben damals die GEOS-Erfinder die Finger davon gelassen.
    Nein, für GEOS reicht doch in den meisten Fällen ganze Zahlen. geoCalc nutzt aber auch FLPT-Zahlen, es gibt da also Möglichkeiten. Evtl. haben die aber die Routinen auch nachgebildet.

    spacer wrote:

    Ich habe auch geschaut wo GEOS was stehen hat und die Floatroutine dort etwas benutzt.
    Das sind viele...und ist mühselig.
    Das könnte man ja optimieren

    Source Code

    1. _ramfac:
    2. jsr 48034
    3. rts
    Z.B. so

    Source Code

    1. _ramfac:
    2. PushW curPattern
    3. jsr 48034
    4. PopW curPattern
    5. rts
    Also wenn man die Routinen schon per JSR aufruft gleich noch die GEOS-Register sichern. Wäre ein Weg... setzt aber voraus das man wirklich alle Register findet. Ansonsten:

    Source Code

    1. _ramfac:
    2. jsr SaveGeosData
    3. jsr 48034
    4. jsr LoadGeosData
    5. rts
    SaveGeosData sichert die gesamte zeroPage in einen internen Buffer. Aber auch das könnte man, bei Verwendung einer zentralen Sprungtabelle, noch optimieren.

    Die GEOS MemoryMap findet sich u.a. hier.
  • spacer wrote:

    Wo hast du die denn ausgegraben : jsr SaveGeosData
    Die finde ich nicht.
    Das war nur ein Beispiel, die Routine musst Du schon selbst schreiben. Ist ja nun aber kein Hexenwerk.

    Source Code

    1. :SaveGeosData
    2. ldx #$00
    3. :loop
    4. lda zpage,x
    5. sta geosDataBuffer,x
    6. inx
    7. bne :loop
    8. rts
    9. :geoDataBuffer s 256
    LoadGeosData darfst Du selbst schreiben ;)

    Je nach Routine die man hinterher aufruft muss man ggf. noch den AKKU/YREG vorher sichern (z.B. für MOVMF). Aber dazu bräuchte man erstmal eine Übersicht welche Routinen es gibt, welche Parameter die benötigen usw... Danach kann man entscheiden was die beste Lösung ist. Evtl. gibt es mehrere Varianten:

    Routinen die nur eine Adresse von GEOS ändern, da würde ein lda curPattern/pha reichen.
    Routinen die mehrere Adressen verändern würden dann SaveGeosData verwenden.

    Das erste ist schneller, aber nicht für alle Routinen. Variante#2 ist langsamer, aber für mehrere Routinen zu verwenden.

    Du siehst: Im voraus zu entscheiden was das beste ist geht nicht. Erst muss die Dokumentation der Routinen her damit man sieht welche Register verändert werden.
  • wweicht wrote:

    Blöder Link .

    Besser : zimmers.net/geos/geodev.html
    Da sucht man sich ja den Wolf bis man die Liste findet ;)
    MegaAss ist da klar besser, aber das hat in der Vergangenheit nicht viel geholfen. :whistling:

    Der Vorteil bei zimmers (wenn auch nicht immer korrekt, z.B. r15=unused, ok, vielleicht im Kernal) ist das bei einigen Registern, die beim MegaAss nicht aufgeführt sind, etwas dazu erklärt wird. z.B. $45-$6F. Im Teil B von MegaAss fehlt das komplett.

    Vielleicht sollte man die zimmers-Liste mal auf Deutsch übersetzen und aktualisieren... Mal sehen wie ich Lust dazu hab. :D