|
|
|
@ -181,7 +181,7 @@ paint:
|
|
|
|
|
call get_window |
|
|
|
|
|
|
|
|
|
mov bx, [si + window.next] |
|
|
|
|
call forward_event |
|
|
|
|
call send_event |
|
|
|
|
|
|
|
|
|
cmp si, windows + WINDOW_ID_FILE_WINDOW*window.size |
|
|
|
|
jne .not_file_window |
|
|
|
@ -308,7 +308,7 @@ mouse:
|
|
|
|
|
mov cx, 0xffff |
|
|
|
|
mov bx, [si + window.next] |
|
|
|
|
mov al, WM_MOUSE |
|
|
|
|
call forward_event |
|
|
|
|
call send_event |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
.outside: |
|
|
|
@ -316,7 +316,7 @@ mouse:
|
|
|
|
|
pop cx |
|
|
|
|
mov bx, [si + window.next] |
|
|
|
|
mov al, WM_MOUSE |
|
|
|
|
call forward_event |
|
|
|
|
call send_event |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
; in: |
|
|
|
@ -442,10 +442,10 @@ unhook:
|
|
|
|
|
|
|
|
|
|
; Forward the event |
|
|
|
|
mov bx, [si + window.next] |
|
|
|
|
call forward_event |
|
|
|
|
call send_event |
|
|
|
|
|
|
|
|
|
; Update next ID |
|
|
|
|
; If window.next was zero, forward_event will also return zero so |
|
|
|
|
; If window.next was zero, send_event will also return zero so |
|
|
|
|
; this is safe in all cases |
|
|
|
|
mov [si + window.next], ax |
|
|
|
|
|
|
|
|
@ -542,49 +542,129 @@ move:
|
|
|
|
|
pop dx |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
; ------------------------------------------------------------------ |
|
|
|
|
; Launching |
|
|
|
|
; ------------------------------------------------------------------ |
|
|
|
|
|
|
|
|
|
; out: |
|
|
|
|
; clobbers everything |
|
|
|
|
launch: |
|
|
|
|
mov si, launch_filename |
|
|
|
|
|
|
|
|
|
; Is it a .wall file? |
|
|
|
|
; 4 letter file extension? |
|
|
|
|
call strlen |
|
|
|
|
cmp cx, 5 |
|
|
|
|
jb .not_wall |
|
|
|
|
jb .less_than_5_chars |
|
|
|
|
add si, cx |
|
|
|
|
sub si, 5 |
|
|
|
|
; .text |
|
|
|
|
mov di, text_extension |
|
|
|
|
call strcmp |
|
|
|
|
je .text_file |
|
|
|
|
; .wall |
|
|
|
|
mov di, wall_extension |
|
|
|
|
call strcmp |
|
|
|
|
jne .not_wall |
|
|
|
|
|
|
|
|
|
mov ax, cs |
|
|
|
|
mov es, ax |
|
|
|
|
mov si, launch_filename |
|
|
|
|
mov di, wallpaper_name |
|
|
|
|
mov cx, FS_DIRENT_NAME_SIZE |
|
|
|
|
rep movsb |
|
|
|
|
je .wallpaper |
|
|
|
|
.less_than_5_chars: |
|
|
|
|
|
|
|
|
|
call set_wallpaper |
|
|
|
|
call request_redraw |
|
|
|
|
jmp .end |
|
|
|
|
|
|
|
|
|
.not_wall: |
|
|
|
|
|
|
|
|
|
; Is it a .bin file? |
|
|
|
|
; 3 letter file extension? |
|
|
|
|
cmp cx, 4 |
|
|
|
|
jb .not_launchable ; No, too short |
|
|
|
|
mov si, launch_filename |
|
|
|
|
add si, cx |
|
|
|
|
sub si, 4 |
|
|
|
|
; .asm |
|
|
|
|
mov di, asm_extension |
|
|
|
|
call strcmp |
|
|
|
|
je .text_file |
|
|
|
|
; .txt |
|
|
|
|
mov di, txt_extension |
|
|
|
|
call strcmp |
|
|
|
|
je .text_file |
|
|
|
|
; .bin |
|
|
|
|
mov di, bin_extension |
|
|
|
|
call strcmp |
|
|
|
|
jne .not_launchable ; No, wrong extension |
|
|
|
|
jne .not_launchable ; No extension matched |
|
|
|
|
|
|
|
|
|
mov si, launch_filename |
|
|
|
|
call launch_binary |
|
|
|
|
|
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
.wallpaper: |
|
|
|
|
mov ax, cs |
|
|
|
|
mov es, ax |
|
|
|
|
mov si, launch_filename |
|
|
|
|
mov di, wallpaper_name |
|
|
|
|
mov cx, FS_DIRENT_NAME_SIZE |
|
|
|
|
rep movsb |
|
|
|
|
|
|
|
|
|
call set_wallpaper |
|
|
|
|
call request_redraw |
|
|
|
|
|
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
.not_launchable: |
|
|
|
|
; Copy filename into the launch error dialog |
|
|
|
|
mov si, launch_filename |
|
|
|
|
call show_launch_error |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
.text_file: |
|
|
|
|
; Launch viewer.bin if it exists |
|
|
|
|
mov si, viewer_file_name |
|
|
|
|
call launch_binary |
|
|
|
|
jc .viewer_not_found |
|
|
|
|
|
|
|
|
|
; Send the WM_OPEN_FILE event to tell viewer the file we |
|
|
|
|
; want it to open. launch_binary returned its segment in bx |
|
|
|
|
; so we can just pass that to send_event, as window IDs are |
|
|
|
|
; of the form segment | internal_id. |
|
|
|
|
mov al, WM_OPEN_FILE |
|
|
|
|
mov cx, launch_filename |
|
|
|
|
call send_event |
|
|
|
|
|
|
|
|
|
.viewer_not_found: |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
; in: |
|
|
|
|
; si = name of file not launchable |
|
|
|
|
; out: |
|
|
|
|
; clobbers everything |
|
|
|
|
show_launch_error: |
|
|
|
|
mov di, launch_error_dialog.filename |
|
|
|
|
mov cx, FS_DIRENT_NAME_SIZE-1 |
|
|
|
|
mov ah, 0xf0 |
|
|
|
|
.copy: |
|
|
|
|
lodsb |
|
|
|
|
test al, al |
|
|
|
|
je .copy_end |
|
|
|
|
stosw |
|
|
|
|
loop .copy |
|
|
|
|
.copy_end: |
|
|
|
|
; Zero out the rest |
|
|
|
|
xor al, al |
|
|
|
|
rep stosw |
|
|
|
|
|
|
|
|
|
; Show dialog |
|
|
|
|
mov ax, cs |
|
|
|
|
add ax, WINDOW_ID_LAUNCH_ERROR |
|
|
|
|
mov si, windows + WINDOW_ID_LAUNCH_ERROR*window.size |
|
|
|
|
call show_window |
|
|
|
|
|
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
; in: |
|
|
|
|
; si = name of the binary to launch |
|
|
|
|
; out: |
|
|
|
|
; cf = error occured when launching binary |
|
|
|
|
; bx = segment of the launched binary |
|
|
|
|
; clobbers everything else |
|
|
|
|
launch_binary: |
|
|
|
|
mov dx, 1 ; Don't create a new file if not found |
|
|
|
|
call PONYDOS_SEG:SYS_OPEN_FILE |
|
|
|
|
test ax, ax |
|
|
|
|
jz .not_launchable |
|
|
|
|
jz .file_not_found |
|
|
|
|
|
|
|
|
|
push ax |
|
|
|
|
push cx |
|
|
|
@ -600,14 +680,7 @@ launch:
|
|
|
|
|
jz .found_free_segment |
|
|
|
|
inc si |
|
|
|
|
loop .find_free_segment |
|
|
|
|
; Display an error dialog if we can't allocate a segment |
|
|
|
|
mov ax, cs |
|
|
|
|
add ax, WINDOW_ID_OOM_ERROR |
|
|
|
|
mov si, windows + WINDOW_ID_OOM_ERROR*window.size |
|
|
|
|
call show_window |
|
|
|
|
pop cx |
|
|
|
|
pop ax |
|
|
|
|
jmp .end |
|
|
|
|
jmp .out_of_memory |
|
|
|
|
.found_free_segment: |
|
|
|
|
mov byte [es:si], 1 ; Mark as used |
|
|
|
|
|
|
|
|
@ -623,34 +696,37 @@ launch:
|
|
|
|
|
xor di, di ; Read |
|
|
|
|
call PONYDOS_SEG:SYS_MODIFY_SECTORS |
|
|
|
|
|
|
|
|
|
push es ; Save the segment for return value |
|
|
|
|
|
|
|
|
|
; Transfer control to the newly loaded binary |
|
|
|
|
push cs ; Return segment |
|
|
|
|
mov ax, .end |
|
|
|
|
mov ax, .success |
|
|
|
|
push ax ; Return offset |
|
|
|
|
push es ; Call segment |
|
|
|
|
mov ax, PROC_INITIALIZE_ENTRYPOINT |
|
|
|
|
push ax ; Call offset |
|
|
|
|
retf |
|
|
|
|
|
|
|
|
|
.end: |
|
|
|
|
.success: |
|
|
|
|
pop bx |
|
|
|
|
clc |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
.not_launchable: |
|
|
|
|
; Copy filename into the launch error dialog |
|
|
|
|
mov si, launch_filename |
|
|
|
|
mov di, launch_error_dialog.filename |
|
|
|
|
mov cx, FS_DIRENT_NAME_SIZE-1 |
|
|
|
|
.loop: |
|
|
|
|
lodsb |
|
|
|
|
stosb |
|
|
|
|
inc di |
|
|
|
|
loop .loop |
|
|
|
|
|
|
|
|
|
; Show dialog |
|
|
|
|
.file_not_found: |
|
|
|
|
call show_launch_error |
|
|
|
|
jmp .error |
|
|
|
|
|
|
|
|
|
.out_of_memory: |
|
|
|
|
; Display an error dialog if we can't allocate a segment |
|
|
|
|
mov ax, cs |
|
|
|
|
add ax, WINDOW_ID_LAUNCH_ERROR |
|
|
|
|
mov si, windows + WINDOW_ID_LAUNCH_ERROR*window.size |
|
|
|
|
add ax, WINDOW_ID_OOM_ERROR |
|
|
|
|
mov si, windows + WINDOW_ID_OOM_ERROR*window.size |
|
|
|
|
call show_window |
|
|
|
|
pop cx |
|
|
|
|
pop ax |
|
|
|
|
|
|
|
|
|
.error: |
|
|
|
|
stc |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
; out: |
|
|
|
@ -675,7 +751,7 @@ set_wallpaper:
|
|
|
|
|
; bx = window ID |
|
|
|
|
; out: |
|
|
|
|
; ax = return value of event handler; 0 if window ID is 0 |
|
|
|
|
forward_event: |
|
|
|
|
send_event: |
|
|
|
|
push bp |
|
|
|
|
|
|
|
|
|
cmp bx, 0 |
|
|
|
@ -796,7 +872,7 @@ unhook_window:
|
|
|
|
|
mov bx, [es:GLOBAL_WINDOW_CHAIN_HEAD] |
|
|
|
|
|
|
|
|
|
mov al, WM_UNHOOK |
|
|
|
|
call forward_event |
|
|
|
|
call send_event |
|
|
|
|
|
|
|
|
|
mov [es:GLOBAL_WINDOW_CHAIN_HEAD], ax |
|
|
|
|
|
|
|
|
@ -1130,14 +1206,20 @@ strcmp:
|
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
; ------------------------------------------------------------------ |
|
|
|
|
; Variables |
|
|
|
|
; Constants |
|
|
|
|
; ------------------------------------------------------------------ |
|
|
|
|
|
|
|
|
|
asm_extension db '.asm', 0 |
|
|
|
|
bin_extension db '.bin', 0 |
|
|
|
|
txt_extension db '.txt', 0 |
|
|
|
|
text_extension db '.text', 0 |
|
|
|
|
wall_extension db '.wall', 0 |
|
|
|
|
|
|
|
|
|
wallpaper_name db 'ponydos.wall' |
|
|
|
|
times FS_DIRENT_NAME_SIZE-12 db 0 |
|
|
|
|
viewer_file_name db 'viewer.bin', 0 |
|
|
|
|
|
|
|
|
|
; ------------------------------------------------------------------ |
|
|
|
|
; Variables |
|
|
|
|
; ------------------------------------------------------------------ |
|
|
|
|
|
|
|
|
|
disk_icon: |
|
|
|
|
db 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f |
|
|
|
@ -1171,6 +1253,9 @@ windows:
|
|
|
|
|
|
|
|
|
|
open_windows db 0 |
|
|
|
|
|
|
|
|
|
wallpaper_name db 'ponydos.wall' |
|
|
|
|
times FS_DIRENT_NAME_SIZE-12 db 0 |
|
|
|
|
|
|
|
|
|
launch_filename times FS_DIRENT_NAME_SIZE db 0 |
|
|
|
|
|
|
|
|
|
section .bss |
|
|
|
|