home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / utilities / ac / acSrc < prev    next >
Encoding:
Text File  |  1991-09-11  |  6.8 KB  |  496 lines

  1. REM >acSrc
  2. REM Computer Usage Accounting Program
  3. REM (c) 1991 Jason O'Broin
  4. REM Version 1.01
  5. REM Last Update : 11/09/91
  6.  
  7. version$="1.01"
  8. update$="11/09/91"
  9.  
  10. DIM code 2000
  11. FOR X=0 TO 3 STEP 3
  12. P%=code
  13. [ OPT X
  14. STMFD R13!,{R14}
  15. BL set_r9
  16. MOV R11,#0
  17. .skipspace
  18. LDRB R2,[R1],#1
  19. CMP R2,#32
  20. BLT total
  21. CMP R2,#ASC"-"
  22. BNE skipspace
  23. LDRB R2,[R1],#1
  24. AND R2,R2,#&DF
  25. CMP R2,#ASC"R"
  26. BEQ reset
  27. CMP R2,#ASC"P"
  28. BEQ print
  29. CMP R2,#ASC"N"
  30. BEQ switch
  31. CMP R2,#ASC"F"
  32. BEQ switch
  33. CMP R2,#ASC"T"
  34. BEQ tidy
  35. CMP R2,#ASC"H"
  36. BEQ help
  37.  
  38. .total
  39. BL open_file
  40. BL count
  41. ADR R0,ttl
  42. SWI "XOS_Write0"
  43. BL print_total
  44. SWI "XOS_NewLine"
  45. B exit
  46.  
  47. .print_total
  48. STMFD R13!,{R14}
  49. MOV R0,R8
  50. MOV R1,R12
  51. MOV R2,#6
  52. SWI "XOS_ConvertCardinal2"
  53. SWI "XOS_Write0"
  54. ADR R0,hr
  55. SWI "XOS_Write0"
  56. MOV R0,R7
  57. MOV R1,R12
  58. MOV R2,#4
  59. SWI "XOS_ConvertCardinal1"
  60. SWI "XOS_Write0"
  61. ADR R0,mins
  62. SWI "XOS_Write0"
  63. BVS error1
  64. LDMFD R13!,{PC}^
  65.  
  66. .ttl
  67. EQUS "  Total          "
  68. EQUB 0
  69. .hr
  70. EQUS " hrs "
  71. EQUB 0
  72. .mins
  73. EQUS " mins"
  74. EQUB 0
  75. ALIGN
  76.  
  77. .count
  78. STMFD R13!,{R14}
  79. MOV R7,#0                     \ minutes counter
  80. MOV R8,#0                     \ hours counter
  81. .get_first
  82. MOV R3,R9
  83. MOV R1,R10
  84. SWI "XOS_BGet"
  85. BVS error1
  86. MOV R6,R0
  87. BL get_a_date
  88. MOV R0,#5
  89. SWI "XOS_Args"
  90. BVS error1
  91. CMP R2,#0
  92. BNE end_file1
  93. CMP R6,#ASC"F"
  94. BEQ get_first
  95. .get_next_date
  96. ADD R3,R9,#8
  97. MOV R1,R10
  98. SWI "XOS_BGet"
  99. BVS error1
  100. MOV R5,R0
  101. CMP R5,#ASC"T"
  102. BLEQ get_total
  103. BL get_a_date
  104. CMP R5,#ASC"T"
  105. BLNE add
  106. MOV R3,R9
  107. MOV R4,#0
  108. .move_down
  109. LDRB R0,[R3,#8]
  110. STRB R0,[R3],#1
  111. ADD R4,R4,#1
  112. CMP R4,#5
  113. BNE move_down
  114. MOV R0,#5
  115. MOV R1,R10
  116. SWI "XOS_Args"
  117. BVS error1
  118. CMP R2,#0
  119. MOVNE R6,R5
  120. BNE end_file1
  121. CMP R5,#ASC"F"
  122. BEQ get_first
  123. B get_next_date
  124. .end_file1
  125. CMP R6,#ASC"F"
  126. BEQ skip_current
  127. .end_file
  128. ADD R1,R9,#8
  129. MOV R0,#3
  130. STRB R0,[R1]
  131. MOV R0,#14
  132. SWI "XOS_Word"
  133. BVS error1
  134. BL add
  135. .skip_current
  136. LDMFD R13!,{PC}
  137.  
  138. .get_total
  139. STMFD R13!,{R14}
  140. MOV R4,#0
  141. .grab_tot
  142. SWI "XOS_BGet"
  143. BVS error2
  144. STRB R0,[R12,R4]
  145. ADD R4,R4,#1
  146. CMP R4,#8
  147. BNE grab_tot
  148. LDR R8,[R12]
  149. LDR R7,[R12,#4]
  150. LDMFD R13!,{PC}
  151.  
  152. .add
  153. STMFD R13!,{R0-R6,R14}
  154. LDR R0,[R9,#8]
  155. LDR R1,[R9,#12]
  156. LDR R2,[R9]
  157. LDR R3,[R9,#4]
  158. SUBS R0,R0,R2
  159. SBC R1,R1,R3
  160. MOV R6,#0
  161. LDR R5,const
  162. MOV R2,#0
  163. MOV R3,#0
  164. .div3                         \ calculate number of minutes
  165. ADDS R2,R2,R5
  166. ADDCS R3,R3,#1
  167. CMP R3,R1
  168. CMPGE R2,R0
  169. ADDLE R6,R6,#1
  170. BLT div3
  171. MOV R5,R6
  172. MOV R1,#60
  173. MOV R2,#0
  174. MOV R4,#0
  175. .div4                         \ calculate number of hours & minutes
  176. ADD R2,R2,R1
  177. CMP R2,R6
  178. ADDLE R4,R4,#1                \ result in R4
  179. BLT div4
  180. SUBGT R2,R2,R1
  181. SUB R6,R5,R2                  \ remainder
  182. ADD R8,R8,R4
  183. ADD R7,R7,R6
  184. CMP R7,#60
  185. ADDGE R8,R8,#1
  186. SUBGE R7,R7,#60
  187. LDMFD R13!,{R0-R6,PC}
  188.  
  189. .const
  190. EQUD 6000                     \  number centiseconds in a minute
  191.  
  192. .tidy
  193. BL open_file
  194. BL count
  195. MOV R0,#3
  196. MOV R1,R10
  197. MOV R2,#6
  198. SWI "XOS_Args"
  199. BVS error
  200. MOV R0,#ASC"T"
  201. SWI "XOS_BPut"
  202. BVS error
  203. STR R8,[R9]
  204. STR R7,[R9,#4]
  205. MOV R4,#0
  206. .write_total
  207. LDRB R0,[R9,R4]
  208. SWI "XOS_BPut"
  209. BVS error
  210. ADD R4,R4,#1
  211. CMP R4,#8
  212. BNE write_total
  213. BL write_date
  214. B exit
  215.  
  216. .reset
  217. MOV R0,#11
  218. ADR R1,acfile
  219. MOV R2,#&1000
  220. SUB R2,R2,#3
  221. MOV R4,#0
  222. MOV R5,#0
  223. SWI "XOS_File"
  224. BVS error
  225. MOV R2,#ASC"S"                \ drops through automatically
  226.  
  227. .switch
  228. MOV R3,R2
  229. BL open_file
  230. MOV R1,R10
  231. BL end_of_file
  232. MOV R0,R3
  233. SWI "XOS_BPut"
  234. BVS error1
  235. BL write_date
  236. .exit
  237. MOV R0,#0
  238. MOV R1,R10
  239. SWI "XOS_Find"
  240. MOV R11,#0
  241. BVS error1
  242. LDMFD R13!,{PC}
  243.  
  244. .acfile
  245. EQUS "<ac$dir>.wtmp"
  246. EQUB 0
  247. ALIGN
  248.  
  249. .open_file                    \ opens wtmp file
  250.                               \ returns R0 = filehandle or returns to
  251.                               \ previous calling routine
  252. MOV R0,#&C7
  253. ADR R1,acfile
  254. SWI "XOS_Find"
  255. BVS error
  256. CMP R1,#0
  257. LDMEQFD R13!,{PC}
  258. MOV R11,#1
  259. MOV R10,R0
  260. MOV PC,R14
  261.  
  262. .end_of_file                  \ moves sequential pointer to end of file
  263.                               \ preserves R1
  264.                               \ uses R0,R2
  265. MOV R0,#2
  266. SWI "XOS_Args"
  267. BVS error
  268. MOV R0,#1
  269. SWI "XOS_Args"
  270. BVS error
  271. MOV PC,R14
  272.  
  273. .write_date                   \ store date as 5 byte block to end of file
  274. MOV R2,R1
  275. MOV R1,R9
  276. MOV R0,#3
  277. STRB R0,[R1]
  278. MOV R0,#14
  279. SWI "XOS_Word"
  280. BVS error
  281. MOV R3,R1
  282. MOV R1,R2
  283. MOV R4,#0
  284. .get_date
  285. LDRB R0,[R3,R4]
  286. SWI "XOS_BPut"
  287. BVS error
  288. ADD R4,R4,#1
  289. CMP R4,#5
  290. BNE get_date
  291. MOV PC,R14
  292.  
  293. .p_header
  294. EQUS "operation          date/time"
  295. EQUB 13
  296. EQUB 10
  297. EQUS "---------------------------------------------------"
  298. EQUB 13
  299. EQUB 10
  300. EQUB 10
  301. EQUB 0
  302. .spaces
  303. EQUS "     "
  304. EQUB 0
  305. ALIGN
  306.  
  307. .print
  308. BL open_file
  309. ADR R0,p_header
  310. SWI "XOS_Write0"
  311. .get_next
  312. MOV R1,R10
  313. SWI "XOS_BGet"
  314. BVS error
  315. MOV R6,R0
  316. CMP R6,#ASC"N"
  317. ADREQ R0,on
  318. BEQ skip_c
  319. CMP R6,#ASC"S"
  320. ADREQ R0,strt
  321. BEQ skip_c
  322. CMP R6,#ASC"T"
  323. ADREQ R0,tttl
  324. ADRNE R0,off
  325. .skip_c
  326. SWI "XOS_Write0"
  327. ADR R0,spaces
  328. SWI "XOS_Write0"
  329. MOV R3,R9
  330. MOV R1,R10
  331. CMP R6,#ASC"T"
  332. BLEQ get_totalp
  333. BL get_a_datep
  334. MOV R0,R9
  335. ADD R1,R0,#5
  336. MOV R2,#40
  337. SWI "XOS_ConvertStandardDateAndTime"
  338. BVS error
  339. SWI "XOS_Write0"
  340. CMP R6,#ASC"T"
  341. BEQ print_totl
  342. SWINE "XOS_NewLine"
  343. .cont_print
  344. MOV R1,R10
  345. MOV R0,#5
  346. SWI "XOS_Args"
  347. BVS error
  348. CMP R2,#0
  349. BEQ get_next
  350. MOV R0,#0
  351. SWI "XOS_Find"
  352. MOV R11,#0
  353. BVS error
  354. SWI "XOS_NewLine"
  355. SWI "XOS_NewLine"
  356. B total
  357.  
  358. .get_totalp
  359. STMFD R13!,{R14}
  360. STMFD R13!,{R14}
  361. BL get_total
  362. LDMFD R13!,{R14}
  363. LDMFD R13!,{PC}^
  364.  
  365. .get_a_datep
  366. STMFD R13!,{R14}
  367. STMFD R13!,{R14}
  368. BL get_a_date
  369. LDMFD R13!,{R14}
  370. LDMFD R13!,{PC}^
  371.  
  372. .print_totl
  373. ADR R0,open
  374. SWI "XOS_Write0"
  375. BL print_total
  376. ADR R0,close
  377. SWI "XOS_Write0"
  378. B cont_print
  379.  
  380. .open
  381. EQUS "  ( "
  382. EQUB 0
  383. .close
  384. EQUS " ) "
  385. EQUB 13
  386. EQUB 10
  387. EQUB 0
  388. ALIGN
  389.  
  390. .get_a_date                   \ get a date from file to parameter block
  391.                               \ R3 points to block
  392.                               \ R1 = filehandle
  393.                               \ uses R0,R4
  394. MOV R4,#0
  395. STMFD R13!,{R14}
  396. .read_date
  397. SWI "XOS_BGet"
  398. BVS error2
  399. STRB R0,[R3,R4]
  400. ADD R4,R4,#1
  401. CMP R4,#5
  402. BNE read_date
  403. LDMFD R13!,{PC}
  404.  
  405. .help
  406. ADR R0,help_text
  407. SWI "XOS_Write0"
  408. LDMFD R13!,{PC}
  409.  
  410. .set_r9
  411. ADR R9,parmblk
  412. MOV PC,R14
  413.  
  414. .error2
  415. LDMFD R13!,{R14}
  416. .error1
  417. LDMFD R13!,{R14}
  418. .error
  419. CMP R11,#1
  420. MOVEQ R3,R0
  421. MOVEQ R0,#0
  422. MOVEQ R1,R10
  423. SWIEQ "XOS_Find"
  424. MOVEQ R0,R3
  425. ADR R3,mask
  426. LDR R3,[R3]
  427. TEQP PC,R3
  428. LDMFD R13!,{PC}
  429.  
  430. .mask EQUD &10000000
  431.  
  432. .strt
  433. EQUS "started"
  434. EQUB 0
  435. .on
  436. EQUS "   on  "
  437. EQUB 0
  438. .off
  439. EQUS "   off "
  440. EQUB 0
  441. .tttl
  442. EQUS " tidied"
  443. EQUB 0
  444.  
  445. .parmblk
  446. EQUD 3
  447. EQUS STRING$(50,CHR$0)
  448.  
  449. .help_text
  450. EQUB 10
  451. EQUB 13
  452. EQUS "Archimedes system usage accounting program "
  453.  
  454. EQUS "ac v."
  455. EQUS version$
  456. EQUS " (c) "
  457. EQUS update$
  458. EQUS " Jason O'Broin"
  459. EQUB 13
  460. EQUB 10
  461. EQUB 10
  462. EQUS "Syntax : *ac (<-options>)"
  463. EQUB 13
  464. EQUB 10
  465. EQUB 10
  466. EQUS "*ac               prints total time"
  467. EQUB 13
  468. EQUB 10 
  469. EQUB 10
  470. EQUS "options <rpnfth> :"
  471. EQUB 13
  472. EQUB 10
  473. EQUS "-r                reset data files"
  474. EQUB 13
  475. EQUB 10
  476. EQUS "-p                print all accounting information"
  477. EQUB 13
  478. EQUB 10
  479. EQUS "-n                record current time/date as switch on"
  480. EQUB 13
  481. EQUB 10
  482. EQUS "-f                record current time/date as switch off"
  483. EQUB 13
  484. EQUB 10
  485. EQUS "-t                tidy up data file"
  486. EQUB 13
  487. EQUB 10
  488. EQUS "-h                print this message"
  489. EQUB 13
  490. EQUB 10
  491. EQUB 0
  492. ALIGN
  493. ] NEXT
  494. OSCLI "SAVE ac "+STR$~(code)+" "+STR$~(P%)
  495. *SETTYPE ac Utility
  496.