Skip to content

Commit 2acd96d

Browse files
committed
IM-01T
1 parent 9273bde commit 2acd96d

File tree

10 files changed

+222
-15
lines changed

10 files changed

+222
-15
lines changed

docs/106-107.lst

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
2+
; Вход по включению питания
3+
020000 MOV #003000, 177760
4+
; Точка входа для пересброса - прерывание по вектору 4 (RPLY), 10 (резервный код команды) / 24 (ACLO)
5+
020006 MOV #000200, SP
6+
020012 RESET
7+
020014 MTPS #000340
8+
020020 CLR 000076
9+
020024 MOV #020444, 000004 ; Адрес прерывания по вектору 4 (RPLY)
10+
020032 MOV #000340, 000006 ; PSW
11+
020040 MOV #020060, R0
12+
020044 MOV #063000, 177750
13+
020052 BR 020060
14+
;
15+
020054 ADD @157650(R0), R0
16+
;
17+
020060 MOV #030561, 170004
18+
020066 MOV #000037, 170060
19+
020074 CLR 170074 ; Очищаем регистр Д
20+
020100 MOV #020000, R0 ; с адреса 020000
21+
020104 MOV #020000, R1 ; 020000 байт = 8К
22+
020110 MOV #000200, R5 ; индикаторный бит
23+
020114 CALL 057000 ; Проверить контрольную сумму
24+
020120 MOV #040000, R0 ; с адреса 040000
25+
020124 MOV #020000, R1 ; 020000 байт = 8К
26+
020130 CALL 057000 ; Проверить контрольную сумму
27+
020134 MOV #000200, R0 ; с адреса 000200
28+
020140 MOV #001600, R1 ; 896. байт
29+
020144 CALL 057030 ; Проверка блока памяти
30+
020150 MOV #002000, R0 ; с адреса 002000
31+
020154 MOV #002000, R1 ; 1К байт
32+
020160 CALL 057030 ; Проверка блока памяти
33+
020164 TSTB 000076 ; Было прерывание RPLY?
34+
020170 BNE 020176 ; да => пропускаем
35+
020172 CALL 057244 ; Проверить память 060000..061777 и ПЗУ 064000..067777
36+
020176 BIT #000377, 170074 ; Проверяем регистр Д
37+
020204 BNE 020100 ; КС не совпала / ошибки памяти - на повторную проверку
38+
020206 MOV #000200, R0 ;
39+
020212 CLR (R0)+ ; очищаем 000200..003777
40+
020214 CMP R0, #004000 ;
41+
020220 BLT 020212 ;
42+
020222 MOV #020006, R0 ; Адрес точки пересброса
43+
020226 MOV R0, 000004 ; прерывание по вектору 4 - RPLY
44+
020232 MOV R0, 000010 ; прерывание по вектору 10 - резервный код команды
45+
020236 MOV R0, 000024 ; прерывание по вектору 24 - ACLO
46+
020242 MOV #021712, 000222
47+
020250 MOV #021642, 000224
48+
020256 MOV #000500, 170072
49+
020264 MOV #020536, 000100 ; Адрес прерывания по вектору 100 - EVNT
50+
020272 MOV #000340, 000102 ; PSW
51+
020300 MOV #000340, 000272
52+
020306 MOV #054114, 000270
53+
020314 CLRB 000212
54+
020320 TSTB 000076
55+
020324 BNE 020376
56+
020326 CALL 064410
57+
020332 MOV #000006, 170106
58+
020340 MOV #000310, 170104
59+
020346 MOV #000230, 170100
60+
020354 CALL 054042
61+
020360 MOV #000000, 170100
62+
020366 NOP
63+
020370 MOV #000230, 170100
64+
020376 CALL 022206
65+
020402 MOVB #000001, 000203
66+
020410 MOVB #000001, 000204
67+
020416 MOV #000001, 001250
68+
020424 MOV #021606, 000224
69+
020432 MTPS #000000
70+
020436 INC 003736
71+
020442 BR 020436
72+
; Прерывание по вектору 4 - RPLY
73+
020444 MOVB #000077, 000076 ; Ставим флаг что было прерывание
74+
020452 MOV R0, (SP)
75+
020454 RTI
76+
;
77+
020456 INCB 000214
78+
020462 ASRB 000212
79+
020466 BNE 020502
80+
020470 MOVB #000040, 000212
81+
020476 CLRB 000214
82+
020502 MOVB 000214, R1
83+
020506 CLR 170074
84+
020512 BIC #000077, 170060
85+
020520 BISB 000212, 170060
86+
020526 MOVB 000214(R1), 170074
87+
020534 RETURN
88+
;
89+
; Прерывание по вектору 100 - EVNT
90+
020536
91+
92+
; Подпрограмма: Проверить контрольную сумму
93+
057000 BIC R5, 170074
94+
057004 CLR R2
95+
057006 ADD (R0)+, R2
96+
057010 DEC R1
97+
057012 SOB R1, 057006
98+
057014 TST R2
99+
057016 BEQ 057024
100+
057020 BIS R5, 170074
101+
057024 ASR R5
102+
057026 RETURN
103+
; Подпрограмма: Проверка блока памяти
104+
057030 BIC R5, 170074 ; стираем бит в регистре Д
105+
057034 MOV #000001, -(SP)
106+
057040 MOV R0, R3
107+
057042 MOV R1, R4
108+
057044 MOV (SP), R2
109+
057046 MOV R3, R0
110+
057050 MOV R4, R1
111+
057052 MOVB R2, (R0)+
112+
057054 ASLB R2
113+
057056 BNE 057062
114+
057060 INC R2
115+
057062 SOB R1, 057052
116+
057064 MOV (SP), R2
117+
057066 MOV R3, R0
118+
057070 MOV R4, R1
119+
057072 CMPB R2, (R0)+
120+
057074 BEQ 057102
121+
057076 BIS R5, 170074 ; ошибка памяти - ставим бит в регистре Д
122+
057102 ASLB R2
123+
057104 BNE 057110
124+
057106 INC R2
125+
057110 SOB R1, 057072
126+
057112 ASLB (SP)
127+
057114 BNE 057044
128+
057116 TST (SP)+
129+
057120 BR 057024 ; заканчиваем
130+
;
131+
057122 MOV 001250, R2
132+
057126 MOV 003734, R4
133+
057132 MOV 001374, R5
134+
057136 MOV #000236, R3
135+
057142 CLR (R3)+
136+
057144 CMP R3, #000660
137+
057150 BLT 057142
138+
057152 ADD #000100, R3
139+
057156 CLR (R3)+
140+
141+
142+
; Подпрограмма: проверить память 060000..061777 и ПЗУ 064000..067777
143+
057244 MOV #060000, R0 ; С адреса 060000
144+
057250 MOV #002000, R1 ; 02000 байт = 1К
145+
057254 CALL 057030 ; Проверка блока памяти
146+
057260 MOV #064000, R0 ; С адреса 064000
147+
057264 MOV #004000, R1 ; 04000 байт = 2К
148+
057270 CALL 057000 ; Проверить контрольную сумму
149+
057274 RETURN
150+
151+
152+
064410

docs/148-149.lst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
020146 MOV #002000, R1
2828
020152 CALL 023660 ; Заполнить
2929
020156 BIT #000377, 164074
30-
020164 BNE 020072 ; КС не совпала - на повторную проверку
30+
020164 BNE 020072 ; КС не совпала / ошибки памяти - на повторную проверку
3131
; Очистка памяти
3232
020166 MOV #000200, R0
3333
020172 CLR (R0)+
@@ -52,6 +52,7 @@
5252
020320 MTPS #000000
5353
020324 INC 003420
5454
020330 BR 020324
55+
; Прерывание по вектору 4 - RPLY
5556
020332 MOVB #000077, 000076
5657
020340 MOV R0, (SP)
5758
020342 RTI

emulator/!version.bat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,
55
REM echo Year: %YYYY%
66

77
REM set YYYY=2020
8-
REM git log --tags --simplify-by-decoration --pretty="format:%%cI %%d" | find /c "%YYYY%"
8+
REM git log --tags --simplify-by-decoration --pretty="format:%%cI %%d" | find /c "release-%YYYY%"
99

1010
set VERMINOR=
1111
for /f "tokens=* USEBACKQ" %%a in (
12-
`git log --tags --simplify-by-decoration --pretty^=^"format^:%%cI^" ^| find ^/c ^"%YYYY%^"`
12+
`git log --tags --simplify-by-decoration --pretty^=^"format^:%%cI %%d^" ^| find ^/c ^"release-%YYYY%^"`
1313
) do set VERMINOR=%%a
1414
REM echo Version minor: %VERMINOR%
1515
set /A VERMINOR=%VERMINOR%+1

emulator/Emulator.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ void CALLBACK Emulator_SoundGenCallback(unsigned short L, unsigned short R);
5353

5454
//////////////////////////////////////////////////////////////////////
5555

56-
57-
const LPCTSTR FILENAME_ROM_148 = _T("000148.rom");
58-
const LPCTSTR FILENAME_ROM_149 = _T("000149.rom");
56+
const LPCTSTR FILENAME_ROM_106 = _T("000106.rom");
57+
const LPCTSTR FILENAME_ROM_107 = _T("000107.rom");
58+
const LPCTSTR FILENAME_ROM_148 = _T("000148.rom");
59+
const LPCTSTR FILENAME_ROM_149 = _T("000149.rom");
5960

6061

6162
//////////////////////////////////////////////////////////////////////
@@ -149,6 +150,22 @@ bool Emulator_InitConfiguration(BKConfiguration configuration)
149150
uint8_t buffer[8192];
150151

151152
if (configuration == BK_CONF_IM01)
153+
{
154+
if (!Emulator_LoadRomFile(FILENAME_ROM_106, buffer, 0, 8192))
155+
{
156+
AlertWarning(_T("Failed to load ROM file 000106.rom."));
157+
return false;
158+
}
159+
g_pBoard->LoadROM(1, buffer);
160+
161+
if (!Emulator_LoadRomFile(FILENAME_ROM_107, buffer, 0, 8192))
162+
{
163+
AlertWarning(_T("Failed to load ROM file 000107.rom."));
164+
return false;
165+
}
166+
g_pBoard->LoadROM(0, buffer);
167+
}
168+
else if (configuration == BK_CONF_IM01T)
152169
{
153170
if (!Emulator_LoadRomFile(FILENAME_ROM_148, buffer, 0, 8192))
154171
{

emulator/MainWindow.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,6 @@ void MainWindow_UpdateMenu()
623623
case BK_CONF_IM01T: configcmd = ID_CONF_BK0010FOCAL; break;
624624
}
625625
CheckMenuRadioItem(hMenu, ID_CONF_BK0010BASIC, ID_CONF_BK0010FOCAL, configcmd, MF_BYCOMMAND);
626-
EnableMenuItem(hMenu, ID_CONF_BK0010FOCAL, MF_DISABLED); //TODO
627626

628627
// Debug menu
629628
BOOL okDebug = Settings_GetDebug();

emulator/ScreenView.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ void ScreenView_OnDraw(HDC hdc)
240240
// Зная где лежат данные шахматной доски, отдаем номер фигуры для изображения
241241
BYTE GetChessFugure(int row, int col)
242242
{
243-
uint16_t addr = 000610 + (7 - row) * 8 + (7 - col);
243+
uint16_t baseaddr = g_nEmulatorConfiguration == BK_CONF_IM01 ? 000660 : 000610;
244+
uint16_t addr = baseaddr + (7 - row) * 8 + (7 - col);
244245

245246
BYTE figure = g_pBoard->GetRAMByte(0, addr);
246247

emulator/emubase/Board.cpp

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,13 @@ uint8_t CMotherboard::GetIndicator(int pos)
278278
Каждый фрейм равен 1/25 секунды = 40 мс = 20000 тиков, 1 тик = 2 мкс.
279279
12 МГц = 1 / 12000000 = 0.83(3) мкс
280280
В каждый фрейм происходит:
281-
* 120000 тиков ЦП - 6 раз за тик
281+
* 180000 тиков ЦП - 9 раз за тик - 4.5 МГц
282282
* программируемый таймер - на каждый 128-й тик процессора; 42.6(6) мкс либо 32 мкс
283283
* 2 тика IRQ2 50 Гц, в 0-й и 10000-й тик фрейма
284284
*/
285285
bool CMotherboard::SystemFrame()
286286
{
287-
const int frameProcTicks = 6;
287+
const int frameProcTicks = 9;
288288
const int audioticks = 20286 / (SOUNDSAMPLERATE / 25);
289289
m_SoundChanges = 0;
290290

@@ -464,27 +464,43 @@ void CMotherboard::SetByte(uint16_t address, bool okHaltMode, uint8_t byte)
464464
int CMotherboard::TranslateAddress(uint16_t address, bool /*okHaltMode*/, bool /*okExec*/, uint16_t* pOffset) const
465465
{
466466
uint16_t portStartAddr = 0164000;
467-
if (address >= portStartAddr) // Port
467+
if (address >= portStartAddr ||
468+
address >= 0000076 && address <= 0000077) // Port
468469
{
469470
*pOffset = address;
470471
return ADDRTYPE_IO;
471472
}
472473

473-
if (address < 0010000) // 000000..007777 - 4K RAM
474+
if (address < 0004000) // 000000..003777 - 2K RAM
474475
{
475476
*pOffset = address;
476477
return ADDRTYPE_RAM;
477478
}
478479

479-
if (address < 0020000) // 010000..017777 - 4K none
480+
if (address < 0020000) // 004000..017777 - 6K none
480481
return ADDRTYPE_DENY;
481482

482-
if (address < 0060000)
483+
if (address < 0060000) // 020000..057777 - ROM
483484
{
484485
*pOffset = address - 0020000;
485486
return ADDRTYPE_ROM;
486487
}
487488

489+
//if (address < 0062000) // 060000..061777 - RAM
490+
//{
491+
// *pOffset = address;
492+
// return ADDRTYPE_RAM;
493+
//}
494+
495+
//if (address < 0064000)
496+
// return ADDRTYPE_DENY;
497+
498+
//if (address < 0070000) // 064000..067777 - ROM
499+
//{
500+
// *pOffset = address - 0040000;
501+
// return ADDRTYPE_ROM;
502+
//}
503+
488504
return ADDRTYPE_DENY;
489505
}
490506

@@ -502,19 +518,27 @@ uint16_t CMotherboard::GetPortWord(uint16_t address)
502518

503519
switch (address)
504520
{
521+
case 0000076:
522+
return 077;
523+
505524
case 0164004: // ???
525+
case 0170004: // ???
506526
return 0;//STUB
507527

508528
case 0164060: // ???
529+
case 0170060: // ???
509530
return m_Port164060;
510531

511532
case 0164072: // ???
533+
case 0170072: // ???
512534
return 0;
513535

514536
case 0164074: // ???
537+
case 0170074: // ???
515538
return m_Port164074;
516539

517540
case 0164076: // ???
541+
case 0170076: // ???
518542
{
519543
for (int col = 0; col < 6; col++)
520544
{
@@ -548,18 +572,23 @@ uint16_t CMotherboard::GetPortView(uint16_t address) const
548572
switch (address)
549573
{
550574
case 0164004: // ???
575+
case 0170004: // ???
551576
return 0;//STUB
552577

553578
case 0164060: // ???
579+
case 0170060: // ???
554580
return m_Port164060;
555581

556582
case 0164072: // ???
583+
case 0170072: // ???
557584
return 0;
558585

559586
case 0164074: // ???
587+
case 0170074: // ???
560588
return 0;
561589

562590
case 0164076: // ???
591+
case 0170076: // ???
563592
return 0;
564593

565594
case 0177750: // ???
@@ -598,23 +627,31 @@ void CMotherboard::SetPortWord(uint16_t address, uint16_t word)
598627

599628
switch (address)
600629
{
630+
case 0000076:
631+
break;
632+
601633
case 0164004: // ???
634+
case 0170004: // ???
602635
break;
603636

604637
case 0164060: // ???
638+
case 0170060: // ???
605639
m_Port164060 = word;
606640
break;
607641

608642
case 0164072: // ???
643+
case 0170072: // ???
609644
break;
610645

611646
case 0164074: // ???
647+
case 0170074: // ???
612648
m_Port164074 = word;
613649
UpdateIndicator((uint8_t)m_Port164060, (uint8_t)word);
614650
//DebugLogFormat(_T("WRITE PORT 164074 value %06o PC=%06o, (164060)=%06o\r\n"), word, m_pCPU->GetInstructionPC(), m_Port164060);
615651
break;
616652

617653
case 0164076: // ???
654+
case 0170076: // ???
618655
break;
619656

620657
case 0177750: // ???

emulator/emubase/Board.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class CProcessor;
2323
// Machine configurations
2424
enum BKConfiguration
2525
{
26-
BK_CONF_IM01 = 1,
26+
BK_CONF_IM01 = 1,
2727
BK_CONF_IM01T = 2,
2828
};
2929

roms/000106.rom

8 KB
Binary file not shown.

roms/000107.rom

8 KB
Binary file not shown.

0 commit comments

Comments
 (0)