Divide shell.asm logically into sections
This commit is contained in:
parent
71444f5ce7
commit
feffd0cb28
448
shell.asm
448
shell.asm
|
@ -132,6 +132,10 @@ process_event:
|
|||
pop bx
|
||||
retf
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Event handlers
|
||||
; ------------------------------------------------------------------
|
||||
|
||||
; in:
|
||||
; al = WM_PAINT
|
||||
; bx = window ID
|
||||
|
@ -277,85 +281,6 @@ mouse:
|
|||
call forward_event
|
||||
ret
|
||||
|
||||
; in:
|
||||
; ax = window ID
|
||||
; bx = Y coördinate
|
||||
; cx = X coördinate
|
||||
; si = pointer to window structure
|
||||
resize:
|
||||
push dx
|
||||
push bp
|
||||
|
||||
xor bp, bp ; Change?
|
||||
|
||||
mov dx, [si + window.res_y]
|
||||
sub dx, bx
|
||||
jc .end_y
|
||||
cmp dx, WINDOW_MIN_HEIGHT
|
||||
jl .end_y
|
||||
cmp dx, ROWS
|
||||
jg .end_y
|
||||
|
||||
cmp [si + window.y], bx
|
||||
je .end_y
|
||||
inc bp
|
||||
mov [si + window.y], bx
|
||||
mov [si + window.height], dx
|
||||
|
||||
.end_y:
|
||||
mov dx, [si + window.res_x]
|
||||
sub dx, cx
|
||||
jc .end_x
|
||||
cmp dx, WINDOW_MIN_WIDTH
|
||||
jl .end_x
|
||||
cmp dx, COLUMNS
|
||||
jg .end_x
|
||||
|
||||
cmp [si + window.x], cx
|
||||
je .end_x
|
||||
inc bp
|
||||
mov [si + window.x], cx
|
||||
mov [si + window.width], dx
|
||||
|
||||
.end_x:
|
||||
test bp, bp
|
||||
jz .end
|
||||
|
||||
call render_file_window
|
||||
call request_redraw
|
||||
|
||||
.end:
|
||||
pop bp
|
||||
pop dx
|
||||
ret
|
||||
|
||||
; in:
|
||||
; ax = window ID
|
||||
; bx = Y coördinate
|
||||
; cx = X coördinate
|
||||
; si = pointer to window structure
|
||||
move:
|
||||
push dx
|
||||
|
||||
mov dx, cx
|
||||
sub dx, [si + window.res_x]
|
||||
|
||||
cmp [si + window.y], bx
|
||||
jne .change
|
||||
cmp [si + window.x], dx
|
||||
jne .change
|
||||
jmp .end
|
||||
|
||||
.change:
|
||||
mov [si + window.y], bx
|
||||
mov [si + window.x], dx
|
||||
|
||||
call request_redraw
|
||||
|
||||
.end:
|
||||
pop dx
|
||||
ret
|
||||
|
||||
; in:
|
||||
; ax = window ID
|
||||
; bx = Y coördinate
|
||||
|
@ -440,68 +365,132 @@ click:
|
|||
pop dx
|
||||
ret
|
||||
|
||||
; in
|
||||
; si = pointer to window structure
|
||||
render_file_window:
|
||||
call copy_dirents
|
||||
|
||||
push ax
|
||||
push cx
|
||||
push dx
|
||||
push es
|
||||
|
||||
mov ax, cs
|
||||
mov es, ax
|
||||
mov di, [si + window.data]
|
||||
mov cx, [si + window.width]
|
||||
mov ax, 0x0f00
|
||||
rep stosw
|
||||
|
||||
mov cx, (ROWS-1)*COLUMNS
|
||||
mov ax, 0xf000
|
||||
rep stosw
|
||||
|
||||
mov di, [si + window.data]
|
||||
mov byte [di], 0x17
|
||||
mov byte [di + 2], 'A'
|
||||
mov byte [di + 4], ':'
|
||||
add di, [si + window.width]
|
||||
add di, [si + window.width]
|
||||
mov byte [di - 2], 'x'
|
||||
|
||||
mov cx, [si + window.height]
|
||||
dec cx
|
||||
mov dx, [si + window.width]
|
||||
call print_ls
|
||||
|
||||
pop es
|
||||
pop dx
|
||||
pop cx
|
||||
pop ax
|
||||
; in:
|
||||
; al = WM_KEYBOARD
|
||||
; bx = window ID
|
||||
; cl = typed character
|
||||
; cl = typed key
|
||||
; out:
|
||||
; clobbers everything
|
||||
keyboard:
|
||||
ret
|
||||
|
||||
copy_dirents:
|
||||
push cx
|
||||
push si
|
||||
push di
|
||||
push ds
|
||||
push es
|
||||
; in:
|
||||
; al = WM_UNHOOK
|
||||
; bx = window ID
|
||||
; cx = window to unhook
|
||||
; out:
|
||||
; ax = own ID if not the window to unhook
|
||||
; next ID if the window to unhook
|
||||
; clobbers everything else
|
||||
unhook:
|
||||
call get_window
|
||||
|
||||
mov bp, PONYDOS_SEG
|
||||
mov ds, bp
|
||||
mov bp, cs
|
||||
mov es, bp
|
||||
cmp bx, cx
|
||||
je .match
|
||||
|
||||
mov si, GLOBAL_DIRENTS
|
||||
mov di, dirents
|
||||
mov cx, FS_DIRENT_SIZE*FS_DIRECTORY_DIRENTS
|
||||
rep movsb
|
||||
push bx
|
||||
|
||||
pop es
|
||||
pop ds
|
||||
pop di
|
||||
pop si
|
||||
pop cx
|
||||
; Forward the event
|
||||
mov bx, [si + window.next]
|
||||
call forward_event
|
||||
|
||||
; Update next ID
|
||||
; If window.next was zero, forward_event will also return zero so
|
||||
; this is safe in all cases
|
||||
mov [si + window.next], ax
|
||||
|
||||
; Return own ID to keep self in the chain
|
||||
pop ax
|
||||
|
||||
ret
|
||||
|
||||
.match:
|
||||
; Return next ID in the chain to unhook
|
||||
mov ax, [si + window.next]
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Event handler subroutines
|
||||
; ------------------------------------------------------------------
|
||||
|
||||
; in:
|
||||
; ax = window ID
|
||||
; bx = Y coördinate
|
||||
; cx = X coördinate
|
||||
; si = pointer to window structure
|
||||
resize:
|
||||
push dx
|
||||
push bp
|
||||
|
||||
xor bp, bp ; Change?
|
||||
|
||||
mov dx, [si + window.res_y]
|
||||
sub dx, bx
|
||||
jc .end_y
|
||||
cmp dx, WINDOW_MIN_HEIGHT
|
||||
jl .end_y
|
||||
cmp dx, ROWS
|
||||
jg .end_y
|
||||
|
||||
cmp [si + window.y], bx
|
||||
je .end_y
|
||||
inc bp
|
||||
mov [si + window.y], bx
|
||||
mov [si + window.height], dx
|
||||
|
||||
.end_y:
|
||||
mov dx, [si + window.res_x]
|
||||
sub dx, cx
|
||||
jc .end_x
|
||||
cmp dx, WINDOW_MIN_WIDTH
|
||||
jl .end_x
|
||||
cmp dx, COLUMNS
|
||||
jg .end_x
|
||||
|
||||
cmp [si + window.x], cx
|
||||
je .end_x
|
||||
inc bp
|
||||
mov [si + window.x], cx
|
||||
mov [si + window.width], dx
|
||||
|
||||
.end_x:
|
||||
test bp, bp
|
||||
jz .end
|
||||
|
||||
call render_file_window
|
||||
call request_redraw
|
||||
|
||||
.end:
|
||||
pop bp
|
||||
pop dx
|
||||
ret
|
||||
|
||||
; in:
|
||||
; ax = window ID
|
||||
; bx = Y coördinate
|
||||
; cx = X coördinate
|
||||
; si = pointer to window structure
|
||||
move:
|
||||
push dx
|
||||
|
||||
mov dx, cx
|
||||
sub dx, [si + window.res_x]
|
||||
|
||||
cmp [si + window.y], bx
|
||||
jne .change
|
||||
cmp [si + window.x], dx
|
||||
jne .change
|
||||
jmp .end
|
||||
|
||||
.change:
|
||||
mov [si + window.y], bx
|
||||
mov [si + window.x], dx
|
||||
|
||||
call request_redraw
|
||||
|
||||
.end:
|
||||
pop dx
|
||||
ret
|
||||
|
||||
show_file_window:
|
||||
|
@ -645,51 +634,40 @@ set_wallpaper:
|
|||
call PONYDOS_SEG:SYS_MODIFY_SECTORS
|
||||
ret
|
||||
|
||||
; in:
|
||||
; al = WM_KEYBOARD
|
||||
; bx = window ID
|
||||
; cl = typed character
|
||||
; cl = typed key
|
||||
; out:
|
||||
; clobbers everything
|
||||
keyboard:
|
||||
ret
|
||||
; ------------------------------------------------------------------
|
||||
; Windows
|
||||
; ------------------------------------------------------------------
|
||||
|
||||
; in:
|
||||
; al = WM_UNHOOK
|
||||
; bx = window ID
|
||||
; cx = window to unhook
|
||||
; out:
|
||||
; ax = own ID if not the window to unhook
|
||||
; next ID if the window to unhook
|
||||
; clobbers everything else
|
||||
unhook:
|
||||
call get_window
|
||||
; ax = return value of event handler; 0 if window ID is 0
|
||||
forward_event:
|
||||
push bp
|
||||
|
||||
cmp bx, cx
|
||||
je .match
|
||||
cmp bx, 0
|
||||
je .id_is_zero
|
||||
|
||||
push bx
|
||||
push cs ; Return segment
|
||||
mov bp, .end
|
||||
push bp ; Return offset
|
||||
|
||||
; Forward the event
|
||||
mov bx, [si + window.next]
|
||||
call forward_event
|
||||
mov bp, 0xf000
|
||||
and bp, bx
|
||||
push bp ; Call segment
|
||||
xor bp, bp
|
||||
push bp ; Call offset
|
||||
retf
|
||||
|
||||
; Update next ID
|
||||
; If window.next was zero, forward_event will also return zero so
|
||||
; this is safe in all cases
|
||||
mov [si + window.next], ax
|
||||
|
||||
; Return own ID to keep self in the chain
|
||||
pop ax
|
||||
.id_is_zero:
|
||||
; This gets skipped over in normal execution, because it
|
||||
; explicitly returns to .end
|
||||
xor ax, ax
|
||||
|
||||
.end:
|
||||
pop bp
|
||||
ret
|
||||
|
||||
.match:
|
||||
; Return next ID in the chain to unhook
|
||||
mov ax, [si + window.next]
|
||||
ret
|
||||
|
||||
; in:
|
||||
; bx = valid window id for this process
|
||||
; out:
|
||||
|
@ -713,18 +691,6 @@ get_window:
|
|||
pop bx
|
||||
ret
|
||||
|
||||
request_redraw:
|
||||
push es
|
||||
push bp
|
||||
|
||||
mov bp, PONYDOS_SEG
|
||||
mov es, bp
|
||||
mov byte [es:GLOBAL_REDRAW], 1
|
||||
|
||||
pop bp
|
||||
pop es
|
||||
ret
|
||||
|
||||
; in:
|
||||
; cx = window ID to unhook
|
||||
unhook_window:
|
||||
|
@ -778,6 +744,66 @@ raise_window:
|
|||
pop bx
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Painting
|
||||
; ------------------------------------------------------------------
|
||||
|
||||
; in
|
||||
; si = pointer to window structure
|
||||
render_file_window:
|
||||
call copy_dirents
|
||||
|
||||
push ax
|
||||
push cx
|
||||
push dx
|
||||
push es
|
||||
|
||||
mov ax, cs
|
||||
mov es, ax
|
||||
mov di, [si + window.data]
|
||||
mov cx, [si + window.width]
|
||||
mov ax, 0x0f00
|
||||
rep stosw
|
||||
|
||||
mov cx, (ROWS-1)*COLUMNS
|
||||
mov ax, 0xf000
|
||||
rep stosw
|
||||
|
||||
mov di, [si + window.data]
|
||||
mov byte [di], 0x17
|
||||
mov byte [di + 2], 'A'
|
||||
mov byte [di + 4], ':'
|
||||
add di, [si + window.width]
|
||||
add di, [si + window.width]
|
||||
mov byte [di - 2], 'x'
|
||||
|
||||
mov cx, [si + window.height]
|
||||
dec cx
|
||||
mov dx, [si + window.width]
|
||||
call print_ls
|
||||
|
||||
pop es
|
||||
pop dx
|
||||
pop cx
|
||||
pop ax
|
||||
ret
|
||||
|
||||
request_redraw:
|
||||
push es
|
||||
push bp
|
||||
|
||||
mov bp, PONYDOS_SEG
|
||||
mov es, bp
|
||||
mov byte [es:GLOBAL_REDRAW], 1
|
||||
|
||||
pop bp
|
||||
pop es
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; File access
|
||||
; ------------------------------------------------------------------
|
||||
|
||||
; in
|
||||
; cx = height of window (>= 1)
|
||||
; dx = width of window in characters
|
||||
|
@ -905,6 +931,34 @@ print_ls:
|
|||
pop ax
|
||||
ret
|
||||
|
||||
copy_dirents:
|
||||
push cx
|
||||
push si
|
||||
push di
|
||||
push ds
|
||||
push es
|
||||
|
||||
mov bp, PONYDOS_SEG
|
||||
mov ds, bp
|
||||
mov bp, cs
|
||||
mov es, bp
|
||||
|
||||
mov si, GLOBAL_DIRENTS
|
||||
mov di, dirents
|
||||
mov cx, FS_DIRENT_SIZE*FS_DIRECTORY_DIRENTS
|
||||
rep movsb
|
||||
|
||||
pop es
|
||||
pop ds
|
||||
pop di
|
||||
pop si
|
||||
pop cx
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; String routines
|
||||
; ------------------------------------------------------------------
|
||||
|
||||
; in:
|
||||
; ds:si = string
|
||||
; out:
|
||||
|
@ -954,36 +1008,6 @@ strcmp:
|
|||
pop si
|
||||
ret
|
||||
|
||||
; in:
|
||||
; bx = window ID
|
||||
; out:
|
||||
; ax = return value of event handler; 0 if window ID is 0
|
||||
forward_event:
|
||||
push bp
|
||||
|
||||
cmp bx, 0
|
||||
je .id_is_zero
|
||||
|
||||
push cs ; Return segment
|
||||
mov bp, .end
|
||||
push bp ; Return offset
|
||||
|
||||
mov bp, 0xf000
|
||||
and bp, bx
|
||||
push bp ; Call segment
|
||||
xor bp, bp
|
||||
push bp ; Call offset
|
||||
retf
|
||||
|
||||
.id_is_zero:
|
||||
; This gets skipped over in normal execution, because it
|
||||
; explicitly returns to .end
|
||||
xor ax, ax
|
||||
|
||||
.end:
|
||||
pop bp
|
||||
ret
|
||||
|
||||
wallpaper_name db 'ponydos.wall'
|
||||
times FS_DIRENT_NAME_SIZE-12 db 0
|
||||
|
||||
|
|
Loading…
Reference in New Issue