Boy I wish we could all agree on variable names in M100!

here is my assessment of what you've done-

1)  you are using the wrong starting location.  Think you need to use the
ASCTAB (DOSTART?) location which is the lowest first byte of .DO file data.
2)  you need to ensure your new directory entry gets the correct
(incorrect) address , meaning you need to trick LNKFIL (DIROK?) to order
the file names correctly.  in this case ASCTAB-1. in this way the current
directory entry, that points to ASCTAB, will be ordered and linked
correctly.

make sense?
and I agree with John, without the NEC reference I would never have gotten
REX to work.


On Wed, Oct 25, 2017 at 4:59 PM, Stephen Adolph <[email protected]>
wrote:

>
>
> Here is some code to look at.
> do you run LNKFIL afterwards? you must!
>
> note you must ensure the address of the new file name in the ram directory
> is 1 less than the actual starting location to ensure LNKFIL orders the
> file names correctly.
>
>
>
> ramfile_copy_DO:            ; new directory entry address in TEMP3
>                     ; source directory entry at input buffer
>
>                     ; ASCTAB-1 start of new file in directory entry
>                     ; make xx byte hole at ASCTAB, xx is file length incl
> EOF
>                     ; copy data to hole
>                     ; LNKFIL
>
>     lhld    BINTAB            ; hl points to injection point
>     shld    TEMP3            ; store injection point in TEMP3
>     dcx    h
>     shld    TEMP1            ; start address for new directory entry in
> TEMP1
>
>     call    ramcopy_makehole    ; make the hole
>     call    ramfile_copy_file    ; copy the data into the hole
>     jmp    rammenu_loop0        ; done
>
> ;-----------------------------------------------------------
> ----------------
> ramcopy_makehole:
>
>     lhld     TEMP4        ; get length of file
>     push    h        ; on stack
>
>   ........
>
>     pop    b            ; length of file in bc
>
>     lhld    TEMP3            ; hl is injection point
>
>     rst    6
>     .dw    MAKHOL            ; make hole BC long at HL, adjusting pointers
>
> ; MAKHOL adjusts BINTAB, VARTAB, ARYTAB
> ; MAKHOL does not adjust ASCTAB, needed by LNKFIL
>
>
>     jc    ramfile_copy_fail4    ; jump here if not enough space
>
>     ret
>
>
> ;-----------------------------------------------------------
> ----------------
> ramfile_copy_file:            ; copy the data into the hole
>
>                     ; TEMP2 new directory entry address
>                     ; INPUT_BUFFER source directory entry, points to
> source file
>                     ; TEMP3 injection point of new file
>                     ; TEMP1 start address for directory entry
>                     ; TEMP4 size
>                     ; TEMP5 source data (system file)
>
>     lhld    TEMP4
>     mov    b,h
>     mov    c,l            ; get size in BC
>
>     lhld    TEMP3            ; target in hl
>     xchg                ; target in de
>
>     lda    DSTATE
>     ani    10000000b
>     jz    ramfile_copy_file_1
>                     ; use when in ram file mode
>     lhld    INPUT_BUFFER+1d
>     call    fix_hl_mode        ; correct hl for lower block
>
>                     ; hl source, de target
>     call    ramfile_copy_block    ; copy block
>     jmp    ramfile_copy_file_2
>
> ramfile_copy_file_1:                ; use when copying system files
>     lhld    TEMP5            ; hl = source
>                     ; hl source, de target
>     xchg                ; de source hl target
>     call    MOVEB_D_H        ; mov bc bytes from de to hl
>
> ramfile_copy_file_2:
>
>     lhld    TEMP2            ; TEMP2 holds pointer for new directory entry
>     inx    h
>     xchg
>     lhld    TEMP1            ; start address for directory entry in hl
>     shlx                ; store new start of file into new directory entry
>
>     rst    6
>     .dw    LNKFIL            ; fix up directory
>
>
>     ret
>
>
> On Wed, Oct 25, 2017 at 4:40 PM, Stephen Adolph <[email protected]>
> wrote:
>
>> willard, would commented assembly help?
>> I have this working in REX Manager...
>>
>>
>> On Wed, Oct 25, 2017 at 4:20 PM, Willard Goosey <[email protected]> wrote:
>>
>>> So, there is this (from Mike Nugent's RAM-ROM file)
>>>
>>> ;2239H - Insert entry into directory.
>>> ;         Entry:
>>> ;               HL - Points to empty directory slot
>>> ;               DE - Contains address of file in RAM
>>> ;                A - Attribute (80h=.BA, C0h=.DO, A0h=.CO, etc.)
>>> ;         Note: Routine gets filename from FC93H, where it must be
>>> ;       stored,padded with spaces, no delimiter.
>>> ;         Exit: DE - Unchanged
>>>
>>> And I have the ROM call itself working in smallclib... but this is only
>>> part of the story. To use this successfully (ie without causing a cold
>>> start) we need to know more about it.
>>>
>>> I've been trying to create a .DO file.
>>>
>>> 1) Where do yo get a starting address for the file? I've tried every
>>> variant of COSTART (FBB0h) and DOSTART (FBAEh). At best I can get is
>>> intact DO files and the CO file directory entries switched around (using
>>> COSTART-1). DOSTART results in the text files being switched around and
>>> the binary files remaining correct. Anything else (COSTART or
>>> DOSTART-1) leads to file corruption and/or cold starts.
>>>
>>> 2)Is there a second directory-repair routine, besides DIROK (2146h)?
>>> Because DIROK() is not being sufficient. :-(
>>>
>>> Here is the test code. DO NOT USE!!!!
>>> /*tmf.c
>>>  *Test MakFil
>>>  *test for Model 100 Small C-85 Library
>>>  *
>>>  *Willard Goosey
>>>  *[email protected]
>>>  *10/19/2017
>>>  */
>>>
>>> #include "m100vars.h"
>>> #include "dir.h"
>>>
>>> /*MAKFIL extension bytes: */
>>> #define BA 0x80
>>> #define DO 0xC0
>>> #define CO 0xA0
>>>
>>> main(char A, char *HL)
>>> {
>>>   char *name;
>>>   struct dir *slot;
>>>   char *start;
>>>   int i;
>>>
>>>   name= "RTMF1.DO";
>>>   start= COSTART-1; //start at beginning of CO files
>>>
>>>   slot=FREDIR();
>>>
>>>   hex16(start);CRLF();
>>>
>>>   prsnam(name,strlen(name));
>>>
>>>   hex16(makfil(slot,start,DO)); CRLF();
>>>   if(makhol(1,start)<0)
>>>   {
>>>     BEEP();
>>>     MENU();
>>>   }
>>>   *start=0x1a;
>>>  //makfil doesn't autoinsert EOF
>>>   DIROK();
>>> }
>>>
>>> HELP!!!!
>>> Willard
>>> --
>>> Willard Goosey  [email protected]
>>> Socorro, New Mexico, USA
>>> I search my heart and find Cimmeria, land of Darkness and the Night.
>>>   -- R.E. Howard
>>>
>>
>>
>

Reply via email to