;
; PAUSE -- Pause N 10ths of a Second
; PAUSE will simply enter a delay loop for N 10ths of a Second.
;
; Input Parameters: HL = Number of 10ths of a Second to Pause
; B = Processor CLock Speed (in MHz)
; Output Parameters: None
; Registers Affected: None
; SYSLIB Routines Called: None
; Special Error Conditions: None
;
;
; PAUSE ROUTINE
; HL = N 10THS OF A SEC, B = PROCESSOR SPEED
;
; COMPUTATION OF TIME DELAY CONSTANT:
; INITIAL OVERHEAD 49 CYCLES
; TERMINATING OVERHEAD 50 CYCLES
; PROCESSOR SPEED (P) (10+15)*P CYCLES
; MAJOR OVERHEAD TIME*132 CYCLES
; N-COUNT OVERHEAD (5+24)*N CYCLES
; ** REQUIRED TOTAL ** 100,000 CYCLES (1/10 SEC AT P=1)
;
; SINCE THIS IS A GUESTIMATE ANYWAY AND PROCESSOR SPEED WILL NOT BE EXACTLY
; P MHZ, I WILL THROW OUT THE PROCESSOR SPEED DELAY (AT MOST 100 CYCLES)
;
; CALCULATIONS: 100,000 = 49 + 50 + TIME*132 + 29*N
; TIME = (100,000 - 49 - 50 - 29*N)/132
; TIME = (99,901 - 29*N)/132
; CHART:
; N TIME
; 1 757 1/10 SEC
; 2 756
; 3 756
; 4 756
; 5 756 1/2 SEC
; 10 755 1 SEC
; 15 754
; 20 752 2 SECS
; 25 751
; 50 746 5 SECS
; 100 735 10 SECS
; 500 647 50 SECS
;
; SINCE MOST CALLS TO THIS ROUTINE WILL REQUIRE BETWEEN 1/10 AND 5 SECS,
; I SHALL SELECT AN "AVERAGE" TIME CONSTANT OF (757+746)/2 = 752
; SINCE AN "AVERAGE" CLOCK IS 2+ OR 4+ MHZ, I SHALL FUDGE THIS (THRU PRACTICE)
; TO 740
;
TIME EQU 700 ; TIME CONSTANT
PAUSE::
PUSH H ; SAVE REGS [4*11 = 44]
PUSH D
PUSH B
PUSH PSW
MOV C,B ; SAVE PROCESSOR SPEED IN C [5]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE INITIAL OVERHEAD = 49 CYCLES
;
PAUSL:
MOV B,C ; GET PROCESSOR SPEED [5]
PAUSL1:
LXI D,TIME ; GET DELAY CONSTANT [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT PART OF THE PROCESSOR SPEED OVERHEAD = 15
;
PAUSL2:
XTHL ; LONG INSTRUCTION FOR DELAY [6*18 = 108]
XTHL
XTHL
XTHL
XTHL
XTHL
DCX D ; COUNT DOWN INNER-MOST LOOP [5]
MOV A,D ; DONE? [5]
ORA E ; [4]
JNZ PAUSL2 ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE MAJOR OVERHEAD = TIME*(108+5+5+4+10)
; = TIME*132
;
DCR B ; COUNT DOWN 10TH-SEC LOOP [5]
JNZ PAUSL1 ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE REST OF THE PROCESSOR SPEED OVERHEAD
; = 15
;
DCX H ; COUNT DOWN N 10THS LOOP [5]
MOV A,H ; DONE? [5]
ORA L ; [4]
JNZ PAUSL ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE N-COUNT OVERHEAD = 24 CYCLES
;
POP PSW ; RESTORE REGS [4*10 = 40]
POP B
POP D
POP H
RET ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE TERMINATING OVERHEAD = 50 CYCLES
;