; TITLE - MONITOR 1K ; ; NOTE: This monitor is used in conjunction with ; the program DISA.ASM ; ; ********************************************** * MONITOR EQUATES * ********************************************** CR EQU 0DH LF EQU 0AH ESC EQU 1BH ***** CHANGE THE NEXT 3 LINES TO MOVE TO ANOTHER ADDRESS ORIGIN EQU 0F000H ; MONITOR ORIGIN DATA EQU 8000H ; START OF MONITOR RAN USAGE DISL EQU ORIGIN+400H ; DISASSEMBLE WITH LABEL ******************************************************** DISNL EQU DISL+3 ; DISASSEMBLE WITHOUT LABEL DELAY EQU 0F700H ; DELAY ROUTINE IN DISA MSTAK EQU DATA+0BCH ; TOP OF STACK AND BOTTOM OF RAM HCHAR EQU 0FH ; MASK TO SELECT LOWER HEX CHAR FROM BYTE NEWLN EQU 0FH ; MASK FOR CHECKING MEM ADD DISPLAY PRTYG EQU 7FH ; MASK TO STRIP PARITY RSTU EQU 38H ; XFER LOC FOR RST 7 INST KBIN EQU 0ECH ; KBRD INPUT PORT KBSTAT EQU 0EDH ; KBRD STATUS BYTE KBCTL EQU 0F7H ; 8255 CONTROL PORT KBCMD EQU 0B2H ; 8255 COMMAND PORT KBRDY EQU 8 ; KBRD READY BIT CNOUT EQU KBIN ; CONSOLE OUT PORT USRST EQU 40H ; USART RESET COMMAND WORD MODE EQU 85H ; USART MODE WORD CMD EQU 25H ; USART COMMAND WORD TRDY EQU 10H ; USART XMIT RDY BIT VDMPRT EQU 0DCH ; VDM CONTROL PORT BRKMAX EQU 5 ; MAX NUMBER OF BRKPOINT ALLOWED ; ********************************************************** * TERMINAL INITIALIZATION CODE * ********************************************************** ORG ORIGIN ; NOP! NOP! NOP! NOP! NOP! JMP INUST ; ***************************** * RESTART ENTRY POINT ***************************** ; GO: SHLD LSAVE ; SAVE HL REG POP H ; GET TOP OF STACK ENTRY DCX H ; DEC IT TO POINT TO RST SHLD PSAVE ; ASSUME THIS IS LAST P COUNTER PUSH PSW ; SAVE ACC Š LXI H,2 ; SET HL TO 2 SO THAT STACK POINTER ; SAVED CORRECTLY DAD SP ; GET STACK POINTER VALUE POP PSW ; RESTORE ACC LXI SP,ASAVE+1 ; NEW VALUE FOR STACK POINTER PUSH PSW ; SAVE ACC PUSH B ; SAVE B & C PUSH D ; SAVE D & E PUSH H ; SAVE USER SP LHLD LSAVE ; GO LOOK MOV A,M ; AT WHAT WAS IN STA MSAVE ; MEM & SAVE IT GO10: CALL CROUT ; PRINT CR & LF LXI H,NUMBRK; POINT AT # OF BRKPOINTS MOV C,M ; PUT IN C GO20: DCR C ; IF NO BRKPOINTS LEFT JM XCM02 ; THEN DUMP REGS. & GET NEXT CMD INX H ; GET BRKPOINT ADR IN DE MOV E,M INX H MOV D,M INX H ; GET ORIGINAL CONTENTS MOV A,M STAX D ; RESTORE ORIGINAL CONTENTS JMP GO20 ; GO CHECK FOR MORE BRKPOINTS ; **************************** * COMMAND RECOGNIZING ROUTINE **************************** ; ; FUNCTION: GETCH ; INPUTS: NONE ; OUTPUTS: NONE ; CALLS: GETCH,ECHO,ERROR ; DESTROYS: A,B,C,H,L,F/F'S ; DESCRIPTION: GETCH RECEIVES AN INPUT CHAR FROM THE USER ; AND ATTEMPTS TO LOCATE IN ITS CMD CHAR TABLE ; ; GETCM: LXI SP,MSTAK ; ALWAYS WANT TO RESET SP TO MONITOR ; STARTING VALUE SO ROUTINES ; NEEDN'T CLEAN UP MVI C,'>' ; PROMPT TO C CALL ECHO ; ECHO IT CALL GETCH ; GET CMD CHAR TO A CPI 'D' ; JMP FOR VALID COMMAND JZ DCMD ; DISPLAY BLOCK OF MEMORY CPI 'G' ; GO WITH BREAKPOINTS JZ GCMD CPI 'M' ; MOVE BLOCK OF MEMORY JZ MCMD CPI 'N' ; TRACE NEXT INSTRUCTION Š JZ NCMD CPI 'S' ; SCAN MEMORY AND SUBSTITUTE JZ SCMD CPI 'L' ; LIST WITH MNEMONICS (DISASSEMBLE) JZ LCMD CPI 'X' JZ XCMD ERROR: LXI H,QUES ; MSG TO ERRPRT: CALL PRINT ; SEND TO CONSOLE EXIT: CALL CROUT ; SKIP TO BEGINNING OF NEXT LINE JMP GETCM ; TRY AGAIN ; ********************** * COMMAND IMPLEMENTING ROUTINES ********************** ; ; FUNCTION: DCMD ; ; ; DCMD: CALL GETTWO ; GET 2 NUMBERS POP D ; ENDING ADDRESS TO DE POP H ; STARTING ADDRESS TO HL DCM05: CALL CROUT ; CR, LF DCM06: CALL ADRD ; DISPLAY ADDRESS PUSH D ; SAVE END ADDR DCM10: MVI C,' ' ; A SPACE CALL ECHO ; USE BLANK AS SEPARATOR DCM08: MVI D,8 ; 8 BYTE PAIRS PER LINE PUSH H ; SAVE START OF LINE DCM12: MOV A,M ; PRINT CALL NMOUT ; BYTE 1 INX H MOV A,M ; PRINT CALL NMOUT ; BYTE 2 MVI C,' ' ; AND A CALL ECHO ; SPACE INX H DCR D JNZ DCM12 POP H ; NOW PRINT AGAIN MVI D,16 ; IN ASCII DCM16: MOV A,M ORI 7FH JP DCM18 Š CPI 5FH JZ DCM18 ; CHANGE BACKSPACE CPI 20H JP DCM20 DCM18: MVI A,'.' ; CONVERT SPECIAL CHAR TO PERIOD DCM20: MOV C,A ; NOW PRINT CALL ECHO ; ASCII CHAR INX H DCR D JNZ DCM16 CALL CROUT ; CR & LF POP D ; END ADDR CALL HILO ; TEST AGAINST HL JNC GETCM ; FINISHED ; IN KBSTAT ; GET CONSOLE STATUS ANI KBRDY ; SEE IF READY JNZ EXIT ; YES - QUIT JMP DCM16 ; DO MORE ; ************************ ; ; FUNCTION GCMD ; ; ; GCMD: CALL GETHX ; ASK FOR START ADDRESS JNC GCM05 ; IF ONE IS GIVEN MOV H,B ; THEN STORE IT MOV L,C SHLD PSAVE GCM05: LXI H,NUMBRK ; POINT TO # OF BRKPOINTS MVI M,0 ; INIT TO 0 INX H ; POINT TO BRKPOINT SAVE AREA PUSH D ; SAVE TERMINATOR GCM08: POP PSW ; GET TERMINATOR IN A CPI CR ; IF TERM=CR JZ GCM10 ; THEN DONE. GO TO IT CALL GETHX ; ELSE GET NEXT BKPT ADDR JNC ERROR ; COMPLAIN IF NONE GIVEN PUSH D ; SAVE TERM XCHG ; POINT DE TO BKPT SAVE AREA MOV H,B ; COPY BKPT ADDR TO HL MOV L,C CALL SETBRK ; SET THE BKPT XCHG ; BUT SAVE AREA ADDR BACK IN HL JMP GCM08 ; GO LOOK FOR MORE GCM10: LXI SP,MSTAK ; SET IT (SP) UP POP H ; RESTORE USER'S REGS Š POP D POP B POP PSW SPHL ; INCLUDING SP LHLD PSAVE PUSH H ; PUSH RESTART ADDRESS LHLD LSAVE RET ; GO TO IT ; ************************ ; ; FUNCTION NCMD ; ; ; ; NCMD: XRA A ; CLEAR BKPTS STA NUMBRK LHLD PSAVE ; PUT USER PC IN HL MOV A,M ; GET NEXT OPCODE IN A CPI 0E9H ; IF INSTR ISN'T PCHL JNZ NCM10 ; THEN JUMP AHEAD LHLD LSAVE ; PUT USER HL IN HL SHLD PSAVE ; SAVE IT AS NEW USER PC JMP GO10 ; GO DUMP REGS & GET ANOTHER CMD ; NCM10: LXI H,INTABL-1 ; POINT TO INST TYPE TABLE MVI B,4 ; ASSUME THE INSTR IS TYPE 4 (1 BYTE REGULAR) MOV C,A ; COPY OPCODE TO C ; NCM20: INX H ; POINT TO NEXT MASK BYTE MOV A,M ; GET MASK IN A ANA C ; MASK OPCODE JZ NCM40 ; JMP AHEAD IF RESULT 0 INX H ; POINT TO BIT MATCH BYTE CMP M ; COMPARE TO MASKED OPCODE INX H ; POINT TO TYPE BYTE JNZ NCM20 ; IF CMP UNEQUAL THEN TRY AGAIN MOV B,M ; SAVE INSTR TYPE IN B ; NCM40: LHLD PSAVE ; PUT USER PC IN HL LXI D,BRKSAV; POINT AT BKPT SAVE AREA DCR B ; IF TYPE NOT 1 JNZ NCM50 ; THEN JMP AHEAD INX H ; POINT HL AT ADR PART OF INSTR MOV A,M ; LOAD HL FROM (HL) INX H MOV H,M MOV L,A CALL SETBRK ; SET A BKPT THERE MVI B,6-1 ; CHANGE TYPE FROM 1 TO 6 TO GET Š; OTHER BREAKPOINT SET LHLD PSAVE ; PUT USER PC IN HL AGAIN NCM50: DCR B ; IF TYPE NOT 2 JNZ NCM60 ; THEN JMP AHEAD MOV A,C ; GET THE RST OPCODE ANI 38H ; PICK OUT ADR ONLY MVI H,0 ; PUT ADR IN HL MOV L,A JMP NCM80 ; SET THE BKPT & EXECUTE THE INSTR NCM60: DCR B ; IF TYPE NOT 3 JNZ NCM70 ; THEN CHARGE AHEAD LHLD SSAVE ; PUT USER SP IN HL MOV A,M ; LOAD HL FROM (HL) INX H MOV H,M MOV L,A CALL SETBRK ; SET A BKPT THERE LHLD PSAVE ; PUT USER PC IN HL AGAIN INR B NCM70: INX H ; POINT AT NEXT INSTR DCR B JNZ NCM70 NCM80: CALL SETBRK ; SET BKPT JMP GCM10 ; NO GO EXECUTE THE INSTR INTABL: DB 0FFH,0CDH,001H ; CALL DB 0C7H,0C4H,001H ; C COND DB 0FFH,0C3H,001H ; JMP DB 0C7H,0C2H,001H ; J COND DB 0C7H,0C7H,002H ; RST DB 0FFH,0C9H,003H ; RET DB 0C7H,0C0H,003H ; R COND DB 0F7H,0D3H,005H ; IN,OUT DB 0C7H,006H,005H ; MVI DB 0C7H,0C6H,005H ; ACC IMMED DB 0CFH,001H,006H ; LXI DB 0E7H,022H,006H ; LDA,STA,LHLD,SHLD DB 0000H ; *************************** ; ; FUNCTION SETBRK ; ; ; ; SETBRK: LDA NUMBRK ; INC # OF BKPTS INR A STA NUMBRK CPI BRKMAX+1 ; IF TOO MANY Š JZ ERROR ; THEN COMPLAIN & QUIT MOV A,L ; STORE ADR IN SAVE AREA STAX D INX D MOV A,H STAX D INX D MOV A,M ; STORE OPCODE IN SAVE AREA STAX D INX D MVI M,0CFH ; SET THE BKPT MOV A,M ; DID WE REALLY CPI 0CFH ; STORE IT?? RZ ; YES WE DID LXI H,NORAM ; NO WE DIDN'T JMP ERRPRT ; GIVE ERROR MSG ; *************************** ; ; FUNCTION: MCMD ; ; ; ; ; MCMD: MVI H,3 CALL GETNM ; GET 3 NUMBERS POP B ; DESTINATION ADR TO BC POP H ; ENDING ADR TO HL POP D ; STARTING ADR TO DE CALL HILO ; IF START>END JC ERROR ; THEN BITCH MCM05: LDAX D ; GET BYTE FROM SOURCE STAX B ; STORE IT AT DEST INX B ; INCR DEST ADR MOV A,B ORA C ; TEST FOR DEST ADR OVERFLOW JZ GETCM ; IF SO, CAN TERMINATE CMD INX D ; INCR SOURCE ADR CALL HILO ; SEE IF END ADR >= SOURCE ADR JC GETCM ; IF NOT, CMD IS DONE JMP MCM05 ; MOVE ANOTHER BYTE ; ************************* ; ; FUNCTION: SCMD ; ; ; ; SCMD: CALL GETHX ; GET A NUMBER IF PRESENT JNC ERROR ; BITCH IF NONE GIVEN ŠSCM04: MOV H,B ; MOVE NUMBER TO HL MOV L,C SCM05: CALL CROUT ; CR & LF CALL ADRD ; PRINT ADR MVI C,' ' ; SEPERATOR CALL ECHO SCM06: MOV A,M ; GET IT TO THE ACC CALL NMOUT ; DISPLAY IT MVI C,'-' CALL ECHO ; USE BLANK FOR SEPERATOR CALL GETHX ; GET NEW VALUE, IF ANY JNC SCM15 ; IF NOT BRANCH MOV M,C ; ELSE STORE LOWER 8 BITS SCM15: MOV A,D ; GET DELIM CPI CR ; DONE? JZ GETCM ; YES CPI ' ' ; OPEN NEXT? JNZ SCM16 INX H ; NEXT ADDR JMP SCM05 SCM16: CPI ESC ; PREV ADDR JNZ SCM17 DCX H ; DECREMENT JMP SCM05 ; AND OPEN IT SCM17: CPI ',' ; CURRENT ADDR JZ SCM05 ; YES JMP ERROR ; DON'T KNOW WHAT TO DO?? ; ****************************** ; ; FUNCTION: XCMD ; ; ; ; XCMD: CALL GETCH ; GET REG ID (IF ANY) CPI CR ; IF NONE JNZ XCM05 XCM02: LXI H,RTAB ; LOAD HL WITH ADDR OF START OF TABLE REG05: MOV C,M ; GET PRINT SYMBOL OF REG MOV A,C ORA A ; TEST FOR 0 - END OF TABLE JZ XCM50 ; IF SO THEN PRINT INSTR CALL ECHO INX H ; POINT TO START OF SAVE LOC ADDR MVI C,'=' Š CALL REGDMP ; PRINT '=' & REG CONTENTS MVI C,' ' CALL ECHO INX H ; POINT TO START OF NEXT TABLE ENTRY JMP REG05 ; DO NEXT REGISTER XCM05: LXI H,RTAB-2 ; POINT HL TO REG SAVE AREA XCM08: INX H INX H MOV A,M ORA A JZ ERROR ; TELL ABOUT INX H CMP C JNZ XCM08 XCM10: MVI C,' ' CALL REGDMP ; PRINT A SPACE & CONTENTS OF REG MVI C,'-' ; PRINT A DASH CALL ECHO PUSH D ; SAVE REG ADDR POINTER CALL GETHX ; GET NEW VALUE ( IF ANY) IN BC XCHG ; POINT DE AT LENGTH FLAG: DELIM IN H XTHL ; POINT HL AT REG SAVE AREA: DELIM ON STACK JNC XCM30 ; IF NEW VALUE GIVEN MOV M,C ; THEN SAVE LOW BYTE LDAX D ; IF DOUBLE REGISTER ORA A JZ XCM30 INX H ; THEN INCR SAVE AREA POINTER MOV M,B ; AND STORE HIGH BYTE XCM30: POP PSW ; IF DELIMITER=CR CPI CR JZ GETCM ; THEN QUIT XCHG ; POINT HL AT LENGTH FLAG AGAIN INX H ; POINT AT NEXT REG SAVE AREA INX H MOV A,M ; IF NO MORE REGS ORA A JZ EXIT ; THEN PRINT A CR AND QUIT JMP XCM10 ; ELSE KEEP TRUCKING REGDMP: CALL ECHO ; PRINT = OR SPACE MVI D,DATA SHR 8 ; POINT DE AT REG SAVE AREA MOV E,M INX H ; POINT HL AT LENGTH FLAG LDAX D ; GET 1ST BYTE OF REG CALL NMOUT ; PRINT IT IN HEX MOV A,M ; IF REG PAIR ORA A RZ DCX D ; THEN POINT DE AT 2ND BYTE LDAX D ; GET 2ND BYTE Š JMP NMOUT ; AND PRINT IT XCM50: LHLD PSAVE ; GET INSTR ADDR STC ; CLEAR CARRY CMC ; FOR NO LABEL CALL DISPRT ; DISASSEMBLE & PRINT IT JMP EXIT ; **************************** ; ; FUNCTION: LCMD ; ; ; ; ; LCMD: CALL GETTWO ; GET START & END POP D ; ENDING ADDR TO DE POP H ; STARTING ADDR TO HL CALL CROUT LCM10: PUSH D ; SAVE END ADDR INX B ; ADD NULL STC ; SET FOR LABEL CALL DISPRT ; DISASM & PRT PUSH H CALL CROUT POP H POP D CALL HILO ; AT END ADDR? JNC GETCM ; YES IN KBSTAT ; SEE IF CHAR PENDING ANI KBRDY JNZ EXIT ; YES SO QUIT JMP LCM10 ; NO SO LIST SOME MORE ; ************************* ; ; FUNCTION: DISPRT ; ; ; ; DISPRT: LXI B,OBUF ; WHERE TO PUT TEXT JNC DISPR2 CALL DISL ; DIS WITH LABEL JMP DISPR4 DISPR2: CALL DISNL ; DIS WITHOUT LABEL DISPR4: DCX B ; OMIT CR AT END OF STRING MVI A,0 ; NULL FOR PRT STAX B ; AT END OF STRING Š PUSH H LXI H,OBUF ; POINT TO START OF STRING CALL PRINT POP H RET ; ******************************* ; ; FUNCTION: ADRD ; ; ; ; ; ADRD: MOV A,H ; DISPLAY FIRST HALF OF ADDR CALL NMOUT MOV A,L ; DISPLAY SECOND HALF OF ADDR ; ****************************** ; ; FUNCTION: NMOUT ; ; ; ; ; NMOUT: PUSH PSW ; SAVE ARGUMENT RRC! RRC! RRC! RRC! CALL PRVAL ; CONVERT LOWER 4 BITS TO ASCII POP PSW ; GET BACK ARGUMENT ; ************************* ; ; FUNCTION: PRVAL ; ; ; ; PRVAL: ANI HCHAR ; MASK OUT UPPER 4 BITS ADI 90H ; SET UP A SO THAT A-F CAUSE A CARRY DAA ; ADJUST CONTENTS OF A REGISTER ACI 40H ; ADD IN CARRY AND ADJUST UPPER 4 BITS DAA ; ADJUST CONTENTS OF A REG AGAIN MOV C,A ; MOVE ASCII CHAR TO C JMP ECHO ; PRINT AND QUIT ; *********************************** ; ; FUNCTION: CNVBN ; ; ; Š; CNVBN: MOV A,C SUI '0' ; SUBTRACT CODE FOR 'B' FROM ARGUMENT JC ERROR CPI 10 ; WANT TO TEST FOR RESULT OF 0 TO 9 RM ; IF SO, THEN ALL DONE SUI 7 ; ELSE, RESULT BETWEEN 17 AND 23 DECIMAL CPI 10 JC ERROR CPI 10H JNC ERROR RET ; SO RETURN AFTER SUBTRACTING BIAS OF 7 ; ***************************** ; ; FUNCTION: CROUT ; ; ; ; CROUT: MVI C,CR JMP ECHO ; OUTPUT CR TO USER TERMINAL ; ****************************** ; ; FUNCTION: GETCH ; ; ; ; ; GETCH: LDA 0E003H ; GET STATUS ANI KBRDY ; IS THERE A CHAR YET?? JZ GETCH ; GUESS NOT TRY AGAIN LDA 0E000H ; ELSE GET THE CHAR ANI PRTYG ; STRIP PARITY MOV C,A ; PUT IN C REG FOR RETURN ; *************************** ; ; FUNCTION: ECHO ; ; ; ; ECHO: PUSH PSW ; SAVE REGS PUSH B MOV B,C ; SAVE ARGUMENT MVI A,ESC CMP B ; SEE IF ECHO AND ESC CHAR JNZ ECH05 ; NO - BRANCH Š MVI C,' ' ; YES - ECHO AS BLANK ECH05: CALL CO ; DO OUTPUT THROUGH MONITOR MVI A,CR CMP B ; SEE IF CHAR ECHOED WAS A CR JNZ ECH10 ; NO - NO NEED TO TAKE SPECIAL ACTION MVI C,LF ; YES - WANT TO ECHO A LINE FEED CALL CO CALL DELAY ECH10: POP B ; RESTORE REGS POP PSW RET ; TO WHOM EVER ; ************************* ; ; FUNCTION: CO ; ; ; ; CO: LDA 0E003H ; GET STATUS ANI TRDY ; SEE IF XMIT RDY JZ CO ; NO - WAIT MOV A,C ; ELSE, MOVE TO ACC FOR OUTPUT STA 0E006H ; SEND TO CONSOLE RET ; ************************* ; ; FUNCTION: GETHX ; ; ; ; ; GETHX: PUSH H ; SAVE HL LXI H,0 ; INITIALIZE RESULT MOV E,H ; INITIALIZE DIGIT FLAG TO FALSE GHX05: CALL GETCH ; GET A CHAR CALL VALDL ; SEE IF DELIMITER JZ GHX10 ; YES - BRANCH CALL CNVBN ; CONVERT TO BINARY VALUE MVI E,0FFH ; SET DIGIT FLAG NON-0 DAD H ; *2 DAD H ; *4 DAD H ; *8 DAD H ; *16 MVI B,0 ; CLEAR UPPER 8 BITS OF BC PAIR MOV C,A ; BINARY VALUE OF CHAR INTO C DAD B ; ADD THIS VALUE TO PARTIAL RESULT JMP GHX05 ; GET NEXT CHAR ŠGHX10: MOV D,C ; PUT DELIMITER IN D XTHL ; RESTORE HL & PUSH RESULT POP B ; POP RESULT INTO BC XRA A SUB E ; SET CARRY IF NUMBER ENTERED: ; ELSE CLEAR CARRY RET ; RETURN ; ************************** ; ; FUNCTION: GETNM ; ; ; ; ; GETNM: CALL GETHX ; GET NEXT NUMBER JNC ERROR ; COMPLAIN IF NONE GIVEN POP D ; SAVE RETURN ADDR PUSH B ; PUSH NUMBER PUSH D ; RESTORE RETURN ADDR DCR H ; IF MORE NUMBERS NEEDED JNZ GETNM ; THEN KEEP TRUCKING RET ; ELSE QUIT ; ************************* ; ; FUNCTION: GETTWO ; ; ; ; GETTWO: CALL GETHX ; GET NEXT NUMBER JNC ERROR ; COMPLAIN IF NONE GIVEN POP D ; SAVE RETURN ADDR PUSH B ; PUSH NUMBER LXI H,0FFFFH ; DEFAULT SECOND NO. PUSH H PUSH D ; RESTORE RETURN ADDR CALL GETHX ; TRY FOR OPTIONAL SECOND RNC ; NO 2ND. EXIT POP D ; RESTORE RETURN POP PSW ; GET RID OF DEFAULT PUSH B ; SAVE REAL ONE PUSH D ; AND RETURN ADDR RET ; AND RETURN ; *********************** ; ; FUNCTION: HILO ; ; Š; ; HILO: MOV A,L ; MOV L TO A SUB E ; SUBTRACT E MOV A,H ; MOVE H TO A SBB D ; SUBTRACT D WITH BORROW RET ; EXIT ; ************************* ; ; FUNCTION: INUST ; ; ; ; ; ; INUST: LXI H,0E004H ; 5501 ISSUE CMD MVI M,0DH ; RESET INTERUPT ENABLE INX H ; LOAD RATE REG MVI M,01H ; 110 BAUD 2 STOP BITS LXI H,MSTAK ; INITIALIZE STACK MVI M,05H ; SEE IF WE REALLY MOV A,M ; HAVE RAM HERE SUI 05H JZ INUST5 ; OK LXI H,NORAM JMP INUST6 ; GIVE MSG INUST5: SHLD SSAVE ; INITIALIZE USER STACK POINTER SPHL LXI H,SGNON ; ADDR OF SIGN ON MSG INUST6: CALL PRINT ; PRINT IT JMP GETCM ; NOW GO GET A CMD ; ************************ ; ; FUNCTION: PRINT ; ; ; ; ; PRINT: XRA A ; CLEAR A PRT10: MOV C,M ; GET NEXT CHAR CMP C ; IF CHAR=NULL RZ ; THEN RETURN CALL ECHO INX H JMP PRT10 ; KEEP TRUCKING Š; ***************************** ; ; FUNCTION: VALDL ; ; ; ; ; VALDL: MOV A,C CPI ',' ; CHECK FOR COMMA RZ CPI CR ; CR? RZ CPI ' ' ; SPACE? RZ CPI ESC RZ CPI LF RET ; *************************************** * MONITOR TABLES *************************************** ; NORAM: DB CR,LF DB 'RAM' QUES: DB '?',0 ;; SGNON: DB CR DB 'R' ; NOTE: MUST BE FOLLOWED BY A BYTE OF 0 DB 0 ; RTAB: DB 'A' ; REG IDENTIFIER DB ASAVE-DATA ; ADDR OF REG SAVE LOCATION DB 0 ; LENGTH FLAG - 0=8 BITS, 1=16 BITS DB 'B' DB BSAVE-DATA DB 0 DB 'C' DB CSAVE-DATA DB 0 DB 'D' DB DSAVE-DATA DB 0 DB 'E' DB ESAVE-DATA DB 0 DB 'F' Š DB FSAVE-DATA DB 0 DB 'H' DB HSAVE-DATA DB 0 DB 'L' DB LSAVE-DATA DB 0 DB 'M' DB MSAVE-DATA DB 0 DB 'P' DB PSAVE-DATA+1 DB 1 DB 'S' DB SSAVE-DATA+1 DB 1 DB 0 ; END OF TABLE MARKERS DB 0 ; *************************************** * MONITOR RAM *************************************** ORG MSTAK SSAVE DS 2 ; USER SP SAVE LOCATION ESAVE DS 1 ; E REG SAVE DSAVE DS 1 ; D REG SAVE CSAVE DS 1 ; C REG SAVE BSAVE DS 1 ; B REG SAVE FSAVE DS 1 ; FLAGS SAVE ASAVE DS 1 ; A REG SAVE LSAVE DS 1 ; L REG SAVE HSAVE DS 1 ; H REG SAVE PSAVE DS 2 ; PGM COUNTER SAVE MSAVE DS 1 ; MEMORY CONTENTS NUMBRK DS 1 ; # OF BKPTS SET BRKSAV DS BRKMAX+BRKMAX+BRKMAX ; BKPTS SAVE AREA VDMSTA DS 1 ; VDM STATUS SAVE AREA CURSOR DS 2 ; VDM CURCOR SAVE AREA ; OBUF DS 20 ; END