home *** CD-ROM | disk | FTP | other *** search
- ;
- ; SYSLIB Module Name: SPAUSE
- ; Author: Richard Conn
- ; SYSLIB Version Number: 2.0
- ; Module Version Number: 1.0
- ; Module Entry Points:
- ; PAUSE
- ; Module External References:
- ; None
- ;
-
- ;
- ; 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 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
- ;
-
- END
-