Split code up into directories for bs and com binaries
This commit is contained in:
		
							parent
							
								
									5a24ceb9b8
								
							
						
					
					
						commit
						955acdacba
					
				
					 9 changed files with 2 additions and 2 deletions
				
			
		
							
								
								
									
										293
									
								
								boot/fat.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								boot/fat.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,293 @@ | |||
| 	; Bootsector for FAT12 filesystems | ||||
| 	; Memory layout: | ||||
| 	; 0000-03FF  IVT | ||||
| 	; 0400-0500  Bios data area | ||||
| 	; 0501-0600  Stack for us | ||||
| 	; 0600-0800  This code | ||||
| 	org 0x0600 | ||||
| 	; 0800-0A00  Buffer for disk | ||||
| buf:	equ 0x0800 | ||||
| 
 | ||||
| 	jmp near init | ||||
| 
 | ||||
| 	; current cluster number | ||||
| cclus:	dw 0 | ||||
| 	; sector number in cluster | ||||
| csec:	dw 0 | ||||
| 
 | ||||
| 	times (0x0B - ($-$$)) db 0 | ||||
| 	; BIOS PARAMETER BLOCK | ||||
| fdc:	; sector size | ||||
| .ss:	dw 0x200 | ||||
| 	; sectors per cluster | ||||
| .sc:	db 2 | ||||
| 	; reserved sector count | ||||
| .rsc:	dw 1 | ||||
| .fn:	; number of file allocation tables | ||||
| 	db 2 | ||||
| .rde:	; number of root directory entries | ||||
| 	dw 0x70 | ||||
| .ts:	; total number of sectors | ||||
| 	dw 720 | ||||
| .mid:	db 0xFD | ||||
| .sf:	dw 2 | ||||
| .spt:	dw 9 | ||||
| .nos:	dw 2 | ||||
| .po:	dd 0 | ||||
| .lrgts:	; large sector count - relevant if .ts is 0 | ||||
| 	dd 0 | ||||
| 
 | ||||
| 	; mformat keeps writing until here | ||||
| 	; if we place init earlier, code gets overwritten | ||||
| 	; this also marks the end for the BPB | ||||
| 	times (62 - ($-$$)) nop | ||||
| 
 | ||||
| init:	xor ax, ax | ||||
| 	mov ds, ax | ||||
| 	mov es, ax | ||||
| 	mov ss, ax | ||||
| 	mov sp, 0x0600 | ||||
| 
 | ||||
| 	; Relocate and jump | ||||
| 	mov di, sp | ||||
| 	mov si, 0x7C00 | ||||
| 	mov cx, 0x0100 | ||||
| 	rep movsw | ||||
| 	jmp 0:main | ||||
| 
 | ||||
| 	; Set adress for sector read/write | ||||
| 	; Number is relative to current partition | ||||
| 	; IN	dx:ax	sector number | ||||
| seek:	push ax | ||||
| 	push dx | ||||
| 	push ds | ||||
| 	push cs | ||||
| 	pop ds | ||||
| 	; add partition offset (required for HDD) | ||||
| 	add ax, [fdc.po] | ||||
| 	adc dx, [fdc.po+2] | ||||
| 	; ax:temp     = (lba / spt) | ||||
| 	; dx:sector   = (lba % spt) + 1 | ||||
| 	div word [fdc.spt] | ||||
| 	inc dx | ||||
| 	; Sector number (bits 0-5) into CL | ||||
| 	; This is blindly assumed to never exeed 63 | ||||
| 	mov byte [.cl], dl | ||||
| 	; ax:cylinder = (tmp / heads) | ||||
| 	; dx:head     = (tmp % heads) | ||||
| 	xor dx, dx | ||||
| 	div word [fdc.nos] | ||||
| 	; Cylinder number bit 0-7 into CH | ||||
| 	mov byte [.ch], al | ||||
| 	; Head number into DL | ||||
| 	mov byte [.dh], dl | ||||
| 	; Bits 8-9 of cylinder number into bits 6-7 of CL | ||||
| 	and ah, 0x03 | ||||
| 	ror ah, 1 | ||||
| 	ror ah, 1 | ||||
| 	or byte [.cl], ah | ||||
| 	pop ds | ||||
| 	pop dx | ||||
| 	pop ax | ||||
| 	ret | ||||
| .cl:	db 0 | ||||
| .ch:	db 0 | ||||
| .dl:	db 0 | ||||
| .dh:	db 0 | ||||
| 
 | ||||
| 	; Read sector into ES:BX | ||||
| 	; Sector number has been previously set with seek | ||||
| read:	push ax | ||||
| 	push cx | ||||
| 	push dx | ||||
| 	; ah = int13 subfunction 2 | ||||
| 	; al = read 1 sector | ||||
| 	mov ax, 0x0201 | ||||
| 	; load seek data into registers | ||||
| 	mov cx, word [cs:seek.cl] | ||||
| 	mov dx, word [cs:seek.dl] | ||||
| 
 | ||||
| 	int 0x13 | ||||
| 	int 3 | ||||
| 
 | ||||
| 	pop dx | ||||
| 	pop cx | ||||
| 	pop ax | ||||
| 	ret | ||||
| 
 | ||||
| 	; Get start sector of root dirrectory | ||||
| 	; OUT	ax	sector number | ||||
| dirsec:	; Multiply sectors per fat with number of fats | ||||
| 	mov ax, [cs:fdc.sf] | ||||
| 	mul byte [cs:fdc.fn] | ||||
| 	; Add number of reserved sectors | ||||
| 	add ax, [cs:fdc.rsc] | ||||
| 	ret | ||||
| 
 | ||||
| 	; Get root directory length in sectors | ||||
| 	; OUT	cx	sectors | ||||
| dirlen: push ax | ||||
| 	mov ax, [cs:fdc.rde] | ||||
| 	mov cl, 4 | ||||
| 	shr ax, cl ; 32 bytes per entry | ||||
| 	mov cx, ax | ||||
| 	pop ax | ||||
| 	ret | ||||
| 
 | ||||
| 	; Get first sector of data area | ||||
| 	; OUT	ax	sector number | ||||
| clusec:	push cx | ||||
| 	call dirsec | ||||
| 	call dirlen | ||||
| 	add ax, cx | ||||
| 	pop cx | ||||
| ret:	ret | ||||
| 
 | ||||
| 	; Get total number of sectors | ||||
| 	; OUT:	dx:ax	number of sectors | ||||
| secnum: xor dx, dx | ||||
| 	mov ax, [cs:fdc.ts] | ||||
| 	test ax, ax | ||||
| 	jnz ret | ||||
| 	mov ax, [cs:fdc.lrgts] | ||||
| 	mov dx, [cs:fdc.lrgts+2] | ||||
| 	ret | ||||
| 
 | ||||
| 	; Get number of clusters | ||||
| 	; OUT:	ax	number of clusters | ||||
| 	; Cant overflow for FAT16 :P | ||||
| clunum:	push cx | ||||
| 	push dx | ||||
| 	call clusec | ||||
| 	mov cx, ax | ||||
| 	call secnum | ||||
| 	sub ax, cx | ||||
| 	sbb dx, 0 | ||||
| 	mov cl, byte [cs:fdc.sc] | ||||
| 	xor ch, ch | ||||
| 	div cx | ||||
| 	pop dx | ||||
| 	pop cx | ||||
| 	ret | ||||
| 
 | ||||
| 	; Scan current buffer for matching file | ||||
| 	; IN	ds	= cs | ||||
| 	;	es	= cs | ||||
| 	; OUT	bx	start cluster if file found | ||||
| 	;		trashed if no match | ||||
| 	; carry is set if no file was found | ||||
| scadir: | ||||
| 	push cx | ||||
| 	push si | ||||
| 	mov si, buf | ||||
| 	mov cx, 0x10 | ||||
| .loop:	push cx | ||||
| 	push si | ||||
| 	mov bx, [si+0x1A] | ||||
| 	mov di, .name | ||||
| 	mov cx, 11 | ||||
| 	repe cmpsb | ||||
| 	pop si | ||||
| 	pop cx | ||||
| 	je .found | ||||
| 	add si, 0x20 | ||||
| 	loop .loop | ||||
| 	stc | ||||
| .found:	pop si | ||||
| 	pop cx | ||||
| 	ret | ||||
| .name:	db "HELLO   " | ||||
| .ext:	db "COM" | ||||
| 
 | ||||
| fopen: | ||||
| 	push ax | ||||
| 	push cx | ||||
| 	push dx | ||||
| 	push bx | ||||
| 	push ds | ||||
| 	push es | ||||
| 	cmp word [cclus], 0 | ||||
| 	jne .err | ||||
| 	xor ax, ax | ||||
| 	mov ds, ax | ||||
| 	mov es, ax | ||||
| 	call dirsec | ||||
| 	call dirlen | ||||
| .loop:	xor dx, dx | ||||
| 	mov bx, buf | ||||
| 	call seek | ||||
| 	call read | ||||
| 	call scadir | ||||
| 	jnc .found | ||||
| 	inc ax | ||||
| 	loop .loop | ||||
| .err:	stc | ||||
| 	jmp .ret | ||||
| .found:	mov [cclus], bx | ||||
| 	mov word [csec], 0 | ||||
| .ret:	pop es | ||||
| 	pop ds | ||||
| 	pop bx | ||||
| 	pop dx | ||||
| 	pop cx | ||||
| 	pop ax | ||||
| 	ret | ||||
| 
 | ||||
| fread:  push ax | ||||
| 	push cx | ||||
| 	push dx | ||||
| 	; abort if there is no file opened | ||||
| 	cmp word [cs:cclus], 0 | ||||
| 	je .err | ||||
| 	; get start sector for data area | ||||
| 	call clusec | ||||
| 	push ax | ||||
| 	; get current cluster number | ||||
| 	mov ax, [cs:cclus] | ||||
| 	; clusters are 2-indexed | ||||
| 	sub ax, 2 | ||||
| 	; multiply that with sectors per cluster | ||||
| 	mov cl, [cs:fdc.sc] | ||||
| 	xor ch, ch | ||||
| 	mul word cx | ||||
| 	; add current cluster offset, cluster start and current sector | ||||
| 	pop cx | ||||
| 	add cx, [cs:csec] | ||||
| 	add ax, cx | ||||
| 	adc dx, 0 | ||||
| 	; dx:ax now point to the sector that should be read next | ||||
| 	call seek | ||||
| 	call read | ||||
| 	jc .err | ||||
| 	inc word [cs:csec] | ||||
| 	jmp .ret | ||||
| .err:	; in case of error, trash current state | ||||
| 	call fclose | ||||
| 	stc | ||||
| .ret:	pop dx | ||||
| 	pop cx | ||||
| 	pop ax | ||||
| 	ret | ||||
| 
 | ||||
| 	; Reset open file info | ||||
| fclose: mov [cclus], bx | ||||
| 	mov word [csec], 0 | ||||
| 	ret | ||||
| 
 | ||||
| main:	mov [seek.dl], dl ; save drive number | ||||
| 
 | ||||
| 	call fopen | ||||
| 	mov bx, 0x1100 | ||||
| 	call fread | ||||
| 
 | ||||
| 	mov ax, 0x0100 | ||||
| 	mov ds, ax | ||||
| 	mov es, ax | ||||
| 	call 0x100:0x100 | ||||
| 
 | ||||
| .hlt:	hlt | ||||
| 	jmp .hlt | ||||
| 
 | ||||
| 	; Padding and signature | ||||
| 	times (0x1FE - ($-$$)) db 0 | ||||
| 	dw 0xAA55 | ||||
							
								
								
									
										214
									
								
								boot/fat32.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								boot/fat32.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,214 @@ | |||
| 	; Bootsector for FAT32 filesystems | ||||
| 	org 0x0800 | ||||
| 	jmp short init | ||||
| 	nop | ||||
| 
 | ||||
| 	; WORD reserved sector count | ||||
| rsc:    equ ( $$ + 0x00E ) | ||||
| 	; BYTE number of sectors per cluster | ||||
| sc:	equ ( $$ + 0x00D ) | ||||
| 	; BYTE number of FATs | ||||
| fn:	equ ( $$ + 0x010 ) | ||||
| 	; DWORD hidden sector count (partition offset) | ||||
| po:	equ ( $$ + 0x01C ) | ||||
| 	; DWORD sectors per FAT | ||||
| sf:	equ ( $$ + 0x024 ) | ||||
| 	; BYTE drive number (we set it from dl) | ||||
| dn:	equ ( $$ + 0x040 ) | ||||
| 
 | ||||
| 	; Area for BPB | ||||
| 	times (0x5A - ($-$$)) db 0 | ||||
| 
 | ||||
| init:	xor ax, ax | ||||
| 	mov ds, ax | ||||
| 	mov es, ax | ||||
| 	mov ss, ax | ||||
| 	mov sp, 0x7C00 | ||||
| 
 | ||||
| 	mov si, sp | ||||
| 	mov di, 0x0800 | ||||
| 	mov cx, 0x0100 | ||||
| 	rep movsw | ||||
| 	jmp 0x0:main | ||||
| 
 | ||||
| msg:	pop si | ||||
| mloop:	lodsb | ||||
| 	test al, al | ||||
| 	jz mend | ||||
| 	mov ah, 0x0e | ||||
| 	mov bx, 7 | ||||
| 	int 0x10 | ||||
| 	jmp mloop | ||||
| mend:	push si | ||||
| 	ret | ||||
| 
 | ||||
| err:	call msg | ||||
| 	db "DISKERR", 0x0A, 0x0D, 0 | ||||
| hlt:	hlt | ||||
| 	jmp hlt | ||||
| 
 | ||||
| 	; Requires DWORD ptr and QWORD sector on the stack | ||||
| read:	pop bp | ||||
| 	push cx | ||||
| 	mov ax, 0x10 | ||||
| 	push ax | ||||
| 	mov ah, 0x42 | ||||
| 	mov dl, 0x80 | ||||
| 	mov si, sp | ||||
| 
 | ||||
| 	mov di, [si+4] | ||||
| 	int 0x13 | ||||
| 	jc err | ||||
| 
 | ||||
| 	pop ax | ||||
| 	pop cx | ||||
| 	push bp | ||||
| 	ret | ||||
| 
 | ||||
| 	; Advances [clus] to next FAT entry | ||||
| next:	; push upper two words for sector num | ||||
| 	xor ax, ax | ||||
| 	push ax | ||||
| 	push ax | ||||
| 
 | ||||
| 	; get current cluster number | ||||
| 	mov ax, [clus] | ||||
| 	mov dx, [clus+2] | ||||
| 
 | ||||
| 	; shift 2 left for dword-sized FAT entries | ||||
| 	; shift 9 right for sector size | ||||
| 	mov cl, 7 | ||||
| shftl:	clc | ||||
| 	rcr dx, 1 | ||||
| 	rcr ax, 1 | ||||
| 	loop shftl | ||||
| 
 | ||||
| 	; add reserved sector count | ||||
| 	add ax, word [rsc] | ||||
| 	adc dx, 0 | ||||
| 
 | ||||
| 	; push lower dword of sector number | ||||
| 	push dx | ||||
| 	push ax | ||||
| 
 | ||||
| 	; push ptr to target buffer | ||||
| 	push cs | ||||
| 	mov ax, buf | ||||
| 	push ax | ||||
| 
 | ||||
| 	mov cx, 1 | ||||
| 	call read | ||||
| 
 | ||||
|         ; get lower part of cluster number | ||||
|         mov si, [clus] | ||||
| 	; multiply with 4 | ||||
|         sal si, 1 | ||||
|         sal si, 1 | ||||
| 	; make sure its within sector range | ||||
|         and si, 0x1FF | ||||
| 	add si, buf | ||||
| 	mov di, clus | ||||
| 	; copy dword from FAT to [clus] | ||||
| 	movsw | ||||
| 	movsw | ||||
| 
 | ||||
| 	; 1x QWORD, 1x DWORD = 12 bytes | ||||
| 	add sp, 12 | ||||
| 	ret | ||||
| 
 | ||||
| 	; reads current cluster into [dest] | ||||
| readc:	; load cluster number | ||||
| 	mov ax, [clus] | ||||
| 	mov dx, [clus+2] | ||||
| 
 | ||||
| 	; subtract the two dummy entries from FAT start | ||||
| 	sub ax, 2 | ||||
| 	sbb dx, 0 | ||||
| 
 | ||||
| 	; convert cluster number to sector number | ||||
| 	; this is some cheapo multiplication with 2^n | ||||
| 	mov ch, [sc] | ||||
| l02:	shr cl, 1 | ||||
| 	jz l02e | ||||
| 	clc | ||||
|         rcl dx, 1 | ||||
|         rcl ax, 1 | ||||
| 	jmp l02 | ||||
| l02e: | ||||
| 	; dx:ax is now sector num in data area | ||||
| 
 | ||||
| 	; get number of FATs | ||||
| 	xor ch, ch | ||||
| 	mov cl, byte [fn] | ||||
| 	; add their sizes up | ||||
| floop:  add ax, [sf] | ||||
| 	adc dx, [sf+2] | ||||
| 	loop floop | ||||
| 
 | ||||
| 	; add reserved sector count | ||||
| 	add ax, [rsc] | ||||
| 	add dx, 0 | ||||
| 
 | ||||
| 	; push sector num QWORD | ||||
| 	xor cx, cx | ||||
| 	push cx | ||||
| 	push cx | ||||
| 	push dx | ||||
| 	push ax | ||||
| 
 | ||||
| 	; push target buffer DWORD | ||||
| 	; dest gives the segment register | ||||
| 	mov ax, [dest] | ||||
| 	push ax | ||||
| 	push cx | ||||
| 
 | ||||
| 	; push sector count | ||||
| 	; always an full cluster | ||||
| 	mov cx, [sc] | ||||
| 	xor ch, ch | ||||
| 
 | ||||
| 	call read | ||||
| 
 | ||||
| 	cmp cl, [sc] | ||||
| 	jne err | ||||
| 
 | ||||
| 	xchg bx, cx | ||||
| 	mov cl, 5 | ||||
| 	sal bx, cl | ||||
| 	add [dest], bx | ||||
| 
 | ||||
| 	add sp, 12 | ||||
| 	ret | ||||
| 
 | ||||
| loadf:	call readc | ||||
| 	call next | ||||
| 	cmp word [clus+2], 0x0FFF | ||||
| 	jne loadf | ||||
| 	ret | ||||
| 
 | ||||
| main:	call loadf | ||||
| 	mov ax, [dest] | ||||
| 	int 3 | ||||
| 
 | ||||
| 	xor ah,ah | ||||
| 	int 0x16 | ||||
| 	int 0x19 | ||||
| 	jmp hlt | ||||
| 
 | ||||
| 	; the packing is so that it looks nice in a hexdump | ||||
| 	times (0x1E0 - ($-$$)) db 0 | ||||
| 	; directory the kernel is in | ||||
| tdir:	db "RDOS       ", 0 | ||||
| 	; current cluster number | ||||
| clus:	dd 2 | ||||
| 
 | ||||
| 	times (0x1F0 - ($-$$)) db 0 | ||||
| 	; filename for the kernel | ||||
| tfile:	db "KERNEL  BS ", 0 | ||||
| 	; segment register for data | ||||
| dest:	dw 0x07c0 | ||||
| 
 | ||||
| 	; Padding and signature | ||||
| 	times (0x1FE - ($-$$)) db 0 | ||||
| 	dw 0xAA55 | ||||
| buf: | ||||
							
								
								
									
										14
									
								
								boot/kernel.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								boot/kernel.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| org 0x7C00 | ||||
| 
 | ||||
| main:	mov si, msg | ||||
| 	mov ah, 0x0e | ||||
| 	xor bx, bx | ||||
| loop:	lodsb | ||||
| 	test al, al | ||||
| 	jz end | ||||
| 	int 0x10 | ||||
| 	jmp loop | ||||
| end:	hlt | ||||
| 	jmp end | ||||
| 
 | ||||
| msg:	db "rdos kernel stub", 0x0A, 0x0D, 0 | ||||
							
								
								
									
										136
									
								
								boot/mbr.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								boot/mbr.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,136 @@ | |||
| ; Memory layout: | ||||
| %define self      0x00600 ; 1 sector | ||||
| %define prog      0x07C00 ; 1 sector | ||||
| 
 | ||||
| ; FDC fields in VBR | ||||
| %define spt       (prog + 0x18) | ||||
| %define nos       (prog + 0x1A) | ||||
| %define po        (prog + 0x1C) | ||||
| 
 | ||||
| org self | ||||
| cpu 8086 | ||||
| 
 | ||||
| init: | ||||
|   cli | ||||
| 
 | ||||
|   ; Stack grows down from PSP + 64k | ||||
|   xor ax, ax | ||||
|   mov ss, ax | ||||
|   mov sp, ax | ||||
| 
 | ||||
|   push dx | ||||
| 
 | ||||
|   ; Relocate from [prog] to [self] | ||||
|   mov ds, ax | ||||
|   mov es, ax | ||||
|   mov si, prog | ||||
|   mov di, self | ||||
|   mov cx, 0x100 | ||||
|   rep movsw | ||||
| 
 | ||||
|   jmp 0:main | ||||
| 
 | ||||
| main: | ||||
|   mov bp, 0x3335 | ||||
|   mov si, part1 | ||||
|   mov cx, 4 | ||||
| .loop: | ||||
|   test BYTE [si], 0x80 | ||||
|   jnz loadpart | ||||
|   add si, 0x10 | ||||
|   loop .loop | ||||
|   jmp error | ||||
| 
 | ||||
| loadpart: | ||||
|   ; transfer starting address into DAP | ||||
|   push si | ||||
|   add si, 0x08 | ||||
|   mov di, dap.blocknum | ||||
|   movsw | ||||
|   movsw | ||||
|   pop si | ||||
| 
 | ||||
|   ; load sector | ||||
|   push si | ||||
|   mov si, dap | ||||
|   mov bp, 0x3336 | ||||
|   mov ah, 0x42 | ||||
|   stc | ||||
|   int 0x13 | ||||
|   jc error | ||||
|   pop si | ||||
| 
 | ||||
|   cmp BYTE [si+4], 0x01 | ||||
|   jne jump | ||||
| 
 | ||||
| adjust: | ||||
|   push dx | ||||
| 
 | ||||
|   mov bp, 0x3337 | ||||
|   mov ah, 0x08 | ||||
|   stc | ||||
|   int 0x13 | ||||
|   jc error | ||||
| 
 | ||||
|   ; update sectors per track | ||||
|   xor ax, ax | ||||
|   mov al, cl | ||||
|   mov [spt], ax | ||||
| 
 | ||||
|   ; update number of sides | ||||
|   xor ax, ax | ||||
|   mov al, dh | ||||
|   mov [nos], ax | ||||
| 
 | ||||
|   ; update partition offset | ||||
|   push si | ||||
|   add si, 0x08 | ||||
|   mov di, po | ||||
|   movsw | ||||
|   movsw | ||||
|   pop si | ||||
| 
 | ||||
|   pop dx | ||||
| 
 | ||||
| jump: | ||||
|   jmp 0:prog | ||||
| 
 | ||||
| error: | ||||
|   mov ax, bp | ||||
|   mov ah, 0x0e | ||||
|   mov bx, 7 | ||||
|   int 0x10 | ||||
|   mov al, 0x21 | ||||
|   int 0x10 | ||||
|   xor ax, ax | ||||
|   int 0x16 | ||||
|   int 0x19 | ||||
| 
 | ||||
| dap: | ||||
| .size: | ||||
|   db 0 | ||||
|   db 0 | ||||
| .count: | ||||
|   dw 1 | ||||
| .buffer: | ||||
|   dw prog | ||||
|   dw 0 | ||||
| .blocknum: | ||||
|   dq 0 | ||||
| 
 | ||||
| times (0x1BE - ($-$$)) db 0 | ||||
| part1: | ||||
|   db 0x80 | ||||
| .chs_start: | ||||
|   db 0xFF, 0xFF, 0xFF | ||||
| .type: | ||||
|   db 0x01 | ||||
| .chs_end: | ||||
|   db 0xFF, 0xFF, 0xFF | ||||
| .begin: | ||||
|   dd 1 | ||||
| .end: | ||||
|   dd (FLOPPY * 2) | ||||
| 
 | ||||
| times (0x1FE - ($-$$)) db 0 | ||||
| dw 0xAA55 | ||||
							
								
								
									
										113
									
								
								boot/pxeboot.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								boot/pxeboot.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,113 @@ | |||
| org BASE | ||||
| 
 | ||||
| main: | ||||
| 	mov ax, [es:bx+0x0A] | ||||
| 	mov [cs:pxejmp], ax | ||||
| 	mov ax, [es:bx+0x0A+2] | ||||
| 	mov [cs:pxejmp+2], ax | ||||
| 
 | ||||
|         mov ax, cs | ||||
|         mov ds, ax | ||||
|         mov si, pxejmp | ||||
|         call dump | ||||
| 
 | ||||
| 	mov ax, cs | ||||
| 	mov ds, ax | ||||
| 	mov di, pxestat | ||||
| 	mov bx, 0x0071 | ||||
| 
 | ||||
| 	call UsePXEAPI | ||||
| 
 | ||||
| 	mov ax, cs | ||||
| 	mov ds, ax | ||||
| 	mov si, pxestat | ||||
| 	call dump | ||||
| 	call dump | ||||
| 
 | ||||
| hlt:	hlt | ||||
| 	jmp hlt | ||||
| 
 | ||||
| UsePXEAPI: | ||||
| 	push ds | ||||
| 	push di | ||||
| 	push bx | ||||
| 	int 3 | ||||
| 	call far [pxejmp] | ||||
| 	int 3 | ||||
| 	add sp, 6 | ||||
| 	ret | ||||
| 
 | ||||
| pxejmp: dd 0 | ||||
| 
 | ||||
| pxestat: | ||||
|     .Status       dw 0 | ||||
|     .PacketType   dw 2 | ||||
|     .BufferSize   dw 0 | ||||
|        .BufferOff dw 0 | ||||
|        .BufferSeg dw 0 | ||||
|     .BufferLimit  dw 0 | ||||
| 
 | ||||
| ;tftp_open: | ||||
| ;    .Status       dw 0 | ||||
| ;    .SIP          dd 0 | ||||
| ;    .GIP          dd 0 | ||||
| ;    .Filename     db "pxe.bs" | ||||
| ;		  times (128-6) db 0 | ||||
| ;    .Port         dw 0 | ||||
| ;    .PacketSize   dw 0 | ||||
| 
 | ||||
| space: | ||||
| 	mov al, 0x20 | ||||
| 	jmp putc | ||||
| putbc: | ||||
| 	cmp al, 0x80 | ||||
| 	jnc dot | ||||
| 	cmp al, 0x20 | ||||
| 	jnc putc | ||||
| dot: | ||||
|         mov al, '.' | ||||
| putc: | ||||
| 	push ax | ||||
| 	push bx | ||||
| 	mov ah, 0x0e | ||||
| 	xor bx, bx | ||||
| 	int 0x10 | ||||
| 	pop bx | ||||
| 	pop ax | ||||
| 	ret | ||||
| 
 | ||||
| dump:	push cx | ||||
| 	mov ax, ds | ||||
| 	call print16 | ||||
| 	mov al, ':' | ||||
| 	call putc | ||||
| 	mov ax, si | ||||
| 	call print16 | ||||
| 	call space | ||||
| 	call space | ||||
| 
 | ||||
| 	mov cx, 0x08 | ||||
| 	push si | ||||
| .hloop:	lodsb | ||||
| 	call print8 | ||||
| 	lodsb | ||||
| 	call print8 | ||||
| 	call space | ||||
| 	loop .hloop | ||||
| 	pop si | ||||
| 	call space | ||||
| 
 | ||||
| 	mov cx, 0x10 | ||||
| .aloop: lodsb | ||||
| 	call putbc | ||||
| 	loop .aloop | ||||
| 
 | ||||
| 	mov al, 0x0A | ||||
| 	call putc | ||||
| 	mov al, 0x0D | ||||
| 	call putc | ||||
| 	pop cx | ||||
| 	ret | ||||
| 
 | ||||
| %include "print.asm" | ||||
| %include "printf.asm" | ||||
							
								
								
									
										90
									
								
								boot/serial.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								boot/serial.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,90 @@ | |||
| org 0x7c00 | ||||
| 
 | ||||
| xor ax, ax | ||||
| mov ds, ax | ||||
| mov es, ax | ||||
| mov ss, ax | ||||
| mov sp, 0x7c00 | ||||
| jmp 0:start | ||||
| 
 | ||||
| getc: | ||||
|   mov ah, 0x02 | ||||
|   mov dx, 0x0000 | ||||
|   int 0x14 | ||||
|   test ah, 0x80 | ||||
|   jnz getc | ||||
|   ret | ||||
| 
 | ||||
| putc: | ||||
|   mov ah, 0x01 | ||||
|   mov dx, 0x0000 | ||||
|   int 0x14 | ||||
|   ret | ||||
| 
 | ||||
| init_port: | ||||
|   mov ah, 0x00 | ||||
|   mov al, 0b11100011 | ||||
|   mov dx, 0x0000 | ||||
|   int 0x14 | ||||
|   ret | ||||
| 
 | ||||
| dump: | ||||
|   mov si, 0x500 | ||||
|   mov cx, di | ||||
|   sub cx, si | ||||
| .loop: | ||||
|   lodsb | ||||
|   call print8 | ||||
|   loop .loop | ||||
|   mov al, 0x0A | ||||
|   call putc | ||||
|   mov al, 0x0D | ||||
|   call putc | ||||
|   ret | ||||
| 
 | ||||
| line_reset: | ||||
|   cmp di, 0x500 | ||||
|   je .reset | ||||
|   call line_process | ||||
| .reset: | ||||
|   mov di, 0x500 | ||||
|   xor bp, bp | ||||
|   jmp mainloop | ||||
| 
 | ||||
| line_process: | ||||
|   call dump | ||||
|   ret | ||||
| 
 | ||||
| start: | ||||
|   call init_port | ||||
|   mov di, 0x500 | ||||
|   jmp line_reset | ||||
| 
 | ||||
| mainloop: | ||||
|   call getc | ||||
|   cmp al, ':' | ||||
|   je line_reset | ||||
|   cmp al, 0x20 | ||||
|   jb line_reset | ||||
|   sub al, 0x30 | ||||
|   cmp al, 9 | ||||
|   jbe .noadjust | ||||
|   sub al, 7 | ||||
| .noadjust: | ||||
|   test bp, bp | ||||
|   jnz .secondnib | ||||
|   mov cl, 4 | ||||
|   shl al, cl | ||||
|   mov [di], al | ||||
|   not bp | ||||
|   jmp mainloop | ||||
| .secondnib: | ||||
|   or [di], al | ||||
|   inc di | ||||
|   not bp | ||||
|   jmp mainloop | ||||
| 
 | ||||
| %include "print.asm" | ||||
| 
 | ||||
| times 510-($-$$) db 0x00 | ||||
| db 0x55,0xaa | ||||
							
								
								
									
										99
									
								
								boot/vga11.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								boot/vga11.asm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,99 @@ | |||
| org 0x7C00 | ||||
| 
 | ||||
| cols: equ 80 | ||||
| rows: equ 30 | ||||
| 
 | ||||
| main: | ||||
|   mov ax, cs | ||||
|   mov ds, ax | ||||
|   mov es, ax | ||||
|   mov ss, ax | ||||
|   xor sp, sp | ||||
| 
 | ||||
|   mov ah, 0x42 | ||||
|   mov si, dap | ||||
|   int 0x13 | ||||
| 
 | ||||
|   mov ax, 0x0011 | ||||
|   int 0x10 | ||||
| 
 | ||||
|   mov di, txtbuf | ||||
| .loop: | ||||
|   call sync | ||||
|   xor ax, ax | ||||
|   int 0x16 | ||||
|   stosb | ||||
|   jmp .loop | ||||
| 
 | ||||
| hlt: | ||||
|   hlt | ||||
|   jmp hlt | ||||
| 
 | ||||
| sync: | ||||
|   push ax | ||||
|   push si | ||||
|   push di | ||||
|   push es | ||||
|   mov si, txtbuf | ||||
|   mov ax, 0xA000 | ||||
|   mov es, ax | ||||
|   mov di, 0 | ||||
| 
 | ||||
|   mov bx, font | ||||
|   mov cx, rows | ||||
| .loop: | ||||
|   call charline | ||||
|   loop .loop | ||||
| 
 | ||||
|   pop es | ||||
|   pop di | ||||
|   pop si | ||||
|   pop ax | ||||
|   ret | ||||
| 
 | ||||
| charline: | ||||
|   push bx | ||||
|   push cx | ||||
|   mov cx, 8 | ||||
| .loop: | ||||
|   call scanline | ||||
|   call scanline | ||||
|   inc bh | ||||
|   loop .loop | ||||
|   add si, cols | ||||
|   pop cx | ||||
|   pop bx | ||||
|   ret | ||||
| 
 | ||||
| scanline: | ||||
|   push si | ||||
|   push cx | ||||
|   mov cx, cols | ||||
| .loop: | ||||
|   lodsb | ||||
|   mov bl, al | ||||
|   mov al, [bx] | ||||
|   stosb | ||||
|   loop .loop | ||||
|   pop cx | ||||
|   pop si | ||||
|   ret | ||||
| 
 | ||||
| dap: | ||||
|   db 0x10 | ||||
|   db 1 | ||||
|   dw 20 | ||||
|   dw font, 0 | ||||
|   dq 1 | ||||
| 
 | ||||
| times (510 - ($-$$)) nop | ||||
| 
 | ||||
| dw 0xAA55 | ||||
| 
 | ||||
| font: | ||||
|   incbin "cp437.bin" | ||||
| 
 | ||||
| txtbuf: | ||||
|   times (rows * cols) db 0 | ||||
| 
 | ||||
| end: | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue