All pastes #161685 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-09-05 18:34 UTC
rendered paste body
;//////////////////////////////////////////////////////////////////////////////
;// Interrupt 0x10
;//////////////////////////////////////////////////////////////////////////////
int0x10:
	cmp ah, 0x00
	je .0x00
	cmp ah, 0x02
	je .0x02
	cmp ah, 0x09
	je .0x09
	cmp ah, 0x0E
	je .0x0E
	cmp ah, 0x13
	je .0x13
	cmp ah, 0x10
	je .0x10
	
	cli
	hlt
	
	;TODO: Set video mode
	.0x00:
		iret
	;TODO: Textmode: Set Cursor position
	.0x02:
		push ax
		push ds
		mov ax, 0xF000
		mov ds, ax
		mov al, 160
		mul dh
		push dx
		xor dh, dh
		add ax, dx
		pop dx
		mov [vram_offset], ax
		pop ds
		pop ax
		iret
	
	;Textmode: Write character with attribute to current offset
	;TODO: Screen page
	;TODO: xor attribute if 7th bit in bl set
	.0x09:
		push si
		push ds
		push ax
		mov ax, 0xF000
		mov ds, ax
		mov si, [vram_offset]
		push si
		add si, cx
		add si, cx
		mov [vram_offset], si
		pop si
		mov ax, 0xB800
		mov ds, ax
		pop ax
		.loop:
			mov [ds:si], al
			inc si
			mov [ds:si], bl
			inc si
			loop .loop
		pop ds
		pop si
		iret
	
	;Textmode: Write character to current offset
	.0x0E:
		push si
		push ds
		push ax
		mov ax, 0xF000
		mov ds, ax
		mov si, [vram_offset]
		mov ax, 0xB800
		mov ds, ax
		pop ax
		push ax
		cmp al, 10
		je .0x0E.10
		cmp al, 13
		je .0x0E.13
		mov [ds:si], al
		inc si
		push bx
		mov bh, [ds:si]
		and bl, 0x0F
		and bh, 0xF0
		or bl, bh
		mov [ds:si], bl
		pop bx
		inc si
		jmp .0x0E.end
		
		.0x0E.10:
			add si, 160
			jmp .0x0E.end
		
		.0x0E.13:
			push bx
			mov ax, si
			mov bl, 160
			div bl
			pop bx
			shr ax, 8
			sub si, ax
			jmp .0x0E.end
		
		.0x0E.end:
			mov ax, 0xF000
			mov ds, ax
			mov [vram_offset], si
			pop ax
			pop ds
			pop si
			iret
	
	.0x10:
		iret
	
	;Textmode: Write string
	.0x13:
		push ax
		push ds
		push word 0xB800
		pop ds
		push di
		push ax
		
		push dx
		push bx
		mov al, dl
		mov bl, 160
		mul bl
		pop bx
		shr dx, 7
		add ax, dx
		mov di, ax
		pop dx
		
		pop ax
		and ax, 0x02
		jz .noattr
		.attr:
			.loop1:
				mov ax, [es:bp]
				cmp al, 10
				je .loop1.10
				cmp al, 13
				je .loop1.13
				jmp .loop1.else
				
				;Line feed
				.loop1.10:
					add di, 160
					jmp .loop1.end
				;Carriage return
				.loop1.13:
					push bx
					mov ax, di
					mov bl, 160
					div bl
					pop bx
					shr ax, 8
					sub di, ax
					jmp .loop1.end
				;Normal char
				.loop1.else:
					mov [ds:di], ax
					add di, 2
					
				.loop1.end:
					add bp, 2
					loop .loop1
					jmp .end
		.noattr:
			.loop2:
				mov al, [es:bp]
				cmp al, 10
				je .loop2.10
				cmp al, 13
				je .loop2.13
				jmp .loop2.else
				
				;Line feed
				.loop2.10:
					add di, 160
					jmp .loop2.end
				;Carriage return
				.loop2.13:
					push bx
					mov ax, di
					mov bl, 160
					div bl
					pop bx
					shr ax, 8
					sub di, ax
					jmp .loop2.end
				;Normal char
				.loop2.else:
					mov ah, bl
					mov [ds:di], ax
					add di, 2
				
				.loop2.end:
					add bp, 1
					loop .loop2
					jmp .end
		.end:
			mov bp, di
			pop di
			pop ds
			pop ax
			push ds
			push ax
			and al, 0x01
			jz .end2
			mov ax, 0xF000
			mov ds, ax
			mov [vram_offset], bp
		.end2:
			pop ax
			pop ds
			iret