; 16 bit IA32 Programming
; For educational purposes...
;
; The present c0de executes a few of interrupts to print the
; current date and time.
; COMPILATION NOTES:
; -Used Assembler: TASM.EXE
; -Used Linker: TLINK.EXE
;
; nitrous[at]conthackto[dot]com[dot]mx

.model small
.stack

DATA SEGMENT PARA PUBLIC 'data'
	date	db	'  Current Date: ','$'
	time	db	'  Current Time: ', '$'
DATA ENDS

.code
	ASSUME	DS:DATA
	MOV ax,DATA
	MOV DS,ax     ; Load program Data Segment

; ****** MACROS ******;
String MACRO str
	mov	ah, 9h
	lea	dx, str
	int	21h
ENDM

Gotoxy MACRO x, y
	xor	bh, bh
	mov	dl, x
	mov	dh, y
	mov	ah, 02h
	int	10h
ENDM
; ****** MACROS ******;

clock:
	gotoxy	0, 0
	mov	bh, 10h

	;mov	ah, 2h
	;mov	dl, 0ah
	;int	21h

;******* DATE *******;
	String	date

	mov	ah, 4h
	int	1ah
	push	cx
	push	dx

	; DAY
	mov	ax, dx
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print

	mov	ah, 2h
	mov	dl, '/'
	int	21h

	; MONTH
	pop	dx
	mov	ax, dx
	xchg	ah, al
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print

	mov	ah, 2h
	mov	dl, '/'
	int	21h

	; YEAR
	pop	cx
	mov	ax, cx
	push	cx
	xchg	ah, al
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print
	pop	cx
	mov	ax, cx
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print


	;mov	ah, 2h
	;mov	dl, 0ah
	;int	21h


;******* TIME ********;
	String	time

	mov	ah, 2h
	int	1ah
	push	dx
	push	cx
	; HOURS
	mov	ax, cx
	xchg	ah, al
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print

	mov	ah, 2h
	mov	dl, ':'
	int	21h

	; MINUTES
	pop	cx
	mov	ax, cx
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print

	mov	ah, 2h
	mov	dl, ':'
	int	21h

	; SECONDS
	pop	dx
	mov	ax, dx
	xchg	ah, al
	mov	ah, 0
	div	bh
	add	ax, 3030h
	call	print

	mov	ah, 01h
	int	16h

	jnz	exit
	jmp	clock

exit:
	mov	ah, 4ch	;	salir al OS
	int	21h

; *** Use AX Register as ASCII chars and print it on screen ***
print:
	mov	cx, ax
	mov	ah, 2h
	mov	dl, cl
	int	21h
	mov	dl, ch
	int	21h
	ret
end