 ;***********************************************************************;
;*        P c D F S  : PC DISK FILING SYSTEM VOOR BBC BASIC            *;
;*---------------------------------------------------------------------*;
;*    doel           : Disk Filing System MOS EXT ROM voor             *;
;*                     disk I/O op Atom-in-PC BBC Basic                *;
;*---------------------------------------------------------------------*;
;*    filenaam       : pcdfs2.asm                                      *;
;*    auteur         : Roland Leurs                                    *;
;*                     The Atomic Development Studio                   *;
;*    ontwikkeld     : juli 1996                                       *;
;*    laatste update : maart 1998                                      *;
;*---------------------------------------------------------------------*;
;*    assembleren    : x6502 pcdfs                                     *;
;*---------------------------------------------------------------------*;
;*    oproep         : automatisch na BREAK                            *;
;***********************************************************************;
                .list on
                org $A000-16

pcheader        .dw     pcheader+16, init
                .dw     0,0,0,0,0,0

                include definiti.inc

;***********************************************************************
;* Initialisatie van PcDFS MOS EXT ROM                                 *
;***********************************************************************

init            .db $BE                 ; herkenningsbyte $BE
                jmp mosextinit          ; entry: spring naar initialisatie
                jmp mosextmsg           ; entry: spring naar message
                .db $2A,<clitab,>clitab ; entry: command line interpreter
                .db $00,$00,$00         ; entry: osbyte uitbreiding
                .db $00,$00,$00         ; entry: osword uitbreiding

mosextinit      rts                     ; snel klaar

mosextmsg       jsr print               ; druk volgende tekst af
                .db "PcDFS auxilary rom"
                .db 13,10,$EA
                rts                     ; einde routine

version         .db "1.00",0            ; versie string


clitab          .db "ATOM"      , >atom,        <atom
                .db "HELP"      , >mosextmsg,   <mosextmsg
                .db "LIB"       , >lib,         <lib
                .db "PC"        , >exit,        <exit
                .db "RESET"     , >reset,       <reset
                .db "TV"        , >tv,          <tv
                .dw $FFFF

************************************************************************
;* Diverse hulproutines                                                *
;***********************************************************************

; 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

commando        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

savepar         sta par_a               ; zet parameters in call werkruimte
                stx par_x
                sty par_y
                rts

filenaam        ldy #1                  ; zet pointer
filenaam0       lda (parm),y            ; kopieer adres filenaam naar zp
                sta zp,y
                dey
                bpl filenaam0
filenaam1       ldy #0                  ; reset pointer
filenaam2       lda (zp),y              ; lees karakter
                cmp #$0D                ; test op einde string
                beq filenaam3           ; spring indien einde naam
                jsr zendbyte            ; stuur karakter naar pc
                iny
                bne filenaam2           ; spring voor volgend karakter
filenaam3       lda #$00                ; laadt code voor einde filenaam
                jmp zendbyte            ; stuur naar pc en einde routine

ascii2nibble    cmp #'0'                ; vergelijk met '0'
                bcc a2n_error           ; indien kleiner geen geldig digit
                cmp #'9'+1              ; vergelijk met '9+1'
                bcc a2n_l1              ; indien kleiner dan geldig digit
                and #$DF                ; maak hexadecimale digit
                sbc #$07
                bcc a2n_error           ; error als kleiner dan 'A'
                cmp #$40                ; test op 'F'
                bcs a2n_error           ; indien groter geen geldig digit
a2n_l1          sec                     ; zet carry voor aftrekken
                sbc #'0'                ; trek er ascii '0' af
                rts                     ; einde routine

a2n_error       brk
                .db 28
                .db "Bad hex"
                .db 0

************************************************************************
;* Commando's                                                          *
;***********************************************************************

atom            lda schaduwbyte         ; zet write protect uit
                and #$BF
                sta systemlatch
                sta $1FFD               ; disable bbc mosrom
                jsr zetsem              ; wacht op pc communicatie
                lda #$5B                ; genereer reset
                jsr commando
                lda #$5D
                jmp oszendbyte          ; exit bbc omgeving . . .

exit            jsr print               ; druk melding af
                .db "BBC Basic is shutting down ... ",$EA
                jsr zetsem              ; zet semafoor
                lda #$15                ; sluit terminal programma af
                jsr commando            ; en exit
                jsr wissem              ; reset semafoor
tv              rts                     ; BBC Basic werkt gewoon door

lib             ldx #0                  ; reset pointer
                jsr skipspace1          ; lees teken van command line
                cmp #$0D                ; test op lege parameter
                beq lib2                ; spring indien leeg.
lib1            jsr skipspace1          ; lees teken van command line
                sta library,x           ; zet in library path
                inx                     ; verhoog pointer
                iny
                cmp #$0D                ; test op einde string
                bne lib1                ; spring als nog tekens volgen
                rts
lib2            lda library,x           ; lees teken van library path
                jsr oswrch              ; druk af
                inx                     ; verhoog index
                cmp #$0D                ; test op einde string
                bne lib2                ; spring indien nog tekens volgen
                jmp osnewl              ; einde routine

reset           jsr zetsem              ; zet semafoor
                lda #$5B                ; zet reset type #2 (soft reset)
                jsr commando
                lda #$5C
                jsr oszendbyte
                lda #2
                jsr oszendbyte
                lda #$5B                ; geef reset commando aan pc
                jsr commando
                lda #$5D
                jmp oszendbyte          ; en krijg een reset
