1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-23 02:48:48 +00:00

391 lines
5.9 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-*-Midas-*-
Title :FDIR - Fast DIRectory listing.
A=1 ;G. Porp.
B=2
C=3
D=4
E=5
T1=6
T2=7
T3=10
J=11
M=12
AR=13
P=17
Call=<PUSHJ P,>
Return=<POPJ P,>
TTYi==1
TTYo==2
UFDi==3
MFDi==4
PDLen==10
JCLen==10
;;;
;;;;;
;;;
.INSRT SYSTEM;FSDEFS >
.INSRT SYSEN3;GREN MACROS
;;;
;;;;;
;;;
PDList: -PDLen,,.
Block PDLen
JCLbuf: Block JCLen
-1
Tsint: Loc 42
-TsintL,,Tsint
Loc Tsint
P
0 ? 1_TTYi ? -1 ? 1_TTYo ? Intrup
0 ? 1_TTYo ? 0 ? 0 ? More
TsintL==.-Tsint
Device: Sixbit /DSK/
Sname: 0
FN1: 0
FN2: Sixbit /(DIR)/
SWild: 0
SFree: Block 6
SChar: Block 6
DFree: Block 6
DChar: Block 6
ArWild: 0
LoseOK: 0
FDefs: Block 4
Free: Block 6
Char: Block 6
NPairs: 0
;;;
;;;;;
;;;
Begin: Move P,PDList
Syscal OPEN,[%Clbit,,.uao\%TJDIS
%Climm,,TTYo
[Sixbit /TTY/]]
.Lose %LsFil
Syscal OPEN,[%Clbit,,.uai
%Climm,,TTYi
[Sixbit /TTY/]]
.Lose %LsFil
.Suset [.sOPTION,,[Optint,,]] ;New-style interrupts
.Suset [.sMSK2,,[1_TTYi+1_TTYo]]
Syscal TTYVAR,[%Climm,,TTYo
[Sixbit /WIDTH/]
%Clout,,T1]
.Lose %LsSys
Addi T1,2
IDivi T1,16.
Movem T1,NPairs
.Break 12,[..rJCL,,JCLbuf]
Skipn JCLbuf
Jrst dFalt
Move J,[440700,,JCLbuf]
Parse: Setzb A,D ;Word, # *'s
Setzb B,Free
Move T1,[Free,,Free+1]
BLT T1,Char+5
Move C,[440600,,A]
PgChar: Ildb T1,J
Caie T1,^M
Cain T1,^C
Jrst Check
Caie T1,40 ;<Space>
Cain T1,";
Jrst Check
Caie T1,":
Cain T1,^_
Jrst Check
Cail B,6 ;Only 1st 6 character per word are significant
Jrst PgChar
Cain T1,"*
Jrst [Setom Free(B) ;Flag this char as W*I*L*D
Aoja D,Pg2]
Cail T1,"a
Trz T1,40 ;lc -> UC
Pg2: Subi T1,40 ;7bit -> 6bit
Idpb T1,C
Movem T1,Char(B)
Aoja B,PgChar
Check: Jumpe A,dFalt
Caie T1,":
Jrst Check1
Jumpn D,[And A,[777700,,0] ;Only look at two two letters
Came A,[Sixbit /AR/]
.Value [Ascii /: Can't wildcard that device? KILL /]
Setom ArWild
Move T1,[Free,,DFree]
BLT T1,DChar+5
Jrst Parse]
Movem A,Device
Jrst Parse
Check1: Cain T1,";
Jrst [Movem A,Sname
Move T1,[Free,,SFree]
BLT T1,SChar+5
Movem D,SWild
Jrst Parse]
Movei T2,FN1
Skipe FN1
Movei T2,FN2
Movem A,(T2)
Caie T1,^M
Cain T1,^C
Skipa
Jrst Parse
dFalt: Skipn FN1
Jrst [Move T1,[Sixbit /.FILE./]
Movem T1,FN1
Jrst .+1]
Skipn Sname
Jrst [.Break 12,[6,,FDefs]
Move A,FDefs+1
Movem A,Sname
Jrst .+1]
Transl: Syscal TRANS,[Device ? FN1 ? FN2 ? Sname
%Clout,,Device
%Clout,,FN1
%Clout,,FN2
%Clout,,Sname]
.Lose %LsSys
One: Skipn SWild
Jrst [Call UFDprt
Jrst Die]
Wild: Syscal OPEN,[%Clbit,,.uii
%Climm,,MFDi
[Sixbit /DSK/]
[Sixbit /M.F.D./]
[Sixbit /(FILE)/]]
.Value [Ascii /: Can't open MFD? KILL /]
Syscal SIOT,[%Climm,,MFDi
[444400,,MFDbuf]
[2000]]
.Value [Ascii /: Can't read in MFD? KILL /]
Move M,MFDbuf+1 ;Start of names (offset)
Wild1: Move T1,MFDbuf(M)
Jumpe T1,WNext
Setz C,
Move B,[440600,,T1]
Wild2: Ildb T2,B
Skipe SFree(C)
Jrst Wild3
Came T2,SChar(C)
Jrst WNext
Wild3: Aoj C,
Caie C,6
Jrst Wild2
Movem T1,Sname
Call UFDprt
WNext: Addi M,2
Caie M,2000
Jrst Wild1
;;;
;;;;;
;;;
Die: .Logout 1,
FilTyp: Move T1,Device
Call 6Type
.Iot TTYo,[":]
Move T1,Sname
Call 6Type
.Iot TTYo,[";]
Move T1,FN1
Camn T1,[Sixbit /.FILE./]
Return
Call 6Type
.Iot TTYo,[" ]
Move T1,FN2
Call 6Type
Return
6Type: Setz T2,
Rotc T1,6
Addi T2,40
.Iot TTYo,T2
Jumpn T1,6Type
Return
UFDprt: Syscal OPEN,[%Clbit,,.uii
%Climm,,UFDi
Device ? FN1 ? FN2 ? Sname]
Jrst [Skipe LoseOK
Return
Type ,"No such directory as "
Call FilTyp
Jrst Die]
Movei T1,UFDbuf
Skipe ArWild
Movei T1,ARCbuf
Hrli T1,444400
Movei T2,2000
Syscal SIOT,[%Climm,,UFDi ? T1 ? T2]
Jrst [Type ,"?Can't read in UFD"
Return]
.Close UFDi,
Skipn ArWild
Jrst UFDp0
ArLook: Move AR,ARCbuf+1 ;Start of names (offset)
Cail AR,2000
Jrst [Type ,"ADirectory empty?"
Return]
Setzm ArWild
Setom LoseOK
ArL1: Move T1,ARCbuf(AR)
Move T2,T1
And T2,[777700,,0]
Came T2,[Sixbit /AR/]
Jrst NextAr
Movei C,2
Move B,[300600,,T1]
ArL2: Ildb T2,B
Skipe DFree(C)
Jrst ArL3
Came T2,DChar(C)
Jrst NextAr
ArL3: Aoj C,
Caie C,6
Jrst ArL2
Movem T1,Device
Call UFDprt
.Iot TTYo,[^M]
NextAr: Addi AR,5
Caie AR,2000
Jrst ArL1
Setom ArWild
Move T1,[Sixbit /DSK/]
Movem T1,Device
Return
UFDp0: Call FilTyp
Setz E, ;# files
Move A,UFDbuf+UDNAMP
Cail A,2000
Jrst [Type ," is Empty"
Return]
Move T1,Device
Came T1,[Sixbit /DSK/]
Jrst UFDp1
;;;
;;; This section of code swiped from DSKUSE
;;;
UFULL0: MOVE D,UDESCP+UFDbuf
MOVEI C,UDDESC+UFDbuf ; D/ desc count
HRLI C,440600 ; "BYTE PTR"
SETZ T2, ; "COUNT"
NEXTA: SETZ T1,
NEXTB: SOJL D,FEND
ILDB C
JUMPE NBYTE ; "ZERO BYTE?"
SETO T1, ; "NON-ZERO BYTE"
JRST NEXTB ; "LOOP"
NBYTE: JUMPN T1,NEXTA ; "ZERO, WAS LAST ZERO?"
SETZ T1,
AOJA T2,NEXTB ; "AOS NULL COUNT"
FEND: MOVE T1,UDESCP+UFDbuf
SUB T1,T2
IDIVI T1,6 ; "NUMBER OF WORDS"
ADDI T1,2000
SUB T1,UDNAMP+UFDbuf
;;;
;;; End of code stolen from DSKUSE
;;;
.Iot TTYo,[" ]
.Iot TTYo,["(]
IMuli T1,100.
IDivi T1,2000-UDDESC
Move T3,T2 ;Save fractional part for now
IDivi T1,10.
Addi T1,"0
Caie T1,"0
.Iot TTYo,T1
Addi T2,"0
.Iot TTYo,T2
.Iot TTYo,[".]
Move T1,T3
IMuli T1,10.
IDivi T1,2000-UDDESC
Addi T1,"0
.Iot TTYo,T1
Type ,"% used)"
UFDp1: .Iot TTYo,[^M]
Move B,NPairs
UFDp2: .Iot TTYo,[" ]
Move T1,UFDbuf(A)
Call 6Type
.Iot TTYo,[^I]
Move T1,UFDbuf+1(A)
Call 6Type
Addi A,5
Cail A,2000
Jrst [.Iot TTYo,[^P]
.Iot TTYo,["A]
Return]
Soj B,
Jumpe B,UFDp1
.Iot TTYo,[^I]
Jrst UFDp2
Intrup: .Reset TTYo,
.Reset TTYi,
Syscal TTYFLS,[%Clbit,,1 ? %Climm,,1]
.Lose %LsSys
Jrst Flush
More: Type ,"--More--"
.Iot TTYi,T1
Cain T1,40 ;space
Jrst [.Iot TTYo,[^M]
Syscal DISMIS,[P]
.Lose]
Flush: Type ," Flushed"
Jrst Die
;;;
;;;;;
;;;
UFDbuf: Block 2000
MFDbuf: Block 2000
ARCbuf: Block 2000
Variables
Constants
END Begin