1
0
mirror of https://github.com/livingcomputermuseum/UniBone.git synced 2026-04-30 21:39:57 +00:00
Files
livingcomputermuseum.UniBone/10.02_devices/5_boot/dl.lst

102 lines
6.1 KiB
Plaintext

1 .title M9312 'DL' BOOT prom for RL11 controller
2
3 ; This source code is a modified copy of the DEC M9312 23-751A9 boot PROM.
4 ;
5 ; This boot PROM is for the RL11 controller with RL01/RL02 drives.
6 ;
7 ; Multiple units and/or CSR addresses are supported via different entry points.
8 ;
9
10 174400 rlcsr =174400 ; std RL11 csrbase
11
12 000000 rlcs =+0 ; control/status
13 000002 rlba =+2 ; bus address
14 000004 rlda =+4 ; disk address
15 000006 rlmp =+6 ; multipurpose
16
17 000004 cmstat =2*2 ; get status
18 000006 cmseek =3*2 ; seek
19 000010 cmrdhd =4*2 ; read header
20 000014 cmrdda =6*2 ; read data
21
22 .asect
23 ; ---- Simple boot drive 0 from 0
24 000000 . = 0
25 000000 000137 010000 jmp @#start0
26
27 ; ---- Reboot drive 0 on power event
28 000024 . = 24 ; Power ON/OFF
29 000024 010000 .word start0 ; PC
30 000026 000340 .word 340 ; PSW priority level 7
31
32
33 ; ----- Main boot addresses
34 010000 .=10000 ; arbitrary position > 3000
35
36 start:
37 ; 4 unit numbers => 4 entry addresses
38 start0:
39 010000 012700 000000 mov #0,r0
40 010004 000413 br dlnr
41 010006 000240 nop
42 start1:
43 010010 012700 000001 mov #1,r0
44 010014 000407 br dlnr
45 010016 000240 nop
46 start2:
47 010020 012700 000002 mov #2,r0
48 010024 000403 br dlnr
49 010026 000240 nop
50 start3:
51 010030 012700 000003 mov #3,r0
52
53 dlnr:
54 010034 012701 174400 mov #rlcsr,r1 ; boot std csr, unit <R0>
55
56 ; --------------------------------------------------
57
58 010040 010003 mov r0,r3 ; save unit number
59 010042 000303 swab r3 ; unit number in upper byte
60 010044 010311 mov r3,(r1) ; set unit, NOP cmd
61
62 010046 012761 000013 000004 mov #013,rlda(r1) ; subcmd reset+getstatus
63 010054 052703 000004 bis #cmstat,r3 ; get status cmd (r3lo is 0)
64 010060 010311 mov r3,(r1) ; execute
65 010062 105711 1$: tstb (r1) ; test for ready
66 010064 100376 bpl 1$ ; wait
67
68 010066 105003 clrb r3 ; unit number in upper byte
69 010070 052703 000010 bis #cmrdhd,r3 ; read header cmd
70 010074 010311 mov r3,(r1) ; execute
71 010076 105711 2$: tstb (r1) ; test for ready
72 010100 100376 bpl 2$ ; wait
73
74 010102 016102 000006 mov rlmp(r1),r2 ; retrieve cyl/head/sector
75 010106 042702 000077 bic #77,r2 ; set sector to zero
76 010112 005202 inc r2 ; set head 0, seek to cyl 0
77 010114 010261 000004 mov r2,rlda(r1) ; into da for seek
78 010120 105003 clrb r3 ; unit number in upper byte
79 010122 052703 000006 bis #cmseek,r3 ; seek cmd
80 010126 010311 mov r3,(r1) ; execute
81 010130 105711 3$: tstb (r1) ; test for ready
82 010132 100376 bpl 3$ ; wait
83
84 010134 005061 000004 clr rlda(r1) ; select cyl0/head0/sector0
85 010140 012761 177000 000006 mov #-512.,rlmp(r1) ; set word count
86 010146 105003 clrb r3 ; unit number in upper byte
87 010150 052703 000014 bis #cmrdda,r3 ; read data cmd
88 010154 010311 mov r3,(r1) ; execute
89 010156 105711 4$: tstb (r1) ; test for ready
90 010160 100376 bpl 4$ ; wait
91
92 010162 005711 tst (r1) ; test for error
93 010164 100002 bpl 5$ ; br if ok
94 010166 000005 reset ; ERROR - reset the world
95 010170 000721 br dlnr ; retry. r0 unchanged
96
97 010172 042711 000377 5$: bic #377,(r1) ; execute nop cmd
98 010176 005007 clr pc ; jump to bootstrap at zero
99
100 .end
100