;--- BEGIN ---------------------------------------------------;
;--- CONSTANTS -----------------------------------------------;
;--- DATA ----------------------------------------------------;
SEGMENT .data
pageno: dw 0008h ; current page number
;--- BSS -----------------------------------------------------;
SEGMENT .bss
cbuffer: RESB 2000 ; page data buffer
cheader: RESB 48 ; page properties buffer
bbuffer: RESB 2048 ; backup page buffer
obuffer: RESB 2048 ; memory copy of colour buffer
;--- CODE ----------------------------------------------------;
SEGMENT .text
PageUp: call NotInEditMode
inc word [pageno]
cmp [pageno], word 720 ; 720 pages - TODO disk max
jne .Return
mov [pageno], word 0
.Return: jmp LoadPage
PageDown: call NotInEditMode
dec word [pageno]
cmp [pageno], word 0ffffh
jne .Return
mov [pageno], word 719 ; TODO disk max - 1
.Return: jmp LoadPage
NextPage: mov cx, [cheader+2]
; FALLTHROUGH
HyperPage: cmp cx, 0 ; TODO more thorough limits
je .Abort
jmp GoPage
.Abort: jmp BadLight
PrevPage: mov cx, [cheader+4]
jmp HyperPage
HelpPage: mov cx, [cheader+10]
jmp HyperPage
ColourPage: mov cx, [cheader+8]
jmp HyperPage
; DisplayPage - display in-memory page buffer on-screen
; ax,si,di=DESTROYED
DisplayPage: mov di, 0
.Draw: mov ax, di
shl ax, 1
mov si, ax ; si = di * 2
mov ah, [obuffer + di]
mov al, [cbuffer + di]
add si, [hoffs]
mov [es:si], ax
inc di
mov ax, 4000
cmp si, ax
jne .Draw
jmp DisplayProperties
;;--------------------------------------------;
;; Prompt the user for a page number, and jump
;; to it (make it current, load and display it.)
;; ax: * -> GARBAGE
;; si: * -> GARBAGE
;; di: * -> GARBAGE
;; *: * -> GARBAGE
AskGoPage: call NotInEditMode
mov al, 1
call AssertStatusBar
mov ah, 03h
mov bx, [pageno]
mov di, 152
call EditShort
mov cx, bx
; FALLTHROUGH
;;--------------------------------------------;
;; Jump to the given page.
;; cx: page to jump to -> GARBAGE
;; *: * -> GARBAGE
GoPage: call NotInEditMode
cmp cx, 720 ; LoadPage/ReadPage
jae .Abort ; should handle limits...
mov [pageno], cx
jmp LoadPage
.Abort: call LoadPage
jmp BadLight
;;--------------------------------------------;
;; Jump to the page number specified by the
;; first four ASCII hex digits to the right of
;; the first * to the left of the cursor (!)
;; *: * -> GARBAGE
JumpPage: mov al, '*'
call BufFind
cmp bx, 0ffffh
je .NotFound
mov [bufptr], bx
call BufRight
mov bx, [bufptr]
add bx, cbuffer
call ParseHexShort
mov cx, ax
jmp GoPage
.NotFound: jmp BadLight
;;--------------------------------------------;
;; Read page from disk into buffer and display it.
;; *: * -> GARBAGE
LoadPage: call WorkLight
call NoEditMode
mov di, 0
mov al, 1ah
.Fill: mov [cbuffer + di], byte 0 ; clear page buffer.
mov [obuffer + di], al ; clear colour buffer
inc di
cmp di, 2000
jne .Fill
mov ax, [pageno]
mov bx, cbuffer
call ReadPage
cmp ax, 1
jne .Cnt
.Error: call BadLight
jmp .Status
.Cnt: mov ax, [cheader]
cmp ax, 0bef0h
jne .OK
; read the colour page.
mov ax, [cheader+8] ; colour page number
mov bx, obuffer
cmp ax, 0
je .OK
call ReadPage
cmp ax, 1
je .Error
.OK: call OKLight
.Status: cmp [hoffs], word 0
ja .OKGO
jmp DisplayPage
.OKGO: mov ah, 03h
mov bx, [pageno] ; Display page number onscreen
mov di, 152
call DisplayShort
jmp DisplayPage
;;--------------------------------------------;
;; Write page from buffer to disk.
;; When finished, re-display it.
;; *: * -> GARBAGE
SavePage: call EditModeOnly
call NoEditMode
call WorkLight
mov ax, [pageno]
mov bx, cbuffer
call WritePage
cmp ax, 1
jne .OK
call BadLight
jmp .Cnt
.OK: call OKLight
jmp DisplayPage
.Cnt: ret
;--- END -----------------------------------------------------;