On Dec 31, 2017, at 10:21 AM, Paul Koning via cctalk
<cctalk at classiccmp.org> wrote:
...
Ah; it must busy loop at loops spread across the address space? Clever!
(Perhaps using the mapping hardware so that it doesn't use too much _actual_
memory.) Is the source available?
Correct, it uses the MMU so it only needs 64 bytes of table space to get the low order
bits right. See attached.
Ok, so the list stripped the attachment. Try it this way.
paul
.INCLUDE /CMN:COMMON/
TITLE LIGHTS,<FANCY NULL JOB>,0A,10-MAY-91,MHB/ABC/WBN
;
; COPYRIGHT (c) 1974, 1991 BY
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
; TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
; CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
;
.SBTTL EDIT HISTORY FOR LIGHTS
;+
;
; 000 RRF 06-MAR-81 CREATION - COPIED FROM V7.0-07
;
;-
DEFORG LIGHTS
.SBTTL A FANCY NULL JOB
; NEEDED DEFINITIONS
SISDR0 = 172200 ;SUPERVISOR INSTRUCTION DESC REG 0
SISAR0 = 172240 ;SUPERVISOR INSTRUCTION ADDR REG 0
PS = 177776 ;PROCESSOR STATUS
ORG NULJOB
; INITIAL ENTRY POINT
NULJOB: BIT #004000,@#PS ;DO WE HAVE SUPERVISOR MODE (2 REG SETS)?
BNE 30$ ;YES, DO IT FANCY...
; THE SIMPLE NULL JOB
10$: MOV R2,R1 ;RELOAD THE WAIT COUNTER
20$: WAIT ;DISPLAY THE LIGHTS (R0) A WHILE
SOB R1,20$ ;KEEP WAITING
ROL R0 ;ELSE SHIFT PATTERN 1 PLACE LEFT
BR 10$ ; AND AROUND AGAIN...
; FANCY NULL JOB SETUP
30$: MOV #176000,R3 ;PRE-SET THE MEM ADR LIGHT PATTERN
MOV (PC)+,R4 ;GET DESC REG VALUE FOR
.BYTE 4!2,128.-1 ; R/W AND 4K
MOV #SISDR0,R5 ;POINT TO SUPERVISOR DESC REGS
MOV R4,(R5)+ ;LOAD SISDR0 WITH 4K AND R/W
MOV R4,(R5)+ ;LOAD SISDR1 WITH 4K AND R/W
MOV R4,(R5)+ ;LOAD SISDR2 WITH 4K AND R/W
MOV R4,(R5)+ ;LOAD SISDR3 WITH 4K AND R/W
MOV #177600,SISAR0-SISDR0(R5) ;LOAD PAR4 FOR THE I/O PAGE
MOV R4,(R5)+ ;LOAD SISDR4 WITH 4K AND R/W
MOV #40$,R1 ;FORM A MMU ADDRESS
ASH #-6,R1 ; THAT WILL MAP OUR CODE
BIC #^C<001777>,R1 ; IN SUPERVISOR MODE
MOV R1,SISAR0-SISDR0(R5) ;LOAD MMU ADDRESS FOR PAR5 (CODE)
MOV (PC)+,(R5)+ ;LOAD SISDR5 WITH
.BYTE 2,128.-1 ; R-O AND 4K
CLR (R5)+ ;LOAD SISDR6 WITH "ABORT"
MOV R4,(R5)+ ;LOAD SISDR7 WITH 4K AND R/W
MOV #000340,@#PS ;;;WE CAN'T AFFORD AN INTERRUPT HERE
MOV #054040,-(SP) ;;;NEW PS OF SUPERVISOR MODE @ PR1
MOV #40$,-(SP) ;;;NEW PC OF OUR ROUTINE
BIC #^C<77>,(SP) ;;; CORRECTED FOR RUNNING
BIS #120000,(SP) ;;; OUT OF PAR5
RTI ;;;DROP INTO SUPERVISOR MODE!!!
; THE FANCY NULL JOB
40$: MOV R3,R1 ;COPY PATTERN FOR MEM ADR LIGHTS
BIC #^C<077776>,R1 ; AND ENSURE AN HONEST ADDRESS
CLR R4 ;CLEAR A HIGH ORDER
MOV R1,R5 ; AND SET LOW ORDER AS ADDRESS
ASHC #3,R4 ;EXTRACT THE APR #
ASL R4 ; AND FORM APR # TIMES 2
ADD #SISAR0-160000+100000,R4 ;FIND PAR TO USE (I/O PAGE = PAR4)
ASH #-3,R5 ;CORRECT THE VIRTUAL ADDRESS
BIC #^C<017700>,R5 ; AND ISOLATE OFFSET WITHIN PAR
NEG R5 ;SUBTRACT OFFSET WITHIN PAR
ADD #70$,R5 ; FROM OUR WORK TABLE
ASH #-6,R5 ;FIND THAT AS A MMU ADDRESS
BIC #^C<001777>,R5 ; WITH NO SIGN EXTENSION
MOV R5,(R4) ;LOAD CORRECT PAR WITH CORRECT ADDRESS
BIT R4,#16 ;ARE WE USING PAR0?
BNE 50$ ;NO
ADD #20,R4 ;YES, CORRECT FOR PAR7 NEXT
50$: SUB #200,R5 ;GO BACKWARDS 4K
MOV R5,-(R4) ; AND LOAD NEXT LOWER PAR WITH THAT
MOV (PC)+,(R1) ;LOAD THE RETURN INSTRUCTION
JMP (R4) ; WHICH IS JUMP THROUGH R4
MOV (PC)+,-(R1) ;LOAD THE WAITING INSTRUCTION
WAIT ; WHICH IS WAIT
MOV R2,R5 ;REFRESH WAIT COUNTER
MOV PC,R4 ;SET THE RETURN ADDRESS
CMP (R4)+,(R4)+ ; FOR WAITING DONE (PIC)
60$: JMP (R1) ;GO OFF AND DISPLAY LIGHTS...
SOB R5,60$ ;DO UNTIL TIME'S UP
ASL R0 ;SHIFT LIGHTS 1 PLACE LEFT
ROR R3 ; AND BACK THROUGH MEMORY LIGHTS
ADC R0 ; WITH A CARRY
BR 40$ ;FROM THE TOP...
.BLKB 100 ;RESERVE WORK SPACE
70$: .BLKB 100 ;RESERVE WORK SPACE
.END