Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

smallC V2 CP/M runtime support - (nf)

7 views
Skip to first unread message

uiucdcs!schrein

unread,
Mar 15, 1983, 3:00:12 AM3/15/83
to
#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==

0 new messages