RC CALL NORM NORMALIZE ASCII CHARACTERS XCHG LXI H,7 DAD D NEW ADDRESS IN BUFFER XCHG RET * * THIS ROUTINE CONVERTS THE INPUT VALUES ACCORDING TO THE * SYSTEM INPUT MODE * EMODE LDA SMODE GET MODE SWITCH ORA A JNZ AOCT * * THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED BY * REGISTERS B,C AND CONVERTS THE ASCII HEXADECIMAL DIGITS INTO * BINARY. UP TO A 16 BIT VALUE CAN BE CONVERTED. THE SCAN STOPS * WHEN A BINARY ZERO IS FOUND IN THE BUFFER * AHEX LXI H,0 GET A 16 BIT ZERO AHE1 LDAX B FETCH ASCII DIGIT ORA A SET ZERO FLAG RZ RETURN IF ZERO DAD H LEFT SHIFT DAD H LEFT SHIFT DAD H LEFT SHIFT DAD H LEFT SHIFT CALL AHS1 CONVERT TO BINARY CPI 10H CHECK FOR LEGAL VALUE CMC RC RETURN IF ERROR ADD L MOV L,A INX B INCREMENT POINTER JMP AHE1 * * THIS SUBROUTINE CONVERTS ASCII HEX DIGITS INTO BINARY * AHS1 SUI 48 ASCII BIAS CPI 10 DIGIT 0-10 RC SUI 7 ALPHA BIAS CPI 10 RNC MVI A,-1 SET TO CAUSE ERROR RET * * ABCON LXI B,ABUF SET ADDRESS CALL EMODE CONVERT VALUE RC SHLD BBUF SAVE IN BINARY BUFFER LXI B,ABUF+7 CALL EMODE RC SHLD BBUF+2 SAVE IN BINARY BUFFER RET * * THIS ROUTINE IS USED TO CONVERT ASCII OCTAL DIGITS * INTO A 16 BIT BINARY VALUE * AOCT LXI H,0 16 BIT 0 AOC1 LDAX B GET NEXT CHARACTER ORA A RZ RETURN IF END DAD H DAD H DAD H SUI '0' REMOVE ASCII BIAS CPI 8 VALID DIGIT? CMC RC ADD L MOV L,A INX B JMP AOC1 * * THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII DECIMAL * DIGITS AND OUTPUTS THE CHARACTERS TO THE TTY * DOUT CALL BIND CONVERT VALUE CALL HOUT+3 OUTPUT VALUE (2 DIGITS) INX H MOV B,M GET LAST DIGIT JMP OUT8 OUTPUT IT * * OUTPUT OCTAL CHARACTERS * OOUT CALL BINO JMP DOUT+3 OOTB CALL OOUT * * THIS ROUTINE OUTPUTS A BLANK * BLK1 MVI B,' ' GET A BLANK JMP OUT8 * * THIS ROUTINE IS USED TO OUTPUT A VARIABLE NUMBER OF BLANKS * BLKO CALL BLK1 DCR C JNZ BLKO RET * * * THIS ROUTINE IS USED BY OTHER ROUTINES TO INCREMENT THE * STARTING ADDRESS IN A COMMAND AND CONPARE IT WITH THE FINAL * ADDRESS IN THE COMMAND. ON RETURN THE CARRY FLAG SET * INDICATES THAT THE FINAL ADDRESS HAS BEEN REACHED * ACHK LHLD BBUF FETCH START ADDRESS LDA BBUF+3 STOP ADDRESS (HIGH) CMP H COMPARE ADDRESSES JNZ ACH1 LDA BBUF+2 STOP ADDRESS (LOW) CMP L COMPARE ADDRESSES JNZ ACH1 STC SET CARRY IF EQUAL ACH1 INX H INCREMENT START ADDRESS SHLD BBUF STORE START ADDRESS RET * * * THIS ROUTINE OUTPUTS CHARACTERS FROM A CHARACTER STRING UNTIL * A CARRIAGE RETURN IS FOUND * SCRN XRA A SCHR STA XOUT MOV B,M MVI A,13 CARRIAGE RETURN CMP B CHARACTER = CR RZ CALL OUT8 OUTPUT CHARACTER INX H INCREMENT ADDRESS JMP SCHR * * * THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO * ASCII HEXADECIMAL DIGITS AND STORES THEM IN MEMORY * BINH LXI H,HCON CONVERSION ADDRESS MOV B,A SAVE VALUE RAR RAR RAR RAR CALL BIN1 MOV M,A INX H MOV A,B CALL BIN1 CONVERT TO ASCII MOV M,A RET * * THIS ROUTINE CONVERTS A VALUE TO HEXADECIMAL * BIN1 ANI 0FH LOW FOUR BITS ADI 48 MODIFY FOR ASCII CPI 58 DIGIT 0-9 RC ADI 7 MODIFY FOR A-F RET * * * THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO * ASCII DECIMAL DIGITS AND STORES THEM IN MEMORY * BIND LXI H,HCON CONVERSION ADDRESS MVI B,100 CALL BID1 CONVERT HUNDREDS DIGIT MVI B,10 CALL BID1 CONVERT TENS DIGIT ADI '0' GET UNITS DIGIT MOV M,A STORE IN MEMORY RET * * THIS ROUTINE CONVERTS A VALUE TO DECIMAL * BID1 MVI M,'0'-1 INITIALIZE DIGIT COUNT INR M SUB B CHECK DIGIT JNC BID1+2 ADD B RESTORE VALUE INX H RET * * THIS ROUTINE CONVERTS A 1 BYTE BINARY VALUE INTO * 3 ASCII OCTAL DIGITS AND STORES THEM IN MEMORY * BINO LXI H,HCON SET STORAGE ADDRESS MOV B,A RAL RAL RAL ANI 7 GET 1ST DIGIT ADI '0' CONVERT TO ASCII MOV M,A STORE MOV A,B RAR RAR RAR ANI 7 GET 2ND DIGIT ADI '0' CONVERT TO ASCII INX H MOV M,A MOV A,B ANI 7 GET 3RD DIGIT ADI '0' INX H MOV M,A RET * * * LEGAL COMMAND TABLE * CTAB DB 'L','I','S','T' LIST COMMAND DDB LIST COMMAND ADDRESS DB 'T','E','X','T' TEXT COMMAND DDB TEXT DB 'D','E','L','T' DELETE COMMAND DDB DELL COMMAND ADDRESS DB 'M','O','D','E' MODE COMMAND DDB SYSMD DB 'F','C','H','K' DDB FCHK DB 'F','O','R','M' DDB FORM DB 'N','F','O','R' DDB NFORM DB 'S','W','C','H' DDB EORNS DB 'S','I','M','U' DDB SINT DB 0 DB 'D','U','M','P' DUMP COMMAND DDB DUMP COMMAND ADDRESS DB 'E','X','E','C' EXECUTE COMMAND DDB EXEC COMMAND ADDRESS DB 'E','N','T','R' ENTER COMMAND DDB ENTR COMMAND ADDRESS DB 'F','I','L','E' FILE COMMAND DDB FILE COMMAND ADDRESS DB 'A','S','S','M' ASSEMBLE COMMAND DDB ASSM COMMAND ADDRESS DB 'A','S','S','I' DDB ASSM DB 'I','O','D','R' DDB IFILE DB 'S','T','A','B' SET SYMBOL TABLE COMMAND DDB SYMBL DB 'S','Y','M','L' DDB SYML DB 'C','U','S','T' DDB CUST DB 'R','N','U','M' DDB RNUM DB 'F','M','O','V' DDB FMOV DB 'E','D','I','T' EDIT COMMAND DDB EDIT DB 'A','U','T','O' AUTO LINE NUMBER COMMAND DDB AUTO DB 'F','I','N','D' FIND COMMAND DDB 0FF36H DB 'T','E','R','M' TERMINAL WIDTH COMMAND DDB TERM DB 0 * * * LIST SYSTEM SYMBOL TABLE * * PERFORM SYSTEM SYMBOL TABLE OPERATIONS SYML LXI H,IBUF+4 MOV A,M CPI 'E' JZ SYME CPI 'D' JZ SYMD LXI H,SYSYM SYML1 MVI A,4 SET LINE COUNT STA SCNT CALL CRLF SYML2 MOV A,M ORA A JZ SAOUT NOW GO OUTPUT ENDING ADDRESS CALL SYMOT OUTPUT SYMBOL INX D LXI H,SCNT DCR M XCHG JNZ SYML2 JMP SYML1 * ENTER SYMBOL INTO SYSTEM TABLE SYME CALL VCHK CHECK FOR PARAMETER SYME1 CALL SYMSUB JMP COM1 * DELETE SYSTEM SYMBOL SYMD CALL SYME1 INX H INX H XCHG LXI H,-LLAB-2 DAD D * MOVE TABLE DOWN LDAX D SYMD1 ORA A END OF TABLE MVI B,LLAB+2 ENTRY LENGTH SYMD2 MOV M,A RZ INX H INX D LDAX D DCR B JNZ SYMD2 JMP SYMD1 SYMSUB CALL ZBUF XCHG SHLD ADDS LXI D,FBUF XCHG XRA A STA FREAD MOV A,M ORA A JZ WHAT CALL ALP2 CPI ' '+1 JNC WHAT LHLD BBUF RET SAOUT XCHG CALL CRLF JMP ADOUT * * CUSTOM COMMAND TABLE * * FORM CUST - LIST ALL COMMANDS * CUSTE - ENTER NEW COMMANDS AND ADDRESS * CUSTD - DELETE COMMAND AND UPDATE TABLE * * CUST LXI H,IBUF+4 LOOK AT PARAMETER MOV A,M CPI 'E' IS IT AN ENTER JZ CENTR CPI 'D' HOW ABOUT DELETE JZ CDLT * * LIST COMMAND TABLE * CLIST LXI H,CUCOM JMP SYML1 * * ENTER NEW COMMAND CENTR CALL VCHK CNTR1 CALL SYMSUB LXI D,CUCOM CUSTEM COMMAND TABLE JMP COM1+3 * * THIS ROUTINE CALL ETRA TO OBTAIN THE INPUT PARAMETER VALUES * AND CALLS AN ERROR ROUTINE IF AN ERROR OCCURRED IN THAT ROUTINE * VALC CALL ETRA GET INPUT PARAMETERS JC WHAT JUMP IF ERROR RET * * THIS ROUTINE CHECKS IF ANY PARAMETERS WERE ENTERED * WITH THE COMMAND, IF NOT AN ERROR MESSAGE IS ISSUED * VCHK LDA ABUF FETCH PARAMETER BYTE ORA A SET FLAGS JZ WHAT NO PARAMETER RET * * * THIS ROUTINE DUMPS OUT THE CONTENTS OF MEMORY FROM * THE START TO FINAL ADDRESSES GIVEN IN THE COMMAND * DUMP CALL VCHK CHECK FOR PARAMETER MVI A,16 SET LINE COUNT STA SCNT DUMS CALL CRLF LHLD BBUF XCHG CALL ADOUT MVI B,':' CALL OUT8 CALL BLK1 LDA SCNT DUM2 STA DCNT LHLD BBUF MOV A,M GET BYTE CALL DUMO OUTPUT VALUE CALL BLK1 CALL ACHK CHECK FINAL ADDRESS RC LDA DCNT DCR A DECREMENT LINE COUNT JNZ DUM2 JMP DUMS * ADOUT LDA SMODE ORA A MOV A,D JZ ADOU1 RAR ADOU1 MOV D,A RAL MOV C,A MOV A,D CALL DUMO MOV A,C RAR MOV A,E * * THIS ROUTINE IS USED TO OUTPUT A VALUE IN REGISTER A * IN EITHER OCTAL OR HEXADECIMAL DEPENDING UPON THE * SYSTEM MODE * DUMO LXI H,SMODE GET SYSTEM MODE MOV B,M DCR B JZ OOUT * * THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII HEXADECIMAL * AND OUTPUTS THE CHARACTERS TO THE TTY * HOUT CALL BINH CONVERT VALUE LXI H,HCON CONVERSION AREA CHOT MOV B,M FETCH OUTPUT CHARACTER CALL OUT8 OUTPUT CHARACTER INX H MOV B,M FETCH CHARACTER JMP OUT8 OUTPUT CHARACTER * * THIS ROUTINE DOES THE SAME AS ABOVE BUT OUTPUTS A BLANK * AFTER THE LAST CHARACTER * HOTB CALL HOUT CONVERT AND OUTPUT JMP BLK1 OUTPUT A BLANK * * THIS ROUTINE IS USED TO OUTPUT AN ADDRESS - 16 BIT VALUE - * IN EITHER HEXADECIMAL OR OCTAL DEPENDING UPON THE SYSTEM MODE. * ON ENTRY THE ADDRESS IS CONTAINED IN D,E. * * * * THIS ROUTINE IS USED TO SET THE SYSTEM MODE TO EITHER * OCTAL OR HEXADECIMAL * SYSMD CALL VCHK CHECK FOR A PARAMETER LXI B,ABUF CALL AHEX JC WHAT MOV A,H GET HIGH ORDER VALUE ORA A JNZ WHAT MVI B,0 MOV A,L CPI 16H HEX? JZ SYSM1 INR B CPI 8H OCTAL? JNZ WHAT SYSM1 MOV A,B STA SMODE SET MODE RET * * * * THIS ROUTINE INITIALIZES THE BEGINNING OF FILE ADDRESS * AND END OF FILE ADDRESS AS WELL AS INITIALIZES THE FILE AREA * WHEN THE FILE COMMAND IS USED * * CHECK FOR FILE PARAMETERS FILE LDA FBUF ORA A JZ FOUT NO - GO LIST CALL FSEA LOOK UP FILE XCHG PNTR IN DE JNZ TEST IF FOUND * NO ENTRY LDA ABUF CHECK FOR PARAM ORA A JZ WHAT NO!! GIVE EM HELL * CHECK FOR ROOM IN DIRECTORY LDA FEF ORA A JNZ ROOM FMES2 LXI H,EMES1 JMP MESS * ENTRY FOUND ARE THESE PARAMETERS TEST LDA ABUF ORA A JZ SWAPS LHLD BBUF MOV A,H ORA L JZ SWAPS TESTM LXI H,EMES2 NO-NO CAN'T DO JMP MESS IT - DELETE FIRST * MOVE FILE NAME TO BLOCK POINTED TO BY FREAD ROOM CALL FLSTO * MAKE FILE POINTED TO BY D,E CURRENT SWAPS LXI H,FILE0 MVI C,FELEN ENTRY LENGTH SWAP LDAX D MOV B,M MOV M,A EXCHANGE MOV A,B STAX D INX D BUMP POINTERS INX H DCR C TEST COUNT JNZ SWAP * CHECK FOR 2ND PARAMETER, =# INITIALIZE NEW LDA ABUF ORA A JZ FOUT NO SECOND PARAMETER * PROCESS 2ND PARAMETER LHLD BBUF GET ADDRESS SHLD BOFP SET BEGIN SHLD EOFP SET END MOV A,L IS ADDRESS ZERO ORA H JZ FIL35 YES FIL30 MVI M,1 NON ZERO - SET EOF FIL35 XRA A STA MAXL AND MAX LINE = JMP FOOT OUTPUT PARAMETERS FOUT CALL CRLF LDA IBUF+4 CPI 'S' IS COMMAND FILES MVI C,MAXFIL JZ FOUL FOOT MVI C,1 * OUTPUT THE # OF ENTIRES IN C FOUL LXI H,FILE0 MOV A,C FINE STA FOCNT SAVE COUNT PUSH H LXI D,NMLEN DAD D MOV A,M ORA A JNZ FOOD NON ZERO, OK TO OUTPUT INX H ADD M INX H JNZ FOOD INX SP INX SP INX H INX H JMP FEET * HAVE AN ENTRY TO OUTPUT FOOD POP H PTR CALL CRLF AND C/R MVI C,NMLEN FAST MOV B,M LOAD CHARACTER TO B CALL OUT8 OUTPUT DCR C INX H JNZ FAST DO THE REST * NOW OUTPUT BEGIN-END PTRS CALL FOOL OUTPUT BEGIN CALL FOOL OUTPUT END * TEST COUNT, H,L POINTS PAST EOFP FEET LXI D,FELEN-NMLEN-4 DAD D MOVE TO NEXT ENTRY LDA FOCNT DCR A TEST COUNT JNZ FINE MORE TO DO RET DONE!!! * OUTPUT NUMBER POINTED TO BY H,L * ON RET, H,L POINT 2 WORDS LATER FOOL CALL BLK1 SPACE MOV E,M INX H MOV D,M PUSH H