177 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 	;; File: a20.inc
 | |
| 	;; copy/pasted from https://wiki.osdev.org/A20_Line
 | |
|     ;; .... sorry I was lazy :x
 | |
| 
 | |
| 	;; Function: a20_get_state
 | |
| a20_get_state:
 | |
|         pushf
 | |
|         push si
 | |
|         push di
 | |
|         push ds
 | |
|         push es
 | |
| 
 | |
|         cli
 | |
| 
 | |
|         xor ax, ax
 | |
|         mov ds, ax
 | |
|         mov si, 0x500
 | |
| 
 | |
|         not ax
 | |
|         mov es, ax
 | |
|         mov di, 0x0510
 | |
| 
 | |
|         mov al, [ds:si]  ; save old values
 | |
|         mov byte [.BufferBelowMB], al
 | |
|         mov al, [es:di]
 | |
|         mov byte [.BufferOverMB], al
 | |
|  
 | |
|         mov ah, 1 ; check byte [0x00100500] == byte [0x0500]
 | |
|         mov byte [ds:si], 0
 | |
|         mov byte [es:di], 1
 | |
|         mov al, [ds:si]
 | |
|         cmp al, [es:di]
 | |
|         jne .exit
 | |
|         dec ah
 | |
| .exit:
 | |
|         mov al, [.BufferBelowMB]
 | |
|         mov [ds:si], al
 | |
|         mov al, [.BufferOverMB]
 | |
|         mov [es:di], al
 | |
|         shr ax, 8
 | |
|         sti
 | |
|         pop es
 | |
|         pop ds
 | |
|         pop di
 | |
|         pop si
 | |
|         popf
 | |
|         ret
 | |
|  
 | |
| .BufferBelowMB: db 0
 | |
| .BufferOverMB   db 0
 | |
| 
 | |
| 	;; Function: a20_query_support
 | |
| a20_query_support:
 | |
|         push bx
 | |
|         clc
 | |
|  
 | |
|         mov ax, 0x2403
 | |
|         int 0x15
 | |
|         jc .error
 | |
|  
 | |
|         test ah, ah
 | |
|         jnz .error
 | |
|  
 | |
|         mov ax, bx
 | |
|         pop bx
 | |
|         ret
 | |
| .error:
 | |
|         stc
 | |
|         pop bx
 | |
|         ret
 | |
|  
 | |
| 	;; Function: a20_enable_keyboard_controller
 | |
| a20_enable_keyboard_controller:
 | |
|         cli
 | |
|  
 | |
|         call .wait_io1
 | |
|         mov al, 0xad
 | |
|         out 0x64, al
 | |
|  
 | |
|         call .wait_io1
 | |
|         mov al, 0xd0
 | |
|         out 0x64, al
 | |
|  
 | |
|         call .wait_io2
 | |
|         in al, 0x60
 | |
|         push eax
 | |
|  
 | |
|         call .wait_io1
 | |
|         mov al, 0xd1
 | |
|         out 0x64, al
 | |
|  
 | |
|         call .wait_io1
 | |
|         pop eax
 | |
|         or al, 2
 | |
|         out 0x60, al
 | |
|  
 | |
|         call .wait_io1
 | |
|         mov al, 0xae
 | |
|         out 0x64, al
 | |
|  
 | |
|         call .wait_io1
 | |
|         sti
 | |
|         ret
 | |
| .wait_io1:
 | |
|         in al, 0x64
 | |
|         test al, 2
 | |
|         jnz .wait_io1
 | |
|         ret
 | |
| .wait_io2:
 | |
|         in al, 0x64
 | |
|         test al, 1
 | |
|         jz .wait_io2
 | |
|         ret
 | |
|  
 | |
| 	;; Function: a20_enable
 | |
| 	;; 
 | |
|     ;; Out:
 | |
|     ;;     CF - set on error
 | |
| 	;;
 | |
| a20_enable:
 | |
|         clc                                                                     ;       clear cf
 | |
|         pusha
 | |
|         mov bh, 0                                                       ;       clear bh
 | |
|  
 | |
|         call a20_get_state
 | |
|         jc .fast_gate
 | |
|  
 | |
|         test ax, ax
 | |
|         jnz .done
 | |
|  
 | |
|         call a20_query_support
 | |
|         mov bl, al
 | |
|         test bl, 1                                                      ;       enable A20 using keyboard controller
 | |
|         jnz .keybord_controller
 | |
|  
 | |
|         test bl, 2                                                      ;       enable A20 using fast A20 gate
 | |
|         jnz .fast_gate
 | |
| .bios_int:
 | |
|         mov ax, 0x2401
 | |
|         int 0x15
 | |
|         jc .fast_gate
 | |
|         test ah, ah
 | |
|         jnz .failed
 | |
|         call a20_get_state
 | |
|         test ax, ax
 | |
|         jnz .done
 | |
| .fast_gate:
 | |
|         in al, 0x92
 | |
|         test al, 2
 | |
|         jnz .done
 | |
|  
 | |
|         or al, 2
 | |
|         and al, 0xfe
 | |
|         out 0x92, al
 | |
|  
 | |
|         call a20_get_state
 | |
|         test ax, ax
 | |
|         jnz .done
 | |
|  
 | |
|         test bh, bh                                                     ;       test if there was an attempt using the keyboard controller
 | |
|         jnz .failed
 | |
| .keybord_controller:
 | |
|         call a20_enable_keyboard_controller
 | |
|         call a20_get_state
 | |
|         test ax, ax
 | |
|         jnz .done
 | |
|  
 | |
|         mov bh, 1                                                       ;       flag enable attempt with keyboard controller
 | |
|  
 | |
|         test bl, 2
 | |
|         jnz .fast_gate
 | |
|         jmp .failed
 | |
| .failed:
 | |
|         stc
 | |
| .done:
 | |
|         popa
 | |
|         ret
 |