; BOOT LOADER CODE
;REBASE HIGHER LINK/BOT:140000 BOOT
;WANT PERFORMANCE COUNTER - CLOCK TICKS TO DO SOMETHING?

START:  RESET
    CLR @#177776
    MOV #START,SP
    CLR @#177564
    MOV #BANNER,R0
    JSR PC,PRINT
    MOV #CLKAST,@#100
    MOV #340,@#102
    BIS #100,@#177546 ;SET CLOCK TICKING

    MOV #PROMPT,R0
    JSR PC,PRINT
    SUB #256,SP
    MOV SP,R0
    JSR PC,INPUT
    CLR R0
1$: WAIT
    INC R0
    TST LGHTON
    BEQ 1$
    MOV #054000,-(SP) ; SUPER PRIORITY 0 ALT REG
    MOV LGHTON,-(SP)  ; CALL SUPER LOOP START
    RTT

LGHTON: .WORD 0
CLKTIC: .WORD 0
CLKAST:
    INC CLKTIC
    RTT

ONECHR:
    TSTB @#177564
    BPL ONECHR
    MOVB R0,@#177566
    RTS PC

PRTPTR: .WORD 0
PRINT:
    BITB #100,@#177564
    BNE PRINT
    MOV R0,PRTPTR
    MOV #PRTAST,@#64
    MOV #200,@#66
    BISB #100,@#177564
    RTS PC

PRTAST:
    TSTB @PRTPTR
    BEQ 2$
    MOVB @PRTPTR,@#177566
    INC PRTPTR
    RTT
2$: CLRB @#177564
    RTT

BUFFER: .WORD 0 ;INPUT BUFFER POINTER
LENGTH: .WORD 0 ;INPUT BUFFER LENGTH

INPUT:
    MOV R0,BUFFER
    CLR LENGTH
    MOV #INPAST,@#60
    MOV #200,@#62
    BISB #100,@#177560
    RTS PC

INPAST:
    MOV R0,-(SP)
    MOVB @#177562,R0
    CMPB R0,#15
    BEQ 7$ ; CARRIAGE RETURN
    CMPB R0,#127.
    BEQ 2$ ; <DEL>
    CMPB R0,#10
    BNE 4$ ; BACK SPACE
2$: TST LENGTH ; DATA IN BUFFER?
    BEQ 3$
    DEC LENGTH ; LENGTH
    MOV #DEL,R0
    JSR PC,PRINT
3$: BR 9$
4$: CMPB R0,#40
    BLT 9$ ; BELOW SPACE
    CMPB R0,#177
    BGE 9$ ; SKIP STUFF TOO BIG
    JSR PC,ONECHR ; ECHO CHAR
    CMPB R0,#172
    BGT 5$; ABOVE Z
    CMPB R0,#141
    BLT 5$ ; BELOW A
    BICB #40,R0 ; CONVERT TO UPPER CASE
5$: CMP LENGTH,#254
    BGE 9$
    MOVB R0,-(SP)
    MOV BUFFER,R0
    ADD LENGTH,R0
    MOVB (SP)+,(R0)
    INC LENGTH
    BR 9$

7$: MOV BUFFER,R0
    ADD LENGTH,R0
    CLRB (R0)
    MOV #CMD,@#240 ; CALL CMD AT PRIORITY 2
    MOV #100,@#242
    MOV #2000,@#177772
9$: MOV (SP)+,R0
    RTT

CMD:
    CLR @#177772   ; NO MORE PIR CALLS
    MOV R0,-(SP)
    MOV R1,-(SP)
    MOV R2,-(SP)
    MOV R3,-(SP)
    MOV R4,-(SP)
    MOV #EOL,R0
    JSR PC,PRINT
1$: BITB #100,@#177564
    BNE 1$
    CLR R4
    MOV #CMDLST,R3 ; CMD LIST
3$: MOVB (R3)+,R0
    BEQ 13$
    MOV BUFFER,R2 ; USER CMD
4$: MOVB (R2)+,R1
    BEQ 15$ ; NULL COMMAND?
    CMPB R1,#40
    BEQ 4$ ; SKIP SPACE
5$: CMPB R0,R1
    BNE 7$
    MOVB (R3)+,R0
    BEQ 9$
    MOVB (R2)+,R1
    BEQ 9$
    CMPB R1,#40
    BNE 5$
    BR 9$
7$: MOVB (R3)+,R0
    BNE 7$
    INC R4
    BR 3$
9$: ASL R4
    JSR PC,@CMDTBL(R4) ;EXECUTE
    BR 15$

13$:MOV #UNKMSG,R0
    JSR PC,PRINT

15$:CLR LENGTH
    MOV #PROMPT,R0
    JSR PC,PRINT
    MOV (SP)+,R4
    MOV (SP)+,R3
    MOV (SP)+,R2
    MOV (SP)+,R1
    MOV (SP)+,R0
    RTT


CMDTBL: .WORD BOOT,HALT,TEST,DIAG,LIGHTS,HELP
HLPMSG: .ASCIZ 'COMMANDS ARE BOOT, HALT, TEST, DIAG, LIGHTS AND HELP'<15><12>'BOOT DEVICES ARE RK? RL? RP? OR TM?'<15><12>
EOL:    .BYTE 15,12,0
DEL:    .BYTE 10,40,10,0;
CMDLST: .ASCIZ 'BOOT'
        .ASCIZ 'HALT'
        .ASCIZ 'TEST'
        .ASCIZ 'DIAG'
        .ASCIZ 'LIGHTS'
        .ASCIZ 'HELP'
        .BYTE 0
UNKMSG: .ASCIZ 'UNKNOWN COMMAND'<12><15>
BANNER: .ASCIZ 'PAUL NANKERVIS - PAULNANK@HOTMAIL.COM'<12><15><12><15>
PROMPT: .ASCIZ 'BOOT> '
BADBOO: .ASCIZ 'UNKNOWN BOOT DEVICE'<12><15>
PERMSG: .ASCIZ '      CLOCK TICKS'<12><15>
LOOMSG: .ASCIZ '      ITERATIONS'<12><15>

        .EVEN

HELP:
    MOV #HLPMSG,R0
    JSR PC,PRINT
    RTS PC

HALT:
    HALT
    MOV #EOL,R0
    JSR PC,PRINT
    RTS PC

TEST:
    CLR CLKTIC

    MOV #15000,R5
10$:MOV R5,@#177570 ; DISPLAY
    MOV R5,R4
    ASR R4
15$:CLR R0
    MOV R5,R1
    DIV R4,R0
    MOV R0,R2
    MUL R4,R2
    ADD R3,R1
    CMP R1,R5
    BEQ 20$
    HALT
20$:SOB R4,15$
    SOB R5,10$

    MOV #PERMSG+5,R0
    MOV CLKTIC,R3

25$:CLR R2
    DIV #10,R2
    ADD #'0,R3
    MOVB R3,-(R0)
    MOV R2,R3
    BNE 25$

    JSR PC,PRINT
    RTS PC

LOOCNT: .WORD 0

DIAG:
    CLR LOOCNT
    CLR CLKTIC
DIAGLP:
    CLR R5
    BMI L1
    BVS L1
    BHI L1
    BLT L1
    BLOS L2
L1: HALT

L2: DEC R5
    BPL L3
    BEQ L3
    BGE L3
    BLE L4
L3: HALT

L4: ROR R5
    BVC L5
    BCC L5
    BNE L6
L5: HALT

L6: MOVB #17,@#177776
    BPL L7
    BVC L7
    BLT L7
    BHI L7
    BMI L8
L7: HALT

L8: MOV #77777,R3
    ADD #77777,R3
    CMPB @#177776,#5
    BNE L9
    HALT

L9: MOVB #1700,R4
    BPL L10
    CMP R4,#177700
    BEQ L11
L10: HALT

L11: CLRB R4
    CMP R4,#177400
    BEQ L12
    HALT

L12: MOV #125252,R5
    MOV R5,R0
    MOV R0,R1
    MOV R1,R2
    MOV R2,R3
    MOV R3,R4
    MOV R4,R5
    SUB R5,R1
    BLT NODIAG
    BEQ L13
NODIAG: HALT

L13: ROL R2
    BCC L14
    BLT L15
L14: HALT

L15: ADD R2,R3
    INC R3
    COM R3
    ADD R3,R1
    BCS L16
    BLE L17
L16: HALT

L17: ROR R4
    BIS R4,R3
    ADD R5,R3
    INC R3
    BCS L18
    DEC R1
    BLT L19
L18: HALT

L19: COM R0
    BLOS L20
    HALT

L20: BIC R0,R1
    ADD R1,R1
    BGT L21
    BLE L22
L21: HALT

L22: SWAB R1
    CMP R1,#052125
    BNE L23
    BIT R4,R5
    BGT L23
    COM R5
    BNE L24
L23: HALT

L24: MOVB #177401,R0
    BPL L26
L25: HALT

L26: SOB R0,L25
    CLR R1
L27: INC R1
    SOB R0,L27
    TST R0
    BNE L28
    TST R1
    BEQ L29
L28: HALT

L29: MOV #N1,PC
    HALT

N1: TST (PC)+
    HALT

N2: MOV #N3,-(SP)
    RTS PC
    HALT

N3: CLR -(SP)
    MOV #N4,-(SP)
    RTI
    HALT

N4: JMP @#N5
    HALT

N5: MOV #3,R5
    CLR @#6
    MOV #N6,@#4
    TST -(R5)
    HALT
N6: ADD #4,SP

    CLR R0
    MOV #7777,R1
N7: MOV R0,R2
    ADD #5,R2
    CMP (R0)+,-5(R2)
    BEQ N8
    HALT
D1: .WORD 0

N8: SOB R1,N7

    INC LOOCNT
    BCC 10$
    HALT
10$: CMP CLKTIC,#2200
    BHI 20$
    JMP DIAGLP
20$:MOV #LOOMSG+5,R0
    MOV LOOCNT,R3

25$:CLR R2
    DIV #10,R2
    ADD #'0,R3
    MOVB R3,-(R0)
    MOV R2,R3
    BNE 25$

    JSR PC,PRINT
    RTS PC

MMR0=177572
MMR1=177574
MMR2=177576
MMR3=172516

LIGHTS:
    MOV #77406,R3        ;DEFAULT PDR
    CLR R2
    CLR R1
    MOV #8.,R0
1$: MOV R3,172300(R1) ;KERNEL I PDR
    MOV R2,172340(R1) ;KERNEL I PAR
    MOV R3,172320(R1) ;KERNEL D PDR
    MOV R2,172360(R1) ;KERNEL D PAR
    MOV R3,172200(R1) ;SUPER I PDR
    MOV R2,172240(R1) ;SUPER I PAR
    MOV R3,172220(R1) ;SUPER D PDR
    MOV R2,172260(R1) ;SUPER D PAR
    MOV R3,177600(R1) ;USER I PDR
    MOV R2,177640(R1) ;USER I PAR
    MOV R3,177620(R1) ;USER D PDR
    MOV R3,177660(R1) ;USER D PAR
    ADD #200,R2
    ADD #2,R1
    SOB R0,1$
    BIS #176000,@#172376 ; KERNEL D POINTS TO I/O SPACE
    BIS #176000,@#172276 ; SUPER D POINTS TO I/O SPACE
    BIS #176000,@#177676 ; USER D POINTS TO I/O SPACE
    MOV #77,@#MMR3       ; 77 FOR 22 BIT
    MOV #1,@#MMR0

    MOV #1700,@#172244   ; BASE SUPER I (PAR 2) #40000 AT #170000
    MOV #1700,@#172264   ; BASE SUPER D (PAR 2) #40000 AT #170000
    MOV #010000,@#177776 ; SET PM TO SUPER

    MOV #40200,R3        ; SUPER CODE ADDRESS
    MOV #SUPERS,R2       ; ADDRESS SUPER CODE
10$:MOV (R2)+,-(SP)
    MTPI (R3)+
    CMP R2,#SUPERE
    BLO 10$

    MOV #40200,LGHTON    ;CHANGE IDLE TASK
    RTS PC


;TO BE COPIED TO SUPER #40200 AT PHYSICAL #170000
;#40000 TO #40200 FOR WAIT & JMP INSTRUCTIONS
SUPERS:
    MOV #37,R0      ;LOAD PATTERN
    MOV #174000,R1
    BIT #1,@#177570
    BEQ 10$
    MOV #7417,R0
    MOV R0,R1
    COM R1
    BIT #2,@#177570
    BEQ 10$
    MOV #36163,R0
    MOV #37000,R1
10$:MOV R1,R2
    SUB #2,R2
    BIC #1,R2   ;WAIT ADDRESS
    MOV R2,R3
    BIC #177701,R3 ;ADDRESS OFFSET
    MOV #0000001,40000(R3)  ; WRITE WAIT
    ADD #2,R3
    MOV #0000113,40000(R3)  ; WRITE JMP (R3)

    MOV R2,R4
    ASH #-6,R4
    BIC #177600,R4
    MOV #1700,R5
    SUB R4,R5     ;PAR ADDRESS BASE FOR WAIT
    MOV R2,R4
    ASH #-12.,R4
    BIC #177761,R4 ;PAR SELECT OFFSET
    MOV R5,172240(R4) ;SUPER I SPACE

    MOV R1,R3
    ASH #-12.,R3
    BIC #177761,R3 ;PAR SELECT OFFSET
    CMP R3,R4       ;SAME PAR
    BEQ 30$
    MOV R1,R4
    ASH #-6,R4
    BIC #177600,R4
    MOV #1700,R5
    SUB R4,R5     ;PAR ADDRESS BASE FOR JMP
    MOV R5,172240(R3) ;SUPER I SPACE
30$:
    MOV #3,R4
    ADD @#177570,R4
    MOV #2,R3
    ADD PC,R3
40$:JMP (R2)
    SOB R4,40$
    MOV R0,R2
    ROR R2 ;ROTATE PATTERN
    ROL R1
    ROR R0
    BR 10$
SUPERE:


BOOT:
    CLR R3 ;UNIT
1$: MOVB (R2)+,R1
    BEQ BOOTRK ;DEFAULT DEVICE IS RK0
    CMPB R1,#40
    BEQ 1$
    CMPB R1,#'R
    BEQ 5$
    
    CMPB R1,#'T
    BNE 4$
    MOVB (R2)+,R1
    CMPB R1,#'M
    BEQ 7$
    
4$: MOV #BADBOO,R0
    JSR PC,PRINT
    RTS PC

5$: MOVB (R2)+,R1 ; HOPEFULLY K, L OR P
7$: MOVB (R2)+,R0 ; DIGIT
    BEQ 9$
    CMPB R0,#40
    BEQ 9$
    CMPB R0,#'7
    BGT 11$
    SUB #'0,R0
    BLT 11$
    ASL R3
    ASL R3
    ASL R3
    BIS R0,R3 ;PUT DIGIT INTO UNIT
    BR 7$
9$: CLR R2
    MOV #137,(R2)+
    MOV #START,(R2)+
    MOV #START,(R2)+
    CLR (R2)+
    CMPB R1,#'K
    BEQ BOOTRK
    CMPB R1,#'L
    BEQ BOOTRL
    CMPB R1,#'P
    BEQ BOOTRP
    CMPB R1,#'M
    BEQ BOOTTM

11$:MOV #UNKMSG,R0
    JSR PC,PRINT
    RTS PC

RLCS=174400
BOOTRL:
    RESET
    SWAB R3                 ; UNIT NUMBER
    MOV #RLCS,R1    ; CSR
    MOV #13,4(R1)   ; CLR ERR
    BIS #4,R3               ; UNIT+GSTAT
    MOV R3,(R1)             ; ISSUE CMD
    TSTB (R1)               ; WAIT
    BPL .-2
    CLRB R3
    BIS #10,R3              ; UNIT+RDHDR
    MOV R3,(R1)             ; ISSUE CMD
    TSTB (R1)               ; WAIT
    BPL .-2
    MOV 6(R1),R2    ; GET HDR
    BIC #77,R2              ; CLR SECTOR
    INC R2                  ; MAGIC BIT
    MOV R2,4(R1)    ; SEEK TO 0
    CLRB R3
    BIS #6,R3               ; UNIT+SEEK
    MOV R3,(R1)             ; ISSUE CMD
    TSTB (R1)               ; WAIT
    BPL .-2
    CLR 2(R1)               ; CLR BA
    CLR 4(R1)               ; CLR DA
    MOV #-512.,6(R1) ; SET WC
    CLRB R3
    BIS #14,R3              ; UNIT+READ
    MOV R3,(R1)             ; ISSUE CMD
    TSTB (R1)               ; WAIT
    BPL .-2
    BIC #377,(R1)
    CLR R2
    CLR R3
    CLR R4
    CLR R5
    CLR PC

RKDA=177412
READGO=5
BOOTRK:
    RESET
    SWAB R3         ; UNIT NUMBER
    ASL R3
    ASL R3
    ASL R3
    ASL R3
    ASL R3
    MOV #RKDA,R1    ; CSR
    MOV R3,(R1)             ; LOAD DA
    CLR -(R1)               ; CLEAR BA
    MOV #-256.*2,-(R1) ; LOAD WC
    MOV #READGO,-(R1) ; READ & GO
    CLR R2
    CLR R3
    CLR R4
    CLR R5
    TSTB (R1)
    BPL .-2
    CLRB (R1)
    CLR PC

RPCSR=0176700
BOOTRP:
    RESET
    MOV #RPCSR, R1
    MOV #0000040, 10(R1) ; RESET
    MOV R3, 10(R1)       ; SET UNIT
    MOV #0000021, (R1)    ; PACK ACK
    MOV #0010000, 32(R1)  ; 16B MODE
    MOV #-512., 2(R1)    ; SET WC
    CLR 4(R1)            ; CLR BA
    CLR 6(R1)            ; CLR DA
    CLR 34(R1)           ; CLR CYL
    MOV #0000071, (R1)   ; READ
    TSTB (R1)            ; WAIT
    BPL .-2
    CLRB (R1)
    MOV R3,R0
    CLR PC
    

MTCMA=0172526
BOOTTM:
    RESET
    MOV R3, R0          ; UNIT
    MOV #MTCMA, R1      ; MTCMA
99$:CLR (R1)
    MOV #-1, -(R1)      ; MTBRC
    MOV R0,R2
    SWAB R2
    ADD #60011, R2
    MOV R2, -(R1)       ; SPACE + GO
    TSTB (R1)           ; MTC
    BPL .-2
    MOV R0,R2
    SWAB R2
    ADD #60003, R2
    MOV R2, (R1)        ; READ + GO
    TSTB (R1)           ; MTC
    BPL .-2
    CLR R2
    CLR R3
    MOV #99$, R4        ; POINT PAST ADDRESS MTCNA
    CLR R5
    CLR PC

    .END START
