BDOS:   EQU   5

CHKFIL: ; Zet drive + filenaam (die bv. op commandline staat) in FCB.
; In: HL = eerste letter (drive +) filenaam
;     DE = adres FCB
; Uit: HL = eerste adres achter naam
;      Cy=1: Er is een "/" gevonden. (HL staat nu op "/")
;      Z=1: Geen filenaam gegeven ('drive' is nu wel veranderd, rest niet.)
;      als Z=0: C=0 als geen extensie gegeven, C=255 als wel extensie gegeven.
; Verandert; AF,HL,DE,BC

;         (toegestaan: 2 * alfabet, cijfers, ! # $ & ' ( ) - @ ^ _ ` { } ~
;          niet toegestaan: alles <32 en >126, " % * + , : ; < = > ? [ \ ] |
;          . slechts een keer toegestaan, hoogstens 8 kars ervoor en 3 erachter
;          als er een / voorkomt, wordt niet verder gekeken.)

        XOR   A
CHKFI1: LD    (DE),A          ; zet default drive
        INC   DE
        CALL  RDCH2
        RET   Z
        CP    "."
        JR    Z,E_NAME
        PUSH  HL
        LD    BC,0900H        ; 8 letters + 1. C=0 bij naam, 255 bij extensie
        JR    CHKFI3

CHKCOL: LD    A,B             ; Check dubbele punt
        CP    8
        JR    NZ,E_NAME       ; Is niet 2e teken
        POP   HL
        LD    A,(HL)
        AND   0DFH
        SUB   64
        JR    Z,E_DRIV
        CP    9
        JR    NC,E_DRIV
        INC   HL
        INC   HL
        DEC   DE
        JR    CHKFI1

CHKDOT: ; Punt: LDIR naam. B=1-8
        AND   C               ;  !A<>0
        JR    NZ,E_NAME       ; dit is de 2e punt al
        POP   HL
        LD    A,9             ; Vul naam in
        CALL  CHKMOV
        INC   HL              ; nu weer achter punt
        PUSH  HL
        LD    BC,04FFH        ; Ga extensie zoeken

CHKFI2: CALL  RDCH2           ; Lees volgende karakter
        JR    Z,CHKEND
        CP    "."
        JR    Z,CHKDOT
CHKFI3: INC   HL
        CP    32              ; Check karakter
        JR    C,E_NAME        ; <32
        CP    34
        JR    Z,E_NAME        ; "
        CP    "%"
        JR    Z,E_NAME
        CP    "*"
        JR    C,CHKOK         ; ! # $ & ' ( )
        CP    "-"
        JR    C,E_NAME        ; * + ,
        CP    ":"
        JR    C,CHKOK         ; -, getal   (. en / zijn al gedaan)
        JR    Z,CHKCOL
        CP    "@"
        JR    C,E_NAME        ; ; < = > ?
        CP    "["
        JR    C,CHKOK         ; @ hoofdletters
        CP    "^"
        JR    C,E_NAME        ; [ \ ]
        CP    "|"
        JR    Z,E_NAME        ; |
        CP    127
        JR    NC,E_NAME       ; >126
CHKOK:  DJNZ  CHKFI2
E_NAME: CALL  PRINT
        DB    13,10,"Bad file name$"
E_DRIV: CALL  PRINT
        DB    13,10,"Bad drive name$"

CHKEND: ;einde filenaam. Zet naam/extensie nog in FCB neer.
        POP   HL
        INC   A               ; reset Z-vlag (A is nooit 255)
        PUSH  AF
        AND   C
        JR    NZ,CHKEXT
        LD    A,9
        CALL  CHKMOV
        LD    (DE),A
        INC   DE
        LD    (DE),A
        INC   DE
        LD    (DE),A
        POP   AF
        RET
CHKEXT: LD    A,4
        CALL  CHKMOV          ; In deze versie: Zet extensie niet als niet
        POP   AF              ;  gegeven.
        RET

CHKMOV: ; Verplaats filenaam naar FCB
;         In: A=9 (naam) of 4 (ext)
        PUSH  BC
        SUB   B
        JR    Z,CHK4
        LD    C,A
        LD    B,0
        LDIR                  ; Vul filenaam
CHK4:   POP   BC
        LD    A,32
        JR    CHK2
CHK3:   LD    (DE),A          ; Zet spaties
        INC   DE
CHK2:   DJNZ  CHK3
        RET

PRINT:  POP   DE
        LD    C,9
        CALL  BDOS
        JP    0

RDCH2:  LD    A,(HL)
        OR    A
        RET   Z
        CP    13
        RET   Z
        CP    32
        RET   Z
        CP    "/"
        SCF
        RET




 Z
        CP    13
        RET   Z
        CP    32
        RET   Z
        CP    "/"
        SCF

