📄 kernel.asm
字号:
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
mov [esp+36],dword 0
ret
ngsyse3:
cmp eax,4
jne ngsyse4
mov [esp+36],dword 0
ret
ngsyse4:
cmp eax,5
jnz ngsyse5
mov eax,[syslang]
mov [esp+36],eax
ret
ngsyse5:
cmp eax,9
jne ngsyse9
mov eax,[0xfdf0]
mov edi,[0x3000]
imul edi,256
add edi,0x80000
cmp [edi],dword 0x4B415551
je ftl1
cmp [edi+3],dword 0x4B415551
je ftl1
jmp ftl2
ftl1:
imul eax , 2
ftl2:
mov [esp+36],eax
ret
ngsyse9:
mov [esp+36],dword 1
ret
scroll_step equ 32
scroll_base equ 0xDA0000
scroll_max equ 2000
scroll_top: dd 0x0
scrolling: dd 0x0
align 4
check_scrolls:
mov [scrolling],byte 0
chcsl9:
cmp [0xfb40],byte 0
je chcsl1
mov esi , [0x3004]
shl esi , 1
add esi , 0xc400
movzx esi , word [esi]
mov ebp , 0
mov edi , scroll_base
mov [esisave],esi
check_scroll_list:
; Process slot
mov esi , [esisave]
mov [edisave],edi
cmp [edi+20],esi
jne new_scroll_check ; chcsl1
shl esi , 5
add esi , window_data
; 0xfb40 - buttons
; 0xfb0a - word x
; 0xfb0c - word y
; X
; mov eax , [edi+0]
; and eax , 0xffff
; add eax , [esi+0]
mov eax , [esi+0]
cmp [edi+2],byte 2
jne chscrl12
mov eax , [esi+4]
chscrl12:
add eax , [edi+0]
and eax , 0xffff
mov ebx , eax
add ebx , 13
movzx ecx , word [0xfb0a]
cmp [edi+2],byte 2
jne chscrl1
movzx ecx , word [0xfb0c]
chscrl1:
cmp [scrolling],byte 1
je chcsl95
cmp ecx , eax
jb new_scroll_check ; chcsl1
cmp ecx , ebx
ja new_scroll_check ; chcsl1
chcsl95:
; Y
; mov eax , [edi+4+2]
; and eax , 0xffff
; add eax , [esi+4]
mov eax , [esi+4]
cmp [edi+2],byte 2
jne chscrl14
mov eax , [esi+0]
chscrl14:
add eax , [edi+4+2]
and eax , 0xffff
mov ebx , [edi+4]
and ebx , 0xffff
add ebx , eax
movzx ecx , word [0xfb0c]
cmp [edi+2],byte 2
jne chscrl2
movzx ecx , word [0xfb0a]
chscrl2:
cmp [scrolling],byte 1
je chcsl96
cmp ecx , eax
jb new_scroll_check ; chcsl1
cmp ecx , ebx
ja new_scroll_check ; chcsl1
chcsl96:
jmp scrfoundl1
esisave: dd 0x0
edisave: dd 0x0
new_scroll_check:
add edi , scroll_step
inc ebp
cmp ebp , [scroll_top]
jbe check_scroll_list
jmp chcsl1 ; no scrolls found
scrfoundl1:
more_scroll:
mov edi , [edisave]
mov esi , [esisave]
shl esi , 5
add esi , window_data
; mov eax , [edi+4+2]
; and eax , 0xffff
; add eax , [esi+4]
; mov ebx , [edi+4]
; and ebx , 0xffff
; add ebx , eax
mov eax , [esi+4]
cmp [edi+2],byte 2
jne chscrl142
mov eax , [esi+0]
chscrl142:
add eax , [edi+4+2]
and eax , 0xffff
mov ebx , [edi+4]
and ebx , 0xffff
add ebx , eax
movzx ecx , word [0xfb0c]
cmp [edi+2],byte 2
jne chscrl22
movzx ecx , word [0xfb0a]
chscrl22:
mov esi , [esisave]
mov ebp , edi
;;;;;
add eax , 15
sub ebx , 15
cmp [scrolling],byte 1
je chcsl97
; Top button
cmp ecx , eax
ja chcsl32
mov eax , [ebp+16]
dec eax
jmp chcsl3
chcsl32:
; Low button
cmp ecx , ebx
jb chcsl33
mov eax , [ebp+16]
inc eax
jmp chcsl3
chcsl33:
chcsl97:
; Read glider
movzx ecx , word [0xfb0c]
cmp [edi+2],byte 2
jne chscrl3
movzx ecx , word [0xfb0a]
chscrl3:
cmp ecx , eax ; Below lowest point
jae scroll_fine_1
mov eax , ecx
jmp scrolljmp
scroll_fine_1:
push eax
mov eax , [edi+24]
shr eax , 1
sub ecx , eax ; glider size / 2
pop eax
scrolljmp:
cmp ecx , eax ; Below lowest point
jae scroll_fine_11
mov eax , ecx
scroll_fine_11:
sub ecx , eax
mov eax , ecx
mov edi , [ebp+4]
and edi , 0xffff
sub edi , 15+15 ; Heads
sub edi , [ebp+24] ; Glider size
; edi = Glide area from:to
imul eax , [ebp+12]
xor edx , edx
cmp edi , 0
jne noediz
mov edi , 1
noediz:
div edi
add eax , [ebp+8]
push ebx ; Above highest point
mov ebx , [ebp+8]
add ebx , [ebp+12]
dec ebx
cmp eax , ebx
jbe scroll_fine_2
mov eax , ebx
scroll_fine_2:
pop ebx
cmp eax , [ebp+16]
je chcsl4
mov [0xf500],byte 1
mov [0xf501],eax
chcsl4:
mov eax , 1
call delay_hs
call osloop_without_gui_response
mov [scrolling],byte 1
cmp [0xfb40],byte 0
jne more_scroll ; chcsl9
mov [scrolling],byte 0
jmp chcsl1
chcsl3:
mov [0xf500],byte 1
mov [0xf501],eax
chcsl2:
mov eax , 1
call delay_hs
call osloop_without_gui_response
cmp [0xfb40],byte 0
jne chcsl2
chcsl1:
ret
remove_scrolls:
; In : edx = Process slot
pusha
mov edi , scroll_base
mov ebp , scroll_max
remscrl1:
cmp [edi+20],edx
jne remscrl2
mov [edi+20],dword 0
remscrl2:
add edi , scroll_step
dec ebp
jnz remscrl1
popa
ret
check_scroll_table:
; Out : free address or current address
push ecx ebp
mov edi , scroll_base
mov ecx , [0x3000]
mov ebp , [scroll_top]
cmp ebp , 0
je cstl21
cstl1:
cmp [edi+0],eax
jne cstl2
cmp [edi+4],ebx
jne cstl2
cmp [edi+20],ecx
jne cstl2
; Scroll position found
pop ebp ecx
ret
cstl2:
add edi , scroll_step
dec ebp
jnz cstl1
cstl21:
; Not found or list empty
; Find empty slot
mov edi , scroll_base
mov ecx , [0x3000]
mov ebp , 0
cstl51:
cmp [edi+20],dword 0
jne cstl52
; Empty slot found - check scroll_top
inc ebp
cmp ebp , [scroll_top]
jbe cstl53
mov [scroll_top], ebp
cstl53:
pop ebp ecx
ret
cstl52:
add edi , scroll_step
inc ebp
cmp ebp , scroll_max
jb cstl51
pop ebp ecx
; No empty slots
sub edi , scroll_step
ret
align 4
sys_scroll:
; mov eax , 113
; eax mov ebx , 001 shl 16 + 260
; ebx mov ecx , 060 shl 16 + 180
; ecx mov edx , 1000
; edx mov esi , 200
; esi mov edi , [scroll_value]
call check_scroll_table ; edi = free address or current address
cmp edx , 1
jge noscrollsizesml
mov edx , 1
noscrollsizesml:
; Value within limits
cmp esi , ecx
jae scrl1
mov esi , ecx
scrl1:
push ecx
add ecx , edx
dec ecx
cmp esi , ecx
jbe scrl2
mov esi , ecx
scrl2:
pop ecx
; Save values
mov [edi+0],eax
mov [edi+4],ebx
mov [edi+8],ecx
mov [edi+12],edx
mov [edi+16],esi
push eax
mov eax , [0x3000]
mov [edi+20],eax ; Process slot - If Zero = slot no used
pop eax
pusha
and ebx , 0xffff
sub ebx , 15+15
mov eax , ebx
mov ebx , edx
xor edx , edx
div ebx
cmp eax , 25
jge scsizefine
mov eax , 25
scsizefine:
mov [edi+24],eax ; Scroll size
popa
mov ebp , eax
shr ebp , 16 ; save for vertical / horizontal draw
; Transparent head 1
pusha
push ebp
mov esi , scroll_grey_table
mov ebp , 15
pop edi
call scroll_transparent
popa
; Transparent head 2
pusha
push ebp
mov ecx , ebx
shl ecx , 16
add ebx , ecx
mov ecx , 15 shl 16
sub ebx , ecx
mov esi , scroll_grey_table
mov ebp , 15
pop edi
call scroll_transparent
popa
; Draw glider
mov ebp , ebx ; Save for background
add ebx , 15 * 65536
; ecx mov edx , 1000
; edx mov esi , 200
; esi mov edi , [scroll_value]
push eax ecx edx edi
mov eax , edi
mov edi , ebx
and edi , 0xffff
sub edi , 15+15 ; Heads
sub edi , [eax+24] ; Glider size
; edi = Glide area from:to
sub esi , ecx
imul esi , edi
mov eax , esi
mov ecx , edx
cmp ecx , 1
je nodece
dec ecx
nodece:
mov edx , 0
div ecx
shl eax , 16
add ebx , eax
pop edi edx ecx eax
; Gray scroll area 1
pusha
push eax
mov ecx , ebx
mov ebx , ebp
shr ecx , 16
mov bx , cx
; sub bx , 2
mov edi , [0x3010]
mov ecx , [edi-twdw]
cmp [esp+2],byte 2
jne nosxys23
mov ecx , [edi-twdw+4]
nosxys23:
add ax , cx
mov dx , ax
shl eax , 16
mov ax , dx
; 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 nosxys24
mov ecx , [edi-twdw+0]
nosxys24:
mov dx , cx
shl ecx , 16
mov cx , dx
add ebx , ecx
mov edi , 0
mov ecx , 0xc0c0c0
mov ebp , 13
sysscrl1:
pusha
cmp [esp+32+2],byte 2
jne nosxys2
xchg eax , ebx
nosxys2:
call draw_line
popa
add ecx , 0x030303
add eax , 0x00010001
dec ebp
jnz sysscrl1
pop eax
popa
; Gray scroll area 2
pusha
push eax
shr ebx , 16
add ebx , [edi+24]
shl ebx , 16
mov ecx , [edi+4+2]
mov bx , cx
mov ecx , [edi+4]
add bx , cx
sub bx , 15
sub ebx , 0x00010001
; mov ecx , ebx
; mov ebx , ebp
; shr ecx , 16
; mov bx , cx
mov edi , [0x3010]
mov ecx , [edi-twdw]
cmp [esp+2],byte 2
jne nosxys25
mov ecx , [edi-twdw+4]
nosxys25:
add ax , cx
mov dx , ax
shl eax , 16
mov ax , dx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -