; FIRST.ASM
;
; A sample of how to include and call routines in the dec_IO.pkg
; The dec_IO.pkg was written by Alan Pinck.
;
; This file may be assembled and linked using the freeware ASM assembler
; and VAL linker available at:
;
;   ftp://ftp.algonquincollege.com/pub/infosystems/pincka/dat2343/arrowasm
;
; These are the command lines I used (note the trailing semicolons):
;
;       C:> asm /s first ;
;       C:> val /co first ;
;
;  - Using a semicolon as an argument suppresses all the prompts
;    for output files and uses the defaults.  (See the documentation.)
;  - The /s option to ASM suppresses unnecessary verbosity.
;  - The /co option to VAL creates a ".COM" file (instead of a ".EXE")
;
;       C:> first
;       This is my first Intel ASM program.
;
;       12345
;       26708
;       26708
;       C:>
;
;  You can examine and trace the resulting executable .COM file using debug:
;
;       C:> debug first.com
;       -u100
;       1454:0100 BA2201        MOV     DX,0122
;       1454:0103 B409          MOV     AH,09
;       1454:0105 CD21          INT     21
;       ... etc ...
;
; -IAN! idallen@ncf.ca  November 1999
;
;-------------------------------------------------------------------
Ian	segment
	assume	CS:Ian,DS:Ian
	org	100h		; .COM requires this
;-------------------------------------------------------------------
start:
    	; Print a message.
	;
	mov	dx,offset msg	; offset address of the message text
	mov	ah,09h		; code for "display ASCII$ string"
	int	21h		; Note: don't forget the 'h' on 21h!

	; Display a number using the I/O package "shownum" procedure.
	; (Read the comments in the I/O package to know how to use
	; each of the I/O functions.)
	;
	mov	ax,12345	; Note: no 'h' - this number is decimal
	call	shownum

	; Load the first two ASCII bytes of msg as if they were a number
	; and print the number (in decimal).
	;
	mov	bx,offset msg	; load offset address of the message text
	mov	ax,[bx]		; pick up into AX 2 bytes at that address
	call	shownum

	; Explicitly set the AX register to be the same two bytes
	; and print the number again.  See!  It's the same!
	;
	mov	al,"T"		; first byte in low half of AX
	mov	ah,"h"		; second byte in high half of AX
	call	shownum

	; Quit the program (return to the O/S).
	;
	mov	al,0h		; load a successful return status
	mov	ah,4Ch		; code for "terminate program"
	int	21h
;-------------------------------------------------------------------
; I put my data and variables down here.
; Note that labels on data do *NOT* have colons!
; (Labels on program instructions *DO* need colons.)
; 
msg	db	"This is my first Intel ASM program."
	db	0Dh,0Ah		; CR, LF
	db	"$"		; end of ASCII$ string
;-------------------------------------------------------------------
	include	dec_IO.pkg	; include source for Alan's I/O package here
Ian	ends
	end start		; "start" is the label on the first instruction
