;q.asm - dumps TPA size and 00-ff. ; ; If given an operand: @xxxx ; the dump will start at hex xxxx. ; press control-c to stop. ; ; While dumping, pressing the space ; bar bumps the address by 100. ; BDOS EQU 5 CONST EQU 11 CONIN EQU 1 FCB EQU 5CH ORG 100H ; ;INIT LOCAL STACK ; LXI H,0 ;HL=0 DAD SP ;HL=STACK SHLD STACK ;SAVE IT LXI SP,STACK ;LOAD LOCAL STACK ; LDA FCB+1 ;SEE IF CPI '@' ; @XXXX JZ DUMPAT ; YES, GET ADDR ; ;PRINT BDOS ENTRY ADDRESS ; TPASIZE LHLD BDOS+1 ;GET JMP TO BDOS ; ; remove following instruction to have Q print BDOS entry ; address instead of TPA size (which is BDOS-100). ; DCR H ;compute TPA size CALL PRADDR ;PRINT THE ADDR CALL CRLF ; THEN CR-LF CALL CRLF ; AND AGAIN DUMP0 LXI H,0 ;GET DEFAULT ADDR LP CALL PRADDR ;PRINT THE ADDR CALL PRLINE ;THEN THE LINE INR H ;THIS SETS PSW TO DCR H ; ZERO IF H=0 JZ LP ;LOOP IF NOT YET ;AT 0100 (H = 01) ; ;RETURN TO CP/M ; EXIT LHLD STACK ;GET CP/M'S STACK SPHL ;RESTORE IT RET ; AND RETURN ; ;PRINT ADDR IN HEX ; PRADDR MOV A,H ;GET H CALL HEX ; AND PRINT IT MOV A,L ;THEN L CALL HEX ; AND PRINT IT ; ;SPACE 2 TIMES ; SPACE2 CALL SPACE ; ;SPACE ONCE ; SPACE MVI A,' ' ; ;CONSOLE OUT ; CONOUT PUSH B ;SAVE PUSH D ; THE PUSH H ; REGS MOV E,A ;CHAR IN E FOR BDOS MVI C,2 ;FUNCTION 2 = WRITE CON. CALL BDOS ;PRINT THE CHAR POP H ;RESTORE POP D ; THE POP B ; REGS RET ;AND RETURN ; ;PRINT (A) IN HEX ; HEX PUSH PSW ;SAVE INCOMING RAR ;ROTATE LEFT RAR ; 4 BITS RAR ; INTO RAR ; RIGHT 4 CALL NIBBL ;PRINT THEM POP PSW ;GET BACK, NIBBL ANI 0FH ;ISOLATE NIBBLE ADI 90H ;SEE TEXT FOR DAA ; EXPL OF ACI 40H ; THIS BINARY DAA ; TO ASCII JMP CONOUT ; CONVERSION ; ;PRINT ONE LINE ; PRLINE PUSH H ;SAVE ADDR PRHEX MOV A,M ;GET A BYTE CALL HEX ;PRINT IN HEX SPACE4 MOV A,L ;SEE IF ANI 3 ; TIME INR A ; TO CPI 4 ; SPACE CZ SPACE ;YES SPACE8 MOV A,L ;SEE IF TIME TO ANI 7 ; DOUBLE INR A ; SPACE CPI 8 ; IN COLUMN 8 CZ SPACE ;YES CKDONE INX H ;TO NEXT BYTE MOV A,L ;GET LOW ADDR ANI 0FH ;END OF LINE? JNZ PRHEX ; NO, LOOP NOWASC CALL FENCE ;PRINT FENCE CHAR POP H ;RESTORE ADDR PRASC MOV A,M ;GET BYTE FOR ASCII CPI ' ' ;SEE IF CONTROL CHAR JC PRPER ;PRINT PERIOD IF SO PRTABLE CPI 7FH ;SEE IF PRINTABLE JC PRNPER ; YES PRPER MVI A,'.' ;PRINT A PERIOD PRNPER CALL CONOUT ;PRINT WHAT'S IN A MORE INX H ;TO NEXT CHAR MOV A,L ;CHECK LOW ADDR ANI 0FH ; FOR END OF LINE JNZ PRASC ;LOOP IF NOT CALL FENCE ;PRINT CLOSING FENCE CRLF MVI A,0DH ;THEN "FALL INTO" CALL CONOUT ;CR/LF ROUTINE MVI A,0AH JMP CONOUT ; ;PRINT ASCII DELIMITER CHAR - VERTICAL BAR "FENCE". ; FENCE MVI A,'|' ;GET FENCE CHAR JMP CONOUT ;PRINT IT ; ;OPERAND ON COMMAND SAID "@XXXX" SO GET ADDR ; DUMPAT LXI D,FCB+2 ;SKIP @ SIGN LXI H,0 ;INIT BINARY RESULT ; ;THIS LOOP CONVERTS ASCII TO BINARY ; GETAD LDAX D ;GET CHAR OF ADDR INX D ;POINT TO NEXT CPI ' ' ;SEE IF PAST ADDR ;(REMEMBER FCB IS ; PADDED WITH ' ') JZ DUMPIT ;IF SO, GO DUMP IT TIMES16 DAD H ;HL = 2 X HL DAD H ; 4 DAD H ; 8 DAD H ; 16 CKALPHA CPI 'A' ;SEE IF CHAR IS JC NUM ; NUMERIC? ;(NOT THOROUGH TEST) SUI 7 ;OTHERWISE FUDGE NUM SUI '0' ;TO MAKE PRINTABLE ;(SEE TEXT) ADD L ;ADD THIS DIGIT MOV L,A ;PUT IT BACK JMP GETAD ;LOOP UNTIL DONE ; DUMPIT CALL PRADDR ;FULL DUMP: PRINT ADDR, CALL PRLINE ; THEN LINE CKSTAT CALL STAT ;THEN CHECK FOR INTERRUPT JZ EXIT ; AND EXIT IF SO. STOPAT0 MOV A,H ;CHECK IF HL = 0 ORA L ;BY ORING H WITH L JNZ DUMPIT ;IF EITHER NOT ZERO, LOOP JMP EXIT ; ELSE DONE ; ;CHECK CONSOLE STATUS, PROCESS CONTROL-S AND CONTROL-C ; STAT PUSH H ;SAVE DUMP ADDR POINTER MVI C,CONST ;GET STATUS FUNCTION CALL BDOS ;HAVE BDOS CHECK FOR KEY POP H ;RESTORE ADDR ORA A ;CHECK RETURN FROM BDOS JZ NSTAT ;IF NO CHAR, JMP GETCHAR PUSH H ;GOT A CHAR, SAVE ADDR MVI C,CONIN ;GET CONSOLE IN FNC. CALL BDOS ;GET THE CHAR CKCTLS MVI C,CONIN ;SET UP FOR SECOND READ CPI 'S'-40H ;TEST FOR CTL-S PAUSE CZ BDOS ;IF SO, READ 2ND CHAR CKBREAK POP H ;RESTORE ADDR CPI 'C'-40H ;CHECK CHAR FOR ABORT JZ EXIT ;EXIT IF SO CPI 0DH ;IF CARRIAGE RETURN, JZ EXIT ;ALSO ABORT INCRSP CPI ' ' ;IF ITS A SPACE, BUMP H. RNZ ;H, O INR H ;BUMP ADDR BY 100 (H BY 1) RET ;AND RETURN ; NSTAT INR A ;NOT INTERRUPT SO JUST RET ; RETURN A =1 ; DS 100 ;STACK SPACE STACK DS 2