10 REM > Calendar
   20 :
   30 DIMctrl%32:X%=ctrl%:Y%=X%DIV256
   40 REM Needs pc8 font selected
   50 :
   60 INPUT"Year: "y%
   70 INPUT"Start Month: "sm%
   80 INPUT"End Month:   "em%
   90 :
  100 FOR m%=sm% TO em%
  110   firstday%=FNDayOfWeek(1,m%,y%)
  120   numdays%=FNDaysSince(1,1+(m% AND (m%<12)),y%-(m%=12),1,m%,y%)
  130   month$=FNmonth(m%)+" "+FNd0(y%,4)
  140   len%=39-LENmonth$/2
  150   PRINT "Ú"STRING$(77,"Ä")"¿"
  160   PRINT "³"SPC(len%);month$;SPC(77-LENmonth$-len%)"³"
  170   PRINT "Ã"STRING$(38,"Ä")"Â"STRING$(38,"Ä")"´"
  180   FOR day%=1 TO 16
  190     PRINT "³"STRING$(38," ")"³"STRING$(38," ")"³"
  200     PRINT "³"FNd(day%,2)" "FNday((firstday%+day%-1)MOD7);SPC(32);"³";
  210     IF day%+16<=numdays%:PRINT FNd(day%+16,2)" "FNday((firstday%+day%+16-1)MOD7);SPC(32)"³" ELSE PRINT SPC(38)"³"
  220     PRINT "³"STRING$(38," ")"³"STRING$(38," ")"³"
  230     IF day%<16:PRINT "Ã"STRING$(38,"Ä")"Å"STRING$(38,"Ä")"´"
  240   NEXT
  250   PRINT "À"STRING$(38,"Ä")"Á"STRING$(38,"Ä")"Ù"
  260 NEXT
  270 END
  280 :
  290 :
  300 DEFFNmonth(A%):=MID$("JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember",VALMID$("010816212629333743525967",2*A%-1,2),VALMID$("785534469788",A%,1))
  310 :
  320 DEFFNday(A%):A%=A%AND7:=MID$("SatSunMonTueWedThuFriSat",A%*3+1,3)
  330 :
  340 REM Return day of week, 1=Sunday, 7=Saturday
  350 DEFFNDayOfWeek(d%,m%,y%):y%=y%MOD400
  360 =(y%*365.25+m%*30+d%+VALMID$("120112234455",m%,1)+((y%MOD4)=0)-((y%-1)DIV100)-(m%>2AND((y%MOD4)=0AND(y%MOD100)<>0ORy%=0))+3)MOD7+1
  370 :
  380 REM Convert time and date to 5-byte centi-second count since 1st Jan 1900
  390 DEFPROCConvDate(mem%,d%,m%,y%,hr%,mn%,sc%,cs%):IFy%<100:y%=y%+1900
  400 y%=y%MOD400
  410 d%=y%*365.25+m%*30+d%+VALMID$("120112234455",m%,1)+((y%MOD4)=0)-((y%-1)DIV100)-(m%>2AND((y%MOD4)=0AND(y%MOD100)<>0ORy%=0))+36493
  420 IFd%>146096:d%=d%-146097
  430 d%=d%*&41EB:mem%!1=d%+d%:d%=((hr%*60+mn%)*60+sc%)*100+cs%
  440 ?mem%=d%:mem%!1=mem%!1+d%DIV256:ENDPROC
  450 :
  460 REM Return number of days since a past date
  470 DEFFNDaysSince(td%,tm%,ty%,pd%,pm%,py%):LOCAL past%
  480 PROCConvDate(ctrl%,pd%,pm%,py%,0,0,0,0):past%=ctrl%!1
  490 PROCConvDate(ctrl%,td%,tm%,ty%,0,0,0,0):=(ctrl%!1-past%)DIV&83D6
  500 :
  510 REM Hexadecimal padded with zeros
  520 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
  530 :
  540 REM Decimal padded with zeros
  550 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
  560 :
  570 REM Hexadecimal padded with spaces
  580 DEFFNh(A%,N%)=RIGHT$("         "+STR$~A%,N%)
  590 :
  600 REM Decimal padded with spaces
  610 DEFFNd(A%,N%)=RIGHT$("         "+STR$A%,N%)
  620 :