Bootloader

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Benutzeravatar
Dragonsphere
MemMaker-Benutzer
Beiträge: 93
Registriert: Di 2. Feb 2016, 10:44
Wohnort: 0000:700h

Re: Bootloader

Beitrag von Dragonsphere »

Ich habe vor Jahren mal ein bisschen mit sowas rumexperimentiert und habe noch diesen alten Quellcode für einen eigenen Bootsektor.
Keine Ahnung ob der code so funktioniert, aber vielleicht hilft er interessierten ja weiter.

Code: Alles auswählen

.386  

 _Text SEGMENT PUBLIC USE16
  assume CS:_Text, DS:_Text
  org 0


Entry:
 	db   0EAh  ; jmp far SEG:OFS  ; Wir sind an 0:7C00
  	dw   OFFSET Start, 08000h     ;Und jetzt an 08000:0


; -------------------------------------
; Daten
; -------------------------------------

        bootmsg         db 'Loader V.1.1 vom 14.06.1999',13,10,0
        loadmsg         db 'Kernel erfolgreich geladen! Taste druecken...',13,10,0
        rebootmsg       db 'Taste druecken für Neustart',13,10,0

        processormsg    db 'Pruefe auf 386 oder besser: ',0
        vgamsg          db 'Pruefe auf VGA: ',0
        needVGA         db 'Sorry... VGA benoetigt!',13,10,0
        need386         db 'Sorry... 386+ benoetigt!',13,10,0
        found386        db 'OK!',13,10,0
        cr		db 13,10,0

        pmodemsg        db 'Wechsel in den Protected Mode...',13,10,0
        allok           db 'Erfolgreich geladen!',13,10,0


        ; IDT und GDT.  Intel = little endian!

        pIDT         dw 7FFh         ; max 256 IDT slots
                        dd 0000h          

        pGDT        dw 17FFh        ; max 768 GDT slots
                        dd 0800h        ; start an 0800h (hinter IDT)

; -------------------------------------
; Subroutinen
; -------------------------------------

	detect_cpu:
                mov si,OFFSET processormsg    
                call message

                ; test 8088/8086  (flag bits 12-15  set)
                pushf                   

                xor ah,ah               
                push ax                
                popf                   

                pushf                  
                pop ax
                and ah,0f0h           
                cmp ah,0f0h
                je no386                ; nein? Dann wohl 286 (8088/8086 vorhanden)

                ; test auf 286 (bits 12-15 = 0)
                mov ah,0f0h             ; setze bits 12-15
                push ax                 
                popf

                pushf                  
                pop ax
                and ah,0f0h           ; prüfe ob bits 12-15 = 0
                jz no386               ; nein?  
                popf                    

                mov si, OFFSET found386
                call message

                ret                    
         no386:
                mov si, OFFSET need386          
                call message
                jmp reboot              
;       ------------------------------------------------------------------

        detect_VGA:
        	mov ax, 01A00h
  		int 010h           ;prüfe VGA/MCGA
  		cmp al, 01Ah
  		jne NoVGA          ;kein VGA Bios
  		cmp bl, 7
  		jb  NoVGA          
  		cmp bl, 0FFh
  		jz NoVGA

		mov si,OFFSET bootmsg  ; startup message
        	call message
 		mov si,OFFSET cr
        	call message
 		mov si,OFFSET vgamsg
        	call message
		mov si,OFFSET found386
                call message
  		ret
 		NoVGA:
 		mov si,OFFSET needVGA          
                call message
                jmp reboot            

;       ------------------------------------------------------------------
    message:                      
                lodsb                 
                or al,al               
                jz done
                mov  ah,0Eh       
    		xor  bx,bx         
    		mov  cx,1          
    		int  010h
                jmp message
        done:
                ret
;       ------------------------------------------------------------------
        getkey:
                mov ah, 0              
                int 016h
                ret

;       ------------------------------------------------------------------
        reboot:
                mov si,OFFSET rebootmsg       
                call message
                call getkey             

                db 0EAh                 ; jump FFFF:0000 (reboot)
                dw 0000h
                dw 0FFFFh
               
Start:
         mov si,OFFSET bootmsg  
         call message
         mov si,OFFSET cr
         call message


        call detect_VGA         
        call detect_cpu 

    
        mov si,OFFSET pmodemsg
        call message
        mov si,OFFSET cr
        call message


        mov eax, cr0            ; lade kontrollregister
        or  al, 1                    ; setze bit 1, das pmode bit
        mov cr0, eax            ; zurück damit in das kontrollregister
        jmp $+2                 ; und den prefetch queue leeren
        nop
        nop


        mov si,OFFSET loadmsg  
        call message

        call getkey
        call reboot

         _Text ENDS
  END

Läd zwar auch keine EXE-Dateien, aber prüft auf 386er und VGA und springt in den Protected Mode.
Das ist doch auch schonmal etwas :-)

Wenn man den auf den ersten Sektor schreibt, wird die Diskette von DOS natürlich nicht mehr erkannt. ;-)
Kleiner Schaltschrank Industrie-PC, der sich langsam zu einer tollen kleinen DOS-Spielekiste entwickelt.
Intel 80486DX-4, 32 MB EDO-RAM, 2 GB Seagate-Festplatte, SB 16 CT2770, Diamond SpeedSTAR Plus Rev. C6
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

danke fuer den code.

ich hab das alles schon hinbekommen. Kann exe-Dateien in den Arbeitsspeicher laden und ausführen.

thx
TomCat
Antworten