1 REM Ins{nd av Kristoffer Eriksson SYSOP <5357>    1987-01-05 00.56.39 (DUMP)
; Fil: ENDREL(6).ASM
; Av:  Kristoffer Eriksson, "SKE", 1984
;
;-Ver--/-Datum----/-Sign-/-Kommentar-----------------------------
; 1.1  / 84-09-28 / SKE  /
; 1.2  / 84-10-24 / SKE  / Filnamn f|r CHAIN h{mtas vid 63747 (dosbuf 4).
; 1.25 / 84-11-21 / SKE  / (?)
; 1.3  / 85-03-12 / SKE  / Patchbart filnamn "HARDFILE", Flytta 63747 lite.
; 1.4  / 85-03-12 / SKE  / HARDFILE utbytt mot ST[LLPAR:s PARM:-metod.
; 1.5  / 86-05-23 / SKE  / Filnamn i dosbuf0, ej 4. F|r CLINEPAR.
; 1.6  / 86-12-12 / SKE  / Filnamn kvar i input-buf, refereras med pekare.
;
;
; Inneh}ller kontroll av filnamn utpekat av CHAINFILE, och CHAIN.
; Filnamnet kan ocks} st{llas in med ST[LLPAR, vilket i s} fall anv{nds
; i andra hand.
;
; CHAINFILE {r adressen f|r en pekare till ett filnamn, en l{ngdangivelse,
; och ett kontrolltal, vilka initieras i ENDINIT.ASM ver 1.1. Denna pekar
; vanligtvis p} den del av input-bufferten ((Y.CMDSP)-160) d{r den avslutande
; CHAIN-filen finns angiven bland kommandoradsparametrarna.
;
; VARNING: F|rst|r inte inneh}llet i bufferten, och g|r inget som f}r andra
; rutiner att tro att det utrymmet {r ledigt (som att {ndra Y.CMDSP), utan
; att flytta pekaren och dess text f|rst.
;
; Det filnamn som utpekas kan {ven f|ljas av ytterligare parametrar f|r det
; programmet, om de f|reg}s av ett kommatecken, eftersom CHAIN (eller snarare
; OPNCMD) bara anv{nder texten fram till komma.
;
; Dessa parametrar kommer att fungera i det anropade programmet, eftersom
; BASIC-CHAIN alltid kopierar den utpekade filnamnsstr{ngen till aktuell
; (som den f}s av (Y.CMDSP)-160) input-buffert. Detta betyder ocks} att
; bufferten inte f}r flyttas s} att den b|rjar inne i filnamnsstr{ngen, f|r
; d} blir f|rst}s LDIR-kopieringen virrig.
;
; Eftersom CHAINFILE l{ggs p} en fast adress annan {n en dosbuffert numera,
; {r det fritt fram att anv{nda alla dosbuffertar vad ENDREL anbelangar.
; (Gl|m dock inte sj{lva relokeringsrutinen.)
;
            EXTERN CHAINFILE, CHAINCHECK

Y.RND:      =     65351
CHAINFILE:  =     Y.RND+1            ; Placeras i slutet av slumptalsbuffert.
CHAINCHECK: =     165

; CHAINFILE: DEFW Pointer to text    ; +0
;            DEFB Lengt of text      ; +2
;            DEFW Check-number       ; +3

BEGIN:      LD    A,(CHAINFILE+3)    ; Kolla korrekt initierat.
            CP    CHAINCHECK
            JR NZ HARD
            LD    HL,(CHAINFILE)     ; Kolla pekarna till filnamnet ur
            LD    A,H                ;  kommandoparametrarna.
            AND   A
            JR Z  HARD
            LD    A,(CHAINFILE+2)
            AND   A
            JR Z  HARD
            CP    158
            JR C  RETUR

HARD:       LD    A,(HARDFILE.LEN)   ; Kolla inbyggt (patchbart) filnamn.
            LD    HL,HARDFILE
            AND   A
            JR NZ RETUR              ; L{ngden 0 = inget inbyggt filnamn.

NULCHAIN:   LD    HL,NULLFILE        ; Sista alternativet: NUL.
            LD    A,NULLFILE.LEN

RETUR:      POP   DE                 ; Lyft upp returadressen fr}n stacken.
            PUSH  HL                 ; Namnets adress
            LD    C,A
            LD    B,0
            PUSH  BC                 ; Namnets l{ngd
            PUSH  DE
            RET                      ; Retur


NULLFILE:   DEFM  "NUL:"
NULLFILE.LEN: =   * - NULLFILE

              DEFB 255             ; Signal f|r parameterst{llning.
              DEFM "PARM:Fil som chainas efter exekvering:"
              DEFB 0,0,0,16        ; Str{ngslut, Typ, Min l{ngd, Max l{ngd,
HARDFILE.LEN: DEFB 0               ; L{ngd
HARDFILE:     DEFS 16+1,0          ; Utrymme f|r filnamnet.

              DEFB 255
              DEFM "PARM:"
              DEFB 255             ; Inga fler parametrar i denna programfil.

            REL   PUSH BEGIN
            REL   CALL
            REL   CHAIN
            REL   PUSH NULLFILE      ; CHAIN "NUL:" om den f|rra misslyckades
            REL   PUSH 4
            REL   CHAIN
