home *** CD-ROM | disk | FTP | other *** search
- ;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