This task has been clarified. Its programming examples are in need of review to ensure that they still fit the requirements of the task.


Task

Display the   current date   in the formats of:

   2007-11-23     and 
   Friday, November 23, 2007


        JSR SYS_READ_CALENDAR ;outputs calendar date to BIOS RAM
 
	MOVE.B #'2',D0                  ;a character in single or double quotes refers to its ascii equivalent.
	JSR PrintChar
	MOVE.B #'0',D0
	JSR PrintChar
 
	LEA BIOS_YEAR,A1	
	MOVE.B (A1)+,D0			;stores last 2 digits of year into D0, in binary coded decimal
	JSR UnpackNibbles8		;separate the digits into high and low nibbles: D0 = 00020001
	ADD.L #$00300030,D0		;convert both numerals to their ascii equivalents.
	SWAP D0				;print the "2" first
	JSR PrintChar
	SWAP D0				;then the "1"
	JSR PrintChar
 
	MOVE.B #'-',D0
	JSR PrintChar
 
	MOVE.B (A1)+,D0			;get the month
	JSR UnpackNibbles8		
	ADD.L #$00300030,D0
	SWAP D0
	JSR PrintChar
	SWAP D0
	JSR PrintChar
 
	MOVE.B #'-',D0
	JSR PrintChar
 
	MOVE.B (A1)+,D0			;get the day
	JSR UnpackNibbles8
	ADD.L #$00300030,D0
	SWAP D0
	JSR PrintChar
	SWAP D0
	JSR PrintChar
 
	;now the date is printed.
 
	;Now do it again only written out:
	jsr NewLine
 
	CLR.L D0				;reset D0
	MOVE.B (A1),D0			;A1 happens to point to the weekday
	LSL.W #2,D0				;we are indexing into a table of longs
	LEA Days_Lookup,A2
	LEA (A2,D0),A2
	MOVEA.L (A2),A3			;dereference the pointer into A3, which the PrintString routine takes as an argument.
 
	JSR PrintString
 
	CLR.L D0
	LEA BIOS_MONTH,A1		;GET THE MONTH
	MOVE.B (A1)+,D0
	LSL.W #2,D0
	LEA Months_Lookup,A2
	LEA (A2,D0),A2
	MOVEA.L (A2),A3
 
	JSR PrintString
 
	MOVE.B (A1),D0			;GET THE DAY
	JSR UnpackNibbles8		
	ADD.L #$00300030,D0
	SWAP D0
	JSR PrintChar
	SWAP D0
	JSR PrintChar
 
	MOVE.B #',',D0
	JSR PrintChar
	MOVE.B #' ',D0
	JSR PrintChar
 
	MOVE.B #'2',D0
	JSR PrintChar
	MOVE.B #'0',D0
	JSR PrintChar
 
	LEA BIOS_YEAR,A1	
	MOVE.B (A1)+,D0			;stores last 2 digits of year into D0, in binary coded decimal
	JSR UnpackNibbles8		;separate the digits into high and low nibbles: D0 = 00020001
	ADD.L #$00300030,D0		;convert both numerals to their ascii equivalents.
	SWAP D0					;print the "2" first
	JSR PrintChar
	SWAP D0					;then the "1"
	JSR PrintChar
 
forever:
	bra forever                              ;trap the program counter
 
UnpackNibbles8:
; INPUT: D0 = THE VALUE YOU WISH TO UNPACK.
; HIGH NIBBLE IN HIGH WORD OF D0, LOW NIBBLE IN LOW WORD. SWAP D0 TO GET THE OTHER HALF.
	pushWord D1
		CLR.W D1		
		MOVE.B D0,D1
		CLR.L D0
		MOVE.B D1,D0	 ;now D0 = D1 = $000000II, where I = input
 
		AND.B #$F0,D0	 ;chop off bottom nibble
		LSR.B #4,D0		 ;downshift top nibble into bottom nibble of the word
		SWAP D0			 ;store in high word
		AND.B #$0F,D1	 ;chop off bottom nibble
		MOVE.B D1,D0	 ;store in low word
	popWord D1
	rts