Beiträge von BIF im Thema „TRICKS mit ROM-RAM“

    GEWINN 1024 Bytes mehr Basic-Programmspeicher

    Hier noch mal der AHA-Code mit dem ich im Zusammenhang mit ROM-RAM das gesamte Basic-Programm um 1 kB nach unten schiebe. Hierbei lösche ich lediglich Zeile 1 und schiebe damit das gesamte Programm um 1 kB nach unten an den vorherigen Bildschirmanfang.

    820 :ifpeek(44)=4then:return

    821 :poke210,4:poke44,4:print"@aha@[home]1[runter]pO46,"peek(46)-4":rU[home]";

    822 :poke631,13:poke632,13:poke198,2:sys42107

    Die Funtion ist relativ einfach: Der PRINT-Befehl schreibt ein Nullbyte, die Verbindungsadresse und Zeilenadresse auf den Bildschirm(1024), danach wird dann Zeile 1 gelöscht und die Endadresse des PRG´s korrigiert.

    Damit zeigt sich ROM-RAM mal wieder als Alleskönner.
    1. Mehr Grafikspeicher 16 kB

    2. Mehr Hauptspeicher 1kB
    3. Mehr und verbesserte Basic-Befehle durch ein Basic-Update, z.B. RAM-BASIC/3.

    Schönen Gruß.

    Zu RAM-BASIC/3:
    Damit sind schon super viele Tricks möglich sogar laden von Strings in einen gewünschten Speicherbereich ist möglich, da mit :poke adresse:get*a$,länge: der Ladebereich für Strings bis 255 Zeichen selbst gewählt werden kann. Mit poke adr,a$: kann man jeden Speicherbereich löschen oder mit Strings füllen. Auch ein Kopieren von Speicherbereichen ist möglich, da die Stringparameter mit :a$=$(#adr,länge): selbst gesetzt werden können.


    Auch wenn RAM-BASIC/3 noch nicht alles hat, hat es doch meiner Meinung nach schon den Anspruch des Alles könners. Die Befehlskette ist natürlich noch beliebig erweiterbar. Z.B. im freigeworden Bereich von 1024-2047.
    Oder man kann das Basic mit Maschinencode-Strings :sys befehl$: weiter erweitern.

    Schönen Gruß.

    NHeusler:
    Gruß an Nikolaus Heusler, dein Name ist mir auf jeden Fall noch aus den 64er Zeiten bekannt.
    So weit ich mich erinnere hast du seinerzeit den Diskfüller programmiert.

    Ansonsten würde es mich natürlich auch interessieren, wenn du erzählen könntest, was für Basic und andere Programme du veröffentlicht hast.

    Schönen Gruß.

    RAM-BASIC/3-Basic-Befehlserweiterung

    Bitte melde dich an, um diesen Anhang zu sehen.

    Hallo, hier habe ich mit RAM-BASIC/3 einmal versucht alle bestehenden Probleme mit BasicV.2 zu lösen.
    Gleichzeitig wird natürlich die Frage beantwortet, was so alles reformmäßig möglich ist, wobei ich mich natürlich nur auf die Verbesserung des BASIC-ROMs ohne KERNAL-ROM beschränkt habe.

    RAM-BASIC/3 bietet:
    Fehlermeldungen mit Basic-Befehlen
    Ketten-Poke mit 1Byte, 2Byte und Strings
    Systemvariablen: z.B. @x,@y,@z für X-Position, Y-Position, Zeilenlänge, Basic-Zeilenadresse, usw.

    1 Byte und 2 Byte-Peek: %(),%%()

    Input : Zeileneingabe mit Sonderzeichen
    get : mit Längenangabe
    Print [x,y,z]: mit Cursorsetzen
    Load : Adresse und Load mit RUN
    Open: ohne close

    Strings: Stringadresse, Ketten ASC und Stringparameter setzen.

    GO : mit direktem Adress-Sprung
    STOP: Cursor einschalten und auf Taste warten
    und einiges mehr.

    Schönen Gruß.

    RAM-BASIC/2

    Bitte melde dich an, um diesen Anhang zu sehen.

    Und hier kommt RAM-BASIC/2 mit weiteren interessanten BASIC-ROM Änderungen,

    wie das


    Ketten-POKE: poke2,2,3,4:printpeek(2)peek(3)peek(4)

    String-Adresse: a$="a": printa$,abs(a$): sysa$

    GET : geta$,a,a%:

    LOAD : load"name",8,adr

    OPEN : open1,3:open1,3:
    MAL : Korrektur der Multiplikation
    GO : Cursor-Setzen

    Hier wird gezeigt, was mit ein paar relativ kleinen Änderungen des Basic-ROMs alles so möglich ist.
    Fehler wie bei GETa: sind völlig überflüssig, mit ein paar Pokes kann get auch alle Variablen verarbeiten, dabei ohne Verlängerung des Maschinen-Codes.
    Mit der Erweiterung des Interpreters um die STRING-ADRESSE bekommt man den Direkt-Zugriff auf Strings und zusätzlich eine Schnittstelle zur Maschinensprache.
    mit :sys s$: kann man eine Basic-Befehlserweiterung in Strings programmieren und komfortabel einbinden.
    Auch das KETTEN-POKE erleichtert, vereinfacht und beschleunigt das Basic erheblich.
    Statt :pokea+1,b/256:pokea,b-peek(a+1)*256:
    tippt man einfach: pokea,b,b/256:
    Auch ein LOAD-ADRESSE ist relativ einfach einzubinden:
    :load"name",8,adresse
    Und natürlich ist auch die Fehermeldung beim OPEN-Befehl völlig überflüssig, wenn man den Kanal vor Ausführung automatisch schließt.
    Auch das verkürzt den Basic-Quelltext und macht Basic-Programme weniger fehleranfällig.

    Schönen Gruß.

    FCIII sagt mir so nichts, da ich es nicht habe.
    Grundsätzlich kann man den Code auch in anderen Speicherbereichen installieren.
    z.B. im Kassettenpuffer und falls erforderlich auch mit :sys(p)a,b,b,b: aufrufen.

    Ansonsten wäre als erstes die Frage, welche Konfig FCIII aktiviert.

    Also welcher Wert in Speicherstelle 1 steht.

    Schönen Gruß.

    ROM-RAM-TRICK
    TASTENBELEGUNG ÄNDERN:

    Die Felder für die Tastendekodierung befinden sich natürlich im ROM-Code und haben eine Länge von 65 Byte:

    Tastenfeld-Adressen: 60281,60283,60285,60287

    Norm-Tasten : 60289

    Shift-Tasten : 60354

    CBM-Taste : 60419

    CTRL-Tasten : 60536

    peek(203): Tastencode der gedrückten Taste

    peek(654): Shift/CBM/CTRL-Taste

    peek(655)ßpeek(656)*256: Adresse der Tastendekodier-Routine

    z.B. poke655,118: Dekodierung aus.


    Mit den oben angeführten Adressen kann die Tastenbelegung im RAM direkt geändert werden oder man verbiegt die Vektoren für die Tastenfelder ab 60281.
    Man kann aber auch mit dem Vektor(655/656) eine anderes Tastendecodierprogramm einbinden.

    Schönen Gruß.

    Ja, das Füllen mit Nullen, ist für die Kopier-Routine.
    Damit wird der Startzeiger auf 0=65536 gesetzt.
    Ansonsten kann der Nuzter die Konfig mit poke :1,48: bis :poke1,53:poke1,54 oder poke1,55: frei wählen.
    Bei poke1,53 kann man auch das Kernal-ROM ändern.
    Mit poke1,54 werden nur die Änderungen im BASIC-ROM benutzt/angeschaltet.
    Daher kann man die obernen 16 kB dann auch für Grafik oder sonstiges nutzen.
    Bei poke1,53 kann man nur die ersten 3kB ab 49152 frei nutzen. z.B. für einen Zeichensatz oder Sprites.

    Schönen Gruß.

    Hallo, ich glaube mal in dem Listing ist ein Fehler.

    In Zeile 11 sollte ein :poke1,54: stehen.
    Mit poke1,54 oder poke1,53 wird das RAM-BASIC eingeschaltet.

    10 :poke56334,.:poke1,51:fori=88to91:pokei,.:next:poke781,97:poke782,.:sys41971

    11 :poke1,54:poke648,204:sys65374:sys58692:poke56576,4:poke53272,54

    12 :print"basic-erweiterung":poke43039,122:poke43041,0:poke43043,123:restore

    13 :a=48979:fori=atoa+18:readb:pokei,b:next:sys(a)41018,82,191

    14 :data32,36,184,32,6,226,132,9,32,155,183,138,164,9,200,145,20,208,240

    Schönen Gruß.

    TurboMicha: Ja, mit ROM-RAM kann man praktisch alles machen, was man in der Standard-Konfig nicht machen konnte.
    JeeK: Interessante Seite.

    Die Vorteile des Ketten-Pokes sind natürlich die hohe Geschwindigkeit im Vergleich zu READ-DATA, die Code-Ersparnis, die einfache Handhabung und gute Lesbarkeit. Mit dem Ketten-Poke eröffnen sich natürlich für den Basic-Programmierer viele neue Möglichkeiten.

    1. Schnelles und einfaches 2-Byte-Poke.
    z.B. :pokea,b,b/256

    2. Schnelle Installation von Maschinen-Codes:
    z.B. :a=512:pokea,234,234,96:sysa

    3. Schnelles installieren von Zusatz-Zeichen:
    z.B. :pokea,1,2,3,4,5,6,7,8

    4. Schnelle Sprite-Installation

    5. Schnelles Poken von Grafik-Elementen.


    6. Einfaches Farb-Poken:
    co=53280:pokecolor,0,1,2,3,4


    7. Geschwindigkeitsgewinne beim Sprite-Setzen.

    8. Und auch bei SID-Pokes.


    Schönen Gruß.

    ROM-RAM: BEFEHLS-ERWEITERUNG

    KETTEN-POKE

    10 :poke56334,.:poke1,51:fori=88to91:pokei,.:next:poke781,97:poke782,.:sys41971

    11 :poke1,55:poke648,204:sys65374:sys58692:poke56576,4:poke53272,54

    12 :print"basic-erweiterung":poke43039,122:poke43041,0:poke43043,123:restore

    13 :a=48979:fori=atoa+18:readb:pokei,b:next:sys(a)41018,82,191
    14 :data32,36,184,32,6,226,132,9,32,155,183,138,164,9,200,145,20,208,240

    Damit findet dann der Übergang zu RAM-BASIC/2 statt.
    Statt der Installation mit READ:DATA kann man dann die Binärwerte direkt ins RAM poken, was um einiges schneller und einfacher ist.

    Syntax: poke 2,2,3,4,5

    oder bei 2 Byte: pokea,b,b/256: (in Kombination mit RAM-BASIC/1)

    Schönen Gruß.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.:

    Test:
    :A=16777217:?10*A,A*10


    Schönen Gruß

    ROM-RAM-TRICK
    SPRITES INSTALLIEREN:

    Folgendes Listing zeigt, wie man Sprites im Oberen RAM installiert.

    0 :goto10:---sprites im oberen ram

    10 :rem-rom/ram,schirm:52224,satz:53248

    11 :poke56334,.:poke1,51:forj=88to91:pokej,.:next:poke781,97:poke782,.:sys41971

    12 :poke1,53:poke648,204:sys65374:sys58692:poke56576,4:poke53272,54

    19 :

    20 :print"sprite-demo:"

    21 :vb=49152:va=53248:sp=peek(648)*256+1016:bk=0:s=0

    22 :a=vb+bk*64:fora=atoa+63:pokea,254:next:pokesp+s,bk:rem--install

    29 :

    30 :x=50:y=70:rem--sprite.setzen

    31 :a=va+s*2:pokea,x:pokeva+16,-(x>255):pokea+1,y:rem-set x,y

    32 :a=va+39+s:pokea,3:rem--farbe

    33 :pokeva+21,1:rem-sprite.an

    40 :wait198,7:geta$:pokeva+21,.:list10-


    Variablen:

    vb= Vic-Basis-Adresse = Spriteblock 0

    va= Vic-Adresse

    sp= Sprite-Pointer

    bk= Sprite-Block

    s= Sprite Nummer

    x= x-Position

    y= y-Position

    Natürlich kann man ROM-RAM und damit die oberen 16 KiloByte auch für Sprites nutzen.
    Zu beachten dabei ist nur, daß SpriteBlock Null nun bei vb=49152 beginnt.
    Und natürlich, daß die Sprite-Pointer Hinter dem neuen Bildschirm ab 52224, also ab Adresse 52224+1016 stehen.

    Man kann von Block.0 bis Block.47 48 Sprites installieren.
    Will man mehr Sprites muß man Konfig 1,54 oder 1,55 einschalten.
    Nun kann man natürlich auch noch die 8 KB ab 57344 (Block.128-Block255) für Sprites oder anderes nutzen.
    Die Länge der VIC-Bank ist 64*256=16384=16kB. Man kann mit ROM-RAM also theoretisch 256 Sprites nutzen.

    Schönen Gruß.

    RAM-BASIC-1
    BASIC-SPEICHER UND BEFEHLSERWEITERUNG

    0 :rem:--ram-basic/zusatz-befehle

    10 :poke56334,.:poke1,51:fori=88to91:pokei,.:next:poke781,97:poke782,.:sys41971

    11 :poke1,55:poke648,204:sys65374:sys58692:poke56576,4:poke53272,54

    12 :print"basic-erweiterung":poke43039,122:poke43041,0:poke43043,123:restore

    13 :fora=65535toa:readb:ifb>=0andb<256then:pokea,b:next

    14 :a=b-1+abs(b<0)*9e4:print".";:next:poke1,54:list10-19:end

    15 :data45178,1,46991,5,48200,56,45517,,47010,206,47015,,43317,165

    16 :data42773,174,167,43029,32,235,183,164,20,76,12,229

    19 :data-1

    Hier habe ich mal die System-Pokes aus den vorherigen Beiträgen zu einem Programm mit DATA-Lader zusammengefasst.

    Damit hat man dann schon die Basic-Speicher- und Befehlserweiterung.

    Das Programm korrigiert die Speicherkonfiguration des C64 und dazu gibt es noch eine Befehls-Erweiterung bzw. Befehls-Korrektur bei


    ON GOTO
    VERGLEICHE
    ASC()
    INTEGER, AND,OR,NOT
    FRE()
    POKE
    THEN
    LIST
    RESTORE
    GO x,y - CURSORSETZEN

    Schönen Gruß.

    Stephan Scheuer:
    Das ist genau richtig. Die ROM-RAM-Kopie findet in Zeile 11 statt.
    Danach kann man 1 auf 54/53 setzen und BASIC+KERNAL wird nun aus dem RAM gelesen, wo man es dann modifizieren kann.

    Was man für die ROM-RAM-Tricks braucht ist ein ROM-Listing und eine MaschinenCode-Befehlstabelle.
    Und schon kann es losgehen.

    Schönen Gruß.

    Kosmas:
    Ich bin natürlich Besitzer eines ROM-Listings aus dem Buch C64 Intern, das bei mir schon leicht auseinanderfällt, bzw. in zwei Teile zerbrochen ist.
    Machinencode programmiere ich gewöhnlich ohne Assembler rein nach Code-Tabelle aus dem 64er Assembler Sonderheft in DATA-Zeilen.
    Das Blatt fällt aber auch so langsam auseinander und müßte ich mal einscannen, so lange es noch geht.

    Nach dem Programmieren von ROM-RAM hab ich mich dann natürlich auch für die Möglichkeiten interessiert, mit Poke´s das Betriebssystem zu optimieren.

    Für den Basic-Programmierer ist das ja ein höchst interessantes Thema.

    z.B. wie man die ROM-Routinen von Basic aus nutzen kann.
    Und natürlich auch wie man mit Pokes das Betriebssystem optimiert.
    ROM-RAM ist da ja praktisch das Eldorado für den Basic und Maschinensprache-Programmierer. Damit werden ja circa 20kB ROM-CODE ins RAM kopiert, die man dann theoretisch alle mit Poke´s modifizieren kann.

    Das öffnet ja praktisch unzählige Möglichkeiten und ein riesiges Experimentierfeld, auf dem man sich betätigen kann.
    Da das meiner Meinung nach ein großes Thema ist, hab ich dann natürlich diesen Thread eröffnet.


    Schönen Gruß.

    BASIC-SYSTEM-POKE:
    CURSOR SETZEN MIT GO.

    10 :rem-rom-ram,schirm:52224,satz:53248

    11 :poke56334,.:poke1,51:forj=88to91:pokej,.:next:poke781,97:poke782,.:sys41971

    12 :poke1,53:poke648,204:sys65374:sys58692:poke56576,4:poke53272,54

    19 :

    20 :fori=43029toi+7:readb:pokei,b:next:data32,235,183,164,20,76,12,229

    21 :go20,10:print"*"

    Oft wird bemängelt, daß dem Basic V2 ein Befehl zum Cursorsetzen fehlt.
    Das Programm in Zeile 20 wandelt den GO-Befehl in ein GO X,Y.

    Damit wäre dann auch diese Systemlücke gefüllt.

    Schönen Gruß.