Mercurial > hg > Members > kono > nitros9-code
changeset 1954:e5ad0755bf40
Added HawkSoft's CDF to standard.bl files
Robert Gault's dirsort added to standard commands
author | boisy |
---|---|
date | Tue, 20 Dec 2005 15:18:10 +0000 |
parents | 8ae0268695b7 |
children | b377521221d9 |
files | level1/cmds/dirsort.asm level2/coco3/bootlists/standard.bl level2/coco3_6309/bootlists/standard.bl |
diffstat | 3 files changed, 400 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/dirsort.asm Tue Dec 20 15:18:10 2005 +0000 @@ -0,0 +1,364 @@ +****************************************************************** +* dirsort - Directory sorting utility +* +* This is an asm version of a Basic09 directory sort +* that was published in a Coco newsletter. +* Original and ml routine by Robert Gault, Nov. 2005 +* +* The program uses a version of Shellsort published +* in a May 1983, BYTE article by Terry Barron and +* George Diehr (both at University of Washington) +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------- +* 1 2005/12/19 Robert Gault +* Very fast and fairly simple + + NAM dirsort +* This ensures the assembler knows predefined OS-9 terms + IFP1 + USE defsfile + ENDC + +TyLg SET Prgrm+Objct program object code +* Re-entrant means multiple users possible +AtRev SET ReEnt+Rev re-entrant, revision 1 +Rev SET 1 + +* Create module header, needed by all OS-9 modules + MOD Eom,Name,TyLg,AtRev,Start,Size +* Data area +DPptr RMB 2 pointer to our direct page +dirsize RMB 2 size of the directory less 64 bytes +count RMB 2 number of directory entries +entryI RMB 2 pointer to nameI +entryJ RMB 2 pointer to nameJ +entryID RMB 2 pointer to name(I+D) +Tx RMB 32 buffer for transfer +i RMB 2 index +j RMB 2 index +NminusD RMB 2 holds last value of FOR I/NEXT loop +path RMB 1 value for path to the directory +D RMB 2 shellsort constant + RMB 40 +stack EQU . +Size EQU . This initial data space will be increased as OS-9 +* assigns space in pages of 256 bytes. Initially the stack will +* not be here. +buffer EQU . This will be the start of the data array in memory +* to be requested from OS-9 as needed. + +Name EQU * + FCS /dirsort/ + FCB 1 edition number +* Ego stroking :) identifier + FCC /Written by Robert Gault, 2005/ + +* Default directory name, dot, or current directory +default FCB C$PERD,C$CR + +* Solutions for N,2^INT(LN(N)) -1 +* We don't need general logs just specifc values so +* they were pre-calculated +Dtable FDB 2,0 + FDB 7,1 + FDB 20,3 + FDB 54,7 + FDB 148,15 +* If your directory has more entries than several hundred, you +* need to learn how to organize your disk/drive. + FDB 403,31 + FDB 1096,63 +* This next will exceed normal memory limits but is needed +* for values up to about 2000. We could just put $FFFF/32= +* 2047 but there are size checks in the code. + FDB 2980,127 +DTEnd EQU * + +Start EQU * + stu <DPptr save the direct page pointer + leas stack,u put the stack where we want it or it will be +* inside the directory buffer and crash the program. + cmpd #0 are there any parameters? + beq noprm +l1 lda ,x+ skip over spaces, if any + cmpa #C$SPAC + beq l1 + cmpa #C$CR if only spaces, same as noprm + bne a1 +noprm leax default,pcr point to default directory, dot + bra a9 +a1 cmpa #'? if "?" then show syntax + lbeq syntax + cmpa #'- if attempt at options, syntax + lbeq syntax + leax -1,x backstep to first character of directory +a9 lda #%11000011 directory, single user access, update + os9 I$Open attempt to open a path to the directory + lbcs error + sta <path save the path # + ldb #SS.Size get the size of the directory + os9 I$GetStt size reported in regs X&U + cmpx #0 MSB of size + lbne Tlarge too big to sort + tfr u,d evaluate the size + cmpd #128 two entries other than .. and . + lblo getreal can't sort 1 item or less + subd #64 reduce size by 64 bytes for .. and . + std <dirsize save size in bytes + addd #Size we need current data + directory buffer + os9 F$Mem request space for the buffer + lbcs Tlarge can't get enough memory + lda <path recover path to the directory + ldx #0 MSB position + ldu #64 LSB, past the entries .. and . + os9 I$Seek skip over the entries + ldu <DPptr recover DP pointer + ldy <dirsize data size in bytes + leax buffer,u point to our buffer + os9 I$Read transfer the directory information to buffer +* Calculate the number of directory entries +* Divide size by 32 bytes per entry. INT(size/32)must=size/32 or +* the directory is corrupted. So, ignore remainder. + ldx #0 initialize counter + ldd <dirsize this does not include . and .. + IFNE H6309 + lsrd + lsrd + lsrd + lsrd + lsrd + ELSE + lsra + rorb + lsra + rorb + lsra + rorb + lsra + rorb + lsra + rorb + ENDC + std <count + leax Dtable,pcr precalculated constants + leay DTEnd,pcr + pshs y +l3 cmpd ,x + bls a4 if fewer or equal # of entries get D + leax 4,x move to next table entry + cmpx ,s have we exhausted the table? + bne l3 + leas 2,s restore the stack + lbra Tlarge should not be possible to get here in code +a4 leas 2,s restore the stack + ldd 2,x get shellsort D from table + std <D save working value +* Sort starts here +* Directory entries can't have duplicate names or the directory +* is corrupted. That means a<b is as good as a<=b when testing. +s2 ldd #1 initialize FOR/NEXT loop + std <i + ldd <count same as n in Basic09 program + subd <D + std <NminusD save value +* calculated pointer for entryID +s6 ldd <i FOR i=1 TO n-D STEP 1 + addd <D get pointer for entry(i+D) + lbsr point get the pointer value + stx <entryID + tfr x,y +* calculate pointer for entryI + ldd <i + lbsr point + stx <entryI +* Compare the entry pointed to by regX against that for regY + lbsr compare is name(i) < name(i+D) + bcs s20 + ldx <entryID + leay Tx,u shellsort swap name holder + lbsr movexy name(Tx)=name(i+D) + ldx <entryI + ldy <entryID + bsr movexy name(i+D)=name(i) + ldd <i + cmpd <D + bhi s4 this was a Basic09 IF/THEN + ldy <entryI inside the IF/THEN + leax Tx,u + bsr movexy name(i)=name(Tx) + bra s20 ends the IF/THEN +s4 ldd <i initialize FOR/NEXT loop + subd <D + std <j +s5 bsr point FOR j=i-D TO 1 STEP -D + stx <entryJ + tfr x,y + leax Tx,u + lbsr compare is entry(Tx) > entry(j) + bcc s10 + ldd <j + addd <D name(j+D) + bsr point + tfr x,y + ldx <entryJ + bsr movexy name(j+D)=name(j) + ldd <j NEXT j + subd <D STEP -D + std <j + cmpd #1 stop if less than 1 + bge s5 +s10 leay Tx,u + ldd <j + addd <D + bsr point + exg x,y + bsr movexy name(j+D)=name(Tx) +s20 ldd <i NEXT i + addd #1 STEP +1 + std <i + cmpd <NminusD + bls s6 stop if i>(n-D) + ldd <D D=D/2 + IFNE H6309 + lsrd + ELSE + lsra + rorb + ENDC + std <D + cmpd #1 + lbhs s2 WHILE D>0 + lda <path rewind to just after .. & . + ldx #0 + ldu #64 + os9 I$Seek + lda <path + ldu <DPptr + leax buffer,u write out sorted directory + ldy <dirsize + os9 I$Write + clrb + os9 F$Exit release memory, close paths, and return to OS-9 + + IFNE H6309 +movexy ldw #32 + tfm x+,y+ + rts + ELSE +movexy ldb #16 move the entry pointed to in regX to + pshs b +sw1 ldd ,x++ that pointed to by regY + std ,y++ + dec ,s if not finished, continue + bne sw1 + puls b,pc + ENDC + +* Converts an index in regD to a memory offset in regX +* This could easily overflow but there are size checks +* in the above code so there is no overflow test. +point leax buffer,u + subd #1 + IFNE H6309 + lsld + lsld + lsld + lsld + lsld + ELSE + lslb + rola + lslb + rola + lslb + rola + lslb + rola + lslb + rola + ENDC + leax d,x + rts + +compare ldb #29 size of name field + pshs b save counter +cloop ldb ,y+ get character + lda ,x+ get character + beq c1 if deleted go + tstb + beq c2 if deleted go + tsta + bmi c5 if last character go + tstb + bmi c6 if last character go + pshs b + cmpa ,s+ + beq c4 if equal, test next character + bra cx +c1 clra + bra cx return + +c2 coma + bra cx return - +c3 anda #$7f + andb #$7f + pshs b + cmpa ,s+ + rts +c5 bsr c3 + beq c2 + bra cx +c6 bsr c3 + beq c1 + bra cx return result +c4 dec ,s + bne cloop + clra should not be able to get here in code +cx puls b,pc return result + +error leax nodir,pcr + ldy #endnd-nodir +write lda #1 screen + os9 I$Write + clrb + os9 F$Exit +nodir EQU * + FCC /Directory does not exist!/ + FCB C$CR,C$LF +endnd EQU * + +Tlarge leax big,pcr + ldy #endbig-big + bra write +big EQU * + FCC /Either the directory is too large or there is insufficient / + FCC /memory./ + FCB C$CR,C$LF +endbig EQU * + +getreal leax huh,pcr + ldy #endhuh-huh + clr ,-s + bra write +huh EQU * + FCC /Get real! You can't sort less than 2 items./ + FCB C$CR,C$LF +endhuh EQU * + +syntax leax usage,pcr + ldy #enduse-usage + clr ,-s + lbra write +usage FCC /USAGE: dirsort will sort any directory. If no directory/ + FCB C$CR,C$LF + FCC / name is given, the current directory will be sorted./ + FCB C$CR,C$LF + FCC /EX: dirsort dirsort . dirsort ../ + FCB C$CR,C$LF + FCC " dirsort /dd/cmds" + FCB C$CR,C$LF +enduse EQU * + + EMOD +Eom EQU *
--- a/level2/coco3/bootlists/standard.bl Tue Dec 20 15:17:26 2005 +0000 +++ b/level2/coco3/bootlists/standard.bl Tue Dec 20 15:18:10 2005 +0000 @@ -18,6 +18,24 @@ ../MODULES/SYSMODS/init * *************************************** +* CDF Section (HawkSoft) +* +*../MODULES/CDF/cdf.mn +* +* CDF descriptors - select as needed +* SCSI descriptors (IDs 0-6) +*../MODULES/CDF/sc0.dd +*../MODULES/CDF/sc1.dd +*../MODULES/CDF/sc2.dd +*../MODULES/CDF/sc3.dd +*../MODULES/CDF/sc4.dd +*../MODULES/CDF/sc5.dd +*../MODULES/CDF/sc6.dd +* IDE descriptors (master/slave) +*../MODULES/CDF/ic0.dd +*../MODULES/CDF/ic1.dd +* +*************************************** * RBF Section * ../MODULES/RBF/rbf.mn
--- a/level2/coco3_6309/bootlists/standard.bl Tue Dec 20 15:17:26 2005 +0000 +++ b/level2/coco3_6309/bootlists/standard.bl Tue Dec 20 15:18:10 2005 +0000 @@ -18,6 +18,24 @@ ../MODULES/SYSMODS/init * *************************************** +* CDF Section (HawkSoft) +* +*../MODULES/CDF/cdf.mn +* +* CDF descriptors - select as needed +* SCSI descriptors (IDs 0-6) +*../MODULES/CDF/sc0.dd +*../MODULES/CDF/sc1.dd +*../MODULES/CDF/sc2.dd +*../MODULES/CDF/sc3.dd +*../MODULES/CDF/sc4.dd +*../MODULES/CDF/sc5.dd +*../MODULES/CDF/sc6.dd +* IDE descriptors (master/slave) +*../MODULES/CDF/ic0.dd +*../MODULES/CDF/ic1.dd +* +*************************************** * RBF Section * ../MODULES/RBF/rbf.mn