;
; BDS.LIB               for BDS C v1.46             March  15, 1982
;
; Addresses within C.CCC and the ram area to be used by machine
; language CRL functions.
;
; If you alter C.CCC by reassembling CCC.ASM, be sure to go through
; this file and make sure all the addresses are equated to the
; appropriate values resulting from the reassembly. Then the library
; functions will be ready to reassemble.
;

       page 76

CPM:    EQU 1           ;true if running under CP/M; else 0

;
; System addresses:
;

       if not cpm
CCCORG: EQU WHATEVER    ;IF NOT RUNNING UNDER CP/M, SET THIS TO LOAD ADDR,
RAM:    EQU WHATEVER2   ;SET THIS TO RAM AREA,
BASE:   EQU WHATEVER3   ;AND THIS TO THE BASE OF SYSTEM MEMORY (`BASE' IS
                       ;THE RE-BOOT LOCATION UNDER CP/M; FOR NON-CP/M OPER-
                       ;ATION, IT SHOULD BE SET TO A SAFE PLACE TO JUMP TO ON
                       ;ERROR OR USER-ABORT.
       endif


       if cpm
base:   equ 0000h       ;either 0 or 4200h for CP/M systems
fcb:    equ base+5ch    ;default file control block
tbuff:  equ base+80h    ;sector buffer
bdos:   equ base+5      ;bdos entry point
tpa:    equ base+100h   ;transient program area
nfcbs:  equ 8           ;max number of open files allowed at one time
errorv: equ 255         ;error value returned by BDOS calls
cccorg: equ tpa         ;where run-time package resides *TESTING*

                       ;**************************************************
ram:    equ cccorg+471h ;THIS WILL PROBABLY CHANGE IF YOU CUSTOMIZE CCC.ASM
                       ;**************************************************
       endif


cr:     equ 0dh         ;ASCII codes:   carriage return
lf:     equ 0ah         ;               linefeed
newlin: equ lf          ;               newline
tab:    equ 9           ;               tab
bs:     equ 08h         ;               backspace
cntrlc: equ 3           ;               control-C

;
; Subroutines in C.CCC (the addresses should be that of the
; appropriate jump vector entry points):
;

error:  equ cccorg+1dh  ;return -1 in HL:
exit:   equ error+3     ;close all open files and reboot

       if cpm
close:  equ error+6
setfcb: equ error+9     ;set up fcb at HL from text at DE
fgfd:   equ error+12    ;set C according to whether file fd is open
fgfcb:  equ error+15    ;figure address of internal fcb for file fd
       endif


eqwel:  equ cccorg+0e5h

smod:   equ cccorg+10fh
usmod:  equ cccorg+129h
smul:   equ cccorg+13fh
usmul:  equ cccorg+16bh
usdiv:  equ cccorg+189h
sdiv:   equ cccorg+1cbh

cmh:    equ cccorg+1fah ;2's complement HL
cmd:    equ cccorg+202h ;2's complement DE
ma1toh: equ cccorg+20ah ;get 1st stack element into HL and A
ma2toh: equ cccorg+213h ;    2nd
ma3toh: equ ma2toh+6    ;    3rd
ma4toh: equ ma2toh+12   ;    4th
ma5toh: equ ma2toh+18   ;    5th
ma6toh: equ ma2toh+24   ;    6th
ma7toh: equ ma2toh+30   ;    7th

arghak: equ ma2toh+36   ;copy first 6 or so stack elements to argc area
setdma: equ cccorg+460h ;set CP/M internal DMA pointer to BASE+80h (tbuff)

;
; The following addresses will depend on the value of RAM if you
; customize CCC.ASM....be sure they correspond to the assembly
; results of CCC.ASM in such cases. If you remove some of the data
; areas from CCC.ASM (in case they aren't needed), be sure to remove
; from here also.
;

       org ram

room:   ds 30           ;misc. scratch area (for use by BDS...you can have
                       ;the last ten bytes or so, though, if you really
                       ;need them)

pbase:  ds 2            ;DMA video plotting base
ysize:  ds 2            ;screen width (# of columns)
xsize:  ds 2            ;screen length (# of lines)
psize:  ds 2            ;screen size (ysize * xsize)

rseed:  ds 8            ;random number seed scratch area

args:   ds 14           ;where arghak puts arg values off the stack

iohack: ds 6            ;room for input and output ops for "inp" and "outp"

allocp: ds 2            ;storage allocation pointer
alocmx: ds 2            ;highest addr useable by storage allocator

;
; This is the end of the user-customizable area. The remaining
; equated values are not to be altered.
;

;
; Special locations in C.CCC containing interesting pointers:
;

extrns: equ cccorg+15h  ;base of external data area (set by CLINK)
cccsiz: equ cccorg+17h  ;size of C.CCC for use by CLINK only
codend: equ cccorg+19h  ;address of byte following last byte of program code
                       ; (set by CLINK)
freram: equ cccorg+1bh  ;first free address after external area
                       ; (set by CLINK)


arg1:   equ args        ;these are just convenient names for
arg2:   equ args+2      ;the words in the "args" area
arg3:   equ args+4
arg4:   equ args+6
arg5:   equ args+8
arg6:   equ args+10
arg7:   equ args+12

tmp:    equ room        ;some scratch data areas used by library
tmp1:   equ room+1      ;functions.
tmp2:   equ room+2
tmp2a:  equ room+4
ungetl: equ room+6
lastc:  equ room+7


;
; BDOS call codes:
;

       if cpm
conin:  equ 1           ;get a character from console
conout: equ 2           ;write a character to console
lstout: equ 5           ;write a character to list device
dconio: equ 6           ;direct console I/O (only for CP/M 2.0)
pstrng: equ 9           ;print string (terminated by '$')
getlin: equ 10          ;get buffered line from console
cstat:  equ 11          ;get console status
select: equ 14          ;select disk
openc:  equ 15          ;open a file
closec: equ 16          ;close a file
delc:   equ 19          ;delete a file
reads:  equ 20          ;read a sector (sequential)
writs:  equ 21          ;write a sector (sequential)
creatc: equ 22          ;make a file
renc:   equ 23          ;rename file
sdma:   equ 26          ;set dma
readr:  equ 33          ;read random sector
writr:  equ 34          ;write random sector
cfsizc: equ 35          ;compute file size
srrecc: equ 36          ;set random record
       endif