Bootloader

Re: Bootloader

Beitragvon Dragonsphere » Mi 16. Nov 2016, 22:22

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
Benutzeravatar
Dragonsphere
MemMaker-Benutzer
 
Beiträge: 91
Registriert: Di 2. Feb 2016, 10:44
Wohnort: 0000:700h

Re: Bootloader

Beitragvon TomCat » Fr 18. Nov 2016, 10:01

danke fuer den code.

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

thx
TomCat
TomCat
MemMaker-Benutzer
 
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Vorherige

Zurück zu Programmierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast