        TTL     > TOS04

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

quit_star

 [ 1=0
        LDYIM   5               ; Shut down Host redirection (SA does nothing)
        JSR     HostByte
 ]
        =       sv_exit         ; And exit the emulator

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Communicate with the Host code

; In    Y = rc for call

HostByte
        LDAIM   mybyt_A
        LDXIM   mybyt_X
        =       sv_byte         ; Don't go via local osbyte
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Read hex number from cliptr,Y

; Out   X = digit read; EQ -> no following args, NE -> got another arg

readhex ROUT

        LDXIM   0
        STX     number
        STX     number+1
        STX     cliptr+turbo

10      LDAIY   cliptr
        SEC
        SBCIM   "0"
        BCC     #FT50           ; Crap
        CMPIM   9+1             ; In 00..09 ?
        BCC     #FT20           ; Ok
        ANDIM   &DF
        SBCIM   &07             ; CSet; Get rid of colon thru @ symbols
        CMPIM   10              ; Must be in 0A .. 0F here
        BCC     #FT50           ; Crap
        CMPIM   15+1
        BCS     #FT50           ; Crap

20      ASLA                    ; Good number
        ASLA
        ASLA
        ASLA
        LDXIM   &03

40      ASLA
        ROL     number
        ROL     number+1
        BCS     bad_number      ; Overflowed ?
        DEX
        BPL     #BT40

        INY                     ; X  = &FF a ce moment
        BNE     #BT10           ; Safer than BRA

50      JMP     skipspaces      ; and return ...

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

needhex JSR     readhex
        PHP
        CPXIM   0
        BEQ     bad_number      ; If no digits read
        PLP                     ; Else return skipspaces result
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

page_star ROUT

        JSR     skipspaces      ; No parm ?
        BEQ     def_page

        JSR     needhex
        BNE     bad_number      ; Only one parm allowed


        LDY     number+1
        LDX     number
        BNE     badpage
        CPYIM   &08             ; Lowest page on Tube = &0800
        BCC     badpage
        CPYIM   &80
        BCS     badpage

setpage STY     pagevalue
        CLC                     ; Finished processing
        RTS

def_page
        LDYIM   8
        BRA     setpage

badpage BRK
        =       0
        =       "Bad PAGE", 0

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

bad_number
        BRK
        =       0
        =       "Bad number", 0

; *gos should be passed on if possible

go_on   SEC                     ; Pass command on
        RTS


go_star JSR     skipspaces      ; No parm ? 
        BEQ     def_go          ; Use previous GO address

        JSR     readhex
        CPXIM   0               ; No digits read ?
        BEQ     go_on

 [ 1=1
        CMPIM   ";"             ; Allow *go xxxx ; command tail for pervs
        BEQ     #FT10
        CMPIM   CR
        BNE     bad_number      ; Only one parm allowed
10
 |
        CMPIM   CR
        BNE     bad_number      ; Only one parm allowed
 ]

        LDX     number
        LDY     number+1

; .............................................................................

startcodeXY

        STX     himemptr
        STY     himemptr+1

; .............................................................................

def_go  LDA     initptr+1       ; Save some context for possible return
        PHA
        LDA     initptr
        PHA

        JSR     golang          ; Run the code at himemptr

        PLA
        STA     initptr
        STA     himemptr
        PLA
        STA     initptr+1
        STA     himemptr+1

        CLC                     ; Finished processing
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

golang
        LDA     himemptr        ; Write new initptr
        STA     initptr
        LDA     himemptr+1
        STA     initptr+1
        LDXIM   0
        STX     himemptr+turbo
        STX     brkptr+turbo
        LDYIM   7
        LDAIY   himemptr
        CLD
        CLC
        ADC     himemptr
        STA     brkptr
        LDAIM   0
        ADC     himemptr+1
        STA     brkptr+1

        LDYIM   0               ; Suss 0,"(C)"
        LDAIY   brkptr
        BNE     whoknows
        INY
        LDAIY   brkptr
        CMPIM   "("
        BNE     whoknows
        INY
        LDAIY   brkptr
        CMPIM   "C"
        BNE     whoknows
        INY
        LDAIY   brkptr
        CMPIM   ")"
        BNE     whoknows

; Valid code image, so suss processor type

        LDYIM   6
        LDAIY   himemptr
        ANDIM   &4D             ; %0100 1101
        CMPIM   &40             ; Language ?
        BCC     notasausage
        ANDIM   &0D             ; Proc type mask = %0000 1101
        BEQ     printcodetitle  ; Normal 6502 = %00x0
        CMPIM   1               ; Turbo 6502  = %00x1
        BNE     youwhalley

printcodetitle
        PHA
        LDYIM   9               ; Point to title field

puttylp LDAIY   himemptr
        BEQ     puttyend
        JSR     oswrch
        INY
        BNE     puttylp         ; Safer than BRA

puttyend
        JSR     osnewl
        JSR     osnewl
        PLA
        BRA     good6502

whoknows
        LDAIM   0               ; Assume boring code

good6502
        STA     turflag

; Clear out page 3 (Turbo). Not quite right, but it'll have to do

        LDYIM   0
        TYA
floop   STAAY   turbo-1
        DEY
        BNE     floop

        LDAIM   1               ; A=1
        JMI     himemptr        ; Enter language

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

youwhalley
        JSR     setOSbrk
        BRK
        =       0
        =       "I cannot run this code", 0

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

notasausage
        JSR     setOSbrk
        BRK
        =       0
        =       "This is not a language", 0

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

setOSbrk
        LDAIM   :LSB: (tim_brk)
        STA     brkv
        LDAIM   :MSB: (tim_brk)
        STA     brkv+1
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

help_star ROUT

        JSR     skipspaces
        BNE     #FT50
        JSR     osnewl
        JSR     printtitle

50      SEC                     ; Continue processing
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

printtitle
        JSR     vstring
        =       "6502 Emulator OS $version", LF,CR
        NOP
        RTS


        LNK     TOS05
