flat assembler
Message board for the users of flat assembler.
Index
> OS Construction > Customizable "Press key to reboot" boot sector |
Author |
|
The Lightning Stalker 07 Jun 2006, 22:43
Hello. Using some of the information on this site, I made a boot sector that can be used on CDs or floppies and thought I'd share it with you. I made it for a set of ghost CDs I made for a customer. Disc 1 boots ghost and disc 2-x boot into this boot sector and say:
Quote: The CD in your drive is not bootable. The disc is ejected and the droor closed automatically after a key is pressed, then the system is rebooted. Here is the code. You can make it say whatever you want. Code: ;****************************** ; Press any key to reboot v2.0 ; For flat assembler ; By Robert Dvoracek ;****************************** include 'Ata_Atapi.inc' ; Use Craig Bamford's library ; for CD Eject functions Load_Segment equ 7C00h org Load_Segment ; 7C00h does it for boot sectors use16 ;****************************** ; Realmode startup code. ;****************************** start: xor ax,ax mov ds,ax mov es,ax mov ss,ax mov sp,Load_Segment ;****************************** ; Print message. ;****************************** mov si,Message ; Point si to Message call print ; Call subroutine to print message ;****************************** ; Eject and wait for key press. ;****************************** call Eject_cd ; Call subroutine in Ata_Atapi.inc mov ah,10h ; Read a keypress using extended int 16h ; keyboard to include F11 & F12 call Close_cd ; Call subroutine in Ata_Atapi.inc ;****************************** ; Reboot. ;****************************** push 40h ; Move 40h pop ds ; Into ds mov word [0072h], 1234h ; 1234h for warm reboot, 0000h for cold push 0FFFBh ; 4 less than FFFF where we're going push ds ; +40h to FFFF:0000. Genius loco, genius! retf ; Blamo ;****************************** ; Sub print. ;****************************** print: mov ah,0Eh ; Request display again1: lodsb ; load a byte into AL from DS:SI or al,al ; See if it's a zero jz done1 ; Jump to label done1 if it is int 10h ; Call interrupt service jmp again1 ; Jump to label again1 done1: ret ; Return ;****************************** ; Strings ;****************************** Message db "The CD in your drive is not bootable.", 0Dh, 0Ah,\ "Please insert disc 1 to reload the system or remove this one to boot ",\ "into", 0dh, 0ah,\ "Windows.", 0Dh, 0Ah,\ 0Dh, 0Ah,\ "Press any key to reboot.", 0 ;****************************** ; Make program 510 bytes + ; 0xAA55 ;****************************** times 510- ($-start) db 0 ; Fill current offset-start-510 with zeros dw 0xAA55 ; Put magic number at end to get 512 Bytes Version History: Original Release: Originally I had to put in ## and then edit the compiled binary in a hex editor to get carriage returns. v1.0: With some help from WiESi this was fixed. v2.0: Disc eject routines added with help from Dex4u Take care, The Lightning Stalker
Last edited by The Lightning Stalker on 29 Feb 2008, 19:25; edited 5 times in total |
|||||||||||
07 Jun 2006, 22:43 |
|
The Lightning Stalker 08 Jun 2006, 09:41
Aha, thank you WiESi. I don't know why it wasn't working earlier, but it's working now. I'm making several other "improvements" which I'll edit into the original post, unless you prefer I post again.
|
|||
08 Jun 2006, 09:41 |
|
Dex4u 08 Jun 2006, 11:30
You could try something like this, as it opens the cd draw and closes it before reboot.
Code: org 0x7C00use16;****************************; Realmode startup code.;****************************start: xor ax,ax mov ds,ax mov es,ax mov ss,ax mov sp,0x7C00;*************************************; Print message.;************************************* mov si,msg0 call print call Eject_cd xor ax,ax int 16h call Close_cdReBootMe: db 0xea dw 0x0000 dw 0xffff jmp $;====================================================;; print. ;;====================================================;print: mov ah,0Eh ; Request displayagain1: lodsb ; load a byte into AL from DS:SI or al,al ; Or AL jz done1 ; Jump 0, to label done1 int 10h ; Call interrupt service jmp again1 ; Jump to label again1done1: ret ; Returninclude 'Ata_Atapi.inc' msg0 db "Please insert disc 1 and press anykey to reboot.",0;*************************************; Make program 510 byte's + 0xaa55;*************************************times 510- ($-start) db 0dw 0xaa55 NOTE: you need to use "'Ata_Atapi.inc" and also may a delay of about 2seconds between Close_cd and ReBootMe.
|
|||||||||||
08 Jun 2006, 11:30 |
|
The Lightning Stalker 08 Jun 2006, 13:49
Dex4u: I tried that on this computer here and it just sits with a blinking cursor. I'd know for sure if it had a floppy drive :/
|
|||
08 Jun 2006, 13:49 |
|
Dex4u 08 Jun 2006, 14:06
'@The Lightning Stalker, It works fine on the 3 PC i have tryed it on, try puting a
Code: mov si,msg0 call print xor ax,ax ;***here *** int 16h ;***here *** call Eject_cd xor ax,ax int 16h call Close_cd To see if it prints message, as its the same code as before so should print message, but have only tested it from floppy. PS: Maybe you need to stop emulation for this to work from cd ?. and call something like this http://lrs.uni-passau.de/support/doc/interrupt-57/RB-0680.HTM |
|||
08 Jun 2006, 14:06 |
|
The Lightning Stalker 10 Jun 2006, 05:08
That's strange. I tried on 2 here, one from CD and one from floppy. Maybe I'm not including your ATAPI library properly or something.
Quote: '@The Lightning Stalker, It works fine on the 3 PC i have tryed it on, try puting a Okay, I'll try it. |
|||
10 Jun 2006, 05:08 |
|
Dex4u 10 Jun 2006, 12:04
Here is the bin file, my code, the tools for puting on floppy.
I can if you want make a better one that test for drive address, as that one just gess it ( about 70% right ).
|
|||||||||||
10 Jun 2006, 12:04 |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.