View Source Document

interp.s

;--- BEGIN ---------------------------------------------------;

;--- CONSTANTS -----------------------------------------------;

;--- DATA ----------------------------------------------------;

SEGMENT .data

beeblequit: db 00

    ;-----BefOS "STACK"-----;
ossp:       dw 0

    ;-----Beeblebrox Bindings---;

%include    "../inc/beeble.inc"

;--- BSS -----------------------------------------------------;

SEGMENT .bss

    ;-----SYSTEM STACK------;
osstack:    RESB 256    ; BefOS system stack

;--- CODE ----------------------------------------------------;

SEGMENT .text

        ;;--------------------------------------------;
        ;; cx: word to push ->
        ;; bx: * -> GARBAGE
PushWord:   mov bx, [ossp]
        mov [bx + osstack], cx
        inc word [ossp]
        ret


        ;;--------------------------------------------;
        ;; cx: * -> word popped
        ;; bx: * -> GARBAGE
PopWord:    dec word [ossp]
        mov bx, [ossp]
        mov cx, [bx + osstack]
        ret


PushHexInstr:   mov bx, [bufptr]
        xor ch, ch
        mov cl, [cbuffer + bx]
        sub cl, 'a'
        jmp PushWord


AddWords:   call    PopWord
        mov ax, cx
        call    PopWord
        add ax, cx
        mov cx, ax
        jmp PushWord


SubWords:   call    PopWord
        mov ax, cx
        call    PopWord
        sub ax, cx
        mov cx, ax
        jmp PushWord


MulWords:   call    PopWord
        mov ax, cx
        call    PopWord
        mul cx
        mov cx, ax
        jmp PushWord


DivWords:   call    PopWord
        mov ax, cx
        call    PopWord
        div cx
        mov cx, ax
        jmp PushWord


Beeblebrox: xor al, al
        mov [beeblequit], al

.Loop:      mov al, [beeblequit]
        cmp al, 0
        jne .BeebleQuit
        call    ExecBeebInstr
        jmp .Loop
.BeebleQuit:    ret


EndBeeblebrox:  mov [beeblequit], byte 1
        ret


ExecBeebInstr:  mov di, [bufptr]
        xor bh, bh
        mov bl, [cbuffer + di]

        shl bx, 1
        mov ax, [scripttab + bx]
        call    ax
        jmp Advance


StringMode: jmp Unimp


RunBeeble:  call    BufHome
        mov [lastmove], word BufRight
        jmp Beeblebrox


;--- END -----------------------------------------------------;