Eigene Funktionen ohne BIOS Int's



  • Das Ergebnis dieser Rechnung ist das Offset im Bildschirmpuffer, gehoert also zu di.
    Und das Speicheroffset muss nicht nach jeder Zeichenausgabe neu berechnet werden. Wenn du zB. einen String ausgeben willst reicht so was hier:
    ;laenge des Strings = cx Farbe = ah Pointer zum String = ds:si
    ;di zeigt in den Bildschirmpuffer es=B800
    TextLoop:
    lodsb ;Zeichen vom String laden
    stosw ;ah=Farbe al=Zeichen => in Bildschirmpuffer schreiben
    loop TextLoop

    di solltest du moeglichst oft vor der Textausgabe direkt setzen, also eine fixe Zahl in den Code schreiben.
    zB.
    mov di,00A2h ;Zeigt bei 80*?? Zeichen in die 2. Zeile zum 2. Zeichen (x=1 y=1)



  • Moment, moment ... :-).
    Irgendwie bin ich mittlerweile mehr verwirrt als "geholfen".
    Also wenn ich in si den Text habe den ich ausgeben will, was muss ich dann machen, aber so das X und Y mitgezählt werden.



  • *lol* dabei ist das doch eigentlich ganz furchtbar simpel :p
    Einfachste Methode:
    irgendwie besagte Rechnung ausfuehren "(80*y+x)*2" und das Ergabnis in di platzieren.
    es = B800 setzen
    ah = Farbe setzen
    ds:si zeigt wie gesagt auf den Text
    und dann diesen kurzen code ausfuehren:

    TextLoop:
    lodsb ;Zeichen vom String laden
    stosw ;ah=Farbe al=Zeichen => in Bildschirmpuffer schreiben
    loop TextLoop
    


  • Kann man die besagte REchnung irgendwie so machen ?

    mov ah,[x]
    inc ah
    mov [x],ah
    mov al,80
    mov bh,[y]
    add ax, [x]
    xor ah,ah
    mov al,2
    mul ax
    mov di,ax
    


  • sorry, aber hae??
    Falls es dir noch net aufgefallen ist: egal welchen Wert du fuer x oder y einsetzt, nach deiner Rechnung kommt hinten immer 4 raus.

    Und ueberhaupt: wenn du schon nur die Haelfte der Funktionen dieses Interrupts kopierst (keine Cursor verschiebung, Controll codes werden nicht beachtet) warum willst du dann trotzdem die Form dieser Interruptfunktion beibehalten und mit dieser Proc immer nur ein Zeichen ausgeben? 😕

    aber egal: hier so ungefaehr das, was deine Rechnung da vermutlich machen sollte:

    xor ax,ax
    mov al,[y]
    mov di,ax
    shl di,06h ;y*64
    shl ax,04h ;y*16
    add di,ax  ;(y*64)+(y*16) macht y*80
    xor ax,ax
    mov al,[x]
    inc [x]
    add di,ax  ;y*80  +x
    add di,di  ;((y*80)+x)+((y*80)+x) => (y*80+x)*2
    


  • Naja ich lerne gerade erst Assembler.



  • Da du anscheinend noch ziemlich am Anfang stehst: lass dich bloss nicht von solchen gar schrecklichen Formeln abschrecken 🙂

    Und nimm nach Moeglichkeit etwas Abstand davon, fuer Kleinigkeiten, wie einzelne Buchstaben ausgeben oder Pixel nach x/y setzen, eine eigene Proc zu schreiben, des bringts einfach net 😉



  • Ja werd ich erstmal machen, aber das eigentliche Problem was ich hatte ist das die BIOS Funktion BX benutzt. Da ich aber noch Assembler lerne benutze ich immer noch C und linke die dann. Aber mein Compiler benutzt BX für seine String Operationen und dann kommt der schon mal "durcheinander". Wenn ich aber BX auf den Stack leg und nach der Ausgabe wieder zurück hole steht nur ein lustiges Zeichen mischmasch aufm Bildschirm und es piept auch.



  • Schon merkwuerdig 😕
    kannst du denn bx nicht einfach in zB. dx oder di o.ae. ablegen?



  • Ich galub ich hab das Problem gelöst. Das Probelm war whol der Turbo C Compiller. Jedenfalls geht es mit der C++ Variante besser.


Anmelden zum Antworten