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