setala

VAX/VMS Macro-32 TERVEHDYS.MAR

May 4th, 2026 (edited)
3,256
0
Never
4
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.90 KB | Source Code | 0 0
  1. .TITLE TERVEHDYS
  2. .IDENT /V1.4/
  3.  
  4. .LIBRARY /SYS$LIBRARY:STARLET.MLB/
  5.  
  6. $SSDEF
  7. $DSCDEF
  8.  
  9. .PSECT DATA,NOEXE,WRT,LONG
  10.  
  11. UTC_TIME: .BLKQ 1
  12. UTCNUM: .BLKW 7
  13. FINNUM: .BLKW 7
  14.  
  15. DAY: .BLKL 1
  16. YEAR: .BLKL 1
  17. HOUR: .BLKL 1
  18. MINUTE: .BLKL 1
  19. SECOND: .BLKL 1
  20.  
  21. MAR_LAST: .BLKL 1
  22. OCT_LAST: .BLKL 1
  23. MONTH_PTR: .BLKL 1
  24. OFFSET_HOURS: .BLKL 1
  25. MONTH_LEN: .BLKL 1
  26.  
  27. OUTBUF: .BLKB 132
  28. OUTLEN: .BLKW 1
  29.  
  30. OUT_DSC:
  31. .WORD 132
  32. .BYTE DSC$K_DTYPE_T
  33. .BYTE DSC$K_CLASS_S
  34. .ADDRESS OUTBUF
  35.  
  36. FMT_DATE: .ASCID /!UL. !AS !UL !2ZL:!2ZL:!2ZL Suomen aikaa/
  37.  
  38. MON01: .ASCID /tammikuuta/
  39. MON02: .ASCID /helmikuuta/
  40. MON03: .ASCID /maaliskuuta/
  41. MON04: .ASCID /huhtikuuta/
  42. MON05: .ASCID /toukokuuta/
  43. MON06: .ASCID /kesakuuta/
  44. MON07: .ASCID /heinakuuta/
  45. MON08: .ASCID /elokuuta/
  46. MON09: .ASCID /syyskuuta/
  47. MON10: .ASCID /lokakuuta/
  48. MON11: .ASCID /marraskuuta/
  49. MON12: .ASCID /joulukuuta/
  50.  
  51. MONTH_TABLE:
  52. .ADDRESS MON01,MON02,MON03,MON04,MON05,MON06
  53. .ADDRESS MON07,MON08,MON09,MON10,MON11,MON12
  54.  
  55. MDAYS:
  56. .LONG 31,28,31,30,31,30,31,31,30,31,30,31
  57.  
  58. MSG_TIME: .ASCID /Paivamaara ja aika:/
  59. GREET_MORN: .ASCID /Hyvaa huomenta!/
  60. GREET_DAY: .ASCID /Hyvaa paivaa!/
  61. GREET_EVE: .ASCID /Hyvaa iltaa!/
  62. GREET_NIGHT: .ASCID /Hyvaa yota!/
  63.  
  64. .PSECT CODE,EXE,NOWRT,LONG
  65.  
  66. .ENTRY START,^M<>
  67.  
  68. $GETTIM_S TIMADR=UTC_TIME
  69. BLBS R0,10$
  70. JMP ERROR
  71. 10$:
  72. $NUMTIM_S TIMBUF=UTCNUM,TIMADR=UTC_TIME
  73. BLBS R0,20$
  74. JMP ERROR
  75. 20$:
  76.  
  77. ; Find last Sunday of March and October in the UTC year.
  78. MOVZWL UTCNUM+0,R0
  79. MOVL #3,R1
  80. MOVL #31,R2
  81. BSBW LAST_SUNDAY
  82. MOVL R0,MAR_LAST
  83.  
  84. MOVZWL UTCNUM+0,R0
  85. MOVL #10,R1
  86. MOVL #31,R2
  87. BSBW LAST_SUNDAY
  88. MOVL R0,OCT_LAST
  89.  
  90. ; Default: Finnish winter time, UTC+2.
  91. MOVL #2,OFFSET_HOURS
  92.  
  93. ; Finnish summer time: last Sunday of March 01:00 UTC
  94. ; through last Sunday of October before 01:00 UTC.
  95. MOVZWL UTCNUM+2,R0 ; UTC month
  96.  
  97. CMPL R0,#3
  98. BLSS HAVE_OFFSET ; Jan-Feb
  99.  
  100. CMPL R0,#10
  101. BGTR HAVE_OFFSET ; Nov-Dec
  102.  
  103. CMPL R0,#3
  104. BEQL CHECK_MARCH
  105.  
  106. CMPL R0,#10
  107. BEQL CHECK_OCTOBER
  108.  
  109. MOVL #3,OFFSET_HOURS ; Apr-Sep
  110. BRW HAVE_OFFSET
  111.  
  112. CHECK_MARCH:
  113. MOVZWL UTCNUM+4,R0 ; UTC day
  114. CMPL R0,MAR_LAST
  115. BLSS HAVE_OFFSET
  116. BGTR MARCH_DST
  117.  
  118. MOVZWL UTCNUM+6,R0 ; UTC hour
  119. CMPL R0,#1
  120. BLSS HAVE_OFFSET
  121.  
  122. MARCH_DST:
  123. MOVL #3,OFFSET_HOURS
  124. BRW HAVE_OFFSET
  125.  
  126. CHECK_OCTOBER:
  127. MOVL #3,OFFSET_HOURS ; October is DST until cutoff
  128. MOVZWL UTCNUM+4,R0
  129. CMPL R0,OCT_LAST
  130. BLSS HAVE_OFFSET
  131. BGTR OCT_STD
  132.  
  133. MOVZWL UTCNUM+6,R0
  134. CMPL R0,#1
  135. BLSS HAVE_OFFSET
  136.  
  137. OCT_STD:
  138. MOVL #2,OFFSET_HOURS
  139.  
  140. HAVE_OFFSET:
  141. ; Copy UTC numeric time to FINNUM.
  142. MOVW UTCNUM+0,FINNUM+0
  143. MOVW UTCNUM+2,FINNUM+2
  144. MOVW UTCNUM+4,FINNUM+4
  145. MOVW UTCNUM+6,FINNUM+6
  146. MOVW UTCNUM+8,FINNUM+8
  147. MOVW UTCNUM+10,FINNUM+10
  148. MOVW UTCNUM+12,FINNUM+12
  149.  
  150. ; Add 2 or 3 hours.
  151. MOVZWL FINNUM+6,R0
  152. ADDL2 OFFSET_HOURS,R0
  153. CMPL R0,#24
  154. BLSS STORE_HOUR
  155.  
  156. SUBL2 #24,R0
  157. MOVW R0,FINNUM+6
  158. BSBW INC_DATE
  159. BRW AFTER_HOUR
  160.  
  161. STORE_HOUR:
  162. MOVW R0,FINNUM+6
  163.  
  164. AFTER_HOUR:
  165. MOVZWL FINNUM+0,YEAR
  166. MOVZWL FINNUM+4,DAY
  167. MOVZWL FINNUM+6,HOUR
  168. MOVZWL FINNUM+8,MINUTE
  169. MOVZWL FINNUM+10,SECOND
  170.  
  171. MOVZWL FINNUM+2,R1
  172. DECL R1
  173. MULL2 #4,R1
  174. MOVL MONTH_TABLE(R1),MONTH_PTR
  175.  
  176. PUSHL SECOND
  177. PUSHL MINUTE
  178. PUSHL HOUR
  179. PUSHL YEAR
  180. PUSHL MONTH_PTR
  181. PUSHL DAY
  182. PUSHAQ OUT_DSC
  183. PUSHAL OUTLEN
  184. PUSHAQ FMT_DATE
  185. CALLS #9,G^LIB$SYS_FAO
  186. BLBS R0,30$
  187. JMP ERROR
  188. 30$:
  189. MOVW OUTLEN,OUT_DSC
  190.  
  191. PUSHAQ MSG_TIME
  192. CALLS #1,G^LIB$PUT_OUTPUT
  193.  
  194. PUSHAQ OUT_DSC
  195. CALLS #1,G^LIB$PUT_OUTPUT
  196.  
  197. CMPW FINNUM+6,#6
  198. BLSS SAY_NIGHT
  199.  
  200. CMPW FINNUM+6,#12
  201. BLSS SAY_MORN
  202.  
  203. CMPW FINNUM+6,#18
  204. BLSS SAY_DAY
  205.  
  206. CMPW FINNUM+6,#22
  207. BLSS SAY_EVE
  208.  
  209. SAY_NIGHT:
  210. PUSHAQ GREET_NIGHT
  211. BRB PRINT_GREET
  212.  
  213. SAY_MORN:
  214. PUSHAQ GREET_MORN
  215. BRB PRINT_GREET
  216.  
  217. SAY_DAY:
  218. PUSHAQ GREET_DAY
  219. BRB PRINT_GREET
  220.  
  221. SAY_EVE:
  222. PUSHAQ GREET_EVE
  223.  
  224. PRINT_GREET:
  225. CALLS #1,G^LIB$PUT_OUTPUT
  226. MOVL #SS$_NORMAL,R0
  227. RET
  228.  
  229. ERROR:
  230. PUSHL R0
  231. CALLS #1,G^LIB$STOP
  232. RET
  233.  
  234. ; Increment FINNUM date by one day.
  235.  
  236. INC_DATE:
  237. MOVZWL FINNUM+0,R0 ; year
  238. MOVZWL FINNUM+2,R1 ; month
  239. BSBW GET_MONTH_LENGTH
  240. MOVL R0,MONTH_LEN
  241.  
  242. MOVZWL FINNUM+4,R0 ; day
  243. INCL R0
  244. CMPL R0,MONTH_LEN
  245. BGTR NEXT_MONTH
  246.  
  247. MOVW R0,FINNUM+4
  248. RSB
  249.  
  250. NEXT_MONTH:
  251. MOVW #1,FINNUM+4
  252.  
  253. MOVZWL FINNUM+2,R0
  254. INCL R0
  255. CMPL R0,#12
  256. BGTR NEXT_YEAR
  257.  
  258. MOVW R0,FINNUM+2
  259. RSB
  260.  
  261. NEXT_YEAR:
  262. MOVW #1,FINNUM+2
  263. MOVZWL FINNUM+0,R0
  264. INCL R0
  265. MOVW R0,FINNUM+0
  266. RSB
  267.  
  268. ; Input:
  269. ; R0 = year
  270. ; R1 = month
  271. ; Output:
  272. ; R0 = length of month
  273.  
  274. GET_MONTH_LENGTH:
  275. DECL R1
  276. MULL2 #4,R1
  277. MOVL MDAYS(R1),R2
  278.  
  279. ; February: check leap year.
  280. CMPL R1,#4 ; original month 2 -> index 1 -> offset 4
  281. BNEQ MONTH_LEN_DONE
  282.  
  283. BSBW IS_LEAP
  284. TSTL R0
  285. BEQL MONTH_LEN_DONE
  286. MOVL #29,R2
  287.  
  288. MONTH_LEN_DONE:
  289. MOVL R2,R0
  290. RSB
  291.  
  292. ; Input:
  293. ; R0 = year
  294. ; Output:
  295. ; R0 = 1 if leap year, 0 otherwise
  296.  
  297. IS_LEAP:
  298. MOVL R0,R3
  299.  
  300. MOVL R3,R4
  301. DIVL2 #400,R4
  302. MULL2 #400,R4
  303. CMPL R3,R4
  304. BEQL LEAP_YES
  305.  
  306. MOVL R3,R4
  307. DIVL2 #100,R4
  308. MULL2 #100,R4
  309. CMPL R3,R4
  310. BEQL LEAP_NO
  311.  
  312. MOVL R3,R4
  313. DIVL2 #4,R4
  314. MULL2 #4,R4
  315. CMPL R3,R4
  316. BEQL LEAP_YES
  317.  
  318. LEAP_NO:
  319. CLRL R0
  320. RSB
  321.  
  322. LEAP_YES:
  323. MOVL #1,R0
  324. RSB
  325.  
  326. ; Input:
  327. ; R0 = year
  328. ; R1 = month, 3 or 10
  329. ; R2 = last day of month
  330. ; Output:
  331. ; R0 = day number of last Sunday in that month
  332.  
  333. LAST_SUNDAY:
  334. MOVL R0,R3
  335. MOVL R1,R4
  336. MOVL R2,R5
  337.  
  338. ADDL3 #1,R4,R6
  339. MULL2 #13,R6
  340. DIVL2 #5,R6
  341.  
  342. ADDL3 R5,R6,R7
  343. ADDL2 R3,R7
  344.  
  345. MOVL R3,R8
  346. DIVL2 #4,R8
  347. ADDL2 R8,R7
  348.  
  349. MOVL R3,R8
  350. DIVL2 #100,R8
  351. SUBL2 R8,R7
  352.  
  353. MOVL R3,R8
  354. DIVL2 #400,R8
  355. ADDL2 R8,R7
  356.  
  357. MOVL R7,R8
  358. DIVL2 #7,R8
  359. MULL2 #7,R8
  360. SUBL2 R8,R7
  361.  
  362. ADDL2 #6,R7
  363. MOVL R7,R8
  364. DIVL2 #7,R8
  365. MULL2 #7,R8
  366. SUBL2 R8,R7
  367.  
  368. SUBL3 R7,R5,R0
  369. RSB
  370.  
  371. .END START
  372.  
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment