;***********************************************************************
;*       B B C   B A S I C   M O S   E X T E N S I O N   R O M         *
;*---------------------------------------------------------------------*
;*    doel           : Extension rom v1 voor BBC Basic MOSROM v4 op    *
;*                     Atom-in-PC.                                     *
;*---------------------------------------------------------------------*
;*    filenaam       : mosext.asm                                      *
;*    auteur         : Roland Leurs                                    *
;*                     The Atomic Development Studio                   *
;*    ontwikkeld     : maart 1998                                      *
;*    laatste update :                                                 *
;*---------------------------------------------------------------------*
;*    assembleren    : x6502 MOSEXT                                    *
;*---------------------------------------------------------------------*
;*    oproep         : Laden als rom op &A000                          *
;***********************************************************************

                org $A000-16

header          .dw     header+16, init
                .dw     0,0,0,0,0,0

;***********************************************************************
;* Definitie van variabelen en constanten                              *
;***********************************************************************

oscliparm       equ $C6                 ; oscli werkruimte (5 bytes)

clbuffer        equ $100                ; buffer voor command line
clivec          equ $208                ; oscli vector
systemlatch     equ $B888               ; schakelkaart latch

oszendbyte      equ $1FC8
osleesbyte      equ $1FCB
osfind          equ $1FCE
osgbpb          equ $1FD1
osbput          equ $1FD4
osbget          equ $1FD7
osargs          equ $1FDA
osfile          equ $1FDD
osrdch          equ $1FE0
osasci          equ $1FE3
osnewl          equ $1FE7
oswrch          equ $1FEE
osword          equ $1FF1
osbyte          equ $1FF4
oscli           equ $1FF7
                

;***********************************************************************
;* Initialisatie van MOS EXT ROM                                       *
;***********************************************************************

init            .db $BE                 ; herkenningsbyte
                jmp mosextinit          ; entry: spring naar initialisatie
                jmp mosextmsg           ; entry: spring naar message

mosextinit      lda #<cliv              ; zet cli vector
                sta clivec
                lda #>cliv
                sta clivec+1
                rts                     ; that's all folks

mosextmsg       jsr print               ; druk volgende tekst af
                .db "Extension ROM v1.0"
                .db 13,10,10,$EA
                rts                     ; einde routine


************************************************************************
;* Diverse hulproutines                                                *
;***********************************************************************

; print string tot aan negatief byte
print           pla                     ; haal adres van stack
                sta $E8                 ; zet in print pointer
                pla
                sta $E9
print1          ldy #$00                ; reset indexregister
                inc $E8                 ; verhoog pointer
                bne print2              ; spring bij pagina overschreiding
                inc $E9
print2          lda ($E8),y             ; lees karakter
                bmi print3              ; spring indien einde string
                jsr oswrch              ; druk karakter af
                jmp print1              ; ga volgend karakter lezen
print3          jmp ($E8)               ; einde routine


; zet semafoor voor pc communicatie
zetsem          lda #$1B                ; laadt osbyte code
                jsr osbyte
                bcc zetsem              ; blijf dit doen totdat toegang vrij
                rts                     ; einde routine

wissem          lda #$1A                ; reset semafoor
                jmp osbyte              ; einde routine

pccom           pha                     ; save commando nummer
                lda #0                  ; stuur $00 byte
                jsr oszendbyte          ; naar pc
                pla                     ; haal commando nummer weer op
                jmp oszendbyte          ; stuur naar pc

; skip spaties in command line buffer
skipspace0      iny                     ; verhoog command line pointer
skipspace1      lda clbuffer,y          ; lees karakter
                cmp #' '                ; test op spatie
                beq skipspace0          ; volgende lezen bij spatie
                rts                     ; anders einde routine


;***********************************************************************
;* Command Line Interpreter                                            *
;***********************************************************************

cliv            sta oscliparm           ; save accu, x en y registers
                stx oscliparm+1
                sty oscliparm+2
                ldy #0                  ; reset command line pointer
                ldx #$FF                ; reset index
                lda (oscliparm+1),y     ; lees command line
                cmp #'*'                ; skip asterisk
                bne cliv_1              ; spring indien geen asterisk
cliv_0          iny                     ; verhoog command line pointer
cliv_1          inx                     ; verhoog index
                lda (oscliparm+1),y     ; lees command line
                sta clbuffer,x          ; zet in command line buffer
                cmp #$0D                ; test op einde regel
                bne cliv_0              ; spring als nog karakters volgen
                ldx #$FF                ; reset tabel index
                cld                     ; zeker niet decimaal werken
cliv_4          ldy #$00                ; reset command line pointer
                sty $DD                 ; waarom? weet bijna niemand...
                jsr skipspace1          ; ga spaties overslaan
                dey                     ; zet command line pointer 1 terug
cliv_2          iny                     ; verhoog command line pointer
                inx                     ; verhoog tabel index
cliv_5          lda clitab,x            ; lees karakter uit tabel
                bmi cliv_6              ; spring bij einde statement
                cmp clbuffer,y          ; vergelijk met buffer
                beq cliv_2              ; spring indien gelijk
                dex                     ; verlaag tabel index
cliv_3          inx                     ; verhoog tabel index
                lda clitab,x            ; lees volgend teken uit tabel
                bpl cliv_3              ; volgende lezen als niet einde stat.
                inx                     ; verhoog tabel index
                lda clbuffer,y          ; lees teken uit buffer
                cmp #'.'                ; test op afkorting
                bne cliv_4              ; geen afk., zoek volgend statement
                iny                     ; wel afk., verhoog buffer pointer
                dex                     ; verlaag tabel pointer
                bcs cliv_5              ; zoek verder
cliv_6          sta oscliparm+4         ; zet msb van adres in zeropage
                lda clitab+1,x          ; lees lsb van adres uit tabel
                sta oscliparm+3         ; zet in zeropage
                clc                     ; wis carry
                ldx #0                  ; reset tabel pointer
                jsr cliv_run            ; voer *-commando uit
                ldy oscliparm+2         ; herstel accu, x en y registers
                ldx oscliparm+1
                lda oscliparm
                rts                     ; einde cli routine

cliv_run        jmp (oscliparm+3)       ; voer statement uit, y=bufferpointer

cli_error       brk                     ; genereer foutmelding
                .db $FE                 ; error code
                .db "Bad command"       ; error tekst
                .dw 0                   ; einde string

clitab          .db "ATOM"      , >atom,        <atom
                .db "HELP"      , >help,        <help
                .db "PC"        , >exit,        <exit
                .db               >cli_error,   <cli_error


************************************************************************
;* Commando's                                                          *
;***********************************************************************

atom            lda #$00                ; zet write protect uit
                sta systemlatch
                sta $1FFD               ; disable bbc mosrom
                jsr zetsem              ; wacht op pc communicatie
                lda #$5B                ; genereer reset
                jsr pccom
                lda #$5D
                jmp oszendbyte          ; exit bbc omgeving . . .

help            jsr print               ; druk os versienummer af
                .db "MOS extension rom v1.0"
                .db 10,13,$EA
                rts                     ; einde routine

exit            jsr print               ; druk melding af
                .db "BBC Basic is shutting down ... ",$EA
                jsr zetsem              ; zet semafoor
                lda #$15                ; sluit terminal programma af
                jmp pccom               ; en exit

