boot_floppy.asm 2.34 KB
;BLACK			0x0
;BLUE			0x1
;GREEN			0x2
;CYAN			0x3
;RED			0x4
;MAGENTA		0x5
;BROWN			0x6
;GREY			0x7
;DARK_GREY		0x8
;LIGHT_BLUE		0x9
;LIGHT_GREEN	0xA
;LIGHT_CYAN		0xB
;LIGHT_RED		0xC
;LIGHT_MAGENTA  0xD
;LIGHT_BROWN	0xE
;WHITE			0xF

[BITS 16]
[org 0x7C00]

JMP	Start

clear_screen:
	PUSH	ax
	MOV     al, 03h ; Setting the graphical mode 80x25(text)
    MOV     ah, 00h ; Code of the function of changing video mode
    INT		10h	; Call interruption
    MOV		cl, 0x06
    MOV		ah, 0x01
    INT 	10h
    POP		ax
	RETN

print_string:   ; Expects null terminated message in si
	PUSH	ax
	for_print_string_0:
		MOV 	al,[si]
		OR 		al,al
		JZ  	end_for_print_string_0
		INC 	si
		CALL 	print_char
		JMP 	for_print_string_0
	end_for_print_string_0:
	POP		ax
	RETN

print_sector:
	PUSH	ebp
	MOV		ebp, esp
	PUSH	ax
	PUSH	bx
	PUSH	cx
	PUSH	dx
	MOV 	al, [8 + ebp] ; num
	MOV		cl, [6 + ebp]  ; offset
	MOV     ah, 2
    XOR     ch, ch
    XOR		dx,dx
    INT     0x13
    MOV		di, 512
    XOR		ah, ah
    IMUL	di, ax
    XOR		si, si
    for_print_sector_0:
    	CMP		si, di
    	JZ		end_for_print_sector_0
    	MOV 	al,[es:si]
    	OR 		al, al
    	JZ		end_print_char_0
    	CALL 	print_char
    	end_print_char_0:
    	INC		si
    	JMP		for_print_sector_0
    end_for_print_sector_0:
	POP		dx
	POP		cx
	POP		bx
	POP		ax
	MOV		esp, ebp
	POP		ebp
	RETN

print_char: 
	PUSH	ax
	PUSH 	bx
	MOV 	ah,0x0E         ; Specifies that we want to write a character to the screen
	MOV 	bl,0x02         ; Specifies output text color.  Not required, but useful to know
	MOV 	bh,0x00         ; Page number.  Leave this alone.
	INT 	0x10            ; Signal video interrupt to BIOS
	POP		bx
	POP		ax
	RETN

execute_sector:
	PUSH	ebp
	MOV		ebp, esp
	PUSH	ax
	PUSH	bx
	PUSH	cx
	PUSH	dx
	MOV		ax, [10 + ebp] ; base address
	MOV		es, ax
	MOV 	al, [8 + ebp] ; num
	MOV		cl, [6 + ebp]  ; offset
	MOV     ah, 2 ; Function read
    XOR     ch, ch ; cylinder
    XOR		dx,dx ; Head and drive
    INT     0x13
    XOR		si, si
    PUSH	es
    PUSH	bx
    RETF
	

Start:
XOR 	ax, ax
MOV 	ds, ax
MOV		ax, 0x1000
MOV 	es, ax
XOR		bx, bx
CALL	clear_screen
PUSH	2 ; num
PUSH	2 ; offset
CALL	print_sector ; (offset, num)
ADD		esp, 4
MOV 	si,str
CALL 	print_string
PUSH	0x800; Base address, offset is 0
PUSH	1 ; num
PUSH	4 ; offset
XOR		bx, bx;
CALL 	execute_sector

str: 	db 'THE GAME',0x0A,0x0D,0x00

TIMES 	510 - ($ - $$) db 0
DW 		0xAA55