;******************************************************************************* ;* Include : TODAYSTR.INC ;* Programmer: Tony Papadimitriou <tonyp@acm.org> ;* Purpose : Macros to create a string with today's date in specified format ;* Language : Motorola/Freescale/NXP HC08/9S08 Assembly Language (aspisys.com/ASM8) ;* Status : FREEWARE Copyright (c) 2021 by Tony Papadimitriou <tonyp@acm.org> ;* Note(s) : Use: #Uses todaystr.inc ;******************************************************************************* Date macro DateFormat mreq 1:DateFormat ;;------------------------------------------------------------------------------ #ifparm ~1~ = yyyymmdd fcc '{:year}.{:month(z)}.{:date(z)}' #else ifparm ~1~ = ddmmyyyy fcc '{:date(z)}/{:month(z)}/{:year}' #else ifparm ~1~ = mmddyyyy fcc '{:month(z)}/{:date(z)}/{:year}' #else ifparm ~1~ = USA @@DayName fcc ', ' @@MonthName fcc ' {:date}, {:year}' #else ifparm ~1~ = EU @@DayName fcc ', {:date} ' @@MonthName fcc ' {:year}' #else #Error Missing Format code. Possible formats: #Error yyyymmdd = 'YYYY.MM.DD' Global #Error ddmmyyyy = 'DD/MM/YYYY' Europe #Error mmddyyyy = 'MM/DD/YYYY' USA #Error USA = 'Day, Month n, Year' #Error EU = 'Day, n Month Year' #endif endm ;******************************************************************************* ; Form a constant string (FCC) with name of given month and optional max length MonthName macro [MonthNumber][,MaxLength] mset 0,January,February,March,April,May,June,July,August,September,October,November,December mdef 1,:month mdef 2,10 mset 0,~text','{~1~}~ fcc \@~text.1.{~2~}~\@ endm ;******************************************************************************* ; Form a constant string (FCC) with the given YY,MM,DD Today macro [YY,MM,DD] mdef 1,:year mdef 2,:month mdef 3,:date @@MonthName ~2~ fcc \@ {~3~}, {~1~}\@ endm ;******************************************************************************* ; Get the day-of-week number (0=Sunday) for any YYYY,MM,DD date ; (In the latest version of the assembler you may use the built-in symbol :DOW ; for getting the assembly-time day-of-week) GetDayOfWeek macro YYYY,MM,DD mdef 1,:year mdef 2,:month mdef 3,:date mset 2,{~2~-2} ;dec(month, 2); #if ~2~ < 1 ;if (month < 1) or (month > 10) then mset 2,{~2~+12} ;Inc(month, 12); mset 1,{~1~-1} ;Dec(year, 1) #endif #if ~2~ > 10 mset 2,{~2~+12} ;Inc(month, 12); mset 1,{~1~-1} ;Dec(year, 1) #endif mset 4,{~1~/100} mset 1,{~1~\100} ; temp := (trunc((13 * month - 1) div 5) + day + yr + ; (yr div 4) + (cent div 4) - cent - cent) mod 7; mset 4,{~4~/4+{~1~/4+{13*~2~-1/5+~3~+~1~}}-~4~-~4~}\7 #if ~4~ < 0 ;if temp < 0 then Inc(temp, 7); mset 4,~4~+7 #endif ~label~ set ~4~ endm ;GetDayOfWeek ;******************************************************************************* ; Form a constant string (FCC) with name of given day and optional max length DayName macro [DayNumber][,MaxLength] mset 0,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday mdef 1,:dow mdef 2,10 mset 0,~text','{~1~+1}~ fcc \@~text.1.{~2~}~\@ endm ;******************************************************************************* #Exit ;******************************************************************************* ; Test some macro expansions ;******************************************************************************* CRLF macro fcc 13,10 endm org * @Date yyyymmdd @CRLF ;newline for easier viewing in binary @Date ddmmyyyy @CRLF @Date mmddyyyy @CRLF @Date usa @CRLF @Date eu @CRLF @MonthName :month @CRLF @MonthName :month,4 @CRLF @Today @CRLF @Today ,:month\12+1 ;one month from now @CRLF @DayName @CRLF @DayName ,3 @CRLF dow @GetDayOfWeek :year,:month,:date @CRLF @DayName dow @CRLF @DayName 0 @CRLF