[comp.unix.i386] qt SCO XENIX 386 8086/8087 assembly source

bt455s39@uhccux.uhcc.hawaii.edu (Carmen Hardina) (07/24/89)

This is the SCO XENIX 386 System V 8086/8087 assembly language version of
qt, a program that displays the time of day in real english and also chimes.
As far as I know, the C version was originally wrapped by smeg@malibu on
Tuesday, March 28th, 1989 and posted to the net.  This is the latest version.
It has been successfully assembled under SCO XENIX 386 2.3.1, it is unknown
at this time whether it can assemble under other flavors of UNIX.

Please mail any bug reports, successful assembly on other systems, etc. to
me and I will pass them on to Paul Telles, as he does not have access to the
net at this time.  To assemble, just undo this shell archive and then type
make all on the command line.  Like so...

# make all

That's it!  Place qt in your favorite depository for local binaries and your
good to go...  Enjoy!  And hopefully we'll see more assembler source posted!

						--Carmen

--
Carmen Maria Hardina, University of Hawaii at Manoa...
UUCP: {uunet,ucbvax,dcdwest}!ucsd!nosc!uhccux!bt455s39
ARPA: uhccux!bt455s39@nosc.MIL BITNET: bt455s39@uhccux
INET: bt455s39@uhccux.UHCC.HAWAII.EDU <-- It may work.

-Cut Here--Cut Here--Cut Here--Cut Here--Cut Here--Cut Here--Cut Here--Cut Here-
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Makefile qt.s
# Wrapped by bt455s39@uhccux on Sun Jul 23 15:58:21 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(534 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# THIS FILE CONTAINS CODE WHICH IS SPECIFIC TO THE
X# INTEL ARCHITECTURE AND MAY REQUIRE MODIFICATION
X# WHEN ADAPTING XENIX TO NEW HARDWARE.
X
XAS = masm
XCC = cc
X
X# If you lack a fpu, use these flags instead.
X# AFLAGS = -p -e -s -w1 -X -z
X
XAFLAGS = -p -r -s -w1 -X -z
XCFLAGS = -pack -i -M0s -Ox
X
XOBJECTS = qt.o
X
Xall: qt strip clean
X
X# We use cc only to avoid invoking the linker directly.
Xqt: $(OBJECTS)
X	$(CC) $(CFLAGS) $(OBJECTS) -o qt
X
X$(OBJECTS): qt.s
X	$(AS) $(AFLAGS) qt.s -o $(OBJECTS)
X
Xstrip:
X	strip qt
X
Xclean:
X	-rm -f $(OBJECTS)
END_OF_FILE
if test 534 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'qt.s' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'qt.s'\"
else
echo shar: Extracting \"'qt.s'\" \(7981 characters\)
sed "s/^X//" >'qt.s' <<'END_OF_FILE'
X	TITLE   qt.s
X	.8087
X;
X; MODIFICATION HISTORY
X;
X;	Originally written by Mike Cowlishaw (language unkown), December 1982
X;	Converted to C for UNIX by Mark Dapoz, April 1986
X;
X;	86-Nov-13	Major update by Mike Dapoz, cleaned up C source.
X;
X;	89-Jul-23	Converted to 8086/8087 assembly code for SCO XENIX
X;			386 System V by Paul Anthony Telles.
X;
X_TEXT	SEGMENT  WORD PUBLIC 'CODE'
X_TEXT	ENDS
X_DATA	SEGMENT  WORD PUBLIC 'DATA'
X_DATA	ENDS
XCONST	SEGMENT  WORD PUBLIC 'CONST'
XCONST	ENDS
X_BSS	SEGMENT  WORD PUBLIC 'BSS'
X_BSS	ENDS
XDGROUP	GROUP	CONST, _BSS, _DATA
X	ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP
XPUBLIC  _h
XEXTRN	__acrtused:ABS
XEXTRN	_localtime:NEAR
XEXTRN	_time:NEAR
XEXTRN	__chkstk:NEAR
XEXTRN	_printf:NEAR
XEXTRN	_strcpy:NEAR
XEXTRN	_strcat:NEAR
X_DATA      SEGMENT
X$SG154	DB	'one',  00H
X$SG155	DB	'two',  00H
X$SG156	DB	'three',  00H
X$SG157	DB	'four',  00H
X$SG158	DB	'five',  00H
X$SG159	DB	'six',  00H
X$SG160	DB	'seven',  00H
X$SG161	DB	'eight',  00H
X$SG162	DB	'nine',  00H
X$SG163	DB	'ten',  00H
X$SG164	DB	'eleven',  00H
X$SG165	DB	00H
X$SG180	DB	'It''s ',  00H
X$SG190	DB	'just gone ',  00H
X$SG192	DB	'just after ',  00H
X$SG194	DB	'nearly ',  00H
X$SG196	DB	'almost ',  00H
X$SG204	DB	'five past ',  00H
X$SG206	DB	'ten past ',  00H
X$SG208	DB	'a quarter past ',  00H
X$SG210	DB	'twenty past ',  00H
X$SG212	DB	'twenty-five past ',  00H
X$SG214	DB	'half past ',  00H
X$SG216	DB	'twenty-five to ',  00H
X$SG218	DB	'twenty to ',  00H
X$SG220	DB	'a quarter to ',  00H
X$SG222	DB	'ten to ',  00H
X$SG224	DB	'five to ',  00H
X$SG231	DB	' o''clock',  00H
X$SG232	DB	'.',  00H
X$SG236	DB	0aH, '%s',  0aH,  0aH,  00H
X	ORG	$+26
X$SG241	DB	'Noon',  00H
X$SG243	DB	'Midnight',  00H
X$SG252	DB	'Bong',  00H
X$SG254	DB	'Ding-Dong',  00H
X$SG255	DB	'(',  00H
X$SG259	DB	',',  00H
X$SG260	DB	'!)',  00H
X$SG261	DB	0aH, '%s',  00H
X	ORG	$-66
X_h	DW	DGROUP:$SG154
X	DW	DGROUP:$SG155
X	DW	DGROUP:$SG156
X	DW	DGROUP:$SG157
X	DW	DGROUP:$SG158
X	DW	DGROUP:$SG159
X	DW	DGROUP:$SG160
X	DW	DGROUP:$SG161
X	DW	DGROUP:$SG162
X	DW	DGROUP:$SG163
X	DW	DGROUP:$SG164
X	DW	DGROUP:$SG165
X 	DB	2 DUP(0)
X_DATA      ENDS
X_TEXT      SEGMENT
X	ASSUME	CS: _TEXT
X;
X; Begin main code.
X;
X	PUBLIC	_main
X_main	PROC NEAR
X	push	bp
X	mov	bp,sp
X	mov	ax,96
X	call	__chkstk
X;
X;	argc = 4
X;	argv = 6
X;	ot = -84
X;	hr = -90
X;	mn = -92
X;	sc = -88
X;	mod = -2
X;	five_mn = -86
X;	clock = -96
X;	tm = -4
X;
X	mov	ax,OFFSET DGROUP:$SG180
X	push	ax
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	call	_strcpy
X	add	sp,4
X	lea	ax,WORD PTR [bp-96]	; clock
X	push	ax
X	call	_time
X	add	sp,2
X	lea	ax,WORD PTR [bp-96]	; clock
X	push	ax
X	call	_localtime
X	add	sp,2
X	mov	WORD PTR [bp-4],ax	; tm
X	mov	bx,ax
X	mov	ax,WORD PTR [bx+4]
X	mov	WORD PTR [bp-90],ax	; hr
X	mov	ax,WORD PTR [bx+2]
X	mov	WORD PTR [bp-92],ax	; mn
X	mov	ax,WORD PTR [bx]
X	mov	WORD PTR [bp-88],ax	; sc
X	cmp	ax,29
X	jle	$I181
X	inc	WORD PTR [bp-92]	; mn
X$I181:
X	cmp	WORD PTR [bp-92],32	; mn
X	jle	$I182
X	inc	WORD PTR [bp-90]	; hr
X$I182:
X	mov	ax,WORD PTR [bp-92]	; mn
X	cwd	
X	mov	cx,5
X	idiv	cx
X	mov	ax,dx
X	or	ax,ax
X	je	$SC187
X	cmp	ax,1
X	je	$SC188
X	cmp	ax,2
X	je	$SC191
X	cmp	ax,3
X	je	$SC193
X	cmp	ax,4
X	je	$SC195
X$SC187:
X	mov	ax,WORD PTR [bp-92]	; mn
X	mov	WORD PTR [bp-86],ax	; five_mn
X	cwd	
X	mov	cx,5
X	idiv	cx
X	cmp	dx,3
X	jl	$I197
X	mov	ax,WORD PTR [bp-92]	; mn
X	add	ax,cx
X	mov	WORD PTR [bp-86],ax	; five_mn
X$I197:
X	mov	ax,WORD PTR [bp-86]	; five_mn
X	cwd	
X	mov	cx,5
X	idiv	cx
X	mov	ax,WORD PTR [bp-86]	; five_mn
X	sub	ax,dx
X	cmp	ax,25
X	jne	$JCC159
X	jmp	$SC211
X$JCC159:
X	jle	$JCC164
X	jmp	$L20001
X$JCC164:
X	or	ax,ax
X	je	$SC202
X	cmp	ax,cx
X	je	$SC203
X	cmp	ax,10
X	je	$SC205
X	cmp	ax,15
X	je	$SC207
X	cmp	ax,20
X	je	$SC209
X	jmp	SHORT $SC202
X	nop	
X	nop	
X$SC188:
X	mov	ax,OFFSET DGROUP:$SG190
X$L20004:
X	push	ax
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	call	_strcat
X	add	sp,4
X	jmp	SHORT $SC187
X$SC191:
X	mov	ax,OFFSET DGROUP:$SG192
X	jmp	SHORT $L20004
X	nop	
X$SC193:
X	mov	ax,OFFSET DGROUP:$SG194
X	jmp	SHORT $L20004
X	nop	
X$SC195:
X	mov	ax,OFFSET DGROUP:$SG196
X	jmp	SHORT $L20004
X	nop	
X$SC203:
X	mov	ax,OFFSET DGROUP:$SG204
X$L20007:
X	push	ax
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	call	_strcat
X	add	sp,4
X$SC202:
X	mov	ax,WORD PTR [bp-90]	; hr
X	cwd	
X	mov	cx,12
X	idiv	cx
X	or	dx,dx
X	jne	$I225
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	lea	ax,WORD PTR [bp-90]	; hr
X	push	ax
X	call	_midnoon
X	add	sp,4
X$I225:
X	cmp	WORD PTR [bp-90],12	; hr
X	jle	$I227
X	sub	WORD PTR [bp-90],12	; hr
X	jmp	SHORT $I229
X	nop	
X$SC205:
X	mov	ax,OFFSET DGROUP:$SG206
X	jmp	SHORT $L20007
X	nop	
X$SC207:
X	mov	ax,OFFSET DGROUP:$SG208
X	jmp	SHORT $L20007
X	nop	
X$SC209:
X	mov	ax,OFFSET DGROUP:$SG210
X	jmp	SHORT $L20007
X	nop	
X$SC211:
X	mov	ax,OFFSET DGROUP:$SG212
X	jmp	SHORT $L20007
X	nop	
X$SC213:
X	mov	ax,OFFSET DGROUP:$SG214
X	jmp	SHORT $L20007
X	nop	
X$SC215:
X	mov	ax,OFFSET DGROUP:$SG216
X	jmp	SHORT $L20007
X	nop	
X$SC217:
X	mov	ax,OFFSET DGROUP:$SG218
X	jmp	SHORT $L20007
X	nop	
X$SC219:
X	mov	ax,OFFSET DGROUP:$SG220
X	jmp	SHORT $L20007
X	nop	
X$SC221:
X	mov	ax,OFFSET DGROUP:$SG222
X	jmp	SHORT $L20007
X	nop	
X$SC223:
X	mov	ax,OFFSET DGROUP:$SG224
X	jmp	SHORT $L20007
X	nop	
X$L20001:
X	cmp	ax,40
X	je	$SC217
X	jg	$L20002
X	cmp	ax,30
X	je	$SC213
X	cmp	ax,35
X	je	$SC215
X	jmp	SHORT $SC202
X	nop	
X$L20002:
X	cmp	ax,45
X	je	$SC219
X	cmp	ax,50
X	je	$SC221
X	cmp	ax,55
X	je	$SC223
X	jmp	$SC202
X$I227:
X	cmp	WORD PTR [bp-90],0	; hr
X	jne	$I229
X	mov	WORD PTR [bp-90],12	; hr
X$I229:
X	mov	bx,WORD PTR [bp-90]	; hr
X	shl	bx,1
X	push	WORD PTR _h[bx-2]
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	call	_strcat
X	add	sp,4
X	mov	ax,WORD PTR [bp-92]	; mn
X	cwd	
X	mov	cx,60
X	idiv	cx
X	or	dx,dx
X	jne	$I230
X	cmp	WORD PTR [bp-90],12	; hr
X	je	$I230
X	mov	ax,OFFSET DGROUP:$SG231
X	push	ax
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	call	_strcat
X	add	sp,4
X$I230:
X	mov	ax,OFFSET DGROUP:$SG232
X	push	ax
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	call	_strcat
X	add	sp,4
X	mov	ax,WORD PTR [bp-92]	; mn
X	cwd	
X	mov	cx,15
X	idiv	cx
X	or	dx,dx
X	jne	$I233
X	lea	ax,WORD PTR [bp-92]	; mn
X	push	ax
X	lea	ax,WORD PTR [bp-90]	; hr
X	push	ax
X	call	_chime
X	add	sp,4
X$I233:
X	lea	ax,WORD PTR [bp-84]	; ot
X	push	ax
X	mov	ax,OFFSET DGROUP:$SG236
X	push	ax
X	call	_printf
X	mov	sp,bp
X	pop	bp
X	ret	
X	nop	
X_main	ENDP
X;
X; Begin midnoon function.
X;
X	PUBLIC	_midnoon
X_midnoon	PROC NEAR
X	push	bp
X	mov	bp,sp
X	xor	ax,ax
X	call	__chkstk
X;
X;	hr = 4
X;	ot = 6
X;
X	mov	bx,WORD PTR [bp+4]	; hr
X	cmp	WORD PTR [bx],12
X	jne	$I240
X	mov	ax,OFFSET DGROUP:$SG241
X	jmp	SHORT $L20017
X	nop	
X$I240:
X	mov	ax,OFFSET DGROUP:$SG243
X$L20017:
X	push	ax
X	push	WORD PTR [bp+6]		; ot
X	call	_strcat
X	add	sp,4
X	mov	bx,WORD PTR [bp+4]	; hr
X	mov	WORD PTR [bx],12
X	pop	bp
X	ret	
X_midnoon	ENDP
X;
X; Begin chime funtion.
X;
X	PUBLIC	_chime
X_chime	PROC NEAR
X	push	bp
X	mov	bp,sp
X	mov	ax,102
X	call	__chkstk
X	push	si
X;
X;	hr = 4
X;	mn = 6
X;	num = -82
X;	i = -84
X;	bell = -100
X;	ring = -80
X;
X	mov	bx,WORD PTR [bp+6]	; mn
X	mov	ax,WORD PTR [bx]
X	cwd	
X	mov	cx,60
X	idiv	cx
X	or	dx,dx
X	jne	$I251
X	mov	ax,OFFSET DGROUP:$SG252
X	push	ax
X	lea	ax,WORD PTR [bp-100]	; bell
X	push	ax
X	call	_strcpy
X	add	sp,4
X	mov	bx,WORD PTR [bp+4]	; hr
X	mov	ax,WORD PTR [bx]
X	mov	WORD PTR [bp-82],ax	; num
X	jmp	SHORT $I253
X	nop	
X$I251:
X	mov	ax,OFFSET DGROUP:$SG254
X	push	ax
X	lea	ax,WORD PTR [bp-100]	; bell
X	push	ax
X	call	_strcpy
X	add	sp,4
X	mov	bx,WORD PTR [bp+6]	; mn
X	mov	ax,WORD PTR [bx]
X	cwd	
X	mov	cx,15
X	idiv	cx
X	mov	WORD PTR [bp-82],dx	; num
X$I253:
X	mov	ax,OFFSET DGROUP:$SG255
X	push	ax
X	lea	ax,WORD PTR [bp-80]	; ring
X	push	ax
X	call	_strcpy
X	add	sp,4
X	lea	ax,WORD PTR [bp-100]	; bell
X	push	ax
X	lea	ax,WORD PTR [bp-80]	; ring
X	push	ax
X	call	_strcat
X	add	sp,4
X	mov	WORD PTR [bp-84],0	; i
X	cmp	WORD PTR [bp-82],1	; num
X	jle	$FB258
X	mov	si,WORD PTR [bp-82]	; num
X	dec	si
X	add	WORD PTR [bp-84],si	; i
X$L20003:
X	mov	ax,OFFSET DGROUP:$SG259
X	push	ax
X	lea	ax,WORD PTR [bp-80]	; ring
X	push	ax
X	call	_strcat
X	add	sp,4
X	lea	ax,WORD PTR [bp-100]	; bell
X	push	ax
X	lea	ax,WORD PTR [bp-80]	; ring
X	push	ax
X	call	_strcat
X	add	sp,4
X	dec	si
X	jne	$L20003
X$FB258:
X	mov	ax,OFFSET DGROUP:$SG260
X	push	ax
X	lea	ax,WORD PTR [bp-80]	; ring
X	push	ax
X	call	_strcat
X	add	sp,4
X	lea	ax,WORD PTR [bp-80]	; ring
X	push	ax
X	mov	ax,OFFSET DGROUP:$SG261
X	push	ax
X	call	_printf
X	add	sp,4
X	pop	si
X	mov	sp,bp
X	pop	bp
X	ret	
X_chime	ENDP
X_TEXT	ENDS
XEND
END_OF_FILE
if test 7981 -ne `wc -c <'qt.s'`; then
    echo shar: \"'qt.s'\" unpacked with wrong size!
fi
# end of 'qt.s'
fi
echo shar: End of shell archive.
exit 0
-- 
Carmen Maria Hardina, University of Hawaii at Manoa...
UUCP: {uunet,ucbvax,dcdwest}!ucsd!nosc!uhccux!bt455s39
ARPA: uhccux!bt455s39@nosc.MIL BITNET: bt455s39@uhccux
INET: bt455s39@uhccux.UHCC.HAWAII.EDU <-- It may work.

bt455s39@uhccux.uhcc.hawaii.edu (Carmen Hardina) (07/24/89)

The qt assembly source is also suitable for the DOS environment without
modification.  Provisions would have been made in the makefile, but it
was an oversight.  Anyways, to create a DOS executable, edit the Makefile
and remove "clean" from the all dependency line.  Run make and then
manually relink the object code for DOS with the following command...

# cc -pack -i M0s -Ox -dos qt.o -o qt.exe

That's it!  Now you have a DOS executable from the same object code.

						--Carmen


-- 
Carmen Maria Hardina, University of Hawaii at Manoa...
UUCP: {uunet,ucbvax,dcdwest}!ucsd!nosc!uhccux!bt455s39
ARPA: uhccux!bt455s39@nosc.MIL BITNET: bt455s39@uhccux
INET: bt455s39@uhccux.UHCC.HAWAII.EDU <-- It may work.