home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
GENASM
/
SPTTIM10.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
7KB
|
386 lines
* PROGRAM: SPTTIME.ASM
* AUTHOR: RICHARD CONN
* VERSION: 1.0
* DATE: 7 MAR 82
* PREVIOUS VERSIONS: None
VERS EQU 10 ;Version Number
*
* SPTTIME is a Support Package which provides Clock Interface Support
* to programs which generally require it for enhanced performance
* (i.e., Time included in their outputs). SPTTIME consists of two
* Modules:
* 1. ENDIT -- Returns address of next available page after SPTTIME
* in HL
* 2. GETTIME -- Returns a pointer to an ASCII text string (vector
* of characters ending in a binary 0) which represents the
* Time, Day of Week, and Date read from a clock. This pointer
* is returned in HL, and a condition code (0 if clock not
* supported and 0FFH if clock supported, which is usually the
* case, with the Zero Flag set appropriately) is returned in A.
*
* Both routines may affect only HL and A/PSW Registers.
*
*
* This SPTTIME Support Package is implemented for the DC Hayes Chronograph
* which is wired into the system to be commanded thru the PUN: device and
* read thru the RDR: device.
*
*
* Basic Equates
*
BDOS equ 5 ; BDOS Entry
CR equ 0dh ; <CR>
*
* Program Equates
* Set the desired program to TRUE and all others FALSE
*
FALSE equ 0 ; FALSE Definition
TRUE equ NOT FALSE
PRINT2 equ TRUE
CAT2 equ FALSE
*
* Origin Table -- this should be set up for each program supported
*
IF PRINT2
BASE EQU 1500H ; BASE ADDRESS
ENDIF
IF CAT2
BASE EQU 2000H ; BASE ADDRESS
ENDIF
*
* SPTTIME Modules --
*
org BASE ; Origin
jmp endit ; Return Page After Support Package in HL
jmp gettime ; Return Time Pted to by HL and A <> 0 with flag set
*
* Return Page Address after Support Package in HL
*
endit:
lxi h,endall ; Address in HL
ret
*
* Return Time as String Pted to by HL
*
gettime:
push d ; Save DE, BC
push b
*
* Extract Data from Clock
*
call readclock
*
* Load Time/Date/Weekday into buffer 'String'
*
call prclock
lxi h,string ; Pt to Buffer
mvi a,0ffh ; OK
ora a ; Clear Flags
pop b ; Restore BC, DE
pop d
ret
*
* Clock Input/Output Entry Routines
*
ciclk:
push h ; Save regs
push d
push b
mvi c,3 ; RDR: Input
call bdos
ani 7fh ; Mask out MSB if Set
pop b ; Restore regs
pop d
pop h
ret
coclk:
push h ; Save regs
push d
push b
push psw
mvi c,4 ; PUN: Output
mov e,a ; Char in E
call bdos
pop psw ; Restore regs
pop b
pop d
pop h
ret
*
* Print Time/Date/Weekday on String
*
prclock:
call prinit ;Initialize Print
call prtime ;Print Time
call space ;Space
call space
call prmonth ;Print Month Name
call space
call prday ;Print Day Number
call pryear ;Print Year
call prdone ;Close Print
ret
*
* Read Time, Date, and Weekday from Clock
*
readclock:
lxi h,time ;Point to Time Buffer
call command
db 'RT' ;Read Time
lxi h,date ;Point to Date Buffer
call command
db 'RD' ;Read Date
ret
*
* Print Time on String
*
prtime:
lxi h,time ;Print Time Info
call pr2s ;Print 2 digits
call colon ;Print :
call pr2 ;Print 2 digits
call colon ;Print :
call pr2 ;Print 2 digits
call space ;Space
mov a,m ;Get A or P
call cpout
mvi a,'M' ;Print M
call cpout
ret
*
* Print Month Name
*
prmonth:
lxi h,date+2 ;Convert month number
mov a,m ;Get first digit
sui '0' ;Convert to Binary
mov b,a ;Save in B
add a ;*2
add a ;*4
add b ;*5
add a ;*10
inx h ;Point to next digit
mov b,a ;Value in B
mov a,m ;Get Digit
sui '0' ;Convert to Binary
add b ;Add in
lxi d,mlen ;Length of Month Strings
lxi h,months ;Beginning of Month Strings
call offset ;Compute Offset to Desired String
call cpstr ;Print Month Name
ret
*
* Print Day Number
*
prday:
lxi h,date+4 ;Point to Day Digits
call pr2s ;Print as 2 Digits
ret
*
* Print Year
*
pryear:
call cprint ;Print Year Prefix
db ', 19',0
lxi h,date ;Point to Year
call pr2 ;Print 2 Digits
ret
*
* Print colon or space
*
colon:
mvi a,':' ;Print colon
jmp cpout
space:
mvi a,' ' ;Print space
jmp cpout
*
* Command -- Issue 2-letter command pointed to by Return Address to Clock
* and copy response into buffer pointed to by HL; affect all registers
*
command:
mvi a,'A' ;Send 'AT'
call coclk ;Send to Clock
mvi a,'T'
call coclk
xthl ;Pt to command letters and save HL
mov a,m ;Get it
call coclk ;Send to Clock
inx h ;Pt to next char
mov a,m ;Get it
call coclk ;Send to Clock
inx h ;Pt to ret adr
xthl ;Get HL and save ret adr
mvi a,CR ;Send <CR>
call coclk ;Send to Clock
* Collect Response Chars
cmdloop:
call ciclk ;Get letter
cpi CR ;End of Response?
jz cmddone
mov m,a ;Store in Buffer
inx h ;Point to next position
jmp cmdloop
cmddone:
mvi m,0 ;Store ending zero
ret
*
* PR2S -- Print chars pointed to by HL and HL+1; if first character is '0',
* print only one char; affect all registers; on exit, HL points to byte
* after 2nd char printed
* PR2 -- PR2S but always print 2 digits
*
pr2:
mov a,m ;Get first char
jmp pr2a
pr2s:
mov a,m ;Get first char
cpi '0' ;Leading zero?
jz pr2b
pr2a:
call cpout ;Print char
pr2b:
inx h ;Point to next
mov a,m ;Get it
call cpout
inx h ;Point to next
ret
*
* Compute Offset to selected string; on input, HL points to first
* string, DE=string length, A=Number of String desired (first string = 1)
*
offset:
dcr a ;Count down
rz
dad d ;Point to next
jmp offset
*
* Initialize Buffer Output
*
prinit:
lxi h,string ; Pt to first byte of string
shld bptr ; Set ptr
ret
*
* Close Buffer Output
*
prdone:
push h ; save HL
lhld bptr ; Get ptr
mvi m,0 ; Store ending 0
pop h ; restore HL
ret
*
* Send char in A to String
*
cpout:
push h ; save HL
lhld bptr ; Pt to next char location
mov m,a ; Put char
inx h ; Incr ptr
shld bptr
pop h
ret
*
* Print string pted to by return address into String
*
cprint:
xthl ;Pt to string
cpr1:
mov a,m ;Get char
inx h ;Pt to next
ora a ;Done?
jz cpr2
call cpout ;Print to CON: or LST:
jmp cpr1
cpr2:
xthl ;Restore HL and Ret Adr
ret
*
* Print string pted to by HL into String
*
cpstr:
push h ;Save ptr
push psw ;Save char
cpstr1:
mov a,m ;Get next char
inx h ;Pt to next char
ora a ;Done?
jz cpstr2
call cpout ;Print char
jmp cpstr1
cpstr2:
pop psw ;Get char
pop h ;Get ptr
ret
*
* Month Strings
*
months:
db 'January',0,0,0
month1:
db 'February',0,0
db 'March',0,0,0,0,0
db 'April',0,0,0,0,0
db 'May',0,0,0,0,0,0,0
db 'June',0,0,0,0,0,0
db 'July',0,0,0,0,0,0
db 'August',0,0,0,0
db 'September',0
db 'October',0,0,0
db 'November',0,0
db 'December',0,0
mlen equ month1-months ;Number of Bytes in Each Entry
*
* Input Buffers
*
bptr:
ds 2 ; Pointer to next char position in String Buffer
time:
ds 10 ; Time Buffer
date:
ds 10 ; Date Buffer
string:
ds 80 ; Output String Buffer
endall equ $/256*256+256 ; End of Support Package
end