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