From feffd0cb28f7f1239f91038be6c0107f21355921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Mon, 27 Mar 2023 11:34:21 +0300 Subject: [PATCH] Divide shell.asm logically into sections --- shell.asm | 448 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 236 insertions(+), 212 deletions(-) diff --git a/shell.asm b/shell.asm index ebcf736..ff3f188 100644 --- a/shell.asm +++ b/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