-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDXboot
More file actions
executable file
·95 lines (82 loc) · 3.09 KB
/
DXboot
File metadata and controls
executable file
·95 lines (82 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//------
// Загрузчик с 8-дюймового гибкого диска для ДВК и Электроника-60
//------
// Аппаратура грузит загрузчик на адрес 0 и запускает с первого слова.
// Первой машинной инструкцией должен быть NOP, иначе аппаратура
// не передаст управления. При этом приоритет процессора равен 0 и
// из-за этого необходимо уметь обрабатывать прерывания от таймера.
// При запуске загрузчик получает в r0 номер дисковода, с которого
// производится загрузка.
// Генератор загрузчиков проставляет начальные значения адреса дорожки
// и сектора в тело загрузчика перед записью его на диск с системой.
//--- РАСПРЕДЕЛЕНИЕ ДИСКА -----------------------------------//
// NEX.ADDRESS : - ... - 0 1 2 ... //
// TRACK/SECTOR : 0/1 ... 0/26 1/1 1/5 1/9 ... //
// <BOOT> <VL> <STARTER.. //
//-----------------------------------------------------------//
/CSR = 177170; DBR=CSR+2 //EQUALS CSR=&FE78,DBR=&FE7A
.globl CSR,DBR
// Коды команд и биты статуса в CSR
Error =100000 //Флаг ошибки
Init = 40000 //Команда сброса накопителя
Ready = 200
Done = 40
Unit = 20 //Бит выбора накопителя
RDsect= 06 //Команда чтения сектора в буфер
RDbuff= 02 //Команда чтения буфера в машину
Go = 1 //Стартовый бит
//--- ЯЧЕЙКИ С ФИКСИРОВАННЫМИ АДРЕСАМИ --//
nop //Наличие этой инструкции проверяет аппаратура
movb Units(r0),opcode //Задаем номер дисковода
br DXboot
Qsect: 073567 //Длина чтения в секторах по 128
Wait; 000340 //BPT-вектор
TRC0: 01
SEC0: 11 //Адрес чтения -> дорожка+сектор
//---------------------------------------//
Units: .byte RDsect+Go; .byte Unit+RDsect+Go
AddrLoad = 2000
Track=r1; Sector=r2; AddrBuff=r3; AddrCSR=r4; AddrDBR=r5
CarryBit = 1 //Бит ^C в слове состояния
//-- Ожидание конца операции --
Wait:
1:
bit $[Error+Done+Ready],*AddrCSR
beq 1b
2: bmi 2b //Бит 15 -> Ошибка !
//Двигаем бит 7 в бит 0 PSW
movb *AddrCSR,2(sp); aslb 2(sp); rolb 2(sp)
Desact: //Метка для таймера
rti
//-- Чтение из DX#: N/4 блоков с адреса 2 --
DXboot:
mov $AddrLoad,AddrBuff; mov AddrBuff,sp
mov TRC0,Track; mov SEC0,Sector
mov $CSR,AddrCSR
br TimeOver
Desact; 000340 //Вектор прерывания от таймера
TimeOver:
mov $DBR,AddrDBR
br 3f
4:
mov (pc)+,*AddrCSR //Передаем команду `чтение сектора'
opcode: 0
bpt //Ждем бита 7 (TRANSF. REQ)
mov Sector,*AddrDBR; bpt
mov Track,*AddrDBR; bpt //Ждем бита 5 (DONE)
mov $RDbuff\!Go,*AddrCSR //Передаем команду `чтение буфера'
5:
bpt
bcc 6f //пока бит 7 CSR
movb *AddrDBR,(AddrBuff)+
br 5b
6:
movb $'=,177566 //Индикация на консоль
inc Sector
cmp Sector,$27.
bne 7f
mov $1,Sector; inc Track
7:
3:
dec Qsect; bpl 4b
mov sp,pc //Запуск программы