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 >>> >> >> >
