BOOT_R: Cli
Xor AX,AX ;Zero register
Mov DS,AX
Mov ES,AX
Cld
Mov CX,100h
Mov SI,07c00h
Mov DI,08000h
Rep Movsw
;JMP FAR PTR 0800:0058 ;jump dest. (next)
DB 0eah,58h,0,0,8
Mov SI,OFFSET copyb - OFFSET BOOT_R + 40h
Call NEXT_CH
Mov AX,0a2dh ;'-'
Xor BX,BX
Mov CX,52 ;52*'-'
Int 10h ;VIDEO service: char at cursor
Mov SI,OFFSET helpb - OFFSET BOOT_R + 40h
Call WR_IT
Mov AX,0ab0h ;'░'
Xor BX,BX
Mov CX,27h ;39*'░'
Int 10h ;VIDEO service: char at cursor
BLOCK: Mov AX,0edbh ;'█'
Int 10h ;VIDEO service: write char
Mov BX,046ch
Mov SI,[BX] ;0000:046C = timer low
Mov DI,[BX+2] ;0000:046E = timer high
Add SI,5
Adc DI,0
WAIT_K: Mov AH,1
Int 16h ;Keyboard i/o ah=function 01h
;get status, if zf=0: al=char
Jnz L_GETKEY
Cmp [BX+2],DI ;timer high change?
Jb WAIT_K ;no -> wait for key
Cmp [BX],SI ;timer low change?
Jb WAIT_K ;no -> wait for key
Loop BLOCK ;next block (39*)
Mov AH,1 ;no key = F1
Jmp SHORT KEYS
L_GETKEY:Mov AH,0
Int 16h ;Keyboard i/o ah=function 00h
;get keybd char in al, ah=scan
KEYS: Cmp AH,3eh ;F4
Je RESET
Cmp AH,3dh ;F3
Je NEW_ATT
Cmp AH,3ch ;F2
Je XCHG_FD
Mov SI,OFFSET nlb - OFFSET BOOT_R + 40h
Call WR_IT
Mov AX,201h
Mov BX,7c00h ;dest: boot mem
Mov DX,80h ;phys. drive: 80 = HD
Mov CX,1 ;1 sector
Int 13h ;DISK service: read sectors
Jc NEW_ATT ;error?
;JMP FAR PTR 0000:7C00H ;new boot
DB 0eah,0,7ch,0,0
XCHG_FD:Mov BX,DS:[102h] ;unused int 40H seg
And BX,BX
Jz NEW_ATT
Push BX
Mov SI,OFFSET changeb - OFFSET BOOT_R + 40h
Call WR_IT
Pop BX
Mov DS:[342h],BX
Mov DI,300h
Mov AX,DI
Xchg AX,DS:[100h] ;set unused int 40H offs to 300H
Mov DS:[340h],AX
Mov DS:[102h],ES ;set unused int 40H seg to zero
Mov SI,OFFSET FD_2 - OFFSET BOOT_R + 8040h
Mov CX,OFFSET GETSW - OFFSET FD_2
Rep Movsb ;0000:@FD_2 -> 0000:0300
NEW_ATT:Int 19h ;Bootstrap loader
EVEN ;ASM fixup
RESET: Mov DX,64h
Mov AL,0feh
Out DX,AL ;port 64H, kybd cntrlr functn
;al = 0FEH, pulse CPU reset
Jmp SHORT RESET
changeb DB nl,cd,'Floppy drives changed.',nl,cd,0
copyb DB nl,cd,'BOOT 1.5 Copyright by T. Mönkemeier, O Love & Tels.',nl,0
helpb DB cd,cd,'This is no system disk. Choose:',nl,cd
DB 'F1 - Booting from hard disk.',nl
DB 'F2 - Change floppy drives.',nl
DB 'F3 - Retry.',nl
DB 'F4 - Reset.',cd
nlb DB nl,0
WR_IT PROC NEAR
NEXT_CH:Lods BYTE PTR CS:[SI]
Or AL,AL ;zero termination?
Jz END_CH ;yes
Mov AH,0eh
Int 10h ;VIDEO service: write char
Jmp SHORT NEXT_CH
END_CH: Retn
WR_IT ENDP
FD_2: Pushf ;Push flags
Xor DL,1
Popf ;Pop flags
Int 0d0h ;??INT NON-STANDARD INTERRUPT.
Pushf ;Push flags
Xor DL,1
Popf ;Pop flags
Retf 2 ;Return far