mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
364 lines
7.6 KiB
NASM
364 lines
7.6 KiB
NASM
ORG 000H
|
||
TITLE 'SID HISTOGRAM UTILITY 12/26/77'
|
||
;
|
||
; COPYRIGHT (C) 1976,1977
|
||
; DIGITAL RESEARCH
|
||
; BOX 579 PACIFIC GROVE
|
||
; CALIFORNIA 93950
|
||
;
|
||
; HISTOGRAM OF PROGRAM EXECUTION FREQUENCY
|
||
; DDT ENTRY POINT
|
||
BDOSE EQU 5 ;PRIMARY BDOS ENTRY POINT
|
||
DDTBASE EQU 7*8+1 ;RESTART ENTRY POINT HAS BASE
|
||
HISTO: JMP SETUP ;INITIAL ENTRY FROM RELOCATOR
|
||
;
|
||
; SYMBOL TABLE INITIALIZED TO INITIAL, COLLECT, DISPLAY
|
||
SYBASE:
|
||
DB 'YALPSID',7,LOW DISE,HIGH DISE ;DISPLAY
|
||
DB 'TCELLOC',7,LOW COLE,HIGH COLE ;COLLECT
|
||
DB 'LAITINI',7,LOW INIE,HIGH INIE ;INITIAL
|
||
SYLEN EQU $-SYBASE ;LENGTH OF ADDITIONAL SYMBOLS
|
||
;
|
||
INIE: JMP INITIAL
|
||
COLE: JMP COLLECT
|
||
DISE: JMP DISPLAY
|
||
DB 'COPYRIGHT (C) 1977 DIGITAL RESEARCH '
|
||
; DDT SUBROUTINES
|
||
GETBUFF:
|
||
; READ NEXT COMMAND BUFFER
|
||
LXI B,3
|
||
JMP GODDT
|
||
;
|
||
GNC: ;READ NEXT CHARACTER TO REGISTER A
|
||
|
||
LXI B,6
|
||
JMP GODDT
|
||
;
|
||
PCHAR: ;PRINT CHARACTER FROM REGISTER A
|
||
|
||
LXI B,9
|
||
JMP GODDT
|
||
;
|
||
PBYTE: ;PRINT DECODED BYTE FROM REGISTER A
|
||
|
||
LXI B,12
|
||
JMP GODDT
|
||
;
|
||
;
|
||
PADDR: ;PRINT THE ADDRESS GIVEN BY D,E
|
||
PUSH D ;SAVE THE ADDRESS FOR THE PRINT
|
||
MOV A,D ;PRINT HIGH ADDRESS
|
||
CALL PBYTE
|
||
POP D ;RECALL
|
||
MOV A,E ;LOW ADDRESS
|
||
JMP PBYTE ;RETURN THROUGH PBYTE
|
||
;
|
||
SCANEXP:
|
||
; SCAN COMMAND LINE FOR 1,2, OR 3 EXPRESSIONS
|
||
LXI B,18
|
||
JMP GODDT
|
||
;
|
||
GETVAL:
|
||
; READ NEXT VALUE FROM SCANEXP CALL TO H,L
|
||
LXI B,21
|
||
;
|
||
GODDT: ;PERFORM THE DDT CALL
|
||
LHLD DDTBASE
|
||
DAD B
|
||
PCHL
|
||
;
|
||
; CONSTANTS
|
||
CR EQU 0DH
|
||
LF EQU 0AH
|
||
HSIZE EQU 64 ;SIZE OF HISTOGRAM (MUST CORRESPOND TO SHR6)
|
||
;
|
||
; USEFUL SUBROUTINES
|
||
DIFF: ;COMPUTE THE DIFFERENCE: DE = DE - HL
|
||
MOV A,E
|
||
SUB L
|
||
MOV E,A
|
||
MOV A,D
|
||
SBB H
|
||
MOV D,A
|
||
RET
|
||
;
|
||
SHR6: ;DIVIDE H,L BY 64 (MUST CORRESPOND TO HSIZE)
|
||
MOV A,L
|
||
MOV L,H
|
||
MVI H,0
|
||
DAD H ;HIGH ORDER * 2
|
||
DAD H ;HIGH ORDER * 4
|
||
RLC ;MOVE HIGH TWO BITS OF LOW BYTE
|
||
RLC ;TO POSITION IN A
|
||
ANI 11B ;MASK TO REPLACE LOW BITS OF H,L
|
||
ORA L
|
||
MOV L,A
|
||
RET
|
||
;
|
||
CRLF: ;SEND CRLF CHARACTERS
|
||
MVI A,CR
|
||
CALL PCHAR
|
||
MVI A,LF
|
||
CALL PCHAR
|
||
RET
|
||
;
|
||
PRINT: ;PRINT MESSAGE IN D,E 'TIL FIRST ZERO
|
||
LDAX D
|
||
ORA A
|
||
RZ
|
||
; MORE TO PRINT
|
||
INX D
|
||
PUSH D
|
||
CALL PCHAR
|
||
POP D
|
||
JMP PRINT
|
||
;
|
||
; PRINCIPAL PROCESSORS
|
||
SETUP: ;ARRIVE HERE FROM THE RELOCATOR, SET UP JUMPS
|
||
LHLD BDOSE+1 ;PRIMARY ENTRY TO BDOS
|
||
SHLD HISTO+1 ;CHANGE JUMP AT BASE OF THIS MODULE
|
||
LXI H,HISTO ;CHANGE BDOS ENTRY ADDRESS
|
||
SHLD BDOSE+1 ;INITIAL JUMP ADDRESS CHANGED
|
||
;
|
||
; THE PRIMARY BDOS ENTRY ADDRESS NOW REFLECTS THE ADDITION
|
||
; OF THE TRACE MODULE, THE SYMBOL TABLE HAS BEEN INCLUDED
|
||
; AT THE BEGINNING OF THE MODULE, AND ITS LENGTH WILL BE
|
||
; RETURNED WITH THE "INITIAL" CALL IN REGS DE
|
||
JMP INITIAL
|
||
;
|
||
INERR: LXI D,ERMSG
|
||
CALL PRINT
|
||
;
|
||
INITIAL:
|
||
LXI D,BOUNDS ;SEND STARTING MESSAGE
|
||
CALL PRINT
|
||
CALL GETBUFF ;GET BUFFER FULL FOR BOUNDS SCAN
|
||
CALL SCANEXP ;SHOULD BE 2 PARAMETERS
|
||
JC INERR ;CANNOT BE ,X,X
|
||
CPI 2
|
||
JNZ INERR ;1,3?
|
||
CALL GETVAL ;FIRST PARAMTER TO H,L
|
||
SHLD LB ;LOWER BOUND SAVED
|
||
PUSH H ;COMPARED WITH UPPER BOUND LATER
|
||
CALL GETVAL ;UPPER BOUND
|
||
INX H
|
||
SHLD UB
|
||
POP D ;LOWER IN D,E UPPER IN H,L
|
||
XCHG
|
||
CALL DIFF ;UB>=LB?
|
||
JC INERR
|
||
; DIFFERENCE IN D,E - COMPUTE INCREMENT
|
||
XCHG
|
||
CALL SHR6 ;DIVIDE BY 64
|
||
SHLD INC
|
||
LXI H,HVEC ;CLEAR THE HISTGRAM VECTOR
|
||
MVI C,HSIZE*2
|
||
FILL0: MVI M,0
|
||
INX H
|
||
DCR C
|
||
JNZ FILL0
|
||
; VECTOR FILLED, GO BACK TO THE DEBUGGER
|
||
LXI D,INIMSG
|
||
CALL PRINT
|
||
LXI D,INIE
|
||
CALL PADDR ;INITIAL = XXXX
|
||
LXI D,COLMSG
|
||
CALL PRINT
|
||
LXI D,COLE
|
||
CALL PADDR ;COLLECT = XXXX
|
||
LXI D,DISMSG
|
||
CALL PRINT
|
||
LXI D,DISE
|
||
CALL PADDR ;DISPLAY = XXXX
|
||
LXI D,SYLEN ;NUMBER OF SYMBOLS
|
||
RET
|
||
;
|
||
;
|
||
;
|
||
COLLECT:
|
||
; CALLED FROM DEBUGGER WITH REGISTER C HOLDING THE OPERATOR
|
||
; CATEGORY (NOT USED HERE), AND D,E HOLDING THE PC
|
||
PUSH D ;SAVE THE PC
|
||
LHLD UB ;WITHIN THE RANGE LB - UB?
|
||
XCHG
|
||
CALL DIFF ;X = UB - PC
|
||
POP D
|
||
JC RET0 ;SKIP IF BELOW LB
|
||
LHLD LB
|
||
CALL DIFF ;X = PC - LB
|
||
JC RET0
|
||
;
|
||
; D,E HAS INDEX TO HIST VECTOR
|
||
MVI C,0 ;READY TO COUND INDEX TO PROPER ELEMENT IN HVEC
|
||
LHLD INC ;AMOUNT IN EACH CATEGORY
|
||
FINDCELL:
|
||
CALL DIFF ;X = X - INC
|
||
JC FOUND
|
||
INR C ;TO NEXT HVEC ELEMENT
|
||
JMP FINDCELL
|
||
;
|
||
; REG C HAS INDEX TO HVECT
|
||
FOUND:
|
||
MVI B,0 ;BECOMES DOUBLE PRECISION
|
||
LXI H,HVEC
|
||
DAD B
|
||
DAD B ;HVECT(X)
|
||
MOV E,M ;OLD VALUE OF HVEC(X)
|
||
INX H
|
||
MOV D,M ;TO D,E, READY FOR INCREMENT
|
||
INX D ;COUNT UP BY ONE, CHECK FOR 0FFFFH
|
||
MOV M,D
|
||
DCX H
|
||
MOV M,E ;REPLACED IN MEMORY
|
||
INX D ;0FFFFH GOES TO 0000H
|
||
MOV A,D
|
||
ORA E
|
||
JNZ RET0 ;NORMAL RETURN IF NOT 0FFFFH
|
||
;
|
||
; ONE CATEGORY FILLED, STOP EXECUTION
|
||
MVI A,1
|
||
RET
|
||
;
|
||
RET0: ;RETURN 0 TO CONTINUE COLLECTION
|
||
MVI A,0
|
||
RET
|
||
;
|
||
;
|
||
;
|
||
DISPLAY:
|
||
; DISPLAY THE HISTOGRAM COLLECTED SO FAR
|
||
; FIND LARGEST VALUE TO SCAL DIAGRAM
|
||
LXI H,HVEC
|
||
MVI C,HSIZE
|
||
LXI D,0 ;MAX SO FAR
|
||
LARG0: PUSH D ;SAVE LARGEST
|
||
MOV E,M
|
||
INX H
|
||
MOV D,M ;D,E HOLDS TEST ELEMENT
|
||
INX H ;READY FOR NEXT ELEMENT
|
||
XTHL ;LARGEST TO H,L ADDRESS TO STACK
|
||
PUSH D ;SAVE TEST
|
||
CALL DIFF ;X = TEST - LARGEST
|
||
POP D ;RESTORE TEST VALUE
|
||
XCHG ;LARGEST IN D,E - TEST IN H,L
|
||
JC LARG1 ;CARRY IF LARGEST > TEST
|
||
XCHG ;TEST GOES TO D,E
|
||
LARG1: DCR C ;COUNT LENGTH DOWN
|
||
POP H ;RECALL HVEC ADDRESS
|
||
JNZ LARG0 ;FOR ANOTHER TEST
|
||
;
|
||
; MAX IS IN D,E
|
||
XCHG ;TO H,L
|
||
PUSH H ;SAVE LARGEST FOR PRINTING BELOW
|
||
CALL SHR6 ;DIVIDE BY 64 FOR SCALING
|
||
INX H ;IN CASE OF REMAINDER
|
||
SHLD SCALE
|
||
LXI D,LARMSG
|
||
CALL PRINT
|
||
POP D ;RECALL LARGEST VALUE
|
||
CALL PADDR
|
||
XRA A ;CLEAR ZERCNT
|
||
STA ZERCNT
|
||
;
|
||
; NOW STEP THROUGH THE HIST VECTOR AND PRINT '*' FOR EACH LINE
|
||
LHLD LB
|
||
XCHG ;LOWER BOUND TO D,E
|
||
LXI B,HVEC ;BASE OF HIST VECTOR
|
||
DISP0: PUSH D ;SAVE CURRENT LINE ADDRESS
|
||
LHLD UB ;TEST FOR OVER THE TOP
|
||
CALL DIFF
|
||
POP D
|
||
JNC DISP1 ;NO CARRY IF CURRENT >= UB
|
||
; CHECK FOR MULTIPLE BLANK LINES AND PRINT .... INSTEAD
|
||
MOV H,B ;HIGH ORDER HVEC INDEX
|
||
MOV L,C ;LOW ORDER HVEC INDEX
|
||
MOV A,M ;LOW ORDER HVEC VALUE
|
||
INX H
|
||
ORA M ;VALUE = 0?
|
||
LXI H,ZERCNT
|
||
JNZ ZCHK1 ;VALUE IS NOT ZERO, PRINT LINE
|
||
; VALUE IS ZERO, ALREADY PRINTED?
|
||
MOV A,M ;GET ZERCNT
|
||
ORA A
|
||
JNZ ZCHK0 ;JUMP IF ALREADY PRINTED LINE
|
||
; NOT PRINTED YET, SET ZERCNT TO TRUE AND PRINT MSG
|
||
MVI M,0FFH
|
||
PUSH B
|
||
PUSH D
|
||
LXI D,PERMSG
|
||
CALL PRINT
|
||
POP D
|
||
POP B
|
||
ZCHK0: ;INCREMENT LINE ADDRESS
|
||
LHLD INC
|
||
DAD D
|
||
XCHG
|
||
; INCREMENT HVEC ADDRESS
|
||
INX B
|
||
INX B
|
||
JMP DISP0
|
||
;
|
||
ZCHK1: ;LINE IS NOT ZERO, FLAG IT AND CONTINUE
|
||
MVI M,0 ;ZERCNT SET FALSE
|
||
PUSH B ;INDEX TO HVEC SAVED
|
||
PUSH D ;CURRENT LINE SAVED
|
||
PUSH D ;ANOTHER COPY
|
||
CALL CRLF
|
||
POP D ;LINE ADDRESS TO DE
|
||
CALL PADDR ;PRINTED
|
||
POP D ;RECALL LINE ADDRESS
|
||
LHLD INC ;INCREMENT BETWEEN LINES
|
||
DAD D
|
||
XTHL ;LINE ADDRESS STACKED, INDEX TO HVEC IN HL
|
||
MOV E,M
|
||
INX H
|
||
MOV D,M
|
||
INX H
|
||
PUSH H ;SAVE UPDATED HVEC ADDRESS
|
||
CALL STARS ;PRINTS STARS FOR THIS LINE
|
||
POP B ;RECALL HVEC BASE
|
||
POP D ;RECALL CURRENT LINE
|
||
JMP DISP0
|
||
;
|
||
DISP1: ;END OF DISPLAY
|
||
CALL CRLF
|
||
RET ;RETURN TO DDT
|
||
;
|
||
STARS: ;PRINT STARS ACROSS LINE BASED ON SCALE VALUE
|
||
MOV A,E
|
||
ORA D
|
||
RZ ;RETURN IF ZERO STARS
|
||
PUSH D
|
||
MVI A,' '
|
||
CALL PCHAR
|
||
;
|
||
POP D
|
||
STAR0: ;LOOP PRINTING STARS
|
||
LHLD SCALE ;SCALING FACTOR
|
||
CALL DIFF ;X = SIZE - SCALE
|
||
RC
|
||
PUSH D ;SAVE REMAINING LENGTH
|
||
MVI A,'*'
|
||
CALL PCHAR
|
||
POP D
|
||
JMP STAR0
|
||
;
|
||
;
|
||
; DATA AREAS
|
||
ERMSG: DB CR,LF,'ERROR - FORM IS X,Y',0
|
||
BOUNDS: DB CR,LF,'TYPE HISTOGRAM BOUNDS ',0
|
||
LARMSG: DB CR,LF,'HISTOGRAM:'
|
||
DB CR,LF,'ADDR RELATIVE FREQUENCY, LARGEST VALUE = ',0
|
||
INIMSG: DB CR,LF,'.INITIAL = ',0
|
||
COLMSG: DB CR,LF,'.COLLECT = ',0
|
||
DISMSG: DB CR,LF,'.DISPLAY = ',0
|
||
PERMSG: DB CR,LF,'....',0
|
||
ZERCNT: DS 1
|
||
LB: DS 2 ;LOWER BOUND
|
||
UB: DS 2 ;UPPER BOUND
|
||
HVEC: DS HSIZE*2 ;HISTOGRAM VECTOR
|
||
SCALE: DS 2 ;SCALE FACTOR
|
||
INC: DS 2 ;INCREMENT BETWEEN LINES
|
||
NOP
|
||
END HISTO
|
||
|