Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Sannaj 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.
-
Nein, musst du nicht. Wo schreibst du denn hin, wenn Qemu aufhört, ihn auszugeben?
-
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.)
-
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).
-
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
....
-
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.
-
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.
-
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.
-
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?
-
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.
-
$ 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.
-
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.
-
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.
-
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.