since we cannot trust multiboot structures to be there we'll just yolo text mode
This commit is contained in:
		
							parent
							
								
									f4ec2a53ae
								
							
						
					
					
						commit
						66a7d8969a
					
				
					 1 changed files with 74 additions and 117 deletions
				
			
		
							
								
								
									
										191
									
								
								roska.fasm
									
										
									
									
									
								
							
							
						
						
									
										191
									
								
								roska.fasm
									
										
									
									
									
								
							| 
						 | 
					@ -12,9 +12,9 @@ MB_HEADER_FLAGS      equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST or
 | 
				
			||||||
MB_CHECKSUM          equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
 | 
					MB_CHECKSUM          equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;; safe modes according to https://wiki.osdev.org/VESA_Video_Modes
 | 
					;; safe modes according to https://wiki.osdev.org/VESA_Video_Modes
 | 
				
			||||||
VWIDTH  equ 640 ; 640/720
 | 
					VWIDTH  equ 80 ; 640/720
 | 
				
			||||||
VHEIGHT equ 480 ; 480
 | 
					VHEIGHT equ 25 ; 480
 | 
				
			||||||
VDEPTH  equ 32  ; 24/32
 | 
					VDEPTH  equ 0  ; 24/32, zero in textmode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multiboot:
 | 
					multiboot:
 | 
				
			||||||
	dd MB_HEADER_MAGIC
 | 
						dd MB_HEADER_MAGIC
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ multiboot:
 | 
				
			||||||
	dd bss_end	; bss end address
 | 
						dd bss_end	; bss end address
 | 
				
			||||||
	dd start	; entry address
 | 
						dd start	; entry address
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dd 0	; video mode_type (0:fb, 1:txt) (set flags[2]!)
 | 
						dd 1	; video mode_type (0:fb, 1:txt) (set flags[2]!)
 | 
				
			||||||
	dd VWIDTH	; video width
 | 
						dd VWIDTH	; video width
 | 
				
			||||||
	dd VHEIGHT	; video height
 | 
						dd VHEIGHT	; video height
 | 
				
			||||||
	dd VDEPTH	; video depth
 | 
						dd VDEPTH	; video depth
 | 
				
			||||||
| 
						 | 
					@ -39,132 +39,86 @@ start:
 | 
				
			||||||
	;push ebx ; mboot info struct addr
 | 
						;push ebx ; mboot info struct addr
 | 
				
			||||||
	;push eax ; 0x2BADB002
 | 
						;push eax ; 0x2BADB002
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	;mov [mbootmagic], eax
 | 
						mov [mbootmagic], eax
 | 
				
			||||||
	;mov [mbootaddr], ebx
 | 
						;mov [mbootaddr], ebx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	; store video info
 | 
						call con_disable_cursor
 | 
				
			||||||
	mov ecx, [ebx+88]
 | 
						call conclear
 | 
				
			||||||
	mov [fb.addr], ecx
 | 
					 | 
				
			||||||
	mov ecx, [ebx+98]
 | 
					 | 
				
			||||||
	mov [fb.pitch], ecx
 | 
					 | 
				
			||||||
	mov ecx, [ebx+100]
 | 
					 | 
				
			||||||
	mov [fb.width], ecx
 | 
					 | 
				
			||||||
	mov ecx, [ebx+104]
 | 
					 | 
				
			||||||
	mov [fb.height], ecx
 | 
					 | 
				
			||||||
	mov cl, [ebx+108]
 | 
					 | 
				
			||||||
	mov [fb.depth], cl
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	; calculate bytespp
 | 
						mov esi, msg.roskainiting
 | 
				
			||||||
	movzx eax, cl
 | 
						call conwriteln
 | 
				
			||||||
	mov cl, 8
 | 
					 | 
				
			||||||
	div byte cl
 | 
					 | 
				
			||||||
	mov [fb.bytespp], al
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	; color component positions
 | 
					 | 
				
			||||||
	mov cl, [ebx+110+2]
 | 
					 | 
				
			||||||
	mov [fb.rpos], cl
 | 
					 | 
				
			||||||
	;mov cl, [ebx+111]
 | 
					 | 
				
			||||||
	;mov [fb.rmasksize], cl
 | 
					 | 
				
			||||||
	mov cl, [ebx+112+2]
 | 
					 | 
				
			||||||
	mov [fb.gpos], cl
 | 
					 | 
				
			||||||
	;mov cl, [ebx+113]
 | 
					 | 
				
			||||||
	;mov [fb.gmasksize], cl
 | 
					 | 
				
			||||||
	mov cl, [ebx+114+2]
 | 
					 | 
				
			||||||
	mov [fb.bpos], cl
 | 
					 | 
				
			||||||
	;mov cl, [ebx+115]
 | 
					 | 
				
			||||||
	;mov [fb.bmasksize], cl
 | 
					 | 
				
			||||||
testpixels:
 | 
					 | 
				
			||||||
	; construct pixel R
 | 
					 | 
				
			||||||
	mov al, 0xff ;r
 | 
					 | 
				
			||||||
	mov ah, 0x00 ;g
 | 
					 | 
				
			||||||
	mov ch, 0x00 ;b
 | 
					 | 
				
			||||||
	xor edx, edx ;final pixel
 | 
					 | 
				
			||||||
	;ebx is temp pixel
 | 
					 | 
				
			||||||
	movzx ebx, al
 | 
					 | 
				
			||||||
	mov cl, [fb.rpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.rmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	movzx ebx, ah
 | 
					 | 
				
			||||||
	mov cl, [fb.gpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.gmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	movzx ebx, ch
 | 
					 | 
				
			||||||
	mov cl, [fb.bpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.bmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	mov ecx, [fb.addr]
 | 
					 | 
				
			||||||
	mov [ecx], edx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	; construct pixel G
 | 
					 | 
				
			||||||
	mov al, 0x00 ;r
 | 
					 | 
				
			||||||
	mov ah, 0xff ;g
 | 
					 | 
				
			||||||
	mov ch, 0x00 ;b
 | 
					 | 
				
			||||||
	xor edx, edx ;final pixel
 | 
					 | 
				
			||||||
	;ebx is temp pixel
 | 
					 | 
				
			||||||
	movzx ebx, al
 | 
					 | 
				
			||||||
	mov cl, [fb.rpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.rmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	movzx ebx, ah
 | 
					 | 
				
			||||||
	mov cl, [fb.gpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.gmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	movzx ebx, ch
 | 
					 | 
				
			||||||
	mov cl, [fb.bpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.bmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	mov ecx, [fb.addr]
 | 
					 | 
				
			||||||
	movzx ebx, [fb.bytespp]
 | 
					 | 
				
			||||||
	add ecx, ebx
 | 
					 | 
				
			||||||
	mov [ecx], edx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	; construct pixel B
 | 
					 | 
				
			||||||
	mov al, 0x00 ;r
 | 
					 | 
				
			||||||
	mov ah, 0x00 ;g
 | 
					 | 
				
			||||||
	mov ch, 0xff ;b
 | 
					 | 
				
			||||||
	xor edx, edx ;final pixel
 | 
					 | 
				
			||||||
	;ebx is temp pixel
 | 
					 | 
				
			||||||
	movzx ebx, al
 | 
					 | 
				
			||||||
	mov cl, [fb.rpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.rmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	movzx ebx, ah
 | 
					 | 
				
			||||||
	mov cl, [fb.gpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.gmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	movzx ebx, ch
 | 
					 | 
				
			||||||
	mov cl, [fb.bpos]
 | 
					 | 
				
			||||||
	shl ebx, cl
 | 
					 | 
				
			||||||
	;and ebx, [fb.bmasksize]
 | 
					 | 
				
			||||||
	or edx, ebx
 | 
					 | 
				
			||||||
	mov ecx, [fb.addr]
 | 
					 | 
				
			||||||
	movzx ebx, [fb.bytespp]
 | 
					 | 
				
			||||||
	add ecx, ebx
 | 
					 | 
				
			||||||
	add ecx, ebx
 | 
					 | 
				
			||||||
	mov [ecx], edx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	;mov dword [edx], 0xff00ff00
 | 
					 | 
				
			||||||
testpixels_end:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
hang:
 | 
					hang:
 | 
				
			||||||
	;cli
 | 
						;cli
 | 
				
			||||||
	.loop:
 | 
						.loop:
 | 
				
			||||||
		;hlt
 | 
							;hlt
 | 
				
			||||||
		jmp .loop
 | 
							jmp .loop
 | 
				
			||||||
error:
 | 
					
 | 
				
			||||||
	mov dword [0xFD000000], 0x00FF0000
 | 
					;give character in AL
 | 
				
			||||||
	jmp hang
 | 
					conputchar:
 | 
				
			||||||
 | 
						mov ah, [txtbuf.col]
 | 
				
			||||||
 | 
						mov dx, ax
 | 
				
			||||||
 | 
						; dx has the whole character cell now
 | 
				
			||||||
 | 
						xor eax, eax
 | 
				
			||||||
 | 
						mov al, [txtbuf.y]
 | 
				
			||||||
 | 
						mov bl, 25
 | 
				
			||||||
 | 
						mul bl
 | 
				
			||||||
 | 
						movzx bx, [txtbuf.x]
 | 
				
			||||||
 | 
						add ax, bx
 | 
				
			||||||
 | 
						add ax, ax
 | 
				
			||||||
 | 
						add eax, 0xb8000
 | 
				
			||||||
 | 
						mov [eax], dx
 | 
				
			||||||
 | 
						cmp bl, 24
 | 
				
			||||||
 | 
						je connewline
 | 
				
			||||||
 | 
						inc bl
 | 
				
			||||||
 | 
						mov [txtbuf.x], bl
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					conwriteln:
 | 
				
			||||||
 | 
						lodsb
 | 
				
			||||||
 | 
						cmp al, 0
 | 
				
			||||||
 | 
						je connewline
 | 
				
			||||||
 | 
						call conputchar
 | 
				
			||||||
 | 
						jmp conwriteln
 | 
				
			||||||
 | 
					connewline:
 | 
				
			||||||
 | 
						mov [txtbuf.x], 0
 | 
				
			||||||
 | 
						mov al, [txtbuf.y]
 | 
				
			||||||
 | 
						cmp al, 24
 | 
				
			||||||
 | 
						je conscroll
 | 
				
			||||||
 | 
						inc al
 | 
				
			||||||
 | 
						mov [txtbuf.y], al
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					conscroll:
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					conclear:
 | 
				
			||||||
 | 
						mov ecx, 80*25
 | 
				
			||||||
 | 
						mov edi, 0xb8000
 | 
				
			||||||
 | 
						mov ah, 0x07
 | 
				
			||||||
 | 
						mov al, 0
 | 
				
			||||||
 | 
						rep stosw
 | 
				
			||||||
 | 
						mov [txtbuf.col], ah
 | 
				
			||||||
 | 
						mov [txtbuf.x], 0
 | 
				
			||||||
 | 
						mov [txtbuf.y], 0
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					con_disable_cursor:
 | 
				
			||||||
 | 
						mov dx, 0x3D4
 | 
				
			||||||
 | 
						mov al, 0xA	; low cursor shape register
 | 
				
			||||||
 | 
						out dx, al
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inc dx
 | 
				
			||||||
 | 
						mov al, 0x20	; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape
 | 
				
			||||||
 | 
						out dx, al
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mbootaddr: dd 0
 | 
					mbootaddr: dd 0
 | 
				
			||||||
mbootmagic: dd 0
 | 
					mbootmagic: dd 0
 | 
				
			||||||
 | 
					txtbuf:
 | 
				
			||||||
 | 
						.x db 0
 | 
				
			||||||
 | 
						.y db 0
 | 
				
			||||||
 | 
						.col db 0x07 ;gray on black
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fb:
 | 
					fb:
 | 
				
			||||||
	.addr dd 0
 | 
						.addr dd 0
 | 
				
			||||||
	.pitch dd 0
 | 
						.pitch dd 0
 | 
				
			||||||
| 
						 | 
					@ -179,6 +133,9 @@ fb:
 | 
				
			||||||
	.bpos db 0
 | 
						.bpos db 0
 | 
				
			||||||
	;.bmasksize db 0
 | 
						;.bmasksize db 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg:
 | 
				
			||||||
 | 
						.roskainiting db "rOSka initializing...", 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
align 4096
 | 
					align 4096
 | 
				
			||||||
bss_start:
 | 
					bss_start:
 | 
				
			||||||
align 4096
 | 
					align 4096
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue