home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
SYSLIB
/
SLIB3.LBR
/
SPAUSE.Z80
< prev
next >
Wrap
Text File
|
2000-06-30
|
3KB
|
121 lines
;
; SYSLIB Module Name: SPAUSE
; Author: Richard Conn
; SYSLIB Version Number: 3.6
; Module Version Number: 1.1
public pause
;
; 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
;
;
; EQUATES
;
BOOT EQU 0 ; WARM BOOT ADDRESS
CS$OFF EQU 6 ; CONSOLE STATUS OFFSET
CIN$OFF EQU 9 ; CONSOLE INPUT OFFSET
;
; 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 HL ; SAVE REGS [4*11 = 44]
PUSH DE
PUSH BC
PUSH AF
LD C,B ; SAVE PROCESSOR SPEED IN C [5]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE INITIAL OVERHEAD = 49 CYCLES
;
PAUSL:
LD B,C ; GET PROCESSOR SPEED [5]
PAUSL1:
LD DE,TIME ; GET DELAY CONSTANT [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT PART OF THE PROCESSOR SPEED OVERHEAD = 15
;
PAUSL2:
EX (SP),HL ; LONG INSTRUCTION FOR DELAY [6*18 = 108]
EX (SP),HL
EX (SP),HL
EX (SP),HL
EX (SP),HL
EX (SP),HL
DEC DE ; COUNT DOWN INNER-MOST LOOP [5]
LD A,D ; DONE? [5]
OR E ; [4]
JP NZ,PAUSL2 ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE MAJOR OVERHEAD = TIME*(108+5+5+4+10)
; = TIME*132
;
DEC B ; COUNT DOWN 10TH-SEC LOOP [5]
JP NZ,PAUSL1 ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE REST OF THE PROCESSOR SPEED OVERHEAD
; = 15
;
DEC HL ; COUNT DOWN N 10THS LOOP [5]
LD A,H ; DONE? [5]
OR L ; [4]
JP NZ,PAUSL ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE N-COUNT OVERHEAD = 24 CYCLES
;
POP AF ; RESTORE REGS [4*10 = 40]
POP BC
POP DE
POP HL
RET ; [10]
;
; THE ABOVE INSTRUCTIONS REPRESENT THE TERMINATING OVERHEAD = 50 CYCLES
;
END