Hercules-Grafik am XT programmieren

  • Hi, ich bin ganz am Anfang und habe noch keine Erfahrung mit programmieren. Dennoch würde ich gerne damit experimentieren und brauche dazu Hilfe von jemandem, der sich da wirklich auskennt.
    Ich würde gerne am XT 8088 ein wenig mit der Hercules-Grafikkarte experimentieren. Ich habe auch Code der dazu verwendbar ist, aber ich bekomme den nicht zum Laufen und ich weis nicht wieso.


    Könnte da jemand mit ein wenig Erfahrung ggf. unterstützen?


    Danke Euch
    Gruß
    Euer Doc

  • Ich habe mir den ein oder anderen Assembler angesehen. Da ich auf einem Euro-PC coden will, brauche ich eine schmale Software die relativ einfach zu bedienen ist und somit gut auf dem EuroPC läuft.
    Der TASM 1.02 gefällt mir da im Handling extrem gut. Der ist sehr schmal, besteht nur aus einer 70KB Datei und ist von 1984/1985. Den gibt es bei VETUS als DL.


    Zitat

    Turbo Assembler was developed as "Turbo Editasm" by Uriah Barnett from Speedware Inc (Sacramento, CA) between 1984 and 1987. It was later sold to (or marketed by) Borland as their Turbo Assembler.


    Worüber ich aber gestolpert bin ist, dass anscheinend die Assembler nicht 100% identische Funktionen/Funktionsaufrufe habe. Sowas ist für mich natürlich tödlich, da ich mich gar nicht um das eigentliche zu erstellende Programm kümmern kann, da ich nicht weis, warum der Assembler den Code nicht frisst, obwohl er auf die Maschine (XT/Hercules) zugeschnitten ist. Erst wenn der Code sauber läuft, kann ich mich auch um das zu erstellende Programm kümmern.


    Das bedeutet im ersten Schritt, muss ich wissen, welche Befehle mit welchem Assembler gehen und welche eben nicht. Da ich mich ja quasi für den TASM102 schon entschieden habe brauche ich jemanden, der mir sagt, warum einzelne Segmente des Codes nicht laufen und wie man das korrigiert. Da es sich nur um kleine Programme handelt, dürfte das für einen Profi vermutlich kein großes Problem sein. Leider geht das eben im Selbststudium nicht ganz alleine.


    Im Grunde will ich das mal so zusammenfassen. Die Ziele sind:


    1. Zwei Hercules DemoCode's zum laufen zu bewegen.
    2. Einen Starfieldcode für CGA auf Hercules "umzubiegen" (Der CGA-Starfieldcode läuft mit CGA-Emulator auf Hercules, also sollte er auch nativ laufen)


    Wie schätzt Ihr das ein? Ist das eine realistische Vorgehensweise?


    Danke Euch
    Doc

  • Hi.


    Keine Ahnung ob dir das hilft.. bei meinen Streifzuegen durch 6502/Z80/x86 Assembler bin ich immer wieder darauf gestossen, das es keinen Standard für Assembler gibt :(
    Die CPU Nemonics sind schon fast identisch: LDA #3 sieht überall? gleich aus.. aber gerade die 'anderen' Anweisung, welche den Assembler betreffen und nicht direkt die CPU wie z.B. start des Codes sind überall unterschiedlich: Mal org 100, mal * = 0x100, mal .org 100h etc. pp. Das geht weiter über db, .db, define byte...
    An diesen Stellen muss man ggf. anpassen von einem zum anderen Assembler... noch etwas schwieriger kann es bei Macro-Assemblern / Code werden..


    Peter

    github.com/petersieg

  • Weißt du denn für welchen Assembler dein Beispiel-Code geschrieben wurde?
    Die bekanntesten und damit auch am meisten verbreiteten waren schon der
    TASM und der MASM (=M$-ASM). Der MASM war bei manchen DOS-Versionen dabei.

    Das Genie beherrscht das Chaos

  • Jein, sagen wir mal so. Ich habe den Beispiel-Code für die Hercules-Programmierung in dem TASM1.02 erfasst.
    Der meckert quasi über jede Zeile. In dem Beispiel-Code steht drin "IBM Macro Assembler". Aslo hab ich den
    installiert, aber auch da kommen nur Fehler die ich nicht deuten kann. Eventuell werden da X86 vorausgesetzt
    und ich habe ja nur 8088 bzw. Nec V20, nur steht davon in den Beispielen nix drin.


    Ich werde mal die Sachen später hier zur Verfügung stellen.

  • Erstmal danke für das Feedback. Wie versprochen die ersten Infos. Hier habe ich den Code gesehen: https://archive.org/stream/byt…ftware#page/n343/mode/2up
    Den habe ich dann in TASM erfasst (HGCTEST.ASM). Die Bilder sind nicht vollständig. Ich habe mal die ersten beiden und die letzte Seite der Fehlermeldungen angefügt. Pass-One läuft durch bei Pass-two- kommen die dann der Reihe nach.


    Habt Ihr einen Tipp für mich, was da das Problem ist?


    Danke und Gruß
    Doc

  • Meinst Du mit erfasst abgetippt? Wenn ja: Respekt, die Geduld hätt ich heute nicht mehr...
    Eine erste Auffälligkeit ist, dass Du zwischen den Parametern einen Punkt hast, da gehört
    aber ein Komma hin (1. Bild, 2. Fehler, mov ah.0 => mov ah,0) und das (leider) überall.
    Die Macro-Definitionen sind stark vom Assembler-Programm abhängig, weshalb dein wait macro
    fehlschlägt.

    Das Genie beherrscht das Chaos

  • Ichhab im Netz nochmal nach Macros für TASM geschaut und das gefunden:

    Code
    MACRO macro_name optional-parameter-list
          statements
    ENDM  macro_name
    
    
    MACRO Movw  word1,word2
          push [word2]
          pop  [word1]
    ENDM Movw

    Das Genie beherrscht das Chaos

  • Also aus

    Code
    video  macro   func
             mov      ah.func
             int 0h
    endm


    wird dann für TASM

    Code
    macro video func
       mov ah,func
       int 0h
    endm video

    Das Genie beherrscht das Chaos

  • Meinst Du mit erfasst abgetippt? Wenn ja: Respekt, die Geduld hätt ich heute nicht mehr...
    Eine erste Auffälligkeit ist, dass Du zwischen den Parametern einen Punkt hast, da gehört
    aber ein Komma hin (1. Bild, 2. Fehler, mov ah.0 => mov ah,0) und das (leider) überall.
    Die Macro-Definitionen sind stark vom Assembler-Programm abhängig, weshalb dein wait macro
    fehlschlägt.


    Mist, das habe ich bei meiner Ausdrucksvorlage nicht mehr erkannt. Ich hatte das als "." interpretiert.
    Ich korrigiere das und versuche mich an der Korrektur der "macro-Funktion". Danke sehr!

  • Hm, ich denke ich habe die offensichtlichen Korrekturen gemacht. Wenn ich den Code jetzt ausführe, dann bekomme ich gleich bei Pass1 die Fehlermeldungen, dass ich "VIDEO" mehrfach definiert habe. Das zieht sich dann für alle definierten Dinge entsprechend fort. Habe ich Deine Hinweise nicht richtig umgesetzt?


    Danke
    Doc

  • Ich seh da aber noch sehr viele Punkte 8-)

    Code
    ;Zeile 26 und alle anderen Macrodefinitionen
    macro	plot	x.y
    ;Zeile 100
    fill	359.173

    Das Genie beherrscht das Chaos

  • Richtig, die habe auch auch korrigiert nach dem ich nochmal im Netz gelesen habe.
    Das Ergebnis ist aber das gleiche, mit oder ohne Punkte spuckt TASM102 die gleiche
    Anzahl an Fehlern aus. :(

  • Also irgend wie hat das nicht gestimmt. Ich habe anderen Code probiert und da zickt er mit dem "macro" nicht so rum. Also habe ich alles wieder zurück geändert und es bleiben nur noch ganz weniger Fehler übrig :)
    Jetzt muss ich "nur" noch diese beseitigen. Wie Du gemerkt hast, ist irgendwas bei der "wait" Geschichte nicht in Ordnung.


    Daneben habe ich Scali's Timing-Programm mit folgendem Ergebnis laufen lassen:

  • Hmmm, also ich hab noch ein bisschen rumgesucht und gefunden, dass der TASM auch MASM-Syntax unterstützt.
    Deshalb sollte

    Code
    foo macro
    endm


    und auch die TASM-Syntax

    Code
    macro foo
    endm


    gehen.


    In den TASM Beispielen steht statt


    dieses

    Code
    CODESEG
      start:
            STARTUPCODE
    ;...
            EXITCODE
    end start


    Wobei ich nicht weiß, ob STARTUPCODE und EXITCODE tatsächlich Macros von TASM sind oder nur vom Autor vorgeschlagene
    Init- und Aufräumroutinen.


    Warum in Deinem Beispiel mit

    Code
    SSEG    SEGMENT STACK
    	DW	32
    
    
    SSEG    ENDS


    irgendwas auf dem Stack vorbelegt wird ist mir allerdings ein Rätsel. Auch das Ablegen von DS und 0 auf dem Stack am Anfang
    des Programms ist mir schleierhaft. Verwendet mir das mE nicht.



    Schau mal hier http://andremueller.gmxhome.de/strukprg.html

    Das Genie beherrscht das Chaos

  • Das ist doch Mist! (Scali 8088mph) meint der Code macht eigentlich gar nichts und es bedarf weiterer Dinge um damit was anzufangen (GrafX).
    Ich hatte den Artikel im Byte-Magazin offensichtlich nicht verstanden. Mein Einstieg in Hercules-Grafik-Programmierung steht somit unter keinem
    guten Stern...

  • Scali hat nochmal nachgelegt und mir mitgeteilt, dass aufgrund von keinem Bios Hercules die wohl schwierigste Assimilierung bedarf, weil die Chips direkt angesprochen werden müssen.
    Das hätte ich gar nicht erwartet. Ich dachte VGA wäre die größte Herausforderung...leider falsch gedacht...ich glaube der "kurze" Ausflug ist auch schon wieder beendet. Ich kann mir
    nicht vorstellen, dass hier noch etwas rauskommt. Ich werde noch ein wenig probieren...aber das Projekt erstmal beenden.


    Der im Nachgang eigentliche Code für das Starfield mit CGA dürfte die Bios-Routinen nutzen die mir unter Hercules gar nix bringen, da die dann gegen Direktzugriffe getauscht werden
    müssen. Daher ist hier wohl Ende und ich muss es bei CGA-Emulator belassen...leider...

  • Hmm, das Programm ist vielleicht auch ein ungeschicktes Beispiel.
    Der Grafikmodus (macro gmode) wird über die Funktion 40h der
    Int-Routine 10h gesetzt. Die kann ich aber nirgends finden. ich kenne
    nur die Funktion 0h. Aber es stimmt wohl, dass die Grafikprogrammierung
    einer HGC (Hercules Graphics Card) über Steuerregister erfolgt.
    Zur Grafikprogrammierung wird aber sowieso von BIOS-Routinen
    abgeraten.
    Hier https://www.tu-chemnitz.de/inf…rafik/programmierung.html
    steht was zur HGC.
    Das umschalten (nicht getestet) sollte mit

    Code
    outb 3b8h,1


    passieren. Danach kann der Bildschirmspeicher direkt ab b000:0000 beschrieben werden. 1 Bit pro Pixel.


    Nur zur Sicherheit: Du hast eine HGC oder einen MDA. HGC kann Grafik, MDA nicht. Der Monitor ist der gleiche.


    Ich hab meine ersten Gehversuche in x86 Assembler übrigens mit dem netten DOS-Programm debug
    gemacht. Da fällt das ganze Gedöns mit Segmenten und Macros weg. Einfach ab CS:100h Code reinhacken,
    Zieldateigröße setzen und als .com Datei speichern.

    Das Genie beherrscht das Chaos

  • DANKE! für den Link, das sieht interessant aus!


    Ist ein MM12 MDA und Grafik. Siehe:
    https://www.youtube.com/watch?v=-T_Ay3ZWYKQ https://www.youtube.com/watch?v=nhcW2MNL7Zo


    Danke und Gruß
    Doc

  • Das ist jetzt nur so ein spontaner Gedanke,
    aber warum versuchst du nicht mal Qbasic um ein paar kleine Sachen zu programmieren?
    Qbasic unterstützt die Hercules Auflösung wenn zuvor das Programm MSHERC.COM geladen wird.
    Kleiner Nachteil dabei ist halt das die MSHERC.COM immer beim entsprechenden Programm dabei sein muss, bzw vorher geladen werden muss.