home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
languags
/
prolog
/
epro23.ark
/
SYMB.MAC
< prev
next >
Wrap
Text File
|
1986-11-02
|
6KB
|
390 lines
; ===========================================================
; SYMB.Z80
; symbol table routines for E-Prolog
; May 27, 1985
.Z80
FALSE EQU 0
TRUE EQU 1
EMPTY EQU -1
UNDEF EQU -2
HT EQU 9
LF EQU 10
CR EQU 13
CTLZ EQU 26
CPM EQU 0000H
BDOS EQU CPM+0005H
CDMA EQU CPM+0080H
TPA EQU CPM+0100H
;SYMBOL *
;gtoken()
; {
; /* read token */
GTOKEN::
; static int i;
; static char * tokptr;
; static SYMBOL * sadr;
; static SYMBOL ** sadrr;
DSEG
TOKPTR: DW 0
SADR: DW 0
SADRR: DW 0
CSEG
;
; tokptr = cdma;
LD HL,CDMA
LD (TOKPTR),HL
; while(separp(rdchar()))
; ;
GT1:
CALL RDCHAR##
CALL SEPARP##
JR NZ,GT1
; if (digitp())
CALL DIGITP
JR Z,GT2
; {
; for (i = 0 ; digitp() ; rdchar())
LD HL,0
GT4: PUSH HL
CALL DIGITP
JR Z,GT3
; i = i*10 + ((int)(character - '0'));
POP HL
ADD HL,HL
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD A,(CHR##)
SUB '0'
LD E,A
LD D,0
ADD HL,DE
CALL RDCHAR##
JR GT4
GT3:
; unrdchar();
CALL UNRDCH##
; if (numbp(i))
; return i;
POP HL
CALL NUMBP##
RET NZ
; return 0;
LD HL,0
RET
; }
GT2:
; if (character == '"')
LD A,(CHR##)
CP '"'
JR NZ,GT5
; {
; rdchar();
CALL RDCHAR##
; do
GT9:
; {
; cntl();
CALL CNTL
; *tokptr++ = character;
LD HL,(TOKPTR)
LD A,(CHR##)
LD (HL),A
INC HL
LD (TOKPTR),HL
; rdchar();
CALL RDCHAR##
; }
; while (character != '"') ;
LD A,(CHR##)
CP '"'
JR NZ,GT9
; }
JR GT8
GT5:
; else if (character == '\'')
CP "'"
JR NZ,GT6
; {
; rdchar();
CALL RDCHAR##
; do
GT10:
; {
; cntl();
CALL CNTL
; *tokptr++ = character;
LD HL,(TOKPTR)
LD A,(CHR##)
LD (HL),A
INC HL
LD (TOKPTR),HL
; rdchar();
CALL RDCHAR##
; }
; while (character != '\'') ;
LD A,(CHR##)
CP "'"
JR NZ,GT10
; }
JR GT8
GT6:
; else if (goodchp())
CALL GOODCP
JR Z,GT7
; {
; do
GT11:
; {
; *tokptr++ = character;
LD HL,(TOKPTR)
LD A,(CHR##)
LD (HL),A
INC HL
LD (TOKPTR),HL
; rdchar();
CALL RDCHAR##
; }
; while (goodchp()) ;
CALL GOODCP
JR NZ,GT11
; unrdchar();
CALL UNRDCH##
; }
JR GT8
GT7:
; else
; *tokptr++ = character;
LD HL,(TOKPTR)
LD A,(CHR##)
LD (HL),A
INC HL
LD (TOKPTR),HL
GT8:
; *tokptr = '\0';
LD HL,(TOKPTR)
LD (HL),0
;
; /* find it in symbol table */
; sadr = sbot;
LD HL,(SBOT##)
LD (SADR),HL
; do
FS1:
; {
; if ((i = strcmp(sadr->string,cdma)) == 0)
LD HL,(SADR)
CALL @STR##
LD DE,CDMA
CALL STRCMP
JR NZ,FS2
; return sadr;
LD HL,(SADR)
RET
FS2:
; if (i < 0)
JR NC,FS3
; sadrr = &(sadr->rptr);
LD HL,(SADR)
INC HL
INC HL
INC HL
INC HL
LD (SADRR),HL
JR FS4
FS3:
; else
; sadrr = &(sadr->lptr);
LD HL,(SADR)
INC HL
INC HL
LD (SADRR),HL
FS4:
; sadr = *sadrr;
LD E,(HL)
INC HL
LD D,(HL)
LD (SADR),DE
; }
; while (sadr != (SYMBOL *)empty) ;
LD HL,EMPTY
CALL CPHL##
JR NZ,FS1
; *sadrr = mksymb();
CALL MKSYMB
EX DE,HL
LD HL,(SADRR)
LD (HL),E
INC HL
LD (HL),D
; return *sadrr;
EX DE,HL
RET
; }
; compare two strings
;
; input:
; HL, DE pointing to the strings
; output:
; Z and C flags:
; Z ,NC = (HL) = (DE)
; NZ,C = (HL) < (DE)
; NZ,NC = (HL) > (DE)
STRCMP::
EX DE,HL
ST1: LD A,(DE)
CP (HL)
RET NZ
OR A
RET Z
INC HL
INC DE
JR ST1
;BOOLEAN
;digitp()
; {
; return ('0' <= character && character <= '9');
; }
DIGITP:
LD A,(CHR##)
CP '0'
JR C,RETF
CP '9'+1
JR NC,RETF
RETT: OR A
RET
RETF: XOR A
RET
;cntl()
CNTL:
; {
; if (character == '^')
LD A,(CHR##)
CP '^'
RET NZ
; {
; rdchar();
CALL RDCHAR##
; if (character == '^')
; return;
LD A,(CHR##)
CP '^'
RET Z
; if (character < '@')
; return;
CP '@'
RET C
; character &= 0x1F;
AND 1FH
LD (CHR##),A
; }
; }
;BOOLEAN
;goodchp()
GOODCP:
; {
; switch (character)
LD A,(CHR##)
; {
; case '_':
; case '-':
; case '?':
; return TRUE;
; }
CP '_'
JP Z,RETT
CP '-'
JP Z,RETT
CP '?'
JP Z,RETT
; return (('0' <= character && character <= '9') ||
; ('A' <= character && character <= 'Z') ||
; ('a' <= character && character <= 'z') );
CP '0'
JP C,RETF
CP '9'+1
JP C,RETT
CP 'A'
JP C,RETF
CP 'Z'+1
JP C,RETT
CP 'a'
JP C,RETF
CP 'z'+1
JP C,RETT
JP RETF
; }
; Make an entry in the symbol table
;
;SYMBOL *
;mksymb()
; {
MKSYMB::
; static char * tokptr;
; static SYMBOL * sadr;
;
; sadr = (SYMBOL *)sfree;
LD HL,(SFREE##)
PUSH HL
; sadr->addr = empty;
LD DE,EMPTY
LD (HL),E
INC HL
LD (HL),D
; sadr->lptr = empty;
INC HL
LD (HL),E
INC HL
LD (HL),D
; sadr->rptr = empty;
INC HL
LD (HL),E
INC HL
LD (HL),D
; for (sfree = sadr->string , tokptr = cdma ;
; (*sfree++ = *tokptr++) != '\0' ; )
; ;
INC HL
EX DE,HL
LD HL,CDMA
MK1: LD A,(HL)
LD (DE),A
INC HL
INC DE
OR A
JR NZ,MK1
EX DE,HL
LD (SFREE##),HL
; if (sfree >= stop)
LD DE,(STOP##)
DEC DE
CALL CPHL##
JR C,MK2
; fatal("\r\nOut of string space.");
LD HL,MK1MSG
JP FATAL##
DSEG
MK1MSG: DB CR,LF,"Out of string space.",0
CSEG
MK2:
; return sadr;
POP HL
RET
; }
END