Yarcanox
Hi
ich hab mithilfe von tuts asm gelernt, bin aber noch sehr blutiger anfänger. nun habe ich es soweit geschafft, dass ich einen diskettenbootloader habe, der auch funzt und den kernel reinläd. dort kann ich im defaulttextmodus auch bequem text ausgeben.
nun versuche ihc aber, ein pixel einzufärben, und ich find den fehler einfach nicht. ich werde beim fehlersuhcen auch immer unsicherer, wie genau es eigentlich - von der theorie her - zu bewerkstelligen ist! die tutorials lösen das alle ganz unterschiedlich, und richtig erklärt, was man wohin schieben muss, tut irgendwie keines.
http://eloxoph.net/kernel.txt
Das wäre der Code. Im bochs-emulator wechselt er in den grafikmodus, das bild bleibt aber schwarz.
EDIT: Problem gelöst. hab die falschen register für stosb benutzt. das war in dem tut komischerweise falsch angegeben, aber es geht jetzt auf jeden fall.
EDIT: hab ein neues prob, siehe unten
NASA
Ähm...
[...]
jmp grafikmodus
[...]
jmp mypal ;farben festlegen
[...]
jmp waitforkey ;das "bild" anzeigen, bis man eine taste drückt
jmp reset
[...]
Soweit ich mich dunkel zurückerinnere, wird beim JMP-Befehl die Returnadresse nicht auf den Stack gelegt. Demzufolge dürften die RET am Ende der Subroutinen ins Leere gehen.
Versuch mal, die JMP durch CALL zu ersetzen.
Yarcanox
hab das gleich mal geändert, der schirm bleibt trotzdem schwarz
NASA
Da ist noch einiges im argen. Versuchs mal so:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
|
;***********
;Hauptkernel
;***********
mov ax, 1000h
mov ds, ax
mov es, ax
start: ; Hier fängt unser eigentliches "Betriebssystem" an
call grafikmodus
push ax
call mypal ;farben festlegen
push cx
push es
mov ax,140h ;bildbreite sind 320 bytes (hexadezimal)
imul ax,0C8h ;bildhoehe sind 200 bytes (hexadezimal)
mov cx,ax
mov ax,0A000h
mov es,ax
xor di,di ;index 0
mov al,01h ;Farbe
rep stosb ;mehrere Bytes repeated ausgeben
pop es
pop cx
pop ax
call waitforkey ;das "bild" anzeigen, bis man eine taste drückt
ret
;************************
;sonderfunktionen ab hier
;************************
;******auf tastendruck warten
waitforkey:
mov ah, 0
int 016h
ret
reset:
db 0Eah
dw 0000h
dw 0FFFFh
;******ein palettenpixel festlegen, bx ist index, dh rot, ch grün, cl blau <--- Doku
pal:
push ax
mov ax,1010h ; geraffel davor entfernt
int 10h
pop ax
ret
;******farbpalette festlegen
mypal:
push bx
push cx
push dx
mov bx,1 ;farbe mit index 1 festlegen
mov dh,0ffh ;ein rot bitte ins richtige register
mov cl,0 ;alle anderen farbkomponenten auf 0
mov ch,0 ;soll ja richtig knallig rot werden
call pal ;die palettenfunktion soll das jetzt setzen
pop dx
pop cx
pop bx
ret
;******320x200 mit 256 farben setzen
grafikmodus:
push ax
MOV AH, 00H
MOV AL, 13H
INT 10H
pop ax
ret
|
|
Guckst Du auch hier:
http://www.softgames.de/forum/frage118912.html
und hier:
http://www.datasource.de/programmierung/...biosint10h.html
BTW: Assembler ist schon sehr anspruchsvoll. Hast Du sonstige Programmiererfahrung?
Yarcanox
siehe reineditierter comment.
udn ja, ich habe bereits programmiererfahrung in php, javascript, visual basic 6 & 7 & 8 und ein klein wenig in c++ und ein ganz kleines fitzelchen jetzt auch in asm^^
NASA
Na, dann weiterhin viel Erfolg. Bei mir ist der x86-Assembler schon etwas eingerostet, da hab ich schon ca. 15-20 Jahre nix mehr mit gemacht. Maschinencode ist halt heute nicht mehr so "in" wie damals, als die Rechner noch mit Mhz getaktet wurden. Da ging so manches nur in ASS, wenn man auf akzeptable Geschwindigkeit wert legte (Ich muss hier irgendwo noch ein selbstprogrammierten Phoenix-Clon rumliegen haben, Turbo-Pascal mit Inline-Assembler).
Weiterhin noch viel Freude beim Programmieren, und nicht verzweifeln. Heute gibts glücklicherweise haufenweise Quellen im Internet, die man nutzen kann.
Yarcanox
Ok alle Zeichenfunktionen scheinen auf Anhieb richtig zu gehen, doch nun habe ich folgendes Problem.
Ich habe ein nicht sonderliches komplexes Bild eingebunden, vllt. 30 Pixel zum Zeichnen. Das habe ich getan, indem ich eine neue Sprungmarke mit ret am Ende hinzugefügt habe, die für jedes Pixel erst die Parameter setzt (position, farbe => register) und dann per call die pixelsetzfunktion aufruft, und dann das nächste pixel etc.
Das funktioniert auch ganz gut, bis ich eine bestimmte Grenze an zu zeichnenden Pixeln überschreite (vllt. so ca. 20, von der Pixelposition hängt es wohl nicht ab, da hab ich ein wenig rumprobiert), fängt das ganze an zu blinken.
Anstatt dass es im gewünschten Rot ist, ist es nur kurzzeitig rot und schaltet unregelmäßig auf blau oder schwarz um (verschwindet also ganz), wie eine kaputte Glühbirne (getestet im Bochs-Emu).
Weiß jemand, was da das Problem ist? Ich mache derzeit nichts anderes im Kernel, was irgendetwas überschreiben könnte, ich setze einmalig die Palette und zeichne danach das "Bild", und zwar auch nur einmal, d.h. es wird in den Arbeitsspeicher aka Videospeicher abgesetzt, und dann ist fertig (er wartet auf einen Tastendruck, auf denhin das Neustartsignal gesendet wird wie gehabt).
Nur dass man nicht bis zum Tastendruck schön das Bild angucken kann, sondern es eben so blöde blinkt (wenn zu viele Pixel gesetzt wurden).
EDIT: hab hilfe im chat bekommen: wenn ich direkt vor dem zeichnen die interrupts abstelle und direkt danach an, geht es.
nur: wenn das bild zu komplex ist, zeichnet er offensichtlich nur bis zu einem bestimmten x-wert. alles rechts davon lässt er weg. wenn ich nur ein einziges pixel setze, gehts wunderbar auhc weiter rechts, hat also wieder was mit der pixelmenge zu tun.
wenn ich das nicht gelöst kriege, melde ich mich mit quellcode