[comp.sys.amiga] why.asm

bryce@COGSCI.BERKELEY.EDU (Bryce Nesbitt) (05/18/87)

; I hope I don't get stuffed into one of those silly shell archives!!
; Tabs set every 8.
;
;BETTERCLI(tm) "WHY" Command, release 1
;
;BETTERCLI WHY (C)1987 Bryce Nesbitt.  Unlimited free non-exclusive licence
;hereby	granted	to any sentient	being to use or	abuse this code	in any way
;whatsoever provided that this and any other copyright notices remain fully
;attached and are reproduced in	any simultaneously distributed printed matter
;and with the exception	that, without prior written permission,	it not
;be utilized by	any entity that	has been commonly referred to as Robert
;W. Skyles, Skyles Electric Works, Jim Drew, Regie Warren or any organization
;founded by, controlled, employing or profiting	any such entity, it's
;offspring or spouses.	ARP and	FISH use welcome.
;Author	correspondence,	bug or stupidity reports may be	directed to:
;	Bryce Nesbitt
;	1712 Marin Ave.
;	Berkeley, Ca 94707-2206
;
;This program replaces the CLI WHY command, providing faster execution and
;enhanced functionality.  The old WHY command was simply a stub	that called
;'C:FAULT', and thus could not be made properly RESIDENT.  This command was
;to replace FAULT as well, however the BCPL code does something	funky
;when calling FAULT, and I could not discover it's secret.
;
; Return code convention:
;  20  FAIL  -serious error, DOS will not open,	out of memory.
;  10  ERROR -user caused error	(syntax, file not found	etc.)
;	     -less serious than	FAIL.
;  5   WARN  -technicality (file not found on DELETE, for example)
;  0   OK    -command sucessful, operation completed.
;
;This code is REUSABLE,REENTRANT and fully RESIDENT COMPATIBLE.
;Stack 1600 ok.
*************************
jsrlib	macro
	xref	_LVO\1
	jsr	_LVO\1(a6)
	endm
jmplib	macro
	xref	_LVO\1
	jmp	_LVO\1(a6)
	endm
	;INCLUDE 'lib/exec_lib.i'	;You don't have these files
	;INCLUDE 'lib/dos_lib.i'	;so please ignore these lines.
	INCLUDE	'libraries/dosextens.i'
*************************
		CODE
outhand		equr	d6
failcode	equr	d5
proc		equr	a5
cli		equr	a4
;d0-d4 a0-a3 scratch
;-- Setup --
StartUp:	moveq	#20,failcode	;default-SEVERE	failure
		move.l	4,a6		;get exec library base pointer
		lea	dosname(pc),a1
		jsrlib	OldOpenLibrary	;get this... Compatability with	V1.0!
		move.l	d0,outhand	;temp for DOSBase
		beq.s	e_dos		;fail if it will not open
		suba.l	a1,a1		;find THIS task
		jsrlib	FindTask
		move.l	d0,proc
		move.l	pr_CLI(proc),cli
		adda.l	cli,cli		;ban the BPTR!!
		adda.l	cli,cli		;ban the BPTR!!
		move.l	outhand,a6	;DOSBase
		jsrlib	Output
		move.l	d0,outhand
		beq.s	e_output
;--
		lea	mes1s(pc),a0	;'Fail code '
		moveq	#mes1e-mes1s,d3
		bsr.s	DOWRITED
;-- Get	fail code --
		move.l	cli_ReturnCode(cli),d0
		bsr.s	PRINTDECIMAL
;--
		lea	mes2s(pc),a0	;'and error code '
		moveq	#mes2e-mes2s,d3
		bsr.s	DOWRITED
;-- Print error	number --
		move.l	cli_Result2(cli),d0
		bsr.s	PRINTDECIMAL
;--
		lea	mes3s(pc),a0	;';'
		moveq	#mes3e-mes3s,d3
		bsr.s	DOWRITED
;-- Print error	text --
		move.l	cli_Result2(cli),d0
		bsr.s	PCODE
		moveq	#0,failcode
e_error
e_output	move.l	a6,a1
		move.l	4,a6
		jsrlib	CloseLibrary
e_dos		move.l	failcode,d0
rts1		rts
;
;DOWRITED(pointer,length)
;	  a0	  d3
;Aborts	if error
;
DOWRITED	;[d3=length]
		move.l	a0,d2
		move.l	outhand,d1
		jsrlib	Write
		cmp.l	d0,d3
		beq.s	rts1
e_badwrite	addq.l	#4,a7	;pop return off	stack
		jsrlib	IoErr
		move.l	d0,pr_Result2(proc)
		bra.s	e_error	;(return code is set to	FAIL, 20)
;
;
;
PCODE		moveq	#10,d1
		lea	table(pc),a1
checknext	move.l	a1,a0		;Save pointer to this line
		moveq	#-1,d3
findend		cmp.b	(a1)+,d1	;count length
		dbeq	d3,findend	;68010 loop mode!
		neg.l	d3		;compensate for	backwards count
		subq.l	#1,d3		;tweak
		cmp.b	#$ff,(a0)
		beq.s	gotit		;end of	list, use default
		cmp.b	(a0),d0
		bne.s	checknext
gotit		addq.l	#1,a0		;skip error #
		bra.s	DOWRITED	;[a0-string|d3-len]
;
;Bloated, slow, kludg-o 32 bit signed print decimal routine.
;destroys D2,D3
;
countvar	equr	d1
tableoffset	equr	d2

PRINTDECIMAL	moveq	#-4,tableoffset
		subq.l	#6,a7
		subq.l	#6,a7	;reserve 12 bytes for number
		move.l	a7,a0
		tst.l	d0
		beq.s	zero
		bpl.s	positive
		move.b	#'-',(a0)+
		neg.l	d0
positive	addq.l	#4,tableoffset
		cmp.l	table2(pc,tableoffset.l),d0
		bcs.s	positive	;BLO

doloop		move.l	table2(pc,tableoffset.w),countvar
		beq.s	endofnum
		moveq	#-1,countvar
subloop		addq.l	#1,countvar
		sub.l	table2(pc,tableoffset.w),d0
		bcc.s	subloop
		add.l	table2(pc,tableoffset.w),d0 ;Ooops! Too	far!!
		ori.b	#$30,countvar
		move.b	countvar,(a0)+
		addq.l	#4,tableoffset
		bra.s	doloop

zero		move.b	#$30,(a0)+
endofnum	suba.l	a7,a0
		move.l	a0,d3
		move.l	a7,d2
		move.l	outhand,d1
		jsrlib	Write
		addq.l	#6,a7
		addq.l	#6,a7
		cmp.l	d0,d3
		bne.s	e_badwrite
		rts

table2		dc.l	1000000000
		dc.l	100000000
		dc.l	10000000
		dc.l	1000000
		dc.l	100000
		dc.l	10000
		dc.l	1000
		dc.l	100
		dc.l	10
		dc.l	1
		dc.l	0
dosname		dc.b 'dos.library',0
mes1s		dc.b 'Fail code '
mes1e
mes2s		dc.b ', and error code '
mes2e
mes3s		dc.b '; '
mes3e
		dc.b '(C)1987 Bryce Nesbitt'
;
;Error message table. Feel free	to translate into other	languages such as
;German, Italian, or even English. Error numbers 200 and 201
;are unauthorized 'enhancments' to the standard.
;
table	dc.b 103,'insufficient free store',10
	dc.b 105,'task table full',10           ;!!Eliminate need!!
	dc.b 120,'argument line invalid or too long',10
	dc.b 121,'file is not an object module',10
	dc.b 122,'invalid resident library during load',10
       dc.b 200,'internal error',10
       dc.b 201,'newer operating system required',10
	dc.b 202,'object in use',10
	dc.b 203,'object already exists',10
	dc.b 204,'directory not found',10
	dc.b 205,'object not found',10
	dc.b 206,'invalid window description',10
       ;dc.b 207,'object too large',10              ;obsolete
	dc.b 209,'packet request type unknown',10
	dc.b 210,'stream name component invalid',10 ;what??
	dc.b 211,'invalid object lock',10
	dc.b 212,'object not of required type',10
	dc.b 213,'disk not validated',10
	dc.b 214,'disk write-protected',10
	dc.b 215,'rename across devices attempted',10
	dc.b 216,'directory not empty',10
       ;dc.b 217,'too many levels;,10               ;obsolete
	dc.b 218,'device (or volume) not mounted',10
	dc.b 219,'seek failure',10
	dc.b 220,'comment too big',10
	dc.b 221,'disk full',10
	dc.b 222,'file is protected from deletion',10
	dc.b 223,'file is write protected',10
	dc.b 224,'file is read protected',10
	dc.b 225,'not a valid DOS disk',10
	dc.b 226,'no disk in drive',10
	;dc.b 227,'can',$27,'t open window',10
	;dc.b 228,'can',$27,'t open screen',10
	dc.b 232,'no more entries in directory',10
	dc.b 255,'no error message',10
;-- end --