\ TinyELF main

\ needs breakpoint
needs safe

needs 1802
\ needs 1802debug
needs 1861display

\  needs outtest

needs case
needs events
needs ids
needs resources
needs double

needs skinelf2
needs skinclassic
needs progsave
needs progload
needs progdelete
needs pref
needs prefdialog
needs callbacks
needs dbframework
needs dbcosmac
needs elfcolor
needs keyboard

decimal
(ID) 1802 (ID) rsrc use-resources

decimal

: do-menu-events  ( -- )
    event >abs itemid
    case
    2003 of            \ 2003 = about
        5000 FrmAlert drop
    endof
    1001 of           \ 1001 = load 
        loadprogram 
    endof
    1002 of           \ 1002 = save
        saveprogram 
    endof
    1003 of           \ 1003 = delete
        deleteprogram 
    endof
    2001 of           \ 2001 = prefs
        prefsdialog 
    endof
    2002 of           \ 2002 = help
        8000 FrmHelp 
    endof
    endcase ;

: echar  ( -- char )
    event 9 + c@ ;

: do-event  ( ekey -- )
    case
        keyDownEvent of
             echar keypress
        endof
        menuEvent of
            do-menu-events
        endof
        dup do-skin-events
    endcase ;

\ variable ss   \ debug
: (go)  ( -- )
    2048 allocCbStack
    
    save-screen-settings
    set-screen-depth

    \ resolve forward references
    ['] set-videoview (set-videoview) !
    ['] set-normalview 
    (set-normalview) !

    init-1861

\    reset-break   \ debug only

    elf2-skin-init
    classic-skin-init

    \ Read user preferences to set
    \ skin, memory.
    init-pref  

    \ After the current skin is selected
    \ by init-pref above, we must
    \ initialize the skin.
    init-skin
    init-emulator

\ 256 0 do tmem i + c@  i byte! loop

    begin

        event-delay 2@ (ekey)  ?dup
        if     do-event     then

\ depth if  0 0 at decimal .s 
\ breakpoint then

\ 0 0 at depth decimal .

        emit? if
            repeat-rate @ 0 do
                do-state 
            loop

            update-skin
        then

    again ;

-257 constant byethrow

: go  ( -- )
    begin
        ['] (go) catch
        byethrow = if
            free-mem
            freeCbStack
            db db-close
            restore-screen-settings
            (bye)   \ byethrow throw
        then
    again ;

