Schlagwort-Archive: Zahlenspiele

Bubble Sort

Ich glaube das hier  funktioniert….

Bubble Sort Routine. Sortiert eine Feld von max 255 8- Bit Integern, aufsteigend.

Bubble Sort Routine.
Sortiert eine Feld von max 255 8- Bit Integern, aufsteigend.

Advertisements

Zahlenspielereien die Vierte

Die gute alte Highscore. Was täten wir nur ohne Sie. Die Highscore macht das Spiel erst zum Wettbewerb. Wie aber sage ich es meinem Computer in 6502 Assembler.

Ja, wie kann ich in 6502 Maschinensprache zwei beliebig große Zahlen miteinander vergleichen?

So geht’s:

Bildschirmfoto 2013-06-30 um 18.04.46

 War eine kleine Übung am Sonntag morgen. Hat jemand eine bessere Idee? Anregungen nehme ich gerne an!

Zahlenspiele (in 6502 Assembler). Es geht weiter…

..der im Folgenden verlinkte Artikel aus der Compute! Ausgabe 34 vom März 1983, zeigt wie die Eingabe von Zahlen programmiert werden könnte:

Zum Artikel

Die bisherigen „Zahlenspiele“ und wie man das in 6502 Assembler machen könnte finden sich hier im Blog, einfach dem Link folgen:

Zahlenspiele mit Retrozock 

Unter dem Schlagwort „Zahlenspiele“ finden sich Artikel mit Beispielen die zeigen, wie in Assembler 8/ 16 Bit Integer auf dem Bildschirm ausgegeben werden können. Die Artikel entstanden bei meiner Arbeit an „Diamonds“ (Projekt Rock).

Es galt zu ergründen, wie ich die aktuelle Punktezahl, Level, Leben usw. auf dem Bildschirm ausgeben könne. Es gelang!

Viel Spass!


Millionäre, oder: Zahlenspiele die Dritte

Es ist schon erstaunlich, wie einfach es ist, nahezu beliebig große Zahlen auf einem 8-Bit Maschinchen auf den Bildschirm zu bringen. 

Es wurde bereits eine Methode gefunden, mit der 8- Bit Integer <=255 in Assembler, aus dem Speicher, in ATASCII umgewandelt werden konnten. Vergleiche hier im Blog

Unter http://www.atarimagazines.com/analog/issue62/boot_camp.php    findet sich eine Erweiterung des vorgenannten zur Umwandlung von 16- Bit Integern. Damit können dann  Zahlen bis 65535 dargestellt werden.

Last but not least, noch ein Stück Source zur Umwandlung von 8- Bit Integern nach Hex, hier im Blog: „Die Basis 16“

Aber kann ich auch 1 Million? Natürlich:

1. Ziffer (n)=9?
 Ja=> Ziffer (n)=0, gehe zu 2
 Nein=>Ziffer (n)=Ziffer(n)+1, 
 2. Alle Ziffern?

Nein, n=n-1, gehe zu 1

ja, Ende!

Startbedingung: n=6

In Deutsche übersetzt funktioniert der oben geschriebene Pseudo- Code so:

  • Wir habe eine Zahl, die besteht aus 6 Ziffern. Wir beginnen mit der letzten Ziffer.
  • Ist diese Ziffer schon „9“?
  • Ja, dann setzte diese auf „0“ wenn nicht, erhöhe diese um eins.
  • Weiter zur nächsten Ziffer, und beginne das Spiel von vorne, bis alle sechs Ziffern abgearbeitet sind.
Nachteil: Möchte ich damit die Zahl „2560“ darstellen, dann muss ich die Routine auch 2560 mal durchlaufen. Für die Darstellung der erreichten Punktezahl in Spielen reicht es aber allemal. Riesiger Vorteil: Das ganze benötigt in 6502 Assembler gerade mal 62 Bytes! Geht’s noch kleiner?
Keine Raketenwissenschaft, sondern ganz einfach!



Zahlenspiele die Zweite: Basis 16

…Idee wurde Algorythmus,  Algorythmus zu Mnemonic und Mnemonic zum Programm…….

Passiert oft während einer langweiligen Zugfahrt oder in Wartezimmern von Ärzten, nicht nur spektakuläres, sonder auch oft ganz grundlegendes.

Die Umwandlung eines 8-Bit Integers nach ASCII zur Ausgabe auf den Bildschirm in 6502 Assembler zum Beispiel, schau einfach mal hier nach:  https://retrozock.wordpress.com/2012/04/07/zahlenspiele/

Gleiches Prinzip, die Umwandlung eines 8-Bit Integres nach Hex. Dezimale Zahlen gründen sich auf der Basis 10 und werden mittels der Ziffern 0 bis 9 dargestellt.

Hexadezimale Zahlen gründen sich auf der Basis 16 und werden mittels der Ziffern 0 bis F dargestellt. Für die Umwandlung eines 8-Bit Integres benötigen wir im hexadezimalen Zahlensystem 2 Ziffern. Stelle 1 ergibt die Potenz 16^1=16 und die zweite Stelle 16^0=1 (vgl. dezimal: 10^2=100, 10^1=10, 10^0=1).

Wir fragen uns nun , wie oft kann ich von meiner Zahl, sagen wir der 169, die 16 abziehen? 10 mal, Rest 9!

Damit ist die erste Ziffer unserer gesuchten Zahl (hex) die 10, also A.

Weiter mit dem Rest. Wie oft kann ich von der Neun die 1 abziehen? Neun mal, Rest 0!

Damit ist die zweite Ziffer unserer gesuchten Zahl (hex) die 9 => 169 (dez.)=A9 (hex).

Das nachstehende Progrämmchen macht’s vor:

* INTHEX.SRC
*
* WANDELT DEN IN "ZAHL" ENTHALTENEN
* INTEGER IN BILDSCHRIMZEICHEN UM UND
* GIBT DIESE AUF DEM BILDSCHIRM
* ALS HEX- ZAHL AUS
*
* ZAHL KLEINER ODER GLEICH 255!
*
* B.FRITZ 5.6.2012
*************************************

BILD    EQU 88   ADRESSE BILDSPEICHER
BILDH   EQU 89

        ORG $A800
* ANZAHL DER STELLEN UNSERER ZAHL
* UND ZEIGER AUF UNSERE TABELLE DER
* POTENZEN VON 16

        LDY #0
* ANZAHL DER SUBTRAKTIONEN BIS DAS
* ERGEBNIS >0 WAR

        LDX #0
* LOS GEHTS
        LDA ZAHL  ZAHL VORHER RETTEN
        STA ZAHLB
L1      SEC
        LDX #0
L2      LDA ZAHLB
        SBC POW,Y
        STA ZAHLB
        BCC NULL  ERGEBNIS<0
        INX       ERGEBNIS>0 D.H.
        BCS L2    WEITER

NULL    LDA ZIFF,X      EREBNIS<0
        STA (BILD),Y    ZIFFER AUSG.

        LDA ZAHLB       ZAHL>0 MACHEN
        ADC POW,Y
        STA ZAHLB

        INY       NAECHST NIEDR.
        CPY #2    16ER, ALLE STELLEN
        BNE L1   DURCH?

BRK             JA!

*
* EINIGE DATEN
*

* UNSERE ZIFFERN- ZEICHEN

ZIFF    ASC %0123456789ABCDEF%
* 16ER
POW      DFB 16,1
* DIESE ZAHL SOLL AUSGEGEBEN WERDEN

ZAHL    DFB 169

* ZWISCHENSPEICHER ZUM RECHNEN

ZAHLB   DFB 0

Zahlenspiele

Wie realisiert man die Ausgabe von Integer- Zahlen in 6502 Assembler? Eigentlich ganz einfach. Die Lösung:

Man stelle sich die Frage, wie oft kann ich von, sagen wir 1934, 1000 abziehen. Einmal, ganz klar. Man wiederholt das ganze für die 100-er die 10-er und die Einer und erhält so die Ziffern der Zahl. Ich habe das ganze für Integer kleiner gleich 255 realisiert. Zur Erklährung sollten die Kommentare im Source reichen.

Für 16 Bit Integer habe ich noch keine eigene Lösung. Einen fertigen Source dafür findet man bei: http://www.atarimagazines.com/analog/issue62/boot_camp.php   (ausführliche Beschreibung und weitere Tricks inklusive).

Anmerkung: Das nachstehende Programm enthält die Ziffern zur Ausgabe auf dem Bildschirm im Atari Bildschirmcode. Möchte man auf dem Atari Aschii- Zeichen direkt in in Bildschirmspeicher zur Ausgabe schreiben,so erhält man das richtige Ergebnis, indem man vom internen des Atari 32 abzieht!

* INTASC.SRC
*
* WANDELT DEN IN "ZAHL" ENTHALTENEN
* INTEGER IN BILDSCHRIMZEICHEN UM UND
* GIBT DIESE AUF DEM BILDSCHIRM AUS
*
* ZAHL KLEINER ODER GLEICH 255!
*
* B.FRITZ 6.4.2012
*************************************
BILD    EQU 88   ADRESSE BILDSPEICHER
BILDH   EQU 89
        ORG $A800
*
* ANZAHL DER STELLEN UNSERER ZAHL
* UND ZEIGER AUF UNSERE TABELLE DER
* VIELFACHEN VON 10
       LDY #0
*
* ANZAHL DER SUBTRAKTIONEN BIS DAS
* ERGEBNIS >0 WAR
*
        LDX #0
*
* LOS GEHTS
*
        LDA ZAHL  ZAHL VORHER RETTEN
        STA ZAHLB
L1      SEC
        LDX #0
L2      LDA ZAHLB        
        SBC POW,Y
        STA ZAHLB
* CARRY SETZEN!
* ANZAHL VERSUCHE=0
        BCC NULL  ERGEBNIS<0
        INX       ERGEBNIS>0 D.H.
        BCS L2    WEITER

NULL    LDA ZIFF,X      EREBNIS<0
        STA (BILD),Y    ZIFFER AUSG.

        LDA ZAHLB       ZAHL>0 MACHEN
        ADC POW,Y
        STA ZAHLB

        INY       NAECHST NIEDR.
        CPY #3    10ER, ALLE STELLEN
        BNE L1    DURCH?
        BRK       JA!
*
* EINIGE DATEN
*

* UNSERE ZIFFERN- ZEICHEN
ZIFF    ASC %0123456789%

ZIFF    ASC %0123456789%
* 10ER
POW     DFB 100,10,1
* DIESE ZAHL SOLL AUSGEGEBEN WERDEN
ZAHL    DFB 134

* ZWISCHENSPEICHER ZUM RECHNEN
ZAHLB   DFB 0