📄 kernel.asm
字号:
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
mov [esp+36],dword 0
ret
ngsyse1:
cmp eax,2
jne ngsyse2
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 [esp+36],eax
ret
ngsyse9:
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,0x1000
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:
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 [0xFF00],byte 50
xor eax,eax
ret
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
add ebx,0x3000+0xa
mov [ebx],byte 3 ; clear possible i40's
ret
noprocessterminate:
cmp eax,3 ; ACTIVATE WINDOW
jnz nowindowactivate
cmp ebx,2
jb nowindowactivate
cmp ebx,[0x3004]
jg nowindowactivate
; edi = position at 0x2000+
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
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:
cmp eax,6 ; SAVE FLOPPY IMAGE (HD version only)
jnz nosaveimage
call restorefatchain ; restore FAT !!!
mov eax,image_save
mov ebx,1440*1024 ; size 1440 Kb
mov ecx,0x100000 ; address of image
mov edx,path ; path = 0 (root dir)
; mov [esp+28],eax ; for file_wite function
; mov [esp+24],ecx
; mov [esp+16],ebx
; mov [esp+20],edx
call file_write
ret
path db 0
nosaveimage:
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
test al,al
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
test ax,ax
jz cdplayfail
jmp cdplay
cdplayfail:
cdplayok:
pop ebx
pop ax
xor eax,eax
ret
sys_cdtracklist:
push ebx
tcdplay:
call sys_cd_atapi_command
mov dx,word [cdbase]
mov ax,0x43+2*256
out dx,ax
xor ax,ax
out dx,ax
xor ax,ax
out dx,ax
xor ax,ax
out dx,ax
mov ax,200
out dx,ax
xor ax,ax
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
xor eax,eax
ret
sys_cdpause:
call sys_cd_atapi_command
mov dx,word [cdbase]
mov ax,0x004B
out dx,ax
xor ax,ax
out dx,ax
xor ax,ax
out dx,ax
xor ax,ax
out dx,ax
xor ax,ax
out dx,ax
xor ax,ax
out dx,ax
mov esi,10
call delay_ms
add dx,7
in al,dx
xor eax,eax
ret
sys_cachetodiskette:
pusha
popa
ret
bgrchanged dd 0x0
sys_background:
cmp eax,1 ; BACKGROUND SIZE
jnz nosb1
mov [0x400000-8],ebx
mov [0x400000-4],ecx
mov [bgrchanged],1
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 [ebx+0x300000],edx
mov [bgrchanged],1
ret
nosb2:
cmp eax,3 ; DRAW BACKGROUND
jnz nosb3
cmp [bgrchanged],0
je nosb31
mov [bgrchanged],0
mov [0xfff0],byte 1
nosb31:
ret
nosb3:
cmp eax,4 ; TILED / STRETCHED
jnz nosb4
cmp ebx,[0x400000-12]
je nosb41
mov [0x400000-12],ebx
mov [bgrchanged],1
nosb41:
ret
nosb4:
cmp eax,5 ; BLOCK MOVE TO BGR
jnz nosb5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -