; DISP3_ASM on H145 & N2_WIN1_SYS
; 29th June 1997
;
; MACROS
BORD	MACRO
	MOVEA.L	\1(A6),A0
	BSR	CLR
	MOVE.B	\2,D1
	MOVE.B	\2+1,D2
	BSR	BRDR
	ENDM
;
SETSC	MACRO
	LEA	\1,A1
	MOVEA.W	\2,A2
	JSR	(A2)
	MOVE.L	A0,\3(A6)
	ENDM
;
	PWID	120
	PCK	4
	DATA	3800
VERSION	EQU	?"3.2"
	RSSET	-128
NFS	RS.W	9
BH	RS.W	9	height of scroll block in pixels
LP	RS.W	9	list pointer (0 -> 9)
DIR_ORD	RS.W	9	Alpha order of dir names
B_BASE	RS.L	9
JB_ID	RS.L	9
DR_NME	RS.L	9*8
MD_NME	RS.L	9*16	** THIS IS >128B FROM A6 **
CURR_DIR	RS.W	1
IND_BLK	RS.W	4
ND	RS.W	1	number of directories
STACK	RS.L	1
IDMN	RS.L	1
IDSCR	RS.L	1
IDMEN	RS.L	1
IDSEC	RS.L	1
IDSECM	RS.L	1
IDWEE	RS.L	1
IDMN2	RS.L	1
DR_NUM	RS.W	4	to print dir numbers
BUF	RS.B	128
PROMPT	RS.B	64
KPRM	RS.B	64
ALC_AD	RS.L	1	for ALCHP'd address
DRL	RS.W	1
LDB	RS.L	1
TMP_NME	RS.W	6
PTR	RS.B	1
DR_SWTCH	RS.B	1
FL_TYP	RS.B	1	-1 = DATE, 0 = ALPHA, 1 = DIRECTORY ORDER
IH	EQU	186                 scroll window height in pixels
NP	EQU	19                  no of items per page
WHITE	EQU	7
BLACK	EQU	0
GREEN	EQU	4
RED	EQU	2
C_SET	EQU	RED       color for scroll block
C_CLR	EQU	BLACK     color for scroll paper
TYPE	EQU	5         file type offset in DIR
FNAME	EQU	14        name offset in DIR entry
DATE	EQU	52        date offset in DIR entry
FL_ORD	EQU	$32       relative start of file_order
F3	EQU	$F0
CDTE	EQU	76
;
	BRA.S	START
	DS.L	1
	DC.W	$4AFB
	DC.W	T_END-T_START
T_START	DC.B	"DISP2_",VERSION
T_END	DS.B	0
;
	DS.W	0         align on a word boundary
;
DR_NUM1	DC.B	0,6,10,32,0,32,32,32
NO_NAME	DC.W	11
	DC.B	"- NEW ONE -"
WEEWEE	DC.W	2,1,10,8
;
ALT_CUR	MOVE.L	#$20001,SD_XINC(A0)
	RTS
;
START	LEA	(A6,A5.L),A7        STACK
	LEA	(A6,A4.L),A6        -> DATA SPACE . .
	LEA	128(A6),A6          . . +128
	MOVE.L	A7,STACK(A6)
	SETSC	MAIN_S,UT_SCR,IDMN
	SETSC	SCROLL_S,UT_SCR,IDSCR
	SETSC	MEN_S,UT_SCR,IDMEN
	SETSC	SEC_S,UT_SCR,IDSEC
	SETSC	SECM_C,UT_CON,IDSECM
	SETSC	WEE_C,UT_CON,IDWEE
	SETSC	MAIN2_S,UT_SCR,IDMN2
;
	MOVEQ	#$70,D0    to test for pointer environment
	MOVEQ	#-1,D3
	MOVE.L	IDMN(A6),A0
	TRAP	#3
	MOVE.B	D0,PTR(A6) PTR = 0 if ptr exists
	MOVEA.L	IDWEE(A6),A0
	LEA	ALT_CUR,A2
	MOVEQ	#SD_EXTOP,D0
	TRAP	#3
	MOVEQ	#0,D1
	MOVEQ	#0,D2
	LEA	WEEWEE,A1
	MOVEQ	#SD_WDEF,D0
	TRAP	#3        set a tiny wee window
;
START1	CLR.W	ND(A6)    no directories
	MOVE.W	#-1,CURR_DIR(A6)
	MOVEQ	#8,D0
	LEA	LP(A6),A0
	LEA	DIR_ORD(A6),A1
START2	CLR.W	(A0)+     all dirs start @ 0
	MOVE.W	#-1,(A1)+
	DBF	D0,START2
	MOVEQ	#3,D0
	LEA	DR_NUM(A6),A0   set up . .
	LEA	DR_NUM1,A1      . . DR_NUM
START3	MOVE.W	(A1)+,(A0)+
	DBF	D0,START3
	MOVEQ	#71,D0    to clear DR_NME
	LEA	DR_NME(A6),A0
START4	CLR.L	(A0)+
	DBF	D0,START4
	PEA	FILEDEV
	PEA	PROMPT(A6)
	BSR	QSTRCPY   put default device to buffer
	CLR.B	DR_SWTCH(A6)	set to 'choose'
	CLR.B	FL_TYP(A6)	set to 'alpha'
	BSR	P_MAIN    print main page
	BSR	P_SWIN    print 2nd window
	MOVEQ	#1,D6     for directory 1
	MOVE.L	#$40000,IND_BLK(A6)      set width of scroll block
	CLR.L	IND_BLK+4(A6)
	BRA	ASK_NEWA  get 1st directory
;
; Main loop
;
MAIN_LOOP	BSR	CURON
MAIN_LP1	BSR	P_MAIN
;
; D5.L < 0 for all on 1 page
;
; Set regs for scroll
;
SET_REG	BSR	G_PTR
	TST.L	D5
	BMI	SET_REG1  all on 1 page
	MOVE.W	#IH,D2
	SWAP	D2
	MOVE.W	NFS(A6,D0.W),D2     IH|NL
	MOVE.W	#NP,D5
	MOVE.W	LP(A6,D0.W),D7
	MOVE.W	D2,D1
	SUB.W	D5,D1
	SWAP	D2
	MULU.W	D2,D1
	MOVE.W	D2,D4
	SWAP	D2
	DIVU.W	D2,D1
	SUB.W	D1,D4
	LEA	IND_BLK(A6),A1
SET_REG1	ADD.W	D0,D0
	MOVEA.L	B_BASE(A6,D0.W),A2
;
; D2 = IH|NL
; D4 =    BH
; D5 =    NP
; D7 =    LP
; A2 -> B_BASE
;
; Now ask for input to 2nd menu
;
FMEN1	MOVEA.L	IDWEE(A6),A0
	BSR	CURON
FMEN2	MOVEQ	#IO_FBYTE,D0
	TRAP	#3
	CMPI.B	#$F4,D1   F4 -> MAIN_LOOP
	BEQ	MAIN_LP1
	CMPI.B	#$EC,D1   F2
	BEQ	DO_SW     Do 2nd window
	CMPI.B	#27,D1    ESC
	BEQ	EXIT
	TST.L	D5
	BMI	FMEN2     no scrolling needed
	CMPI.B	#$D0,D1   ¾
	BEQ	SCROLL_UP
	CMPI.B	#$D8,D1   ¿
	BNE	FMEN2
;
; SCROLL_DOWN
;
	MOVE.W	D2,D1
	SUBI.W	#NP,D1     NL-NP
	CMP.W	D7,D1
	BGT	SCR_DN1   can scroll
SCR_DN2	BSR	BLP
	BRA	FMEN1
SCR_DN1	MOVE.W	COLRS,D6
	SWAP	D6
	MOVE.W	D7,D6     x (old LP)
	ADDQ.W	#1,D7     LP+1 (new LP)
	MOVE.L	D2,-(A7)  keep D2
	MOVEQ	#NP-1,D2
	MOVEQ	#-10,D1
;
SCR_DN3	MOVEA.L	IDMN2(A6),A0
	MOVEQ	#-1,D3
	MOVEQ	#SD_SCROL,D0
	TRAP	#3        D0,D1,A1 used
	MOVEQ	#0,D1     for AT
	BSR	AT
	MOVE.W	D2,D0     0 or NP-1
	BEQ	SCR_DN4
	ADDQ.W	#1,D0     0 or NP
SCR_DN4	ADD.W	D6,D0     x+0 or x+NP
	ADD.W	D0,D0	no of words
	MOVE.W	2(A2),D2
	ADD.W	D2,D2	2*NDI
	EXT.L	D0
	EXT.L	D2
	TST.B	FL_TYP(A6)
	BEQ	SCR_DN5	alpha-
;	BPL	SCR_DN6	directory-
	BMI	SCR_DN7
	LSR.L	#1,D0
	BRA	SCR_DN6
SCR_DN7	ADD.L	D2,D0	to next FL_ORD
SCR_DN5	MOVE.W	FL_ORD(A2,D0.L),D0
	EXT.L	D0
SCR_DN6	MOVE.L	D0,D3
	LSL.L	#2,D0
	ADD.L	D3,D0
	LSL.L	#4,D0	x80
	ADD.L	D2,D0
	ADD.L	D2,D0	-> start of line
	LEA	FL_ORD+2(A2,D0.L),A1
	MOVEQ	#-1,D3
	MOVEQ	#74,D2
	MOVEQ	#IO_SSTRG,D0
	TRAP	#3        print it
	MOVE.L	(A7)+,D2  restore D2
;
	MOVE.W	D6,D0
	ADDQ.W	#1,D0     x+1
	BSR	DO_BS
	MOVE.W	D0,D3
	MOVE.W	D6,D0     x
	BSR	DO_BS     BS in D0
	SUB.W	D0,D3     h
	BEQ	FMEN1     no change to scroll bar
	LEA	IND_BLK(A6),A1
	MOVE.W	D3,2(A1)  height of amending block
	MOVE.W	D0,6(A1)  BS
	SWAP	D6
	MOVE.B	D6,D1     1st color
	MOVEQ	#-1,D3
	MOVEA.L	IDSCR(A6),A0
	BSR	BLOCK     uses D0,D1,A1
	LEA	IND_BLK(A6),A1
	ADD.W	D4,6(A1)  add height of block (BH)
	MOVE.W	D6,D1
	LSR.W	#8,D1     next color
	BSR	BLOCK
	BRA	FMEN1
;
SCROLL_UP	TST.W	D7
	BLE	SCR_DN2   can't scroll
	MOVE.W	COLRS,D6
	ROR.W	#8,D6
	SWAP	D6
	SUBQ.W	#1,D7
	MOVE.W	D7,D6
	MOVE.L	D2,-(A7)
	MOVEQ	#10,D1
	MOVEQ	#0,D2
	BRA	SCR_DN3
;
COLRS	DC.B	C_SET,C_CLR
;
; EXIT 'y' quits - 'n' returns
;
EXIT	MOVEA.L	IDMEN(A6),A0
	MOVEQ	#RED,D1
	BSR	PAPER
	MOVEQ	#BLACK,D1
	BSR	INK
	BSR	CLR
	LEA	HEADM7,A1
	BSR	UMT1
	MOVEQ	#RED,D1
	BSR	INK
	LEA	HEADM8,A1
	BSR	UMT1
	BSR	CURON
EXIT2	MOVEQ	#IO_FBYTE,D0
	TRAP	#3
	CMPI.B	#90,D1
	BLE.S	EXIT1
	SUBI.W	#32,D1    to upper case
EXIT1	CMPI.B	#"Y",D1
	BEQ	QUIT
	CMPI.B	#"N",D1
	BNE	EXIT2
	MOVEA.L	IDMEN(A6),A0
	MOVEQ	#GREEN,D1
	BSR	PAPER
	BSR	CLR
	BRA	MAIN_LOOP
;
DO_SW	BSR	P_SWIN    print 2nd window
;
; A0 = IDSECM
; D6.B = Highest printed ASCII number
; D6(31) = 0
; D5.W = -1 if space left for dirs
;
DO_SMEN	MOVEA.L	IDWEE(A6),A0
DO_SMEN1	MOVEQ	#IO_FBYTE,D0
	TRAP	#3
	CMPI.B	#$F4,D1   F4
	BEQ	DO_SW     redraw
	CMPI.B	#32,D1
	BNE	DO_SMEN8  not 'toggle'
	BSR	SWITCH    toggle
	BRA	DO_SMEN
DO_SMEN8	CMPI.B	#F3,D1
	BNE	DO_SMEN5
	BSR	TORD	toggle order
	BRA	DO_SMEN
;
DO_SMEN5	TST.B	DR_SWTCH(A6)
	BEQ	DO_SMEN6  'choose'
	BSET	#31,D6    mark 'delete'
	BRA	DO_SMEN7
DO_SMEN6	BCLR	#31,D6    mark 'don't delete'
DO_SMEN7	CMPI.B	#'0',D1
	BLE	DO_SMEN1  outside range
	CMP.B	D6,D1
	BGT	DO_SMEN1  also outside range
	BLT	DO_SMEN2
	CMPI.W	#-1,D5    room? . .
	BNE	DO_SMEN2  . . no
	BCLR	#31,D6    don't allow deletion
	BRA	ASK_NEW
DO_SMEN2	TST.L	D6
	BMI	ASK_NEW
ALTER	SUBI.W	#"1",D1
	MOVE.W	D1,CURR_DIR(A6)     set new current dir
	BRA	MAIN_LOOP
;
ASK_NEW	SUBI.W	#"0",D1
	MOVE.B	D1,D6
	BSR	CUROF
	MOVEA.L	IDSECM(A6),A0
ASK_NEWA	MOVEQ	#RED,D1
	BSR	PAPER
	MOVEQ	#GREEN,D1
	BSR	INK
ASK_NEW1	BSR	CLR
	LEA	HEADSM3,A1
	BSR	UMT1
	LEA	BUF(A6),A1
	MOVEQ	#SD_CHENQ,D0
	TRAP	#3
	MOVE.W	BUF+4(A6),D1        X_POS
	SWAP	D1
	LEA	KPRM(A6),A2
	LEA	PROMPT(A6),A1
	BSR	MV_PRM
	MOVE.W	PROMPT(A6),D1       length
	MOVE.W	#40,D2              buffer length
	LEA	PROMPT+2(A6),A1
	ADDA.W	D1,A1               -> end of name
	MOVEQ	#IO_EDLIN,D0
	TRAP	#3
	LEA	PROMPT(A6),A0
	MOVE.L	A1,D0
	LEA	PROMPT+2(A6),A1
	SUB.L	A1,D0
	SUBQ.L	#1,D0     new length of prompt
	BEQ	RETURN    zero file - go back
	CMPI.B	#"_",-1(A1,D0.W)    does it end "_"? . . .
	BEQ	CH_NET4             . . . yes
	CMPI.W	#39,D0              will name be too long? . . .
	BGE	ASK_NEW27           . . . yes
	MOVE.B	#"_",(A1,D0.W)      set "_" at end
	ADDQ.W	#1,D0               increase length
CH_NET4	MOVE.W	D0,(A0)   set new length
;
; Now test that file is not N -> self
;
	MOVE.W	(A0),DRL(A6)        keep true length of target DIR
	CLR.W	(A0)      zero length of intermediate DIRs
	MOVEA.L	A0,A4
	CMPI.B	#"N",2(A4)
	BEQ	CH_NET1
	CMPI.B	#'n',2(A4)
	BNE	CH_NET3   not N...
CH_NET1	MOVEQ	#0,D3     set 1st digit to 0
	MOVE.B	3(A4),D0
	CMPI.B	#"_",4(A4)          could it be Nx_? . . .
	BEQ	CH_NET2             . . . yes
	CMPI.B	#"_",5(A4)          could it be Nxx_? . .
	BNE	CH_NET3             . . . no
	SUBI.B	#'0',D0             allow 0 to 6
	BLT	CH_NET3             not N...
	CMPI.B	#6,D0
	BGT	CH_NET3
	ADD.B	D0,D0
	MOVE.B	D0,D3
	LSL.B	#2,D3
	ADD.B	D0,D3     10x
	MOVE.B	4(A4),D0
CH_NET2	SUBI.B	#'0',D0
	BLT	CH_NET3   not N...
	CMPI.B	#9,D0
	BGT	CH_NET3   not N...
	ADD.B	D0,D3
	CMPI.B	#64,D3
	BGT	CH_NET3   not N...
	MOVEQ	#MT_INF,D0
	TRAP	#1
	CMP.B	$37(A0),D3          this net number?
	BEQ	ASK_NEW27           not this net number
;
; Now check that target is really a DIR
;
	BSR	NEXT_     set length of target to after next "_"
CH_NET3	BSR	NEXT_
	MOVEA.L	A4,A0     name of root DIR
	BSR	DIR_ALC
	MOVE.W	DRL(A6),D0          length of target
	CMP.W	(A4),D0
	BEQ	ASK_NEW28 we have found the directory
	MOVE.W	(A4),D1   this directory length
	LEA	2(A4,D1.W),A0        -> after root directory
	SUB.W	DRL(A6),D1
	NEG.W	D1        length of full sub-directory
	BSR	UCA       set name in upper case in BUF
;
; A5 -> ALCHP'd area
; BUF = len|sub-directory name
; LDB(A6) = length of directory
;
TESD1	MOVE.L	LDB(A6),D7
	LSR.L	#6,D7     no of files in DIR
	MOVE.W	BUF(A6),D5          length of sub-dir name
	BRA	TESD2
;
TESD3	TST.B	TYPE(A5)  DIR? . . .
	BMI	TESD7     . . . yes
	CMPI.B	#3,TYPE(A5)
	BLT	TESD4     not DIR
TESD7	CMP.W	FNAME(A5),D5
	BLT	TESD4     not this DIR
	LEA	FNAME(A5),A0
	MOVE.W	(A0)+,D1   set count
	BSR	UCB       put name in upper case to BUF+64 . .
	MOVE.B	#"_",(A1) . . and end it with "_"
	LEA	2+BUF(A6),A0        -> start of target name
	LEA	64+BUF(A6),A2
	MOVE.W	(A2)+,D1  length of DIR name
	MOVE.W	D1,D0
TESD5	CMPM.B	(A0)+,(A2)+
	DBNE	D1,TESD5
	BNE	TESD4     not this DIR - try the next one
;
	ADDQ.W	#1,D0     len+1
	MOVE.W	D0,D7
;
; We may have to search the next sub-directory
;
TESD6	MOVE.W	DRL(A6),D0
	ADD.W	64+BUF(A6),D0
	SUB.W	BUF(A6),D0   length of sub-directory name plus root
	ADDQ.W	#1,D0
	MOVE.W	D0,(A4)      advance to next sub-dir in target
	BSR	RCHP         frees ALCHP'd space
	MOVEA.L	A4,A0
	BSR	DIR_ALC      load DIR
	CMP.W	D7,D5
	BNE	TESD1        it is not this DIR
	BRA	ASK_NEW3
;
; To got to next file in DIR
;
TESD4	LEA	64(A5),A5
TESD2	DBF	D7,TESD3  count files in DIR
	BRA	ASK_NEW27 not a DIR
;
; Now DIR is in ALCHP'd area & length is in LDB(A6)
;
ASK_NEW28	CLR.W	BUF(A6)   set sub-directory length to 0
ASK_NEW3	TST.L	D6
	BPL	ASK_NEW4  don't delete
	BSR	ZAP       take out DIR
ASK_NEW4	MOVE.L	LDB(A6),D3  length of data base
	MOVEQ	#$32,D2   length of code
	MOVE.L	D3,D4	64*NDI
	LSR.L	#2,D4     16*NDI
	ADD.L	D4,D3
	LSR.L	#2,D4	4*NDI
	ADD.L	D4,D3     84*NDI
	MOVEQ	#-1,D1    this job is the owner
	SUBA.L	A1,A1
	MOVEQ	#MT_CJOB,D0
	TRAP	#1
	TST.L	D0
	BNE	FATAL     ---->
;
; A0 = B_BASE address
; A5 -> ALCHP'd area
; D1 = JOB ID
;
	MOVEQ	#8,D7
	LEA	DR_NME-32(A6),A1
ASK_NEW5	LEA	32(A1),A1 step thru DIR names
	TST.W	(A1)
	DBEQ	D7,ASK_NEW5
	BNE	FATAL     ---->
	SUBI.W	#8,D7
	NEG.W	D7        place no (0 to 8) X
	MOVE.W	D7,D0
	LSL.W	#2,D0
	MOVE.L	A0,B_BASE(A6,D0.W)
	MOVE.L	D1,JB_ID(A6,D0.W)
	LEA	PROMPT(A6),A3
	MOVE.W	(A3),D0
	ADDQ.W	#1,D0
	LSR.W	#1,D0     round up to words
	LEA	8(A0),A4
ASK_NEW6	MOVE.W	(A3),(A1)+    enter name to DR_NME
	MOVE.W	(A3)+,(A4)+   set name for JOBS
	DBF	D0,ASK_NEW6
	MOVE.W	D7,D0
	LSL.W	#4,D0     *16
	LEA	MD_NME(A6),A1
	ADDA.W	D0,A1
	LEA	TMP_NME(A6),A3
	MOVE.W	(A3),D0   length
	ADDQ.W	#1,D0
	LSR.W	#1,D0
ASK_NEW29	MOVE.W	(A3)+,(A1)+   enter medium name
	DBF	D0,ASK_NEW29
;
; A0 -> B_BASE address
; D7.W = place of DIR in DR_NME (0->8)
;
; Now set B_BASE
;
;     0 --------------------  <- B_BASE
;      |   NL               |
;     2|--------------------|
;      |   NDI              |
;     4|--------------------|
;      |                    |
;     6|--------------------|
;      |   $4AFB            |
;     8|--------------------|
;      |   name length      |
;    $A|--------------------|
;      |                    |
;      |   name             |
;      .                    .
;      .                    .
;   $32|--------------------|
;      |                    | ¾
;      |   FL_ORD (alpha)   | 2*NDI bytes
;      |                    | ¿
;      |--------------------|
;      |                    | ¾
;      |   FL_ORD (date)    | 2*NDI bytes
;      |                    | ¿
;      |--------------------|
;    .---- File data:       | ¾
;    | |    up to NDI lines |
;    | |    of 80 bytes each|
;    | |                    | 80*NDI bytes
;    | .                    .
;    | .                    .
;    | |                    | ¿
;    |  --------------------
;    ¿
; 0      2                        50     74   75 76      80
;  ______________________________________________________
; | len |    name   | file length | date |type|LF| cdate |
;
;   'cdate' is the longword in the file header from which
;   'date' is produced (year month day hour minute second)
;
;  When the files are sorted by date 'cdate' is used. For this
;  purpose a 'filename' which is a directory is given a very large
;  'cdate' ($7FFFFFFF).
;
;  The printed line consists of the 74 bytes 2 to 75 inclusive.
;
;  The two FL_ORD sections contain pointers to the 80-byte lines
;  so that the files may be printed in the required order.
;
;
	LSR.W	#2,D4     NDI
	MOVE.W	D4,2(A0)
	MOVE.W	#$4AFB,6(A0)
	LEA	FL_ORD(A0),A0       -> FL_ORD
	MOVEA.L	A0,A4
	MOVE.W	D4,D0
	BRA.S	ASK_NEW7
ASK_NEW8	CLR.L	(A0)+
ASK_NEW7	DBF	D0,ASK_NEW8         clear FL_ORDs
	SWAP	D7
	MOVEQ	#0,D1     no of items
	MOVE.W	D4,D7     no of entries in file
	MOVEA.L	A0,A3
	MOVEA.L	A0,A1     -> item
	MOVEQ	#4,D3
	MOVE.W	BUF(A6),D2          length of sub-directory
	BRA	ASK_NEW25
ASK_NEW10	MOVEQ	#18,D0	76 bytes long
	MOVEA.L	A1,A2
ASK_NEW9	MOVE.L	#$20202020,(A2)+
	DBF	D0,ASK_NEW9
	MOVE.B	#10,-1(A2) set LF
	MOVEA.L	A1,A2
	LEA	FNAME(A5),A0
	MOVE.W	(A0)+,D0
	BEQ	ASK_NEW11 no entry
	ADDA.W	D2,A0     skip sub-directory name ..
	SUB.W	D2,D0     .. and adjust length
	BMI	FATAL	---->!!!
	CMPI.W	#36,D0
	BLE	ASK_NEW21
	MOVEQ	#36,D0    set length to maximum
ASK_NEW21	MOVE.W	D0,(A2)+
	BRA.S	ASK_NEW12
ASK_NEW13	MOVE.B	(A0)+,(A2)+
ASK_NEW12	DBF	D0,ASK_NEW13
	MOVE.L	D7,-(A7)
	MOVE.W	D1,D7
	BSR	OENTER    put into alpha order
	MOVE.L	(A7)+,D7
	MOVE.B	TYPE(A5),D0
	BPL	ASK_NEW15           ordinary
	MOVEQ	#-1,D0
	MOVE.L	D0,CDTE(A1)	set high date in list
	MOVE.W	(A1),D0	length of name
	LEA	2(A1,D0.W),A2
	LEA	DRP,A0
	MOVEQ	#2,D0
ASK_NEW18	MOVE.B	(A0)+,(A2)+
	DBF	D0,ASK_NEW18	sets D0.B < 0 for 'directory'
	BRA.S	ASK_NEW30
;
DRP	DC.B	" ->"
;
ASK_NEW15	MOVE.L	DATE(A5),CDTE(A1)	put in date
ASK_NEW30	MOVE.W	-$30(A4),D4
	ADD.W	D4,D4	2*NDI
	BSET	#31,D3
	MOVEM.L	D0/D4/D7/A4,-(A7)
	ADDA.W	D4,A4
	MOVE.W	D1,D7
	BSR	OENTER
	MOVEM.L	(A7)+,D0/D4/D7/A4
	BCLR	#31,D3
	TST.B	D0
	BMI	ASK_NEW19	'directory'
	ADDI.B	#"0",D0   set to ASCII
	MOVE.B	D0,74(A1) put in TYPE
	MOVE.L	(A5),D0   length of file
	SUBI.L	#64,D0    subtract header length
	BCLR	#31,D0	see that D0 is >0
	MOVE.W	D1,D4
	LEA	48(A1),A0 -> end of number
	BSR	LTOD
	MOVE.W	D4,D1     replace D1
;
; Now put in date
;
	MOVEM.L	D1/A1,-(A7)
	MOVE.L	DATE(A5),D1
	LEA	30+BUF,A1 address relative to A6
	MOVEA.W	CN_DATE,A2
	JSR	(A2)
	MOVEM.L	(A7)+,D1/A1
	MOVEQ	#19,D0
	LEA	50(A1),A2
	LEA	10+BUF(A6),A0
ASK_NEW14	MOVE.B	(A0)+,(A2)+
	DBF	D0,ASK_NEW14
ASK_NEW19	LEA	80(A1),A1 step to next item
	ADDQ.W	#1,D1
ASK_NEW11	LEA	$40(A5),A5          to next file
ASK_NEW25	DBF	D7,ASK_NEW10
;
; D3 = no of files
; D1 = count of entries in list (NF)
;
	SWAP	D7        place in DR_NME(0->8)
	MOVE.W	D1,-FL_ORD(A4)      sets NL in B_BASE
	MOVE.W	D7,D0
	ADD.W	D0,D0
	MOVE.W	D1,D2     NL
	SUBI.W	#NP,D2
	BLE	ASK_NEW20 no scrolling needed
	MULS.W	#IH,D2    IH*(NL-NP)
	DIVS.W	D1,D2          "    /NL
	SUBI.W	#IH,D2
	NEG.W	D2
ASK_NEW20	MOVE.W	D2,BH(A6,D0.W)
	MOVE.W	D1,NFS(A6,D0.W)     sets NFS in list
	BSR	RCHP
	MOVE.W	D7,D0
	LSL.W	#5,D0     x32
	LEA	DR_NME(A6),A3       -> top of list
	LEA	(A3,D0.W),A1        -> new item
	MOVE.W	D7,D1
	LEA	DIR_ORD(A6),A4
	MOVE.W	ND(A6),D7
	MOVEQ	#5,D3     log2(length of item)
	BSR	OENTER    put new DIR in alpha order
	MOVE.W	D7,D0     no of items-1 in DR_NME
	LEA	DIR_ORD(A6),A0
ASK_NEW26	CMP.W	(A0)+,D1  find where it is in DIR_ORD
	DBEQ	D0,ASK_NEW26
	BNE	FATAL     ---->
	NEG.W	D0
	ADD.W	D7,D0
	MOVE.W	D0,CURR_DIR(A6)     set new current DIR
	ADDQ.W	#1,ND(A6)
	BRA	MAIN_LOOP
;
ASK_NEW27	BSR	BLP       make noise
	MOVEA.L	IDSECM(A6),A0
	BRA	ASK_NEW1
;
RETURN	LEA	PROMPT(A6),A2
	LEA	KPRM(A6),A1
	BSR	MV_PRM    replace prompt
	BRA	MAIN_LOOP
;
FATAL	BSR	BLP
	BRA	QUIT      maybe we put something else in later
;
; SUBROUTINES
;
; LTOD sets ASCII decimal for D0.L in
; a buffer indicated by A0 (and uses D1).
;
; At entry:
;   D0.L contains the (positive) number.
;   A0 points to the end of the area to
;   contain the ASCII decimal.
;
; At exit:
;   D0 = 0
;   A0 points to the start of the number.
;
LTOD	SWAP	D0
	BEQ.S	LTODW2
	MOVE.W	D0,D1
	BEQ.S	LTODW
	EXT.L	D1
	DIVU	#10,D1
	SWAP	D1
	MOVE.W	D1,D0
	SWAP	D0
	DIVU	#10,D0
	SWAP	D0
	ADDI.W	#48,D0
	MOVE.B	D0,-(A0)
	SWAP	D0
	MOVE.W	D0,D1
	MOVE.L	D1,D0
	BRA.S	LTOD
LTODW1	DIVU	#10,D0
	SWAP	D0
LTODW2	ADDI.W	#48,D0
	MOVE.B	D0,-(A0)
	CLR.W	D0
LTODW	SWAP	D0
	BNE.S	LTODW1
	RTS
;
; DO_BS sets (D0.W*IH/NL -> D0.W
;
; D2 = IH|NL
;
DO_BS	SWAP	D2
	MULU.W	D2,D0
	SWAP	D2
	DIVU.W	D2,D0
	RTS
;
; G_PTR sets D0.W = the offset to word lonf info for the CURR_DIR
;
G_PTR	MOVE.W	CURR_DIR(A6),D0
	ADD.W	D0,D0     2r
	MOVE.W	DIR_ORD(A6,D0.W),D0 pointer to dir info
	ADD.W	D0,D0
	RTS
;
; OENTER enters directories or files in alpha order
;
; At entry:
;  A1 -> new item in the list
;  A3 -> top of the list
;  A4 -> the order list
;  D1.W = no of item in list
;  D3.W = 5 for directory names and 4 for files
;  D7.W = number of items in the list
;
; The routine uses D0, D4-6 & A2
;
OENTER	SUBA.L	A6,A1
	SUBA.L	A6,A3
	MOVEQ	#-1,D5    bottom of list
	MOVE.W	D7,D6     top of list
	BEQ	OENTER1
OENTER2	MOVE.W	D5,D4
	ADD.W	D6,D4
	ANDI.W	#$FFFE,D4 half way point (words)
	MOVE.W	(A4,D4.W),D0        item no
	LSR.W	#1,D4     reset D4
	CMPI.W	#4,D3
	BNE	OENTER7	directory names
	SWAP	D4
	MOVE.W	D0,D4
	LSL.W	#2,D0
	ADD.W	D4,D0	x5
	SWAP	D4
OENTER7	LSL.W	D3,D0     x32 or 16
	MOVEA.L	A3,A0
	ADDA.W	D0,A0     A0 -> item in list
	TST.L	D3
	BMI	OENTER8	test date
	MOVEQ	#3,D0     comparison type
	MOVEA.W	UT_CSTR,A2
	JSR	(A2)
	TST.L	D0
	BMI	OENTER3
OENTER9	MOVE.W	D4,D6     bottom half
	BRA	OENTER4
OENTER3	MOVE.W	D4,D5     top half
OENTER4	MOVE.W	D6,D0
	SUB.W	D5,D0
	CMPI.W	#1,D0
	BGT	OENTER2   still not found
OENTER1	MOVE.W	D7,D0
	SUB.W	D6,D0
	MOVEA.L	A4,A0
	ADDA.W	D7,A0
	ADDA.W	D7,A0
	LEA	2(A0),A2
	BRA.S	OENTER5
OENTER6	MOVE.W	-(A0),-(A2)
OENTER5	DBF	D0,OENTER6
	MOVE.W	D1,(A0)   set X in order list
	ADDA.L	A6,A3     restore . .
	ADDA.L	A6,A1     . . A1 & A3
	RTS
;
OENTER8	MOVE.L	CDTE(A0,A6.L),D0
	SUB.L	CDTE(A1,A6.L),D0
	BCS	OENTER3
	BRA	OENTER9
;
;
; P_MAIN prints the main window
;
P_MAIN	CLR.B	DR_SWTCH(A6)
	BORD	IDMN,MAIN_S
	MOVEQ	#GREEN,D1
	BSR	INK
	LEA	HEAD1,A1
	BSR	UMT1
	MOVE.W	CURR_DIR(A6),D0
	ADD.W	D0,D0     rx2
	MOVE.W	D0,D4
	MOVEQ	#BLACK,D1
	BSR	INK
	MOVEQ	#GREEN,D1
	BSR	STRP
	TST.W	D4        D4 = r (No of DIR)
	BPL	P_MAIN11
	LEA	HEAD3,A1
	BRA	P_MAIN12
P_MAIN11	MOVE.W	DIR_ORD(A6,D4.W),D4    pointer to DIR info
	ADD.W	D4,D4     2X
	MOVE.W	D4,D0
	LSL.W	#4,D0
	LEA	DR_NME(A6,D0.W),A1  -> dir name
	MOVEA.L	A1,A4     keep in case of trouble
	BSR	UMT1
	MOVEQ	#GREEN,D1
	BSR	INK
	MOVEQ	#BLACK,D1
	BSR	STRP
	LEA	HEAD4,A1
	BSR	UMT1
	MOVEQ	#BLACK,D1
	BSR	INK
	MOVEQ	#GREEN,D1
	BSR	STRP
	LEA	MD_NME(A6),A1
	MOVE.W	D4,D0     2X
	LSL.W	#3,D0     now 16X
	ADDA.W	D0,A1
P_MAIN12	BSR	UMT1
	MOVEQ	#GREEN,D1
	BSR	INK
	MOVEQ	#BLACK,D1
	BSR	STRP
	LEA	HEAD2,A1
	BSR	UMT1
	MOVEQ	#WHITE,D1
	BSR	INK
	MOVEQ	#-1,D5
	MOVE.W	NFS(A6,D4.W),D7     no of files
	MOVE.W	BH(A6,D4.W),D6
	SWAP	D6
	MOVE.W	LP(A6,D4.W),D6      D6 = BH|LP
	ADD.W	D4,D4     4X
	BMI	P_MAIN2   no directories
	MOVEA.L	B_BASE(A6,D4.W),A1  -> dir info
	CMP.W	(A1),D7   if not equal JOB has gone!!!
	BNE	FATAL     ---->
	MOVE.W	2(A1),D0  no of words in FL_ORD . .
	LSL.W	#2,D0	x4
	LEA	FL_ORD(A1,D0.W),A3  -> Start of lines
	CMPI.B	#1,FL_TYP(A6)
	BEQ	P_MAIN14	directory order
	MOVE.W	D6,D0     LP -> D0
	ADD.W	D0,D0
	LEA	FL_ORD(A1,D0.W),A4  -> start position in FL_ORD
	TST.B	FL_TYP(A6)
	BEQ	P_MAIN15	alhpa order
	ADDA.W	2(A1),A4
	ADDA.W	2(A1),A4	go to next FL_ORD
	BRA	P_MAIN15
;
P_MAIN14	MOVE.W	D6,D0
	LSL.W	#2,D0
	ADD.W	D6,D0	x5
	LSL.W	#4,D0	x80
	LEA	-80(A3,D0.W),A4	-> 1st line wanted
P_MAIN15	MOVE.W	D7,D5
	MOVEQ	#74,D2    count of bytes
	CMPI.W	#NP,D7
	BLE	P_MAIN3   no scrolling
	MOVEQ	#NP,D5    sets D5.L > 0
	BRA	P_MAIN3
;
P_MAIN5	CMPI.B	#1,FL_TYP(A6)
	BNE	P_MAIN16	not directory order
	LEA	80(A4),A4		to next line . .
	LEA	2(A4),A1		. . for printing
	BRA	P_MAIN17
;
P_MAIN16	MOVE.W	(A4)+,D0  -> next line
	EXT.L	D0
	MOVE.L	D0,D3
	LSL.L	#2,D0
	ADD.L	D3,D0
	LSL.L	#4,D0	x80
	LEA	2(A3,D0.L),A1	-> line (after name count)
	MOVEQ	#-1,D3	reset timeout
P_MAIN17	MOVEQ	#IO_SSTRG,D0
	TRAP	#3
P_MAIN3	DBF	D5,P_MAIN5
;
; Now print instructions in MENU
;
P_MAIN2	BORD	IDMEN,MEN_S
	TST.L	D5
	BMI	P_MAIN6   skip ¾¿
	MOVEQ	#BLACK,D1
	BSR	INK
	LEA	HEADM1,A1
	BSR	UMT1
	MOVEQ	#RED,D1
	BSR	INK
	MOVEQ	#6,D1
	MOVEQ	#0,D2
	BSR	AT
	LEA	HEADM2,A1
	BSR	UMT1
P_MAIN6	MOVEQ	#15,D1
	MOVEQ	#0,D2
	BSR	AT
	LEA	HEADM3,A5
	LEA	HTB,A4
P_MAIN7	MOVE.W	(A4)+,D1
	BMI	P_MAIN8
	BSR	INK
	MOVE.W	(A4)+,D1
	LEA	(A5,D1.W),A1        next heading
	BSR	UMT1
	BRA	P_MAIN7
;
; Print the style of 'order'
;
P_MAIN8	MOVEQ	#40,D1
	MOVEQ	#0,D2
	BSR	AT
	BSR	TORD_1
;
; Now we do the SCROLL bar
;
; No of files is in D7
;
	TST.L	D5
	BPL	P_MAIN13  scroll  (D5 not minus)
	RTS
P_MAIN13	BORD	IDSCR,SCROLL_S
	BSR	G_PTR     D0->CURR_DIR info
	MOVE.W	LP(A6,D0.W),D6      LP
	MULU.W	#IH,D6
	DIVU.W	D7,D6     BS
	LEA	IND_BLK(A6),A1      details of scroll block
	MOVE.W	D6,6(A1)
	MOVE.W	BH(A6,D0.W),2(A1)
	MOVE.W	#C_SET,D1           set block colour
	BRA	BLOCK
;
; Print 2nd window
;
P_SWIN	BORD	IDSEC,SEC_S
	MOVEQ	#RED,D1
	BSR	INK
	LEA	HEADS1,A1
	BSR	UMT1
	MOVEQ	#BLACK,D1
	BSR	INK
	MOVEQ	#"0",D6
	LEA	DR_NME(A6),A4
	LEA	DIR_ORD(A6),A5
P_SWIN1	ADDQ.W	#1,D6
	LEA	DR_NUM(A6),A1
	MOVE.B	D6,4(A1)
	BSR	UMT1
	MOVE.W	(A5)+,D5
	BMI	P_SWIN2             no directories yet
	LSL.W	#5,D5
	LEA	(A4,D5.W),A1        dir name
	BSR	UMT1
	MOVEQ	#36,D1
	BSR	TAB
	MOVEQ	#WHITE,D1
	BSR	INK
	MOVEQ	#BLACK,D1
	BSR	STRP
	LSR.W	#1,D5     X16
	LEA	MD_NME(A6),A1
	LEA	(A1,D5.W),A1
	BSR	UMT1
	MOVEQ	#BLACK,D1
	BSR	INK
	MOVEQ	#WHITE,D1
	BSR	STRP
P_SWIN4	CMPI.W	#"8",D6
	BGT.S	P_SWIN3   end
	CMPI.B	#-1,D5
	BNE	P_SWIN1
P_SWIN3	BORD	IDSECM,SECM_C
	MOVEQ	#WHITE,D1
	BSR	INK
	BSR	TORD_1	print order toggling
	MOVEQ	#GREEN,D1
	BSR	INK
	LEA	HEADSM9,A1
	BSR	UMT1
	BSR	PR_CHRE   print CHOOSE or REPLACE
	LEA	HEADSM1,A1
	CMPI.B	#'1',D6
	BEQ	UMT1      no 2nd menu
	BSR	UMT1
	LEA	HEADSM2,A1
	BRA	UMT1
;
P_SWIN2	LEA	NO_NAME,A1
	BSR	UMT1
	BRA	P_SWIN4
;
; Moves string from (A1) to (A2)
; uses D1,A1 & A2
;
MV_PRM	MOVE.W	(A1),D1
	ADDQ.W	#1,D1
	LSR.W	#1,D1
MV_PRM1	MOVE.W	(A1)+,(A2)+
	DBF	D1,MV_PRM1
	RTS
;
; D6.B = 1,2,3 . . for DIRs 0,1,2 . . .
;
ZAP	EXT.W	D6
	MOVE.W	D6,D4
	ADD.W	D4,D4
	MOVE.W	DIR_ORD-2(A6,D4.W),D0         X
	LSL.W	#2,D0                         4X
	MOVE.L	JB_ID(A6,D0.W),D1
	LSL.W	#3,D0     32X
	CLR.W	DR_NME(A6,D0.W)
	MOVEQ	#0,D3     no error
	MOVEQ	#MT_FRJOB,D0
	TRAP	#1
	LEA	DIR_ORD(A6,D4.W),A0 1 beyond r
	LEA	-2(A0),A1           r
	MOVEQ	#9,D0
	SUB.W	D6,D0
	BRA	ZAP2
ZAP1	MOVE.W	(A0)+,(A1)+
ZAP2	DBF	D0,ZAP1
	MOVE.W	#-1,(A1)
	SUBQ.W	#1,ND(A6) adjust no of dirs
	RTS
;
; DIR_ALC tries to load the directory @ (A0)
;         into an ALCHP'd area @ (A5)
;         The length of DIR is put to LDB(A6)
;
DIR_ALC	MOVEQ	#-1,D1    this JOB
	MOVEQ	#IO_OPEN,D0
	MOVEQ	#4,D3     OPEN_DIR
	TRAP	#2
	TST.L	D0
	BEQ	DIR_ALC2  OK
	ADDQ.L	#4,A7
	BRA	ASK_NEW27
DIR_ALC2	MOVEA.L	A0,A5     keep ID
	TST.B	PTR(A6)   ptr? . . .
	BEQ.S	DIR_ALC4  . . . yes
	BSR	CURON
DIR_ALC4	MOVEA.L	A5,A0     ID
	MOVE.L	#15000000,D1
	MOVEQ	#-1,D3
	MOVEQ	#FS_POSAB,D0
	TRAP	#3
	CMPI.B	#-10,D0   EOF? . . .
	BNE	FATAL     . . .NO!!
	MOVE.L	D1,LDB(A6)
	BEQ	DIR_ALC5  zero file - already positioned!!
	MOVEQ	#FS_POSAB,D0
	MOVEQ	#0,D1
	TRAP	#3
	TST.L	D0
	BNE	FATAL     ---->
	MOVE.L	LDB(A6),D1
DIR_ALC5	MOVEQ	#-1,D2    this JOB
	MOVEQ	#MT_ALCHP,D0
	TRAP	#1
	TST.L	D0
	BNE	FATAL     ---->
;
; A0 -> temporary area
;
	MOVE.L	A0,ALC_AD(A6)       keep ALCHP address
	MOVEA.L	A0,A1
	MOVE.L	LDB(A6),D2   length
	EXG	A0,A5     ID->A0, ALCHP address ->A5
	MOVEQ	#-1,D3
;
	MOVE.L	D2,D4
	LSL.L	#1,D4
	AND.W	#$7FFF,D2
	BEQ	DIR_ALC22
	BSR	GET_BL
DIR_ALC22	MOVE.W	#$4000,D2
	SWAP	D4
	ADD.W	D4,D4
	BRA	DIR_ALC23
DIR_ALC24	BSR	GET_BL
DIR_ALC23	DBF	D4,DIR_ALC24
;
; Now get Medium Name -> TMP_NME
;
	MOVEM.L	D1/D3/A1-3,-(A7)
	MOVEQ	#-1,D3    timeout
	LEA	2+TMP_NME(A6),A1
	MOVEQ	#FS_MDINF,D0
	TRAP	#3
	MOVEQ	#9,D1     count
DIR_ALC6	CMPI.B	#32,-(A1) strip off spaces
	DBNE	D1,DIR_ALC6
	ADDQ.W	#1,D1     reset count (0 to 10)
	MOVE.W	D1,TMP_NME(A6)
	MOVEM.L	(A7)+,D1/D3/A1-3
;
	MOVEQ	#IO_CLOSE,D0
	TRAP	#2        close DIR
	RTS
;
PAUSE	MOVEM.L	D0-1/A0-1,-(A7)
	MOVEQ	#-1,D1    this JOB
	MOVEQ	#150,D3   timeout
	SUBA.L	A1,A1
	MOVEQ	#MT_SUSJB,D0
	TRAP	#1
	MOVEM.L	(A7)+,D0-1/A0-1
	RTS
;
RCHP	MOVEA.L	ALC_AD(A6),A0
	MOVEQ	#MT_RECHP,D0
	TRAP	#1        release ALCHP'd space
	RTS
;
; NEXT_ increases the length of a string at A4 to point to
;       just after the next "_"
;
NEXT_	MOVE.W	(A4),D0             start length
	MOVE.W	DRL(A6),D1          full length
	SUB.W	D0,D1               remaining length
	LEA	2(A4,D0.W),A0
	BRA	NEXT_1
NEXT_2	CMPI.B	#"_",(A0)+
NEXT_1	DBEQ	D1,NEXT_2           look for "_"
	BNE	NEXT_3              end
	NEG.W	D1
	ADD.W	DRL(A6),D1
	MOVE.W	D1,(A4)             set new length
NEXT_3	RTS
;
; UCx puts string at A0 to BUF if x is A and BUF+64 if x is B
;     setting a - z to A - Z
; At entry D1.W = length of name
;
UCA	LEA	BUF(A6),A1
	BRA	UC
UCB	LEA	BUF+64(A6),A1
UC	MOVE.W	D1,(A1)+
	BRA	UC_1
UC_2	MOVE.B	(A0)+,D0  next byte
	CMPI.B	#'a',D0
	BLT	UC_3      not lower case
	CMPI.B	#'z',D0
	BGT	UC_3      not lower case
	SUBI.B	#$20,D0   set to upper case
UC_3	MOVE.B	D0,(A1)+
UC_1	DBF	D1,UC_2
	RTS
;
; PR_CHRE prints "   CHOOSE" or "  REPLACE" in the menu
;
PR_CHRE	TST.B	DR_SWTCH(A6)
	BRA	PR_CHRE3
;
; SWITCH toggles DR_SWTCH
;  0 = choose the directory
;  1 = replace the directory
;
SWITCH	MOVEQ	#0,D1
	MOVEQ	#1,D2
	MOVEA.L	IDSECM(A6),A0
	BSR	AT
	EORI.B	#-1,DR_SWTCH(A6)
PR_CHRE3	BEQ	PR_CHRE1  'CHOOSE'
	LEA	HEADSM4,A2
	BRA	PR_CHRE2
PR_CHRE1	LEA	HEADSM5,A2  'REPLACE
PR_CHRE2	MOVEQ	#WHITE,D1
	BSR	INK
	MOVEA.L	A2,A1
	BSR	UMT1
	MOVEQ	#GREEN,D1
	BSR	INK
	RTS
;
; TORD toggles alpha-, date- and directory- order
; -1 = date : 0 = alpha : 1 = directory
;
; TORD_1 prints the option (ATing/INKing must have been done)
;
TORD	MOVE.B	FL_TYP(A6),D0
	EXT.W	D0
	MOVE.B	1+CTYP(D0.W),FL_TYP(A6)	to next option
	MOVEA.L	IDSECM(A6),A0
	MOVEQ	#0,D1
	MOVEQ	#0,D2
	BSR	AT
	MOVEQ	#WHITE,D1
	BSR	INK
TORD_1	MOVE.B	FL_TYP(A6),D0
	EXT.W	D0
	ADD.W	D0,D0
	LEA	CTAB,A1
	ADDA.W	2(A1,D0.W),A1
	BRA	UMT1
;
CTAB	DC.W	HEADSM7-CTAB	'-1'
	DC.W	HEADSM8-CTAB	'0'
	DC.W	HEADSM6-CTAB	'1'
;
CTYP	DC.B	0,1,-1
;
BLP	MOVEM.L	D0/D1/D5/D7/A3,-(A7)
	LEA	NOISE,A3
	MOVEQ	#MT_IPCOM,D0
	TRAP	#1
	MOVEM.L	(A7)+,D0/D1/D5/D7/A3
	RTS
;
NOISE	DC.B	10,8
	DC.L	$AAAA
	DC.B	1,20,90,0,$10,$27
	DC.B	$F4,$A2,1,0
;
UMT	MOVEA.L	IDMN(A6),A0
UMT1	MOVE.W	UT_MTEXT,A2
	JMP	(A2)
;
AT	MOVEQ	#SD_POS,D0
	BRA	TP3
;
INK	MOVEQ	#SD_SETIN,D0
	BRA.S	TP3
;
CURON	MOVEQ	#SD_CURE,D0
CURON1	MOVEA.L	IDWEE(A6),A0
TP3_1	MOVEQ	#-1,D3
TP3	TRAP	#3
	RTS
;
CUROF	MOVEQ	#SD_CURS,D0
	BRA.S	CURON1
;
BRDR	EXT.W	D2
	MOVEQ	#SD_BORDR,D0
	BRA	TP3
;
STRP	MOVEQ	#SD_SETST,D0
	BRA	TP3
;
PAPER	MOVEQ	#SD_SETPA,D0
	BRA	TP3
;
BLOCK	MOVEQ	#SD_FILL,D0
	BRA	TP3
;
CSZE	MOVEQ	#SD_SETSZ,D0
	BRA	TP3
;
CLR	MOVEQ	#SD_CLEAR,D0
	BRA	TP3
;
TAB	MOVEQ	#SD_TAB,D0
	BRA	TP3
;
GET_BL	MOVEQ	#IO_FSTRG,D0
	TRAP	#3
	TST.L	D0
	BNE	FATAL
	RTS
;
QUIT	MOVEQ	#MT_FRJOB,D0
	MOVEQ	#0,D3     no error message
	MOVEQ	#-1,D1
	TRAP	#1
;
;----------------------------------------------------------------------

;   Copy a QL string
;       4(A7) = Target
;       8(A7) = Source

QSTRCPY
	MOVEM.L	D0/A0-A1,-(A7)              ; save regosters used
	MOVE.L	12+4(A7),A1                 ; Target address
	MOVE.L	12+8(A7),A0                 ; Source address
	MOVE.W	(A0),D0                     ; Length to copy
	MOVE.W	(A0)+,(A1)+                 ; Copy length field
	BRA	QSTRCPY2            ; Remove if NULL byte at end wanted
QSTRCPY1	MOVE.B	(A0)+,(A1)+                 ; Copy a byte
QSTRCPY2	DBRA	D0,QSTRCPY1                 ; loop until finished
	MOVEM.L	(A7)+,D0/A0-A1              ; restore saved registers
	RTS

;=========================================================================
;                           CONFIG BLOCK
;
;   This sets up a CONFIG block for options that the user might want
;   to pre-set.  The aim is to avoid having to have different
;   versions of this program for different defaults.
;-------------------------------------------------------------------------

; Config ID
	DC.L	'<<QC','FX>>'           ; Configuration ID
	DC.W	'01'                    ; Configuration level
CFGNAME	DC.W	CFGNAMEX-CFGNAME-2      ; Software name
	DC.B	'Display_directories'
CFGNAMEX	DS.B	0
CFGVER	DC.W	CFGVERX-CFGVER-2        ; Software Version
	DC.B	VERSION
CFGVERX	DS.B	0

item1	DS.W	0                       ; Word align

	DC.B	0
	DC.B	'D'
	DC.W	FILEDEV_MAX-*
	DC.W	0
	DC.W	0
	DC.W	DESCDEV-*
	DC.W	STRATT-*
term
	DC.W	-1                      ; Terminate list

;   description strings

DESCDEV	DC.W	DESCDEVX-DESCDEV-2
	DC.B	'Default source device'
DESCDEVX	DS.B	0

;   attributes

STRATT	DC.W	0                       ; No special attributes

FILEDEV_MAX	DC.W	20
FILEDEV	DC.W	FILEDEVX-FILEDEV-2
	DC.B	'FLP1_'
FILEDEVX	DS.B	16
	DS.W	0         align on a word boundary
MAIN_S	DC.B	$E2,2     border
	DC.B	BLACK,GREEN
	DC.W	490,240,10,8
SCROLL_S	DC.B	$E0,1     border
	DC.B	BLACK,RED
	DC.W	8,188,480,42
MEN_S	DC.B	$E2,1     border
	DC.B	GREEN,BLACK
	DC.W	486,12,12,234
SEC_S	DC.B	$D0,3     border
	DC.B	WHITE,RED
	DC.W	294,166,58,50
SECM_C	DC.B	0,0       border
	DC.B	RED,WHITE
	DC.W	282,30,64,183
WEE_C	DC.B	0,0       border
	DC.B	BLACK,BLACK
	DC.W	6,10,10,8
MAIN2_S	DC.B	0,0       border
	DC.B	BLACK,WHITE
	DC.W	444,190,14,40
;
HTB	DC.W	BLACK,0
	DC.W	RED,HEADM4-HEADM3
	DC.W	BLACK,HEADM5-HEADM3
	DC.W	RED,HEADM6-HEADM3
	DC.W	BLACK,HEADM9-HEADM3
	DC.W	RED,HEADM10-HEADM3,-1
;
HEADM1	DC.W	14
	DC.B	"   ¾¿        |"
HEADM2	DC.W	6
	DC.B	"SCROLL"
HEADM3	DC.W	3
	DC.B	"F2 "
HEADM4	DC.W	HM4E-HEADM4-2
	DC.B	"CHANGE  "
HM4E	DS.B	0
HEADM5	DC.W	6
	DC.B	"|  ESC"
HEADM6	DC.W	HM6E-HEADM6-2
	DC.B	" QUIT "
HM6E	DS.B	0
HEADM7	DC.W	23
	DC.B	"Sure you want to exit? "
HEADM8	DC.W	3
	DC.B	"y/n"
HEADM9	DC.W	HM9E-HEADM9-2
	DC.B	'|',32,32,32,32,32,32,32
	DC.B	32,32,32,32,32,32,32
HM9E	DS.B	0
HEADM10	DC.W	HM10E-HEADM10-2
	DC.B	'     ORDER'
HM10E	DS.B	0
;
HEADS1	DC.W	30
	DC.B	32,32,32,32,32,32,32,32,32,32,32
	DC.B	"   DIRECTORY  LIST",10,10
HEADSM1	DC.W	29
	DC.B	" DIRECTORY BY PRESSING NUMBER"
HEADSM2	DC.W	38
	DC.B	10,"         SPACE TOGGLES CHOOSE/REPLACE"
HEADSM3	DC.W	40
	DC.B	"       GIVE NEW DIRECTORY (BLANK EXITS)",10
HEADSM4	DC.W	12
	DC.B	"     REPLACE"
HEADSM5	DC.W	12
	DC.B	"      CHOOSE"
HEADSM6	DC.W	17
	DC.B	'        DIRECTORY'
HEADSM7	DC.W	17
	DC.B	'             DATE'
HEADSM8	DC.W	17
	DC.B	'     ALPHABETICAL'
HEADSM9	DC.W	H9E-HEADSM9-2
	DC.B	' ORDER (F3 TOGGLES)',10
H9E	DS.B	0
;
HEAD1	DC.W	15
	DC.B	"   DIRECTORY   "
HEAD2	DC.W	HEAD2E-HEAD2-2
	DC.B	10,10,"NAME"
	DC.B	32,32,32,32,32,32,32,32,32,32
	DC.B	32,32,32,32,32,32,32,32,32,32
	DC.B	32,32,32,32,32,32
	DC.B	32,32,32,32,32,32,32,32,32,32
	DC.B	"LENGTH          DATE         TYPE"
	DC.B	10
HEAD2E	DS.B	0
HEAD3	DC.W	16
	DC.B	"NO DIRECTORY YET"
HEAD4	DC.W	15
	DC.B	"  MEDIUM NAME  "
;
HEADE1	DC.W	24
	DC.B	"               DIRECTORY",10
HEADE2	DC.W	26
	DC.B	10,"             HAS VANISHED"
;
