Autor Thema: Befehl zum Graphikspeicherrefreshen  (Gelesen 5860 mal)

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« am: 27. October 2013, 13:15 »
Muss man im Textmodus dem Computer irgendwie sagen, das man den Graphikspeicher geändert hat, weil bei mir ist es so, das qemu irgentwann einfach aufhört, den Text auszugeben.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. October 2013, 13:41 »
Nein, musst du nicht. Wo schreibst du denn hin, wenn Qemu aufhört, ihn auszugeben?

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 27. October 2013, 14:06 »
Naja ich bin ziemlich am Anfang, also bei der Textausgabe. Wenn ich im Hauptprogramm eine Funktion habe die "Hallo Welt" direckt in den Grafikspeicher schreibt, ohne den Bildschirm zu löschen, so funktioniert das. Wenn ich aber vorher noch eine Clear Screen funktion aufrufe, klappt es plötzlich nicht mehr. (Beide Programme verwenden nicht die gleichen Zeiger uä.)

Also die Cls-funktion klappt. (mit anderen Zeichen als Leerzeichen getestet.)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 27. October 2013, 14:10 »
Auch jemand, der keine Ahnung davon hat, könnte diagnostizieren, dass mindestens eine der beiden Funktionen was falsch macht. Um dir zu helfen, brauchen wir mehr Details (Code).
Dieser Text wird unter jedem Beitrag angezeigt.

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 27. October 2013, 14:17 »
Hab ja nix zu verheimlichen. Ist aber in FreeBASIC. Aber man kanns warscheinlich trotzdem lesen:

Das Hauptprogramm Init.bas
' Das selbe wie init.c nur jetzt in Freebasic
#include "console.bi"

extern "C"
sub init() export
clsc()

const hwStg = "Hallo world"
dim as integer i = 0
dim as byte ptr video = VIDEOPTR
dim as byte ptr hw = @hwStg
' ZStrings haben ein Nullbyte als Abschluss
' Ein paar Probeaufrufe
video[0] = &h25

video[344] = &h60
while hw[i] <> 0
' Zeichen i in den Videospeicher kopieren
video[i*2] = hw[i]
' 0x07 = Hellgrau auf Schwarz
video[i*2+1] = &h07
i += 1
'putchr(hw[i],&h07)
wend
'setcolor(2,0)
'kprintf("HelloWelt")
'kprintf("HexTest:%i", &h80000000)
'kprintf("NowInHex: %X", &h80000000)
end sub
end extern

Und die Textausgabe in console.bas
#include "console.bi"

' Der Screen befindet lässt sich linear mit Offsets ab 0xB8000 ansprechen.
' 0x07 = 0000 0111

extern "C"
dim shared as byte bgcolor  = &h07      ' Hintergrund: 0x07 = Hellgrau auf Schwarz
    dim shared as integer spos = 0              ' Prosition auf dem Bildschirm

declare sub scrolldown()
'declare function putChr(char as ubyte, colorS as ubyte) as integer
declare function printHex(i as integer, location as byte ptr) as integer
declare function printDec(i as integer, location as byte ptr) as integer

sub clsc() export
dim as integer i
dim as integer ptr p = VIDEOPTR
for i = 0 to 20*25*2 - 1
p[i] = &h07400723 ' Clean up space.
'putChr(&h23,&h07)
'putChr(&h40,&h07)
next i
spos = 0 ' Reset virtual cursor
end sub
....

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 27. October 2013, 14:26 »
Ich kann jetzt kein FreeBasic, deswegen muss ich über ein paar Auffälligkeiten spekulieren.

Ist hwStg wirklich ein ZString? Muss man das nicht explizit angeben?

Ist der Stack richtig eingerichtet? Es könnte nämlich sein, dass die clsc-Funktion einfach nicht mehr zurückkehrt.
Dieser Text wird unter jedem Beitrag angezeigt.

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. October 2013, 14:32 »
zu zString) Das funktioniert alles wenn man die clsc() Funktion auslässt.

zum Stack) Hoffe ich. Allerdings ist der init Funktion noch die _start() Funktion vorgeschaltet. Dies hab ich aus http://www.lowlevel.eu/wiki/Teil_4_-_Hello_World übernommen und sie wird auch aufgerufen.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 27. October 2013, 14:39 »
zu zString) Das funktioniert alles wenn man die clsc() Funktion auslässt.
Ohne die clsc-Funktion sieht man dann aber noch die Ausgaben vom BIOS, oder?

zum Stack) Hoffe ich. Allerdings ist der init Funktion noch die _start() Funktion vorgeschaltet. Dies hab ich aus http://www.lowlevel.eu/wiki/Teil_4_-_Hello_World übernommen und sie wird auch aufgerufen.

Ja, wenn du die Datei 1:1 übernommen hast, und auch das Linkerskript und den Linkeraufruf 1:1 dem aus dem Wiki entsprechen dann wird es das wohl nicht sein.
Dieser Text wird unter jedem Beitrag angezeigt.

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 27. October 2013, 14:48 »
Jo ohne das clsc() Sieht man noch den BIOS Text, aber das Hallo Welt drübergeschrieben.

Liegt das vielleicht daran, das ich qemu -kernel nutzte?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 27. October 2013, 15:01 »
Liegt das vielleicht daran, das ich qemu -kernel nutzte?

Sollte normalerweise kein Problem sein. Und selbst wenn dein Kernel nicht 100%ig kompatibel mit dem QEMU-Multiboot-Loader ist, (z.B. falsch gelinkte ELF-Binary), sollte das nicht passieren. Du kannst allerdings um da sicherzugehen mal objdump -x kernel.bin rüberlaufen lassen, und die Ausgabe hier posten. Ich glaube aber nicht, dass da was wirklich interessantes drin steht, deswegen würde ich da nicht zu viel Zeit drauf verschwenden.

Dieser Text wird unter jedem Beitrag angezeigt.

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 27. October 2013, 15:13 »
$ objdump -x kernel

kernel:     file format elf32-i386
kernel
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0010000c

Program Header:
    LOAD off    0x00001000 vaddr 0x00100000 paddr 0x00100000 align 2**12
         filesz 0x000005f4 memsz 0x000005f4 flags r-x
    LOAD off    0x00002000 vaddr 0x00101000 paddr 0x00101000 align 2**12
         filesz 0x00000070 memsz 0x00003000 flags rw-

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000005f4  00100000  00100000  00001000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         0000002c  00101000  00101000  00002000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .drectve      00000040  0010102c  0010102c  0000202c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  3 .ctors        00000004  0010106c  0010106c  0000206c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  4 .bss          00002000  00102000  00102000  00002070  2**2
                  ALLOC
SYMBOL TABLE:
00100000 l    d  .text  00000000 .text
00101000 l    d  .data  00000000 .data
0010102c l    d  .drectve       00000000 .drectve
0010106c l    d  .ctors 00000000 .ctors
00102000 l    d  .bss   00000000 .bss
00104000 l       .bss   00000000 kernel_stack
00100020 l       .text  00000000 _stop
001002d4 g       .text  00000000 _printHex
001003b4 g       .text  00000000 _printDec
00100584 g       .text  00000000 _init
001000f4 g       .text  00000000 _putChr
0010000c g       .text  00000000 _start
00100074 g       .text  00000000 _scrolldown
00100234 g       .text  00000000 _kprintf
00100024 g       .text  00000000 _clsc
001001d4 g       .text  00000000 _setcolor


steht wirklich nix interessantes drin. Es sei denn ich muss aufpassen, das der den Kernel als ROM betrachtet.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 27. October 2013, 15:18 »
Warum markierst du die Funktionen in Console.bas als extern "C"? Werden die von C oder ASM code aus aufgerufen?
Steht das extern "C" auch in Console.bi? Sonst denkt dein Compiler vermutlich er müsste clsc() in der init() mit der FreeBasic-Calling-Convention aufrufen, dabei hast du sie ja als extern "C" compiliert.
« Letzte Änderung: 27. October 2013, 15:22 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 27. October 2013, 16:09 »
Ja steht drin. Es scheint was damit zu tun haben, dass ich mehre Dateien zusammen bastle. Weil wenn ich clsc() in die Hauptdatei schreibe gibt es da kein Problem.

Add: Hab jetzt mal das extern C bei den anderen Dateinen rausgemacht. löst aber nicht das Problem.
« Letzte Änderung: 27. October 2013, 16:12 von Sannaj »

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 27. October 2013, 17:25 »
Hab den Fehler jetzt übrigens lokalisiert, da ich unter Windows arbeite (ich weiß das ist ungünstig) und mir fbc nur pe ausspuckt musste ld das korregieren und hat den call Befehl falsch konfiguriert, so das der jetzt nicht am Anfang von clsc() sondern so 72 bytes weiter hinten irgendwo in der nop folge auftrifft.

 

Einloggen