home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
tdossigi
/
cbtod.aqm
/
CBTOD.ASM
Wrap
Assembly Source File
|
1986-07-05
|
3KB
|
188 lines
; CB80 CBTOD routine, fixed for seconds and for CP/M plus
;
; The original CBTOD routine in CB80 version 2.0 has a number of
; bugs:
; 1. BDOS function 155 is used instead of 105. 155 does not exist.
; 2. The routine, after changing to BDOS call 105, will only work
; with MP/M, not with CP/M plus.
; 3. the TIME$ function returns HHMM00 instead of HHMMSS.
;
; This file CBTOD.ASM fixes all of the above problems. It has not been
; officially blessed by DRI and application of this file to your copy
; of CB80 is at your own risk!
;
; HOW TO:
; 1. Use RMAC or M80 to assemble CBTOD.ASM into CBTOD.REL
; 2. rename your existing CB80.IRL library to something different,
; such as OLIB.IRL (preserve the .IRL type)
; 3. Use LIB as follows: LIB CB80[I]=OLIB.IRL<CBTOD>
; 4. Enjoy the DATE$ and TIME$ functions in CP/M plus.
;
; NOTE NOTE NOTE
; TO STRESS AGAIN, THIS CODE HAS NOT BEEN AUTHORIZED BY DRI AND WILL
; WORK WITH CB80 VERSION 2.0 ONLY!!!
;
; The original code below has been reconstructed with LIB.COM
;
public ?time,?date
extrn ?gets
;
; get the time and convert it to HHMMSS
;
?time: call p0093
lxi b,3003h ;b='0', c=byte counter
mvi d,0fh ;mask
lxi h,d0002 ;.data
p000b: mov a,m ;get byte
xthl ;save .data, get .destination
mov e,a ;save data byte
rrc ;get high nybble...
rrc ;...into low nybble
rrc
rrc
ana d ;mask out low nybble
ora b ;make ASCII
mov m,a ;store ASCII character
inx h ;point to next .dest
mov a,e ;get byte
ana d ;isolate low nybble
ora b ;make ASCII
mov m,a ;save it too
inx h ;increment .dest
xthl ;save .dest, get .data
inx h ;point to next data byte
dcr c ;all 3 done?
jnz p000b ;no, repeat
pop h ;munch up parameters
pop h
ret
;
; get the date and convert it to YYMMDD
;
?date: call p0093
mvi a,44h
push psw
mvi h,4dh
push h
p002d: pop d
pop psw
rrc
push psw
mvi a,1ch
aci 0
sta p0087+1
inr d
push d
mvi c,0ch
lxi d,p0087
lhld d0000
p0042: xchg
mov a,e
sub m
mov e,a
mov a,d
sbi 0
jm p005d
mov d,a
ora e
jz p005d
inx h
xchg
shld d0000
dcr c
jnz p0042
jmp p002d
;
p005d: pop d
pop psw
pop h
lda d0000
push psw
mvi a,13
sub c
push psw
push d
mvi b,10
mvi c,3
p006d: pop psw
mvi d,-1
p0070: sub b
inr d
jnc p0070
add b
mov e,a
mov a,d
ori '0'
mov m,a
inx h
mov a,e
ori '0'
mov m,a
inx h
dcr c
jnz p006d
pop h
ret
;
; This is the days table for the year. each entry is one month,
; with february being computed by the program.
;
p0087: db 1fh
ds 1
db 1fh,1eh,1fh,1eh,1fh
db 1fh,1eh,1fh,1eh,1fh
;
p0093: lxi h,8
call ?gets ;get buffer pointer in string fmt in HL
pop d
push h
mvi m,80h
inx h
mvi m,6
inx h
push h
push d
mvi c,12
call 5
mov a,h
ani 5
jnz dotim
mov a,l
cpi 30h ;cp/m plus?
jc p00b6 ;no, skip
dotim: mvi c,69h ;mp/m time/date call
lxi d,d0000
call 5
sta d0004
ret
;
p00b6: pop psw
pop d
mvi c,6
mvi a,' ' ;filler for no time call
p00bc: stax d
inx d
dcr c
jnz p00bc
pop h
ret
;
dseg
;
d0000: ds 2
d0002: ds 1
d0003: ds 1
d0004: ds 1
end
pop d
pop psw
pop h
lda d0000
push psw
mvi a,13
sub c
push psw
push d
mvi b,10
mvi c,3
p006d: po