home *** CD-ROM | disk | FTP | other *** search
- REM >acSrc
- REM Computer Usage Accounting Program
- REM (c) 1991 Jason O'Broin
- REM Version 1.01
- REM Last Update : 11/09/91
-
- version$="1.01"
- update$="11/09/91"
-
- DIM code 2000
- FOR X=0 TO 3 STEP 3
- P%=code
- [ OPT X
- STMFD R13!,{R14}
- BL set_r9
- MOV R11,#0
- .skipspace
- LDRB R2,[R1],#1
- CMP R2,#32
- BLT total
- CMP R2,#ASC"-"
- BNE skipspace
- LDRB R2,[R1],#1
- AND R2,R2,#&DF
- CMP R2,#ASC"R"
- BEQ reset
- CMP R2,#ASC"P"
- BEQ print
- CMP R2,#ASC"N"
- BEQ switch
- CMP R2,#ASC"F"
- BEQ switch
- CMP R2,#ASC"T"
- BEQ tidy
- CMP R2,#ASC"H"
- BEQ help
-
- .total
- BL open_file
- BL count
- ADR R0,ttl
- SWI "XOS_Write0"
- BL print_total
- SWI "XOS_NewLine"
- B exit
-
- .print_total
- STMFD R13!,{R14}
- MOV R0,R8
- MOV R1,R12
- MOV R2,#6
- SWI "XOS_ConvertCardinal2"
- SWI "XOS_Write0"
- ADR R0,hr
- SWI "XOS_Write0"
- MOV R0,R7
- MOV R1,R12
- MOV R2,#4
- SWI "XOS_ConvertCardinal1"
- SWI "XOS_Write0"
- ADR R0,mins
- SWI "XOS_Write0"
- BVS error1
- LDMFD R13!,{PC}^
-
- .ttl
- EQUS " Total "
- EQUB 0
- .hr
- EQUS " hrs "
- EQUB 0
- .mins
- EQUS " mins"
- EQUB 0
- ALIGN
-
- .count
- STMFD R13!,{R14}
- MOV R7,#0 \ minutes counter
- MOV R8,#0 \ hours counter
- .get_first
- MOV R3,R9
- MOV R1,R10
- SWI "XOS_BGet"
- BVS error1
- MOV R6,R0
- BL get_a_date
- MOV R0,#5
- SWI "XOS_Args"
- BVS error1
- CMP R2,#0
- BNE end_file1
- CMP R6,#ASC"F"
- BEQ get_first
- .get_next_date
- ADD R3,R9,#8
- MOV R1,R10
- SWI "XOS_BGet"
- BVS error1
- MOV R5,R0
- CMP R5,#ASC"T"
- BLEQ get_total
- BL get_a_date
- CMP R5,#ASC"T"
- BLNE add
- MOV R3,R9
- MOV R4,#0
- .move_down
- LDRB R0,[R3,#8]
- STRB R0,[R3],#1
- ADD R4,R4,#1
- CMP R4,#5
- BNE move_down
- MOV R0,#5
- MOV R1,R10
- SWI "XOS_Args"
- BVS error1
- CMP R2,#0
- MOVNE R6,R5
- BNE end_file1
- CMP R5,#ASC"F"
- BEQ get_first
- B get_next_date
- .end_file1
- CMP R6,#ASC"F"
- BEQ skip_current
- .end_file
- ADD R1,R9,#8
- MOV R0,#3
- STRB R0,[R1]
- MOV R0,#14
- SWI "XOS_Word"
- BVS error1
- BL add
- .skip_current
- LDMFD R13!,{PC}
-
- .get_total
- STMFD R13!,{R14}
- MOV R4,#0
- .grab_tot
- SWI "XOS_BGet"
- BVS error2
- STRB R0,[R12,R4]
- ADD R4,R4,#1
- CMP R4,#8
- BNE grab_tot
- LDR R8,[R12]
- LDR R7,[R12,#4]
- LDMFD R13!,{PC}
-
- .add
- STMFD R13!,{R0-R6,R14}
- LDR R0,[R9,#8]
- LDR R1,[R9,#12]
- LDR R2,[R9]
- LDR R3,[R9,#4]
- SUBS R0,R0,R2
- SBC R1,R1,R3
- MOV R6,#0
- LDR R5,const
- MOV R2,#0
- MOV R3,#0
- .div3 \ calculate number of minutes
- ADDS R2,R2,R5
- ADDCS R3,R3,#1
- CMP R3,R1
- CMPGE R2,R0
- ADDLE R6,R6,#1
- BLT div3
- MOV R5,R6
- MOV R1,#60
- MOV R2,#0
- MOV R4,#0
- .div4 \ calculate number of hours & minutes
- ADD R2,R2,R1
- CMP R2,R6
- ADDLE R4,R4,#1 \ result in R4
- BLT div4
- SUBGT R2,R2,R1
- SUB R6,R5,R2 \ remainder
- ADD R8,R8,R4
- ADD R7,R7,R6
- CMP R7,#60
- ADDGE R8,R8,#1
- SUBGE R7,R7,#60
- LDMFD R13!,{R0-R6,PC}
-
- .const
- EQUD 6000 \ number centiseconds in a minute
-
- .tidy
- BL open_file
- BL count
- MOV R0,#3
- MOV R1,R10
- MOV R2,#6
- SWI "XOS_Args"
- BVS error
- MOV R0,#ASC"T"
- SWI "XOS_BPut"
- BVS error
- STR R8,[R9]
- STR R7,[R9,#4]
- MOV R4,#0
- .write_total
- LDRB R0,[R9,R4]
- SWI "XOS_BPut"
- BVS error
- ADD R4,R4,#1
- CMP R4,#8
- BNE write_total
- BL write_date
- B exit
-
- .reset
- MOV R0,#11
- ADR R1,acfile
- MOV R2,#&1000
- SUB R2,R2,#3
- MOV R4,#0
- MOV R5,#0
- SWI "XOS_File"
- BVS error
- MOV R2,#ASC"S" \ drops through automatically
-
- .switch
- MOV R3,R2
- BL open_file
- MOV R1,R10
- BL end_of_file
- MOV R0,R3
- SWI "XOS_BPut"
- BVS error1
- BL write_date
- .exit
- MOV R0,#0
- MOV R1,R10
- SWI "XOS_Find"
- MOV R11,#0
- BVS error1
- LDMFD R13!,{PC}
-
- .acfile
- EQUS "<ac$dir>.wtmp"
- EQUB 0
- ALIGN
-
- .open_file \ opens wtmp file
- \ returns R0 = filehandle or returns to
- \ previous calling routine
- MOV R0,#&C7
- ADR R1,acfile
- SWI "XOS_Find"
- BVS error
- CMP R1,#0
- LDMEQFD R13!,{PC}
- MOV R11,#1
- MOV R10,R0
- MOV PC,R14
-
- .end_of_file \ moves sequential pointer to end of file
- \ preserves R1
- \ uses R0,R2
- MOV R0,#2
- SWI "XOS_Args"
- BVS error
- MOV R0,#1
- SWI "XOS_Args"
- BVS error
- MOV PC,R14
-
- .write_date \ store date as 5 byte block to end of file
- MOV R2,R1
- MOV R1,R9
- MOV R0,#3
- STRB R0,[R1]
- MOV R0,#14
- SWI "XOS_Word"
- BVS error
- MOV R3,R1
- MOV R1,R2
- MOV R4,#0
- .get_date
- LDRB R0,[R3,R4]
- SWI "XOS_BPut"
- BVS error
- ADD R4,R4,#1
- CMP R4,#5
- BNE get_date
- MOV PC,R14
-
- .p_header
- EQUS "operation date/time"
- EQUB 13
- EQUB 10
- EQUS "---------------------------------------------------"
- EQUB 13
- EQUB 10
- EQUB 10
- EQUB 0
- .spaces
- EQUS " "
- EQUB 0
- ALIGN
-
- .print
- BL open_file
- ADR R0,p_header
- SWI "XOS_Write0"
- .get_next
- MOV R1,R10
- SWI "XOS_BGet"
- BVS error
- MOV R6,R0
- CMP R6,#ASC"N"
- ADREQ R0,on
- BEQ skip_c
- CMP R6,#ASC"S"
- ADREQ R0,strt
- BEQ skip_c
- CMP R6,#ASC"T"
- ADREQ R0,tttl
- ADRNE R0,off
- .skip_c
- SWI "XOS_Write0"
- ADR R0,spaces
- SWI "XOS_Write0"
- MOV R3,R9
- MOV R1,R10
- CMP R6,#ASC"T"
- BLEQ get_totalp
- BL get_a_datep
- MOV R0,R9
- ADD R1,R0,#5
- MOV R2,#40
- SWI "XOS_ConvertStandardDateAndTime"
- BVS error
- SWI "XOS_Write0"
- CMP R6,#ASC"T"
- BEQ print_totl
- SWINE "XOS_NewLine"
- .cont_print
- MOV R1,R10
- MOV R0,#5
- SWI "XOS_Args"
- BVS error
- CMP R2,#0
- BEQ get_next
- MOV R0,#0
- SWI "XOS_Find"
- MOV R11,#0
- BVS error
- SWI "XOS_NewLine"
- SWI "XOS_NewLine"
- B total
-
- .get_totalp
- STMFD R13!,{R14}
- STMFD R13!,{R14}
- BL get_total
- LDMFD R13!,{R14}
- LDMFD R13!,{PC}^
-
- .get_a_datep
- STMFD R13!,{R14}
- STMFD R13!,{R14}
- BL get_a_date
- LDMFD R13!,{R14}
- LDMFD R13!,{PC}^
-
- .print_totl
- ADR R0,open
- SWI "XOS_Write0"
- BL print_total
- ADR R0,close
- SWI "XOS_Write0"
- B cont_print
-
- .open
- EQUS " ( "
- EQUB 0
- .close
- EQUS " ) "
- EQUB 13
- EQUB 10
- EQUB 0
- ALIGN
-
- .get_a_date \ get a date from file to parameter block
- \ R3 points to block
- \ R1 = filehandle
- \ uses R0,R4
- MOV R4,#0
- STMFD R13!,{R14}
- .read_date
- SWI "XOS_BGet"
- BVS error2
- STRB R0,[R3,R4]
- ADD R4,R4,#1
- CMP R4,#5
- BNE read_date
- LDMFD R13!,{PC}
-
- .help
- ADR R0,help_text
- SWI "XOS_Write0"
- LDMFD R13!,{PC}
-
- .set_r9
- ADR R9,parmblk
- MOV PC,R14
-
- .error2
- LDMFD R13!,{R14}
- .error1
- LDMFD R13!,{R14}
- .error
- CMP R11,#1
- MOVEQ R3,R0
- MOVEQ R0,#0
- MOVEQ R1,R10
- SWIEQ "XOS_Find"
- MOVEQ R0,R3
- ADR R3,mask
- LDR R3,[R3]
- TEQP PC,R3
- LDMFD R13!,{PC}
-
- .mask EQUD &10000000
-
- .strt
- EQUS "started"
- EQUB 0
- .on
- EQUS " on "
- EQUB 0
- .off
- EQUS " off "
- EQUB 0
- .tttl
- EQUS " tidied"
- EQUB 0
-
- .parmblk
- EQUD 3
- EQUS STRING$(50,CHR$0)
-
- .help_text
- EQUB 10
- EQUB 13
- EQUS "Archimedes system usage accounting program "
-
- EQUS "ac v."
- EQUS version$
- EQUS " (c) "
- EQUS update$
- EQUS " Jason O'Broin"
- EQUB 13
- EQUB 10
- EQUB 10
- EQUS "Syntax : *ac (<-options>)"
- EQUB 13
- EQUB 10
- EQUB 10
- EQUS "*ac prints total time"
- EQUB 13
- EQUB 10
- EQUB 10
- EQUS "options <rpnfth> :"
- EQUB 13
- EQUB 10
- EQUS "-r reset data files"
- EQUB 13
- EQUB 10
- EQUS "-p print all accounting information"
- EQUB 13
- EQUB 10
- EQUS "-n record current time/date as switch on"
- EQUB 13
- EQUB 10
- EQUS "-f record current time/date as switch off"
- EQUB 13
- EQUB 10
- EQUS "-t tidy up data file"
- EQUB 13
- EQUB 10
- EQUS "-h print this message"
- EQUB 13
- EQUB 10
- EQUB 0
- ALIGN
- ] NEXT
- OSCLI "SAVE ac "+STR$~(code)+" "+STR$~(P%)
- *SETTYPE ac Utility
-