forked from KolibriOS/kolibrios
5731 lines
118 KiB
NASM
5731 lines
118 KiB
NASM
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;;
|
|||
|
;; Kolibri OS - based on source code Menuet OS, but not 100% compatible.
|
|||
|
;;
|
|||
|
;; See file COPYING or GNU.TXT for details with these additional details:
|
|||
|
;; - All code written in 32 bit x86 assembly language
|
|||
|
;; - No external code (eg. bios) at process execution time
|
|||
|
;;
|
|||
|
;;
|
|||
|
;; Compile with last version FASM
|
|||
|
;;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
include "KGLOBALS.INC"
|
|||
|
include "lang.inc"
|
|||
|
|
|||
|
WinMapAddress equ 0x460000
|
|||
|
display_data = 0x460000
|
|||
|
|
|||
|
max_processes equ 255
|
|||
|
|
|||
|
window_data equ 0x0000
|
|||
|
tss_data equ 0xD20000
|
|||
|
;tss_step equ (128+2048) ; tss & i/o - 16384 ports, * 256=557056
|
|||
|
tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
|
|||
|
draw_data equ 0xC00000
|
|||
|
sysint_stack_data equ 0xC03000
|
|||
|
|
|||
|
|
|||
|
twdw equ (0x3000-window_data)
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;;
|
|||
|
;; Included files:
|
|||
|
;;
|
|||
|
;; Kernel16.inc
|
|||
|
;; - Booteng.inc English text for bootup
|
|||
|
;; - Bootcode.inc Hardware setup
|
|||
|
;; - Pci16.inc PCI functions
|
|||
|
;;
|
|||
|
;; Kernel32.inc
|
|||
|
;; - Sys32.inc Process management
|
|||
|
;; - Shutdown.inc Shutdown and restart
|
|||
|
;; - Fat32.inc Read / write hd
|
|||
|
;; - Vesa12.inc Vesa 1.2 driver
|
|||
|
;; - Vesa20.inc Vesa 2.0 driver
|
|||
|
;; - Vga.inc VGA driver
|
|||
|
;; - Stack.inc Network interface
|
|||
|
;; - Mouse.inc Mouse pointer
|
|||
|
;; - Scincode.inc Window skinning
|
|||
|
;; - Pci32.inc PCI functions
|
|||
|
;;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;; ;;
|
|||
|
;; 16 BIT ENTRY FROM BOOTSECTOR ;;
|
|||
|
;; ;;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
use16
|
|||
|
org 0x10000
|
|||
|
macro diff16 title,l2
|
|||
|
{
|
|||
|
local s,d,l1
|
|||
|
s = l2
|
|||
|
display title,': 0x'
|
|||
|
repeat 8
|
|||
|
d = 48 + s shr ((8-%) shl 2) and $0F
|
|||
|
if d > 57
|
|||
|
d = d + 65-57-1
|
|||
|
end if
|
|||
|
display d
|
|||
|
end repeat
|
|||
|
display 13,10
|
|||
|
}
|
|||
|
jmp start_of_code
|
|||
|
|
|||
|
; mike.dld {
|
|||
|
db 0
|
|||
|
dd servetable-0x10000
|
|||
|
draw_line dd __sys_draw_line
|
|||
|
disable_mouse dd __sys_disable_mouse
|
|||
|
draw_pointer dd __sys_draw_pointer
|
|||
|
drawbar dd __sys_drawbar
|
|||
|
putpixel dd __sys_putpixel
|
|||
|
; } mike.dld
|
|||
|
|
|||
|
version db 'Kolibri OS version 0.5.0.0 ',13,10,13,10,0
|
|||
|
;dd endofcode-0x10000
|
|||
|
|
|||
|
;db 'Boot02'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include "boot/preboot.inc"
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
|
|||
|
preboot_lfb db 0
|
|||
|
preboot_bootlog db 0
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;; ;;
|
|||
|
;; 16 BIT INCLUDED FILES ;;
|
|||
|
;; ;;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
include "KERNEL16.INC"
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;; ;;
|
|||
|
;; SWITCH TO 32 BIT PROTECTED MODE ;;
|
|||
|
;; ;;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
os_data equ os_data_l-gdts ; GDTs
|
|||
|
os_code equ os_code_l-gdts
|
|||
|
int_code equ int_code_l-gdts
|
|||
|
int_data equ int_data_l-gdts
|
|||
|
tss0sys equ tss0sys_l-gdts
|
|||
|
graph_data equ 3+graph_data_l-gdts
|
|||
|
tss0 equ tss0_l-gdts
|
|||
|
tss0i equ tss0i_l-gdts
|
|||
|
app_code equ 3+app_code_l-gdts
|
|||
|
app_data equ 3+app_data_l-gdts
|
|||
|
|
|||
|
|
|||
|
|
|||
|
; CR0 Flags - Protected mode and Paging
|
|||
|
|
|||
|
mov ecx,0x00000001
|
|||
|
;and ebx,65535
|
|||
|
;cmp ebx,00100000000000000b ; lfb -> paging
|
|||
|
;jb no_paging
|
|||
|
;mov ax,0x0000
|
|||
|
;mov es,ax
|
|||
|
;mov al,[es:0x901E]
|
|||
|
;cmp al,1
|
|||
|
;je no_paging
|
|||
|
;or ecx, 0x80000000
|
|||
|
;no_paging:
|
|||
|
|
|||
|
; Enabling 32 bit protected mode
|
|||
|
|
|||
|
sidt [cs:old_ints_h-0x10000]
|
|||
|
|
|||
|
cli ; disable all irqs
|
|||
|
cld
|
|||
|
mov al,255 ; mask all irqs
|
|||
|
out 0xa1,al
|
|||
|
out 0x21,al
|
|||
|
l.5: in al, 0x64 ; Enable A20
|
|||
|
test al, 2
|
|||
|
jnz l.5
|
|||
|
mov al, 0xD1
|
|||
|
out 0x64, al
|
|||
|
l.6: in al, 0x64
|
|||
|
test al, 2
|
|||
|
jnz l.6
|
|||
|
mov al, 0xDF
|
|||
|
out 0x60, al
|
|||
|
lgdt [cs:gdts-0x10000] ; Load GDT
|
|||
|
mov eax, cr0 ; Turn on paging // protected mode
|
|||
|
or eax, ecx
|
|||
|
and eax, 10011111b *65536*256 + 0xffffff ; caching enabled
|
|||
|
mov cr0, eax
|
|||
|
jmp byte $+2
|
|||
|
mov ax,os_data ; Selector for os
|
|||
|
mov ds,ax
|
|||
|
mov es,ax
|
|||
|
mov fs,ax
|
|||
|
mov gs,ax
|
|||
|
mov ss,ax
|
|||
|
mov esp,0x30000 ; Set stack
|
|||
|
jmp pword os_code:B32 ; jmp to enable 32 bit mode
|
|||
|
|
|||
|
use32
|
|||
|
|
|||
|
iglobal
|
|||
|
boot_memdetect db 'Determining amount of memory',0
|
|||
|
boot_fonts db 'Fonts loaded',0
|
|||
|
boot_tss db 'Setting TSSs',0
|
|||
|
boot_cpuid db 'Reading CPUIDs',0
|
|||
|
boot_devices db 'Detecting devices',0
|
|||
|
boot_timer db 'Setting timer',0
|
|||
|
boot_irqs db 'Reprogramming IRQs',0
|
|||
|
boot_setmouse db 'Setting mouse',0
|
|||
|
boot_windefs db 'Setting window defaults',0
|
|||
|
boot_bgr db 'Calculating background',0
|
|||
|
boot_resirqports db 'Reserving IRQs & ports',0
|
|||
|
boot_setrports db 'Setting addresses for IRQs',0
|
|||
|
boot_setostask db 'Setting OS task',0
|
|||
|
boot_allirqs db 'Unmasking all IRQs',0
|
|||
|
boot_tsc db 'Reading TSC',0
|
|||
|
boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0
|
|||
|
boot_pal_vga db 'Setting VGA 640x480 palette',0
|
|||
|
boot_mtrr db 'Setting MTRR',0
|
|||
|
boot_tasking db 'All set - press ESC to start',0
|
|||
|
endg
|
|||
|
|
|||
|
iglobal
|
|||
|
boot_y dd 10
|
|||
|
endg
|
|||
|
|
|||
|
boot_log:
|
|||
|
pushad
|
|||
|
|
|||
|
mov edx,esi
|
|||
|
.bll3: inc edx
|
|||
|
cmp [edx],byte 0
|
|||
|
jne .bll3
|
|||
|
sub edx,esi
|
|||
|
mov eax,10*65536
|
|||
|
mov ax,word [boot_y]
|
|||
|
add [boot_y],dword 10
|
|||
|
mov ebx,0xffffff
|
|||
|
mov ecx,esi
|
|||
|
mov edi,1
|
|||
|
call dtext
|
|||
|
|
|||
|
mov [novesachecksum],1000
|
|||
|
call checkEgaCga
|
|||
|
|
|||
|
cmp [preboot_blogesc],byte 1
|
|||
|
je .bll2
|
|||
|
|
|||
|
cmp esi,boot_tasking
|
|||
|
jne .bll2
|
|||
|
; begin ealex 04.08.05
|
|||
|
; in al,0x61
|
|||
|
; and al,01111111b
|
|||
|
; out 0x61,al
|
|||
|
; end ealex 04.08.05
|
|||
|
.bll1: in al,0x60 ; wait for ESC key press
|
|||
|
cmp al,129
|
|||
|
jne .bll1
|
|||
|
|
|||
|
.bll2: popad
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
cpuid_0 dd 0,0,0,0
|
|||
|
cpuid_1 dd 0,0,0,0
|
|||
|
cpuid_2 dd 0,0,0,0
|
|||
|
cpuid_3 dd 0,0,0,0
|
|||
|
endg
|
|||
|
|
|||
|
iglobal
|
|||
|
firstapp db 'LAUNCHER '
|
|||
|
char db 'CHAR MT '
|
|||
|
char2 db 'CHAR2 MT '
|
|||
|
bootpath db '/KOLIBRI '
|
|||
|
bootpath2 db 0
|
|||
|
vmode db 'VMODE MDR'
|
|||
|
vrr_m db 'VRR_M '
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;; ;;
|
|||
|
;; 32 BIT ENTRY ;;
|
|||
|
;; ;;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
B32:
|
|||
|
; CLEAR 0x280000-0xF00000
|
|||
|
|
|||
|
xor eax,eax
|
|||
|
mov edi,0x280000
|
|||
|
mov ecx,(0x100000*0xF-0x280000) / 4
|
|||
|
cld
|
|||
|
rep stosd
|
|||
|
; CLEAR 0x80000-0x90000
|
|||
|
; xor eax,eax
|
|||
|
mov edi,0x80000
|
|||
|
mov ecx,(0x90000-0x80000)/4
|
|||
|
; cld
|
|||
|
rep stosd
|
|||
|
|
|||
|
; CLEAR KERNEL UNDEFINED GLOBALS
|
|||
|
mov edi, endofcode
|
|||
|
mov ecx, (uglobals_size/4)+4
|
|||
|
rep stosd
|
|||
|
|
|||
|
; SAVE & CLEAR 0-0xffff
|
|||
|
|
|||
|
mov esi,0x0000
|
|||
|
mov edi,0x2F0000
|
|||
|
mov ecx,0x10000 / 4
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
xor eax,eax
|
|||
|
mov edi,0
|
|||
|
mov ecx,0x10000 / 4
|
|||
|
cld
|
|||
|
rep stosd
|
|||
|
|
|||
|
; SAVE REAL MODE VARIABLES
|
|||
|
; movzx eax,byte [0x2f0000+0x9010] ; mouse port
|
|||
|
; mov [0xF604],byte 1 ;al
|
|||
|
mov al,[0x2f0000+0x9000] ; bpp
|
|||
|
mov [0xFBF1],al
|
|||
|
movzx eax,word [0x2f0000+0x900A] ; X max
|
|||
|
dec eax
|
|||
|
mov [0xfe00],eax
|
|||
|
movzx eax,word [0x2f0000+0x900C] ; Y max
|
|||
|
dec eax
|
|||
|
mov [0xfe04],eax
|
|||
|
movzx eax,word [0x2f0000+0x9008] ; screen mode
|
|||
|
mov [0xFE0C],eax
|
|||
|
mov eax,[0x2f0000+0x9014] ; Vesa 1.2 bnk sw add
|
|||
|
mov [0xE030],eax
|
|||
|
mov [0xfe08],word 640*4 ; Bytes PerScanLine
|
|||
|
cmp [0xFE0C],word 0x13 ; 320x200
|
|||
|
je @f
|
|||
|
cmp [0xFE0C],word 0x12 ; VGA 640x480
|
|||
|
je @f
|
|||
|
mov ax,[0x2f0000+0x9001] ; for other modes
|
|||
|
mov [0xfe08],ax
|
|||
|
@@:
|
|||
|
|
|||
|
; GRAPHICS ADDRESSES
|
|||
|
|
|||
|
;mov eax,0x100000*8 ; LFB address
|
|||
|
;cmp [0xfe0c],word 0x13
|
|||
|
;je no_d_lfb
|
|||
|
;cmp [0xfe0c],word 0x12
|
|||
|
;je no_d_lfb
|
|||
|
;cmp [0x2f0000+0x901e],byte 1
|
|||
|
;jne no_d_lfb
|
|||
|
mov byte [0x2f0000+0x901e],0x0
|
|||
|
mov eax,[0x2f0000+0x9018]
|
|||
|
;no_d_lfb:
|
|||
|
mov [0xfe80],eax
|
|||
|
|
|||
|
cmp [0xfe0c],word 0100000000000000b
|
|||
|
jge setvesa20
|
|||
|
cmp [0xfe0c],word 0x13
|
|||
|
je v20ga32
|
|||
|
mov [0xe020],dword Vesa12_putpixel24 ; Vesa 1.2
|
|||
|
mov [0xe024],dword Vesa12_getpixel24
|
|||
|
cmp [0xfbf1],byte 24
|
|||
|
jz ga24
|
|||
|
mov [0xe020],dword Vesa12_putpixel32
|
|||
|
mov [0xe024],dword Vesa12_getpixel32
|
|||
|
ga24:
|
|||
|
jmp v20ga24
|
|||
|
setvesa20:
|
|||
|
mov [0xe020],dword Vesa20_putpixel24 ; Vesa 2.0
|
|||
|
mov [0xe024],dword Vesa20_getpixel24
|
|||
|
cmp [0xfbf1],byte 24
|
|||
|
jz v20ga24
|
|||
|
v20ga32:
|
|||
|
mov [0xe020],dword Vesa20_putpixel32
|
|||
|
mov [0xe024],dword Vesa20_getpixel32
|
|||
|
v20ga24:
|
|||
|
cmp [0xfe0c],word 0x12 ; 16 C VGA 640x480
|
|||
|
jne no_mode_0x12
|
|||
|
mov [0xe020],dword VGA_putpixel
|
|||
|
mov [0xe024],dword Vesa20_getpixel32
|
|||
|
no_mode_0x12:
|
|||
|
|
|||
|
; MEMORY MODEL
|
|||
|
|
|||
|
; mov [0xfe84],dword 0x100000*16 ; apps mem base address
|
|||
|
; movzx ecx,byte [0x2f0000+0x9030]
|
|||
|
; dec ecx
|
|||
|
; mov eax,16*0x100000 ; memory-16
|
|||
|
; shl eax,cl
|
|||
|
; mov [0xfe8c],eax ; memory for use
|
|||
|
; cmp eax,16*0x100000
|
|||
|
; jne no16mb
|
|||
|
; mov [0xfe84],dword 0xD80000 ; !!! 10 !!!
|
|||
|
; no16mb:
|
|||
|
|
|||
|
; init:
|
|||
|
; 1) 0xFE84 - applications base
|
|||
|
; 2) 0xFE8C - total amount of memory
|
|||
|
|
|||
|
xor edi, edi
|
|||
|
m_GMS_loop:
|
|||
|
add edi, 0x400000
|
|||
|
mov eax, dword [edi]
|
|||
|
mov dword [edi], 'TEST'
|
|||
|
wbinvd
|
|||
|
cmp dword [edi], 'TEST'
|
|||
|
jne m_GMS_exit
|
|||
|
cmp dword [0], 'TEST'
|
|||
|
je m_GMS_exit
|
|||
|
mov dword [es:edi], eax
|
|||
|
jmp m_GMS_loop
|
|||
|
m_GMS_exit:
|
|||
|
mov [edi], eax
|
|||
|
; now edi contains the EXACT amount of memory
|
|||
|
|
|||
|
mov eax, 0x100000*16
|
|||
|
cmp edi, eax ;0x100000*16
|
|||
|
jb $ ; less than 16 Mb
|
|||
|
|
|||
|
mov dword [0xFE84], eax ;0x100000*16
|
|||
|
cmp edi, eax ;0x100000*16
|
|||
|
jne @f
|
|||
|
mov dword [0xFE84], 0xD80000 ; =0x100000*13.5
|
|||
|
@@:
|
|||
|
mov dword [0xFE8C], edi
|
|||
|
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include 'detect/disks.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
|
|||
|
; CHECK EXTRA REGION
|
|||
|
; ENABLE PAGING
|
|||
|
mov eax,cr0
|
|||
|
or eax,0x80000000
|
|||
|
mov cr0,eax
|
|||
|
jmp $+2
|
|||
|
mov dword [0xfe80],0x800000
|
|||
|
|
|||
|
;Set base of graphic segment to linear address of LFB
|
|||
|
mov eax,[0xfe80] ; set for gs
|
|||
|
mov [graph_data_l+2],ax
|
|||
|
shr eax,16
|
|||
|
mov [graph_data_l+4],al
|
|||
|
mov [graph_data_l+7],ah
|
|||
|
|
|||
|
; READ RAMDISK IMAGE FROM HD
|
|||
|
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include 'boot/rdload.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
; mov [dma_hdd],1
|
|||
|
; CALCULATE FAT CHAIN FOR RAMDISK
|
|||
|
|
|||
|
call calculatefatchain
|
|||
|
|
|||
|
; LOAD VMODE DRIVER
|
|||
|
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include 'vmodeld.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
|
|||
|
; LOAD FONTS I and II
|
|||
|
|
|||
|
mov [0x3000],dword 1
|
|||
|
mov [0x3004],dword 1
|
|||
|
mov [0x3010],dword 0x3020
|
|||
|
|
|||
|
mov eax,char
|
|||
|
mov esi,12
|
|||
|
xor ebx,ebx
|
|||
|
mov ecx,26000
|
|||
|
mov edx,0x37000
|
|||
|
call fileread
|
|||
|
|
|||
|
mov eax,char2
|
|||
|
mov esi,12
|
|||
|
xor ebx,ebx
|
|||
|
mov ecx,26000
|
|||
|
mov edx,0x30000
|
|||
|
call fileread
|
|||
|
|
|||
|
mov esi,boot_fonts
|
|||
|
call boot_log
|
|||
|
|
|||
|
; PRINT AMOUNT OF MEMORY
|
|||
|
mov esi, boot_memdetect
|
|||
|
call boot_log
|
|||
|
|
|||
|
movzx ecx, word [boot_y]
|
|||
|
or ecx, (10+29*6) shl 16 ; "Determining amount of memory"
|
|||
|
sub ecx, 10
|
|||
|
mov edx, 0xFFFFFF
|
|||
|
mov ebx, [0xFE8C]
|
|||
|
shr ebx, 20
|
|||
|
mov edi, 1
|
|||
|
mov eax, 0x00040000
|
|||
|
call display_number
|
|||
|
|
|||
|
; CHECK EXTENDED REGION
|
|||
|
; mov dword [0x80000000],0x12345678
|
|||
|
; cmp dword [0x80000000],0x12345678
|
|||
|
; jz extended_region_found
|
|||
|
; mov esi,boot_ext_region
|
|||
|
; call boot_log
|
|||
|
; jmp $
|
|||
|
;extended_region_found:
|
|||
|
|
|||
|
call MEM_Init
|
|||
|
;add 0x800000-0xc00000 area
|
|||
|
cmp word [0xfe0c],0x13
|
|||
|
jle .less_memory
|
|||
|
mov eax,0x80000000 ;linear address
|
|||
|
mov ebx,0x400000 shr 12 ;size in pages (4Mb)
|
|||
|
mov ecx,0x800000 ;physical address
|
|||
|
jmp .end_first_block
|
|||
|
.less_memory:
|
|||
|
mov eax,0x80180000 ;linear address
|
|||
|
mov ebx,0x280000 shr 12 ;size in pages (2.5Mb)
|
|||
|
mov ecx,0x980000 ;physical address
|
|||
|
.end_first_block:
|
|||
|
call MEM_Add_Heap ;nobody can lock mutex yet
|
|||
|
|
|||
|
call create_general_page_table
|
|||
|
;add 0x1000000(0xd80000)-end_of_memory area
|
|||
|
mov eax,second_base_address
|
|||
|
mov ebx,[0xfe8c]
|
|||
|
mov ecx,[0xfe84]
|
|||
|
sub ebx,ecx
|
|||
|
shr ebx,12
|
|||
|
add eax,ecx
|
|||
|
call MEM_Add_Heap
|
|||
|
;init physical memory manager.
|
|||
|
call Init_Physical_Memory_Manager
|
|||
|
|
|||
|
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
|
|||
|
|
|||
|
mov esi,boot_irqs
|
|||
|
call boot_log
|
|||
|
call rerouteirqs
|
|||
|
|
|||
|
mov esi,boot_tss
|
|||
|
call boot_log
|
|||
|
|
|||
|
; BUILD SCHEDULER
|
|||
|
|
|||
|
call build_scheduler ; sys32.inc
|
|||
|
|
|||
|
; LOAD IDT
|
|||
|
; <IP 05.02.2005>
|
|||
|
lidt [cs:idtreg] ;[cs:idts]
|
|||
|
; </IP>
|
|||
|
|
|||
|
; READ CPUID RESULT
|
|||
|
|
|||
|
mov esi,boot_cpuid
|
|||
|
call boot_log
|
|||
|
pushfd ; get current flags
|
|||
|
pop eax
|
|||
|
mov ecx,eax
|
|||
|
xor eax,0x00200000 ; attempt to toggle ID bit
|
|||
|
push eax
|
|||
|
popfd
|
|||
|
pushfd ; get new EFLAGS
|
|||
|
pop eax
|
|||
|
push ecx ; restore original flags
|
|||
|
popfd
|
|||
|
and eax,0x00200000 ; if we couldn't toggle ID,
|
|||
|
and ecx,0x00200000 ; then this is i486
|
|||
|
cmp eax,ecx
|
|||
|
jz nopentium
|
|||
|
; It's Pentium or later. Use CPUID
|
|||
|
mov edi,cpuid_0
|
|||
|
mov esi,0
|
|||
|
cpuid_new_read:
|
|||
|
mov eax,esi
|
|||
|
cpuid
|
|||
|
call cpuid_save
|
|||
|
add edi,4*4
|
|||
|
cmp esi,3
|
|||
|
jge cpuid_done
|
|||
|
cmp esi,[cpuid_0]
|
|||
|
jge cpuid_done
|
|||
|
inc esi
|
|||
|
jmp cpuid_new_read
|
|||
|
cpuid_save:
|
|||
|
mov [edi+00],eax
|
|||
|
mov [edi+04],ebx
|
|||
|
mov [edi+8],ecx
|
|||
|
mov [edi+12],edx
|
|||
|
ret
|
|||
|
cpuid_done:
|
|||
|
nopentium:
|
|||
|
|
|||
|
; CR4 flags - enable fxsave / fxrstore
|
|||
|
;
|
|||
|
; finit
|
|||
|
; mov eax,1
|
|||
|
; cpuid
|
|||
|
; test edx,1000000h
|
|||
|
; jz fail_fpu
|
|||
|
; mov eax,cr4
|
|||
|
; or eax,200h ; Enable fxsave/fxstor
|
|||
|
; mov cr4,eax
|
|||
|
; fail_fpu:
|
|||
|
|
|||
|
; DETECT DEVICES
|
|||
|
|
|||
|
mov esi,boot_devices
|
|||
|
call boot_log
|
|||
|
call detect_devices
|
|||
|
|
|||
|
; TIMER SET TO 1/100 S
|
|||
|
|
|||
|
mov esi,boot_timer
|
|||
|
call boot_log
|
|||
|
mov al,0x34 ; set to 100Hz
|
|||
|
out 0x43,al
|
|||
|
mov al,0x9b ; lsb 1193180 / 1193
|
|||
|
out 0x40,al
|
|||
|
mov al,0x2e ; msb
|
|||
|
out 0x40,al
|
|||
|
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
;include 'detect/commouse.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
; SET MOUSE
|
|||
|
|
|||
|
mov esi,boot_setmouse
|
|||
|
call boot_log
|
|||
|
call setmouse
|
|||
|
|
|||
|
; SET PRELIMINARY WINDOW STACK AND POSITIONS
|
|||
|
|
|||
|
mov esi,boot_windefs
|
|||
|
call boot_log
|
|||
|
call setwindowdefaults
|
|||
|
|
|||
|
; SET BACKGROUND DEFAULTS
|
|||
|
|
|||
|
mov esi,boot_bgr
|
|||
|
call boot_log
|
|||
|
call calculatebackground
|
|||
|
|
|||
|
; RESERVE SYSTEM IRQ'S JA PORT'S
|
|||
|
|
|||
|
mov esi,boot_resirqports
|
|||
|
call boot_log
|
|||
|
call reserve_irqs_ports
|
|||
|
|
|||
|
; SET PORTS FOR IRQ HANDLERS
|
|||
|
|
|||
|
mov esi,boot_setrports
|
|||
|
call boot_log
|
|||
|
call setirqreadports
|
|||
|
|
|||
|
; SET UP OS TASK
|
|||
|
|
|||
|
mov esi,boot_setostask
|
|||
|
call boot_log
|
|||
|
; name for OS/IDLE process
|
|||
|
mov [0x80000+256+0],dword 'OS/I'
|
|||
|
mov [0x80000+256+4],dword 'DLE '
|
|||
|
; task list
|
|||
|
mov [0x3004],dword 2 ; number of processes
|
|||
|
mov [0x3000],dword 0 ; process count - start with os task
|
|||
|
mov [0x3020+0xE],byte 1 ; on screen number
|
|||
|
mov [0x3020+0x4],dword 1 ; process id number
|
|||
|
|
|||
|
; set default flags & stacks
|
|||
|
mov [l.eflags],dword 0x11202 ; sti and resume
|
|||
|
mov [l.ss0], os_data
|
|||
|
;mov [l.ss1], ring1_data
|
|||
|
;mov [l.ss2], ring2_data
|
|||
|
mov [l.esp0], 0x52000
|
|||
|
mov [l.esp1], 0x53000
|
|||
|
mov [l.esp2], 0x54000
|
|||
|
; osloop - TSS
|
|||
|
mov eax,cr3
|
|||
|
mov [l.cr3],eax
|
|||
|
mov [l.eip],osloop
|
|||
|
; <Ivan Poddubny 14/03/2004>
|
|||
|
mov [l.esp],0x30000 ;0x2ffff
|
|||
|
; </Ivan Poddubny 14/03/2004>
|
|||
|
mov [l.cs],os_code
|
|||
|
mov [l.ss],os_data
|
|||
|
mov [l.ds],os_data
|
|||
|
mov [l.es],os_data
|
|||
|
mov [l.fs],os_data
|
|||
|
mov [l.gs],os_data
|
|||
|
; move tss to tss_data+tss_step
|
|||
|
mov esi,tss_sceleton
|
|||
|
mov edi,tss_data+tss_step
|
|||
|
mov ecx,120/4
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
|
|||
|
mov ax,tss0
|
|||
|
ltr ax
|
|||
|
|
|||
|
|
|||
|
; READ TSC / SECOND
|
|||
|
|
|||
|
mov esi,boot_tsc
|
|||
|
call boot_log
|
|||
|
call _rdtsc
|
|||
|
mov ecx,eax
|
|||
|
mov esi,250 ; wait 1/4 a second
|
|||
|
call delay_ms
|
|||
|
call _rdtsc
|
|||
|
sub eax,ecx
|
|||
|
shl eax,2
|
|||
|
mov [0xf600],eax ; save tsc / sec
|
|||
|
|
|||
|
; SET VARIABLES
|
|||
|
|
|||
|
call set_variables
|
|||
|
|
|||
|
; STACK AND FDC
|
|||
|
|
|||
|
call stack_init
|
|||
|
call fdc_init
|
|||
|
|
|||
|
; PALETTE FOR 320x200 and 640x480 16 col
|
|||
|
|
|||
|
cmp [0xfe0c],word 0x12
|
|||
|
jne no_pal_vga
|
|||
|
mov esi,boot_pal_vga
|
|||
|
call boot_log
|
|||
|
call paletteVGA
|
|||
|
no_pal_vga:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0x13
|
|||
|
jne no_pal_ega
|
|||
|
mov esi,boot_pal_ega
|
|||
|
call boot_log
|
|||
|
call palette320x200
|
|||
|
no_pal_ega:
|
|||
|
|
|||
|
; LOAD DEFAULT SKIN
|
|||
|
|
|||
|
call load_default_skin
|
|||
|
|
|||
|
; MTRR'S
|
|||
|
|
|||
|
call enable_mtrr
|
|||
|
|
|||
|
|
|||
|
; LOAD FIRST APPLICATION
|
|||
|
mov [0x3000],dword 1 ;1
|
|||
|
mov [0x3004],dword 1 ;1
|
|||
|
cli
|
|||
|
mov al,[0x2f0000+0x9030]
|
|||
|
cmp al,1
|
|||
|
jne no_load_vrr_m
|
|||
|
mov eax,vrr_m
|
|||
|
call start_application_fl
|
|||
|
cmp eax,2 ; if no vrr_m app found
|
|||
|
je first_app_found
|
|||
|
|
|||
|
no_load_vrr_m:
|
|||
|
mov eax,firstapp
|
|||
|
call start_application_fl
|
|||
|
|
|||
|
cmp eax,2 ; if no first app found - halt
|
|||
|
je first_app_found
|
|||
|
mov eax, 0xDEADBEEF
|
|||
|
hlt ;jmp $
|
|||
|
first_app_found:
|
|||
|
cli
|
|||
|
|
|||
|
mov [0x3004],dword 2
|
|||
|
mov [0x3000],dword 1
|
|||
|
|
|||
|
|
|||
|
; START MULTITASKING
|
|||
|
|
|||
|
mov esi,boot_tasking
|
|||
|
call boot_log
|
|||
|
|
|||
|
mov [0xe000],byte 1 ; multitasking enabled
|
|||
|
|
|||
|
mov al, 0xf6 ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
call kb_write
|
|||
|
|
|||
|
mov ecx,0
|
|||
|
wait_loop_1: ; variant 2
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8042
|
|||
|
in al,64h
|
|||
|
and al,00000010b ; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8042
|
|||
|
loopnz wait_loop_1
|
|||
|
|
|||
|
; SET KEYBOARD PARAMETERS
|
|||
|
; mov al, 0xED ; svetodiody - only for testing!
|
|||
|
; call kb_write
|
|||
|
; call kb_read
|
|||
|
; mov al, 111b
|
|||
|
; call kb_write
|
|||
|
; call kb_read
|
|||
|
|
|||
|
mov al, 0xF3 ; set repeat rate & delay
|
|||
|
call kb_write
|
|||
|
call kb_read
|
|||
|
mov al, 00100010b ; 24 500 ;00100100b ; 20 500
|
|||
|
call kb_write
|
|||
|
call kb_read
|
|||
|
;// mike.dld [
|
|||
|
call set_lights
|
|||
|
;// mike.dld ]
|
|||
|
|
|||
|
|
|||
|
; UNMASK ALL IRQ'S
|
|||
|
|
|||
|
mov esi,boot_allirqs
|
|||
|
call boot_log
|
|||
|
|
|||
|
cli ;guarantee forbidance of interrupts.
|
|||
|
mov al,0 ; unmask all irq's
|
|||
|
out 0xA1,al
|
|||
|
out 0x21,al
|
|||
|
|
|||
|
mov ecx,32
|
|||
|
|
|||
|
ready_for_irqs:
|
|||
|
|
|||
|
mov al,0x20 ; ready for irqs
|
|||
|
out 0x20,al
|
|||
|
out 0xa0,al
|
|||
|
|
|||
|
loop ready_for_irqs ; flush the queue
|
|||
|
|
|||
|
; mov [dma_hdd],1
|
|||
|
|
|||
|
sti
|
|||
|
jmp $ ; wait here for timer to take control
|
|||
|
|
|||
|
; Fly :)
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
; ;
|
|||
|
; MAIN OS LOOP ;
|
|||
|
; ;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
align 32
|
|||
|
osloop:
|
|||
|
|
|||
|
call check_mouse_data
|
|||
|
call [draw_pointer]
|
|||
|
|
|||
|
call checkbuttons
|
|||
|
call main_loop_sys_getkey
|
|||
|
call checkwindows
|
|||
|
call check_window_move_request
|
|||
|
|
|||
|
call checkmisc
|
|||
|
call checkEgaCga
|
|||
|
|
|||
|
call stack_handler
|
|||
|
|
|||
|
call checkidle
|
|||
|
call check_fdd_motor_status
|
|||
|
jmp osloop
|
|||
|
;temp_pointers:
|
|||
|
; rd 32
|
|||
|
; seed dd 0x12345678
|
|||
|
|
|||
|
checkidle:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp [check_idle_semaphore],0
|
|||
|
jne no_idle_state
|
|||
|
|
|||
|
call change_task
|
|||
|
mov eax,[idlemem]
|
|||
|
mov ebx,[timer_ticks] ;[0xfdf0]
|
|||
|
cmp eax,ebx
|
|||
|
jnz idle_exit
|
|||
|
call _rdtsc
|
|||
|
mov ecx,eax
|
|||
|
idle_loop:
|
|||
|
hlt
|
|||
|
cmp [check_idle_semaphore],0
|
|||
|
jne idle_loop_exit
|
|||
|
mov eax,[timer_ticks] ;[0xfdf0]
|
|||
|
cmp ebx,eax
|
|||
|
jz idle_loop
|
|||
|
idle_loop_exit:
|
|||
|
mov [idlemem],eax
|
|||
|
call _rdtsc
|
|||
|
sub eax,ecx
|
|||
|
mov ebx,[idleuse]
|
|||
|
add ebx,eax
|
|||
|
mov [idleuse],ebx
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
idle_exit:
|
|||
|
|
|||
|
mov ebx,[timer_ticks] ;[0xfdf0]
|
|||
|
mov [idlemem],ebx
|
|||
|
call change_task
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
no_idle_state:
|
|||
|
|
|||
|
dec [check_idle_semaphore]
|
|||
|
|
|||
|
mov ebx,[timer_ticks] ;[0xfdf0]
|
|||
|
mov [idlemem],ebx
|
|||
|
call change_task
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
idlemem dd 0x0
|
|||
|
idleuse dd 0x0
|
|||
|
idleusesec dd 0x0
|
|||
|
check_idle_semaphore dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
; ;
|
|||
|
; INCLUDED SYSTEM FILES ;
|
|||
|
; ;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
include "KERNEL32.INC"
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
; ;
|
|||
|
; KERNEL FUNCTIONS ;
|
|||
|
; ;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
enable_mtrr:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp [0x2f0000+0x901c],byte 2
|
|||
|
je no_mtrr
|
|||
|
mov eax,[0xFE0C] ; if no LFB then no MTRR
|
|||
|
test eax,0100000000000000b
|
|||
|
jz no_mtrr
|
|||
|
mov edx,[cpuid_1+3*4] ; edx - MTRR's supported ?
|
|||
|
test edx,1000000000000b
|
|||
|
jz no_mtrr
|
|||
|
call find_empty_mtrr
|
|||
|
cmp ecx,0
|
|||
|
jz no_mtrr
|
|||
|
mov esi,boot_mtrr ; 'setting mtrr'
|
|||
|
call boot_log
|
|||
|
mov edx,0x0 ; LFB , +8 M , write combine
|
|||
|
mov eax,[0x2f9018]
|
|||
|
or eax,1
|
|||
|
wrmsr
|
|||
|
inc ecx
|
|||
|
mov edx,0xf
|
|||
|
mov eax,0xff800800
|
|||
|
wrmsr
|
|||
|
mov ecx,0x2ff ; enable mtrr's
|
|||
|
rdmsr
|
|||
|
or eax,100000000000b ; set
|
|||
|
wrmsr
|
|||
|
no_mtrr:
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
find_empty_mtrr: ; 8 pairs checked
|
|||
|
|
|||
|
mov ecx,0x201-2
|
|||
|
mtrr_find:
|
|||
|
add ecx,2
|
|||
|
cmp ecx,0x200+8*2
|
|||
|
jge no_free_mtrr
|
|||
|
rdmsr
|
|||
|
test eax,0x0800
|
|||
|
jnz mtrr_find
|
|||
|
dec ecx
|
|||
|
ret
|
|||
|
no_free_mtrr:
|
|||
|
mov ecx,0
|
|||
|
ret
|
|||
|
|
|||
|
reserve_irqs_ports:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov [irq_owner+4*0],byte 1 ; timer
|
|||
|
mov [irq_owner+4*1],byte 1 ; keyboard
|
|||
|
mov [irq_owner+4*5],byte 1 ; sound blaster
|
|||
|
mov [irq_owner+4*6],byte 1 ; floppy diskette
|
|||
|
mov [irq_owner+4*13],byte 1 ; math co-pros
|
|||
|
mov [irq_owner+4*14],byte 1 ; ide I
|
|||
|
mov [irq_owner+4*15],byte 1 ; ide II
|
|||
|
movzx eax,byte [0xf604] ; mouse irq
|
|||
|
dec eax
|
|||
|
add eax,mouseirqtable
|
|||
|
movzx eax,byte [eax]
|
|||
|
shl eax,2
|
|||
|
mov [irq_owner+eax],byte 1
|
|||
|
|
|||
|
|
|||
|
; RESERVE PORTS
|
|||
|
mov edi,1 ; 0x00-0xff
|
|||
|
mov [0x2d0000],edi
|
|||
|
shl edi,4
|
|||
|
mov [0x2d0000+edi+0],dword 1
|
|||
|
mov [0x2d0000+edi+4],dword 0x0
|
|||
|
mov [0x2d0000+edi+8],dword 0xff
|
|||
|
cmp [0xf604],byte 2 ; com1 mouse -> 0x3f0-0x3ff
|
|||
|
jne ripl1
|
|||
|
inc dword [0x2d0000]
|
|||
|
mov edi,[0x2d0000]
|
|||
|
shl edi,4
|
|||
|
mov [0x2d0000+edi+0],dword 1
|
|||
|
mov [0x2d0000+edi+4],dword 0x3f0
|
|||
|
mov [0x2d0000+edi+8],dword 0x3ff
|
|||
|
ripl1:
|
|||
|
cmp [0xf604],byte 3 ; com2 mouse -> 0x2f0-0x2ff
|
|||
|
jne ripl2
|
|||
|
inc dword [0x2d0000]
|
|||
|
mov edi,[0x2d0000]
|
|||
|
shl edi,4
|
|||
|
mov [0x2d0000+edi+0],dword 1
|
|||
|
mov [0x2d0000+edi+4],dword 0x2f0
|
|||
|
mov [0x2d0000+edi+8],dword 0x2ff
|
|||
|
ripl2:
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
iglobal
|
|||
|
mouseirqtable db 12 ; ps2
|
|||
|
db 4 ; com1
|
|||
|
db 3 ; com2
|
|||
|
endg
|
|||
|
|
|||
|
setirqreadports:
|
|||
|
|
|||
|
mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte
|
|||
|
mov [irq12read+4],dword 0 ; end of port list
|
|||
|
mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
|
|||
|
mov [irq04read+4],dword 0 ; end of port list
|
|||
|
mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte
|
|||
|
mov [irq03read+4],dword 0 ; end of port list
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
iglobal
|
|||
|
process_number dd 0x1
|
|||
|
endg
|
|||
|
|
|||
|
uglobal
|
|||
|
novesachecksum dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
checkEgaCga:
|
|||
|
|
|||
|
cmp [0xfe0c],dword 0x13
|
|||
|
je cnvl
|
|||
|
ret
|
|||
|
cnvl:
|
|||
|
|
|||
|
pushad
|
|||
|
mov ecx,[0xfb0a]
|
|||
|
cmp ecx,[novesachecksum]
|
|||
|
jne novesal
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
novesal:
|
|||
|
mov [novesachecksum],ecx
|
|||
|
mov ecx,0
|
|||
|
movzx eax,word [0xfb0c]
|
|||
|
cmp eax,100
|
|||
|
jge m13l3
|
|||
|
mov eax,100
|
|||
|
m13l3:
|
|||
|
cmp eax,480-100
|
|||
|
jbe m13l4
|
|||
|
mov eax,480-100
|
|||
|
m13l4:
|
|||
|
sub eax,100
|
|||
|
imul eax,640*4
|
|||
|
add ecx,eax
|
|||
|
movzx eax,word [0xfb0a]
|
|||
|
cmp eax,160
|
|||
|
jge m13l1
|
|||
|
mov eax,160
|
|||
|
m13l1:
|
|||
|
cmp eax,640-160
|
|||
|
jbe m13l2
|
|||
|
mov eax,640-160
|
|||
|
m13l2:
|
|||
|
sub eax,160
|
|||
|
shl eax,2
|
|||
|
add ecx,eax
|
|||
|
mov esi,[0xfe80]
|
|||
|
add esi,ecx
|
|||
|
mov edi,0xa0000
|
|||
|
mov edx,200
|
|||
|
mov ecx,320
|
|||
|
cld
|
|||
|
m13pix:
|
|||
|
lodsd
|
|||
|
push eax
|
|||
|
mov ebx,eax
|
|||
|
and eax,(128+64+32) ; blue
|
|||
|
shr eax,5
|
|||
|
and ebx,(128+64+32)*256 ; green
|
|||
|
shr ebx,8+2
|
|||
|
add eax,ebx
|
|||
|
pop ebx
|
|||
|
and ebx,(128+64)*256*256 ; red
|
|||
|
shr ebx,8+8
|
|||
|
add eax,ebx
|
|||
|
stosb
|
|||
|
loop m13pix
|
|||
|
mov ecx,320
|
|||
|
add esi,4*(640-320)
|
|||
|
dec edx
|
|||
|
jnz m13pix
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
palette320x200:
|
|||
|
|
|||
|
mov edx,0x3c8
|
|||
|
xor eax, eax
|
|||
|
out dx,al
|
|||
|
mov ecx,256
|
|||
|
mov edx,0x3c9
|
|||
|
xor eax,eax
|
|||
|
|
|||
|
palnew:
|
|||
|
mov al,0
|
|||
|
test ah,64
|
|||
|
jz pallbl1
|
|||
|
add al,21
|
|||
|
pallbl1:
|
|||
|
test ah,128
|
|||
|
jz pallbl2
|
|||
|
add al,42
|
|||
|
pallbl2:
|
|||
|
out dx,al
|
|||
|
mov al,0
|
|||
|
test ah,8
|
|||
|
jz pallbl3
|
|||
|
add al,8
|
|||
|
pallbl3:
|
|||
|
test ah,16
|
|||
|
jz pallbl4
|
|||
|
add al,15
|
|||
|
pallbl4:
|
|||
|
test ah,32
|
|||
|
jz pallbl5
|
|||
|
add al,40
|
|||
|
pallbl5:
|
|||
|
out dx,al
|
|||
|
mov al,0
|
|||
|
test ah,1
|
|||
|
jz pallbl6
|
|||
|
add al,8
|
|||
|
pallbl6:
|
|||
|
test ah,2
|
|||
|
jz pallbl7
|
|||
|
add al,15
|
|||
|
pallbl7:
|
|||
|
test ah,4
|
|||
|
jz pallbl8
|
|||
|
add al,40
|
|||
|
pallbl8:
|
|||
|
out dx,al
|
|||
|
add ah,1
|
|||
|
loop palnew
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
set_variables:
|
|||
|
|
|||
|
mov ecx,0x100 ; flush port 0x60
|
|||
|
.fl60: in al,0x60
|
|||
|
loop .fl60
|
|||
|
mov [0xfcff],byte 0 ; mouse buffer
|
|||
|
mov [0xf400],byte 0 ; keyboard buffer
|
|||
|
mov [0xf500],byte 0 ; button buffer
|
|||
|
; mov [0xfb0a],dword 100*65536+100 ; mouse x/y
|
|||
|
|
|||
|
push eax
|
|||
|
mov ax,[0x2f0000+0x900c]
|
|||
|
shr ax,1
|
|||
|
shl eax,16
|
|||
|
mov ax,[0x2f0000+0x900A]
|
|||
|
shr ax,1
|
|||
|
mov [0xfb0a],eax
|
|||
|
pop eax
|
|||
|
|
|||
|
mov byte [SB16_Status],0 ; Minazzi Paolo
|
|||
|
mov [display_data-12],dword 1 ; tiled background
|
|||
|
mov [0xfe88],dword 0x2C0000 ; address of button list
|
|||
|
|
|||
|
;!! IP 04.02.2005:
|
|||
|
mov [next_usage_update], 100
|
|||
|
mov byte [0xFFFF], 0 ; change task if possible
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
;* mouse centered - start code- Mario79
|
|||
|
mouse_centered:
|
|||
|
push eax
|
|||
|
mov eax,[0xFE00]
|
|||
|
shr eax,1
|
|||
|
mov [0xFB0A],ax
|
|||
|
mov eax,[0xFE04]
|
|||
|
shr eax,1
|
|||
|
mov [0xFB0C],ax
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
;* mouse centered - end code- Mario79
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_outport:
|
|||
|
|
|||
|
mov edi,ebx ; separate flag for read / write
|
|||
|
and ebx,65535
|
|||
|
|
|||
|
mov ecx,[0x2d0000]
|
|||
|
test ecx,ecx
|
|||
|
jne sopl8
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
|
|||
|
sopl8:
|
|||
|
mov edx,[0x3010]
|
|||
|
mov edx,[edx+0x4]
|
|||
|
and ebx,65535
|
|||
|
cld
|
|||
|
sopl1:
|
|||
|
|
|||
|
mov esi,ecx
|
|||
|
shl esi,4
|
|||
|
add esi,0x2d0000
|
|||
|
cmp edx,[esi+0]
|
|||
|
jne sopl2
|
|||
|
cmp ebx,[esi+4]
|
|||
|
jb sopl2
|
|||
|
cmp ebx,[esi+8]
|
|||
|
jg sopl2
|
|||
|
jmp sopl3
|
|||
|
|
|||
|
sopl2:
|
|||
|
|
|||
|
dec ecx
|
|||
|
jnz sopl1
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
|
|||
|
sopl3:
|
|||
|
|
|||
|
test edi,0x80000000 ; read ?
|
|||
|
jnz sopl4
|
|||
|
|
|||
|
mov dx,bx ; write
|
|||
|
out dx,al
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
|
|||
|
sopl4:
|
|||
|
|
|||
|
mov dx,bx ; read
|
|||
|
in al,dx
|
|||
|
and eax,0xff
|
|||
|
mov [esp+36],dword 0
|
|||
|
mov [esp+24],eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
sys_sb16:
|
|||
|
|
|||
|
cmp word [sb16],word 0
|
|||
|
jnz sb16l1
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
sb16l1:
|
|||
|
mov [esp+36],dword 0
|
|||
|
cmp eax,1 ; set volume - main
|
|||
|
jnz sb16l2
|
|||
|
mov dx,word [sb16]
|
|||
|
add dx,4
|
|||
|
mov al,0x22
|
|||
|
out dx,al
|
|||
|
mov esi,1
|
|||
|
call delay_ms
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
ret
|
|||
|
sb16l2:
|
|||
|
|
|||
|
cmp eax,2 ; set volume - cd
|
|||
|
jnz sb16l3
|
|||
|
mov dx,word [sb16]
|
|||
|
add dx,4
|
|||
|
mov al,0x28
|
|||
|
out dx,al
|
|||
|
mov esi,1
|
|||
|
call delay_ms
|
|||
|
mov eax,ebx
|
|||
|
add edx,1
|
|||
|
out dx,al
|
|||
|
ret
|
|||
|
sb16l3:
|
|||
|
mov [esp+36],dword 2
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_sb16II:
|
|||
|
|
|||
|
cmp word [sb16],word 0
|
|||
|
jnz IIsb16l1
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
IIsb16l1:
|
|||
|
|
|||
|
cmp eax,1 ; set volume - main
|
|||
|
jnz IIsb16l2
|
|||
|
; L
|
|||
|
mov dx,word [sb16]
|
|||
|
add dx,4
|
|||
|
mov al,0x30
|
|||
|
out dx,al
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
; R
|
|||
|
mov dx,word [sb16]
|
|||
|
add dx,4
|
|||
|
mov al,0x31
|
|||
|
out dx,al
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
IIsb16l2:
|
|||
|
|
|||
|
cmp eax,2 ; set volume - cd
|
|||
|
jnz IIsb16l3
|
|||
|
; L
|
|||
|
mov dx,word [sb16]
|
|||
|
add dx,4
|
|||
|
mov al,0x36
|
|||
|
out dx,al
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
; R
|
|||
|
mov dx,word [sb16]
|
|||
|
add dx,4
|
|||
|
mov al,0x37
|
|||
|
out dx,al
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
IIsb16l3:
|
|||
|
|
|||
|
mov [esp+36],dword 2
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_wss:
|
|||
|
|
|||
|
cmp word [wss],word 0
|
|||
|
jnz wssl1
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
wssl1:
|
|||
|
|
|||
|
cmp eax,1 ; set volume - main
|
|||
|
jnz wssl2
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
wssl2:
|
|||
|
|
|||
|
cmp eax,2 ; set volume - cd
|
|||
|
jnz wssl3
|
|||
|
; L
|
|||
|
mov dx,word [wss]
|
|||
|
add dx,4
|
|||
|
mov al,0x2
|
|||
|
out dx,al
|
|||
|
mov esi,1
|
|||
|
call delay_ms
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
; R
|
|||
|
mov dx,word [wss]
|
|||
|
add dx,4
|
|||
|
mov al,0x3
|
|||
|
out dx,al
|
|||
|
mov esi,1
|
|||
|
call delay_ms
|
|||
|
mov eax,ebx
|
|||
|
inc edx
|
|||
|
out dx,al
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
wssl3:
|
|||
|
mov [esp+36],dword 2
|
|||
|
ret
|
|||
|
|
|||
|
display_number:
|
|||
|
|
|||
|
; eax = print type, al=0 -> ebx is number
|
|||
|
; al=1 -> ebx is pointer
|
|||
|
; ah=0 -> display decimal
|
|||
|
; ah=1 -> display hexadecimal
|
|||
|
; ah=2 -> display binary
|
|||
|
; eax bits 16-21 = number of digits to display (0-32)
|
|||
|
; eax bits 22-31 = reserved
|
|||
|
;
|
|||
|
; ebx = number or pointer
|
|||
|
; ecx = x shl 16 + y
|
|||
|
; edx = color
|
|||
|
|
|||
|
cmp eax,0xffff ; length > 0 ?
|
|||
|
jge cont_displ
|
|||
|
ret
|
|||
|
cont_displ:
|
|||
|
|
|||
|
cmp eax,60*0x10000 ; length <= 60 ?
|
|||
|
jbe cont_displ2
|
|||
|
ret
|
|||
|
cont_displ2:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp al,1 ; ecx is a pointer ?
|
|||
|
jne displnl1
|
|||
|
mov edi,[0x3010]
|
|||
|
mov edi,[edi+0x10]
|
|||
|
mov ebx,[edi+ebx]
|
|||
|
displnl1:
|
|||
|
sub esp,64
|
|||
|
|
|||
|
cmp ah,0 ; DECIMAL
|
|||
|
jne no_display_desnum
|
|||
|
shr eax,16
|
|||
|
and eax,0x2f
|
|||
|
push eax
|
|||
|
;mov edi,[0x3010]
|
|||
|
;mov edi,[edi+0x10]
|
|||
|
mov edi,esp
|
|||
|
add edi,4+64
|
|||
|
mov ecx,eax
|
|||
|
mov eax,ebx
|
|||
|
mov ebx,10
|
|||
|
d_desnum:
|
|||
|
xor edx,edx
|
|||
|
div ebx
|
|||
|
add dl,48
|
|||
|
mov [edi],dl
|
|||
|
dec edi
|
|||
|
loop d_desnum
|
|||
|
pop eax
|
|||
|
call draw_num_text
|
|||
|
add esp,64
|
|||
|
popad
|
|||
|
ret
|
|||
|
no_display_desnum:
|
|||
|
|
|||
|
cmp ah,0x01 ; HEXADECIMAL
|
|||
|
jne no_display_hexnum
|
|||
|
shr eax,16
|
|||
|
and eax,0x2f
|
|||
|
push eax
|
|||
|
;mov edi,[0x3010]
|
|||
|
;mov edi,[edi+0x10]
|
|||
|
mov edi,esp
|
|||
|
add edi,4+64
|
|||
|
mov ecx,eax
|
|||
|
mov eax,ebx
|
|||
|
mov ebx,16
|
|||
|
d_hexnum:
|
|||
|
xor edx,edx
|
|||
|
div ebx
|
|||
|
add edx,hexletters
|
|||
|
mov dl,[edx]
|
|||
|
mov [edi],dl
|
|||
|
dec edi
|
|||
|
loop d_hexnum
|
|||
|
pop eax
|
|||
|
call draw_num_text
|
|||
|
add esp,64
|
|||
|
popad
|
|||
|
ret
|
|||
|
no_display_hexnum:
|
|||
|
|
|||
|
cmp ah,0x02 ; BINARY
|
|||
|
jne no_display_binnum
|
|||
|
shr eax,16
|
|||
|
and eax,0x2f
|
|||
|
push eax
|
|||
|
;mov edi,[0x3010]
|
|||
|
;mov edi,[edi+0x10]
|
|||
|
mov edi,esp
|
|||
|
add edi,4+64
|
|||
|
mov ecx,eax
|
|||
|
mov eax,ebx
|
|||
|
mov ebx,2
|
|||
|
d_binnum:
|
|||
|
xor edx,edx
|
|||
|
div ebx
|
|||
|
add dl,48
|
|||
|
mov [edi],dl
|
|||
|
dec edi
|
|||
|
loop d_binnum
|
|||
|
pop eax
|
|||
|
call draw_num_text
|
|||
|
add esp,64
|
|||
|
popad
|
|||
|
ret
|
|||
|
no_display_binnum:
|
|||
|
|
|||
|
add esp,64
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
draw_num_text:
|
|||
|
|
|||
|
; dtext
|
|||
|
;
|
|||
|
; eax x & y
|
|||
|
; ebx color
|
|||
|
; ecx start of text
|
|||
|
; edx length
|
|||
|
; edi 1 force
|
|||
|
|
|||
|
mov edx,eax
|
|||
|
mov ecx,65
|
|||
|
sub ecx,eax
|
|||
|
add ecx,esp
|
|||
|
add ecx,4
|
|||
|
mov eax,[esp+64+32-8+4]
|
|||
|
mov ebx,[esp+64+32-12+4]
|
|||
|
push edx ; add window start x & y
|
|||
|
push ebx
|
|||
|
mov edx,[0x3010]
|
|||
|
mov ebx,[edx-twdw]
|
|||
|
shl ebx,16
|
|||
|
add ebx,[edx-twdw+4]
|
|||
|
add eax,ebx
|
|||
|
pop ebx
|
|||
|
pop edx
|
|||
|
mov edi,0
|
|||
|
call dtext
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
read_string:
|
|||
|
|
|||
|
; eax read_area
|
|||
|
; ebx color of letter
|
|||
|
; ecx color of background
|
|||
|
; edx number of letters to read
|
|||
|
; esi [x start]*65536 + [y_start]
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_setup:
|
|||
|
|
|||
|
; 1=roland mpu midi base , base io address
|
|||
|
; 2=keyboard 1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
|
|||
|
; 3=cd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave
|
|||
|
; 4=sb16 base , base io address
|
|||
|
; 5=system language, 1eng 2fi 3ger 4rus
|
|||
|
; 6=wss base , base io address
|
|||
|
; 7=hd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave
|
|||
|
; 8=fat32 partition in hd
|
|||
|
; 9
|
|||
|
; 10 = sound dma channel
|
|||
|
; 11 = enable lba read
|
|||
|
; 12 = enable pci access
|
|||
|
|
|||
|
|
|||
|
mov [esp+36],dword 0
|
|||
|
cmp eax,1 ; MIDI
|
|||
|
jnz nsyse1
|
|||
|
cmp ebx,0x100
|
|||
|
jb nsyse1
|
|||
|
mov edx,65535
|
|||
|
cmp edx,ebx
|
|||
|
jb nsyse1
|
|||
|
mov [midi_base],bx
|
|||
|
mov word [mididp],bx
|
|||
|
inc bx
|
|||
|
mov word [midisp],bx
|
|||
|
ret
|
|||
|
|
|||
|
midi_base dw 0
|
|||
|
|
|||
|
nsyse1:
|
|||
|
|
|||
|
cmp eax,2 ; KEYBOARD
|
|||
|
jnz nsyse2
|
|||
|
cmp ebx,1
|
|||
|
jnz kbnobase
|
|||
|
mov edi,[0x3010]
|
|||
|
add ecx,[edi+0x10]
|
|||
|
mov eax,ecx
|
|||
|
mov ebx,keymap
|
|||
|
mov ecx,128
|
|||
|
call memmove
|
|||
|
ret
|
|||
|
kbnobase:
|
|||
|
cmp ebx,2
|
|||
|
jnz kbnoshift
|
|||
|
mov edi,[0x3010]
|
|||
|
add ecx,[edi+0x10]
|
|||
|
mov eax,ecx
|
|||
|
mov ebx,keymap_shift
|
|||
|
mov ecx,128
|
|||
|
call memmove
|
|||
|
ret
|
|||
|
kbnoshift:
|
|||
|
cmp ebx,3
|
|||
|
jne kbnoalt
|
|||
|
mov edi,[0x3010]
|
|||
|
add ecx,[edi+0x10]
|
|||
|
mov eax,ecx
|
|||
|
mov ebx,keymap_alt
|
|||
|
mov ecx,128
|
|||
|
call memmove
|
|||
|
ret
|
|||
|
kbnoalt:
|
|||
|
cmp ebx,9
|
|||
|
jnz kbnocountry
|
|||
|
mov word [keyboard],cx
|
|||
|
ret
|
|||
|
kbnocountry:
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
nsyse2:
|
|||
|
cmp eax,3 ; CD
|
|||
|
jnz nsyse3
|
|||
|
mov [cd_base],bl
|
|||
|
cmp ebx,1
|
|||
|
jnz noprma
|
|||
|
mov [cdbase],0x1f0
|
|||
|
mov [cdid],0xa0
|
|||
|
noprma:
|
|||
|
cmp ebx,2
|
|||
|
jnz noprsl
|
|||
|
mov [cdbase],0x1f0
|
|||
|
mov [cdid],0xb0
|
|||
|
noprsl:
|
|||
|
cmp ebx,3
|
|||
|
jnz nosema
|
|||
|
mov [cdbase],0x170
|
|||
|
mov [cdid],0xa0
|
|||
|
nosema:
|
|||
|
cmp ebx,4
|
|||
|
jnz nosesl
|
|||
|
mov [cdbase],0x170
|
|||
|
mov [cdid],0xb0
|
|||
|
nosesl:
|
|||
|
ret
|
|||
|
|
|||
|
cd_base db 0
|
|||
|
|
|||
|
nsyse3:
|
|||
|
|
|||
|
cmp eax,4 ; SB
|
|||
|
jnz nsyse4
|
|||
|
cmp ebx,0x100
|
|||
|
jb nsyse4
|
|||
|
mov edx,65535
|
|||
|
cmp edx,ebx
|
|||
|
jb nsyse4
|
|||
|
mov word [sb16],bx
|
|||
|
ret
|
|||
|
nsyse4:
|
|||
|
|
|||
|
cmp eax,5 ; SYSTEM LANGUAGE
|
|||
|
jnz nsyse5
|
|||
|
mov [syslang],ebx
|
|||
|
ret
|
|||
|
nsyse5:
|
|||
|
|
|||
|
cmp eax,6 ; WSS
|
|||
|
jnz nsyse6
|
|||
|
cmp ebx,0x100
|
|||
|
jb nsyse6
|
|||
|
mov [wss],ebx
|
|||
|
ret
|
|||
|
|
|||
|
wss_temp dd 0
|
|||
|
|
|||
|
nsyse6:
|
|||
|
|
|||
|
cmp eax,7 ; HD BASE
|
|||
|
jne nsyse7
|
|||
|
mov [hd_base],bl
|
|||
|
cmp ebx,1
|
|||
|
jnz noprmahd
|
|||
|
mov [hdbase],0x1f0
|
|||
|
mov [hdid],0x0
|
|||
|
mov [hdpos],1
|
|||
|
; call set_FAT32_variables
|
|||
|
noprmahd:
|
|||
|
cmp ebx,2
|
|||
|
jnz noprslhd
|
|||
|
mov [hdbase],0x1f0
|
|||
|
mov [hdid],0x10
|
|||
|
mov [hdpos],2
|
|||
|
; call set_FAT32_variables
|
|||
|
noprslhd:
|
|||
|
cmp ebx,3
|
|||
|
jnz nosemahd
|
|||
|
mov [hdbase],0x170
|
|||
|
mov [hdid],0x0
|
|||
|
mov [hdpos],3
|
|||
|
; call set_FAT32_variables
|
|||
|
nosemahd:
|
|||
|
cmp ebx,4
|
|||
|
jnz noseslhd
|
|||
|
mov [hdbase],0x170
|
|||
|
mov [hdid],0x10
|
|||
|
mov [hdpos],4
|
|||
|
; call set_FAT32_variables
|
|||
|
noseslhd:
|
|||
|
mov [0xfe10],dword 0
|
|||
|
call reserve_hd1
|
|||
|
call clear_hd_cache
|
|||
|
mov [hd1_status],0 ; free
|
|||
|
ret
|
|||
|
|
|||
|
hd_base db 0
|
|||
|
|
|||
|
nsyse7:
|
|||
|
|
|||
|
cmp eax,8 ; HD PARTITION
|
|||
|
jne nsyse8
|
|||
|
mov [fat32part],ebx
|
|||
|
; call set_FAT32_variables
|
|||
|
call reserve_hd1
|
|||
|
call clear_hd_cache
|
|||
|
pusha
|
|||
|
call choice_necessity_partition_1
|
|||
|
popa
|
|||
|
mov [hd1_status],0 ; free
|
|||
|
ret
|
|||
|
nsyse8:
|
|||
|
|
|||
|
cmp eax,10 ; SOUND DMA CHANNEL
|
|||
|
jne no_set_sound_dma
|
|||
|
mov [sound_dma],ebx
|
|||
|
ret
|
|||
|
no_set_sound_dma:
|
|||
|
|
|||
|
cmp eax,11 ; ENABLE LBA READ
|
|||
|
jne no_set_lba_read
|
|||
|
and ebx,1
|
|||
|
mov [lba_read_enabled],ebx
|
|||
|
ret
|
|||
|
no_set_lba_read:
|
|||
|
|
|||
|
cmp eax,12 ; ENABLE PCI ACCESS
|
|||
|
jne no_set_pci_access
|
|||
|
and ebx,1
|
|||
|
mov [pci_access_enabled],ebx
|
|||
|
ret
|
|||
|
no_set_pci_access:
|
|||
|
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include 'vmodeint.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
|
|||
|
mov [esp+36],dword -1
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_getsetup:
|
|||
|
|
|||
|
; 1=roland mpu midi base , base io address
|
|||
|
; 2=keyboard 1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus
|
|||
|
; 3=cd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave
|
|||
|
; 4=sb16 base , base io address
|
|||
|
; 5=system language, 1eng 2fi 3ger 4rus
|
|||
|
; 6=wss base
|
|||
|
; 7=hd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave
|
|||
|
; 8=fat32 partition in hd
|
|||
|
; 9=get hs timer tic
|
|||
|
|
|||
|
cmp eax,1
|
|||
|
jne ngsyse1
|
|||
|
movzx eax,[midi_base]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse1:
|
|||
|
|
|||
|
cmp eax,2
|
|||
|
jne ngsyse2
|
|||
|
cmp ebx,1
|
|||
|
jnz kbnobaseret
|
|||
|
mov edi,[0x3010]
|
|||
|
add ecx,[edi+0x10]
|
|||
|
mov ebx,ecx
|
|||
|
mov eax,keymap
|
|||
|
mov ecx,128
|
|||
|
call memmove
|
|||
|
ret
|
|||
|
kbnobaseret:
|
|||
|
cmp ebx,2
|
|||
|
jnz kbnoshiftret
|
|||
|
mov edi,[0x3010]
|
|||
|
add ecx,[edi+0x10]
|
|||
|
mov ebx,ecx
|
|||
|
mov eax,keymap_shift
|
|||
|
mov ecx,128
|
|||
|
call memmove
|
|||
|
ret
|
|||
|
kbnoshiftret:
|
|||
|
cmp ebx,3
|
|||
|
jne kbnoaltret
|
|||
|
mov edi,[0x3010]
|
|||
|
add ecx,[edi+0x10]
|
|||
|
mov ebx,ecx
|
|||
|
mov eax,keymap_alt
|
|||
|
mov ecx,128
|
|||
|
call memmove
|
|||
|
ret
|
|||
|
kbnoaltret:
|
|||
|
cmp ebx,9
|
|||
|
jnz ngsyse2
|
|||
|
movzx eax,word [keyboard]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse2:
|
|||
|
|
|||
|
cmp eax,3
|
|||
|
jnz ngsyse3
|
|||
|
movzx eax,[cd_base]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse3:
|
|||
|
|
|||
|
cmp eax,4
|
|||
|
jne ngsyse4
|
|||
|
mov eax,[sb16]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse4:
|
|||
|
|
|||
|
cmp eax,5
|
|||
|
jnz ngsyse5
|
|||
|
mov eax,[syslang]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse5:
|
|||
|
cmp eax,6
|
|||
|
jnz ngsyse6
|
|||
|
mov eax,[wss]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse6:
|
|||
|
cmp eax,7
|
|||
|
jnz ngsyse7
|
|||
|
movzx eax,[hd_base]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse7:
|
|||
|
cmp eax,8
|
|||
|
jnz ngsyse8
|
|||
|
mov eax,[fat32part]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse8:
|
|||
|
cmp eax,9
|
|||
|
jne ngsyse9
|
|||
|
mov eax,[timer_ticks] ;[0xfdf0]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse9:
|
|||
|
cmp eax,10
|
|||
|
jnz ngsyse10
|
|||
|
mov eax,[sound_dma]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse10:
|
|||
|
cmp eax,11
|
|||
|
jnz ngsyse11
|
|||
|
mov eax,[lba_read_enabled]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse11:
|
|||
|
cmp eax,12
|
|||
|
jnz ngsyse12
|
|||
|
mov eax,[pci_access_enabled]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
ngsyse12:
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
readmousepos:
|
|||
|
|
|||
|
; eax=0 screen relative
|
|||
|
; eax=1 window relative
|
|||
|
; eax=2 buttons pressed
|
|||
|
|
|||
|
test eax,eax
|
|||
|
jnz nosr
|
|||
|
mov eax,[0xfb0a]
|
|||
|
shl eax,16
|
|||
|
mov ax,[0xfb0c]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
nosr:
|
|||
|
|
|||
|
cmp eax,1
|
|||
|
jnz nowr
|
|||
|
mov eax,[0xfb0a]
|
|||
|
shl eax,16
|
|||
|
mov ax,[0xfb0c]
|
|||
|
mov esi,[0x3010]
|
|||
|
sub esi,twdw
|
|||
|
mov bx,[esi]
|
|||
|
shl ebx,16
|
|||
|
mov bx,[esi+4]
|
|||
|
sub eax,ebx
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
nowr:
|
|||
|
|
|||
|
cmp eax,2
|
|||
|
jnz nomb
|
|||
|
movzx eax,byte [0xfb40]
|
|||
|
nomb:
|
|||
|
mov [esp+36],eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
is_input:
|
|||
|
|
|||
|
push edx
|
|||
|
mov dx,word [midisp]
|
|||
|
in al,dx
|
|||
|
and al,0x80
|
|||
|
pop edx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
is_output:
|
|||
|
|
|||
|
push edx
|
|||
|
mov dx,word [midisp]
|
|||
|
in al,dx
|
|||
|
and al,0x40
|
|||
|
pop edx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
get_mpu_in:
|
|||
|
|
|||
|
push edx
|
|||
|
mov dx,word [mididp]
|
|||
|
in al,dx
|
|||
|
pop edx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
put_mpu_out:
|
|||
|
|
|||
|
push edx
|
|||
|
mov dx,word [mididp]
|
|||
|
out dx,al
|
|||
|
pop edx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
setuart:
|
|||
|
|
|||
|
su1:
|
|||
|
call is_output
|
|||
|
cmp al,0
|
|||
|
jnz su1
|
|||
|
mov dx,word [midisp]
|
|||
|
mov al,0xff
|
|||
|
out dx,al
|
|||
|
su2:
|
|||
|
mov dx,word [midisp]
|
|||
|
mov al,0xff
|
|||
|
out dx,al
|
|||
|
call is_input
|
|||
|
cmp al,0
|
|||
|
jnz su2
|
|||
|
call get_mpu_in
|
|||
|
cmp al,0xfe
|
|||
|
jnz su2
|
|||
|
su3:
|
|||
|
call is_output
|
|||
|
cmp al,0
|
|||
|
jnz su3
|
|||
|
mov dx,word [midisp]
|
|||
|
mov al,0x3f
|
|||
|
out dx,al
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_midi:
|
|||
|
|
|||
|
cmp [mididp],0
|
|||
|
jnz sm0
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
sm0:
|
|||
|
|
|||
|
cmp eax,1
|
|||
|
mov [esp+36],dword 0
|
|||
|
jnz smn1
|
|||
|
call setuart
|
|||
|
ret
|
|||
|
smn1:
|
|||
|
|
|||
|
cmp eax,2
|
|||
|
jnz smn2
|
|||
|
sm10:
|
|||
|
call get_mpu_in
|
|||
|
call is_output
|
|||
|
test al,al
|
|||
|
jnz sm10
|
|||
|
mov al,bl
|
|||
|
call put_mpu_out
|
|||
|
ret
|
|||
|
smn2:
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
detect_devices:
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include 'detect/commouse.inc'
|
|||
|
;include 'detect/dev_fd.inc'
|
|||
|
;include 'detect/dev_hdcd.inc'
|
|||
|
;include 'detect/sear_par.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_end:
|
|||
|
|
|||
|
mov eax,[0x3010]
|
|||
|
add eax,0xa
|
|||
|
mov [eax],byte 3 ; terminate this program
|
|||
|
|
|||
|
waitterm: ; wait here for termination
|
|||
|
mov eax,5
|
|||
|
call delay_hs
|
|||
|
jmp waitterm
|
|||
|
|
|||
|
sys_system:
|
|||
|
|
|||
|
cmp eax,1 ; BOOT
|
|||
|
jnz nosystemboot
|
|||
|
mov [0x2f0000+0x9030],byte 0
|
|||
|
for_shutdown_parameter:
|
|||
|
mov eax,[0x3004]
|
|||
|
add eax,2
|
|||
|
mov [shutdown_processes],eax
|
|||
|
mov [0xFF00],al
|
|||
|
xor eax, eax
|
|||
|
ret
|
|||
|
uglobal
|
|||
|
shutdown_processes: dd 0x0
|
|||
|
endg
|
|||
|
nosystemboot:
|
|||
|
|
|||
|
cmp eax,2 ; TERMINATE
|
|||
|
jnz noprocessterminate
|
|||
|
cmp ebx,2
|
|||
|
jb noprocessterminate
|
|||
|
mov edx,[0x3004]
|
|||
|
cmp ebx,edx
|
|||
|
jg noprocessterminate
|
|||
|
mov eax,[0x3004]
|
|||
|
shl ebx,5
|
|||
|
mov edx,[ebx+0x3000+4]
|
|||
|
add ebx,0x3000+0xa
|
|||
|
|
|||
|
;call MEM_Heap_Lock ;guarantee that process isn't working with heap
|
|||
|
mov [ebx],byte 3 ; clear possible i40's
|
|||
|
;call MEM_Heap_UnLock
|
|||
|
|
|||
|
cmp edx,[application_table_status] ; clear app table stat
|
|||
|
jne noatsc
|
|||
|
mov [application_table_status],0
|
|||
|
noatsc:
|
|||
|
ret
|
|||
|
noprocessterminate:
|
|||
|
|
|||
|
cmp eax,3 ; ACTIVATE WINDOW
|
|||
|
jnz nowindowactivate
|
|||
|
cmp ebx,2
|
|||
|
jb nowindowactivate
|
|||
|
cmp ebx,[0x3004]
|
|||
|
ja nowindowactivate
|
|||
|
; edi = position at window_data+
|
|||
|
mov edi, ebx ; edi = process number
|
|||
|
;shl ebx, 1
|
|||
|
;add ebx, 0xc000
|
|||
|
;mov esi, [ebx] ; esi = window stack value
|
|||
|
;and esi, 0xffff ; word
|
|||
|
movzx esi, word [0xC000 + ebx*2]
|
|||
|
mov edx, [0x3004] ; edx = number of processes
|
|||
|
cmp esi, edx
|
|||
|
jz nowindowactivate ; continue if window_stack_value != number_of_processes
|
|||
|
; i.e. if window is not already active
|
|||
|
|
|||
|
;* start code - get active process (1) - Mario79
|
|||
|
mov [window_minimize],2
|
|||
|
mov [active_process],edi
|
|||
|
;* end code - get active process (1) - Mario79
|
|||
|
|
|||
|
mov [0xff01],edi ; activate
|
|||
|
xor eax, eax
|
|||
|
ret
|
|||
|
|
|||
|
nowindowactivate:
|
|||
|
|
|||
|
cmp eax,4 ; GET IDLETIME
|
|||
|
jnz nogetidletime
|
|||
|
mov eax,[idleusesec]
|
|||
|
ret
|
|||
|
nogetidletime:
|
|||
|
|
|||
|
cmp eax,5 ; GET TSC/SEC
|
|||
|
jnz nogettscsec
|
|||
|
mov eax,[0xf600]
|
|||
|
ret
|
|||
|
nogettscsec:
|
|||
|
|
|||
|
; SAVE ramdisk to /hd/1/menuet.img
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
include 'blkdev/rdsave.inc'
|
|||
|
;!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
;* start code - get active process (2) - Mario79
|
|||
|
cmp eax,7
|
|||
|
jnz nogetactiveprocess
|
|||
|
mov eax,[active_process]
|
|||
|
ret
|
|||
|
nogetactiveprocess:
|
|||
|
cmp eax,8
|
|||
|
jnz nosoundflag
|
|||
|
cmp ebx,1
|
|||
|
jne nogetsoundflag
|
|||
|
movzx eax,byte [sound_flag] ; get sound_flag
|
|||
|
ret
|
|||
|
nogetsoundflag:
|
|||
|
cmp ebx,2
|
|||
|
jnz nosoundflag
|
|||
|
inc byte [sound_flag] ; set sound_flag
|
|||
|
and byte [sound_flag],1 ;
|
|||
|
ret
|
|||
|
nosoundflag:
|
|||
|
cmp eax,9 ; system shutdown with param
|
|||
|
jnz noshutdownsystem
|
|||
|
cmp ebx,1
|
|||
|
jl exit_for_anyone
|
|||
|
cmp ebx,4
|
|||
|
jg exit_for_anyone
|
|||
|
mov [0x2f0000+0x9030],bl
|
|||
|
jmp for_shutdown_parameter
|
|||
|
noshutdownsystem:
|
|||
|
cmp eax,10 ; minimize window
|
|||
|
jnz nominimizewindow
|
|||
|
mov [window_minimize],1
|
|||
|
exit_for_anyone:
|
|||
|
ret
|
|||
|
nominimizewindow:
|
|||
|
cmp eax,11 ; get disk info table
|
|||
|
jnz nogetdiskinfo
|
|||
|
cmp ebx,1
|
|||
|
jnz full_table
|
|||
|
small_table:
|
|||
|
call for_all_tables
|
|||
|
mov cx,10
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
ret
|
|||
|
for_all_tables:
|
|||
|
mov edi,[3010h]
|
|||
|
mov edi,[edi+10h]
|
|||
|
add edi,ecx
|
|||
|
mov esi,0x40000
|
|||
|
xor ecx,ecx
|
|||
|
ret
|
|||
|
full_table:
|
|||
|
cmp ebx,2
|
|||
|
jnz exit_for_anyone
|
|||
|
call for_all_tables
|
|||
|
mov cx,16384
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
ret
|
|||
|
nogetdiskinfo:
|
|||
|
cmp eax,12 ; get all key pressed with ALT
|
|||
|
jnz nogetkey
|
|||
|
mov eax,[last_key_press]
|
|||
|
mov al,[keyboard_mode_sys]
|
|||
|
mov [esp+36],eax
|
|||
|
mov [last_key_press],0
|
|||
|
.finish:
|
|||
|
ret
|
|||
|
nogetkey:
|
|||
|
cmp eax,13 ; get kernel ID and version
|
|||
|
jnz nogetkernel_id
|
|||
|
mov edi,[3010h]
|
|||
|
mov edi,[edi+10h]
|
|||
|
add edi,ebx
|
|||
|
mov esi,version_inf
|
|||
|
mov ecx,version_end-version_inf
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
ret
|
|||
|
nogetkernel_id:
|
|||
|
cmp eax,14 ; sys wait retrace
|
|||
|
jnz nosys_wait_retrace
|
|||
|
;wait retrace functions
|
|||
|
sys_wait_retrace:
|
|||
|
mov edx,0x3da
|
|||
|
WaitRetrace_loop:
|
|||
|
in al,dx
|
|||
|
test al,1000b
|
|||
|
jz WaitRetrace_loop
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
nosys_wait_retrace:
|
|||
|
cmp eax,15 ; mouse centered
|
|||
|
jnz no_mouse_centered
|
|||
|
call mouse_centered
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
no_mouse_centered:
|
|||
|
;* end code - get active process (2) - Mario79
|
|||
|
ret
|
|||
|
window_minimize db 0
|
|||
|
sound_flag db 0
|
|||
|
last_key_press dd 0
|
|||
|
keyboard_mode_sys db 0
|
|||
|
|
|||
|
iglobal
|
|||
|
version_inf:
|
|||
|
db 0,5,0,0 ; version 0.5.0.0
|
|||
|
db UID_KOLIBRI
|
|||
|
db 'Kolibri',0
|
|||
|
version_end:
|
|||
|
endg
|
|||
|
|
|||
|
UID_NONE=0
|
|||
|
UID_MENUETOS=1 ;official
|
|||
|
UID_KOLIBRI=2 ;russian
|
|||
|
|
|||
|
main_loop_sys_getkey:
|
|||
|
cmp [0xf400],byte 0
|
|||
|
je .finish
|
|||
|
movzx eax,byte [0xf401]
|
|||
|
shl eax,8
|
|||
|
mov [last_key_press],eax
|
|||
|
.finish:
|
|||
|
ret
|
|||
|
|
|||
|
sys_cachetodiskette:
|
|||
|
pushad
|
|||
|
cmp eax,1
|
|||
|
jne no_write_all_of_ramdisk
|
|||
|
|
|||
|
call fdc_writeramdisk
|
|||
|
popad
|
|||
|
ret
|
|||
|
no_write_all_of_ramdisk:
|
|||
|
cmp eax,2
|
|||
|
jne no_write_part_of_ramdisk
|
|||
|
call fdc_commitflush
|
|||
|
popad
|
|||
|
ret
|
|||
|
no_write_part_of_ramdisk:
|
|||
|
cmp eax,3
|
|||
|
jne no_set_fdc
|
|||
|
call fdc_set
|
|||
|
popad
|
|||
|
ret
|
|||
|
no_set_fdc:
|
|||
|
cmp eax,4
|
|||
|
jne no_get_fdc
|
|||
|
popad
|
|||
|
call fdc_get
|
|||
|
mov [esp+36],ecx
|
|||
|
ret
|
|||
|
no_get_fdc:
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
; bgrchanged dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
sys_background:
|
|||
|
|
|||
|
cmp eax,1 ; BACKGROUND SIZE
|
|||
|
jnz nosb1
|
|||
|
cmp ebx,0
|
|||
|
je sbgrr
|
|||
|
cmp ecx,0
|
|||
|
je sbgrr
|
|||
|
mov [display_data-8],ebx
|
|||
|
mov [display_data-4],ecx
|
|||
|
; mov [bgrchanged],1
|
|||
|
sbgrr:
|
|||
|
ret
|
|||
|
nosb1:
|
|||
|
|
|||
|
cmp eax,2 ; SET PIXEL
|
|||
|
jnz nosb2
|
|||
|
mov edx,0x160000-16
|
|||
|
cmp edx,ebx
|
|||
|
jbe nosb2
|
|||
|
mov edx,[ebx]
|
|||
|
and edx,0xFF000000 ;255*256*256*256
|
|||
|
and ecx,0x00FFFFFF ;255*256*256+255*256+255
|
|||
|
add edx,ecx
|
|||
|
mov [ebx+0x300000],edx
|
|||
|
; mov [bgrchanged],1
|
|||
|
ret
|
|||
|
nosb2:
|
|||
|
|
|||
|
cmp eax,3 ; DRAW BACKGROUND
|
|||
|
jnz nosb3
|
|||
|
draw_background_temp:
|
|||
|
; cmp [bgrchanged],1 ;0
|
|||
|
; je nosb31
|
|||
|
;draw_background_temp:
|
|||
|
; mov [bgrchanged],1 ;0
|
|||
|
mov [0xfff0],byte 1
|
|||
|
nosb31:
|
|||
|
ret
|
|||
|
nosb3:
|
|||
|
|
|||
|
cmp eax,4 ; TILED / STRETCHED
|
|||
|
jnz nosb4
|
|||
|
cmp ebx,[display_data-12]
|
|||
|
je nosb41
|
|||
|
mov [display_data-12],ebx
|
|||
|
; mov [bgrchanged],1
|
|||
|
nosb41:
|
|||
|
ret
|
|||
|
nosb4:
|
|||
|
|
|||
|
cmp eax,5 ; BLOCK MOVE TO BGR
|
|||
|
jnz nosb5
|
|||
|
; bughere
|
|||
|
mov edi, [0x3010]
|
|||
|
add ebx, [edi+0x10]
|
|||
|
; mov esi, ebx
|
|||
|
; mov edi, ecx
|
|||
|
mov eax, ebx
|
|||
|
mov ebx, ecx
|
|||
|
add ecx, edx
|
|||
|
cmp ecx, 0x160000-16
|
|||
|
ja .fin
|
|||
|
; add edi, 0x300000
|
|||
|
add ebx, 0x300000
|
|||
|
mov ecx, edx
|
|||
|
cmp ecx, 0x160000-16
|
|||
|
ja .fin
|
|||
|
; mov [bgrchanged],1
|
|||
|
; cld
|
|||
|
; rep movsb
|
|||
|
call memmove
|
|||
|
.fin:
|
|||
|
ret
|
|||
|
nosb5:
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_getbackground:
|
|||
|
|
|||
|
cmp eax,1 ; SIZE
|
|||
|
jnz nogb1
|
|||
|
mov eax,[display_data-8]
|
|||
|
shl eax,16
|
|||
|
mov ax,[display_data-4]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
nogb1:
|
|||
|
|
|||
|
cmp eax,2 ; PIXEL
|
|||
|
jnz nogb2
|
|||
|
mov edx,0x160000-16
|
|||
|
cmp edx,ebx
|
|||
|
jbe nogb2
|
|||
|
mov eax, [ebx+0x300000]
|
|||
|
and eax, 0xFFFFFF
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
nogb2:
|
|||
|
|
|||
|
cmp eax,4 ; TILED / STRETCHED
|
|||
|
jnz nogb4
|
|||
|
mov eax,[display_data-12]
|
|||
|
nogb4:
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_getkey:
|
|||
|
mov [esp+36],dword 1
|
|||
|
mov ebx, [0x3000] ; TOP OF WINDOW STACK
|
|||
|
movzx ecx,word [0xC000 + ebx * 2]
|
|||
|
mov edx,[0x3004]
|
|||
|
cmp ecx,edx
|
|||
|
jne .finish
|
|||
|
cmp [0xf400],byte 0
|
|||
|
je .finish
|
|||
|
movzx eax,byte [0xf401]
|
|||
|
shl eax,8
|
|||
|
push eax
|
|||
|
dec byte [0xf400]
|
|||
|
and byte [0xf400],127
|
|||
|
movzx ecx,byte [0xf400]
|
|||
|
add ecx,2
|
|||
|
; mov esi,0xf402
|
|||
|
; mov edi,0xf401
|
|||
|
; cld
|
|||
|
; rep movsb
|
|||
|
mov eax, 0xF402
|
|||
|
mov ebx, 0xF401
|
|||
|
call memmove
|
|||
|
pop eax
|
|||
|
mov [last_key_press],eax
|
|||
|
|
|||
|
mov eax,[kb_state]
|
|||
|
and al,110000b
|
|||
|
cmp al,100000b
|
|||
|
je .yes_win_key
|
|||
|
cmp al,10000b
|
|||
|
je .yes_win_key
|
|||
|
mov eax,[last_key_press]
|
|||
|
jmp .no_win_key
|
|||
|
; cmp ah,232
|
|||
|
; je .yes_win_key
|
|||
|
; cmp ah,233
|
|||
|
; jne .no_win_key
|
|||
|
.yes_win_key:
|
|||
|
mov eax,1
|
|||
|
.no_win_key:
|
|||
|
mov [esp+36],eax
|
|||
|
.finish:
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_getbutton:
|
|||
|
|
|||
|
mov ebx, [0x3000] ; TOP OF WINDOW STACK
|
|||
|
mov [esp+36],dword 1
|
|||
|
movzx ecx, word [0xC000 + ebx * 2]
|
|||
|
mov edx, [0x3004] ; less than 256 processes
|
|||
|
cmp ecx,edx
|
|||
|
jne .exit
|
|||
|
movzx eax,byte [0xf500]
|
|||
|
test eax,eax
|
|||
|
jz .exit
|
|||
|
mov eax,[0xf501]
|
|||
|
shl eax,8
|
|||
|
mov [0xf500],byte 0
|
|||
|
mov [esp+36],eax
|
|||
|
.exit:
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_cpuusage:
|
|||
|
|
|||
|
; RETURN:
|
|||
|
;
|
|||
|
; +00 dword process cpu usage
|
|||
|
; +04 word position in windowing stack
|
|||
|
; +06 word windowing stack value at current position (cpu nro)
|
|||
|
; +10 12 bytes name
|
|||
|
; +22 dword start in mem
|
|||
|
; +26 dword used mem
|
|||
|
; +30 dword PID , process idenfification number
|
|||
|
;
|
|||
|
|
|||
|
mov edi,[0x3010] ; eax = return area
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
|
|||
|
cmp ebx,-1 ; who am I ?
|
|||
|
jne no_who_am_i
|
|||
|
mov ebx,[0x3000]
|
|||
|
no_who_am_i:
|
|||
|
|
|||
|
push eax ; return area
|
|||
|
push ebx ; process number
|
|||
|
|
|||
|
push ebx
|
|||
|
push ebx
|
|||
|
push eax
|
|||
|
|
|||
|
; return memory usage
|
|||
|
|
|||
|
xor edx,edx
|
|||
|
mov eax,0x20
|
|||
|
mul ebx
|
|||
|
add eax,0x3000+0x1c
|
|||
|
mov ebx,eax
|
|||
|
pop eax
|
|||
|
mov ecx,[ebx]
|
|||
|
mov [eax],ecx
|
|||
|
pop ebx
|
|||
|
; mov ebx,[esp]
|
|||
|
; shl ebx,1
|
|||
|
; add ebx,0xc000
|
|||
|
mov cx, [0xC000 + ebx * 2]
|
|||
|
mov [eax+4],cx
|
|||
|
; mov ebx,[esp]
|
|||
|
; shl ebx,1
|
|||
|
; add ebx,0xc400
|
|||
|
mov cx, [0xC400 + ebx * 2]
|
|||
|
mov [eax+6],cx
|
|||
|
; pop ebx
|
|||
|
push eax
|
|||
|
mov eax,ebx
|
|||
|
shl eax,8
|
|||
|
add eax,0x80000
|
|||
|
pop ebx
|
|||
|
add ebx,10
|
|||
|
mov ecx,11
|
|||
|
call memmove
|
|||
|
|
|||
|
; memory usage
|
|||
|
|
|||
|
xor eax,eax
|
|||
|
mov edx,0x100000*16
|
|||
|
pop ecx ; get gdt of tss
|
|||
|
cmp ecx,1
|
|||
|
je os_mem
|
|||
|
shl ecx,8
|
|||
|
mov edx,[0x80000+ecx+0x8c]
|
|||
|
mov eax,std_application_base_address
|
|||
|
;add ecx,0x80000+0x88
|
|||
|
;mov ecx,[ecx]
|
|||
|
; shl ecx,3
|
|||
|
; eax run base -> edx used memory
|
|||
|
; mov al,[ecx+gdts+ app_code-3 +4] ; base 23:16
|
|||
|
; mov ah,[ecx+gdts+ app_code-3 +7] ; base 31:24
|
|||
|
; shl eax,16
|
|||
|
; mov ax,[ecx+gdts+ app_code-3 +2] ; base 0:15
|
|||
|
; movzx edx,word [ecx+gdts+ app_code-3 +0]
|
|||
|
; shl edx,12
|
|||
|
|
|||
|
os_mem:
|
|||
|
dec edx
|
|||
|
mov [ebx+12],eax
|
|||
|
mov [ebx+16],edx
|
|||
|
|
|||
|
; PID (+30)
|
|||
|
|
|||
|
mov eax,[esp]
|
|||
|
shl eax,5
|
|||
|
add eax,0x3000+0x4
|
|||
|
mov eax,[eax]
|
|||
|
mov [ebx+20],eax
|
|||
|
|
|||
|
; window position and size
|
|||
|
|
|||
|
mov esi,[esp]
|
|||
|
shl esi,5
|
|||
|
add esi,window_data
|
|||
|
mov edi,[esp+4]
|
|||
|
add edi,34
|
|||
|
mov ecx,4*4
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
; Process state (+50)
|
|||
|
|
|||
|
mov eax,[esp]
|
|||
|
shl eax,5
|
|||
|
add eax,0x3000+0xa
|
|||
|
mov eax,[eax]
|
|||
|
mov [ebx+40],ax
|
|||
|
|
|||
|
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
|
|||
|
; return number of processes
|
|||
|
|
|||
|
mov eax,[0x3004]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
sys_clock:
|
|||
|
cli
|
|||
|
; Mikhail Lisovin xx Jan 2005
|
|||
|
@@: mov al, 10
|
|||
|
out 0x70, al
|
|||
|
in al, 0x71
|
|||
|
test al, al
|
|||
|
jns @f
|
|||
|
mov esi, 1
|
|||
|
call delay_ms
|
|||
|
jmp @b
|
|||
|
@@:
|
|||
|
; end Lisovin's fix
|
|||
|
|
|||
|
xor al,al ; seconds
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
movzx ecx,al
|
|||
|
mov al,02 ; minutes
|
|||
|
shl ecx,16
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
movzx edx,al
|
|||
|
mov al,04 ; hours
|
|||
|
shl edx,8
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
add ecx,edx
|
|||
|
movzx edx,al
|
|||
|
add ecx,edx
|
|||
|
sti
|
|||
|
mov [esp+36],ecx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_date:
|
|||
|
|
|||
|
cli
|
|||
|
mov al,6 ; day of week
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
mov ch,al
|
|||
|
mov al,7 ; date
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
mov cl,al
|
|||
|
mov al,8 ; month
|
|||
|
shl ecx,16
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
mov ch,al
|
|||
|
mov al,9 ; year
|
|||
|
out 0x70,al
|
|||
|
in al,0x71
|
|||
|
mov cl,al
|
|||
|
sti
|
|||
|
mov [esp+36],ecx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
; redraw status
|
|||
|
|
|||
|
sys_redrawstat:
|
|||
|
|
|||
|
cmp eax,1
|
|||
|
jne no_widgets_away
|
|||
|
|
|||
|
; buttons away
|
|||
|
|
|||
|
mov ecx,[0x3000]
|
|||
|
|
|||
|
sys_newba2:
|
|||
|
|
|||
|
mov edi,[0xfe88]
|
|||
|
cmp [edi],dword 0 ; empty button list ?
|
|||
|
je end_of_buttons_away
|
|||
|
|
|||
|
movzx ebx,word [edi]
|
|||
|
inc ebx
|
|||
|
|
|||
|
mov eax,edi
|
|||
|
|
|||
|
sys_newba:
|
|||
|
|
|||
|
dec ebx
|
|||
|
jz end_of_buttons_away
|
|||
|
|
|||
|
add eax,0x10
|
|||
|
cmp cx,[eax]
|
|||
|
jnz sys_newba
|
|||
|
|
|||
|
push eax ebx ecx
|
|||
|
mov ecx,ebx
|
|||
|
inc ecx
|
|||
|
shl ecx,4
|
|||
|
mov ebx,eax
|
|||
|
add eax,0x10
|
|||
|
call memmove
|
|||
|
dec dword [edi]
|
|||
|
pop ecx ebx eax
|
|||
|
|
|||
|
jmp sys_newba2
|
|||
|
|
|||
|
end_of_buttons_away:
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
no_widgets_away:
|
|||
|
|
|||
|
cmp eax,2
|
|||
|
jnz srl1
|
|||
|
|
|||
|
mov edx,[0x3010] ; return whole screen draw area for this app
|
|||
|
add edx,draw_data-0x3000
|
|||
|
mov [edx+0],dword 0
|
|||
|
mov [edx+4],dword 0
|
|||
|
mov eax,[0xfe00]
|
|||
|
mov [edx+8],eax
|
|||
|
mov eax,[0xfe04]
|
|||
|
mov [edx+12],eax
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
sub edi,twdw
|
|||
|
mov [edi+30],byte 1 ; no new position & buttons from app
|
|||
|
|
|||
|
call sys_window_mouse
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
srl1:
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_drawwindow:
|
|||
|
|
|||
|
mov edi,ecx
|
|||
|
shr edi,16+8
|
|||
|
and edi,15
|
|||
|
|
|||
|
cmp edi,0 ; type I - original style
|
|||
|
jne nosyswI
|
|||
|
call sys_set_window
|
|||
|
call drawwindow_I
|
|||
|
ret
|
|||
|
nosyswI:
|
|||
|
|
|||
|
cmp edi,1 ; type II - only reserve area, no draw
|
|||
|
jne nosyswII
|
|||
|
call sys_set_window
|
|||
|
call sys_window_mouse
|
|||
|
ret
|
|||
|
nosyswII:
|
|||
|
|
|||
|
cmp edi,2 ; type III - new style
|
|||
|
jne nosyswIII
|
|||
|
call sys_set_window
|
|||
|
call drawwindow_III
|
|||
|
ret
|
|||
|
nosyswIII:
|
|||
|
|
|||
|
cmp edi,3 ; type IV - skinned window
|
|||
|
jne nosyswIV
|
|||
|
call sys_set_window
|
|||
|
call drawwindow_IV
|
|||
|
ret
|
|||
|
nosyswIV:
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_set_window:
|
|||
|
|
|||
|
mov edi,[0x3000]
|
|||
|
shl edi,5
|
|||
|
add edi,window_data
|
|||
|
|
|||
|
; colors
|
|||
|
mov [edi+16],ecx
|
|||
|
mov [edi+20],edx
|
|||
|
mov [edi+24],esi
|
|||
|
|
|||
|
; check flag (?)
|
|||
|
cmp [edi+30],byte 1
|
|||
|
jz newd
|
|||
|
|
|||
|
push eax
|
|||
|
mov eax,[timer_ticks] ;[0xfdf0]
|
|||
|
add eax,100
|
|||
|
mov [new_window_starting],eax
|
|||
|
pop eax
|
|||
|
|
|||
|
mov [edi+8],ax
|
|||
|
mov [edi+12],bx
|
|||
|
shr eax,16
|
|||
|
shr ebx,16
|
|||
|
mov [edi+00],ax
|
|||
|
mov [edi+04],bx
|
|||
|
|
|||
|
|
|||
|
call check_window_position
|
|||
|
|
|||
|
|
|||
|
push ecx esi edi ; save for window fullscreen/resize
|
|||
|
mov esi,edi
|
|||
|
sub edi,window_data
|
|||
|
shr edi,5
|
|||
|
shl edi,8
|
|||
|
add edi,0x80000+0x90
|
|||
|
mov ecx,4
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
pop edi esi ecx
|
|||
|
|
|||
|
push eax ebx ecx edx
|
|||
|
;;; mov eax, 1
|
|||
|
;;; call delay_hs
|
|||
|
movzx eax, word [edi+00]
|
|||
|
movzx ebx, word [edi+04]
|
|||
|
movzx ecx, word [edi+8]
|
|||
|
movzx edx, word [edi+12]
|
|||
|
add ecx, eax
|
|||
|
add edx, ebx
|
|||
|
call calculatescreen
|
|||
|
pop edx ecx ebx eax
|
|||
|
|
|||
|
mov [0xf400],byte 0 ; empty keyboard buffer
|
|||
|
mov [0xf500],byte 0 ; empty button buffer
|
|||
|
|
|||
|
newd:
|
|||
|
mov [edi+31],byte 0 ; no redraw
|
|||
|
mov edx,edi
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_window_move:
|
|||
|
|
|||
|
cmp [window_move_pr],0
|
|||
|
je mwrl1
|
|||
|
|
|||
|
mov [esp+36],dword 1 ; return queue error
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
mwrl1:
|
|||
|
|
|||
|
mov edi,[0x3000] ; requestor process base
|
|||
|
mov [window_move_pr],edi
|
|||
|
|
|||
|
mov [window_move_eax],eax
|
|||
|
mov [window_move_ebx],ebx
|
|||
|
mov [window_move_ecx],ecx
|
|||
|
mov [window_move_edx],edx
|
|||
|
|
|||
|
mov [esp+36],dword 0 ; return success
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
type_background_1:
|
|||
|
cmp [0xfff0],byte 0 ; background update ?
|
|||
|
jz temp_nobackgr
|
|||
|
mov [0xfff0],byte 2
|
|||
|
call change_task
|
|||
|
mov [draw_data+32+0],dword 0
|
|||
|
mov [draw_data+32+4],dword 0
|
|||
|
mov eax,[0xfe00]
|
|||
|
mov ebx,[0xfe04]
|
|||
|
mov [draw_data+32+8],eax
|
|||
|
mov [draw_data+32+12],ebx
|
|||
|
call drawbackground
|
|||
|
mov [0xfff0],byte 0
|
|||
|
mov [0xfff4],byte 0
|
|||
|
temp_nobackgr:
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
window_move_pr dd 0x0
|
|||
|
window_move_eax dd 0x0
|
|||
|
window_move_ebx dd 0x0
|
|||
|
window_move_ecx dd 0x0
|
|||
|
window_move_edx dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
;ok - 100% work
|
|||
|
;nt - not tested
|
|||
|
;---------------------------------------------------------------------------------------------
|
|||
|
;eax
|
|||
|
;0 - task switch counter. Ret switch counter in eax. Block. ok.
|
|||
|
;1 - change task. Ret nothing. Block. ok.
|
|||
|
;2 - performance control
|
|||
|
; ebx
|
|||
|
; 0 - enable or disable (inversion) PCE flag on CR4 for rdmpc in user mode.
|
|||
|
; returned new cr4 in eax. Ret cr4 in eax. Block. ok.
|
|||
|
; 1 - is cache enabled. Ret cr0 in eax if enabled else zero in eax. Block. ok.
|
|||
|
; 2 - enable cache. Ret 1 in eax. Ret nothing. Block. ok.
|
|||
|
; 3 - disable cache. Ret 0 in eax. Ret nothing. Block. ok.
|
|||
|
;eax
|
|||
|
;3 - rdmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
|
|||
|
;4 - wrmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok.
|
|||
|
;---------------------------------------------------------------------------------------------
|
|||
|
sys_sheduler: ;noname & halyavin
|
|||
|
cmp eax,0
|
|||
|
je shed_counter
|
|||
|
cmp eax,2
|
|||
|
je perf_control
|
|||
|
cmp eax,3
|
|||
|
je rdmsr_instr
|
|||
|
cmp eax,4
|
|||
|
je wrmsr_instr
|
|||
|
cmp eax,1
|
|||
|
jne not_supported
|
|||
|
call change_task ;delay,0
|
|||
|
ret
|
|||
|
shed_counter:
|
|||
|
mov eax,[context_counter]
|
|||
|
mov [esp+36],eax
|
|||
|
not_supported:
|
|||
|
ret
|
|||
|
perf_control:
|
|||
|
inc eax ;now eax=3
|
|||
|
cmp ebx,eax
|
|||
|
je cache_disable
|
|||
|
dec eax
|
|||
|
cmp ebx,eax
|
|||
|
je cache_enable
|
|||
|
dec eax
|
|||
|
cmp ebx,eax
|
|||
|
je is_cache_enabled
|
|||
|
dec eax
|
|||
|
cmp ebx,eax
|
|||
|
je modify_pce
|
|||
|
ret
|
|||
|
|
|||
|
rdmsr_instr:
|
|||
|
;now counter in ecx
|
|||
|
;(edx:eax) esi:edi => edx:esi
|
|||
|
mov eax,esi
|
|||
|
rdmsr
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+24],edx ;ret in ebx?
|
|||
|
ret
|
|||
|
|
|||
|
wrmsr_instr:
|
|||
|
;now counter in ecx
|
|||
|
;(edx:eax) esi:edi => edx:esi
|
|||
|
mov eax,esi
|
|||
|
wrmsr
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+24],edx ;ret in ebx?
|
|||
|
ret
|
|||
|
|
|||
|
cache_disable:
|
|||
|
mov eax,cr0
|
|||
|
or eax,01100000000000000000000000000000b
|
|||
|
mov cr0,eax
|
|||
|
wbinvd ;set MESI
|
|||
|
ret
|
|||
|
|
|||
|
cache_enable:
|
|||
|
mov eax,cr0
|
|||
|
and eax,10011111111111111111111111111111b
|
|||
|
mov cr0,eax
|
|||
|
ret
|
|||
|
|
|||
|
is_cache_enabled:
|
|||
|
mov eax,cr0
|
|||
|
mov ebx,eax
|
|||
|
and eax,01100000000000000000000000000000b
|
|||
|
jz cache_disabled
|
|||
|
mov [esp+36],ebx
|
|||
|
cache_disabled:
|
|||
|
mov dword [esp+36],eax ;0
|
|||
|
ret
|
|||
|
|
|||
|
modify_pce:
|
|||
|
mov eax,cr4
|
|||
|
; mov ebx,0
|
|||
|
; or bx,100000000b ;pce
|
|||
|
; xor eax,ebx ;invert pce
|
|||
|
btr eax,8 ;pce=cr4[8]
|
|||
|
mov cr4,eax
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
;---------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
; check pixel limits
|
|||
|
|
|||
|
;cplimit:
|
|||
|
; push edi
|
|||
|
|
|||
|
; cmp byte [0xe000], 1 ; Multitasking enabled?
|
|||
|
; jnz .ret0
|
|||
|
; mov edi,[0x3010]
|
|||
|
; add edi, draw_data-0x3000
|
|||
|
; mov ecx, 1
|
|||
|
; cmp [edi+0], eax ; xs
|
|||
|
; ja .ret1
|
|||
|
; cmp [edi+4], ebx ; ys
|
|||
|
; ja .ret1
|
|||
|
; cmp eax, [edi+8] ; xe
|
|||
|
; ja .ret1
|
|||
|
; cmp ebx, [edi+12] ; ye
|
|||
|
; ja .ret1
|
|||
|
|
|||
|
;.ret0:
|
|||
|
; xor ecx, ecx
|
|||
|
;.ret1:
|
|||
|
; pop edi
|
|||
|
; ret
|
|||
|
|
|||
|
|
|||
|
; check if pixel is allowed to be drawn
|
|||
|
|
|||
|
checkpixel:
|
|||
|
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
push edx
|
|||
|
|
|||
|
; mov ecx,[0x3000] ; process count
|
|||
|
; shl ecx, 6 ; *64
|
|||
|
; add ecx,0xc000 ; +window_stack
|
|||
|
; mov dx,word [ecx] ; window_stack_value
|
|||
|
|
|||
|
; cmp dx, word [0x3004] ; is this window active right now?!
|
|||
|
; jz .ret0
|
|||
|
|
|||
|
; call cplimit
|
|||
|
; test ecx, ecx
|
|||
|
; jnz .ret1
|
|||
|
|
|||
|
mov edx,[0xfe00] ; screen x size
|
|||
|
inc edx
|
|||
|
imul edx, ebx
|
|||
|
mov dl, [eax+edx+display_data] ; lea eax, [...]
|
|||
|
;;; mov dl,[eax]
|
|||
|
|
|||
|
mov eax,[0x3000]
|
|||
|
shl eax,5
|
|||
|
add eax,0x3000+0xe
|
|||
|
|
|||
|
mov ecx, 1
|
|||
|
cmp byte [eax], dl
|
|||
|
jnz .ret1
|
|||
|
|
|||
|
.ret0:
|
|||
|
xor ecx, ecx
|
|||
|
.ret1:
|
|||
|
pop edx
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
mouse_active db 0
|
|||
|
endg
|
|||
|
iglobal
|
|||
|
cpustring db 'CPU '
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
; check misc
|
|||
|
|
|||
|
checkmisc:
|
|||
|
|
|||
|
cmp [ctrl_alt_del], 1
|
|||
|
jne nocpustart
|
|||
|
mov eax, cpustring
|
|||
|
call start_application_fl
|
|||
|
mov [ctrl_alt_del], 0
|
|||
|
nocpustart:
|
|||
|
cmp [mouse_active], 1
|
|||
|
jne mouse_not_active
|
|||
|
mov [mouse_active], 0
|
|||
|
xor edi, edi
|
|||
|
mov ecx, [0x3004]
|
|||
|
set_mouse_event:
|
|||
|
add edi, 256
|
|||
|
or [edi+0x80000+0xA8], dword 00100000b
|
|||
|
loop set_mouse_event
|
|||
|
mouse_not_active:
|
|||
|
|
|||
|
|
|||
|
cmp [0xfff0],byte 0 ; background update ?
|
|||
|
jz nobackgr
|
|||
|
mov [0xfff0],byte 2
|
|||
|
call change_task
|
|||
|
mov [draw_data+32+0],dword 0
|
|||
|
mov [draw_data+32+4],dword 0
|
|||
|
mov eax,[0xfe00]
|
|||
|
mov ebx,[0xfe04]
|
|||
|
mov [draw_data+32+8],eax
|
|||
|
mov [draw_data+32+12],ebx
|
|||
|
call drawbackground
|
|||
|
mov [0xfff0],byte 0
|
|||
|
mov [0xfff4],byte 0
|
|||
|
|
|||
|
nobackgr:
|
|||
|
|
|||
|
|
|||
|
; system shutdown request
|
|||
|
|
|||
|
cmp [0xFF00],byte 0
|
|||
|
je noshutdown
|
|||
|
|
|||
|
mov edx,[shutdown_processes]
|
|||
|
sub dl,2
|
|||
|
|
|||
|
cmp [0xff00],dl
|
|||
|
jne no_mark_system_shutdown
|
|||
|
|
|||
|
mov edx,0x3040
|
|||
|
movzx ecx,byte [0xff00]
|
|||
|
add ecx,5
|
|||
|
markz:
|
|||
|
mov [edx+0xa],byte 3
|
|||
|
add edx,0x20
|
|||
|
loop markz
|
|||
|
|
|||
|
no_mark_system_shutdown:
|
|||
|
|
|||
|
call [disable_mouse]
|
|||
|
|
|||
|
dec byte [0xff00]
|
|||
|
|
|||
|
cmp [0xff00],byte 0
|
|||
|
je system_shutdown
|
|||
|
|
|||
|
noshutdown:
|
|||
|
|
|||
|
|
|||
|
mov eax,[0x3004] ; termination
|
|||
|
mov ebx,0x3020+0xa
|
|||
|
mov esi,1
|
|||
|
|
|||
|
newct:
|
|||
|
mov cl,[ebx]
|
|||
|
cmp cl,byte 3
|
|||
|
jz terminate
|
|||
|
cmp cl,byte 4
|
|||
|
jz terminate
|
|||
|
|
|||
|
add ebx,0x20
|
|||
|
inc esi
|
|||
|
dec eax
|
|||
|
jnz newct
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
; redraw screen
|
|||
|
|
|||
|
redrawscreen:
|
|||
|
|
|||
|
; eax , if process window_data base is eax, do not set flag/limits
|
|||
|
|
|||
|
pushad
|
|||
|
push eax
|
|||
|
|
|||
|
;;; mov eax,2
|
|||
|
;;; call delay_hs
|
|||
|
|
|||
|
;mov ecx,0 ; redraw flags for apps
|
|||
|
xor ecx,ecx
|
|||
|
newdw2:
|
|||
|
|
|||
|
inc ecx
|
|||
|
push ecx
|
|||
|
|
|||
|
mov eax,ecx
|
|||
|
shl eax,5
|
|||
|
add eax,window_data
|
|||
|
|
|||
|
cmp eax,[esp+4]
|
|||
|
je not_this_task
|
|||
|
; check if window in redraw area
|
|||
|
mov edi,eax
|
|||
|
|
|||
|
cmp ecx,1 ; limit for background
|
|||
|
jz bgli
|
|||
|
|
|||
|
mov eax,[edi+0]
|
|||
|
mov ebx,[edi+4]
|
|||
|
mov ecx,[edi+8]
|
|||
|
mov edx,[edi+12]
|
|||
|
add ecx,eax
|
|||
|
add edx,ebx
|
|||
|
|
|||
|
mov ecx,[dlye] ; ecx = area y end ebx = window y start
|
|||
|
cmp ecx,ebx
|
|||
|
jb ricino
|
|||
|
|
|||
|
mov ecx,[dlxe] ; ecx = area x end eax = window x start
|
|||
|
cmp ecx,eax
|
|||
|
jb ricino
|
|||
|
|
|||
|
mov eax,[edi+0]
|
|||
|
mov ebx,[edi+4]
|
|||
|
mov ecx,[edi+8]
|
|||
|
mov edx,[edi+12]
|
|||
|
add ecx,eax
|
|||
|
add edx,ebx
|
|||
|
|
|||
|
mov eax,[dly] ; eax = area y start edx = window y end
|
|||
|
cmp edx,eax
|
|||
|
jb ricino
|
|||
|
|
|||
|
mov eax,[dlx] ; eax = area x start ecx = window x end
|
|||
|
cmp ecx,eax
|
|||
|
jb ricino
|
|||
|
|
|||
|
bgli:
|
|||
|
|
|||
|
cmp edi,esi
|
|||
|
jz ricino
|
|||
|
|
|||
|
mov eax,edi
|
|||
|
add eax,draw_data-window_data
|
|||
|
|
|||
|
mov ebx,[dlx] ; set limits
|
|||
|
mov [eax+0],ebx
|
|||
|
mov ebx,[dly]
|
|||
|
mov [eax+4],ebx
|
|||
|
mov ebx,[dlxe]
|
|||
|
mov [eax+8],ebx
|
|||
|
mov ebx,[dlye]
|
|||
|
mov [eax+12],ebx
|
|||
|
|
|||
|
sub eax,draw_data-window_data
|
|||
|
|
|||
|
cmp ecx,1
|
|||
|
jne nobgrd
|
|||
|
cmp esi,1
|
|||
|
je newdw8
|
|||
|
call drawbackground
|
|||
|
|
|||
|
newdw8:
|
|||
|
nobgrd:
|
|||
|
|
|||
|
mov [eax+31],byte 1 ; mark as redraw
|
|||
|
|
|||
|
ricino:
|
|||
|
|
|||
|
not_this_task:
|
|||
|
|
|||
|
pop ecx
|
|||
|
|
|||
|
cmp ecx,[0x3004]
|
|||
|
jle newdw2
|
|||
|
; jg newdw3
|
|||
|
; jmp newdw2
|
|||
|
|
|||
|
; newdw3:
|
|||
|
|
|||
|
pop eax
|
|||
|
popad
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
; check mouse
|
|||
|
;
|
|||
|
;
|
|||
|
; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y
|
|||
|
; FB10 -> FB17 mouse color mem
|
|||
|
; FB21 x move
|
|||
|
; FB22 y move
|
|||
|
; FB30 color temp
|
|||
|
; FB28 high bits temp
|
|||
|
; FB4A -> FB4D FB4A-B x-under - FB4C-D y-under
|
|||
|
; FC00 -> FCFE com1/ps2 buffer
|
|||
|
; FCFF com1/ps2 buffer count starting from FC00
|
|||
|
|
|||
|
uglobal
|
|||
|
mousecount dd 0x0
|
|||
|
mousedata dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
check_mouse_data:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp [0xF604],byte 1
|
|||
|
jne no_ps2_mouse
|
|||
|
mov [mousecount],dword 0x2e0000+12*4096
|
|||
|
mov [mousedata],dword 0x2e0000+12*4096+0x10
|
|||
|
jmp uusicheckmouse
|
|||
|
no_ps2_mouse:
|
|||
|
cmp [0xF604],byte 2
|
|||
|
jne no_com1_mouse
|
|||
|
mov [mousecount],dword 0x2e0000+4*4096
|
|||
|
mov [mousedata],dword 0x2e0000+4*4096+0x10
|
|||
|
jmp uusicheckmouse
|
|||
|
no_com1_mouse:
|
|||
|
mov [mousecount],dword 0x2e0000+3*4096
|
|||
|
mov [mousedata],dword 0x2e0000+3*4096+0x10
|
|||
|
|
|||
|
uusicheckmouse:
|
|||
|
|
|||
|
mov ebx,[mousecount] ; anything at buffer for mouse
|
|||
|
cmp dword [ebx], 0 ; !!!
|
|||
|
jz checkmouseret
|
|||
|
|
|||
|
; first byte of comX or ps2 ?
|
|||
|
|
|||
|
cmp [0xF604],byte 1
|
|||
|
je ps2mousefirst
|
|||
|
|
|||
|
; ******************************************
|
|||
|
; *********** COMX mouse driver ************
|
|||
|
; ******************************************
|
|||
|
|
|||
|
com1mousefirst:
|
|||
|
|
|||
|
mov edi,[mousedata]
|
|||
|
mov dl,byte [edi] ; first com1 ?
|
|||
|
test dl,64
|
|||
|
jz @f
|
|||
|
mov [0xfb00],byte 0 ; zero mouse block count
|
|||
|
@@:
|
|||
|
xor ebx,ebx
|
|||
|
|
|||
|
mov bl,[0xfb00]
|
|||
|
inc bl
|
|||
|
mov [0xfb00],bl
|
|||
|
mov eax,0xfb00
|
|||
|
add eax,ebx
|
|||
|
mov edi,[mousedata]
|
|||
|
mov dl,byte [edi]
|
|||
|
mov [eax],byte dl
|
|||
|
cmp bl,3 ; three ?
|
|||
|
jnz decm
|
|||
|
|
|||
|
; buttons
|
|||
|
|
|||
|
;* change right and left button by places - start code - Mario79
|
|||
|
mov al,[0xfb01]
|
|||
|
mov ah,al
|
|||
|
shr al,3
|
|||
|
and al,2
|
|||
|
shr ah,5
|
|||
|
and ah,1
|
|||
|
add al,ah
|
|||
|
;* change right and left button by places - end code - Mario79
|
|||
|
|
|||
|
mov [0xfb40],al
|
|||
|
|
|||
|
; com1 mouse
|
|||
|
; x
|
|||
|
|
|||
|
mov dl,[0xfb01] ; x high bits
|
|||
|
movzx eax,dl
|
|||
|
and al,3
|
|||
|
shl al,6
|
|||
|
mov dl,byte[0xfb02] ; x low bits
|
|||
|
add al,dl
|
|||
|
mov [0xfb21],byte al
|
|||
|
movzx ebx,word[0xfb0a]
|
|||
|
|
|||
|
mov al,byte [0xfb01] ; + or - ?
|
|||
|
test al,2
|
|||
|
jz x_add
|
|||
|
|
|||
|
x_sub: ; x-
|
|||
|
sub bx,255
|
|||
|
sub bx,255
|
|||
|
x_add: ; x+
|
|||
|
movzx eax,byte [0xfb21]
|
|||
|
add bx,ax
|
|||
|
add bx,ax
|
|||
|
push ebx
|
|||
|
mov [0xfb00],byte 0
|
|||
|
|
|||
|
; y
|
|||
|
|
|||
|
|
|||
|
my_event:
|
|||
|
|
|||
|
mov dl,[0xfb01] ; y high bits
|
|||
|
movzx eax,dl
|
|||
|
and al,12
|
|||
|
shl al,4
|
|||
|
mov dl,byte[0xfb03] ; y low bits
|
|||
|
add al,dl
|
|||
|
mov [0xfb22],byte al
|
|||
|
movzx ebx,word[0xfb0c]
|
|||
|
|
|||
|
mov al,byte [0xfb01] ; + or - ?
|
|||
|
test al,8
|
|||
|
je y_add
|
|||
|
|
|||
|
y_sub: ; y-
|
|||
|
sub bx,255
|
|||
|
sub bx,255
|
|||
|
y_add: ; y+
|
|||
|
movzx eax,byte [0xfb22]
|
|||
|
add bx,ax
|
|||
|
add bx,ax
|
|||
|
push ebx
|
|||
|
mov [0xfb00],byte 0
|
|||
|
jmp mdraw
|
|||
|
|
|||
|
; end of com1 mouse
|
|||
|
|
|||
|
|
|||
|
; ******************************************
|
|||
|
; ******** PS2 MOUSE DRIVER **************
|
|||
|
; ******************************************
|
|||
|
|
|||
|
ps2mousefirst:
|
|||
|
|
|||
|
movzx edx,byte [0x2E0000+4096*12+0x10] ; first ps2 ?
|
|||
|
cmp edx,40
|
|||
|
jne @f
|
|||
|
mov [0xfb00],byte 0 ; zero mouse block count
|
|||
|
@@:
|
|||
|
|
|||
|
movzx ebx,byte [0xfb00]
|
|||
|
add ebx,1
|
|||
|
mov [0xfb00],bl
|
|||
|
mov eax,0xfb00
|
|||
|
add eax,ebx
|
|||
|
mov dl,byte [0x2E0000+4096*12+0x10]
|
|||
|
mov [eax],byte dl
|
|||
|
|
|||
|
cmp bl,3 ; full packet of three bytes ?
|
|||
|
jnz decm
|
|||
|
; jz ps2mouse
|
|||
|
; jmp decm
|
|||
|
|
|||
|
|
|||
|
; ps2mouse:
|
|||
|
|
|||
|
mov [0xfb00],byte 0 ; zero mouse block count
|
|||
|
|
|||
|
; buttons
|
|||
|
|
|||
|
movzx eax,byte [0xfb01]
|
|||
|
and eax,3
|
|||
|
mov [0xfb40],al
|
|||
|
|
|||
|
; x
|
|||
|
|
|||
|
movzx eax,word [0xfb0a]
|
|||
|
movzx edx,byte [0xfb02]
|
|||
|
cmp edx,128
|
|||
|
jb ps2xp
|
|||
|
shl edx,1
|
|||
|
add eax,edx
|
|||
|
cmp eax,512
|
|||
|
jge ps2xsok
|
|||
|
xor eax, eax
|
|||
|
jmp ps2xready
|
|||
|
ps2xsok:
|
|||
|
sub eax,512
|
|||
|
jmp ps2xready
|
|||
|
ps2xp:
|
|||
|
shl edx,1
|
|||
|
add eax,edx
|
|||
|
jmp ps2xready
|
|||
|
ps2xready:
|
|||
|
push eax
|
|||
|
|
|||
|
; y
|
|||
|
|
|||
|
movzx eax,word [0xfb0c]
|
|||
|
movzx edx,byte [0xfb03]
|
|||
|
cmp edx,128
|
|||
|
jb ps2yp
|
|||
|
add eax,512
|
|||
|
shl edx,1
|
|||
|
sub eax,edx
|
|||
|
jmp ps2yready
|
|||
|
ps2yp:
|
|||
|
shl edx,1
|
|||
|
cmp edx,eax
|
|||
|
jb ps201
|
|||
|
mov edx,eax
|
|||
|
ps201:
|
|||
|
sub eax,edx
|
|||
|
jmp ps2yready
|
|||
|
ps2yready:
|
|||
|
push eax
|
|||
|
|
|||
|
;jmp mdraw
|
|||
|
|
|||
|
; end of ps2 mouse
|
|||
|
|
|||
|
|
|||
|
; ****************************
|
|||
|
; ***** CHECK FOR LIMITS *****
|
|||
|
; ****************************
|
|||
|
|
|||
|
mdraw:
|
|||
|
|
|||
|
cmp [0xfb44],byte 0
|
|||
|
jne mousedraw4
|
|||
|
cmp [0xfb40],byte 0
|
|||
|
je mousedraw4
|
|||
|
mov [0xfff5],byte 1
|
|||
|
|
|||
|
mousedraw4:
|
|||
|
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
|
|||
|
mov [mouse_active],1
|
|||
|
|
|||
|
; mov dx,0 ; smaller than zero
|
|||
|
xor dx,dx
|
|||
|
cmp bx,dx
|
|||
|
jge mnb11
|
|||
|
; mov bx,0
|
|||
|
xor bx,bx
|
|||
|
mnb11:
|
|||
|
mov [0xfb0c],word bx
|
|||
|
|
|||
|
; mov dx,0
|
|||
|
xor dx,dx
|
|||
|
cmp ax,dx
|
|||
|
jge mnb22
|
|||
|
; mov ax,0
|
|||
|
xor ax,ax
|
|||
|
mnb22:
|
|||
|
mov [0xfb0a],word ax
|
|||
|
|
|||
|
mov edx,[0xfe04] ; bigger than maximum
|
|||
|
cmp ebx,edx
|
|||
|
jb mnb1
|
|||
|
mov bx,[0xfe04]
|
|||
|
mnb1:
|
|||
|
mov [0xfb0c],word bx
|
|||
|
|
|||
|
mov edx,[0xfe00]
|
|||
|
cmp eax,edx
|
|||
|
jb mnb2
|
|||
|
mov ax,[0xfe00]
|
|||
|
mnb2:
|
|||
|
mov [0xfb0a],word ax
|
|||
|
|
|||
|
|
|||
|
; **** NEXT DATA BYTE FROM MOUSE BUFFER ****
|
|||
|
|
|||
|
decm:
|
|||
|
|
|||
|
mov edi,[mousecount] ; decrease counter
|
|||
|
dec dword [edi]
|
|||
|
|
|||
|
mov esi,[mousedata]
|
|||
|
mov edi,esi
|
|||
|
inc esi
|
|||
|
; mov ecx,250
|
|||
|
mov ecx,[mousecount]
|
|||
|
mov ecx,[ecx]
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
jmp uusicheckmouse
|
|||
|
|
|||
|
checkmouseret:
|
|||
|
|
|||
|
cmp [0xfb44],byte 0
|
|||
|
jne cmret
|
|||
|
|
|||
|
cmp [0xfb40],byte 0
|
|||
|
je cmret
|
|||
|
|
|||
|
mov [0xfff4],byte 0
|
|||
|
mov [0xfff5],byte 0
|
|||
|
|
|||
|
cmret:
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
draw_mouse_under:
|
|||
|
|
|||
|
; return old picture
|
|||
|
; cli
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
xor ecx,ecx
|
|||
|
xor edx,edx
|
|||
|
|
|||
|
;cli ; !!!****
|
|||
|
align 4
|
|||
|
mres:
|
|||
|
|
|||
|
movzx eax,word [0xfb4a]
|
|||
|
movzx ebx,word [0xfb4c]
|
|||
|
|
|||
|
add eax,ecx
|
|||
|
add ebx,edx
|
|||
|
|
|||
|
push ecx
|
|||
|
push edx
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
|
|||
|
mov eax,edx
|
|||
|
shl eax,6
|
|||
|
shl ecx,2
|
|||
|
add eax,ecx
|
|||
|
add eax,mouseunder
|
|||
|
mov ecx,[eax]
|
|||
|
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
|
|||
|
;;;push edi
|
|||
|
mov edi,1 ;force
|
|||
|
call [putpixel]
|
|||
|
;;;pop edi
|
|||
|
|
|||
|
pop edx
|
|||
|
pop ecx
|
|||
|
|
|||
|
inc ecx
|
|||
|
cmp ecx, 16
|
|||
|
jnz mres
|
|||
|
xor ecx, ecx
|
|||
|
inc edx
|
|||
|
cmp edx, 24
|
|||
|
jnz mres
|
|||
|
;sti ; !!!****
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
; sti
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
save_draw_mouse:
|
|||
|
|
|||
|
; save & draw
|
|||
|
; cli
|
|||
|
|
|||
|
mov [0xfb4a],ax
|
|||
|
mov [0xfb4c],bx
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov ecx,0
|
|||
|
mov edx,0
|
|||
|
|
|||
|
;cli ; !!!****
|
|||
|
|
|||
|
drm:
|
|||
|
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
push ecx
|
|||
|
push edx
|
|||
|
|
|||
|
; helloworld
|
|||
|
push eax ebx ecx
|
|||
|
add eax,ecx ; save picture under mouse
|
|||
|
add ebx,edx
|
|||
|
push ecx
|
|||
|
call getpixel
|
|||
|
mov [0xfb30],ecx
|
|||
|
pop ecx
|
|||
|
mov eax,edx
|
|||
|
shl eax,6
|
|||
|
shl ecx,2
|
|||
|
add eax,ecx
|
|||
|
add eax,mouseunder
|
|||
|
mov ebx,[0xfb30]
|
|||
|
mov [eax],ebx
|
|||
|
pop ecx ebx eax
|
|||
|
|
|||
|
mov edi,edx ; y cycle
|
|||
|
shl edi,4 ; *16 bytes per row
|
|||
|
add edi,ecx ; x cycle
|
|||
|
mov esi, edi
|
|||
|
add edi, esi
|
|||
|
add edi, esi ; *3
|
|||
|
add edi,[0xf200] ; we have our str address
|
|||
|
mov esi, edi
|
|||
|
add esi, 16*24*3
|
|||
|
push ecx
|
|||
|
mov ecx, [0xfb30]
|
|||
|
call combine_colors
|
|||
|
mov [0xfb10], ecx
|
|||
|
pop ecx
|
|||
|
|
|||
|
|
|||
|
pop edx
|
|||
|
pop ecx
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
|
|||
|
add eax,ecx ; we have x coord+cycle
|
|||
|
add ebx,edx ; and y coord+cycle
|
|||
|
|
|||
|
push ecx edi
|
|||
|
mov ecx, [0xfb10]
|
|||
|
mov edi, 1
|
|||
|
call [putpixel]
|
|||
|
pop edi ecx
|
|||
|
|
|||
|
mnext:
|
|||
|
|
|||
|
mov ebx,[esp+0] ; pure y coord again
|
|||
|
mov eax,[esp+4] ; and x
|
|||
|
|
|||
|
inc ecx ; +1 cycle
|
|||
|
cmp ecx,16 ; if more than 16
|
|||
|
jnz drm
|
|||
|
xor ecx, ecx
|
|||
|
inc edx
|
|||
|
cmp edx,24
|
|||
|
jnz drm
|
|||
|
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
|
|||
|
; sti ; !!!****
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
combine_colors:
|
|||
|
|
|||
|
; in
|
|||
|
; ecx - color ( 00 RR GG BB )
|
|||
|
; edi - ref to new color byte
|
|||
|
; esi - ref to alpha byte
|
|||
|
;
|
|||
|
; out
|
|||
|
; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) )
|
|||
|
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
push edx
|
|||
|
push ecx
|
|||
|
xor ecx, ecx
|
|||
|
; byte 2
|
|||
|
mov eax, 0xff
|
|||
|
sub al, [esi+0]
|
|||
|
mov ebx, [esp]
|
|||
|
shr ebx, 16
|
|||
|
and ebx, 0xff
|
|||
|
mul ebx
|
|||
|
shr eax, 8
|
|||
|
add ecx, eax
|
|||
|
; xor eax, eax
|
|||
|
; xor ebx, ebx
|
|||
|
; mov al, [edi+0]
|
|||
|
; mov bl, [esi+0]
|
|||
|
movzx eax, byte [edi+0]
|
|||
|
movzx ebx, byte [esi+0]
|
|||
|
mul ebx
|
|||
|
shr eax, 8
|
|||
|
add ecx, eax
|
|||
|
shl ecx, 8
|
|||
|
; byte 1
|
|||
|
mov eax, 0xff
|
|||
|
sub al, [esi+1]
|
|||
|
mov ebx, [esp]
|
|||
|
shr ebx, 8
|
|||
|
and ebx, 0xff
|
|||
|
mul ebx
|
|||
|
shr eax, 8
|
|||
|
add ecx, eax
|
|||
|
; xor eax, eax
|
|||
|
; xor ebx, ebx
|
|||
|
; mov al, [edi+1]
|
|||
|
; mov bl, [esi+1]
|
|||
|
movzx eax, byte [edi+1]
|
|||
|
movzx ebx, byte [esi+1]
|
|||
|
mul ebx
|
|||
|
shr eax, 8
|
|||
|
add ecx, eax
|
|||
|
shl ecx, 8
|
|||
|
; byte 2
|
|||
|
mov eax, 0xff
|
|||
|
sub al, [esi+2]
|
|||
|
mov ebx, [esp]
|
|||
|
and ebx, 0xff
|
|||
|
mul ebx
|
|||
|
shr eax, 8
|
|||
|
add ecx, eax
|
|||
|
; xor eax, eax
|
|||
|
; xor ebx, ebx
|
|||
|
; mov al, [edi+2]
|
|||
|
; mov bl, [esi+2]
|
|||
|
movzx eax, byte [edi+2]
|
|||
|
movzx ebx, byte [esi+2]
|
|||
|
mul ebx
|
|||
|
shr eax, 8
|
|||
|
add ecx, eax
|
|||
|
|
|||
|
pop eax
|
|||
|
pop edx
|
|||
|
pop ebx
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
__sys_disable_mouse:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp [0x3000],dword 1
|
|||
|
je disable_m
|
|||
|
|
|||
|
mov edx,[0x3000]
|
|||
|
shl edx,5
|
|||
|
add edx,window_data
|
|||
|
|
|||
|
movzx eax, word [0xfb0a]
|
|||
|
movzx ebx, word [0xfb0c]
|
|||
|
|
|||
|
mov ecx,[0xfe00]
|
|||
|
inc ecx
|
|||
|
imul ecx,ebx
|
|||
|
add ecx,eax
|
|||
|
add ecx, display_data
|
|||
|
|
|||
|
movzx eax, byte [edx+twdw+0xe]
|
|||
|
|
|||
|
movzx ebx, byte [ecx]
|
|||
|
cmp eax,ebx
|
|||
|
je yes_mouse_disable
|
|||
|
movzx ebx, byte [ecx+16]
|
|||
|
cmp eax,ebx
|
|||
|
je yes_mouse_disable
|
|||
|
|
|||
|
mov ebx,[0xfe00]
|
|||
|
inc ebx
|
|||
|
imul ebx,10
|
|||
|
add ecx,ebx
|
|||
|
|
|||
|
movzx ebx, byte [ecx]
|
|||
|
cmp eax,ebx
|
|||
|
je yes_mouse_disable
|
|||
|
|
|||
|
mov ebx,[0xfe00]
|
|||
|
inc ebx
|
|||
|
imul ebx,10
|
|||
|
add ecx,ebx
|
|||
|
|
|||
|
movzx ebx, byte [ecx]
|
|||
|
cmp eax,ebx
|
|||
|
je yes_mouse_disable
|
|||
|
movzx ebx, byte [ecx+16]
|
|||
|
cmp eax,ebx
|
|||
|
je yes_mouse_disable
|
|||
|
|
|||
|
jmp no_mouse_disable
|
|||
|
|
|||
|
yes_mouse_disable:
|
|||
|
|
|||
|
mov edx,[0x3000]
|
|||
|
shl edx,5
|
|||
|
add edx,window_data
|
|||
|
|
|||
|
movzx eax, word [0xfb0a]
|
|||
|
movzx ebx, word [0xfb0c]
|
|||
|
|
|||
|
mov ecx,[edx+0] ; mouse inside the area ?
|
|||
|
add eax,14
|
|||
|
cmp eax,ecx
|
|||
|
jb no_mouse_disable
|
|||
|
sub eax,14
|
|||
|
|
|||
|
add ecx,[edx+8]
|
|||
|
cmp eax,ecx
|
|||
|
jg no_mouse_disable
|
|||
|
|
|||
|
mov ecx,[edx+4]
|
|||
|
add ebx,20
|
|||
|
cmp ebx,ecx
|
|||
|
jb no_mouse_disable
|
|||
|
sub ebx,20
|
|||
|
|
|||
|
add ecx,[edx+12]
|
|||
|
cmp ebx,ecx
|
|||
|
jg no_mouse_disable
|
|||
|
|
|||
|
disable_m:
|
|||
|
|
|||
|
cmp dword [0xf204],dword 0
|
|||
|
jne @f
|
|||
|
call draw_mouse_under
|
|||
|
@@:
|
|||
|
|
|||
|
mov [0xf204],dword 1
|
|||
|
|
|||
|
no_mouse_disable:
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
__sys_draw_pointer:
|
|||
|
cli
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp dword [0xf204],dword 0 ; mouse visible ?
|
|||
|
je chms00
|
|||
|
|
|||
|
dec dword [0xf204]
|
|||
|
|
|||
|
cmp [0xf204],dword 0
|
|||
|
jnz nodmu2
|
|||
|
|
|||
|
movzx ebx,word [0xfb0c]
|
|||
|
movzx eax,word [0xfb0a]
|
|||
|
call save_draw_mouse
|
|||
|
|
|||
|
popad
|
|||
|
sti
|
|||
|
ret
|
|||
|
|
|||
|
nodmu2:
|
|||
|
|
|||
|
popad
|
|||
|
sti
|
|||
|
ret
|
|||
|
|
|||
|
chms00:
|
|||
|
|
|||
|
; popad
|
|||
|
|
|||
|
; pushad
|
|||
|
|
|||
|
; cmp [0xf204],dword 0
|
|||
|
; jne nodmp
|
|||
|
|
|||
|
movzx ecx,word [0xfb4a]
|
|||
|
movzx edx,word [0xfb4c]
|
|||
|
|
|||
|
movzx ebx,word [0xfb0c]
|
|||
|
movzx eax,word [0xfb0a]
|
|||
|
|
|||
|
cmp eax,ecx
|
|||
|
jne redrawmouse
|
|||
|
|
|||
|
cmp ebx,edx
|
|||
|
jne redrawmouse
|
|||
|
|
|||
|
jmp nodmp
|
|||
|
|
|||
|
redrawmouse:
|
|||
|
|
|||
|
|
|||
|
call draw_mouse_under
|
|||
|
redrawmouse_1:
|
|||
|
call save_draw_mouse
|
|||
|
|
|||
|
nodmp:
|
|||
|
|
|||
|
popad
|
|||
|
sti
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
calculatebackground: ; background
|
|||
|
|
|||
|
; all black
|
|||
|
|
|||
|
mov [display_data-8],dword 4 ; size x
|
|||
|
mov [display_data-4],dword 2 ; size y
|
|||
|
|
|||
|
mov edi, 0x300000 ; set background to black
|
|||
|
xor eax, eax
|
|||
|
mov ecx, 0x0fff00 / 4
|
|||
|
cld
|
|||
|
rep stosd
|
|||
|
|
|||
|
mov edi,display_data ; set os to use all pixels
|
|||
|
mov eax,0x01010101
|
|||
|
mov ecx,0x1fff00 / 4
|
|||
|
rep stosd
|
|||
|
|
|||
|
mov byte [0xFFF0], 0 ; do not draw background!
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
imax dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
|
|||
|
delay_ms: ; delay in 1/1000 sec
|
|||
|
|
|||
|
|
|||
|
push eax
|
|||
|
push ecx
|
|||
|
|
|||
|
mov ecx,esi
|
|||
|
; <CPU clock fix by Sergey Kuzmin aka Wildwest>
|
|||
|
imul ecx, 33941
|
|||
|
shr ecx, 9
|
|||
|
; </CPU clock fix>
|
|||
|
|
|||
|
in al,0x61
|
|||
|
and al,0x10
|
|||
|
mov ah,al
|
|||
|
cld
|
|||
|
|
|||
|
cnt1: in al,0x61
|
|||
|
and al,0x10
|
|||
|
cmp al,ah
|
|||
|
jz cnt1
|
|||
|
|
|||
|
mov ah,al
|
|||
|
loop cnt1
|
|||
|
|
|||
|
pop ecx
|
|||
|
pop eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
set_app_param:
|
|||
|
push edi
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
mov [edi],eax
|
|||
|
|
|||
|
pop edi
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
delay_hs: ; delay in 1/100 secs
|
|||
|
push eax
|
|||
|
push ecx
|
|||
|
push edx
|
|||
|
|
|||
|
mov edx,[timer_ticks];[0xfdf0]
|
|||
|
add edx,eax
|
|||
|
|
|||
|
newtic:
|
|||
|
mov ecx,[timer_ticks];[0xfdf0]
|
|||
|
cmp edx,ecx
|
|||
|
jbe zerodelay
|
|||
|
|
|||
|
call change_task
|
|||
|
|
|||
|
jmp newtic
|
|||
|
|
|||
|
zerodelay:
|
|||
|
pop edx
|
|||
|
pop ecx
|
|||
|
pop eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
memmove: ; memory move in bytes
|
|||
|
|
|||
|
; eax = from
|
|||
|
; ebx = to
|
|||
|
; ecx = no of bytes
|
|||
|
test ecx, ecx
|
|||
|
jle .ret
|
|||
|
|
|||
|
|
|||
|
push esi edi ecx
|
|||
|
|
|||
|
mov edi, ebx
|
|||
|
mov esi, eax
|
|||
|
|
|||
|
test ecx, not 11b
|
|||
|
jz @f
|
|||
|
|
|||
|
push ecx
|
|||
|
shr ecx, 2
|
|||
|
rep movsd
|
|||
|
pop ecx
|
|||
|
and ecx, 11b
|
|||
|
jz .finish
|
|||
|
@@:
|
|||
|
rep movsb
|
|||
|
|
|||
|
.finish:
|
|||
|
pop ecx edi esi
|
|||
|
.ret:
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
; calculate fat chain
|
|||
|
|
|||
|
calculatefatchain:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov esi,0x100000+512
|
|||
|
mov edi,0x280000
|
|||
|
|
|||
|
fcnew:
|
|||
|
xor eax,eax
|
|||
|
xor ebx,ebx
|
|||
|
xor ecx,ecx
|
|||
|
xor edx,edx
|
|||
|
mov al,[esi+0] ; 1
|
|||
|
mov bl,[esi+1]
|
|||
|
and ebx,15
|
|||
|
shl ebx,8
|
|||
|
add eax,ebx
|
|||
|
mov [edi],ax
|
|||
|
add edi,2
|
|||
|
|
|||
|
xor eax,eax
|
|||
|
xor ebx,ebx
|
|||
|
xor ecx,ecx
|
|||
|
xor edx,edx
|
|||
|
mov bl,[esi+1] ; 2
|
|||
|
mov cl,[esi+2]
|
|||
|
shr ebx,4
|
|||
|
shl ecx,4
|
|||
|
add ecx,ebx
|
|||
|
mov [edi],cx
|
|||
|
add edi,2
|
|||
|
|
|||
|
add esi,3
|
|||
|
|
|||
|
cmp edi,0x280000+4100*4
|
|||
|
jnz fcnew
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
restorefatchain: ; restore fat chain
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov esi,0x280000
|
|||
|
mov edi,0x100000+512
|
|||
|
|
|||
|
fcnew2:
|
|||
|
cld
|
|||
|
xor eax,eax
|
|||
|
xor ebx,ebx
|
|||
|
xor ecx,ecx ; esi XXXXxxxxxxxx yyyyyyyyYYYY
|
|||
|
xor edx,edx
|
|||
|
mov ax,[esi] ; edi xxxxxxxx YYYYXXXX yyyyyyyy
|
|||
|
mov bx,ax
|
|||
|
shr bx,8
|
|||
|
and ebx,15
|
|||
|
mov [edi+0],al ; 1 -> 1 & 2
|
|||
|
mov [edi+1],bl
|
|||
|
add esi,2
|
|||
|
|
|||
|
xor eax,eax
|
|||
|
xor ebx,ebx
|
|||
|
xor ecx,ecx
|
|||
|
xor edx,edx
|
|||
|
mov bx,[esi]
|
|||
|
mov cx,bx
|
|||
|
shr ecx,4
|
|||
|
mov [edi+2],cl
|
|||
|
and ebx,15
|
|||
|
shl ebx,4
|
|||
|
mov edx,[edi+1]
|
|||
|
add edx,ebx
|
|||
|
mov [edi+1],dl ; 2 -> 2 & 3
|
|||
|
add esi,2
|
|||
|
|
|||
|
add edi,3
|
|||
|
|
|||
|
cmp edi,0x100000+512+0x1200
|
|||
|
jb fcnew2
|
|||
|
|
|||
|
mov esi,0x100000+512 ; duplicate fat chain
|
|||
|
mov edi,0x100000+512+0x1200
|
|||
|
mov ecx,0x1200/4
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
read_floppy_file:
|
|||
|
|
|||
|
; as input
|
|||
|
;
|
|||
|
; eax pointer to file
|
|||
|
; ebx file lenght
|
|||
|
; ecx start 512 byte block number
|
|||
|
; edx number of blocks to read
|
|||
|
; esi pointer to return/work area (atleast 20 000 bytes)
|
|||
|
;
|
|||
|
;
|
|||
|
; on return
|
|||
|
;
|
|||
|
; eax = 0 command succesful
|
|||
|
; 1 no fd base and/or partition defined
|
|||
|
; 2 yet unsupported FS
|
|||
|
; 3 unknown FS
|
|||
|
; 4 partition not defined at hd
|
|||
|
; 5 file not found
|
|||
|
; ebx = size of file
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add esi,[edi]
|
|||
|
add eax,[edi]
|
|||
|
|
|||
|
pushad
|
|||
|
mov edi,esi
|
|||
|
add edi,1024
|
|||
|
mov esi,0x100000+19*512
|
|||
|
sub ecx,1
|
|||
|
shl ecx,9
|
|||
|
add esi,ecx
|
|||
|
shl edx,9
|
|||
|
mov ecx,edx
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
popad
|
|||
|
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+24],ebx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_programirq:
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
|
|||
|
mov edx,ebx
|
|||
|
shl edx,2
|
|||
|
add edx,irq_owner
|
|||
|
mov edx,[edx]
|
|||
|
mov edi,[0x3010]
|
|||
|
mov edi,[edi+0x4]
|
|||
|
cmp edx,edi
|
|||
|
je spril1
|
|||
|
mov [esp+36],dword 1
|
|||
|
ret
|
|||
|
spril1:
|
|||
|
|
|||
|
mov esi,eax
|
|||
|
shl ebx,6
|
|||
|
add ebx,irq00read
|
|||
|
mov edi,ebx
|
|||
|
mov ecx,16
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
get_irq_data:
|
|||
|
|
|||
|
mov edx,eax ; check for correct owner
|
|||
|
shl edx,2
|
|||
|
add edx,irq_owner
|
|||
|
mov edx,[edx]
|
|||
|
mov edi,[0x3010]
|
|||
|
mov edi,[edi+0x4]
|
|||
|
cmp edx,edi
|
|||
|
je gidril1
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+32],dword 2
|
|||
|
mov [esp+24],ebx
|
|||
|
ret
|
|||
|
|
|||
|
gidril1:
|
|||
|
|
|||
|
mov ebx,eax
|
|||
|
shl ebx,12
|
|||
|
add ebx,0x2e0000
|
|||
|
mov eax,[ebx]
|
|||
|
mov ecx,1
|
|||
|
test eax,eax
|
|||
|
jz gid1
|
|||
|
|
|||
|
dec eax
|
|||
|
mov esi,ebx
|
|||
|
mov [ebx],eax
|
|||
|
movzx ebx,byte [ebx+0x10]
|
|||
|
add esi,0x10
|
|||
|
mov edi,esi
|
|||
|
inc esi
|
|||
|
mov ecx,4000 / 4
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
xor ecx,ecx
|
|||
|
gid1:
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+32],ecx
|
|||
|
mov [esp+24],ebx
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
set_io_access_rights:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov edi,[0x3000]
|
|||
|
imul edi,tss_step
|
|||
|
add edi,tss_data+128
|
|||
|
; add edi,128
|
|||
|
|
|||
|
mov ecx,eax
|
|||
|
and ecx,7 ; offset in byte
|
|||
|
|
|||
|
shr eax,3 ; number of byte
|
|||
|
add edi,eax
|
|||
|
|
|||
|
mov ebx,1
|
|||
|
shl ebx,cl
|
|||
|
|
|||
|
cmp ebp,0 ; enable access - ebp = 0
|
|||
|
jne siar1
|
|||
|
|
|||
|
not ebx
|
|||
|
and [edi],byte bl
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
siar1:
|
|||
|
|
|||
|
or [edi],byte bl ; disable access - ebp = 1
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
r_f_port_area:
|
|||
|
|
|||
|
test eax, eax
|
|||
|
jnz free_port_area
|
|||
|
; je r_port_area
|
|||
|
; jmp free_port_area
|
|||
|
|
|||
|
; r_port_area:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp ebx,ecx ; beginning > end ?
|
|||
|
jg rpal1
|
|||
|
mov esi,[0x2d0000]
|
|||
|
cmp esi,0 ; no reserved areas ?
|
|||
|
je rpal2
|
|||
|
cmp esi,255 ; max reserved
|
|||
|
jge rpal1
|
|||
|
rpal3:
|
|||
|
mov edi,esi
|
|||
|
shl edi,4
|
|||
|
add edi,0x2d0000
|
|||
|
cmp ebx,[edi+8]
|
|||
|
jg rpal4
|
|||
|
cmp ecx,[edi+4]
|
|||
|
jae rpal1
|
|||
|
; jb rpal4
|
|||
|
; jmp rpal1
|
|||
|
rpal4:
|
|||
|
|
|||
|
dec esi
|
|||
|
jnz rpal3
|
|||
|
jmp rpal2
|
|||
|
rpal1:
|
|||
|
popad
|
|||
|
mov eax,1
|
|||
|
ret
|
|||
|
|
|||
|
rpal2:
|
|||
|
popad
|
|||
|
|
|||
|
|
|||
|
; enable port access at port IO map
|
|||
|
cli
|
|||
|
pushad ; start enable io map
|
|||
|
|
|||
|
cmp ecx,65536 ;16384
|
|||
|
jae no_unmask_io ; jge
|
|||
|
|
|||
|
mov eax,ebx
|
|||
|
|
|||
|
new_port_access:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov ebp,0 ; enable - eax = port
|
|||
|
call set_io_access_rights
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
inc eax
|
|||
|
cmp eax,ecx
|
|||
|
jbe new_port_access
|
|||
|
|
|||
|
no_unmask_io:
|
|||
|
|
|||
|
popad ; end enable io map
|
|||
|
sti
|
|||
|
|
|||
|
mov edi,[0x2d0000]
|
|||
|
add edi,1
|
|||
|
mov [0x2d0000],edi
|
|||
|
shl edi,4
|
|||
|
add edi,0x2d0000
|
|||
|
mov esi,[0x3010]
|
|||
|
mov esi,[esi+0x4]
|
|||
|
mov [edi],esi
|
|||
|
mov [edi+4],ebx
|
|||
|
mov [edi+8],ecx
|
|||
|
|
|||
|
xor eax, eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
free_port_area:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov esi,[0x2d0000] ; no reserved areas ?
|
|||
|
cmp esi,0
|
|||
|
je frpal2
|
|||
|
mov edx,[0x3010]
|
|||
|
mov edx,[edx+4]
|
|||
|
frpal3:
|
|||
|
mov edi,esi
|
|||
|
shl edi,4
|
|||
|
add edi,0x2d0000
|
|||
|
cmp edx,[edi]
|
|||
|
jne frpal4
|
|||
|
cmp ebx,[edi+4]
|
|||
|
jne frpal4
|
|||
|
cmp ecx,[edi+8]
|
|||
|
jne frpal4
|
|||
|
jmp frpal1
|
|||
|
frpal4:
|
|||
|
dec esi
|
|||
|
jnz frpal3
|
|||
|
frpal2:
|
|||
|
popad
|
|||
|
mov eax,1
|
|||
|
ret
|
|||
|
frpal1:
|
|||
|
mov ecx,256
|
|||
|
sub ecx,esi
|
|||
|
shl ecx,4
|
|||
|
mov esi,edi
|
|||
|
add esi,16
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
dec dword [0x2d0000]
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
|
|||
|
; disable port access at port IO map
|
|||
|
|
|||
|
pushad ; start disable io map
|
|||
|
|
|||
|
cmp ecx,65536 ;16384
|
|||
|
jge no_mask_io
|
|||
|
|
|||
|
mov eax,ebx
|
|||
|
|
|||
|
new_port_access_disable:
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov ebp,1 ; disable - eax = port
|
|||
|
call set_io_access_rights
|
|||
|
|
|||
|
popad
|
|||
|
|
|||
|
inc eax
|
|||
|
cmp eax,ecx
|
|||
|
jbe new_port_access_disable
|
|||
|
|
|||
|
no_mask_io:
|
|||
|
|
|||
|
popad ; end disable io map
|
|||
|
|
|||
|
xor eax, eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
reserve_free_irq:
|
|||
|
|
|||
|
cmp eax,0
|
|||
|
jz reserve_irq
|
|||
|
|
|||
|
mov edi,ebx
|
|||
|
shl edi,2
|
|||
|
add edi,irq_owner
|
|||
|
mov edx,[edi]
|
|||
|
mov eax,[0x3010]
|
|||
|
mov eax,[eax+0x4]
|
|||
|
mov ecx,1
|
|||
|
cmp edx,eax
|
|||
|
jne fril1
|
|||
|
mov [edi],dword 0
|
|||
|
mov ecx,0
|
|||
|
fril1:
|
|||
|
mov [esp+36],ecx ; return in eax
|
|||
|
ret
|
|||
|
|
|||
|
reserve_irq:
|
|||
|
|
|||
|
mov edi,ebx
|
|||
|
shl edi,2
|
|||
|
add edi,irq_owner
|
|||
|
mov edx,[edi]
|
|||
|
mov ecx,1
|
|||
|
cmp edx,0
|
|||
|
jne ril1
|
|||
|
|
|||
|
mov edx,[0x3010]
|
|||
|
mov edx,[edx+0x4]
|
|||
|
mov [edi],edx
|
|||
|
mov ecx,0
|
|||
|
|
|||
|
ril1:
|
|||
|
|
|||
|
mov [esp+36],ecx ; return in eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
drawbackground:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0x12
|
|||
|
jne dbrv12
|
|||
|
cmp [display_data-12],dword 1
|
|||
|
jne bgrstr12
|
|||
|
call vga_drawbackground_tiled
|
|||
|
ret
|
|||
|
bgrstr12:
|
|||
|
call vga_drawbackground_stretch
|
|||
|
ret
|
|||
|
dbrv12:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0100000000000000b
|
|||
|
jge dbrv20
|
|||
|
cmp [0xfe0c],word 0x13
|
|||
|
je dbrv20
|
|||
|
call vesa12_drawbackground
|
|||
|
ret
|
|||
|
dbrv20:
|
|||
|
cmp [display_data-12],dword 1
|
|||
|
jne bgrstr
|
|||
|
call vesa20_drawbackground_tiled
|
|||
|
ret
|
|||
|
bgrstr:
|
|||
|
call vesa20_drawbackground_stretch
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_putimage:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0x12
|
|||
|
jne spiv20
|
|||
|
call vga_putimage
|
|||
|
ret
|
|||
|
spiv20:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0100000000000000b
|
|||
|
jge piv20
|
|||
|
cmp [0xfe0c],word 0x13
|
|||
|
je piv20
|
|||
|
call vesa12_putimage
|
|||
|
ret
|
|||
|
piv20:
|
|||
|
call vesa20_putimage
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
; eax x beginning
|
|||
|
; ebx y beginning
|
|||
|
; ecx x end
|
|||
|
; edx y end
|
|||
|
; edi color
|
|||
|
|
|||
|
__sys_drawbar:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0x12
|
|||
|
jne sdbv20
|
|||
|
call vga_drawbar
|
|||
|
ret
|
|||
|
sdbv20:
|
|||
|
|
|||
|
cmp [0xfe0c],word 0100000000000000b
|
|||
|
jge dbv20
|
|||
|
cmp [0xfe0c],word 0x13
|
|||
|
je dbv20
|
|||
|
call vesa12_drawbar
|
|||
|
ret
|
|||
|
|
|||
|
dbv20:
|
|||
|
|
|||
|
call vesa20_drawbar
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
kb_read:
|
|||
|
|
|||
|
push ecx edx
|
|||
|
|
|||
|
mov ecx,0xffff
|
|||
|
kr_loop:
|
|||
|
in al,0x64
|
|||
|
test al,1
|
|||
|
jnz kr_ready
|
|||
|
loop kr_loop
|
|||
|
mov ah,1
|
|||
|
jmp kr_exit
|
|||
|
kr_ready:
|
|||
|
push ecx
|
|||
|
mov ecx,32
|
|||
|
kr_delay:
|
|||
|
loop kr_delay
|
|||
|
pop ecx
|
|||
|
in al,0x60
|
|||
|
xor ah,ah
|
|||
|
kr_exit:
|
|||
|
|
|||
|
pop edx ecx
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
kb_write:
|
|||
|
|
|||
|
push ecx edx
|
|||
|
|
|||
|
mov dl,al
|
|||
|
mov ecx,0xffff
|
|||
|
kw_loop1:
|
|||
|
in al,0x64
|
|||
|
test al,0x20
|
|||
|
jz kw_ok1
|
|||
|
loop kw_loop1
|
|||
|
mov ah,1
|
|||
|
jmp kw_exit
|
|||
|
kw_ok1:
|
|||
|
in al,0x60
|
|||
|
mov ecx,0xffff
|
|||
|
kw_loop:
|
|||
|
in al,0x64
|
|||
|
test al,2
|
|||
|
jz kw_ok
|
|||
|
loop kw_loop
|
|||
|
mov ah,1
|
|||
|
jmp kw_exit
|
|||
|
kw_ok:
|
|||
|
mov al,dl
|
|||
|
out 0x60,al
|
|||
|
mov ecx,0xffff
|
|||
|
kw_loop3:
|
|||
|
in al,0x64
|
|||
|
test al,2
|
|||
|
jz kw_ok3
|
|||
|
loop kw_loop3
|
|||
|
mov ah,1
|
|||
|
jmp kw_exit
|
|||
|
kw_ok3:
|
|||
|
mov ah,8
|
|||
|
kw_loop4:
|
|||
|
mov ecx,0xffff
|
|||
|
kw_loop5:
|
|||
|
in al,0x64
|
|||
|
test al,1
|
|||
|
jnz kw_ok4
|
|||
|
loop kw_loop5
|
|||
|
dec ah
|
|||
|
jnz kw_loop4
|
|||
|
kw_ok4:
|
|||
|
xor ah,ah
|
|||
|
kw_exit:
|
|||
|
|
|||
|
pop edx ecx
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
kb_cmd:
|
|||
|
|
|||
|
mov ecx,0xffff
|
|||
|
c_wait:
|
|||
|
in al,0x64
|
|||
|
test al,2
|
|||
|
jz c_send
|
|||
|
loop c_wait
|
|||
|
jmp c_error
|
|||
|
c_send:
|
|||
|
mov al,bl
|
|||
|
out 0x64,al
|
|||
|
mov ecx,0xffff
|
|||
|
c_accept:
|
|||
|
in al,0x64
|
|||
|
test al,2
|
|||
|
jz c_ok
|
|||
|
loop c_accept
|
|||
|
c_error:
|
|||
|
mov ah,1
|
|||
|
jmp c_exit
|
|||
|
c_ok:
|
|||
|
xor ah,ah
|
|||
|
c_exit:
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
setmouse: ; set mousepicture -pointer
|
|||
|
; ps2 mouse enable
|
|||
|
|
|||
|
mov [0xf200],dword mousepointer
|
|||
|
|
|||
|
cli
|
|||
|
mov bl,0xa8 ; enable mouse cmd
|
|||
|
call kb_cmd
|
|||
|
call kb_read ; read status
|
|||
|
|
|||
|
mov bl,0x20 ; get command byte
|
|||
|
call kb_cmd
|
|||
|
call kb_read
|
|||
|
or al,3 ; enable interrupt
|
|||
|
mov bl,0x60 ; write command
|
|||
|
push eax
|
|||
|
call kb_cmd
|
|||
|
pop eax
|
|||
|
call kb_write
|
|||
|
|
|||
|
mov bl,0xd4 ; for mouse
|
|||
|
call kb_cmd
|
|||
|
mov al,0xf4 ; enable mouse device
|
|||
|
call kb_write
|
|||
|
call kb_read ; read status return
|
|||
|
|
|||
|
; com1 mouse enable
|
|||
|
|
|||
|
mov bx,0x3f8 ; combase
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,3
|
|||
|
mov al,0x80
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,1
|
|||
|
mov al,0
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,0
|
|||
|
mov al,0x30*2 ; 0x30 / 4
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,3
|
|||
|
mov al,2 ; 3
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,4
|
|||
|
mov al,0xb
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,1
|
|||
|
mov al,1
|
|||
|
out dx,al
|
|||
|
|
|||
|
|
|||
|
; com2 mouse enable
|
|||
|
|
|||
|
mov bx,0x2f8 ; combase
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,3
|
|||
|
mov al,0x80
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,1
|
|||
|
mov al,0
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,0
|
|||
|
mov al,0x30*2
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,3
|
|||
|
mov al,2
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,4
|
|||
|
mov al,0xb
|
|||
|
out dx,al
|
|||
|
|
|||
|
mov dx,bx
|
|||
|
add dx,1
|
|||
|
mov al,1
|
|||
|
out dx,al
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
_rdtsc:
|
|||
|
|
|||
|
mov edx,[cpuid_1+3*4]
|
|||
|
test edx,00010000b
|
|||
|
jz ret_rdtsc
|
|||
|
rdtsc
|
|||
|
ret
|
|||
|
ret_rdtsc:
|
|||
|
mov edx,0xffffffff
|
|||
|
mov eax,0xffffffff
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
rerouteirqs:
|
|||
|
|
|||
|
cli
|
|||
|
|
|||
|
mov al,0x11 ; icw4, edge triggered
|
|||
|
out 0x20,al
|
|||
|
call pic_delay
|
|||
|
out 0xA0,al
|
|||
|
call pic_delay
|
|||
|
|
|||
|
mov al,0x20 ; generate 0x20 +
|
|||
|
out 0x21,al
|
|||
|
call pic_delay
|
|||
|
mov al,0x28 ; generate 0x28 +
|
|||
|
out 0xA1,al
|
|||
|
call pic_delay
|
|||
|
|
|||
|
mov al,0x04 ; slave at irq2
|
|||
|
out 0x21,al
|
|||
|
call pic_delay
|
|||
|
mov al,0x02 ; at irq9
|
|||
|
out 0xA1,al
|
|||
|
call pic_delay
|
|||
|
|
|||
|
mov al,0x01 ; 8086 mode
|
|||
|
out 0x21,al
|
|||
|
call pic_delay
|
|||
|
out 0xA1,al
|
|||
|
call pic_delay
|
|||
|
|
|||
|
mov al,255 ; mask all irq's
|
|||
|
out 0xA1,al
|
|||
|
call pic_delay
|
|||
|
out 0x21,al
|
|||
|
call pic_delay
|
|||
|
|
|||
|
mov ecx,0x1000
|
|||
|
cld
|
|||
|
picl1: call pic_delay
|
|||
|
loop picl1
|
|||
|
|
|||
|
mov al,255 ; mask all irq's
|
|||
|
out 0xA1,al
|
|||
|
call pic_delay
|
|||
|
out 0x21,al
|
|||
|
call pic_delay
|
|||
|
|
|||
|
cli
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
pic_delay:
|
|||
|
|
|||
|
jmp pdl1
|
|||
|
pdl1: ret
|
|||
|
|
|||
|
|
|||
|
sys_msg_board_str:
|
|||
|
|
|||
|
pushad
|
|||
|
@@:
|
|||
|
cmp [esi],byte 0
|
|||
|
je @f
|
|||
|
mov eax,1
|
|||
|
movzx ebx,byte [esi]
|
|||
|
call sys_msg_board
|
|||
|
inc esi
|
|||
|
jmp @b
|
|||
|
@@:
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
uglobal
|
|||
|
msg_board_data: times 512 db 0
|
|||
|
msg_board_count dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
sys_msg_board:
|
|||
|
|
|||
|
; eax=1 : write : bl byte to write
|
|||
|
; eax=2 : read : ebx=0 -> no data, ebx=1 -> data in al
|
|||
|
|
|||
|
mov ecx,[msg_board_count]
|
|||
|
cmp eax, 1
|
|||
|
jne smbl1
|
|||
|
|
|||
|
|
|||
|
mov [msg_board_data+ecx],bl
|
|||
|
inc ecx
|
|||
|
and ecx, 511
|
|||
|
mov [msg_board_count], ecx
|
|||
|
mov [check_idle_semaphore], 5
|
|||
|
ret
|
|||
|
smbl1:
|
|||
|
|
|||
|
cmp eax, 2
|
|||
|
jne smbl2
|
|||
|
test ecx, ecx
|
|||
|
jz smbl21
|
|||
|
; mov edi, msg_board_data
|
|||
|
; mov esi, msg_board_data+1
|
|||
|
; movzx eax, byte [edi]
|
|||
|
mov eax, msg_board_data+1
|
|||
|
mov ebx, msg_board_data
|
|||
|
movzx edx, byte [ebx]
|
|||
|
call memmove
|
|||
|
; push ecx
|
|||
|
; shr ecx, 2
|
|||
|
; cld
|
|||
|
; rep movsd
|
|||
|
; pop ecx
|
|||
|
; and ecx, 3
|
|||
|
; rep movsb
|
|||
|
dec [msg_board_count]
|
|||
|
mov [esp+36], edx ;eax
|
|||
|
mov [esp+24], dword 1
|
|||
|
ret
|
|||
|
smbl21:
|
|||
|
mov [esp+36], ecx
|
|||
|
mov [esp+24], ecx
|
|||
|
|
|||
|
smbl2:
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
sys_trace:
|
|||
|
|
|||
|
test eax, eax ; get event data
|
|||
|
jnz no_get_sys_events
|
|||
|
|
|||
|
mov esi,save_syscall_data ; data
|
|||
|
mov edi,[0x3010]
|
|||
|
mov edi,[edi+0x10]
|
|||
|
add edi,ebx
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov [esp+24],dword 0
|
|||
|
mov eax,[save_syscall_count] ; count
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
no_get_sys_events:
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_process_def:
|
|||
|
|
|||
|
cmp eax,1 ; set keyboard mode
|
|||
|
jne no_set_keyboard_setup
|
|||
|
|
|||
|
mov edi,[0x3000]
|
|||
|
shl edi,8
|
|||
|
add edi,0x80000+0xB4
|
|||
|
mov [edi],bl
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
no_set_keyboard_setup:
|
|||
|
|
|||
|
cmp eax,2 ; get keyboard mode
|
|||
|
jne no_get_keyboard_setup
|
|||
|
|
|||
|
mov edi,[0x3000]
|
|||
|
shl edi,8
|
|||
|
add edi,0x80000+0xB4
|
|||
|
movzx eax, byte [edi]
|
|||
|
|
|||
|
mov [esp+36],eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
no_get_keyboard_setup:
|
|||
|
|
|||
|
cmp eax,3 ; get keyboard ctrl, alt, shift
|
|||
|
jne no_get_keyboard_cas
|
|||
|
|
|||
|
; xor eax,eax
|
|||
|
; movzx eax,byte [shift]
|
|||
|
; movzx ebx,byte [ctrl]
|
|||
|
; shl ebx,2
|
|||
|
; add eax,ebx
|
|||
|
; movzx ebx,byte [alt]
|
|||
|
; shl ebx,3
|
|||
|
; add eax,ebx
|
|||
|
|
|||
|
;// mike.dld [
|
|||
|
mov eax, [kb_state]
|
|||
|
;// mike.dld ]
|
|||
|
|
|||
|
mov [esp+36],eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
no_get_keyboard_cas:
|
|||
|
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
sys_ipc:
|
|||
|
cmp eax,1 ; DEFINE IPC MEMORY
|
|||
|
jne no_ipc_def
|
|||
|
mov edi,[0x3000]
|
|||
|
shl edi,8
|
|||
|
add edi,0x80000
|
|||
|
mov [edi+0xA0],ebx
|
|||
|
mov [edi+0xA4],ecx
|
|||
|
mov [esp+36],dword 0
|
|||
|
ret
|
|||
|
no_ipc_def:
|
|||
|
|
|||
|
cmp eax,2 ; SEND IPC MESSAGE
|
|||
|
jne no_ipc_send
|
|||
|
mov esi,1
|
|||
|
mov edi,0x3020
|
|||
|
ipcs1:
|
|||
|
cmp [edi+4],ebx
|
|||
|
je ipcs2
|
|||
|
add edi,0x20
|
|||
|
inc esi
|
|||
|
cmp esi,[0x3004]
|
|||
|
jbe ipcs1
|
|||
|
mov [esp+36],dword 4
|
|||
|
ret
|
|||
|
ipcs2:
|
|||
|
|
|||
|
cli
|
|||
|
|
|||
|
push esi
|
|||
|
mov eax,esi
|
|||
|
shl eax,8
|
|||
|
mov ebx,[eax+0x80000+0xa0]
|
|||
|
test ebx,ebx ; ipc area not defined ?
|
|||
|
je ipc_err1
|
|||
|
|
|||
|
add ebx,[eax+0x80000+0xa4]
|
|||
|
mov eax,esi
|
|||
|
shl eax,5
|
|||
|
add ebx,[eax+0x3000+0x10] ; ebx <- max data position
|
|||
|
|
|||
|
mov eax,esi ; to
|
|||
|
shl esi,8
|
|||
|
add esi,0x80000
|
|||
|
mov edi,[esi+0xa0]
|
|||
|
shl eax,5
|
|||
|
add eax,0x3000
|
|||
|
add edi,[eax+0x10]
|
|||
|
|
|||
|
cmp [edi],byte 0 ; overrun ?
|
|||
|
jne ipc_err2
|
|||
|
|
|||
|
mov ebp,edi
|
|||
|
add edi,[edi+4]
|
|||
|
add edi,8
|
|||
|
|
|||
|
mov esi,ecx ; from
|
|||
|
mov eax,[0x3010]
|
|||
|
mov eax,[eax+0x10]
|
|||
|
add esi,eax
|
|||
|
|
|||
|
mov ecx,edx ; size
|
|||
|
|
|||
|
mov eax,edi
|
|||
|
add eax,ecx
|
|||
|
cmp eax,ebx
|
|||
|
jge ipc_err3 ; not enough room ?
|
|||
|
|
|||
|
push ecx
|
|||
|
|
|||
|
mov eax,[0x3010]
|
|||
|
mov eax,[eax+4]
|
|||
|
mov [edi-8],eax
|
|||
|
mov [edi-4],ecx
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
pop ecx
|
|||
|
add ecx,8
|
|||
|
|
|||
|
mov edi,ebp ; increase memory position
|
|||
|
add dword [edi+4],ecx
|
|||
|
|
|||
|
mov edi,[esp]
|
|||
|
shl edi,8
|
|||
|
or dword [edi+0x80000+0xA8],dword 01000000b ; ipc message
|
|||
|
|
|||
|
cmp [check_idle_semaphore],dword 20
|
|||
|
jge ipc_no_cis
|
|||
|
mov [check_idle_semaphore],5
|
|||
|
ipc_no_cis:
|
|||
|
|
|||
|
xor eax, eax
|
|||
|
|
|||
|
ipc_err:
|
|||
|
add esp,4
|
|||
|
mov [esp+36],eax
|
|||
|
sti
|
|||
|
ret
|
|||
|
|
|||
|
ipc_err1:
|
|||
|
add esp,4
|
|||
|
mov [esp+36],dword 1
|
|||
|
sti
|
|||
|
ret
|
|||
|
ipc_err2:
|
|||
|
add esp,4
|
|||
|
mov [esp+36],dword 2
|
|||
|
sti
|
|||
|
ret
|
|||
|
ipc_err3:
|
|||
|
add esp,4
|
|||
|
mov [esp+36],dword 3
|
|||
|
sti
|
|||
|
ret
|
|||
|
|
|||
|
no_ipc_send:
|
|||
|
|
|||
|
mov [esp+36],dword -1
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
sys_gs: ; direct screen access
|
|||
|
|
|||
|
cmp eax,1 ; resolution
|
|||
|
jne no_gs1
|
|||
|
mov eax,[0xfe00]
|
|||
|
shl eax,16
|
|||
|
mov ax,[0xfe04]
|
|||
|
add eax,0x00010001
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
no_gs1:
|
|||
|
|
|||
|
cmp eax,2 ; bits per pixel
|
|||
|
jne no_gs2
|
|||
|
movzx eax,byte [0xfbf1]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
no_gs2:
|
|||
|
|
|||
|
cmp eax,3 ; bytes per scanline
|
|||
|
jne no_gs3
|
|||
|
mov eax,[0xfe08]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
no_gs3:
|
|||
|
|
|||
|
mov [esp+36],dword -1
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4 ; PCI functions
|
|||
|
|
|||
|
sys_pci:
|
|||
|
|
|||
|
call pci_api
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4 ; system functions
|
|||
|
|
|||
|
syscall_setpixel: ; SetPixel
|
|||
|
|
|||
|
|
|||
|
mov edx,[0x3010]
|
|||
|
add eax,[edx-twdw]
|
|||
|
add ebx,[edx-twdw+4]
|
|||
|
xor edi,edi ; no force
|
|||
|
call [disable_mouse]
|
|||
|
jmp [putpixel]
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_writetext: ; WriteText
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
mov ebp,[edi-twdw]
|
|||
|
shl ebp,16
|
|||
|
add ebp,[edi-twdw+4]
|
|||
|
add edi,0x10
|
|||
|
add ecx,[edi]
|
|||
|
add eax,ebp
|
|||
|
xor edi,edi
|
|||
|
jmp dtext
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_openramdiskfile: ; OpenRamdiskFile
|
|||
|
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
add edx,[edi]
|
|||
|
mov esi,12
|
|||
|
call fileread
|
|||
|
mov [esp+36],ebx
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_putimage: ; PutImage
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
mov edx,ecx
|
|||
|
mov ecx,ebx
|
|||
|
mov ebx,eax
|
|||
|
call sys_putimage
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_drawrect: ; DrawRect
|
|||
|
|
|||
|
mov edi,ecx
|
|||
|
test ax,ax
|
|||
|
je drectr
|
|||
|
test bx,bx
|
|||
|
je drectr
|
|||
|
movzx ecx,ax
|
|||
|
shr eax,16
|
|||
|
movzx edx,bx
|
|||
|
shr ebx,16
|
|||
|
add ecx,eax
|
|||
|
add edx,ebx
|
|||
|
jmp [drawbar]
|
|||
|
drectr:
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_getscreensize: ; GetScreenSize
|
|||
|
|
|||
|
movzx eax,word[0xfe00]
|
|||
|
shl eax,16
|
|||
|
mov ax,[0xfe04]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_system: ; System
|
|||
|
|
|||
|
call sys_system
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_startapp: ; StartApp
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
test ebx,ebx
|
|||
|
jz noapppar
|
|||
|
add ebx,[edi]
|
|||
|
noapppar:
|
|||
|
; call start_application_fl
|
|||
|
call new_start_application_fl
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_cdaudio: ; CD
|
|||
|
|
|||
|
call sys_cd_audio
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_readhd: ; ReadHd
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add esi,[edi]
|
|||
|
add eax,[edi]
|
|||
|
call read_hd_file
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+24],ebx
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_starthdapp: ; StartHdApp
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
add ecx,[edi]
|
|||
|
mov ebp,0
|
|||
|
call start_application_hd
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_delramdiskfile: ; DelRamdiskFile
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
call filedelete
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_writeramdiskfile: ; WriteRamdiskFile
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
add ebx,[edi]
|
|||
|
call filesave
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_getpixel: ; GetPixel
|
|||
|
|
|||
|
mov ecx,[0xfe00]
|
|||
|
inc ecx
|
|||
|
xor edx,edx
|
|||
|
div ecx
|
|||
|
mov ebx,edx
|
|||
|
xchg eax,ebx
|
|||
|
call dword [0xe024]
|
|||
|
mov [esp+36],ecx
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_readstring: ; ReadString
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
call read_string
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_drawline: ; DrawLine
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
movzx edx,word[edi-twdw]
|
|||
|
mov ebp,edx
|
|||
|
shl edx,16
|
|||
|
add ebp,edx
|
|||
|
movzx edx,word[edi-twdw+4]
|
|||
|
add eax,ebp
|
|||
|
mov ebp,edx
|
|||
|
shl edx,16
|
|||
|
xor edi,edi
|
|||
|
add edx,ebp
|
|||
|
add ebx,edx
|
|||
|
jmp [draw_line]
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_getirqowner: ; GetIrqOwner
|
|||
|
|
|||
|
shl eax,2
|
|||
|
add eax,irq_owner
|
|||
|
mov eax,[eax]
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_reserveportarea: ; ReservePortArea and FreePortArea
|
|||
|
|
|||
|
call r_f_port_area
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_appints: ; AppInts
|
|||
|
|
|||
|
test eax,eax
|
|||
|
jnz unknown_app_int_fn
|
|||
|
mov edi,[0x3010]
|
|||
|
mov [edi+draw_data-0x3000+0x1c],ebx
|
|||
|
ret
|
|||
|
unknown_app_int_fn:
|
|||
|
mov [esp+36],dword -1
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
syscall_threads: ; CreateThreads
|
|||
|
|
|||
|
call sys_threads
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
stack_driver_stat:
|
|||
|
|
|||
|
call app_stack_handler ; Stack status
|
|||
|
|
|||
|
; mov [check_idle_semaphore],5 ; enable these for zero delay
|
|||
|
; call change_task ; between sent packet
|
|||
|
|
|||
|
mov [esp+36],eax
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
socket: ; Socket interface
|
|||
|
call app_socket_handler
|
|||
|
|
|||
|
; mov [check_idle_semaphore],5 ; enable these for zero delay
|
|||
|
; call change_task ; between sent packet
|
|||
|
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+24],ebx
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
user_events: ; User event times
|
|||
|
|
|||
|
mov eax,0x12345678
|
|||
|
mov [esp+36],eax
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
read_from_hd: ; Read from hd - fn not in use
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
add ecx,[edi]
|
|||
|
add edx,[edi]
|
|||
|
call file_read
|
|||
|
|
|||
|
mov [esp+36],eax
|
|||
|
mov [esp+24],ebx
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
write_to_hd: ; Write a file to hd
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
add ecx,[edi]
|
|||
|
add edx,[edi]
|
|||
|
call file_write
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
delete_from_hd: ; Delete a file from hd
|
|||
|
|
|||
|
mov edi,[0x3010]
|
|||
|
add edi,0x10
|
|||
|
add eax,[edi]
|
|||
|
add ecx,[edi]
|
|||
|
call file_delete
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
|
|||
|
undefined_syscall: ; Undefined system call
|
|||
|
|
|||
|
mov [esp+36],dword -1
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
;clear_busy_flag_at_caller:
|
|||
|
|
|||
|
; push edi
|
|||
|
|
|||
|
; mov edi,[0x3000] ; restore processes tss pointer in gdt, busyfl?
|
|||
|
; imul edi,8
|
|||
|
; mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
|
|||
|
|
|||
|
; pop edi
|
|||
|
|
|||
|
; ret
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
keymap:
|
|||
|
|
|||
|
db '6',27
|
|||
|
db '1234567890-=',8,9
|
|||
|
db 'qwertyuiop[]',13
|
|||
|
db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 '
|
|||
|
db '@234567890123',180,178,184,'6',176,'7'
|
|||
|
db 179,'8',181,177,183,185,182
|
|||
|
db 'AB<D',255,'FGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
|
|||
|
|
|||
|
keymap_shift:
|
|||
|
|
|||
|
db '6',27
|
|||
|
db '!@#$%^&*()_+',8,9
|
|||
|
db 'QWERTYUIOP{}',13
|
|||
|
db '~ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'45 '
|
|||
|
db '@234567890123',180,178,184,'6',176,'7'
|
|||
|
db 179,'8',181,177,183,185,182
|
|||
|
db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
|
|||
|
|
|||
|
keymap_alt:
|
|||
|
|
|||
|
db ' ',27
|
|||
|
db ' @ $ {[]}\ ',8,9
|
|||
|
db ' ',13
|
|||
|
db ' ',0,' ',0,'4',0,' '
|
|||
|
db ' ',180,178,184,'6',176,'7'
|
|||
|
db 179,'8',181,177,183,185,182
|
|||
|
db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|||
|
|
|||
|
|
|||
|
; device irq owners
|
|||
|
uglobal
|
|||
|
irq_owner: ; process id
|
|||
|
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
|
|||
|
; on irq read ports
|
|||
|
uglobal
|
|||
|
irq00read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq01read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq02read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq03read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq04read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq05read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq06read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq07read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq08read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq09read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq10read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq11read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq12read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq13read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq14read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
irq15read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|||
|
endg
|
|||
|
|
|||
|
; status
|
|||
|
uglobal
|
|||
|
hd1_status dd 0x0 ; 0 - free : other - pid
|
|||
|
application_table_status dd 0x0 ; 0 - free : other - pid
|
|||
|
endg
|
|||
|
|
|||
|
; device addresses
|
|||
|
uglobal
|
|||
|
mididp dd 0x0
|
|||
|
midisp dd 0x0
|
|||
|
|
|||
|
cdbase dd 0x0
|
|||
|
cdid dd 0x0
|
|||
|
|
|||
|
hdbase dd 0x0 ; for boot 0x1f0
|
|||
|
hdid dd 0x0
|
|||
|
hdpos dd 0x0 ; for boot 0x1
|
|||
|
fat32part dd 0x0 ; for boot 0x1
|
|||
|
|
|||
|
;part2_ld dd 0x0
|
|||
|
|
|||
|
;* start code - get process (3) - Mario79
|
|||
|
active_process dd 0
|
|||
|
;* end code - get active process (3) - Mario79
|
|||
|
|
|||
|
wraw_bacground_select db 0
|
|||
|
lba_read_enabled dd 0x0 ; 0 = disabled , 1 = enabled
|
|||
|
pci_access_enabled dd 0x0 ; 0 = disabled , 1 = enabled
|
|||
|
|
|||
|
sb16 dd 0x0
|
|||
|
wss dd 0x0
|
|||
|
|
|||
|
buttontype dd 0x0
|
|||
|
windowtypechanged dd 0x0
|
|||
|
endg
|
|||
|
|
|||
|
iglobal
|
|||
|
keyboard dd 0x1
|
|||
|
sound_dma dd 0x1
|
|||
|
syslang dd 0x1
|
|||
|
endg
|
|||
|
|
|||
|
IncludeIGlobals
|
|||
|
endofcode:
|
|||
|
IncludeUGlobals
|
|||
|
uglobals_size = $ - endofcode
|
|||
|
diff16 "end of kernel code",$
|
|||
|
|