📄 kernel.asm
字号:
; mov ecx , ebx
; shr ecx , 16
; add bx , cx
; dec bx
;; add ebx , 15*65536
; sub bx , 15
mov ecx , [edi-twdw+4]
cmp [esp+2],byte 2
jne nosxys26
mov ecx , [edi-twdw+0]
nosxys26:
mov dx , cx
shl ecx , 16
mov cx , dx
add ebx , ecx
mov edi , 0
mov ecx , 0xc0c0c0
mov ebp , 13
sysscrl21:
pusha
cmp [esp+32+2],byte 2
jne nosxys3
xchg eax , ebx
nosxys3:
call draw_line
popa
add ecx , 0x030303
add eax , 0x00010001
dec ebp
jnz sysscrl21
pop eax
popa
; Gray 1
pusha
push eax
mov esi , scroll_grey_table
mov ebp , 3
pop edi
shr edi , 16
call scroll_transparent
popa
add ebx , 3 * 65536
; Blue middle
pusha
push eax
mov esi , scroll_color_table
mov ebp , [edi+24]
sub ebp , 6
pop edi
shr edi , 16
call scroll_transparent
popa
push eax
mov eax , [edi+24]
sub eax , 6
shl eax , 16
add ebx , eax
pop eax
; Gray 2
pusha
push eax
mov esi , scroll_grey_table
mov ebp , 3
pop edi
shr edi , 16
call scroll_transparent
popa
ret
scroll_transparent:
; In : ebp = size - esi = pointer to colour table - edi = vertic/horizont
pusha
push edi
mov edi , [0x3010]
mov ecx , [edi-twdw]
cmp [esp],byte 2
jne noscxysw3
mov ecx , [edi-twdw+4]
noscxysw3:
add ax , cx
mov dx , ax
shl eax , 16
mov ax , dx
mov ecx , ebx
shr ecx , 16
add ecx , ebp
dec ecx
mov bx , cx
mov ecx , [edi-twdw+4]
cmp [esp],byte 2
jne noscxysw2
mov ecx , [edi-twdw+0]
noscxysw2:
mov dx , cx
shl ecx , 16
mov cx , dx
add ebx , ecx
mov ebp , 13
sysscrl2:
mov ecx , [esi]
and ecx , 0xffffff
pusha
cmp [esp+32],byte 2
jne noscxysw
xchg eax,ebx
noscxysw:
call draw_line
popa
add esi , 3
add eax , 0x00010001
dec ebp
jnz sysscrl2
pop edi
popa
ret
scroll_color_table:
db 159 ,102 ,43
db 239 ,225 ,166
db 228 ,206 ,152
db 220 ,191 ,134
db 219 ,183 ,121
db 218 ,185 ,110
db 201 ,135 ,39
db 212 ,163 ,46
db 217 ,176 ,66
db 226 ,188 ,78
db 234 ,205 ,93
db 231 ,204 ,90
db 156 ,100 ,43
scroll_grey_table:
db 159,159,159
db 239,239,239
db 228,228,228
db 220,220,220
db 219,219,219
db 218,218,218
db 201,201,201
db 212,212,212
db 217,217,217
db 226,226,226
db 234,234,234
db 231,231,231
db 156,156,156
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
detect_devices:
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 eax,[0x3004]
add eax,2
mov [shutdown_processes],eax
mov [0xFF00],al
mov eax,0
ret
shutdown_processes: dd 0x0
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
mov [ebx],byte 3 ; clear possible i40's
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]
jg nowindowactivate
; edi = position at window_data+
mov edi,ebx
shl ebx,1
add ebx,0xc000
mov esi,[ebx]
and esi,0xffff
movzx edx,word [0x3004]
cmp esi,edx
jz nowindowactivate
mov [0xff01],edi
mov eax,0
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:
ret
sys_cd_audio:
cmp word [cdbase],word 0
jnz cdcon
mov eax,1
ret
cdcon:
; eax=1 cdplay at ebx 0x00FFSSMM
; eax=2 get tracklist size of ecx to [ebx]
; eax=3 stop/pause playing
cmp eax,1
jnz nocdp
call sys_cdplay
ret
nocdp:
cmp eax,2
jnz nocdtl
mov edi,[0x3010]
add edi,0x10
add ebx,[edi]
call sys_cdtracklist
ret
nocdtl:
cmp eax,3
jnz nocdpause
call sys_cdpause
ret
nocdpause:
mov eax,0xffffff01
ret
sys_cd_atapi_command:
pusha
mov dx,word [cdbase]
add dx,6
mov ax,word [cdid]
out dx,al
mov esi,10
call delay_ms
mov dx,word [cdbase]
add dx,7
in al,dx
and al,0x80
cmp al,0
jnz res
jmp cdl6
res:
mov dx,word [cdbase]
add dx,7
mov al,0x8
out dx,al
mov dx,word [cdbase]
add dx,0x206
mov al,0xe
out dx,al
mov esi,1
call delay_ms
mov dx,word [cdbase]
add dx,0x206
mov al,0x8
out dx,al
mov esi,30
call delay_ms
xor cx,cx
cdl5:
inc cx
cmp cx,10
jz cdl6
mov dx,word [cdbase]
add dx,7
in al,dx
and al,0x88
cmp al,0x00
jz cdl5
mov esi,100
call delay_ms
jmp cdl5
cdl6:
mov dx,word [cdbase]
add dx,4
mov al,0
out dx,al
mov dx,word [cdbase]
add dx,5
mov al,0
out dx,al
mov dx,word [cdbase]
add dx,7
mov al,0xec
out dx,al
mov esi,5
call delay_ms
mov dx,word [cdbase]
add dx,1
mov al,0
out dx,al
add dx,1
mov al,0
out dx,al
add dx,1
mov al,0
out dx,al
add dx,1
mov al,0
out dx,al
add dx,1
mov al,128
out dx,al
add dx,2
mov al,0xa0
out dx,al
xor cx,cx
mov dx,word [cdbase]
add dx,7
cdl1:
inc cx
cmp cx,100
jz cdl2
in al,dx
and ax,0x88
cmp al,0x8
jz cdl2
mov esi,2
call delay_ms
jmp cdl1
cdl2:
popa
ret
sys_cdplay:
mov ax,5
push ax
push ebx
cdplay:
call sys_cd_atapi_command
cli
mov dx,word [cdbase]
mov ax,0x0047
out dx,ax
mov al,1
mov ah,[esp+0] ; min xx
out dx,ax
mov ax,[esp+1] ; fr sec
out dx,ax
mov ax,256+99
out dx,ax
mov ax,0x0001
out dx,ax
mov ax,0x0000
out dx,ax
mov esi,10
call delay_ms
sti
add dx,7
in al,dx
test al,1
jz cdplayok
mov ax,[esp+4]
dec ax
mov [esp+4],ax
cmp ax,0
jz cdplayfail
jmp cdplay
cdplayfail:
cdplayok:
pop ebx
pop ax
mov eax,0
ret
sys_cdtracklist:
push ebx
tcdplay:
call sys_cd_atapi_command
mov dx,word [cdbase]
mov ax,0x43+2*256
out dx,ax
mov ax,0x0
out dx,ax
mov ax,0x0
out dx,ax
mov ax,0x0
out dx,ax
mov ax,200
out dx,ax
mov ax,0x0
out dx,ax
in al,dx
mov cx,1000
mov dx,word [cdbase]
add dx,7
cld
cdtrnwewait:
mov esi,10
call delay_ms
in al,dx
and al,128
cmp al,0
jz cdtrl1
loop cdtrnwewait
cdtrl1:
; read the result
mov ecx,[esp+0]
mov dx,word [cdbase]
cdtrread:
add dx,7
in al,dx
and al,8
cmp al,8
jnz cdtrdone
sub dx,7
in ax,dx
mov [ecx],ax
add ecx,2
jmp cdtrread
cdtrdone:
pop ecx
mov eax,0
ret
sys_cdpause:
call sys_cd_atapi_command
mov dx,word [cdbase]
mov ax,0x004B
out dx,ax
mov ax,0
out dx,ax
mov ax,0
out dx,ax
mov ax,0
out dx,ax
mov ax,0
out dx,ax
mov ax,0
out dx,ax
mov esi,10
call delay_ms
add dx,7
in al,dx
mov eax,0
ret
sys_cachetodiskette:
pusha
cmp eax,1
jne no_write_all_of_ramdisk
call fdc_writeramdisk
popa
ret
no_write_all_of_ramdisk:
cmp eax,2
jne no_write_part_of_ramdisk
call fdc_commitflush
popa
ret
no_write_part_of_ramdisk:
cmp eax,3
jne no_set_fdc
call fdc_set
popa
ret
no_set_fdc:
cmp eax,4
jne no_get_fdc
popa
call fdc_get
mov [esp+36],ecx
ret
no_get_fdc:
popa
ret
bgrchanged dd 0x0
sys_background:
cmp eax,1 ; BACKGROUND SIZE
jnz nosb1
cmp ebx,0
je sbgrr
cmp ecx,0
je sbgrr
mov [0x400000-8],ebx
mov [0x400000-4],ecx
mov [bgrchanged],1
sbgrr:
ret
nosb1:
cmp eax,2 ; SET PIXEL
jnz nosb2
mov edx,0x100000-16
cmp edx,ebx
jbe nosb2
mov edx,[ebx]
and edx,255*256*256*256
and ecx,255*256*256+255*256+255
add edx,ecx
mov
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -