View Source Document

page.s

;--- 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 -----------------------------------------------------;