;--- BEGIN ---------------------------------------------------; ;--- CONSTANTS -----------------------------------------------; WORK_LIGHT EQU 0ee0ah OK_LIGHT EQU 02a0ah BAD_LIGHT EQU 0cc0ah EDIT_LIGHT EQU 02e45h NO_EDIT_LIGHT EQU 02f20h ;--- DATA ----------------------------------------------------; SEGMENT .data bytesperline: dw 160 ; bytes per line hoffs: dw 160 ; number of heading lines displayed, ; in byte offset (1 line = 160) ;--- BSS -----------------------------------------------------; SEGMENT .bss ;--- CODE ----------------------------------------------------; SEGMENT .text ;;--------------------------------------------; ;; Returns from caller if there are not enough ;: status bar lines visible on the screen. ;; ah: -> GARBAGE ;; al: minimum number of lines showing -> GARBAGE ;; dx: -> GARBAGE AssertStatusBar:xor ah, ah xor dx, dx mul word [bytesperline] cmp [hoffs], ax jb .NotEnough jmp .Enough .NotEnough: pop ax .Enough: ret ;;--------------------------------------------; ;; Shrinks the status bar, if possible. ;; *: -> GARBAGE MoreScreen: cmp [hoffs], word 0 ja .LessHeader ret .LessHeader: sub [hoffs], word 160 call MoveCursor jmp DisplayPage ;;--------------------------------------------; ;; Expands the status bar, if possible. ;; *: -> GARBAGE LessScreen: cmp [hoffs], word 2560 jb .MoreHeader ret .MoreHeader: add [hoffs], word 160 mov ax, [bufptr] mov bx, [hoffs] shr bx, 1 add ax, bx cmp ax, 2000 jb .InRange sub [bufptr], word 80 .InRange: cmp [hoffs], word 320 jae .Blanks cmp [hoffs], word 160 jne .StillOn call OKLight call RefreshStatus .StillOn: jmp DisplayPage .Blanks: mov ax, 2020h mov di, 160 mov cx, [hoffs] sub cx, di call DrawBar jmp DisplayPage ;;--------------------------------------------; ;; Refreshes the status bar, if possible. ;; *: -> GARBAGE RefreshStatus: mov al, 1 call AssertStatusBar mov di, 0 mov [es:di], word 02f42h ; the BefOS 'logo' test [flags], byte FLAG_EDIT jnz .EditMode call NoEditLight jmp .Next .EditMode: call EditLight .Next: mov di, 6 mov word [es:di], NO_EDIT_LIGHT ; TODO - DrawBar mov di, 8 mov bx, [basek] mov ah, 07h call DisplayShort mov di, 16 mov bx, [extk] mov ah, 70h call DisplayShort call ShowKeyStroke ;call ShowPageNo mov ah, 03h mov bx, [pageno] ; Display page number onscreen mov di, 152 jmp DisplayShort ;;--------------------------------------------; ;; Display the current byte in the page buffer ;; on the status bar, if it is visible. ;; *: -> GARBAGE UpdateCurByte: mov al, 1 call AssertStatusBar mov di, [bufptr] mov bl, [cbuffer + di] mov ah, 1fh mov di, 148 jmp DisplayByte ;;--------------------------------------------; ;; Display the scancode of the last keystroke ;; on the status bar, if it is visible. ;; *: -> GARBAGE ShowKeyStroke: mov al, 1 call AssertStatusBar mov bx, [keyhit] mov ah, 70h mov di, 140 jmp DisplayShort ;;--------------------------------------------; ;; Displays the given word in the 'status' area ;; on the status bar, if it is visible. ;; cx: word to display ;; *: -> GARBAGE StatusWord: mov al, 1 call AssertStatusBar mov di, 24 mov bx, cx mov ah, 3fh jmp DisplayShort ;;--------------------------------------------; ;; Display the 'working' light. ;; ax: * -> GARBAGE WorkLight: mov ax, WORK_LIGHT jmp Light ;;--------------------------------------------; ;; Display the 'action failed' light. ;; ax: * -> GARBAGE BadLight: mov ax, BAD_LIGHT jmp Light ;;--------------------------------------------; ;; Display the 'OK' light. ;; ax: * -> GARBAGE OKLight: mov ax, OK_LIGHT ; FALLTHROUGH ;;--------------------------------------------; ;; Displays the BefOS 'light' as the given ;; character with the given attributes. ;; ah: attributes -> ;; al: character -> ;; di: * -> screen location Light: cmp [hoffs], word 0 jbe .NoRoom mov di, 2 mov [es:di], ax .NoRoom: ret EditLight: cmp [hoffs], word 0 jbe .NoRoom mov ax, EDIT_LIGHT mov di, 4 mov [es:di], ax .NoRoom: ret NoEditLight: cmp [hoffs], word 0 jbe .NoRoom mov ax, NO_EDIT_LIGHT mov di, 4 mov [es:di], ax .NoRoom: ret ;--- END -----------------------------------------------------;