home *** CD-ROM | disk | FTP | other *** search
- ; Pascal/Z run-time support interface -- WITH PROFILER
- ; COPYRIGHT 1978, 1979, 1980, 1981 BY JEFF MOSKOW
- NAME MAIN
- ENTRY .FLTERR,.HPERR,.REFERR,.STKERR,.RNGERR,.DIVERR,.MLTERR,L98,.CRLF
- ENTRY .PERROR,.STMTMSG,.CHIN$,.STRERR,.MAXOUT,.MXOUT,.MXUT1,.STRMSG
- ENTRY .START
- EXT .ILDV,.ILDV1,.ILDV2,.ILD1,.ILD11,.ILD12,.ILD2,.ILD21
- EXT .ILD22
- EXT .ISTR,.ISTR1,.ISTR2,.XADDR,.YADDR,.FSUB,.FADD,.ENTRSC,.ENTER
- EXT .EXITF,.FPEQ,.SEQUL,.FPNEQ,.SNE,.FPLTE,.SLE,.ILE,.FPLT,.SLT,.ILT
- EXT .FPGTE,.SGE,.IGE,.FPGT,.SGT,.IGT,.FMULT,.IMULT,.QMULT,.IDIVD,.IMOD
- EXT .NCDVD,.NCMOD,.ERROR,.CSTS,.CI,.CO,.CHKDE,.CHKHL,.PSTAT,.CONSET
- EXT .RCSET,.UNION,.INN,.LTEQ
- EXT .GTEQ,.INSECT,.ORGAN,.COMP,.FUSS,.FOUT,.FXDCVT,.CVTFLT,.TOUT
- EXT .TXTYP
- EXT .FDIVD,.STREQL,.STRNQL,.STRLEQ,.STRLSS,.STRGEQ,.STRGRT,.LAST
- EXT .WRITELN,L109,L110,L111,L112,L115,L116,L117,L118,L120
- EXT .READLN,L121,L122,L123,L124,L125,L126,L127,L128,L129
- EXT .WRITE,L130,L131,L132,L133,L134,L135,L136,L0
- EXT .READ,L137,.ABS,.FPABS,.SQR,.FPSQR,.EOLN,.EOF,.RESET,.REWRITE
- EXT .FTXTIN,.CHAIN,.NEW,.MARK,.RELEASE,.TRUNC,.ROUND,.ARCTAN,.COS
- EXT .EXPFCT,.LN,.SQRT,.SIN
- R: SET 0FFFFH
- C: SET 0FFFFH
- M: SET 0FFFFH
- S: SET 0FFFFH
- D: SET 0FFFFH
- E: SET 00000H
- F: SET 0FFFFH
- T: SET 00000H
- VALID: SET 00000H
- FIRSTMT SET 00000H ; NO 'STMT' CALLS YET
- MINSTMT SET 00000H ; LOWEST, HIGHEST TRACED
- MAXSTMT SET 00000H ; ..STATEMENT NUMBERS
- .MAXOUT EQU 4
- .MXOUT EQU .MAXOUT*256
- .MXUT1 EQU .MXOUT*2
- CR EQU 13
- LF EQU 10
- EOFMRK EQU 1AH
- BUFLEN EQU 80
- TOPFRM EQU .MAXOUT+.MAXOUT+BUFLEN+3+1
- MARGIN EQU 50
- COMPILER EQU 0H
- MAXDRV EQU 16
- CPM EQU 5
- .START: MVI C,25
- CALL CPM
- LHLD 6
- DCX H
- MOV M,A
- LXI B,0
- LXI H,.LAST
- EXX
- LHLD 6
- LXI D,0-TOPFRM-1
- DAD D
- PUSH H
- PUSH H
- POP X
- POP Y
- SPHL
- MVI B,.MAXOUT*2+1
- XRA A
- CLRSTK: MOV M,A
- INX H
- DJNZ CLRSTK
- INX H
- MOV M,A
- LXI H,80H
- MOV A,M
- CPI 2
- JRC NOCOM
- MOV B,M
- DCR B
- INX H
- INITLP INX H
- MOV C,M
- CALL .TOUT
- DJNZ INITLP
- NOCOM MVI C,CR
- CALL .TOUT
- ; code to clear the profile table to zero
- lbcd proclear ; bytes in stmt buckets
- lxi h,proftab ; start of bucket area
- mvi m,00h ; begin zeros
- lxi d,proftab+1
- ldir ; propogate zero
- ; end inserted code
- JMP L99
- ; code inserted to increment a statement count
- .profinc:
- push psw
- push b
- push h
- lhld profset ; -(lowest number)
- dad b ; relative stmt number
- dad h ; relative byte
- lxi b,proftab ; base address
- dad b ; hl->stmt bucket
- mov b,m ; pick up stmt's counter
- inx h
- mov c,m
- inx b ; ..increment,
- mov m,c ; ..put back
- dcx h
- mov m,b
- pop h
- pop b
- pop psw
- ret
- ; end of insertion
- FINI: MACRO ; as modified to write profile table
- mvi c,19
- lxi d,profile
- call cpm ; erase existing profile
- mvi c,22
- lxi d,profile
- call cpm ; create 'A:PROFILER.DAT'
- lxi h,proferr
- inr a
- jz .ERROR ; -- make failed
- lxi h,prodata ; hl->next record
- lda pronio
- mov b,a ; b=record count
- profout:
- xchg ; de->next record
- push d ; (save it)
- mvi c,26
- push b ; (save loop count)
- call cpm ; set buffer address
- lxi d,profile
- mvi c,21
- call cpm ; write one record
- lxi h,proferr
- ora a
- jnz .ERROR
- pop b
- pop h
- lxi d,128
- dad d ; hl->next record
- djnz profout ; repeat for all sectors
- ;
- lxi d,profile
- mvi c,16
- call cpm ; close file
- lxi h,proferr
- inr a
- jz .ERROR
- ; end of insertion
- JMP L0
- ; the profile work areas
- proferr: ; error message for make, write, close
- dbs 'Error writing A:PROFILE.DAT'
- profile: ; file control block: A:PROFILER.DAT
- db 1,'PROFILER','DAT',0,0,0,0
- dw 0,0,0,0,0,0,0,0
- db 0,0,0,0
- ; the following definitions have to be at the end of
- ; the program, following the last set of MAX/MINSTMT.
- IF MINSTMT
- pronums set MAXSTMT-MINSTMT+1 ; number of traced stmts
- ELSE
- pronums set 0
- ENDIF
- prosize set pronums*2 ; bytes of stmt buckets
- prorecs set prosize+6 ; allow for count, lo, hi
- prorecs set prorecs+127 ; round to logical sector
- prorecs set prorecs/128 ; number of logical sectors
- ;
- IF PRONUMS
- proclear dw prosize ; for clearing the array
- ELSE
- proclear set 2
- ENDIF
- profset dw -MINSTMT ; for addressing buckets
- pronio db prorecs ; for write-loop
- ;
- prodata equ $ ; start of profiler.dat
- promsb set pronums/256
- prolsb set promsb*256
- prolsb set pronums-prolsb
- db promsb,prolsb ; integer number of stmts
- promsb set MINSTMT/256
- prolsb set promsb*256
- prolsb set MINSTMT-prolsb
- db promsb,prolsb ; int. lowest stmt number
- promsb set MAXSTMT/256
- prolsb set promsb*256
- prolsb set MAXSTMT-prolsb
- db promsb,prolsb ; int. highest ditto
- proftab ds prosize ; statement buckets
- db 0 ; force .rel file to size
- ; end of insertion
- END .START
- ENDMAC
- EXTD: MACRO INTN,EXTN
- EXT EXTN
- INTN: equ EXTN
- ENDMAC
- SPSH: MACRO Q,SIZE
- IF SIZE
- IF SIZE&8000H
- LXI H,SIZE
- DAD S
- SPHL
- ELSE
- MVI A,SIZE
- CMP M
- JC .STRERR
- MOV B,A
- INR B
- PSHLP: SET $
- MOV D,M
- PUSH D
- INX S
- DCX H
- DJNZ PSHLP
- XRA A
- ENDIF
- ENDIF
- ENDMAC
- MLOAD: MACRO WHERE,VALUE
- IF VALUE
- IF VALUE&0FF00H
- LXI B,VALUE
- CALL WHERE!2
- ELSE
- MVI C,VALUE
- CALL WHERE!1
- ENDIF
- ELSE
- CALL WHERE
- ENDIF
- ENDMAC
- ILOD: MACRO Q,SIZE,OFST
- IF SIZE&8000H
- MLOAD .ILDV,OFST
- ELSE
- IF SIZE-1
- MLOAD .ILD2,OFST
- ELSE
- MLOAD .ILD1,OFST
- ENDIF
- ENDIF
- ENDMAC
- ISTR: MACRO Q,SIZE,OFST
- MLOAD .ISTR,OFST
- IF R
- JC .REFERR
- ENDIF
- ENDMAC
- LPOP: MACRO REG,DISTANCE
- IF DISTANCE
- PUSH H
- LXI H,DISTANCE+2
- DAD S
- MOV E,M
- INX H
- MOV D,M
- PUSH D
- MOV D,H
- MOV E,L
- DCX H
- DCX H
- LXI B,DISTANCE
- LDDR
- POP D
- POP H
- POP B
- ELSE
- POP D
- ENDIF
- ENDMAC
- LPUSH: MACRO REG,SIZE
- IF SIZE-2
- PUSH REG
- LXI H,0
- DAD S
- XCHG
- LXI H,-2
- DAD S
- SPHL
- XCHG
- LXI B,SIZE+2
- LDIR
- POP D
- LXI H,SIZE
- DAD S
- MOV M,E
- INX H
- MOV M,D
- ELSE
- IF 'REG'-'H'
- XCHG
- ENDIF
- XTHL
- PUSH H
- ENDIF
- ENDMAC
- ADDR: MACRO Q
- TEMP SET 'Q'-'IY'
- IF 'Q'-'Y'*TEMP
- CALL .XADDR
- ELSE
- CALL .YADDR
- ENDIF
- ENDMAC
- MIDL: MACRO REG,LEVEL
- PUSH X
- MVI A,LEVEL
- MIDL1: SET $
- MOV C,4(X)
- MOV B,5(X)
- PUSH B
- POP X
- CMP 1(X)
- JRNZ MIDL1
- XRA A
- ENDMAC
- DSUB: MACRO Q,SIZE
- IF 0!SIZE&8000H
- CALL .FSUB
- IF F
- JC .FLTERR
- ENDIF
- ELSE
- XRA A
- DSBC Q D
- ENDIF
- ENDMAC
- DADD MACRO Q,SIZE
- IF 0!SIZE&8000H
- CALL .FADD
- IF F
- JC .FLTERR
- ENDIF
- ELSE
- IF 'Q'-'C'
- DAD Q D
- ELSE
- IF M
- XRA A
- DADC H
- JV .MLTERR
- ELSE
- DAD H
- ENDIF
- ENDIF
- ENDIF
- ENDMAC
- ENTR: MACRO Q,LVL,VSIZ
- IF LVL-1
- MVI B,LVL
- LXI D,1-VSIZ
- IF S
- CALL .ENTRSC
- ELSE
- CALL .ENTER
- ENDIF
- ELSE
- LXI H,1-VSIZ
- DAD S
- SPHL
- .CHIN$:
- EXX
- LXI H,.LAST
- EXX
- LXI H,-MARGIN
- DAD S
- LXI D,.LAST
- DSUB D
- JC .STKERR
- ENDIF
- ENDMAC
- EXIT: MACRO Q,SSIZ
- LXI H,SSIZ+8
- JMP .EXITF
- ENDMAC
- L98: DAD D
- DAD D
- MOV E,M
- INX H
- MOV D,M
- XCHG
- PCHL
- EQUL: MACRO Q,SIZE1,SIZE2
- IF 'Q'-'S'
- IF SIZE1
- IF SIZE1&8000H
- CALL .FPEQ
- ELSE
- LXI B,SIZE1
- CALL .SEQUL
- ENDIF
- ENDIF
- ELSE
- LXI B,255*SIZE1-257+SIZE1+SIZE2
- CALL .STREQL
- ENDIF
- ENDMAC
- NEQL: MACRO Q,SIZE1,SIZE2
- IF 'Q'-'S'
- IF SIZE1
- IF SIZE1&8000H
- CALL .FPNEQ
- ELSE
- LXI B,SIZE1
- CALL .SNE
- ENDIF
- ENDIF
- ELSE
- LXI B,255*SIZE1-257+SIZE1+SIZE2
- CALL .STRNQL
- ENDIF
- ENDMAC
- LE: MACRO Q,SIZE1,SIZE2
- IF 'Q'-'S'
- IF SIZE1
- IF SIZE1&8000H
- CALL .FPLTE
- ELSE
- LXI B,SIZE1
- CALL .SLE
- ENDIF
- ELSE
- CALL .ILE
- ENDIF
- ELSE
- LXI B,255*SIZE1-257+SIZE1+SIZE2
- CALL .STRLEQ
- ENDIF
- ENDMAC
- LESS: MACRO Q,SIZE1,SIZE2
- IF 'Q'-'S'
- IF SIZE1
- IF SIZE1&8000H
- CALL .FPLT
- ELSE
- LXI B,SIZE1
- CALL .SLT
- ENDIF
- ELSE
- CALL .ILT
- ENDIF
- ELSE
- LXI B,255*SIZE1-257+SIZE1+SIZE2
- CALL .STRLSS
- ENDIF
- ENDMAC
- GE: MACRO Q,SIZE1,SIZE2
- IF 'Q'-'S'
- IF SIZE1
- IF SIZE1&8000H
- CALL .FPGTE
- ELSE
- LXI B,SIZE1
- CALL .SGE
- ENDIF
- ELSE
- CALL .IGE
- ENDIF
- ELSE
- LXI B,255*SIZE1-257+SIZE1+SIZE2
- CALL .STRGEQ
- ENDIF
- ENDMAC
- GRET: MACRO Q,SIZE1,SIZE2
- IF 'Q'-'S'
- IF SIZE1
- IF SIZE1&8000H
- CALL .FPGT
- ELSE
- LXI B,SIZE1
- CALL .SGT
- ENDIF
- ELSE
- CALL .IGT
- ENDIF
- ELSE
- LXI B,255*SIZE1-257+SIZE1+SIZE2
- CALL .STRGRT
- ENDIF
- ENDMAC
- FDVD: MACRO Q,SIZE
- CALL .FDIVD
- IF F
- JC .DIVERR
- ENDIF
- ENDMAC
- MULT: MACRO Q,SIZE
- IF 0!SIZE&8000H
- CALL .FMULT
- IF F
- JC .MLTERR
- ENDIF
- ELSE
- IF M
- CALL .IMULT
- ELSE
- CALL .QMULT
- ENDIF
- ENDIF
- ENDMAC
- DIVD: MACRO
- IF M
- CALL .IDIVD
- ELSE
- CALL .NCDVD
- ENDIF
- ENDMAC
- MMOD: MACRO
- IF M
- CALL .IMOD
- ELSE
- CALL .NCMOD
- ENDIF
- ENDMAC
- NEGT: MACRO REG
- IF 'REG'-'H'
- IF 'REG'-'D'
- POP H
- POP D
- MVI A,80H
- XRA E
- MOV E,A
- PUSH D
- PUSH H
- ELSE
- MOV A,E
- CMA
- MOV E,A
- MOV A,REG
- CMA
- MOV REG,A
- INX REG
- ENDIF
- ELSE
- MOV A,L
- CMA
- MOV L,A
- MOV A,REG
- CMA
- MOV REG,A
- INX REG
- ENDIF
- XRA A
- ENDMAC
- CTRL: MACRO Q,X
- STMT M,X
- IF C
- CALL .CSTS
- JRZ $+16
- CALL .CI
- CPI 'C'&3FH
- JZ .ERROR
- MVI C,7
- CALL .CO
- XRA A
- ENDIF
- ENDMAC
- RCHK: MACRO REG,LBND,HBND
- LXI B,LBND
- IF 'REG'-'H'
- IF 'REG'-'S'
- PUSH H
- LXI H,HBND
- CALL .CHKDE
- POP H
- ELSE
- MVI A,LBND
- CMP M
- JC .STRERR
- XRA A
- ENDIF
- ELSE
- PUSH D
- LXI D,HBND
- CALL .CHKHL
- POP D
- ENDIF
- ENDMAC
- STMT: MACRO Q,NUMBER
- IF T+E
- VALID SET 0FFFFH
- EXX
- LXI B,NUMBER
- IF T
- IF NOT FIRSTMT
- MINSTMT SET NUMBER
- FIRSTMT SET 0FFFFH
- ENDIF ; FIRST STMT
- MAXSTMT SET NUMBER
- IF 'M'-'Q'
- call .profinc
- ENDIF ; Q IS D
- ENDIF ; T TRUE
- EXX
- ELSE ; NEITHER T NOR E
- IF VALID
- EXX
- MOV B,A
- MOV C,A
- EXX
- VALID SET 00000H
- ENDIF ; VALID
- ENDIF ; T+E
- ENDMAC
- GLBP MACRO Q,OFFSET,SIZE
- PUSH Y
- POP B
- DAD B
- MOV B,M
- DCX H
- MOV L,M
- MOV H,B
- LXI B,OFFSET
- DAD B
- IF SIZE-1
- MOV B,M
- DCX H
- MOV L,M
- MOV H,B
- ELSE
- MOV L,M
- MOV H,A
- ENDIF
- ENDMAC
- IF NOT COMPILER
- .STRERR: LXI H,.STRMSG
- JR .PERROR
- .REFERR: LXI H,.REFMSG
- JR .PERROR
- .RNGERR: LXI H,.RNGMSG
- JR .PERROR
- ENDIF
- .HPERR: LXI H,.STKMSG
- JR .PERROR
- .FLTERR: LXI H,.FLTMSG
- JR .PERROR
- .STKERR: LXI H,.STKMSG
- JR .PERROR
- .DIVERR: LXI H,.OUMSG
- JR .PERROR
- .MLTERR LXI H,.MLTMSG
- .PERROR: CALL .TXTYP
- JMP .ERROR
- IF NOT COMPILER
- .STRMSG DB 'String too lon','g'+80H
- .REFMSG DB 'Call by reference precision erro','r'+80H
- .RNGMSG DB 'Index or value out of rang','e'+80H
- ENDIF
- .OUMSG DB 'Attempted divide by zer','o'+80H
- .MLTMSG IF COMPILER
- DB 'Too many error','s'+80H
- ELSE
- DB 'Multiply overflo','w'+80H
- ENDIF
- .STKMSG IF COMPILER
- DB 'Program too comple','x'+80H
- ELSE
- DB 'Stack overflo','w'+80H
- ENDIF
- .FLTMSG DB 'Floating point overflow/underflo','w'+80H
- .STMTMSG DB ' -- statement',' '+80H
- .CRLF DB CR,LF+80H
- CSET: MACRO Q,OFF
- IF OFF
- IF OFF-1
- CALL .RCSET
- ELSE
- CALL .CONSET
- ENDIF
- ELSE
- MVI B,16
- LXI H,0
- CSETCL: SET $
- PUSH H
- DJNZ CSETCL
- ENDIF
- ENDMAC
- UNIN: MACRO Q,OFFSET,OFF1
- CALL .UNION
- ENDMAC
- MEMB: MACRO Q,OFFSET,OFF2
- CALL .INN
- ENDMAC
- INCL: MACRO Q,OFFSET,OFF1
- CALL .LTEQ
- ENDMAC
- SBST: MACRO Q,OFFSET,OFF1
- CALL .GTEQ
- ENDMAC
- INTR: MACRO Q,OFFSET,OFF1
- CALL .INSECT
- ENDMAC
- DIFF: MACRO Q,OFFSET,OFF1
- CALL .ORGAN
- ENDMAC
- MTCH: MACRO Q,OFFSET,OFF1
- CALL .COMP
- ENDMAC
- NOMT: MACRO Q,OFFSET,OFF1
- CALL .FUSS
- ENDMAC
- xcfp: macro
- pop d
- pop h
- pop b
- xthl
- push d
- push h
- push b
- endmac
- cvtf: macro where,value
- if 'A'-'where'
- if 'B'-'where'
- if 'C'-'where'
- if 'D'-'where'
- if 'H'-'where'
- if value-4
- mov a,l
- pop b
- pop d
- pop h
- mov h,a
- push h
- push d
- push b
- xra a
- call .fout
- dcx s
- lxi h,14
- dad s
- push h
- call .fxdcvt
- else
- call .fout
- dcx s
- lxi h,0
- dad s
- xchg
- lxi h,1
- dad d
- lxi b,14
- ldir
- dcx h
- mvi m,14
- endif
- else
- call .cvtflt
- endif
- else
- xchg
- call .cvtflt
- endif
- else
- pop b
- pop d
- pop h
- push d
- push b
- call .cvtflt
- xcfp
- endif
- else
- pop h
- call .cvtflt
- endif
- else
- lxi h,value
- call .cvtflt
- endif
- endmac
- dsb1 macro reg
- xra a
- dsbc reg d
- endmac
- cmpi macro q,value
- cpi value
- endmac
-
- svln: macro
- mov a,m
- exx
- mov e,a
- xra a
- exx
- dcx h
- endmac
-
- gtln: macro reg,size
- exx
- mov a,e
- exx
- mov c,a
- xra a
- mov b,a
- lxi h,size
- dsub b
- dad s
- mvi m,cr
- endmac
-