home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
rcpm
/
bytime31.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
9KB
|
433 lines
;
; BYETIME2 by: Joubert Berger
; Atlanta Kaypro MBBS
; (404) 923-2580 [300/1200 baud]
;
; 8/16/86 - Fixed code to save stack properly so program will exit
; v. 31 with a simple RETurn instead of a warm-boot (faster this
; way). Removed seconds display (non-essential info).
;
; 6/28/86 - Eliminated 'S' option. Now displays time/date along with
; v. 30 stats. Fixed nulls (removed MOV E,A as value already in A).
; Added equate for clock. Made display a little more pleasing
; to the eye.
; Lawrence Davis - Glendale Litera QBBS - 818/956-6164
;
;
;**********************************************************************
; 12/22/85 ADDED RBBS38 SUPPORT JIM GOOCH (Norcross RCPM) 921-1116
;**********************************************************************
; After just setting up BYE502, I decided to play around a bit with
; the extended BDOS functions that are in BYE5xx.
;
; BYETIME will display the time and date to the user if he just types
; 'BYETIME'. If he types 'BYETIME S' he will be given some statistcs about
; what kind of access he has. It will include the max. drive/user,
; time on system, max. time allowed, number of nulls, and if the
; sysop is in.
;
; It is nothing fancy, and not written that great, but it is just a
; demonstration how you can use all those new BDOS calls in BYE5xx.
; If anyone adds or updates anything to this, I would appreciate it
; if they send me a copy of it.
; Joubert Berger - 12/17/85
;
;
NO EQU 0
YES EQU NOT NO
;
RBBS EQU YES ; Set YES if RBBS or QBBS
MBBS EQU NO ; Set YES if MBBS
CLOCK EQU YES ; Yes, if RTC installed
;
GSUSR EQU 32 ; Get/Set user
MXDRV EQU 69 ; Max drive
MXUSR EQU 70 ; Max user
NULLS EQU 72 ; Number of nulls
BELLON EQU 78 ; Bell toggle
RTCBUF EQU 79 ; Get clock(RTC) buffer
LCDATA EQU 80 ; Get user buffer
MXTIME EQU 81 ; Max time on system
;
CR EQU 0DH ; Carrige return
LF EQU 0AH ; Line feed
FCB EQU 5CH ; File control block
BDOS EQU 0005H ;
ORG 100H
BEGIN: LXI H,0 ; Save stack for RET exit
DAD SP
SHLD OLDSP
;
MVI C,GSUSR ; Check if running BYE
MVI E,241
CALL BDOS
CPI 77
JZ START ; If there continue
CALL ILPRT ; If not abort - Print abort message
DB 'BYE5xx is not running....aborting.',0
JMP EXIT
;
START:
;
IF CLOCK
TIME: CALL ILPRT
DB CR,LF,0
CALL DATE ; Read the clock buffer
LDA HRSAV ; Get hour
CALL PASC ; Print it
;
MVI A,':'
CALL CTYPE
;
LDA MNSAV ; Get minutes
CALL PASC ; Print it
;
CALL ILPRT
DB ' ',0
;
LDA MMSAV ; Get the month
CPI 1 ; And print the month name
JNZ FEBU
CALL ILPRT
DB 'January ',0
JMP DONE
;
FEBU: CPI 2
JNZ MARC
CALL ILPRT
DB 'February ',0
JMP DONE
;
MARC: CPI 3
JNZ APRL
CALL ILPRT
DB 'March ',0
JMP DONE
;
APRL: CPI 4
JNZ MAYY
CALL ILPRT
DB 'April ',0
JMP DONE
;
MAYY: CPI 5
JNZ JUNE
CALL ILPRT
DB 'May ',0
JMP DONE
;
JUNE: CPI 6
JNZ JULY
CALL ILPRT
DB 'June ',0
JMP DONE
;
JULY: CPI 7
JNZ AUGS
CALL ILPRT
DB 'July ',0
JMP DONE
;
AUGS: CPI 8
JNZ SEPT
CALL ILPRT
DB 'August ',0
JMP DONE
;
SEPT: CPI 9
JNZ OCTO
CALL ILPRT
DB 'September ',0
JMP DONE
;
OCTO: CPI 10
JNZ NOVB
CALL ILPRT
DB 'October ',0
JMP DONE
;
NOVB: CPI 11
JNZ DECM
CALL ILPRT
DB 'November ',0
JMP DONE
;
DECM: CALL ILPRT
DB 'December ',0
;
DONE:
;
LDA DDSAV ; Get the day
CALL PASC ; Print it
;
CALL ILPRT
DB ', ',0
;
LDA CNSAV ; Get the century
CALL PASC ; Print it
LDA YYSAV ; Get the year
CALL PASC ; Print it
ENDIF
;
;
STATIS:
CALL ILPRT
DB CR,LF,LF,0
MVI C,LCDATA ; Get the user buffer
MVI E,255
CALL BDOS
; next 2 not necessary for RBBS (lastcalr name starts in col 1)
;
IF MBBS
INX H ; Jump over the first two spaces
INX H ; AT LEAST FOR MBBS
ENDIF ; MBBS
;
PRTNAM: MOV A,M ; Print the first name
;
IF MBBS
CPI ';' ; Check for end of first name
ENDIF ; MBBS
;
IF RBBS
CPI ' ' ; Rbbs uses a space
ENDIF ; Rbbs
;
JZ PRTNDN
CALL CTYPE
INX H
JMP PRTNAM
;
PRTNDN: CALL ILPRT
DB ', here are some statistics regarding your'
DB ' access level.',CR,LF,LF,0
;
; Here we go...
CALL ILPRT
DB 'Maximum Drive/User : ',0
;
MVI C,MXDRV ; Get max. drive
MVI E,255 ; Using the BDOS calls in BYE5
CALL BDOS
ADI 40H ; Make it a letter
CALL CTYPE ; Print it
;
MVI C,MXUSR ; Get max. user
MVI E,255
CALL BDOS
;
CPI 10 ; If user # < 10, skip
JC DUX
PUSH B
MVI C,'0'-1
DUY: INR C ; Get tens digit
SUI 10
JNC DUY ; Loop until we've gone too far
ADI 10
MOV B,A ; Save units digit
MOV A,C ; Print tens digit
CALL CTYPE
MOV A,B ; Get units back
POP B
DUX: ADI '0'
CALL CTYPE
;
CALL ILPRT ; Finish with a colon
DB ':',CR,LF,0
;
;
CALL ILPRT
DB 'Number of Nulls : ',0
;
MVI C,NULLS ; Get number of nulls
MVI E,255 ; Will be between 0 and 9
CALL BDOS
; MOV A,E ; Move it over
ADI 30H ; Make it a digit to print
CALL CTYPE
CALL ILPRT ; Clean up with a CR/LF
DB CR,LF,0
;
;
CALL ILPRT
DB 'Minutes on System : ',0
;
CALL DATE ; Use DATE to get current time on
LDA TOS ; System
CALL PASC ; Print it - already in binary
CALL ILPRT ; And clean up
DB CR,LF,0
;
;
CALL ILPRT
DB 'Maximum Time Allowed : ',0
;
MVI C,MXTIME ; Max. time on system allowed
MVI E,255
CALL BDOS
CPI 0 ; Check for unlimited
JNZ NOLIMT
CALL ILPRT ; And print "Unlimited" if so
DB 'UNLIMITED',0
JMP EXMXTIM
NOLIMT: CALL PASC ; Else print max. time allowed
CALL ILPRT
DB ' minutes',0
EXMXTIM:CALL ILPRT ; And finish up
DB CR,LF,0
;
;
CALL ILPRT
DB CR,LF,'The System Operator is currently ',0
;
MVI C,BELLON ; Now tell if sysop is in - this
MVI E,255 ; Is done by checking if console
CALL BDOS ; Bell is set or not
CPI 0FFH ; Check if set
JZ BELON
CALL ILPRT
DB 'not ',0 ; It is set so report it
BELON: CALL ILPRT
DB 'in.',CR,LF,0
;
EXIT:
LHLD OLDSP
SPHL
RET ; Done, so lets exit...
;
;========================================================================
;
; The call will find the Real-Time Clock buffer in BYE and get the hour,
; minutes, second, month, date, century, and year and save it in buffers
;
DATE: MVI C,RTCBUF ; Lets find the buffer
CALL BDOS ; Use BYE's BDOS call
;
MOV A,M ; Get the hour
CALL BCDBIN ; Change to binary
STA HRSAV ; Save it for later
INX H ; Increment the buffer
;
MOV A,M ; Get the minute
CALL BCDBIN ; Change to binary
STA MNSAV ; Save it for later
INX H ; Increment buffer
;
MOV A,M ; Get the second
CALL BCDBIN ; Change to binary
STA SESAV ; Save it
INX H ; Increment buffer
;
MOV A,M ; Get the century
CALL BCDBIN ; Change to binary
STA CNSAV ; Save it
INX H ; Increment buffer
;
MOV A,M ; Get the year
CALL BCDBIN ; Change to binary
STA YYSAV ; Save it
INX H ; Increment buffer
;
MOV A,M ; Get the month
STA MMSAV ; Save it - no need to change
INX H ; Increment buffer
;
MOV A,M ; Get the day
CALL BCDBIN ; Change to binary
STA DDSAV ; Save it for later
INX H ; Increment buffer
;
MOV A,M ; Get time on system
STA TOS ; Save if for later
;
RET
;
; Inline print routine - this will print everything until it finds
; a null (0).
;
ILPRT: XTHL
ILPLP: MOV A,M
INX H
ORA A
JZ ILPRET
CALL CTYPE
JMP ILPLP
ILPRET: XTHL
RET
;
; This will print the character in register A
;
CTYPE: PUSH B
PUSH D
PUSH H
PUSH PSW
MOV E,A
MVI C,2
CALL BDOS
POP PSW
POP H
POP D
POP B
RET
;
; This will convert the BCD number in A to binary
;
BCDBIN: PUSH PSW
ANI 0F0H
RRC
RRC
RRC
RRC
MOV C,A
MVI B,9
;
BCDBL: ADD C
DCR B
JNZ BCDBL
MOV B,A
POP PSW
ANI 0FH
ADD B
RET
;
; This will print the the binary number in A
;
PASC: MVI C,0
PASC1: SUI 10
JC PASC2
INR C
JMP PASC1
PASC2: ADI 10
PUSH PSW
MOV A,C
ORA A
JZ ONENUM
ADI 030H
CALL CTYPE
JMP TWONUM
ONENUM: MVI A,'0'
CALL CTYPE
TWONUM: POP PSW
ADI 030H
CALL CTYPE
RET
;
; Buffer area
;
HRSAV: DB 0 ; Hour
MNSAV: DB 0 ; Minutes
SESAV: DB 0 ; Seconds
CNSAV: DB 0 ; Century
YYSAV: DB 0 ; Year
MMSAV: DB 0 ; Month
DDSAV: DB 0 ; Day
TOS: DB 0 ; Time on system
;
OLDSP: DS 2
DS 20
STACK EQU $
END