smallC V2 CP/M runtime support - (nf)

utzoo!decvax!harpo!npoiv!npois!wbux5!wb2!houxz!ihnp4!ixn5c!inuxc!pur-ee!uiucdcs!schrein utzoo!decvax!harpo!npoiv!npois!wbux5!wb2!houxz!ihnp4!ixn5c!inuxc!pur-ee!uiucdcs!schrein
Sun Mar 13 22:43:58 AEST 1983


#N:uiucdcs:12600001:000:65535
uiucdcs!schrein    Mar 11 16:08:00 1983

When I announced this in 'net.micro', I was asked by a number of people
to make it publically available, so....

	smallC V2	a C subset (??) compiler for the 8080 family
	csh		a CP/M MACRO-80 environment for it

As is noted below, this is not complete -- mostly due to the fact that
the compiler still needs a lot of work. The runtime support, however,
is quite compatible with UN*X and thus should be a good starting point
for reworking the compiler.

Good luck to the next author...

Axel Schreiner -- University of Illinois.

%%%%%%%%%% scc/READ_ME %%%%%%%%%%
smallC V2 -- a C subset compiler for the 8080 family

	originally by Ron Cain
	V2 by Jim Hendrix (Dr. Dobb's Journal 12/82, 1/83)
	these sources (slightly modified) from 'net.sources'
	CP/M MACRO-80 runtime support by Axel Schreiner

This directory contains a LIB-80 listing of the runtime library for CP/M,
the announcement placed into 'net.micro', a status report listing some
known problems, and subdirectories with the sources.

	announce	from net.micro
	c.rel		runtime library listing
	rtl		runtime library sources
	scc		slightly modified smallC V2 sources
	status		known problems
	uty		some useful programs

This is not a finished product, but the current author is leaving for
Germany...
%%%%%%%%%% scc/announce %%%%%%%%%%
smallC V2 under CP/M and MACRO-80

I can make a runtime support for Hendrix' smallC V2 available that runs under
CP/M 2.2, likes to be used with Microsoft MACRO-80, and supports the following:

	full BIOS and BDOS interface with exercising programs
	all stdio calls, but for fread, fwrite, ftell, scanf
	string functions, isalpha.. functions
	memory management through calloc and cfree
	CP/M aids, e.g., mkfcb, mkfilename, dumpfcb, ...

	i/o redirection from the command line, including append
	command line in lower case, with \ escapes and '..' ".." strings

	NUL:, DKA:, DKB:, CON:, RDR:, PUN:, and LST: devices

	cat, cp, cmp, entab, hex (dump anything), get (unarchive) utilities

Shortcomings are the multitude of bugs in Hendrix' compiler, the fact that
file i/o is buffered in sectors (i.e., is slow), and that the console
is not buffered (i.e., has no line editing facility), and certain problems
in accessing large files (i.e., arithmetic problems).

If there is sufficient interest, I can place the sources (including a slightly
improved version of smallC) into net.sources -- about 200K.

			Axel Schreiner, University of Illinois.
%%%%%%%%%% scc/c.rel %%%%%%%%%%
Module CRTL      of B:C       REL

Length of Program       757
Length of Data area     0



Entry point(s):

?AND    016C'   ?ASL    01DD'   ?ASR    01CF'   ?COM    01F0'
?DDGC   02B1'   ?DDGI   02BE'   ?DDPPC  02CA'   ?DDPPI  02D1'
?DECC   0281'   ?DECI   0299'   ?DIV    0217'   ?DSGC   02B5'
?DSGI   02C2'   ?EQ     0173'   ?GCHAR  02B8'   ?GE     018D'
?GINT   02C5'   ?GT     017F'   ?INCC   028D'   ?INCI   02A5'
?LE     0186'   ?LNEG   0275'   ?LT     0193'   ?MULT   01F7'
?NE     0179'   ?NEG    01EB'   ?OR     015E'   ?PDPC   02CB'
?PDPI   02D2'   ?PINT   02D5'   ?SMALL  0000'   ?SUB    01E4'
?SWITC  02DB'   ?SXT    02B9'   ?UGE    01AA'   ?UGT    01B6'
?ULE    01BD'   ?ULT    01B0'   ?XOR    0165'   _BITMA  0091'
_CHMOD  00A0'   _CLOSE  005A'   _CONIN  00E8'   _CONOU  00ED'
_CONST  00E3'   _CREAT  0078'   _CSTAT  0041'   _DELET  0069'
_DIRIO  0028'   _DISKM  00A5'   _DRIVE  0087'   _EXIT   0007'
_GETCH  000F'   _GETS   003C'   _GIOB   002D'   _GLOB   005F'
_HOME   0101'   _LOGIN  0082'   _LPUTC  0023'   _LSTOU  00F2'
_LSTST  0124'   _MOUNT  0050'   _NARG   02B9'   _NGLOB  0064'
_OPEN   0055'   _PPUTC  001E'   _PROTE  0096'   _PUNOU  00F7'
_PUTCH  0014'   _PUTS   0037'   _RDRIN  00FC'   _READ   006E'
_RECOR  00BE'   _RENAM  007D'   _RESET  004B'   _RGETC  0019'
_ROMAP  009B'   _RREAD  00AF'   _RWRIT  00B4'   _RZWRI  00C8'
_SECTR  0129'   _SELDS  0106'   _SETBU  008C'   _SETDM  0115'
_SETSE  0110'   _SETTR  010B'   _SIOB   0032'   _SREAD  011A'
_STAT   00B9'   _SWRIT  011F'   _UID    00AA'   _UMOUN  00C3'
_VERS   0046'   _WBOOT  00DE'   _WRITE  0073'   ABORT   000A'


External reference(s):

?30217  0000    _SHELL  0005'   

Module DTAB      of B:C       REL

Length of Program       1289
Length of Data area     158



Entry point(s):

_DBLIN  0255'   _DBLIO  013C'   _DBLOU  028D'   _DBR    005E"
_DBW    006E"   _DCL    008E"   _DCLOS  04B6'   _DNM    0000"
_DOP    002E"   _DOPEN  0000'   _DRD    003E"   _DSEEK  02CA'
_DSK    007E"   _DWR    004E"   

External reference(s):

?30217  0000    ?AND    04C5'   ?ASL    00EB'   ?DDGC   04BE'
?DDPPI  04AC'   ?DIV    0227'   ?DSGI   04DE'   ?EQ     03FC'
?GCHAR  02D8'   ?GE     01D1'   ?GINT   03A8'   ?GT     0411'
?LT     03D2'   ?MULT   036E'   ?NE     04E6'   ?OR     02BD'
?PINT   046C'   ?SMALL  0000    ?SWITC  03BB'   _BGETC  004C"
_BINIT  038B'   _BPUTC  005C"   _FBLIN  005E"   _FBLOU  006E"
_FCLOS  008E"   _FOPEN  002E"   _FSEEK  007E"   _GETCH  0040"
_LPUTC  0056"   _NGETC  0048"   _NOP    0058"   _PPUTC  0054"
_PUTCH  0050"   _RGETC  0042"   _ROMAP  00DB'   _SECTR  0205'
_SELDS  02E0'   _SETDM  024A'   _SETSE  023B'   _SETTR  0234'
_SREAD  0268'   _SWRIT  02A4'   MKDRIV  001B'   WORD    04D6'


Module CSH       of B:C       REL

Length of Program       4986
Length of Data area     751



Entry point(s):

_BGETC  11C5'   _BINIT  1195'   _BPUTC  1292'   _CFP    0283"
_CTYPE  0000"   _FBERR  01D6"   _FBIN   0080"   _FBLOC  0281"
_FBOUT  012B"   _NGETC  1360'   _NOP    1379'   _SHELL  0000'
CALLOC  033F'   CFREE   05A4'   EXIT    0310'   FCLOSE  0F07'
FOPEN   0C08'   FPUTC   1036'   FPUTS   113F'   FREOPE  0C6C'
ISALNU  077C'   ISASCI  0728'   ISLOWE  0767'   ISSPAC  0791'
ISUPPE  0752'   MKARG   082D'   MKDRIV  098C'   MKFCB   0BB8'
MKFIEL  09E1'   MKFILE  0A89'   STRCMP  07CA'   TOLOWE  07A6'
TOUPPE  07B8'   WORD    0825'   

External reference(s):

?30217  0000    ?AND    1289'   ?DDGC   12D1'   ?DDGI   12D6'
?DDPPC  0AF7'   ?DDPPI  132F'   ?DECI   11A5'   ?DSGC   1358'
?DSGI   133F'   ?EQ     117E'   ?GCHAR  1369'   ?GE     0731'
?GINT   1344'   ?GT     042C'   ?INCI   11B7'   ?LNEG   0286'
?LT     0BCB'   ?MULT   0357'   ?OR     1370'   ?PINT   134D'
?SMALL  0000    ?SUB    09DA'   ?SWITC  0EAB'   ?UGE    12BA'
?UGT    0519'   _DBR    1217'   _DBW    12C7'   _DCL    0F47'
_DNM    0D8B'   _DOP    0EC4'   _DRD    0E47'   _DRIVE  0AF1'
_DSK    0000    _DWR    10BF'   _END    05BA'   _EXIT   1091'
MAIN    0303'   

Module FTAB      of B:C       REL

Length of Program       4986
Length of Data area     118



Entry point(s):

_DBR    0046"   _DBW    0052"   _DCL    006A"   _DNM    0000"
_DOP    0022"   _DRD    002E"   _DSK    005E"   _DWR    003A"


External reference(s):

?30217  0000    ?SMALL  0000    _BGETC  002E"   _BINIT  0000 
_BPUTC  003A"   _FBLIN  0046"   _FBLOU  0052"   _FCLOS  006A"
_FOPEN  0022"   _FSEEK  005E"   _GETCH  0030"   _LPUTC  0042"
_NGETC  0038"   _NOP    0044"   _PPUTC  0040"   _PUTCH  003C"
_RGETC  0032"   _ROMAP  0000    MKDRIV  0000    WORD    0000 


Module FIO       of B:C       REL

Length of Program       1749
Length of Data area     0



Entry point(s):

_FBLIN  01A9'   _FBLOU  023A'   _FCLOS  0632'   _FOPEN  0000'
_FSEEK  02CB'   

External reference(s):

?30217  0000    ?AND    0644'   ?ASL    0052'   ?ASR    06AE'
?DDGC   063D'   ?DDPPI  062A'   ?DECI   049D'   ?DSGI   06A2'
?EQ     0580'   ?GCHAR  02A5'   ?GE     04AD'   ?GINT   04F6'
?GT     0595'   ?INCI   04CB'   ?LT     0556'   ?MULT   009E'
?NE     0667'   ?OR     02AD'   ?PINT   069C'   ?SMALL  0000 
?SUB    04C1'   ?SWITC  052F'   _BINIT  0528'   _CLOSE  06A6'
_CREAT  0156'   _DELET  013C'   _GLOB   007C'   _OPEN   00DB'
_ROMAP  003B'   _RREAD  05F7'   _RZWRI  0257'   _SETBU  02D8'
_STAT   02E3'   WORD    0657'   

Module DUMPDH    of B:C       REL

Length of Program       301
Length of Data area     58



Entry point(s):

DUMPDH  0000'   

External reference(s):

?30217  0000    ?DSGI   00DE'   ?SMALL  0000    _FBERR  0000 
_FBIN   0000    _FBOUT  00F1'   DUMPBI  0129'   DUMPDP  0113'
PRINTF  0072'   PUTHEX  00F7'   WORD    0122'   

Module DUMPBI    of B:C       REL

Length of Program       235
Length of Data area     18



Entry point(s):

DUMPBI  0000'   

External reference(s):

?30217  0000    ?AND    0090'   ?ASL    00AB'   ?DECI   00B4'
?DSGC   0089'   ?DSGI   00D4'   ?GCHAR  00A4'   ?INCI   009B'
?LNEG   00B7'   ?LT     0071'   ?PINT   0066'   ?SMALL  0000 
?SUB    00DA'   _FBERR  0000    _FBIN   0000    _FBOUT  0015'
PRINTF  00E0'   PUTBIT  001B'   

Module DUMPDP    of B:C       REL

Length of Program       218
Length of Data area     145



Entry point(s):

DUMPDP  0000'   

External reference(s):

?30217  0000    ?ASL    0036'   ?DSGI   00C4'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0000    BYTE    002F'
PRINTF  00D5'   RWORD   0094'   WORD    00CE'   

Module DUMPFC    of B:C       REL

Length of Program       513
Length of Data area     119



Entry point(s):

DUMPFC  0000'   

External reference(s):

?30217  0000    ?AND    010E'   ?ASR    00B6'   ?DSGI   01D7'
?INCI   01C9'   ?LT     01BB'   ?PINT   01B2'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0000    BYTE    01E7'
PRINTF  01EE'   PUTCHA  01FC'   WORD    0187'   

Module ABS       of B:C       REL

Length of Program       22
Length of Data area     0



Entry point(s):

ABS     0000'   

External reference(s):

?30217  0000    ?NEG    000E'   ?SMALL  0000    

Module ATOI      of B:C       REL

Length of Program       506
Length of Data area     0



Entry point(s):

ATOI    0000'   

External reference(s):

?30217  0000    ?DDPPI  01D6'   ?DSGI   01E5'   ?EQ     00EC'
?GCHAR  0136'   ?GINT   019B'   ?INCI   0133'   ?LT     01B4'
?MULT   01EB'   ?PINT   01A6'   ?SMALL  0000    ?SUB    01A2'
ISDIGI  0145'   ISSPAC  0039'   ISUPPE  0177'   ISXDIG  0169'


Module INDEX     of B:C       REL

Length of Program       53
Length of Data area     0



Entry point(s):

INDEX   0000'   

External reference(s):

?30217  0000    ?DSGC   000E'   ?DSGI   001C'   ?EQ     0011'
?GCHAR  0027'   ?INCI   0023'   ?SMALL  0000    

Module STRCAT    of B:C       REL

Length of Program       79
Length of Data area     0



Entry point(s):

STRCAT  0000'   

External reference(s):

?30217  0000    ?DECI   0025'   ?DSGI   000A'   ?GCHAR  0037'
?INCI   0033'   ?PINT   000D'   ?SMALL  0000    

Module STRCPY    of B:C       REL

Length of Program       49
Length of Data area     0



Entry point(s):

STRCPY  0000'   

External reference(s):

?30217  0000    ?DSGI   000A'   ?GCHAR  001F'   ?INCI   001B'
?PINT   000D'   ?SMALL  0000    

Module STRLEN    of B:C       REL

Length of Program       48
Length of Data area     0



Entry point(s):

STRLEN  0000'   

External reference(s):

?30217  0000    ?GCHAR  0014'   ?INCI   0025'   ?PINT   000A'
?SMALL  0000    

Module PUTBIT    of B:C       REL

Length of Program       314
Length of Data area     6



Entry point(s):

PUTBIT  0000'   

External reference(s):

?30217  0000    ?AND    00D5'   ?ASL    0110'   ?DECI   0119'
?DSGC   00CE'   ?DSGI   0129'   ?GCHAR  0109'   ?INCI   00C5'
?LT     00A9'   ?PINT   0095'   ?SMALL  0000    _FBERR  0000 
_FBIN   0000    _FBOUT  0000    FPRINT  0023'   FPUTC   012F'


Module PUTHEX    of B:C       REL

Length of Program       383
Length of Data area     17



Entry point(s):

PUTHEX  0000'   

External reference(s):

?30217  0000    ?AND    0086'   ?DDGC   007F'   ?DDPPI  015B'
?DSGC   0114'   ?DSGI   0145'   ?GCHAR  00CA'   ?GINT   0163'
?INCI   00C6'   ?LNEG   00FB'   ?LT     00AA'   ?PINT   016E'
?SMALL  0000    ?SUB    016A'   _FBERR  0000    _FBIN   0000 
_FBOUT  0000    FPRINT  008C'   FPUTC   014B'   ISASCI  00D3'
ISCNTR  00F7'   ISPRIN  00E5'   

Module CSHOW     of B:C       REL

Length of Program       318
Length of Data area     44



Entry point(s):

CSHOW   0000'   

External reference(s):

?30217  0000    ?AND    00BD'   ?ASL    00F8'   ?ASR    00A4'
?DSGI   0115'   ?EQ     0032'   ?GINT   0118'   ?INCI   002B'
?PINT   010F'   ?SMALL  0000    ?SUB    009D'   _END    000B'
_FBERR  0123'   CAVAIL  012D'   FPRINT  0133'   FPUTC   0044'


Module CAVAIL    of B:C       REL

Length of Program       104
Length of Data area     0



Entry point(s):

CAVAIL  0000'   

External reference(s):

?30217  0000    ?AND    005C'   ?ASR    0055'   ?PINT   003E'
?SMALL  0000    ?SUB    0063'   _END    0007'   WORD    0032'


Module PRINTF    of B:C       REL

Length of Program       2113
Length of Data area     15



Entry point(s):

_ITOD   0054'   _ITOU   0137'   _ITOX   0206'   _PFEMI  0000'
_PFSTR  0000"   _PRINT  039B'   _UTOI   02E2'   FPRINT  07B1'
PRINTF  0786'   SPRINT  07F6'   

External reference(s):

?30217  0000    ?AND    025D'   ?ASL    01B6'   ?ASR    0256'
?DDGC   0662'   ?DDPPC  02AC'   ?DDPPI  050C'   ?DECI   0751'
?DIV    01D3'   ?DSGC   076B'   ?DSGI   0812'   ?EQ     0689'
?GCHAR  072F'   ?GE     034C'   ?GINT   0824'   ?GT     06BE'
?INCI   072B'   ?LT     0361'   ?MULT   032D'   ?NE     0615'
?NEG    0078'   ?PINT   081F'   ?SMALL  0000    ?SUB    0836'
?SWITC  05CF'   _FBERR  0048'   _FBIN   0000    _FBOUT  0794'
_NARG   07FE'   ABORT   0051'   FPUTC   0033'   FPUTS   004C'
ISDIGI  0307'   

Module MKWFCB    of B:C       REL

Length of Program       80
Length of Data area     0



Entry point(s):

MKWFCB  0000'   

External reference(s):

?30217  0000    ?DSGI   0045'   ?INCI   0021'   ?LT     0013'
?PINT   000A'   ?SMALL  0000    _FBERR  0000    _FBIN   0000 
_FBOUT  0000    MKWFIL  0049'   

Module MKWFIL    of B:C       REL

Length of Program       303
Length of Data area     0



Entry point(s):

MKWFIL  0000'   

External reference(s):

?30217  0000    ?DDGC   000B'   ?DDPPC  006E'   ?DDPPI  005B'
?DSGI   011A'   ?EQ     00A3'   ?GCHAR  011D'   ?GINT   0055'
?INCI   00F6'   ?LT     00E8'   ?PINT   00DF'   ?SMALL  0000 
_DRIVE  0068'   _FBERR  0000    _FBIN   0000    _FBOUT  0000 
MKDRIV  0026'   MKWFIE  00CA'   

Module MKWFIE    of B:C       REL

Length of Program       265
Length of Data area     0



Entry point(s):

MKWFIE  0000'   

External reference(s):

?30217  0000    ?DECI   00EC'   ?EQ     00A6'   ?GCHAR  009F'
?INCI   00F8'   ?SMALL  0000    _FBERR  0000    _FBIN   0000 
_FBOUT  0000    ISASCI  0009'   ISDIGI  002B'   ISLOWE  0075'
ISUPPE  001A'   TOUPPE  0091'   

Module ISPRIN    of B:C       REL

Length of Program       21
Length of Data area     0



Entry point(s):

ISPRIN  0000'   

External reference(s):

?30217  0000    ?AND    0012'   ?DDGC   000B'   ?DSGC   0008'
?SMALL  0000    _CTYPE  0001'   

Module ISCNTR    of B:C       REL

Length of Program       21
Length of Data area     0



Entry point(s):

ISCNTR  0000'   

External reference(s):

?30217  0000    ?AND    0012'   ?DDGC   000B'   ?DSGC   0008'
?SMALL  0000    _CTYPE  0001'   

Module ISALPH    of B:C       REL

Length of Program       21
Length of Data area     0



Entry point(s):

ISALPH  0000'   

External reference(s):

?30217  0000    ?AND    0012'   ?DDGC   000B'   ?DSGC   0008'
?SMALL  0000    _CTYPE  0001'   

Module ISDIGI    of B:C       REL

Length of Program       21
Length of Data area     0



Entry point(s):

ISDIGI  0000'   

External reference(s):

?30217  0000    ?AND    0012'   ?DDGC   000B'   ?DSGC   0008'
?SMALL  0000    _CTYPE  0001'   

Module ISXDIG    of B:C       REL

Length of Program       21
Length of Data area     0



Entry point(s):

ISXDIG  0000'   

External reference(s):

?30217  0000    ?AND    0012'   ?DDGC   000B'   ?DSGC   0008'
?SMALL  0000    _CTYPE  0001'   

Module ISPUNC    of B:C       REL

Length of Program       21
Length of Data area     0



Entry point(s):

ISPUNC  0000'   

External reference(s):

?30217  0000    ?AND    0012'   ?DDGC   000B'   ?DSGC   0008'
?SMALL  0000    _CTYPE  0001'   

Module TOASCI    of B:C       REL

Length of Program       12
Length of Data area     0



Entry point(s):

TOASCI  0000'   

External reference(s):

?30217  0000    ?AND    0009'   ?SMALL  0000    

Module FEOF      of B:C       REL

Length of Program       30
Length of Data area     0



Entry point(s):

FEOF    0000'   

External reference(s):

?30217  0000    ?AND    000F'   ?DDGC   0008'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0000    

Module FERROR    of B:C       REL

Length of Program       18
Length of Data area     0



Entry point(s):

FERROR  0000'   

External reference(s):

?30217  0000    ?AND    000F'   ?DDGC   0008'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0000    

Module CLEARE    of B:C       REL

Length of Program       23
Length of Data area     0



Entry point(s):

CLEARE  0000'   

External reference(s):

?30217  0000    ?AND    0011'   ?GCHAR  000A'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0000    

Module REWIND    of B:C       REL

Length of Program       20
Length of Data area     0



Entry point(s):

REWIND  0000'   

External reference(s):

?30217  0000    ?SMALL  0000    _FBERR  0000    _FBIN   0000 
_FBOUT  0000    FSEEK   000E'   

Module FSEEK     of B:C       REL

Length of Program       807
Length of Data area     0



Entry point(s):

FSEEK   0000'   

External reference(s):

?30217  0000    ?AND    02B4'   ?ASR    00E9'   ?DDGC   02CC'
?DDGI   02D1'   ?DDPPI  01C2'   ?DECI   0155'   ?DSGI   030A'
?EQ     0267'   ?GCHAR  02AD'   ?GE     0161'   ?GINT   01B8'
?INCI   017F'   ?NE     0229'   ?PINT   02D5'   ?SMALL  0000 
?SUB    0175'   ?SWITC  01D6'   _BINIT  0000    _DBW    0244'
_DSK    02BF'   _FBERR  0000    _FBIN   0000    _FBOUT  0000 
_RREAD  0000    _SETBU  0000    _STAT   0000    WORD    0219'


Module GETS      of B:C       REL

Length of Program       111
Length of Data area     0



Entry point(s):

GETS    0000'   

External reference(s):

?30217  0000    ?DSGI   0060'   ?EQ     0036'   ?INCI   004F'
?NE     0026'   ?PINT   0046'   ?SMALL  0000    _FBERR  0000 
_FBIN   0016'   _FBOUT  0000    FGETC   001A'   

Module FGETS     of B:C       REL

Length of Program       152
Length of Data area     0



Entry point(s):

FGETS   0000'   

External reference(s):

?30217  0000    ?DECI   0014'   ?DSGI   0089'   ?EQ     005C'
?INCI   0078'   ?PINT   006C'   ?SMALL  0000    _FBERR  0000 
_FBIN   0000    _FBOUT  0000    FGETC   002C'   

Module GETW      of B:C       REL

Length of Program       359
Length of Data area     17



Entry point(s):

GETW    0000'   

External reference(s):

?30217  0000    ?AND    015C'   ?ASL    014E'   ?DDGC   012F'
?DDGI   0096'   ?DSGC   0155'   ?DSGI   0129'   ?EQ     0032'
?GCHAR  00C0'   ?OR     0160'   ?PINT   009A'   ?SMALL  0000 
_CFP    007C'   _DRD    0084'   _EXIT   0055'   _FBERR  004C'
_FBIN   0000    _FBOUT  0000    FPUTS   0050'   

Module GETCHA    of B:C       REL

Length of Program       9
Length of Data area     0



Entry point(s):

GETCHA  0000'   

External reference(s):

?30217  0000    ?SMALL  0000    _FBERR  0000    _FBIN   0001'
_FBOUT  0000    FGETC   0005'   

Module FGETC     of B:C       REL

Length of Program       417
Length of Data area     17



Entry point(s):

FGETC   0000'   

External reference(s):

?30217  0000    ?AND    00AE'   ?DDGC   0102'   ?DDGI   00DC'
?DSGI   015E'   ?EQ     0109'   ?GCHAR  0166'   ?NE     0128'
?OR     016D'   ?PINT   0121'   ?SMALL  0000    ?SWITC  0183'
_CFP    00C2'   _DRD    00CA'   _EXIT   0055'   _FBERR  004C'
_FBIN   0000    _FBOUT  0000    FPUTS   0050'   UNGETC  014A'


Module UNGETC    of B:C       REL

Length of Program       109
Length of Data area     0



Entry point(s):

UNGETC  0000'   

External reference(s):

?30217  0000    ?AND    0025'   ?DDGC   001E'   ?DSGC   0068'
?EQ     002C'   ?GCHAR  004F'   ?OR     0056'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0000    

Module PUTS      of B:C       REL

Length of Program       114
Length of Data area     0



Entry point(s):

PUTS    0000'   

External reference(s):

?30217  0000    ?DSGC   002B'   ?DSGI   000B'   ?EQ     005E'
?GCHAR  001D'   ?INCI   0019'   ?PINT   000E'   ?SMALL  0000 
_FBERR  0000    _FBIN   0000    _FBOUT  0051'   FPUTC   0055'


Module PUTW      of B:C       REL

Length of Program       276
Length of Data area     17



Entry point(s):

PUTW    0000'   

External reference(s):

?30217  0000    ?AND    00FF'   ?ASR    00E4'   ?DDGC   00F8'
?DDGI   009B'   ?DSGI   010F'   ?EQ     0038'   ?PINT   009F'
?SMALL  0000    _CFP    0081'   _DWR    0089'   _EXIT   005B'
_FBERR  0052'   _FBIN   0000    _FBOUT  0000    FPUTS   0056'


Module PUTCHA    of B:C       REL

Length of Program       17
Length of Data area     0



Entry point(s):

PUTCHA  0000'   

External reference(s):

?30217  0000    ?DSGC   0004'   ?SMALL  0000    _FBERR  0000 
_FBIN   0000    _FBOUT  0008'   FPUTC   000C'   

Module BYTE      of B:C       REL

Length of Program       15
Length of Data area     0



Entry point(s):

BYTE    0000'   

External reference(s):

?30217  0000    ?AND    000C'   ?GCHAR  0005'   ?SMALL  0000 


Module RWORD     of B:C       REL

Length of Program       39
Length of Data area     0



Entry point(s):

RWORD   0000'   

External reference(s):

?30217  0000    ?AND    0020'   ?ASL    000C'   ?DDGC   0019'
?DSGI   0013'   ?GCHAR  0005'   ?OR     0024'   ?SMALL  0000 


Module END       of B:C       REL

Length of Program       6
Length of Data area     6



Entry point(s):

?30217  0000"   _EDATA  0006"   _END    0006'   _EPROG  0006'


Symbol  Value   Defined Referenced

?30217  0000"   END     CRTL    DTAB    CSH     FTAB    FIO
                        DUMPDH  DUMPBI  DUMPDP  DUMPFC  ABS
                        ATOI    INDEX   STRCAT  STRCPY  STRLEN
                        PUTBIT  PUTHEX  CSHOW   CAVAIL  PRINTF
                        MKWFCB  MKWFIL  MKWFIE  ISPRIN  ISCNTR
                        ISALPH  ISDIGI  ISXDIG  ISPUNC  TOASCI
                        FEOF    FERROR  CLEARE  REWIND  FSEEK
                        GETS    FGETS   GETW    GETCHA  FGETC
                        UNGETC  PUTS    PUTW    PUTCHA  BYTE
                        RWORD   
?AND    016C'   CRTL    
                        DTAB    CSH     FIO     DUMPBI  DUMPFC
                        PUTBIT  PUTHEX  CSHOW   CAVAIL  PRINTF
                        ISPRIN  ISCNTR  ISALPH  ISDIGI  ISXDIG
                        ISPUNC  TOASCI  FEOF    FERROR  CLEARE
                        FSEEK   GETW    FGETC   UNGETC  PUTW
                        BYTE    RWORD   
?ASL    01DD'   CRTL    
                        DTAB    FIO     DUMPBI  DUMPDP  PUTBIT
                        CSHOW   PRINTF  GETW    RWORD   
?ASR    01CF'   CRTL    
                        FIO     DUMPFC  CSHOW   CAVAIL  PRINTF
                        FSEEK   PUTW    
?COM    01F0'   CRTL    
?DDGC   02B1'   CRTL    
                        DTAB    CSH     FIO     PUTHEX  PRINTF
                        MKWFIL  ISPRIN  ISCNTR  ISALPH  ISDIGI
                        ISXDIG  ISPUNC  FEOF    FERROR  FSEEK
                        GETW    FGETC   UNGETC  PUTW    RWORD

?DDGI   02BE'   CRTL    
                        CSH     FSEEK   GETW    FGETC   PUTW

?DDPPC  02CA'   CRTL    
                        CSH     PRINTF  MKWFIL  
?DDPPI  02D1'   CRTL    
                        DTAB    CSH     FIO     ATOI    PUTHEX
                        PRINTF  MKWFIL  FSEEK   
?DECC   0281'   CRTL    
?DECI   0299'   CRTL    
                        CSH     FIO     DUMPBI  STRCAT  PUTBIT
                        PRINTF  MKWFIE  FSEEK   FGETS   
?DIV    0217'   CRTL    
                        DTAB    PRINTF  
?DSGC   02B5'   CRTL    
                        CSH     DUMPBI  INDEX   PUTBIT  PUTHEX
                        PRINTF  ISPRIN  ISCNTR  ISALPH  ISDIGI
                        ISXDIG  ISPUNC  GETW    UNGETC  PUTS
                        PUTCHA  
?DSGI   02C2'   CRTL    
                        DTAB    CSH     FIO     DUMPDH  DUMPBI
                        DUMPDP  DUMPFC  ATOI    INDEX   STRCAT
                        STRCPY  PUTBIT  PUTHEX  CSHOW   PRINTF
                        MKWFCB  MKWFIL  FSEEK   GETS    FGETS
                        GETW    FGETC   PUTS    PUTW    RWORD

?EQ     0173'   CRTL    
                        DTAB    CSH     FIO     ATOI    INDEX
                        CSHOW   PRINTF  MKWFIL  MKWFIE  FSEEK
                        GETS    FGETS   GETW    FGETC   UNGETC
                        PUTS    PUTW    
?GCHAR  02B8'   CRTL    
                        DTAB    CSH     FIO     DUMPBI  ATOI
                        INDEX   STRCAT  STRCPY  STRLEN  PUTBIT
                        PUTHEX  PRINTF  MKWFIL  MKWFIE  CLEARE
                        FSEEK   GETW    FGETC   UNGETC  PUTS
                        BYTE    RWORD   
?GE     018D'   CRTL    
                        DTAB    CSH     FIO     PRINTF  FSEEK

?GINT   02C5'   CRTL    
                        DTAB    CSH     FIO     ATOI    PUTHEX
                        CSHOW   PRINTF  MKWFIL  FSEEK   
?GT     017F'   CRTL    
                        DTAB    CSH     FIO     PRINTF  
?INCC   028D'   CRTL    
?INCI   02A5'   CRTL    
                        CSH     FIO     DUMPBI  DUMPFC  ATOI
                        INDEX   STRCAT  STRCPY  STRLEN  PUTBIT
                        PUTHEX  CSHOW   PRINTF  MKWFCB  MKWFIL
                        MKWFIE  FSEEK   GETS    FGETS   PUTS

?LE     0186'   CRTL    
?LNEG   0275'   CRTL    
                        CSH     DUMPBI  PUTHEX  
?LT     0193'   CRTL    
                        DTAB    CSH     FIO     DUMPBI  DUMPFC
                        ATOI    PUTBIT  PUTHEX  PRINTF  MKWFCB
                        MKWFIL  
?MULT   01F7'   CRTL    
                        DTAB    CSH     FIO     ATOI    PRINTF

?NE     0179'   CRTL    
                        DTAB    FIO     PRINTF  FSEEK   GETS
                        FGETC   
?NEG    01EB'   CRTL    
                        ABS     PRINTF  
?OR     015E'   CRTL    
                        DTAB    CSH     FIO     GETW    FGETC
                        UNGETC  RWORD   
?PDPC   02CB'   CRTL    
?PDPI   02D2'   CRTL    
?PINT   02D5'   CRTL    
                        DTAB    CSH     FIO     DUMPBI  DUMPFC
                        ATOI    STRCAT  STRCPY  STRLEN  PUTBIT
                        PUTHEX  CSHOW   CAVAIL  PRINTF  MKWFCB
                        MKWFIL  FSEEK   GETS    FGETS   GETW
                        FGETC   PUTS    PUTW    
?SMALL  0000'   CRTL    
                        DTAB    CSH     FTAB    FIO     DUMPDH
                        DUMPBI  DUMPDP  DUMPFC  ABS     ATOI
                        INDEX   STRCAT  STRCPY  STRLEN  PUTBIT
                        PUTHEX  CSHOW   CAVAIL  PRINTF  MKWFCB
                        MKWFIL  MKWFIE  ISPRIN  ISCNTR  ISALPH
                        ISDIGI  ISXDIG  ISPUNC  TOASCI  FEOF
                        FERROR  CLEARE  REWIND  FSEEK   GETS
                        FGETS   GETW    GETCHA  FGETC   UNGETC
                        PUTS    PUTW    PUTCHA  BYTE    RWORD

?SUB    01E4'   CRTL    
                        CSH     FIO     DUMPBI  ATOI    PUTHEX
                        CSHOW   CAVAIL  PRINTF  FSEEK   
?SWITC  02DB'   CRTL    
                        DTAB    CSH     FIO     PRINTF  FSEEK
                        FGETC   
?SXT    02B9'   CRTL    
?UGE    01AA'   CRTL    
                        CSH     
?UGT    01B6'   CRTL    
                        CSH     
?ULE    01BD'   CRTL    
?ULT    01B0'   CRTL    
?XOR    0165'   CRTL    
_BITMA  0091'   CRTL    
_CHMOD  00A0'   CRTL    
_CLOSE  005A'   CRTL    
                        FIO     
_CONIN  00E8'   CRTL    
_CONOU  00ED'   CRTL    
_CONST  00E3'   CRTL    
_CREAT  0078'   CRTL    
                        FIO     
_CSTAT  0041'   CRTL    
_DELET  0069'   CRTL    
                        FIO     
_DIRIO  0028'   CRTL    
_DISKM  00A5'   CRTL    
_DRIVE  0087'   CRTL    
                        CSH     MKWFIL  
_EXIT   0007'   CRTL    
                        CSH     GETW    FGETC   PUTW    
_GETCH  000F'   CRTL    
                        DTAB    FTAB    
_GETS   003C'   CRTL    
_GIOB   002D'   CRTL    
_GLOB   005F'   CRTL    
                        FIO     
_HOME   0101'   CRTL    
_LOGIN  0082'   CRTL    
_LPUTC  0023'   CRTL    
                        DTAB    FTAB    
_LSTOU  00F2'   CRTL    
_LSTST  0124'   CRTL    
_MOUNT  0050'   CRTL    
_NARG   02B9'   CRTL    
                        PRINTF  
_NGLOB  0064'   CRTL    
_OPEN   0055'   CRTL    
                        FIO     
_PPUTC  001E'   CRTL    
                        DTAB    FTAB    
_PROTE  0096'   CRTL    
_PUNOU  00F7'   CRTL    
_PUTCH  0014'   CRTL    
                        DTAB    FTAB    
_PUTS   0037'   CRTL    
_RDRIN  00FC'   CRTL    
_READ   006E'   CRTL    
_RECOR  00BE'   CRTL    
_RENAM  007D'   CRTL    
_RESET  004B'   CRTL    
_RGETC  0019'   CRTL    
                        DTAB    FTAB    
_ROMAP  009B'   CRTL    
                        DTAB    FTAB    FIO     
_RREAD  00AF'   CRTL    
                        FIO     FSEEK   
_RWRIT  00B4'   CRTL    
_RZWRI  00C8'   CRTL    
                        FIO     
_SECTR  0129'   CRTL    
                        DTAB    
_SELDS  0106'   CRTL    
                        DTAB    
_SETBU  008C'   CRTL    
                        FIO     FSEEK   
_SETDM  0115'   CRTL    
                        DTAB    
_SETSE  0110'   CRTL    
                        DTAB    
_SETTR  010B'   CRTL    
                        DTAB    
_SHELL  0000'   CSH     CRTL    
_SIOB   0032'   CRTL    
_SREAD  011A'   CRTL    
                        DTAB    
_STAT   00B9'   CRTL    
                        FIO     FSEEK   
_SWRIT  011F'   CRTL    
                        DTAB    
_UID    00AA'   CRTL    
_UMOUN  00C3'   CRTL    
_VERS   0046'   CRTL    
_WBOOT  00DE'   CRTL    
_WRITE  0073'   CRTL    
ABORT   000A'   CRTL    
                        PRINTF  
_BGETC  11C5'   CSH     DTAB    FTAB    
_BINIT  1195'   CSH     DTAB    FTAB    FIO     FSEEK   
_BPUTC  1292'   CSH     DTAB    FTAB    
_DBLIN  0255'   DTAB    
_DBLIO  013C'   DTAB    
_DBLOU  028D'   DTAB    
_DBR    005E"   DTAB    
_DBR    0046"   FTAB    CSH     
_DBW    006E"   DTAB    
_DBW    0052"   FTAB    CSH     FSEEK   
_DCL    008E"   DTAB    
_DCL    006A"   FTAB    CSH     
_DCLOS  04B6'   DTAB    
_DNM    0000"   DTAB    
_DNM    0000"   FTAB    CSH     
_DOP    002E"   DTAB    
_DOP    0022"   FTAB    CSH     
_DOPEN  0000'   DTAB    
_DRD    003E"   DTAB    
_DRD    002E"   FTAB    CSH     GETW    FGETC   
_DSEEK  02CA'   DTAB    
_DSK    007E"   DTAB    
_DSK    005E"   FTAB    CSH     FSEEK   
_DWR    004E"   DTAB    
_DWR    003A"   FTAB    CSH     PUTW    
_FBLIN  01A9'   FIO     DTAB    FTAB    
_FBLOU  023A'   FIO     DTAB    FTAB    
_FCLOS  0632'   FIO     DTAB    FTAB    
_FOPEN  0000'   FIO     DTAB    FTAB    
_FSEEK  02CB'   FIO     DTAB    FTAB    
_NGETC  1360'   CSH     DTAB    FTAB    
_NOP    1379'   CSH     DTAB    FTAB    
MKDRIV  098C'   CSH     DTAB    FTAB    MKWFIL  
WORD    0825'   CSH     DTAB    FTAB    FIO     DUMPDH  DUMPDP
                        DUMPFC  CAVAIL  FSEEK   
_CFP    0283"   CSH     
                        GETW    FGETC   PUTW    
_CTYPE  0000"   CSH     
                        ISPRIN  ISCNTR  ISALPH  ISDIGI  ISXDIG
                        ISPUNC  
_END    0006'   END     CSH     CSHOW   CAVAIL  
_FBERR  01D6"   CSH     
                        DUMPDH  DUMPBI  DUMPDP  DUMPFC  PUTBIT
                        PUTHEX  CSHOW   PRINTF  MKWFCB  MKWFIL
                        MKWFIE  FEOF    FERROR  CLEARE  REWIND
                        FSEEK   GETS    FGETS   GETW    GETCHA
                        FGETC   UNGETC  PUTS    PUTW    PUTCHA

_FBIN   0080"   CSH     
                        DUMPDH  DUMPBI  DUMPDP  DUMPFC  PUTBIT
                        PUTHEX  PRINTF  MKWFCB  MKWFIL  MKWFIE
                        FEOF    FERROR  CLEARE  REWIND  FSEEK
                        GETS    FGETS   GETW    GETCHA  FGETC
                        UNGETC  PUTS    PUTW    PUTCHA  
_FBLOC  0281"   CSH     
_FBOUT  012B"   CSH     
                        DUMPDH  DUMPBI  DUMPDP  DUMPFC  PUTBIT
                        PUTHEX  PRINTF  MKWFCB  MKWFIL  MKWFIE
                        FEOF    FERROR  CLEARE  REWIND  FSEEK
                        GETS    FGETS   GETW    GETCHA  FGETC
                        UNGETC  PUTS    PUTW    PUTCHA  
CALLOC  033F'   CSH     
CFREE   05A4'   CSH     
EXIT    0310'   CSH     
FCLOSE  0F07'   CSH     
FOPEN   0C08'   CSH     
FPUTC   1036'   CSH     
                        PUTBIT  PUTHEX  CSHOW   PRINTF  PUTS
                        PUTCHA  
FPUTS   113F'   CSH     
                        PRINTF  GETW    FGETC   PUTW    
FREOPE  0C6C'   CSH     
ISALNU  077C'   CSH     
ISASCI  0728'   CSH     
                        PUTHEX  MKWFIE  
ISLOWE  0767'   CSH     
                        MKWFIE  
ISSPAC  0791'   CSH     
                        ATOI    
ISUPPE  0752'   CSH     
                        ATOI    MKWFIE  
MAIN                    CSH     
MKARG   082D'   CSH     
MKFCB   0BB8'   CSH     
MKFIEL  09E1'   CSH     
MKFILE  0A89'   CSH     
STRCMP  07CA'   CSH     
TOLOWE  07A6'   CSH     
TOUPPE  07B8'   CSH     
                        MKWFIE  
DUMPBI  0000'   DUMPBI  DUMPDH  
DUMPDH  0000'   DUMPDH  
DUMPDP  0000'   DUMPDP  DUMPDH  
PRINTF  0786'   PRINTF  DUMPDH  DUMPBI  DUMPDP  DUMPFC  
PUTHEX  0000'   PUTHEX  DUMPDH  
PUTBIT  0000'   PUTBIT  DUMPBI  
BYTE    0000'   BYTE    DUMPDP  DUMPFC  
RWORD   0000'   RWORD   DUMPDP  
DUMPFC  0000'   DUMPFC  
PUTCHA  0000'   PUTCHA  DUMPFC  
ABS     0000'   ABS     
ATOI    0000'   ATOI    
ISDIGI  0000'   ISDIGI  ATOI    PRINTF  MKWFIE  
ISXDIG  0000'   ISXDIG  ATOI    
INDEX   0000'   INDEX   
STRCAT  0000'   STRCAT  
STRCPY  0000'   STRCPY  
STRLEN  0000'   STRLEN  
FPRINT  07B1'   PRINTF  PUTBIT  PUTHEX  CSHOW   
ISCNTR  0000'   ISCNTR  PUTHEX  
ISPRIN  0000'   ISPRIN  PUTHEX  
CAVAIL  0000'   CAVAIL  CSHOW   
CSHOW   0000'   CSHOW   
_ITOD   0054'   PRINTF  
_ITOU   0137'   PRINTF  
_ITOX   0206'   PRINTF  
_PFEMI  0000'   PRINTF  
_PFSTR  0000"   PRINTF  
_PRINT  039B'   PRINTF  
_UTOI   02E2'   PRINTF  
SPRINT  07F6'   PRINTF  
MKWFCB  0000'   MKWFCB  
MKWFIL  0000'   MKWFIL  MKWFCB  
MKWFIE  0000'   MKWFIE  MKWFIL  
ISALPH  0000'   ISALPH  
ISPUNC  0000'   ISPUNC  
TOASCI  0000'   TOASCI  
FEOF    0000'   FEOF    
FERROR  0000'   FERROR  
CLEARE  0000'   CLEARE  
FSEEK   0000'   FSEEK   REWIND  
REWIND  0000'   REWIND  
FGETC   0000'   FGETC   GETS    FGETS   GETCHA  
GETS    0000'   GETS    
FGETS   0000'   FGETS   
GETW    0000'   GETW    
GETCHA  0000'   GETCHA  
UNGETC  0000'   UNGETC  FGETC   
PUTS    0000'   PUTS    
PUTW    0000'   PUTW    
_EDATA  0006"   END     
_EPROG  0006'   END     



%%%%%%%%%% scc/rtl/2.sub %%%%%%%%%%
;
; putchar
;
$3 #$$p <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp1=$1:tmp
;
; getw
;
$3 #$$q <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp2=$1:tmp
;
; putw
;
$3 #$$r <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp3=$1:tmp
;
; gets		 needs fgetc
;
$3 #$$s <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp4=$1:tmp
;
; fgets		 needs fgetc
;
$3 #$$t <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp5=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp1,$2:tmp2,$2:tmp3,$2:tmp4,$2:tmp5/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
;
; puts
;
$3 #$$u <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp1=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp1/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
;
; abs
;
$3 #$$a <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp1=$1:tmp
;
; atoi		needs is*
;
$3 #$$b <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp2=$1:tmp
;
; isprint
;
$3 #$$cd <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp3=$1:tmp
;
; iscntrl
;
$3 #$$ce <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp4=$1:tmp
;
; isalpha
;
$3 #$$cf <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp5=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp1,$2:tmp2,$2:tmp3,$2:tmp4,$2:tmp5/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
submit 3 $1 $2 $3 $4 $5 $6
%%%%%%%%%% scc/rtl/3.sub %%%%%%%%%%
;
; isdigit
;
$3 #$$cg <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp1=$1:tmp
;
; isxdigit
;
$3 #$$ch <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp2=$1:tmp
;
; ispunct
;
$3 #$$ci <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp3=$1:tmp
;
; toascii
;
$3 #$$j <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp4=$1:tmp
;
; index
;
$3 #$$k <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp5=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp1,$2:tmp2,$2:tmp3,$2:tmp4,$2:tmp5/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
;
; strcat
;
$3 #$$m <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp2=$1:tmp
;
; strcpy
;
$3 #$$p <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp5=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp2,$2:tmp5/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
;
; strlen
;
$3 #$$r <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp2=$1:tmp
;
; byte
;
$3 #$$s <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp3=$1:tmp
;
; rword
;
$3 #$$t <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp4=$1:tmp
;
; cshow		needs cavail printf fputc
;
$3 #u <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp5=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp2,$2:tmp3,$2:tmp4,$2:tmp5/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
;
; cavail
;
$3 #$$v <$1:c1.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp1=$1:tmp
;
; dumpdhd	needs printf word puthex dumpbit dumpdpb
;
$3 #\A <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp2=$1:tmp
;
; putbit	needs fputc fprintf
;
$3 #\B <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp3=$1:tmp
;
; puthex	needs fputc fprintf is*
;
$3 #\C <$1:c0.get >$1:tmp.c
$4 $1:tmp.c >$1:tmp.mac
$5 $2:tmp4=$1:tmp
$6 $2:tmp=$2:clib,$2:tmp1,$2:tmp2,$2:tmp3,$2:tmp4/e
era $2:clib.rel
ren $2:clib.rel=$2:tmp.rel
era $1:tmp.*
era $2:tmp?.*
%%%%%%%%%% scc/rtl/READ_ME %%%%%%%%%%
This directory contains the 'csh' runtime support for smallC V2.
The files are meant to be processed by the smallC compiler and
by Microsoft's MACRO-80 assembler. A listing of the runtime library
is included -- order is relatively crucial for correct resolution
in one pass. The 'end' module must definitely be linked last.

Most of this has been tested, but...

	make.sub	submit files to process c[01].get
	[23].sub	called by make.sub
	adlib.sub	adds these modules to initial library
	c[01].get	(process using 'get') small auxiliary modules
	crtl.mac	Hendrix' assembler stuff, plus BIOS and BDOS interface
	csh.c		main environment module
	def.h		header file, mostly for c[01].get
	[fd]tab.c	two variants of the driver table
	end.mac		the very last module
	fio.c		file i/o for CP/M
	io.h		actual contents of driver table
	printf.c	Hendrix' printf, extended to [sf]printf

Consult 'c.rel' to see in what order the modules should be in a library.
Consult 'def.h' as well as some utilities to see what a 'stdio.h' header
file should contain...

The 'wc' utility noted the following:

	0x4119	  1260	   175	    76	2.sub
	0xD228	  1770	   240	   104	3.sub
	0x9633	   550	    40	    28	adlib.sub
	0xE80F	 13039	  2381	   628	c0.get
	0xDC08	  4861	   951	   285	c1.get
	0x5260	 14474	  2788	   871	crtl.mac
	0xED52	 14450	  2607	   667	csh.c
	0x1F53	  2990	   553	    92	def.h
	0x55E3	   332	    58	    20	end.mac
	0x9CE8	  4542	   777	   221	fio.c
	0x25E7	   146	    29	     7	ftab.c
	0x7404	  8002	  1341	   423	io.h
	0xC3E9	  1734	   246	    99	make.sub
	0x4D00	  4314	   798	   269	printf.c
%%%%%%%%%% scc/rtl/adlib.sub %%%%%%%%%%
;	smallC runtime support
;
;	c.rel:	indisk($1) outdisk($2)
;		lib-80($3)
;
;	ats 2/83
;
xsub
$3 $1:tmp=$2:c/e
era $2:c.rel
$3
$2:c=$1:tmp<..FIO>
$1:clib<DUMPDH,DUMPBI,DUMPDP,DUMPFC>
$1:clib<ABS,ATOI>
$1:clib<INDEX,STRCAT,STRCPY,STRLEN>
$1:clib<PUTBIT,PUTHEX>
$1:clib<CSHOW,CAVAIL>
$1:printf
$1:clib<MKWFCB,MKWFIL,MKWFIE>
$1:clib<ISPRIN,ISCNTR,ISALPH>
$1:clib<ISDIGI,ISXDIG,ISPUNC,TOASCI>
$1:clib<FEOF,FERROR,CLEARE,REWIND,FSEEK>
$1:clib<GETS,FGETS,GETW,GETCHA,FGETC,UNGETC>
$1:clib<PUTS,PUTW,PUTCHA>
$1:clib<BYTE,RWORD>
$1:tmp<END>
/E
era $1:tmp.rel
%%%%%%%%%% scc/rtl/c0.get %%%%%%%%%%
/*
 *	c?.get -- smallC runtime library for CP/M and MACRO-80
 *	ats 2/83, in part adapted from Jim Hendrix' code
 */

$#define NOCCARGC
##include def.h		/* TO BE FIXED */

/*
 *	module names
 */

##asm
a	NAME	('mkwfield')	; needs is*
b	NAME	('mkwfilename')	; needs mkwfield
c	NAME	('mkwfcb')	; needs mkwfilename
d	NAME	('dumpbit')	; needs putbit printf
e	NAME	('dumpdpb')	; needs putchar printf byte
f	NAME	('dumpfcb')	; needs putchar printf byte
g	NAME	('feof')
h	NAME	('ferror')
i	NAME	('clearerr')
j	NAME	('fseek')
k	NAME	('rewind')	; needs fseek
l
m	NAME	('getchar')	; needs fgetc
n	NAME	('fgetc')	; needs ungetc
o	NAME	('ungetc')
p	NAME	('putchar')
q	NAME	('getw')
r	NAME	('putw')
s	NAME	('gets')	; needs fgetc
t	NAME	('fgets')	; needs fgetc
u	NAME	('puts')

A	NAME	('dumpdhd')	; needs printf, word, dumpdpb, puthex, putbit
B	NAME	('putbit')	; needs fputc, fprintf
C	NAME	('puthex')	; needs fputc, fprintf, is*
##endasm

/*
 *	globally external things (in csh)
 */

#extern char _fbin[];		/* stdin */
#extern char _fbout[];		/* stdout */
#extern char _fberr[];		/* stderr */

/****
 ****	CP/M utility routines
 ****/

/*
 *	wildcard parser routines:
 *
 *	mkwfield(&c,i,&c)	upper-case, copy, pad, return -> next
 *	mkwfilename(&c,&c)	fix-format filename, return success
 *	mkwfcb(&c,&c)		init fcb with file name, return success
 *
 *	all permit '*' for arbitrary tail and '?' for arbitrary letter
 */

aextern isascii(), isupper(), isdigit(), islower(), toupper();
a
aCHAR_P mkwfield(f,l,s)	/* copy isalnum() or ?/* */
a	char *f;	/* upper-cased to this buffer */
a	int l;		/* blank padded to this length */
a	char *s;	/* from this string */
a{
a	do
a		if (isascii(*s))
a			if (isupper(*s) || isdigit(*s) || *s == '?')
a				*f++ = *s++;
a			else if (islower(*s))
a				*f++ = toupper(*s++);
a			else if (*s == '*')
a			{	do
a					*f++ = '?';
a				while (--l);
a				return s+1;
a			}
a			else
a				break;
a		else
a			break;
a	while (--l);
a	while (l--)
a		*f++ = ' ';
a	return s;
a}
	
bextern mkdrive(), mkwfield(), _drive();
b
bINT mkwfilename(fnb, fnm)
b	char fnb[16];	/* to be filled */
b	char *fnm;	/* with this file name/wildcard */
b{	int i;
b
b	if (fnm[1] == ':')
b	{	if ((i = mkdrive(fnm)) == ERR)
b			return ERR;
b		fnb[FCB_ET] = i+1;
b		fnm += 2;
b	}
b	else		/* make sure to set current drive */
b		fnb[FCB_ET] = _drive()+1;
b	fnm = mkwfield(fnb+FCB_FN,8,fnm);
b	if (*fnm == '.')
b		fnm = mkwfield(fnb+FCB_FT,3,fnm+1);
b	else
b		for (i=0; i<3; i++)
b			fnb[FCB_FT+i] = ' ';
b	if (*fnm != NUL)
b		return ERR;
b	return NULL;
b}

cextern mkwfilename();
c
cINT mkwfcb(fcb,fnm)
c	char fcb[FCB_];	/* to be initialized */
c	char *fnm;	/* with this file name/wildcard */
c{	int i;
c
c	for (i=0; i<FCB_; i++)
c		fcb[i] = NUL;
c	return mkwfilename(fcb,fnm);
c}

/*
 *	display routines:
 *
 *	dumpbit(_bitmap())	allocation vector (Osborne-1 size)
 *	dumpdhd(_seldsk())	disk header block
 *	dumpdpb(_diskmap())	disk parameter block
 *	dumpfcb(&fcb)		file control block (Osborne-1 map)
 *
 *	BUG:	dumpbit knows about Osborne-1 disk size
 *		dumpfcb knows about Osborne-1 using 16 byte pointers
 */

d#define BLOCKS		46	/* reservation blocks (Osborne-1) */
d
dextern putbit(), printf();
d
ddumpbit(bitmap)
d	char *bitmap;
d{	char c;
d	int i,j,k;
d
d	putbit(0,bitmap,BLOCKS,stdout);
d	k = 0;
d	for(i=BLOCKS; i; )
d	{	c = *bitmap++;
d		for (j=0; j<8; j++)
d		{	if (c & 128)
d				k++;
d			c <<= 1;
d			if (! --i)
d				break;
d		}
d	}
d	printf("used/free: %d/%d\n", k, BLOCKS-k);
d}

Aextern printf(), word(), puthex(), dumpdpb(), dumpbit();
A
Adumpdhd(dhd)
A	char *dhd;
A{
A	printf("\tXLT  DBF  DPB  CST  RBR\n");
A	printf("%04x:\t%04x %04x %04x %04x %04x\n",
A		dhd,
A		word(dhd+DHD_XLT),
A		word(dhd+DHD_DBF),
A		word(dhd+DHD_DPB),
A		word(dhd+DHD_CST),
A		word(dhd+DHD_RBR));
A	puthex(word(dhd+DHD_XLT), word(dhd+DHD_XLT),
A		word(word(dhd+DHD_DPB)+DPB_SPT), stdout);
A	puthex(word(dhd+DHD_DBF), word(dhd+DHD_DBF), SLEN, stdout);
A	dumpdpb(word(dhd+DHD_DPB));
A	dumpbit(word(dhd+DHD_RBR));
A}

eextern printf(), word(), byte(), rword();
e
edumpdpb(dpb)
e	char *dpb;
e{
e	printf("%6u\tsectors/track\n", word(dpb+DPB_SPT));
e	printf("%6u\tbytes/block\n", SLEN << byte(dpb+DPB_BSH));
e	printf("%6u\tblocks/disk\n", 1 + word(dpb+DPB_DSM));
e	printf("%6u\tdirectory slots\n", 1 + word(dpb+DPB_DRM));
e	printf("directory allocation mask: %04x\n", rword(dpb+DPB_ALB));
e	printf("check area size: %u\n", word(dpb+DPB_CKS));
e	printf("first track: %u\n", word(dpb+DPB_OFF));
e}

fextern printf(), putchar(), byte(), word();
f
fdumpfcb(fcb)
f	char *fcb;
f{	int i;
f
f	printf("%04x ET FILENAME rs EXT EX S1 S2 RC NR RAND OV\n", fcb);
f	printf("     %02x ", byte(fcb+FCB_ET));
f	for (i=0; i<8; i++)
f		printf("%c", byte(fcb+FCB_FN+i));
f	printf(" %d%d ", byte(fcb+FCB_RO)>>7 &1, byte(fcb+FCB_SY)>>7 &1);
f	for (i=0; i<3; i++)
f		printf("%c", byte(fcb+FCB_FT+i)&127);
f	printf(" %02x %02x %02x %02x %02x %04x %02x\n DM:",
f		byte(fcb+FCB_EX),
f		byte(fcb+FCB_S1),
f		byte(fcb+FCB_S2),
f		byte(fcb+FCB_RC),
f		byte(fcb+FCB_NR),
f		word(fcb+FCB_RR),
f		byte(fcb+FCB_OV));
f	for (i=0; i<16; i++)
f		printf(" %02x", byte(fcb+FCB_DM+i));
f	putchar('\n');
f}

/****
 ****	UN*X compatible file management for CP/M
 ****/

/*
 *	file management routines:
 *
 *	feof	return EOF for physical end of file, or NULL
 *	ferror	return last error code (but not EOF), or NULL
 *	clearerr remove error code
 *	fseek	position in (buffered) file
 *	rewind	reposition (buffered) file at beginning
 *
 *	fflush, setbuf
 *		not implemented (not needed??)
 *	fileno, fdopen	
 *		not implemented / not needed
 *	ftell
 *		not implemented / impossible...
 *
 *	BUGS:	fseek has CP/M's idea of end of file for
 *		character files (modes 0,1,2), and does sector
 *		couting on modes 8,9,10. It also cannot handle
 *		unsigned offsets. Any 'ungetc' character is lost.
 *		If seeking is implemented, the file must be buffered.
 *		One may not seek outside the existing file.
 */

gINT feof(fp)
g	FILE *fp;
g{
g	if (fp[FB_FLG] & FB_EOF)
g		return EOF;
g	return NULL;
g}

hINT ferror(fp)
h	FILE *fp;
h{
h	return fp[FB_FLG] & FB_ERM;
h}

iclearerr(fp)
i	FILE *fp;
i{
i	fp[FB_FLG] &= ~FB_ERM;
i}

jextern _dsk[], _dbw[];
jextern word(), _setbuf(), _stat(), _binit(), _rread();
j
jINT fseek(fp, off, mode)
j	FILE *fp;	/* to be positioned */
j	int off;	/* offset */
j	int mode;	/* 0,1,2 or 8,9,10 */
j{	int f;		/* for cuntion call */
j	int csec, cpos;	/* current sector/position */
j	int ssec, spos;	/* seek sector/position */
j
j	if ((fp[FB_FLG] & FB_OPF) == 0 || _dsk[fp[FB_DRV]] == NULL)
j		return -1;		/* unable */
j	csec = word(fp+FCB_RR);
j	cpos = fp;
j	if ((cpos = word(fp+FB_NCP) - (cpos+FB_BUF)) >= SLEN)
j	{	cpos -= SLEN;
j		++csec;
j	}
j	switch(mode) {
j	case 0:			/* char-relative to begin */
j	case 1:			/* char-relative to present-char */
j	case 2:			/* char-relative to char-EOF */
j		ssec = off >> LSLEN;
j		spos = off & SLEN-1;
j		if (mode != 1)
j			break;
j		ssec += csec;
j		if ((spos += cpos) < 0)
j		{	spos += SLEN;
j			--ssec;
j		}
j		else if (spos >= SLEN)
j		{	spos -= SLEN;
j			++ssec;
j		}
j		break;
j	case 8:			/* sector-relative to begin */
j	case 9:			/* sector-relative to present-sector */
j	case 10:		/* sector-relative to sector-EOF */
j		ssec = off;
j		spos = 0;
j		if (mode != 9)
j			break;
j		ssec += csec;
j		break;
j	default:
j		return -1;
j	}
j	if (fp[FB_FLG] & FB_OUF && word(fp+FB_NCP) != fp+FB_BUF)
j	{	f = _dbw[fp[FB_DRV]];
j		if (f == NULL || (f)(fp))
j			return -1;	/* couldn't flush */
j	}
j	fp[FB_FLG] &= ~FB_UNF;		/* drop any FB_UNC */
j	f = _dsk[fp[FB_DRV]];
j	return (f)(fp,mode,csec,cpos,ssec,spos);
j}

kextern fseek();
k
kINT rewind(fp)
k	FILE *fp;
k{
k	return fseek(fp,0,0);
k}

/* l reserved */

/****
 ****	UN*X compatible i/o transfer routines for CP/M
 ****/

/*
 *	character i/o:
 *
 *	getchar()	from stdin
 *	getc(fp)	from fp
 *	fgetc(fp)	from fp
 *		return EOF or character,
 *		return '\n' for RETURN LINEFEED in file,
 *		return '\r' for RETURN in file,
 *		return '\n' for RETURN from device,
 *		return EOF for ^Z or ^D,
 *		set feof() signal only on physical EOF.
 *
 *	ungetc(ch,fp)	push character back, return it or EOF
 *
 *	BUG:	can't push right after '\r' was returned by get
 *
 *	putchar(ch)	to stdout
 *	putc(ch,fp)	to fp (#define as fputc!)
 *		map '\n' to RETURN LINEFEED,
 *		return EOF on hard error.
 */

mextern fgetc();
m
mINT getchar()
m{
m	return fgetc(stdin);
m}

nextern fputs(), _exit(), _cfp, _drd[], ungetc();
n
nINT fgetc(fp)
n	FILE *fp;
n{	int ch;
n	int f;		/* to cast a function call */
n
n	if (fp[FB_FLG] & FB_OUF || (fp[FB_FLG] & FB_OPF) == 0)
n	{	fputs("reading bad file", stderr);
n		_exit();
n	}
n	if (fp[FB_FLG] & FB_UNF)
n	{	fp[FB_FLG] &= ~FB_UNF;
n		return fp[FB_UNC] & 255;
n	}
n	if (fp[FB_FLG] & FB_EOF)
n		return EOF;	/* hard end of file */
n	_cfp = fp;		/* pass to byte driver */
n	f = _drd[fp[FB_DRV]];
n	switch (ch = (f)()) {
n	case CR:
n		if (fp[FB_DRV] == 0 &&
n		    (ch = (f)()) != LF)
n		{	ungetc(ch,fp);
n			return '\r';
n		}
n	case LF:
n		return '\n';
n	case EOF:		/* hard end of file */
n		fp[FB_FLG] |= FB_EOF;
n	case EOT:		/* ^D soft end of file */
n	case SUB:		/* ^Z soft end of file */
n		return EOF;
n	default:
n		return ch;
n	}
n}

oINT ungetc(ch,fp)
o	char ch;
o	FILE *fp;
o{
o	if (fp[FB_FLG] & (FB_OUF | FB_UNF | FB_EOF | FB_OUF) ||
o	    (fp[FB_FLG] & FB_OPF) == 0)
o		return EOF;
o	fp[FB_FLG] |= FB_UNF;
o	return fp[FB_UNC] = ch;
o}

pextern fputc();
p
pINT putchar(ch)
p	char ch;
p{
p	return fputc(ch, stdout);
p}

/*
 *	word i/o:
 *
 *	getw(fp)	return word from fp
 *	putw(w,fp)	write to fp, return word or EOF
 *
 *	always check feof/ferror to discover errors
 */

qextern fputs(), _exit(), _cfp, _drd[];
q
qINT getw(fp)
q	FILE *fp;
q{	char low, high;
q	int f;		/* to cast a function call */
q
q	if (fp[FB_FLG] & FB_OUF || (fp[FB_FLG] & FB_OPF) == 0)
q	{	fputs("reading bad file", stderr);
q		_exit();
q	}
q	if (fp[FB_FLG] & FB_EOF)
q		return EOF;	/* hard end of file */
q	_cfp = fp;		/* pass to _fgetchar() */
q	f = _drd[fp[FB_DRV]];
q	if (fp[FB_FLG] & FB_UNF)
q	{	fp[FB_FLG] &= ~FB_UNF;
q		low = fp[FB_UNC];
q	}
q	else
q		low = (f)();
q	if (fp[FB_FLG] & (FB_EOF | FB_ERM))
q		return EOF;
q	high = (f)();
q	if (fp[FB_FLG] & (FB_EOF | FB_ERM))
q		return EOF;
q	return (high << 8) | (low & 255);
q}

rextern fputs(), _exit(), _cfp, _dwr[];
r
rINT putw(w,fp)
r	int w;
r	FILE *fp;
r{	int f;		/* to cast a function call */
r
r	if ((fp[FB_FLG] & FB_OUF) == 0 || (fp[FB_FLG] & FB_OPF) == 0)
r	{	fputs("writing bad file", stderr);
r		_exit();
r	}
r	if (fp[FB_FLG] & FB_EOF)
r		return EOF;	/* hard end of file */
r	_cfp = fp;		/* pass to _fputchar */
r	f = _dwr[fp[FB_DRV]];
r	(f)(w & 255);		/* low */
r	if (fp[FB_FLG] & (FB_EOF | FB_ERM))
r		return EOF;
r	(f)(w >> 8);		/* high */
r	if (fp[FB_FLG] & (FB_EOF | FB_ERM))
r		return EOF;
r	return w;
r}

/*
 *	other i/o:
 *
 *	gets	string from stdin, '\n' becomes NUL
 *	fgets	string from fp, '\n' is kept
 *	puts	string to stdout, appends '\n'
 *
 *	return NULL on error, else string.
 *
 *	fread, fwrite
 *		to be implemented
 */

sextern fgetc();
s
sCHAR_P gets(s)
s	char *s;
s{	int ch;
s	char *str;
s
s	str = s;
s	while ((ch = fgetc(stdin)) != '\n')
s	{	if (ch == EOF)
s		{	str = NULL;
s			break;
s		}
s		*s++ = ch;
s	}
s	*s = NUL;
s	return str;
s}

textern fgetc();
t
tCHAR_P fgets(s, n, fp)
t	char *s;
t	int n;
t	FILE *fp;
t{	int ch;
t	char *str;
t
t	str = s;
t	while (--n > 0)
t		if ((ch = fgetc(fp)) == '\n')
t		{	*s++ = ch;
t			break;
t		}
t		else if (ch == EOF)
t		{	str = NULL;
t			break;
t		}
t		else
t			*s++ = ch;
t	*s = NUL;
t	return str;
t}

uextern fputc();
u
uCHAR_P puts(s)
u	char *s;
u{	char ch;
u	char *str;
u
u	str = s;
u	while (ch = *s++)
u		if (fputc(ch, stdout) == EOF)
u			return NULL;
u	if (fputc('\n', stdout) == EOF)
u		return NULL;
u	return str;
u}

/****
 ****	memory display routines
 ****/

/*
 *	putbit	show bits in groups of 1 byte
 *	puthex	show bytes in groups of 8 words
 */

Bextern fputc(), fprintf();
B
Bputbit(add, buf, bits, fp)
B	char *add;	/* first address to show */
B	char *buf;	/* -> first byte */
B	int bits;	/* # bits */
B	FILE *fp;	/* for output */
B{	char c;		/* current byte */
B	int i,j;
B
B	while (bits)
B	{	fprintf(fp, "%04x:", add);
B		for (i=0; bits && i<4; ++i)
B		{	fputc(' ',fp);
B			c = *buf++;
B			for (j=0; bits && j<8; ++j)
B			{	if (c & 128)
B					fputc('1',fp);
B				else
B					fputc('0',fp);
B				c <<= 1;
B				--bits;
B			}
B		}
B		fputc('\n',fp);
B	}
B}

Cextern fprintf(), fputc(), isprint(), isascii(), iscntrl();
C
Cputhex(add, buf, bytes, fp)
C	char *add;	/* first address to show */
C	char *buf;	/* -> first byte to show */
C	int bytes;	/* # bytes (minimum) */
C	FILE *fp;	/* for output */
C{	char c;		/* current byte */
C	int i;
C
C	do
C	{	fprintf(fp,"%04x: ", add);
C		for (i=0; i<16; i += 2)
C			fprintf(fp,"%02x%02x ",	buf[i] & 255, buf[i+1] & 255);
C		for (i=0; i<16; ++i)
C			if (isascii(c = *buf++) && isprint(c) && ! iscntrl(c))
C				fputc(c,fp);
C			else
C				fputc('.',fp);
C		fputc('\n',fp);
C		add += 16;
C	} while ((bytes -= 16) > 0);
C}
%%%%%%%%%% scc/rtl/c1.get %%%%%%%%%%
/*
 *	c?.get -- smallC runtime library for CP/M and MACRO-80
 *	ats 2/83, in part adapted from Jim Hendrix' code
 */

$#define NOCCARGC
##include def.h		/* TO BE FIXED */

/*
 *	module names
 */

##asm
a	NAME	('abs')
b	NAME	('atoi')	; needs is*
c				; _ctype external
d	NAME	('isprint')
e	NAME	('iscntrl')
f	NAME	('isalpha')
g	NAME	('isdigit')
h	NAME	('isxdigit')
i	NAME	('ispunct')
c				; end of _ctype needed
j	NAME	('toascii')
k	NAME	('index')
l
m	NAME	('strcat')
n
o
p	NAME	('strcpy')
q
r	NAME	('strlen')
s	NAME	('byte')
t	NAME	('rword')
u	NAME	('cshow')	; needs cavail printf fputs
v	NAME	('cavail')
##endasm

/****
 ****	UN*X compatible math functions
 ****/

/*
 *	abs	absolute value of integer
 */

aINT abs(i)
a	int i;
a{
a	if (i<0)
a		return -i;
a	return i;
a}

/*
 *	atoi	integer value in string
 *
 *		optional sign
 *			0??	base 8
 *			0x??	base 16
 *			other	base 10
 */

bextern isspace(), isdigit(), isxdigit(), isupper();
b
bINT atoi(string)
b	char *string;
b{	int mult;
b	int base;
b	int ch;
b	int atoi;
b
b	mult = 1;
b	base = 10;
b	atoi = 0;
b	while (isspace(ch = *string))
b		string++;
b	if ((ch = *string) == '-')
b	{	mult = -1;
b		ch = *++string;
b	}
b	else if (ch == '+')
b		ch = *++string;
b	if (ch == '0')
b	{	base = 8;
b		if ((ch = *++string) == 'x' || ch == 'X')
b		{	base = 16;
b			ch = *++string;
b		}
b	}
b	for( ; ch; ch = *++string)
b	{	if (isdigit(ch))
b			ch -= '0';
b		else if (isxdigit(ch))
b			if (isupper(ch))
b				ch -= 'A' - 10;
b			else
b				ch -= 'a' - 10;
b		if (ch < base)
b			atoi = atoi*base + ch;
b		else
b			break;
b	}
b	return mult*atoi;
b}

/****
 ****	UN*X compatible character functions
 ****/

/*
 *	character type functions:
 *
 *	isprint(c)	c is printing
 *	iscntrl(c)	c is control character
 *	isalpha(c)	c is alphabetic
 *	isdigit(c)	c is (decimal) digit
 *	isxdigit(c)	c is base 16 digit
 *	ispunct(c)	c is punctuation character
 */

	/* 128     64    32    16  8   4     2     1     */
	/* special upper lower num hex space punct cntrl */

c#define C_PRINT (128+64+32+16  +4    )	/* printing character */
c#define C_CNTRL (                   1)	/* control character */
c#define C_ALPHA (    64+32           )	/* alphabetic */
c#define C_UPPER (    64              )	/* upper case */
c#define C_LOWER (       32           )	/* lower case */
c#define C_DIGIT (          16        )	/* digit */
c#define C_XDIGI (          16+8      )	/* base 16 digit */
c#define C_ALNUM (    64+32+16        )	/* alpha or numeric */
c#define C_SPACE (               4    )	/* white space */
c#define C_PUNCT (                 2  )	/* punctuation */
c
cextern char _ctype[];

dINT isprint(c) char c;  { return _ctype[c] & C_PRINT; }
eINT iscntrl(c) char c;  { return _ctype[c] & C_CNTRL; }
fINT isalpha(c) char c;  { return _ctype[c] & C_ALPHA; }
gINT isdigit(c) char c;  { return _ctype[c] & C_DIGIT; }
hINT isxdigit(c) char c; { return _ctype[c] & C_XDIGI; }
iINT ispunct(c) char c;  { return _ctype[c] & C_PUNCT; }

/*
 *	character conversion functions:
 *
 *	toascii(i)	return i mapped into ASCII character set
 */

jCHAR toascii(i) int i;  { return i & 127; }

/****
 ****	UN*X compatible string functions
 ****/

/*
 *	index	NULL or -> first 'c' in 's'
 */

kCHAR_P index(s,c)
k	char *s;
k	char c;
k{
k	do
k		if (*s == c)
k			return s;
k	while (*s++);
k	return NULL;
k}

/* l reserved */

/*
 *	strcat	copy `v' to end of 'n' including \0
 */

mCHAR_P strcat(n,v)
m	char *n, *v;
m{	char *nach;
m
m	nach = n;
m	while (*n++)
m		;
m	for (--n; *n++ = *v++; )
m		;
m	return nach;
m}

/* no reserved */

/*
 *	strcpy	copy `v' to 'n' including \0
 */

pCHAR_P strcpy(n,v)
p	char *n, *v;
p{	char *nach;
p
p	nach = n;
p	while (*n++ = *v++)
p		;
p	return nach;
p}

/* q reserved */

/*
 *	strlen	length of `s' sans \0
 */

rINT strlen(s)
r	char *s;
r{	int len;
r
r	for (len = 0; *s++; )
r		len++;
r	return len;
r}

/****
 ****	routines to approximate C features
 ****/

/*
 *	byte(&c)	return byte
 *	rword(&i)	return byte-reversed word
 */

sCHAR byte(bp)
s	char *bp;
s{
s	return *bp & 255;
s}

tINT rword(wp)
t	char *wp;
t{
t	return (*wp << 8) | *(wp+1) & 255;
t}

/****
 ****	dynamic memory allocation
 ****/

/*
 *	cavail	return approximate KB still free
 *	cshow	display heap on stderr
 */

uextern fprintf(), cavail(), fputc();
uextern char _fberr[], _end[];
u
ucshow()
u{	int *p, *np, l, i;
u
u	p = _end+1 & ~1;
u	i = 0;
u	do
u	{	if (++i == 6)
u		{	fputc('\n', stderr);
u			i = 1;
u		}
u		np = *p & ~1;
u		fprintf(stderr, "%04x ", p);
u		if (l = np-1 - p)
u			if (*p & 1)
u				fprintf(stderr, "(%u) ", l << 1);
u			else
u				fprintf(stderr, "[%u] ", l << 1);
u		p = np;
u	} while (*np);
u	fprintf(stderr, "\nabout %d KB below stack\n", cavail());
u}

vextern char _end[];
vextern word();
v
vINT cavail()
v{	char *p;
v
v	for (p = _end+1 & ~1; word(p); p = word(p) & ~1)
v		;
v	return ((&p - p) >> 10 & (1 << 6)-1) - 1;
v}
%%%%%%%%%% scc/rtl/crtl.mac %%%%%%%%%%
;	crtl.mac -- smallC runtime environment module
;		for CP/M
;		for MACRO/80

;	ats 2/83
;	in part adapted from Jim Hendrix' code

;	global name conventions:
;	========================
;
;	?	starts an internal routine name
;	_	starts an internal C-callable name
;	other	starts a published C-callable name
;
;	This file is organized so that all references
;	to global symbols are forward.

;	smallC CP/M environment:
;	========================
;
;	Set up stack to run from top of memory downward,
;	and call smallC environment routine _shell().
;
;	Upon return, connect to BIOS warm start.
;
;	_exit	entry point to BIOS warm start,
;		i.e., no file management wrapup.
;
;	If the END module is linked last (and it must be):
;
;	_edata	follows the last static data area,
;		is preceded by the 6 character production date mmddyy
;
;	_eprog	follows the last code area
;		is preceded by the 6 character compiler logo
;
;	_end	follows the end of code and data 
;
;	The smallC compiler is expected to supply a reference
;	to the ?smallC routine to arrange for proper library search.

	ENTRY	?smallC
	ENTRY	_exit
	EXTRN	_shell		; outermost C runtime routine
	EXTRN	?30217		; version reference

V.BIOS	EQU	0		; entry vector for BIOS warm start
V.BDOS	EQU	5		; entry vector for BDOS

	CSEG

?smallC:
	LHLD	V.BDOS+1	; stack starts at top of memory
	SPHL
	CALL	_shell		; call C environment routine
_exit:
	JMP	V.BIOS		; return to system

;	BDOS calls:
;	===========
;
;	BDOS	C call		return	entry	description
;	code			value	value
;	-------------------------------------------------------------
;	0	abort()				system reset
;	1	i = _getchar()	char		console read
;	2	_putchar(c)		char	console write
;	3	i = _rgetchar()	char		reader read
;	4	_pputchar(c)		char	punch write
;	5	_lputchar(c)		char	list write
;	6	i = _dirio(c)	char	0xFF	direct input
;				0=busy	char	direct output
;	7	i = _giob()	byte		get i/o byte
;	8	_siob(c)		byte	set i/o byte
;	9	_puts(&c)		address	print string to next $
;	10	_gets(&buf)		address	read console buffer
;	11	i = _cstat()	0=busy		get console status
;	12	i = _vers()	word		get version number (in hex)
;	13	_reset()			reset disk
;	14	i = _mount(c)	0=ok	drive#	select disk
;	15	i = _open(&f)	dir [1]	address	open file
;	16	i = _close(&f)	dir	address	close file
;	17	i = _glob(&f)	dir [2]	address	search for first file name
;	18	i = _nglob()	dir [2]		search for next file name
;	19	i = _delete(&f)	dir	address	delete file
;	20	i = _read(&f)	err [3]	address	read next record
;	21	i = _write(&f)	err [3]	address	write next record
;	22	i = _create(&f) dir [1]	address	create file
;	23	i = _renam(&fn)	dir	address	rename file
;	24	i = _login()	vector		get login vector
;	25	i = _drive()	drive#		get disk number
;	26	_setbuf(&c)		address set DMA address (of 128 bytes)
;	27	i = _bitmap()	bitmap		get allocate vector
;	28	_protect()			write protect
;	29	i = romap()	vector		get R/O vector
;	30	i = _chmod(&f)	dir	address	set file attributes
;	31	i = _diskmap()	diskmap		get disk header address
;	32	i = _uid(c)	user#	0xFF	get user number
;				0=ok	user#	set user number
;	33	i = _rread(&f)	err [4]	address	read random
;	34	i = _rwrite(&f)	err [4]	address	write random
;	35	_stat(&f)	[5]	address	compute file size
;	36	_record(&f)	[5]	address	set random record
;	37	i = _umount(i)	0=ok	vector	reset selected drives
;	40	i = _rzwrite(&f) err[4]	address	write random zero fill
;	-------------------------------------------------------------
;
;	bitmap	from left to right, set bits indicate allocated
;		reservation blocks
;
;	buf	console buffer has the following format:
;
;		byte	(in)	maximum length available for text
;		byte	(out)	length actually filled
;		byte...	(out)	text read, without trailing newline
;
;	c	character (byte) parameter
;
;	dir	position in directory sector, 0..3
;		not found: 0xFF
;
;	diskmap	CP/M disk description
;
;	drive#	disk drive number, 0==A, 1==B, ...
;
;	err	error code:
;
;		0	ok
;		1	reading unwritten data (end of file)
;
;	f	file control block
;		can usually contain wildcard file name
;
;	fn	file control block,
;		new name begins at offset 17
;
;	i	integer (word) result, possibly byte sign-extended
;
;	vector	bit vector indicating disk drives,
;		least significant bit is drive 0
;
;	[1]	modifies argument file control block
;
;	[2]	requires _setbuf(),
;		result indicates directory entry in this buffer
;
;	[3]	requires _setbuf(),
;		i/o happens from the DMA area set up by _setbuf()
;
;	[4]	[3], additionally, the random record position
;		must have been set in the argument file control block
;
;	[5]	result is returned to the random record position
;		in the file control block

;	macro to dispatch BDOS calls:
;	-----------------------------
;
;	t	action
;	-------------------------------------------------------------
;	0	jump to BDOS
;	1	call BDOS, return HL = (int) A
;	2	DE = parm, call BDOS
;	3	DE = parm, call BDOS, return HL = (int) A

BDOS	MACRO	func,t,code
&func::			;; entry point from C
	MVI	C,&code	;; set BDOS function code
	JMP	?BD&t	;; goto executor
	ENDM

	BDOS	abort,0,0
	BDOS	_getch,1,1
	BDOS	_putch,2,2
	BDOS	_rgetc,1,3
	BDOS	_pputc,2,4
	BDOS	_lputc,2,5
	BDOS	_dirio,3,6
	BDOS	_giob,1,7
	BDOS	_siob,2,8
	BDOS	_puts,2,9
	BDOS	_gets,2,10
	BDOS	_cstat,1,11
	BDOS	_vers,0,12
	BDOS	_reset,0,13
	BDOS	_mount,3,14
	BDOS	_open,3,15
	BDOS	_close,3,16
	BDOS	_glob,3,17
	BDOS	_nglob,1,18
	BDOS	_delete,3,19
	BDOS	_read,3,20
	BDOS	_write,3,21
	BDOS	_create,3,22
	BDOS	_rename,3,23
	BDOS	_login,0,24
	BDOS	_drive,1,25
	BDOS	_setbuf,2,26
	BDOS	_bitmap,0,27
	BDOS	_protect,0,28
	BDOS	_romap,0,29
	BDOS	_chmod,3,30
	BDOS	_diskmap,0,31
	BDOS	_uid,3,32
	BDOS	_rread,3,33
	BDOS	_rwrite,3,34
	BDOS	_stat,2,35
	BDOS	_record,2,36
	BDOS	_umount,3,37
	BDOS	_rzwrite,3,40

;	BDOS interface:
;	---------------

;	type 0:
;
;		jump to BDOS
;		i.e., either no return, or return HL

?BD0	EQU	V.BDOS

;	type 2:
;
;	C	in	BDOS function
;	DE	local	int parameter
;	HL	local

?BD2:	POP	H	; return
	POP	D	; int parameter
	PUSH	D
	PUSH	H
	JMP	V.BDOS	; return through BDOS

;	type 3:
;
;	A	local	from BDOS
;	C	in	BDOS function
;	DE	local	int parameter
;	HL	out	= (int) A

?BD3:	POP	H	; return
	POP	D	; int parameter
	PUSH	D
	PUSH	H
;	JMP	?BD1	; BDOS, return HL = (int) A

;	type 1:
;
;	A	local	from BDOS
;	C	in	BDOS function
;	HL	out	= (int) A

?BD1:	CALL	V.BDOS
	JMP	?SXT	; HL = (int) A

;	BIOS calls:
;	===========
;
;	BIOS	C call		return	entry	description
;	offset			value	value
;	-------------------------------------------------------------
;	0					complete cold start
;	3	_wboot()			warm start
;	6	i = _const()	ff=ready	console status
;	9	c = _conin()	char		console input (no echo)
;	12	_conout(c)		char	console output
;	15	_lstout(c)		char	printer output
;	18	_punout(c)		char	punch output
;	21	c = _rdrin()	char		reader input
;	24	_home()				set track zero
;	27	i = _seldsk(c,b) 0=no	drive#,	select disk
;				diskmap	first
;	30	_settrk(i)		track	select track
;	33	_setsec(i)		sector	set sector
;	36	_setdma(&c)		address	set DMA address
;	39	i = _sread()	0=ok		read CP/M sector
;	42	i = _swrite(c)	0=ok	all	write CP/M sector
;	45	i = _lstst()	ff=ready	printer status
;	48	i = _sectran(i,&c) phys	log,	translate sector
;					ttable
;	-------------------------------------------------------------
;
;	all	0: write to previously allocated block
;		1: write to directory (always to disk)
;		2: write to first sector of unallocated data block
;
;	b	bit parameter
;
;	c	character (byte) parameter
;
;	diskmap	CP/M disk description (0==



More information about the Comp.sources.unix mailing list