[BITS 16]
[ORG 0]
LINE5 equ 0a0h*4
LINE7 equ 0a0h*6
LINE9 equ 0a0h*8
LINE11 equ 0a0h*10
LINE15 equ 0a0h*12
BRIGHT_WHITE equ 0Fh
WHITE equ 07h
BLACK equ 0h
GRAY equ 8h
BROWN equ 6h
CR equ 0dh
ESC equ 1bh
TAB equ 9h
UP equ 4800h
DOWN equ 5000h
LEFT equ 4B00h
RIGHT equ 4D00h
INIT:
cld
mov bx,cs
mov ds,bx
mov es,bx
mov word [DISK],0
mov word [PARTITION],0
call HIDE_CURSOR
call CLEAR_SCREEN
mov word [LITERAL],STRING1
mov word [POS],LINE5+30
mov byte [COLOR],BRIGHT_WHITE
call DISPLAY_STRING
DISK_LINE:
mov byte [COLOR],WHITE
call DISPLAY_DISK_STRING
mov byte [COLOR],GRAY
call DISPLAY_PARTITION_STRING
mov word [POS],LINE11
call DISPLAY_NO
mov byte [COLOR],WHITE
call DISPLAY_PARTITION
jmp .OK
.LOOP:
call GET_CHAR
cmp byte [CHAR],ESC
je .ESC
cmp byte [CHAR],CR
je .CR
cmp byte [CHAR],TAB
je .TAB
cmp word [CHAR],UP
je .UP
cmp word [CHAR],DOWN
je .DOWN
cmp word [CHAR],LEFT
je .LEFT
cmp word [CHAR],RIGHT
je .RIGHT
cmp byte [CHAR],'1'
je .1
cmp byte [CHAR],'2'
je .2
cmp byte [CHAR],'3'
je .3
cmp byte [CHAR],'4'
je .4
jmp .LOOP
.ESC:
jmp 0FFFFh:0
.CR:
jmp END
.TAB:
.UP:
.DOWN:
jmp PARTITION_LINE
.LEFT:
cmp word [DISK],0
je .4
sub word [DISK],4
jmp .OK
.RIGHT:
cmp word [DISK],12
je .1
add word [DISK],4
jmp .OK
.1:
mov word [DISK],0
jmp .OK
.2:
mov word [DISK],4
jmp .OK
.3:
mov word [DISK],8
jmp .OK
.4:
mov word [DISK],12
jmp .OK
.OK:
mov word [POS],LINE9
call DISPLAY_NO
mov word [POS],LINE9
call HILIGHT_BRACKET
mov byte [COLOR],BRIGHT_WHITE
call DISPLAY_DISK
jmp .LOOP
PARTITION_LINE:
mov byte [COLOR],WHITE
call DISPLAY_PARTITION_STRING
mov byte [COLOR],GRAY
call DISPLAY_DISK_STRING
mov word [POS],LINE9
call DISPLAY_NO
mov byte [COLOR],WHITE
call DISPLAY_DISK
jmp .OK
.LOOP:
call GET_CHAR
cmp byte [CHAR],ESC
je .ESC
cmp byte [CHAR],CR
je .CR
cmp byte [CHAR],TAB
je .TAB
cmp word [CHAR],UP
je .UP
cmp word [CHAR],DOWN
je .DOWN
cmp word [CHAR],LEFT
je .LEFT
cmp word [CHAR],RIGHT
je .RIGHT
cmp byte [CHAR],'1'
je .1
cmp byte [CHAR],'2'
je .2
cmp byte [CHAR],'3'
je .3
cmp byte [CHAR],'4'
je .4
jmp .LOOP
.ESC:
jmp 0FFFFh:0
.CR:
jmp END
.TAB:
.UP:
.DOWN:
jmp DISK_LINE
.LEFT:
cmp word [PARTITION],0
je .4
sub word [PARTITION],4
jmp .OK
.RIGHT:
cmp word [PARTITION],12
je .1
add word [PARTITION],4
jmp .OK
.1:
mov word [PARTITION],0
jmp .OK
.2:
mov word [PARTITION],4
jmp .OK
.3:
mov word [PARTITION],8
jmp .OK
.4:
mov word [PARTITION],12
jmp .OK
.OK:
mov word [POS],LINE11
call DISPLAY_NO
mov word [POS],LINE11
call HILIGHT_BRACKET
mov byte [COLOR],BRIGHT_WHITE
call DISPLAY_PARTITION
jmp .LOOP
END:
clc
shr word [DISK],2
add word [DISK],80h
clc
shl word [PARTITION],2
add word [PARTITION],1BEh
mov ax,7c0h
mov es,ax
.LOAD_MBR:
mov bx,0
mov dx,word [DISK]
mov cx,1
mov ax,201h
int 13h
jnc .SIGNATURE1
jmp .ERR1
.SIGNATURE1:
es cmp word [510],0AA55h
je .TYPE
jmp .ERR2
.TYPE:
es mov byte [1BEh],0
es mov byte [1CEh],0
es mov byte [1DEh],0
es mov byte [1EEh],0
mov di,word [PARTITION]
es mov byte [di],80h
mov di,1BEh
call TYPE_CONVERSION
mov di,1CEh
call TYPE_CONVERSION
mov di,1DEh
call TYPE_CONVERSION
mov di,1EEh
call TYPE_CONVERSION
.SAVE_MBR:
mov bx,0
mov dx,word [DISK]
mov cx,1
mov ax,301h
int 13h
jc .ERR1
.LOAD_BOOT_SECTOR:
mov di,word [PARTITION]
mov bx,0
mov dl,byte [DISK]
es mov dh,byte [di+1]
es mov cx,word [di+2]
mov ax,201h
int 13h
jc .ERR1
.SIGNATURE2:
es cmp word [510],0AA55h
je .QUIT
jmp .ERR2
.QUIT:
call UNHIDE_CURSOR
mov si,word [PARTITION]
jmp 07C0h:0
.ERR1:
mov word [LITERAL],STRING8
mov word [POS],LINE15
jmp .PAUSE
.ERR2:
mov word [LITERAL],STRING9
mov word [POS],LINE15
jmp .PAUSE
.PAUSE:
mov byte [COLOR],BRIGHT_WHITE
call DISPLAY_STRING
call GET_CHAR
jmp 0FFFFh:0
;******************************************************* routine
CLEAR_SCREEN:
push es
mov ax,0b800h
mov es,ax
mov di,0
mov ax,700h
mov cx,80*25
rep stosw
pop es
retn
DISPLAY_DISK_STRING:
mov word [LITERAL],STRING2
mov word [POS],LINE9+18*2
call DISPLAY_STRING
retn
DISPLAY_PARTITION_STRING:
mov word [LITERAL],STRING3
mov word [POS],LINE11+13*2
call DISPLAY_STRING
retn
DISPLAY_NO:
mov word [LITERAL],STRING4
add word [POS],40*2
mov byte [COLOR],GRAY
call DISPLAY_STRING
retn
DISPLAY_STRING:
push es
mov ax,0b800h
mov es,ax
mov si,word [LITERAL]
mov di,word [POS]
.LOOP:
lodsb
cmp al,0
je .END
mov ah,byte [COLOR]
stosw
jmp .LOOP
.END:
pop es
retn
DISPLAY_DISK:
mov ax,LINE9+42*2
add ax,word [DISK]
mov word [POS],ax
call CHANGE_COLOR
retn
DISPLAY_PARTITION:
mov ax,LINE11+42*2
add ax,word [PARTITION]
mov word [POS],ax
call CHANGE_COLOR
retn
CHANGE_COLOR:
push es
mov ax,0b800h
mov es,ax
mov di,word [POS]
inc di
mov al,byte [COLOR]
stosb
pop es
retn
HILIGHT_BRACKET:
add word [POS],40*2
mov byte [COLOR],BROWN
call CHANGE_COLOR
add word [POS],10*2
mov byte [COLOR],BROWN
call CHANGE_COLOR
retn
GET_CHAR:
mov ah,0
int 16h
mov word [CHAR],ax
retn
TYPE_CONVERSION:
es cmp byte [di],80h
je .ACTIVE_PARTITION
.INACTIVE_PARTITION:
es cmp byte [di+4],0Bh
je .HIDE_PARTITION
es cmp byte [di+4],06h
je .HIDE_PARTITION
retn
.HIDE_PARTITION:
es add byte [di+4],10h
retn
.ACTIVE_PARTITION:
es cmp byte [di+4],1Bh
je .UNHIDE_PARTITION
es cmp byte [di+4],16h
je .UNHIDE_PARTITION
retn
.UNHIDE_PARTITION:
es sub byte [di+4],10h
retn
HIDE_CURSOR:
mov ah,1h
mov cx,201fh
int 10h
retn
UNHIDE_CURSOR:
mov ah,1h
mov cx,1f1fh
int 10h
retn
STRING1 db 'A L T E R N A T I V E B O O T L O A D E R',0
STRING2 db 'BOOT FROM DISK',0
STRING3 db 'BOOT FROM PARTITION',0
STRING4 db '[ 1 2 3 4 ]',0
STRING8 db 'DISK I/O ERROR',0
STRING9 db 'NO 0AA55h SIGNATURE',0
CHAR dw 0
COLOR db 0
LITERAL dw 0
POS dw 0
DISK dw 0
PARTITION dw 0
times 512*3-($-$$) db 0