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
/
C80
/
C80FNS.CQ
/
C80FNS.C
Wrap
Text File
|
2000-06-30
|
4KB
|
173 lines
/* A few non-redundant functions from Harvey G. Lord's C80LIB.C, for
the Software Toolworks C/80 Version 3.1 C compiler, including:
char bios(call_number,register_c_value)
char peek(addr)
poke(addr,char_value)
char inp(port_number)
outp(port_number,char_value)
pause() -- wait for keyboard activity
sleep(tenths_of_second_value) -- interruptible by kbhit, 4 mHz(?)
kbhit() -- true iff keypress
H.G.L's original header refers to C/80 Version 2. Note that C/80 v3.1,
the Software Toolworks current version (8-25-84), contains a very nice
standard library with functions which make nearly all of the HGL library
obsolete, at this point. The full C80.LBR for the Toolworks' version 2
is still available on the Royal Oak Technical RCPM (where it is a
"squeezed" LBR!), and maybe on the Acropolis board in Georgia. HGL's
library is the major part of that LBR, which also contains the originals
of RANDI1.C and RANDI2.C, plus a nearly incomprehensible (undocumented,
non-recursive, inaccurately described as the program in K&P's Software
Tools) version of quicksort. The time required to download the squeezed
LBR at Royal Oak makes the final package disappointing; it is not worth
the expense, now that Toolworks is shipping version 3.1.
These functions are passed on in exactly the same form as I found them. No
warranty expressed or implied, except that they have survived the scrutiny
of numerous sysops since at least April of 1983.
--David C. Oshel
1219 Harding Ave.
Ames, Iowa 50010
August 25, 1984
Original header:
Standard library of C functions
for C/80 (Software Toolworks) (... Bilofsky's is STDLIB.C)
NOTE: C/80 requires that you pass the
number of arguments to a function that
the function expects. If you only need
to pass one argument, but the function
was written for two, pass a null for
the other. Without the second argument
C/80 bombs. (... still true! -dco)
Harvey G. Lord
*/
/* abbreviated library follows -dco, 8/25/84 */
char bios(n,c) /* calls bios function number n */
int n,c;
{
/* get bios address + function # times 3 */
#asm
JMP .begin
.addr: DW 0
.begin: POP H ; save return address
SHLD .addr
POP B ; 1st arg into c
POP D ; get function #
LXI H,.retadd
PUSH H ; put return addr on stack
LHLD 1 ; get bios vector
DCX H
DCX H
DCX H
DAD D ; times 3, add to vector
DAD D
DAD D
PCHL ; jump to bios vector
.retadd: LHLD .addr ; restore stack
PUSH B
PUSH B
PUSH H
MOV L,A ; return argument in hl
MVI H,0
#endasm
}
char peek(n) /* return the contents of address n */
char *n; {
return(*n);
}
poke(n,b) /* "poke" byte value b into address n */
char *n,b; {
*n = b;
}
char inp(n) /* return byte value from port n */
int n; {
#asm
INX SP ; past return address
INX SP
POP H ; port number
MOV H,L
MVI L,0DBH ; input op code
SHLD .port
.port: DW 0 ; opcode & port go here, then .port is executed (dco)
MVI H,0
MOV A,L
PUSH H
DCX SP ; return address
DCX SP
#endasm
}
outp(n,b) /* send byte value b to port n */
int n,b; {
#asm
INX SP ; past return addr
INX SP
POP H ; value
MOV A,H
POP H ; port
MOV H,L
MVI L,0D3H ; out op code
SHLD .oport
.oport: DW 0 ; opcode & port go here, then .oport is executed (dco)
PUSH H ; restore stack
PUSH H
DCX SP
DCX SP
#endasm
}
pause() /* sit and wait until the keyboard is hit */
{
while(!kbhit());
}
sleep(n) /* sleep for n/10 seconds */
int n; {
int i,j,k;
for(i=0; i!=n; ++i){
for(j=0; j!=10; ++j){
for(k=0; k!=0xAF; ++k);
if(kbhit()){ getchar(); exit();}
}
}
}
kbhit() /* return true if a character is waiting at
the console */
{
return(bdos(11,0)); /* console status */
/*
kbhit() also works as a bios call. In that case it's
return(bios(2,0));
H.G.L.
*/
}