Compucolor.org – Virtual Media

Listing of file='VARL.SRC;01' on disk='vmedia/chip_53-sector.ccvf'

;
;	BASIC CROSS-REFERENCE PROGRAM  (C)1980 BY TOM HUDSON
;
CMPHD	EQU	344DH
BASTRT	EQU	32980
BAEND	EQU	32982
KBCHA	EQU	81FEH
OUTVEC	EQU	33265

	ORG	0E000H		;FOR 32K MACHINES. CHANGE ORG
				;   TO 0A000H FOR 16K.

BEGIN:	LDA	02		;SEE IF V6.78 OR V8.79
	CPI	37H
	JZ	BEGIN0		;IT'S V6.78

	;OVERLAY JMPS TO ROM ROUTINES FOR V8.79

	LXI	H,194EH		;V8.79 ADHLA
	SHLD	ADHLA+1
	LXI	H,1998H		;V8.79 MULHD
	SHLD	MULHD+1
	JMP	BEGIN0

	;JUMP TABLE TO ROM ROUTINES

ADHLA:	JMP	3518H
MULHD:	JMP	3562H

;HERE'S THE REAL BEGINNING

BEGIN0:	LXI	H,0		;GET FCS RETURN INFO
	DAD	SP
	SHLD	FCSSP
	MVI	A,0
	STA	TABCNT		;RESET TAB COUNTER
	STA	VARCNT		;RESET VAR COUNTER
	LXI	H,CLRCRT	;CLEAR SCREEN
	CALL	MYOS
	LXI	H,VARTBL
	LXI	D,1150

CLLOOP:	MVI	M,0		;CLEAR VARIABLE TABLE
	INX	H
	DCX	D
	MOV	A,E
	CPI	0
	JNZ	CLLOOP
	MOV	A,D
	CPI	0
	JNZ	CLLOOP

OUTMOD:	LXI	H,KBCHA		;GET OUTPUT MODE
	MVI	M,0		;( EITHER CRT OR PRINTER )
	LXI	H,OUTMSG
	CALL	MYOS

INLOOP:	LDA	KBCHA		;SCAN KEYBOARD FOR RESPONSE
	CPI	0
	JZ	INLOOP
	LDA	KBCHA
	CPI	80		;PRINTER?
	JZ	STOOUT		;YES!
	CPI	83		;SCREEN?
	JNZ	OUTMOD		;NO, SCAN AGAIN

STOOUT:	STA	OUTFLG		;STORE RESPONSE FOR LATER
	LXI	H,CLRCRT
	CALL	MYOS
	LHLD	BASTRT		;GET START ADDR OF BASIC PGM
	INX	H		;SKIP...
	INX	H		;PAST...
	INX	H		;FIRST...
	INX	H		;LINE#

SCAN:	MOV	A,M		;GET BYTE
	CPI	159
	JZ	GOTFN		;USER-DEFINED FUNCTION
	CPI	142
	JZ	SKIPREM		;REMARK
	CPI	34
	JZ	SKIPLIT		;LITERAL
	CPI	0
	JZ	SKLINE		;LINE#
	CPI	91
	JP	NEXTB		;SOMETHING BESIDES VARIABLE
	CPI	65
	JP	GOTVAR		;IT'S A VARIABLE!!!

NEXTB:	INX	H		;INC TO NEXT BYTE
	XCHG
	LHLD	BAEND
	XCHG
	MOV	A,D		;THIS COMPARES TO SEE IF
	CMP	H		;THE END OF THE PROGRAM
	JC	DUMP		;HAS BEEN REACHED.
	JNZ	SCAN
	MOV	A,E		;IF SO, IT GOES TO DUMP
	CMP	L		;THE VARIABLES.
	JC	DUMP		;IF NOT, IT GOES ON TO
	JMP	SCAN		;THE NEXT BYTE

SKLINE:	INX	H		;TO SKIP A LINE# IT IS
	INX	H		;NECESSARY TO SKIP 4
	INX	H		;BYTES BEFORE GOING TO
	INX	H		;THE
	JMP	NEXTB		;NEXT BYTE ROUTINE

SKIPREM:INX	H		;TO SKIP A REM YOU MUST
	MOV	A,M		;FIND THE END OF THE LINE
	CPI	0		;(BINARY 0), THEN
	JZ	SKLINE		;SKIP PAST THE LINE#
	JMP	SKIPREM

SKIPLIT:INX	H		;WHEN SKIPPING A LITERAL,
	MOV	A,M		;LOOK FOR END OF LINE (0)
	CPI	0		;OR...
	JZ	SKLINE
	CPI	34		;A 34 (")
	JNZ	SKIPLIT
	INX	H
	JMP	SCAN		;SCAN AGAIN WHEN DONE

GOTFN:	MVI	A,1		;USER-DEFINED FUNCTIONS ARE
	STA	FUN		;HANDLED HERE.  SET FLAG,
	INX	H		;AND GO TO NEXT BYTE TO LOOK
	MOV	A,M		;AT FUNCTION NAME

GOTVAR:	STA	B1		;STORE FIRST CHAR IN VAR NAME
	MVI	A,0		;RESET...
	STA	STR		;STRING FLAG AND...
	STA	ARR		;ARRAY FLAG
	MVI	A,47		;PUT '/' IN 2ND CHAR SO SINGLE
	STA	B2		;CHAR VAR WILL INDEX INTO ARRAY
	INX	H
	MOV	A,M
	CPI	0		;END OF LINE?
	JZ	ENDVAR		;YES, END OF VAR
	CPI	91		;IS IT 'Z' OR LESS?
	JP	ENDVAR		;NO, END OF VAR
	CPI	65		;IS IT BETWEEN 'A' AND 'Z'?
	JP	STORIT		;YES! IT'S A 2-CHAR+ VARIABLE
	CPI	58		;IS IT '9' OR LESS?
	JP	ENDVAR		;NO, AND OF VAR
	CPI	48		;IS IS BETWEEN '0' AND '9'?
	JM	CKSTAR		;NO, SEE IF STRING OR ARRAY

STORIT:	STA	B2		;STORE 2ND CHAR OF VARIABLE
VARLOOP:INX	H		;THIS ROUTINE SKIPS PAST
	MOV	A,M		;THE REST OF A VARIABLE IF IT
	CPI	0		;IS MORE THAN 2 CHARACTERS
	JZ	ENDVAR		;AND ALSO LOCATES STRING
	CPI	91		;VARIABLES AND ARRAYS
	JP	ENDVAR
	CPI	65
	JP	VARLOOP
	CPI	58
	JP	ENDVAR
	CPI	48
	JP	VARLOOP

CKSTAR:	CPI	'$'		;IS IT A STRING?
	JNZ	CKSTAR2		;NO, SEE IF IT'S ARRAY
	MVI	A,1		;YES...
	STA	STR		;SET STRING FLAG
	INX	H		;GO TO NEXT BYTE
	MOV	A,M

CKSTAR2:CPI	'('		;IS IT AN ARRAY?
	JNZ	ENDVAR		;NO, END OF VARIABLE SEARCH
	MVI	A,1		;YES...
	STA	ARR		;SET ARRAY FLAG
	INX	H		;NEXT BYTE

ENDVAR:	SHLD	HOLD1		;SAVE LOCATION IN PROGRAM
	CALL	VARSTO		;AND STORE VARIABLE IN TABLE
	LHLD	HOLD1		;GET LOCATION BACK...
	JMP	SCAN		;AND CONTINUE SCANNING!
;
;	PLACE VARIABLE INTO TABLE
;	VAR NAME IN B1 AND B2
;	STR = 1 FOR STRING, ARR = 1 FOR ARRAY
;

VARSTO:	LDA	B1		;THIS PERFORMS THE FUNCTION OF
	SUI	65		;INDEXING INTO THE TABLE BASED
	MVI	H,0		;ON THE FIRST 2 CHARACTERS OF
	MOV	L,A		;THE VARIABLE NAME.
	LXI	D,44		;THE FORMULA IS [TABLE BASE] +
	CALL	MULHD		; (([B1]-65) * 44) + ([B2]-47)
	LDA	B2
	SUI	47
	CALL	ADHLA
	XCHG
	LXI	H,VARTBL
	DAD	D
	LDA	FUN		;GET USER FUNCTION FLAG
	CPI	1		;IS VARIABLE A FN?
	JNZ	NOFUN		;NO
	MVI	A,16		;IT IS, SET BIT 5 OF TABLE BYTE
	ORA	M
	MOV	M,A
NOFUN:	LDA	STR		;GET STRING FLAG
	MOV	D,A
	LDA	ARR		;AND ARRAY FLAG
	ADD	D
	CPI	2		;ARE THEY BOTH ON?
	JNZ	CKSTR		;NO, SEE IF STRING
	MVI	A,1		;BOTH ON, IT'S A STRING ARRAY
	ORA	M		;SET BIT 1 OF TABLE BYTE
	MOV	M,A
	JMP	EXIT		;DONE!

CKSTR:	LDA	STR		;GET STRING FLAG
	CPI	1		;IS IT A STRING?
	JZ	SETSTR		;YES, GO PROCESS IT
	LDA	ARR		;GET ARRAY FLAG
	CPI	1		;IS IT AN ARRAY?
	JZ	SETARR		;YES, PROCESS IT
	MVI	A,8		;AT THIS POINT YOU KNOW THE
	ORA	M		;VARIABLE IS NORMAL
	MOV	M,A
	JMP	EXIT		;DONE!

SETSTR:	MVI	A,4		;SET BIT 3 (STRING)
	ORA	M
	MOV	M,A
	JMP	EXIT		;DONE!

SETARR:	MVI	A,2		;SET BIT 2 (ARRAY)
	ORA	M
	MOV	M,A
EXIT:	MVI	A,0
	STA	FUN		;RESET USER FUNCTION FLAG
	RET

;
;	THIS ROUTINE DUMPS THE TABLE AT THE END OF THE
;	PROGRAM
;

DUMP:	LDA	OUTFLG		;GET OUTPUT TYPE
	CPI	83		;TO SCREEN?
	JZ	NOPRT		;NO, GO CONTINUE
	MVI	A,14		;SET FLAG FOR PRINTER OUTPUT
	STA	OUTVEC
NOPRT:	LXI	H,TITLE		;PRINT TITLE
	CALL	MYOS
	LXI	H,VARTBL	;POINT TO VARIABLE TABLE
	MVI	B,65		;START AT 'A' \ THIS STARTS AT
	MVI	C,47		;START AT '/' / VARIABLE 'A '
DUMP1:	MOV	A,M		;GET VARIABLE BYTE FROM TABLE
	CPI	0		;WAS VARIABLE USED?
	JNZ	DUMP2		;YES, GO PROCESS DUMP
NEXTDMP:INR	C		;INCREMENT TO NEXT VARIABLE
	INX	H
	MOV	A,C
	CPI	91
	JM	DUMP1
	MVI	C,47
	INR	B
	MOV	A,B
	CPI	91
	JP	DONE
	JMP	DUMP1
DUMP2:	MOV	A,B		;MOVE VAR. CHAR 1 TO...
	STA	P1		;P1 (PRINT FIELD 1)
	MOV	A,C		;MOVE VAR. CHAR 2 TO...
	STA	P2		;P2 (PRINT FIELD 2)
	MOV	A,M
	ANI	16		;IS VARIABLE USED AS 'FN'?
	CPI	0
	JZ	DUMP2A		;NO, GO CHECK FOR NORM. VAR
	MVI	A,'F'		;YES, MOVE 'F' TO...
	STA	P0		;PRINT FIELD 0 AND...
	CALL	PRINT		;PRINT THE VARIABLE
DUMP2A:	MOV	A,M		;RESTORE BYTE
	ANI	8		;IS VARIABLE USED AS NORM?
	CPI	0
	JZ	DUMP3		;NO, CHECK FOR STRING
	CALL	PRINT		;YES, PRINT THE VARIABLE
DUMP3:	MOV	A,M		;RESTORE BYTE
	ANI	4		;IS VARIABLE USED AS STRING?
	JZ	DUMP4		;NO, CHECK FOR ARRAY
	MVI	A,'$'		;YES, MOVE '$' TO...
	STA	P3		;PRINT FIELD 3 AND...
	CALL	PRINT		;PRINT THE VARIABLE

DUMP4:	MOV	A,M		;RESTORE BYTE
	ANI	2		;IS VAR USED FOR ARRAY?
	JZ	DUMP5		;NO, GO SEE IF IT'S $(
	MVI	A,'('		;YES, MOVE '(' TO...
	STA	P4		;PRINT FIELD 4 AND...
	CALL	PRINT		;PRINT THE VARIABLE

DUMP5:	MOV	A,M		;RESTORE THE BYTE
	ANI	1		;IS VAR USED FOR STRING ARRAY?
	JZ	NEXTDMP		;NO, GO TO NEXT VARIABLE
	MVI	A,'$'		;YES MOVE IN '$' TO...
	STA	P3		;PRINT FIELD 3 AND...
	MVI	A,'('		;MOVE '(' TO...
	STA	P4		;PRINT FIELD 4,
	CALL	PRINT		;PRINT THE VARIABLE
	JMP	NEXTDMP		;FINISHED --- DO NEXT VARIABLE

DONE:	LXI	H,DUNMSG	;PRINT END MESSAGE
	CALL	MYOS
	MVI	A,0
	STA	OUTVEC		;BACK TO CRT
	MVI	B,0		;RESTORE...
	LHLD	FCSSP		;FCS STACK POINTER...
	SPHL			;AND...
	RET			;BACK TO FCS>

;	THE FOLLOWING ROUTINE CHECKS THE PRINT FIELDS P0-P4
;	AND PRINTS THEM IF NECESSARY.  IT ALSO SENDS SPACES
;	INSTEAD OF TABS FOR DUMB PRINTERS

PRINT:	SHLD	HOLD2		;SAVE TABLE PTR
	LDA	P0
	CPI	'F'		;IS 'FN' PRESENT?
	JNZ	PRINT1		;NO, CHECK FOR OTHERS
	LXI	H,P0
	CALL	MYOS		;PRINT P0
	LDA	TABCNT
	ADI	3		;ADD 3 TO TAB COUNT
	STA	TABCNT
PRINT1:	LXI	H,P1
	CALL	MYOS		;PRINT 1ST CHAR OF VARIABLE
	LDA	TABCNT
	ADI	1		;ADD 1 TO TAB COUNT
	STA	TABCNT
	LDA	P2
	CPI	48		;IS THERE MORE TO VAR NAME?
	JM	PRINT2		;NO, LOOK FOR $ AND ( )
	LXI	H,P2
	CALL	MYOS		;YES, PRINT 2ND CHAR
	LDA	TABCNT
	ADI	1		;ADD 1 TO TAB COUNT
	STA	TABCNT
PRINT2:	LDA	P3
	CPI	'$'		;IS THIS A STRING?
	JNZ	PRINT3		;NO, LOOK FOR ARRAY
	LXI	H,P3
	CALL	MYOS
	LDA	TABCNT
	ADI	1		;ADD 1 TO TAB COUNT
	STA	TABCNT
PRINT3:	LDA	P4
	CPI	'('		;IS IT AN ARRAY?
	JNZ	DONEPRT		;NO, WE'RE FINISHED
	LXI	H,P4
	CALL	MYOS
	LDA	TABCNT
	ADI	3		;ADD 3 TO TAB COUNT
	STA	TABCNT
DONEPRT:LDA	VARCNT		;THIS SECTION EXPANDS FOR TABS
	ADI	1
	CPI	8
	JNZ	TAB
	MVI	A,0
	STA	VARCNT
	LXI	H,CRLF
	CALL	MYOS
	JMP	EXITPRT
TAB:	STA	VARCNT
TABLOOP:LDA	TABCNT
	CPI	8
	JZ	EXITPRT
	ADI	1
	STA	TABCNT
	LXI	H,PSPAC
	CALL	MYOS
	JMP	TABLOOP
EXITPRT:MVI	A,0		;RESET PRINT AREAS
	STA	P0
	STA	P3
	STA	P4
	STA	TABCNT
	LHLD	HOLD2		;RESTORE TABLE PTR
	RET
MYOS:	MOV	A,M
	INX	H
	CPI	239
	RZ
	CALL	BASOUT
	JMP	MYOS

;********************** DATA AREAS ***************************

BASOUT	EQU	0033H

FCSSP:	DS	2
HOLD1:	DS	2
HOLD2:	DS	2
FUN:	DB	0
STR:	DB	0
ARR:	DB	0
B1:	DS	1
B2:	DS	1
P0:	DS	1
	DB	78,32,239
P1:	DS	1
	DB	239
P2:	DB	0
	DB	239
P3:	DB	0
	DB	239
P4:	DB	0
	DB	32,41,239
TABCNT:	DS	1
VARCNT:	DS	1
OUTFLG:	DS	1
PRTST:	DB	27,13,239
PSPAC:	DB	32,239
CRLF:	DB	13,10,239
DUNMSG:	DB	13,10,17,'*** END OF REPORT ***',10,10,18,239
TITLE:	DB	23,'------------------- ',17
	DB	'BASIC ',22,'VARIABLE LISTING ',23
	DB	'-------------------',13,10,10,239
OUTMSG:	DB	3,0,5,11,6,6,'DO YOU WANT REPORT TO GO TO '
	DB	6,1,'P',6,6,'RINTER OR ',6,1,'S',6,6,'CREEN? '
	DB	239
CLRCRT:	DB	6,6,12,239
VARTBL:	DS	1150
	END	BEGIN