> On Dec 31, 2017, at 10:21 AM, Paul Koning via cctalk <[email protected]>
> 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