Listing of file='XREF.SRC;01' on disk='vmedia/source_1-sector.ccvf'
; ASSEMBLY CROSS REFERENCE GENERATOR ; ; ; JAMES L HELMS ; ; ; ORIGINAL: 10 JAN 82 V1.0 ; MODIFIED: 30 MAR 82 V3.82 ; MODIFIED: 02 MAY 82 V5.82 ; ; ; ; PUBLIC DOMAIN MATERIAL - NON-COPYRIGHTABLE ; ; FOR USE AND DISTRIBUTION AT WILL ; ; ; ; SYSTEM EQUATES ; ; DFUN EQU 80F2H ;DEFAULT UNIT (ASCII) INPCRT EQU 81C5H ;JUMP VECTOR NO. 31 KBDFL EQU 81DFH ;KYBD FLAG READY EQU 81FFH ;KYBD STATUS KBCHA EQU 81FEH ;KYBD CHAR UVEC EQU 81BFH ;"ESC USER" VECTOR (SAME AS "ESCCRT") COLOR EQU 81CFH ;CCI COLOR CODE (SAME AS "VFILL"+1) XPOS EQU 81CBH ;X POSITION (SAME AS "VCRAD") YPOS EQU 81CCH ;Y POSITION (SAME AS "VCRAD"+1) ; FILE PARAMETER BLOCK LAYOUT FOPT EQU 0 ;OPEN CODE (0 OLD, 1 NEW) FATR EQU 1 ;ATTRIBUTE FNAM EQU 2 ;NAME FTYP EQU 8 ;EXTENSION FVER EQU 11 ;VERSION FSBK EQU 12 ;START BLOCK FSIZ EQU 14 ;SIZE FLBC EQU 16 ;LBC FLAD EQU 17 ;LOAD ADDR FSAD EQU 19 ;START/SAVE ADDR FSPR EQU 21 ;SPARE FDBK EQU 22 ;DIRECTORY BLOCK FDEN EQU 23 ;DIRECTORY ENTRY FAUX EQU 24 FHAN EQU 26 ;HANDLER ADDR FFCN EQU 28 ;FUNCTION CONTROL NUMBER FDRV EQU 29 ;DRIVE FBLK EQU 30 ;DISK BLOCK NUMBER FBUF EQU 32 ;BUFFER ADDRESS FXBC EQU 34 ;BUFFER SIZE FPTR EQU 36 ; ; EITHER OF THESE ORIGINS WILL PROVIDE SUFFICIENT BUFFER ; SPACE FOR 997 JMP/CALL CROSS REFERENCE ADDRESSES TO BE ; GENERATED. THIS IS JUST BARELY ENOUGH TO COVER THE ; V8.79 INTERPRETER IN ONE PASS. ; ; ; USE THE 4000H ORIGIN FOR FCS, INTERPRETER, OR .PRG ; PROGRAMS LOADING AT 9600H OR HIGHER - NOTE - SYSTEM ; MUST SUPPORT RAM AT 4000H THROUGH 5FFFH!! ; ; USE THE 8200H ORIGIN FOR FCS, INTERPRETER, OR .PRG ; PROGRAMS LOADING AT 9B00H OR HIGHER. ; ; USE THE D700H ORIGIN FOR FCS, INTERPRETER, OR .PRG ; PROGRAMS LOADING AT 8200H W/ TOP OF PROGRAM BELOW D700H ; ; ; PROGRAM TO BE CROSS REFERENCED MUST BY RESIDING IN ; MEMORY PRIOR TO EXECUTING THIS PROGRAM. THIS MAY BE ; ACCOMPLISHED BY ENTERING FCS AND EXECUTING COMMAND ; "LOA FILENAME.PRG". ; ; ; THIS PROGRAM CAN NOT DISTINGUISH BETWEEN OP CODES AND ; DB (DATA BYTE) OR DW (DATA WORD) ENTRIES. THEREFORE, ; SOME LISTINGS GENERATED MAY BE AMBIGUOUS AND WILL HAVE ; TO BE WEEDED OUT. ; ; ; "TBUF", THE BUFFER USED TO SAVE AND SORT THE CROSS ; REFERENCE ADDRESSES, IS CONSTRUCTED AS FOLLOWS: ; ; BYTE 1 THE JMP/CALL INSTRUCTION (OP CODE) ; VALUE LESS 192. ; BYTE 2-3 THE PC (PROGRAM COUNT) WHERE THE ; INSTRUCTION WAS FOUND, LO BYTE FIRST. ; BYTE 4-5 THE ADDRESS WHERE THE JMP/CALL INSTRUC- ; TION IS REFERENCING, LO BYTE FIRST. ; ; THIS REPEATS FOR N NUMBER OF JMP/CALLS FOUND, OR TOP ; OF MEMORY, WHICHEVER OCCURS FIRST. A ZERO (0) IS ; INSERTED AT BYTE 1 OF THE NEXT AVAILABLE ENTRY TO ; BE USED AS A TOP OF LISTING TERMINATOR. ; ; ; IF A CROSS REFERENCE OF THIS PROGRAM IS TO BE ; GENERATED, THEN USE START/END ADDRESSES AS FOLLOWS ; IN ORDER TO ELIMINATE MESSAGE/VARIABLE DATA: ; (THIS ASSUMES NO MODIFICATIONS MADE) ; ; ; ORG 4000 4000 TO 44D3 ; ORG 8200 8200 TO 86D3 ; ORG D700 D700 TO DBD3 ; ; ; ; THANKS AND CREDIT GOES GO CAPT. DeFRANCE CLARKE III ; FOR THE IDEA AND INSPIRATION, AND TO THE "FORUM" WHICH ; PUBLISHED HIS "BASIC" VERSION (NOV/DEC 1981, VOL 1 NO ; 5, PG 19). ; ; ; THIS PROGRAM SUPPORTS THE "ESCAPE-USER" RENTRY KEY. ; ; ; ORG 04000H ; ORG 08200H ; ORG 0D700H JMP SETUP ;ESC-T ENTRY - VALID ;FOR 8200H ORIGIN ONLY ; V6.78 CALL TABLE V678 EQU $ ADHLA: JMP 3518H ;HL<-HL+A CMPHD: JMP 344DH ;HL<=DE? CRLF: JMP 338BH ;CR/LF ERAS: JMP 2B8DH ;ERASE CRT ESCD: JMP 32C9H ;ESC'D' LO: JMP 3392H ;CHARACTER TO CRT MOVHD: JMP 3444H ;STRING HL<-DE LEN B MULHD: JMP 3562H ;HL=DE*HL NIBL: JMP 33B3H ;ASCII HEX->HEX OSTR: JMP 33F4H ;STRING TO CRT SUBHD: JMP 3459H ;HL=HL-DE WATL: JMP 3429H ;20 MS WAIT CLSEQO: JMP 3136H ;CLOSE OUTPUT FILE EMESS: JMP 262DH ;FCS ERROR MSG INSEQO: JMP 30E7H ;INIT NEW FILE OPEN: JMP 2DABH ;OPEN FILE PFSPC: JMP 3077H ;PARSE FILE SPEC PTBYT: JMP 324AH ;FILE<-BYTE RESET: JMP 26A5H ;RESET DRIVES RWSEQI: JMP 30C6H ;REWIND INPUT FILE BEGIN: DW 3768H LTAB EQU $-V678 ; START START: LXI SP,STACK ;SET STACK MVI B,LTAB ;TABLE LENGTH LXI D,V879 ;V8.79 TABLE LXI H,V678 ;V6.78 TABLE LDA 092AH ;TEST ROM CPI 1FH ;V8.79? CZ M879 ;YES-OVERLAY JZ SETUP ; & SKIP LXI D,V980 ;V9.80 TABLE CPI 37H ;V9.80? CZ M980 ;YES-OVERLAY ; SETUP SETUP: LXI SP,STACK ;RESET STACK LXI H,SETUP ;SET SHLD UVEC+1 ;"ESC USER" MVI A,0C3H STA UVEC ;JUMP INSTR MVI A,31 ;SET STA KBDFL ; NO-ECHO MVI A,0C9H ; KEYBOARD STA INPCRT LXI H,DSS ;CLEAR MVI A,DSE-DSS ; ALL CALL CLRM ; DATA ; INTRODUCTION LXI H,MSG01 ;INTRO MSG CALL OSTR INTRO: CALL INPUT ;USER RESPONSE CPI 10 JZ STOP ;ABORT CPI 13 JNZ INTRO ;WAIT CALL ERAS ;ERASE CRT ; PRESET LHLD 32940 ;TOP OF RAM LXI D,-6 ;LESS 6 DAD D SHLD SIZE ;RAM AVAIL TO USE LXI H,TBUF ;BUFFER SHLD TADR MVI M,0 ;SET TERMINATOR ; GET START ADDRESS GSA: LXI H,MSG02 ;START ADDR MSG LXI D,KBUF ;KYBD BUFFER LXI B,4 ;LENGTH CALL ESTC ;GET ADDRESS JZ HALT ;NO ENTRY MOV A,B ;4 DIGITS? CPI 4 JNZ GSA ;NO CALL DECH ;TO HEX JNC GSA ;NO ENTRY-DO AGAIN SHLD SAD ;SAVE START ADDRESS ; GET ENDING ADDRESS GEA: LXI H,MSG03 ;END ADDR MSG LXI D,KBUF LXI B,4 CALL ESTC JZ HALT ;NO ENTRY MOV A,B CPI 4 JNZ GEA ;<>4 DIGITS CALL DECH ;TO HEX JNC GEA ;NO ENTRY SHLD EAD ;SAVE END ADDR ; VALIDATE XCHG LHLD SAD CALL CMPHD ;START<END? JNC GSA ;NO-ILLEGAL! ; GET BOUNDARY LOW GBL: LXI H,MSG04 ;BOUNDARY LO MSG LXI D,KBUF LXI B,4 CALL ESTC JZ HALT ;NO ENTRY MOV A,B CPI 4 JNZ GBL ;<>4 DIGITS CALL DECH ;TO HEX JNC GBL ;NO ENTRY SHLD BCL ;SAVE BOUNDARY LOW ; GET BOUNDARY HIGH GBH: LXI H,MSG05 ;BOUNDARY HIGH MSG LXI D,KBUF LXI B,4 CALL ESTC JZ HALT ;NO ENTRY MOV A,B CPI 4 JNZ GBH ;<>4 DIGITS CALL DECH ;TO HEX JNC GBH ;NO ENTRY SHLD BCH ;SAVE BOUNDARY HIGH ; VALIDATE XCHG LHLD BCL CALL CMPHD ;LOW<HIGH? JNC GBL ;NO-ILLEGAL! ; CHECK IF FILE LXI H,MSG12 ;GENERATE FILE? CALL OSTR CIF: CALL INPUT ;GET RESPONSE MVI B,0 ;SET 0 CPI 'N' ;A "N"? JZ CIF1 ;DON'T WANT TO INR B ;SET 1 CPI 'Y' ;A "Y"? JNZ CIF ;NO-BAD ENTRY CIF1: CALL LO ;ECHO CALL CRLF ;CR/LF MOV A,B ;CHOICE ORA A ; TEST STA SF ; SAVED JZ PROG ;IF NO FILE ; PARSE FILE SPECS FILE: LXI B,TYPS ;.SRC TYPE LXI D,FPB1 ;FPB LXI H,NAME ;NAME CALL PFSPC ;PARSE JC ERROR ;IF ERROR ; OPEN FILE LXI H,FPB1 ;OUTPUT FPB MVI M,1 ;OPEN CODE CALL OPEN ;OPEN FILE JC ERROR ;IF ERROR ; INITIALIZE OUTPUT FILE LXI H,0 ;CLR SHLD FPB1+FLAD ; LOAD ADDR SHLD FPB1+FSAD ; SAVE ADDR LXI H,OBUF ;BUFFER SHLD FPB1+FBUF LXI H,768 ;SIZE SHLD FPB1+FXBC LXI H,FPB1 ;FPB CALL INSEQO ;INITIALIZE JNC PROG ; FILE ERROR ERROR: CALL EMESS ;ERROR MSG CALL CRLF XRA A ;TURN OFF STA SF ; FILE CONTROL ; PROGRAM LOOP PROG: LXI H,MSG06 ;SEARCHING CALL OSTR LHLD SAD ;START XCHG LHLD EAD ;END CALL SUBHD ;SIZE PUSH H POP B INX B ;COUNT+1 ;NOTE: BC REGISTERS MUST ;NOT BE DESTROYED FROM ;HERE TO "PRG6" ENTRY. LHLD SAD ;START ADDR OR "PC" ; (PROGRAM COUNT) PRG1: MOV A,M ;INSTR CALL VIC ;VALIDATE JNZ PRG3 ;<>JMP/CALL ; CHECK LOW BOUNDARY PUSH H ;SAVE PUSH H ; COUPLE PUSH H ; TIMES INX H ;PC+1 MOV E,M ;ADDR LO INX H ;PC+2 MOV D,M ;ADDR HI LHLD BCL ;LOW BOUNDARY XCHG CALL CMPHD XCHG JC PRG2 ;ADDR<LOW BOUNDARY ; CHECK HIGH BOUNDARY LHLD BCH ;HIGH BOUNDARY CALL CMPHD JC PRG2 ;ADDR>HIGH BOUNDARY ; SAVE INSTRUCTION POP D ;PC LHLD TADR ;TBUF ADDR LDAX D SUI 192 ;-OFFSET MOV M,A ;INSTR ; SAVE PROG COUNT (ADDRESS) (PC) INX H ;TBUF+1 MOV M,E ;PC LO INX H ;TBUF+2 MOV M,D ;PC HI ; SAVE JMP/CALL ADDRESS INX D ;PC+1 INX H ;TBUF+3 LDAX D MOV M,A ;JMP/CALL LO INX D ;PC+2 INX H ;TBUF+4 LDAX D MOV M,A ;JMP/CALL HI INX H ;TBUF+5 SHLD TADR ;SAVE NEXT ENTRY PUSH H POP D MVI M,0 ;TERMINATORS INX H MVI M,0 INX H MVI M,0 LHLD SIZE CALL CMPHD ;OUT OF MEM? JC PRG6 ;YES! ; PASS INSTR BYTES PRG2: POP H ;PC PRG3: LXI SP,STACK ;CLR STACK MOV A,M ;INSTR CODE PUSH H ;PC LXI H,BYTE ;OP CODE LEN TABLE CALL ADHLA ; + INSTR VALUE POINTS MOV A,M ; TO INSTR LENGTH POP H ;PC BACK DCR A JM PRG5 ;ILLEGAL JZ PRG5 ;1 BYTE DCR A JZ PRG4 ;2 BYTE ELSE ;3 BYTE ; 3 BYTE INSTR INX H ;PC+1 DCX B MOV A,B ORA C JZ PRG6 ;DONE ; 2 BYTE INSTR PRG4: INX H ;PC+1 DCX B MOV A,B ORA C JZ PRG6 ;DONE ; 1 BYTE INSTR PRG5: INX H ;PC+3 DCX B MOV A,B ORA C JNZ PRG1 ;MORE! ; DONE WITH SEARCH - NOW SEE IF ANY FOUND PRG6: LXI SP,STACK ;RESET STACK LDA TBUF ;BUFFER ORA A ;TEST JZ NONE ;NOTHING! ; SORT RESULTS BY CALLED ADDRESS LXI H,MSG07 ;SORTING CALL OSTR MVI A,4 STA PASS SORT: LXI H,TBUF-5 ;BUFFER-5 SHLD TADR ;SAVED ; SET NEXT BUFFER ENTRY ; AND CHECK IF DONE SRT1: LHLD TADR ;THIS BUFFER ADDR LXI D,5 ;ENTRY LENGTH DAD D SHLD TADR ;NEXT TBUF ENTRY MOV A,M ;1ST CHAR ORA A ;TEST JZ SRT3 ;IF END ; MATCH THEM INX H ;TBUF+1 INX H ;TBUF+2 INX H ;TBUF+3 MOV E,M ;#1 LO INX H ;TBUF+4 MOV D,M ;#1 HI INX H ;TBUF+5 (NEXT ENTRY) MOV A,M ;1ST CHAR NEXT ENTRY ORA A ;AT TOP OF LIST? JZ SRT3 ;IF YES THEN DONE INX H ;TBUF+6 INX H ;TBUF+7 INX H ;TBUF+8 MOV A,M ;#2 LO INX H ;TBUF+9 MOV H,M ;#2 HI MOV L,A CALL CMPHD ;#2=>#1? JNC SRT1 ;YES ; SWAP THEM LHLD TADR PUSH H POP D ;THIS TBUF ENTRY LXI B,5 DAD B ;NEXT TBUF ENTRY SRT2: LDAX D ;GET #1 MOV B,A ; & SAVE MOV A,M ;GET #2 STAX D ; & SAVE IT MOV M,B ;NOW SAVE #1 INX D ;1ST ENTRY +1 INX H ;2ND ENTRY +1 DCR C ;COUNT-1 JNZ SRT2 ;DO SOME MORE MVI A,4 ;SET THE STA PASS ; PASS COUNT JMP SRT1 ; AND REPEAT ; CHECK PASS COUNT ; MUST HAVE 4 GOOD PASSES ; TO SATISFY SORT ROUTINE SRT3: LXI H,PASS ;PASS COUNT DCR M ;-1 JNZ SORT ;IF <>0 ; PRINT THE LISTING LXI H,MSG08 ;LISTING CALL OSTR LXI H,0 ;CLR SHLD LADR ;LAST ADDR LXI H,TBUF ;SET SHLD TADR ;BUFFER MOV A,M STA CODE ;1ST INSTR ; GET CALLED ADDRESS ; COMPARE TO LAST ONE PRINT: CALL GREEN ;SET GREEN LHLD TADR ;BUFFER INX H ;TBUF+1 INX H ;TBUF+2 INX H ;TBUF+3 MOV E,M ;CALLED LO INX H ;TBUF+4 MOV D,M ;CALLED HI LHLD LADR ;LAST ADDR CALL CMPHD ;SAME? XCHG SHLD LADR ;NEW LAST ADDR CNZ PNUM ;<>SAME-PRINT ; CHECK X POS CALL CYAN ;SET CYAN PNT1: CALL STAB ;SEND TAB LDA XPOS ;CK X POSITION CPI 16 ;<16? JC PNT1 ;IF YES ; PRINT INSTRUCTION LXI H,TABLE ;INSTR TABLE LXI D,5 ;ENTRY LENGTH LDA CODE ;INSTR CODE PNT2: DAD D ;FIND THE DCR A ;RIGHT ONE JNZ PNT2 CALL SSTR ;PRINT IT ; PRINT PC LXI H,MSG11 ;"FROM" MSG CALL SSTR ; PRINTED LHLD TADR ;BUFFER INX H ;TBUF+1 MOV E,M ;PC LO INX H ;TBUF+2 MOV D,M ;PC HI XCHG CALL PNUM ;PRINT PC CALL PCRS ;CR/LF ; NEXT ENTRY LHLD TADR ;BUFFER LXI B,5 ;ENTRY LEN DAD B SHLD TADR ;NEXT ENTRY MOV A,M ;1ST CHAR STA CODE ;SAVED ORA A ;TEST JZ QUIT ;IF END CALL PAUSE ;"ATTN BREAK"? JZ HALT ;YES-AND ABORT MVI A,10 ;DO A CALL WATL ; 200 MS WAIT JMP PRINT ;CONTINUE ; NOTHING FOUND NONE: LXI H,MSG09 ;NOTHING MSG CALL OSTR JMP QUIT ; QUIT STOP: CALL ERAS ;ERASE CRT QUIT: CALL PCRS2 ;2 CR/LF'S LXI H,33209 ;CLOCK MVI M,0 MVI A,3 TIME: CMP M JNZ TIME ;WAIT 3 SECS HALT: CALL PCRS ;1 CR/LF LDA SF ;FILE ORA A ; GENERATED? LXI H,FPB1 CNZ CLSEQO ;CLOSE IF YES LXI SP,8042H ;RESET STACK ;ISC 3650 MAY ;USE 8044H HERE LXI D,KBDFL ;RESET LHLD BEGIN ; KEYBOARD XCHG PUSH D JMP ESCD ;TO FCS ;=======SUBROUTINES ; PAUSE ; ; THIS IS AN IMPROVED VARIATION OF LDA READY/CPI 50H ; AN WILL WORK DURING FCS AND PRINTER OPERATIONS ; WHEN THE PREVIOUS ONE WON'T. ; ; STATUS: < Z> ATTN BREAK ; <NZ> NONE PAUSE: MVI A,0FH OUT 7 IN 1 ANI 10H RNZ ; CONTINUE OPTION ; STATUS: < Z> 'N' REPLY (ABORT) ; <NZ> 'Y' REPLY (CONTINUE) CONTIN: LXI H,MSG10 ;CONTINUE MSG CALL OSTR CONT1: CALL INPUT CPI 'N' JZ CONT2 ;ABORT CPI 'Y' JNZ CONT1 ;ERROR ORA A ;SET <NZ> CONT2: CALL LO ;ECHO CALL CRLF CALL CRLF RET ; ENTER STRING DATA W/ CRLF ; INPUT: B DON'T CARE ; C MAX COUNT ALLOWED ; DE BUFFER ; HL MESSAGE ; OUTPUT: B LENGTH ENTERED ; HL PAST LAST CHAR STORED ; STATUS: < Z> NO ENTRY ; <NZ> STRING ENTERED ; COMMANDS: EL,BS,SF,CR ESTC: CALL EST CALL CRLF RET ; ENTER STRING DATA ; USES COUNT DOWN METHOD EST: PUSH B ;COUNT SAVED PUSH D ;BUFFER SAVED CALL OSTR ;PRINT MSG POP H ;BUFFER UP POP B ;COUNT UP EST0: MOV A,C ;COPY COUNT INR A ;+1 CALL CLRM ;CLR BUFFER MOV B,C ;COPY COUNT ; ERASE LINE ENTRY EST1: CALL EST8 ;ANY COUNT? JZ EST3 ;NO-SKIP CALL EST10 ;BACKUP JMP EST1 ;AGAIN ; ENTER CHARACTER/VALIDATE EST2: CALL EST9 ;BACKSPACE EST3: CALL INPUT ;GET CHAR CPI 11 JZ EST1 ;ERASE LINE CPI 13 JZ EST6 ;DONE CPI 25 JZ EST4 ;MOVE RIGHT CPI 26 JZ EST2 ;BACKSPACE CALL CCHB ;LET/NUM? JNC EST3 ;NO! ; CHECK COUNT/SAVE CHAR MOV D,A ;SAVE CHAR MOV A,B ;REMAINING ORA A ; COUNT? JZ EST3 ;NO-IGNORE MOV M,D ;SAVE CHAR AND ;FALL THROUGH ; MOVE RIGHT EST4: CALL CCHA ;CHAR? JNC EST3 ;NO! ; ECHO/ADJUST COUNT CALL LO ;ECHO INX H ;BUFFER+1 DCR B ;COUNT-1 JMP EST3 ;NEXT CHAR ; SET CHAR COUNT ; STATUS: < Z> NO ENTRY ; <NZ> ENTRY EST6: CALL EST8 ;CHAR COUNT MOV B,A ;=ENTERED MVI M,0 ;TERMINATOR RET ; CHECK CHAR COUNT ; STATUS: < Z> NO ENTRY ; <NZ> ENTRY EST8: MOV A,C SUB B RET ; BACKSPACE - ADJUST COUNT/BUFFER EST9: CALL EST8 ;ANY COUNT? RZ ;NO-IGNORE EST10: INR B ;COUNT+1 DCX H ;BUFFER-1 PUSH B PUSH H LXI H,DLC ;DELETE CALL OSTR ;LAST CHAR POP H POP B RET ; NO-ECHO KEYBOARD ; OUTPUT: A KYBD CHAR INPUT: CALL CLEAR ;CLEAR KYBD INPT1: LDA READY ;KYBD FLAG ORA A ;TEST JZ INPT1 ;LOOP XRA A STA READY LDA KBCHA ;KYBD CHAR RET ; CLEAR KYBD CLEAR: XRA A STA READY STA KBCHA RET ; CHARACTER CHECK ; INPUT: HL BUFFER ; STATUS: < C> VALID ; <NC> INVALID CCHA: MOV A,M ;GET IT CCHB: CPI 'z'+1 ;>'z'? RNC ;YES CPI ' ' ;<' '? CMC RET ; MOVE 0 TO M UNTIL A = 0 ; STATUS: HL RETAINED ; A ZERO ; <Z> FORCED CLRM: PUSH H CLR1: MVI M,0 ;M<-0 INX H ;ADDR+1 DCR A ;COUNT-1 JNZ CLR1 ;AGAIN POP H RET ; VALIDATE INSTRUCTION CODE ; STATUS: < Z> JMP/CALL INSTR ; <NZ> <>JMP/CALL VIC: CPI 194 RC ;NO GOOD SUI 194 RZ ;JNZ DCR A RZ ;JMP DCR A RZ ;CNZ SUI 6 RZ ;JZ SUI 2 RZ ;CZ DCR A RZ ;CALL SUI 5 RZ ;JNC SUI 2 RZ ;CNC SUI 6 RZ ;JC SUI 2 RZ ;CC SUI 6 RZ ;JPO SUI 2 RZ ;CPO SUI 6 RZ ;JPE SUI 2 RZ ;CPE SUI 6 RZ ;JP SUI 2 RZ ;CP SUI 6 RZ ;JM SUI 2 RET ;CM ; SET GREEN GREEN: MVI A,2 JMP SCOL ; SET CYAN CYAN: MVI A,6 SCOL: STA COLOR RET ; CONVERT BUFFER INPUTS TO HEX ; INPUT: HL BUFFER ; B LENGTH ; C DON'T CARE ; OUTPUT: A LOW BYTE ; BC LOST ; DE LOST ; HL NUMBER ; STATUS: <NC> NO ENTRY ; < C>< Z> VALUE =ZERO ; < C><NZ> VALUE >ZERO DECH: LXI H,KBUF ;KYBD BUFFER DEC0: CALL HEX ;HEX DIGIT? RNC ;NO LXI D,0 ;INITIAL VALUE PUSH D ;VALUE SAVED DCX H ;BUFFER-1 DEC1: INX H ;BUFFER+1 CALL HEX ;HEX DIGIT? ;IF YES, WILL BE HEX ;VALUE RANGE 0 - 15 JNC DEC2 ;NO-QUIT MOV C,A ;SHIFT DIGIT XTHL ;SWAP BUFFER/NUMBER PUSH B ;SAVE DIGIT LXI D,16 CALL MULHD ;NUMBER*16 POP B ;DIGIT BACK MOV A,C CALL ADHLA ;NEW VALUE XTHL ;SWAP NUMBER/BUFFER DCR B ;LENGTH-1 JNZ DEC1 ;NEXT CHAR DEC2: POP H ;NUMBER UP MOV A,H ORA L ;TEST 0 MOV A,L ;SET LOW BYTE STC ;SET CARRY RET ; VALIDATE HEX DIGIT ; A: 0-15 IF VALID ; < C> VALID ; <NC> INVALID HEX: MOV A,M CALL NIBL CMC RET ; PRINT NUMBER (HEX) ; INPUT: HL VALUE PNUM: MOV A,H CALL HIGH MOV A,H CALL LOW MOV A,L CALL HIGH MOV A,L JMP LOW HIGH: ANI 0F0H ;KILL LOW BITS RRC ;/2 RRC ;/4 RRC ;/8 RRC ;/16 LOW: ANI 00FH ;KILL HI BITS ADI '0' ;+ASCII CPI '9'+1 ;>9? JC PHEX ;NO ADI 7 ;YES-ADD FOR A-F PHEX: CALL LO ;ECHO JMP WRITE ;WRITE IT ; SEND STRING HL TERM W/ 0 ; (NO CHECK FOR CHAR VALIDITY) ; INPUT: HL MESSAGE ; STATUS: <Z> FORCED SSTR: MOV A,M ;GET CHAR INX H ;MESSAGE+1 ORA A ;AT END? RZ ;YES CALL LO ;ECHO CALL WRITE ;WRITE IT JMP SSTR ;NEXT CHAR ; SEND CR/LF'S PCRS2: CALL PCRS PCRS: CALL CRLF ;TO CRT MVI A,13 ;CR CALL WRITE MVI A,10 ;LF JMP WRITE ; SEND TAB STAB: MVI A,9 ;SET TAB CALL LO ;ECHO ; WRITE ONE CHARACTER TO FILE ; STATUS: ALL REGISTERS RETAINED ; FLAGS: DON'T CARE WRITE: PUSH H LXI H,SF ;SRC FILE POINTER DCR M ;-1 INR M ;+1 ;DONE THAT WAY IN ORDER TO ;PRESERVE ALL REGISTERS. ;< Z> IF FILE NOT GENERATED ;<NZ> IF FILE IS GENERATED LXI H,FPB1 ;OUTPUT FPB CNZ PTBYT ;PUT THE BYTE POP H RET ;WHEN ASSEMBLED, THIS SHOULD ;BE AT 86D3H (ORG 8200H) OR ;DBD3H (ORG D700H) OR 44D3H ;(ORG 4000H) IF THERE AREN'T ;ANY MODS.... ;=======MESSAGES MSG01: DB 6,3,27,11,15,12,14,3,14,1 DB 'ASSEMBLY CROSS REFERENCE LISTING V5.82' DB 15,22,3,21,10,'HIT ',6,56,' RETURN ' DB 6,6,' TO CONTINUE',3,64,0,239 MSG02: DB 6,6,13,10,10 DB 'STARTING ADDRESS (HEX) > ',239 MSG03: DB 6,6,13,10,10 DB 'ENDING ADDRESS (HEX) > ',239 MSG04: DB 6,2,13,10,10 DB 'LOW BOUNDARY ADDRESS (HEX) > ',239 MSG05: DB 6,2,13,10,10 DB 'HIGH BOUNDARY ADDRESS (HEX) > ',239 MSG06: DB 6,3,13,10,10,'SEARCHING',13,10,239 MSG07: DB 6,3,13,10,10,'SORTING',13,10,239 MSG08: DB 6,4,13,10,10,'LISTING:',13,10,10,22,239 MSG09: DB 6,1,13,10,10,'NOTHING FOUND',13,10,10,239 MSG10: DB 6,6,13,10,10,'CONTINUE? ',239 MSG11: DB 9,'FROM',9,0 ;NOTE THE 0 TERMINATOR ;VICE A 239. THIS MSG ;IS SENT BY "SSTR". MSG12: DB 6,6,13,10,10,'DESIRE A ',17,'SOURCE ',22 DB 'FILE TO BE GENERATED? <',18,'Y',22,'/' DB 17,'N',22,'>',9,18,'> ',22,239 DLC: DB 26,32,26,239 NAME: DB 'XREF',0 ;FILE NAME TYPS: DB 'SRC',0 ;FILE TYPE ; BYTE LENGTH PER OP CODE ; 0 1 2 3 4 5 6 7 8 9 A B C D E F <-LOW/HI ; BYTE: DB 1,3,1,1,1,1,2,1,0,1,1,1,1,1,2,1 ;00 DB 0,3,1,1,1,1,2,1,0,1,1,1,1,1,2,1 ;10 DB 0,3,3,1,1,1,2,1,0,1,3,1,1,1,2,1 ;20 DB 0,3,3,1,1,1,2,1,0,1,3,1,1,1,2,1 ;30 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;40 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;50 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;60 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;70 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;80 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;90 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;A0 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;B0 DB 1,1,3,3,3,1,2,1,1,1,3,0,3,3,2,1 ;C0 DB 1,1,3,2,3,1,2,1,1,0,3,2,3,0,2,1 ;D0 DB 1,1,3,1,3,1,2,1,1,1,3,1,3,0,2,1 ;E0 DB 1,1,3,1,3,1,2,1,1,1,3,1,3,0,2,1 ;F0 ; JMP/CALL PRINT TABLE ; ; ADD 192 TO ENTRY NUMBER TO GET APPROPRIATE ; JMP/CALL EQUIVALENT. NOTE THE TERMINATING ; ZERO (0) AFTER EACH ENTRY.....THESE ARE ; PRINTED BY "SSTR" ROUTINE. TABLE COULD BE ; REDUCED AND ELIMINATE THE SPACE ENTRIES IF ; DESIRED, BUT THIS WILL REQUIRE MORE EXTENSIVE ; CHECK OF THE NUMBER IN THE ACCUMULATOR AT ; "PNT2" LOCATION. ; ; ALL ENTRIES MUST BE THE SAME LENGTH!! TABLE: DB ' ',0 ;00/192 DB ' ',0 DB 'JNZ ',0 ;02/194 DB 'JMP ',0 ;03/195 DB 'CNZ ',0 ;04/196 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JZ ',0 ;10/202 DB ' ',0 DB 'CZ ',0 ;12/204 DB 'CALL',0 ;13/205 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JNC ',0 ;18/210 DB ' ',0 DB 'CNC ',0 ;20/212 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JC ',0 ;26/218 DB ' ',0 DB 'CC ',0 ;28/220 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JPO ',0 ;34/226 DB ' ',0 DB 'CPO ',0 ;36/228 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JPE ',0 ;42/234 DB ' ',0 DB 'CPE ',0 ;44/236 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JP ',0 ;50/242 DB ' ',0 DB 'CP ',0 ;52/244 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB ' ',0 DB 'JM ',0 ;58/250 DB ' ',0 DB 'CM ',0 ;60/252 DB 0,0,0,0,0 ;TERMINATORS ; FCS ROM CALL TABLES ; ; ; V8.79 CALL TABLE V879 EQU $ JMP 194EH ;ADHLA JMP 1883H ;CMPHD JMP 17C1H ;CRLF JMP 1030H ;ERAS JMP 16FFH ;ESCD JMP 17C8H ;LO M879: JMP 187AH ;MOVHD JMP 1998H ;MULHD JMP 17E9H ;NIBL JMP 182AH ;OSTR JMP 188FH ;SUBHD JMP 185FH ;WATL JMP 156CH ;CLSEQO JMP 0AD6H ;EMESS JMP 151DH ;INSEQO JMP 11E1H ;OPEN JMP 14ADH ;PFSPC JMP 1680H ;PTBYT JMP 0B48H ;RESET JMP 14FCH ;RWSEQI DW 01B6H ; V9.80 CALL TABLE V980 EQU $ JMP 194EH ;ADHLA JMP 1883H ;CMPHD JMP 17C1H ;CR/LF JMP 0250H ;ERAS JMP 16FFH ;ESCD JMP 17C8H ;LO M980: JMP 187AH ;MOVHD JMP 1998H ;MULHD JMP 17E9H ;NIBL JMP 182AH ;OSTR JMP 188FH ;SUBHD JMP 185FH ;WATL JMP 156CH ;CLSEQO JMP 0AD6H ;EMESS JMP 151DH ;INSEQO JMP 11E1H ;OPEN JMP 14ADH ;PFSPC JMP 1680H ;PTBYT JMP 0B48H ;RESET JMP 14FCH ;RWSEQI DW 01B6H EPRG EQU $-1 ;=======VARIABLE DATA AREA ; ; ; THE FOLLOWING VARIABLES ARE CLEARED FROM "DSS" TO ; "DSE" BY "SETUP" ROUTINE. FPB1 IS CLEARED AND SET ; DOWN IN ROM. TBUF IS SET BY THE PROGRAM. ; ; THESE VARIABLES USE THE SAME MEMORY AREA AS THE ; V8.79//V9.80 CALL TABLES. THIS IS OK AS THE TABLES ; ARE OVERLAYED ONLY ONCE AND THEN NEVER USED AGAIN. ORG V879 ;RESET ORIGIN DSS EQU $ ;DATA START KBUF: DS 16 ;KYBD BUFFER BCH: DS 2 ;BOUNDARY LO BCL: DS 2 ;BOUNDARY HI CODE: DS 1 ;INSTR CODE (-192) EAD: DS 2 ;END ADDR LADR: DS 2 ;LAST ADDR CK PASS: DS 1 ;SORT PASS COUNT SAD: DS 2 ;START ADDR SF: DS 1 ;FILE CONTROL SIZE: DS 2 ;TOP OF BUFFER TADR: DS 2 ;BUFFER ADDR DSE EQU $-1 ;DATA END FPB1: DS 38 ;FPB DS 128 ;STACK SPACE STACK EQU $ ORG (($/128)+1)*128 OBUF: DS 768 ;OUTPUT BUFFER ORG 8200H ;RESET ORIGIN - USE WITH ;PROGRAM ORIGIN OF 4000H ;ONLY TBUF EQU $ ;XREF BUFFER EOP EQU EPRG ;PROG END - NO NEED TO ;SAVE ANYTHING PAST THIS ;POINT WHEN SAVING AS A ;.PRG PROGRAM END START