10 REM > DateEnsure 1.27
   20 REM Ensure load/exec date and attribute date match
   30 REM v1.00
   40 REM v1.01 24-May-98 Ignores if no date set
   50 REM v1.10 23-Jun-98 Reads update date from fileserver
   60 REM v1.20 03-Oct-99 Copies dates from load/exec, was SetDates
   70 REM v1.21 28-Aug-00 Recurses into subdirectories
   80 REM v1.22 25-Jul-01 OrdToDate corrected - should be DIV 365.24
   90 REM v1.23 22-Nov-01 Ignores load=I/O memory<&8000
  100 REM v1.24 20-Ost-04 Ignores load=I/O memory<&7C00
  110 REM v1.25 17-Sep-05 Fixed Date_ToOrd
  120 REM v1.26 05-Jul-09 Uses modules, skips screendumps
  130 REM v1.27 08-Sep-17 If cdate>mdate, sets cdate=mdate
  140 :
  150 DIM ctrl% 31,name% 79:X%=ctrl%:Y%=X%DIV256
  160 :
  170 PRINTSPC15"Load&Save date"SPC15"FS date"
  180 fs%=FNfs:PROCscan
  190 END
  200 :
  210 DEFPROCscan:LOCAL idx%,type%,f$
  220 REPEAT:f$=FNgbpb8(idx%):idx%=X%!9
  230   IFf$<>"":PROCfile:IFtype%=2:OSCLI"Dir "+f$:PROCscan:OSCLI"Dir ^"
  240 UNTIL f$="":ENDPROC
  250 :
  260 DEFPROCfile:f$="@."+f$:X%!14=0:X%!18=0:X%!22=0:type%=FNfile(f$,5)
  270 ld%=X%!2:ex%=X%!6:ln%=X%!10:at%=X%!14:cdate%=X%!15:mdate%=cdate%
  280 IFfs%=5:IFFNNetFS_Op(18,CHR$64+f$)=0:X%!15=X%!10:X%!17=X%!12:X%!20=X%!5:X%!22=X%!7:mdate%=X%!15
  290 PROCf_date(cdate%):Cdy%=day%:Cmn%=month%:Cyr%=year%
  300 PROCf_date(mdate%):Sdy%=day%:Smn%=month%:Syr%=year%
  310 PROCf_time(X%!17):Sh%=hour%:Sm%=minute%:Ss%=second%
  320 !X%=ex%:X%!4=ld%:PROCDate_ToOrd(X%):Lc%=centi%
  330 Ldy%=day%:Lmn%=month%:Lyr%=year%:Lh%=hour%:Lm%=minute%:Ls%=second%
  340 PRINTMID$(f$,3);SPC(13-LENf$);FNd(Ldy%,2)"/"FNd(Lmn%,2)"/"FNd(Lyr%,4);" ";
  350 PRINTFNd(Lh%,2)":"FNd(Lm%,2)":"FNd(Ls%,2)"."FNd(Lc%,2);"     ";
  360 PRINTFNd(Sdy%,2)"/"FNd(Smn%,2)"/";Syr%;" ";
  370 PRINTFNd(Sh%,2)":"FNd(Sm%,2)":"FNd(Ss%,2);STRING$(23,CHR$8);
  380 IFCdy%+32*Cmn%+32*12*Cyr%>Sdy%+32*Smn%+32*12*Syr%:PROCModifyToCreate
  390 IF(ld%AND&FFFF8000)=&FFFF0000:PRINT:ENDPROC      :REM Loads to I/O RAM
  400 IFLyr%<1981:PROCShortToLong:ENDPROC              :REM Long date pre-AE
  410 IFSdy%+32*Smn%+32*12*Syr%<Ldy%+32*Lmn%+32*12*Lyr%:PROCShortToLong:ENDPROC
  420 IFSdy%+32*Smn%+32*12*Syr%>Ldy%+32*Lmn%+32*12*Lyr%:PROCLongToShort:ENDPROC
  430 IFLs%+Lm%+Lh%+Lc%=0                              :PROCShortToLong:ENDPROC
  440 IFSs%+60*Sm%+60*60*Sh%<Ls%+60*Lm%+60*60*Lh%      :PROCShortToLong:ENDPROC
  450 IFSs%+60*Sm%+60*60*Sh%>Ls%+60*Lm%+60*60*Lh%      :PROCLongToShort:ENDPROC
  460 PRINT:ENDPROC
  470 :
  480 DEFPROCModifyToCreate:PRINT"MOD";CHR$8;CHR$8;CHR$8;
  490 X%?14=at%:X%!15=mdate%:A%=FNfile(f$,4):IFfs%<>5:ENDPROC
  500 X%!8=mdate%:A%=FNNetFS_OpN(19,5,10,f$):ENDPROC
  510 :
  520 DEFPROCShortToLong:IFtype%=2:ld%=-1:ex%=0
  530 IF(ld%AND&FFF00000)<>&FFF00000:PRINT:ENDPROC        :REM No filetype
  540 IF(ld%AND&FFFF8000)=&FFFF0000:IF(ex%AND&FFFF)>=(ld%AND&FFFF):IF(ex%AND&FFFF)<(ld%AND&FFFF)+ln%:PRINT:ENDPROC                        :REM Loads to I/O RAM
  550 IF(ld%AND&FFFFFF00)=&FFFFDD00:PRINT:ENDPROC         :REM Master utility
  560 IF((ld%+&1000)AND&FFFFC000)=&FFFF4000:PRINT:ENDPROC :REM Screendump
  570 IF(ld%AND&FFFFF000)=&FFFF0000:IF(ex%AND&FFF00000)=0:PRINT:ENDPROC
  580 IFSmn%=0 OR Sdy%=0:PRINT:ENDPROC                    :REM No date
  590 PRINT"<--";:PROCDate_FromOrd(X%+6,Sdy%,Smn%,Syr%,Sh%,Sm%,Ss%,0)
  600 X%!2=ld%:X%?2=X%?10:X%!14=at%:A%=FNfile(f$,1)
  610 PRINT:ENDPROC
  620 :
  630 DEFPROCLongToShort:PRINT"-->";
  640 X%?14=at%:A%=FNfile(f$,4):IFfs%<>5:PRINT:ENDPROC
  650 X%!8=X%!20:X%!10=X%!22                   :REM Creation date&time
  660 X%!13=FNf_date(Ldy%,Lmn%,Lyr%)           :REM Update date
  670 X%!15=FNf_time(Lh%,Lm%,Ls%)              :REM Update time
  680 A%=FNNetFS_OpN(19,64,18,f$):PRINT:ENDPROC
  690 :
  700 DEFFNd(A%,N%)=RIGHT$("000000000"+STR$A%,N%)
  710 :
  720 DEFFNfile(f$,A%):$name%=f$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
  730 DEFFNgbpb8(ptr%):X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:CALL&FFD1:IFX%!5=1:=""
  740 A%=name%+1:A%!(A%?-1)=&D20:A%?(INSTR($A%," ")-1)=13:=$A%
  750 DEFFNfs:LOCALA%,Y%,E%:=(USR&FFDA)AND&FF
  760 :
  770 DEFPROCDate_FromOrd(mem%,d%,m%,y%,hr%,mn%,sc%,cs%):y%=y%MOD400
  780 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
  790 IFd%>146066:d%=d%-146097
  800 d%=d%*&41EB:mem%!1=d%+d%:d%=((hr%*60+mn%)*60+sc%)*100+cs%
  810 ?mem%=d%:mem%!1=mem%!1+d%DIV256:ENDPROC
  820 :
  830 DEFPROCDate_ToOrd(mem%):LOCAL A%,B%,C%,D%
  840 year%=0:month%=0:day%=0:hour%=0:minute%=0:second%=0:centi%=0
  850 IFmem%!1<0:ENDPROC:REM Problems with negatives ATM
  860 D%=mem%!1DIV&83D6+2447065:C%=mem%?0+256*(mem%!1MOD&83D6):centi%=C%MOD100
  870 C%=C%DIV100:second%=C%MOD60:C%=C%DIV60:minute%=C%MOD60:hour%=C%DIV60
  880 B%=((D%*4+3)MOD146097AND-4)+3:C%=B%MOD1461DIV4*5+2:D%=D%*4+3
  890 A%=C%DIV153+2:day%=C%MOD153DIV5+1:month%=A%MOD12+1
  900 year%=D%DIV146097*100+B%DIV1461+A%DIV12-4800
  910 ENDPROC
  920 :
  930 DEFFNf_date(d%,m%,y%):y%=y%-1981:=d%+m%*256+(y%AND15)*4096+(y%DIV16)*32
  940 DEFFNf_time(h%,m%,s%):=h%+m%*256+s%*65536
  950 :
  960 DEFPROCf_date(d%):day%=d%AND31:month%=(d%AND&F00)DIV256
  970 year%=(d%AND&F000)DIV4096+(d%AND&E0)/2+1981:ENDPROC
  980 DEFPROCf_time(t%):hour%=t%AND255:minute%=(t%AND&FF00)DIV256
  990 second%=(t%AND&FF0000)DIV65536:ENDPROC
 1000 :
 1010 DEFFNNetFS_Op(A%,A$)=FNNetFS_OpN(A%,0,7,A$)
 1020 DEFFNNetFS_OpN(A%,T%,O%,A$):LOCAL N%:!X%=0:X%?1=O%+1+LENA$:X%!3=A%:X%?7=T%:$(X%+O%)=A$
 1030 IFHIMEM>&FFFF:FORN%=4TOX%?1:X%?N%=X%?(N%+3):NEXT:SYS&60048,A%,X%+4,O%+LENA$,120TOA%:IFA%=0:X%?3=0:=0
 1040 IFHIMEM>&FFFF:IFA%>&FFFF:X%?3=?A%:SYS&2002B,A%+4TO$(X%+4):=X%?3
 1050 A%=&14:CALL&FFF1:=X%?3