PDA

Просмотр полной версии : Next186 (PC XT) на Tang Nano 9K



CityAceE
28.07.2024, 08:55
В целях изучения новой для себя области - FPGA, купил недорогую (~1400 руб.) плату Tang Nano 9K (https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/Nano-9K.html). Среди существующих для неё проектов моё внимание привлекла адаптация к этой палате проекта Next186 (https://opencores.org/projects/next186_soc_pc). Делюсь на страницах форума информацией об этом проекте.

https://camo.qiitausercontent.com/640ab1e1c9d858ffea4392497dbac6a2b69ab2c7/68747470733a2f2f71696974612d696d6167652d73746f7265 2e73332e61702d6e6f727468656173742d312e616d617a6f6e 6177732e636f6d2f302f3135393736342f3831613065626661 2d653966322d643738312d306231632d383635383033643130 3833302e6a706567

GitHub: https://github.com/hi631/tang-nano-9K/tree/master/DOS
Авторское описание проекта (Японский язык): https://qiita.com/hi631/items/8b847f3415743b602766

Характеристики:

CPU: Intel 80186 @ 18 MHz
Video: Text 80x25, VGA 320x200 @ 256
RAM: 1 Mb
HDD: 128 Mb

Проект собирается в фирменной среде Gowin. Правда в актуальной версии среды у меня при сборке валилась ошибка, но на помощь пришёл AlexBel и внёс коррективы, после чего проект успешно собрался. Откорректированный файл прилагаю к этому сообщению.

Также необходимо каким-нибудь удобным способом подключить PS/2 клавиатуру. Я эту проблему для себя решал (https://zx-pk.ru/threads/35329-protokol-ps-2.html?p=1188200&viewfull=1#post1188200) в процессе написания эмулятора Специалиста для Rapsberry Pi, так что у меня на рука уже было готовое решение.

В комплекте идёт образ жёсткого диска на 128 Мб с предустановленной FreeDOS и некоторыми простыми тестами. Удобно, что всё хранится прямо на microSD-карте, и чтобы записать какие-то свои программы, нужно просто записать их на карту, используя кард-ридер.


https://i4.imageban.ru/thumbs/2024.07.28/5be7c0eb04ab768a3b1f621382977465.jpg (https://imageban.ru/show/2024/07/28/5be7c0eb04ab768a3b1f621382977465/jpg) https://i6.imageban.ru/thumbs/2024.07.28/b2553a099ddedb18b33daabeb35b7480.jpg (https://imageban.ru/show/2024/07/28/b2553a099ddedb18b33daabeb35b7480/jpg)

https://i1.imageban.ru/thumbs/2024.07.28/bdc111151bad9e784082af307e11957f.jpg (https://imageban.ru/show/2024/07/28/bdc111151bad9e784082af307e11957f/jpg) https://i1.imageban.ru/thumbs/2024.07.28/160c6edae0ca0c9cf16fc97c44b5db20.jpg (https://imageban.ru/show/2024/07/28/160c6edae0ca0c9cf16fc97c44b5db20/jpg)

Тут однозначно есть ограничения в совместимости. Так, например, Prince of Perisia у меня не управляется с клавиатуры, хотя на паузу игру поставить можно, ну и на Ctrl-Alt-Del тоже реагирует. Максимальное разрешение экрана 320x200, поэтому всё, что просит большее разрешение работать не будет.

Хотелось бы сделать некоторую подборку интересного софта, который будет работать на этом компьютере. Надеюсь получить рекомендации от сообщества ;)

andrews
28.07.2024, 11:31
Попробуйте Metal Mutant, DeathTrack,Golden Axe. Быть может и Dune пойдет?
Из инструментальных средств все языки программирования, которые получаются из файлов *.86 посредством udi2dos.exe( работает под DOSBOX!: ASM86, PLM86, IC86, PASC86, FORT86(это фортран). Всё есть здесь (https://mark-ogden.uk/). Документацию придется искать( в основном попадается pdf, которую ваш комп вряд ли потянет? а какой-то хотя бы редактор текста все-равно нужен).

У меня например такой dosb.bat( не называйте dosbox.bat а то зациклитесь!)


dosbox -noconsole -userconf -c "mount c: h:\PLM86" -c "c:" -c "udi2dos make.86"

получится на выходе make.exe, в кавычках команды для DOSBOX.EXE

- - - Добавлено - - -


Тут однозначно есть ограничения в совместимости
надо устранять и чтобы можно было usb-клавиатуру подключать стандартную( мышь в dos-е особо не нужна).

CityAceE
28.07.2024, 17:15
Попробуйте Metal Mutant
Этого сразу попробовал, но он не запустился. Но не факт, что проблема именно в совместимости. Есть подозрение, что проблема может быть в драйверах верхней памяти. Например, в голом DOS'е Volkov Cоmmander запускается, а с драйверами верхней памяти уже валится с ошибкой. Но Norton Commander запускается и драйверами верхней памяти (скриншот прилагал выше).

https://i6.imageban.ru/thumbs/2024.07.28/b2553a099ddedb18b33daabeb35b7480.jpg (https://imageban.ru/show/2024/07/28/b2553a099ddedb18b33daabeb35b7480/jpg)

Однако выйти из него в DOS корректно не может. Всё это меня наводит на мысль, что для начала неплохо бы сделать правильный системный диск. Подозреваю, что под реальной MS-DOS всё может заработать получше.

andrews
28.07.2024, 17:50
186 чип, вроде только какие-то древние школьные компы в Швеции на нём были?
А вот нашел снова Compis (https://en.wikipedia.org/wiki/Compis)сие чудо в перьях называлось. Если есть его эмулятор, то можно на нем софт погонять.
А здесь (https://en.wikipedia.org/wiki/Intel_80186)более обширный список таких компов

В моей истории в конце 80-х и начале 90-х их не было. После 8086 СМ1810 XT сразу на 286 переключились.
Вот на 286-м все эти игры под D0S-ом точно шли. И NC c VC тоже. Но наверное 286 эта плата не потянет?

Или тогда обычный 8086. Был под них ms-dos?

i8088
01.08.2024, 09:55
Или тогда обычный 8086. Был под них ms-dos?
Разумеется - более того, все оригинальные MSDOS работают на 8086/8088.


Но наверное 286 эта плата не потянет?
Тут дело в том, что использование 286 подразумевает и усложнение периферии,
и усложнение управления памятью. Одннако встречаются редкие 286-XT, которые
суть обычная XT, но с 286 процессором. Вот такое наверняка можно сделать.

Кстати, можно упростить задачу, используя не 186, а 188. Но я так понял, что в этом смысл
был, добиться работы 186 процессора, с внешней 16-битной шиной.

andrews
01.08.2024, 10:41
Есть плата Tang Nano 9К. Задача - сделать на ней работоспособный софт. Norton Commander и ряд популярных игр под MS DOS, которые играли на IBM PC XT( СМ1810) и IBM PC AT. На IBM PC на 8088 не удалось познакомиться в 80-90е. Если она не может быть решена, это тоже будет результат.
Тут, кстати, обнаружил в файле udi.h от пакета Intel c86 следующее( это относительно утилитки udi2dos, которая из файлов с расширением .86 exe-ники под MS-DOS делает)


/*
* udi.h - iRMX (reg. TM) UDI System Call interface functions
* $Version: 1.3 $
* Copyright (C) 1989, 90 Intel Corporation, ALL RIGHTS RESERVED
*/



так что получается, что формат UDI работал в iRMX86? А где еще? В ISIS-II и CP/M-80 его кажется не было, а в CP/M-86? Есть ли в природе эмуляторы iRMX86 и CP/M-86?

gen1971
01.08.2024, 14:10
Тут дело в том, что использование 286 подразумевает и усложнение периферии,
и усложнение управления памятью. Одннако встречаются редкие 286-XT, которые
суть обычная XT, но с 286 процессором.

Возможно Вы говорите про IBM XT 286 (model 5162),
но это АТ (с шиной ISA-16) в корпусе ХТ, перифирия в нем уже усложненная (соответствует AT).

https://minuszerodegrees.net/5162/misc/5162_basics.htm
https://en.m.wikipedia.org/w/index.php?title=IBM_Personal_Computer_XT&diffonly=true

i8088
01.08.2024, 15:40
Возможно Вы говорите про IBM XT 286 (model 5162),
но это АТ (с шиной ISA-16) в корпусе ХТ, перифирия в нем уже усложненная (соответствует AT).

https://minuszerodegrees.net/5162/misc/5162_basics.htm
https://en.m.wikipedia.org/w/index.p...&diffonly=true
Приветствую!

Не, я имел ввиду именно XT, есть плата HEDAKA HED-919
https://theretroweb.com/motherboards/s/octek-xt286

Кстати, ее BIOS работает на обычных стандартных XT. 286 команд в нем нет,
по моему (если правильно помню) только отличие в определении FPU (на на
самой HED-919 даже нет панели для FPU.

И конфигурационные перемычки такие же, как на XT, слоты ISA 8-bit.

andrews
01.08.2024, 17:40
Есть ли в природе эмуляторы iRMX86 и CP/M-86?
нашел пока только этот (http://old-dos.ru/index.php?page=files&mode=files&do=show&id=4919)
Из под dosbox-а запустился только файл, отассемблированный с помощью ASM86. Осталось только найти эту версию, которая на выходе дает .CMD


;
; PIANO.A86 [For 'CP/M-86 For The IBM']
; Play Musical Notes Using The Keyboard's Number Keys
; Freeware from Kirk Lawrence
;
; (Uses Timer2 to run the PC speaker.)
;
; To assemble: ASM86 PIANO
; GENCMD PIANO
;
cseg
org 100h
jmp start
;
off db 27,'0',27,'c',0,27,'b',7,27,'n',27,'E$'
keys1 db ' Э ЫЫЫЭ ЫЫЫЭ ЫЫЫЫЭЫЫЫЫЭ ЫЫЫЭ ЫЫЫЫЭЫЫЫЫЭ ЫЫЫЭ ЫЫЫЭ '
db ' ЫЫЫЫЭЫЫЫЫ Ю',13,10,'$'
keys2 db ' ЫЭЫЫЫЫЫЭЫЫЫЫЫЭЫЫЫЫЫЭЫЫЫЫЫ ЭЫЫЫЫЫЭЫЫЫЫЫЭЫЫЫЫЫЭЫЫЫЫЫЭ ЫЫЫЫЫЭ'
db 'ЫЫЫЫЫЭЫЫЫЫЫЮЫ',13,10,'$'
keys3 db 27,'c',07,27,'b',0
db 27,'Y',41,59,'1',27,'Y',41,65,'2',27,'Y',41,71,'3'
db 27,'Y',41,77,'4',27,'Y',41,83,'5',27,'Y',41,89,'6'
db 27,'Y',41,95,'7',27,'Y',41,101,'8$'
scrn db 27,'c',0,27,'b',03,27,'Y',49,53
db 'ЫЫЯЯЫЫ ЫЫ ЫЫЯЯЫЫ ЫЫЮЯЫЫ ЫЫЯЯЫЫ'
db 27,'Y',50,53
db 'ЫЫЬЬЫЫ ЫЫ ЫЫЬЬЫЫ ЫЫ ЫЫ ЫЫ ЫЫ'
db 27,'Y',51,53
db 'ЫЫ ЫЫ ЫЫ ЫЫ ЫЫ ЫЫ ЫЫ ЫЫ'
db 27,'Y',52,53
db 'ЯЯ ЯЯ ЯЯ ЯЯ ЯЯ ЯЯ ЯЯЯЯЯЯ'
db 27,'Y',53,59,27,'b',05,'Freeware from Kirk Lawrence'
db 27,'Y',55,53,27,'b',07,'ESC',27,'b',03,' to quit.'
db 27,'Y',55,71,27,'b',04,254,254,254,27,'Y',55,79
db 27,'b',03,'Sustain: ',27,'b',07
soff db 27,'Y',55,88,'Off$'
sonn db 27,'Y',55,88,'On $'
flag db 0 ;our 'sustain' mode flag
stor db 0 ;storage variable for keypress data
onn db 27,'E',27,'m',27,'1$'
table dw 262 ;Middle C
dw 294 ;D
dw 330 ;E
dw 347 ;F
dw 392 ;G
dw 440 ;A
dw 494 ;B
dw 524 ;C
pos db 27,'Y',40
col db 58
db '$'
mark db ' $'
unmark db 219,219,219,'$'
;
; Turn off the status line and cursor, set screen colors,
; and clear the screen.
;
start:
mov dx,offset off
call prt_str
;
; Draw the keyboard keys on the user screen.
;
mov cx,6 ;set loop timer
rpt1:
push cx
mov dx,offset keys1
call prt_str
pop cx
loop rpt1
;
mov cx,5 ;set loop timer
rpt2:
push cx
mov dx,offset keys2
call prt_str
pop cx
loop rpt2
;
; Draw the numbers on the on-screen keyboard keys.
;
mov dx,offset keys3
call prt_str
;
; Draw the remainder of the user screen.
;
mov dx,offset scrn
call prt_str
;
; Get a user keypress (1 to 8).
;
get_key:
mov ah,0 ;function 0 - wait for keypress
int 16h ;call ROM BIOS keyboard services
cmp al,27 ;was ESC pressed?
jz exit ;yes, so go exit
cmp al,32 ;was SPACE BAR pressed?
je toggle ;yes, so go toggle the 'SUSTAIN' function
;
; Filter out all keys except '1' through '8' by checking the scan code.
;
cmp ah,02h ;less than '1'?
jl get_key ;yes, so ignore it
cmp ah,09h ;greater than '8'?
jg get_key ;yes, so ignore it
;
; Convert keypress data to musical note data.
;
sub al,31h ;change ASCII to digit
mov stor,al ;store value for visual indicator
and al,00000111b ;mask off upper 5 bits
shl al,1 ;* by 2 (2 bytes/word)
cbw ;byte --> word in AX
mov bx,ax ;put in BX (for table)
xor ax,ax ;zero out AX
mov dx,12h ;(high word)
mov si,offset table ;point SI to first entry in musical note table
add si,bx ;add the needed number of table word offsets
mov cx,[si] ;move the value from table location into CX...
div cx ;...and divide DX:AX by this value
mov bx,ax ;save the quotient in BX
;
; If 'sustain' mode is on, turn off the visual on-screen key indicator.
;
cmp flag,1 ;is sustain mode 'on'?
jne sound_it ;no, so go sound the note
push ax ;preserve AX
push bx ;preserve BX
push dx ;preserve DX
call de_mark ;go turn off visual key indicator
pop dx ;restore DX
pop bx ;restore BX
pop ax ;restore AX
;
; Set 1/pitch into timer, then play the note through the PC speaker.
;
sound_it:
mov dx,43h ;timer 2 port address
mov al,10110110b ;put magic number...
out dx,al ;...into timer2
mov ax,bx ;1/pitch into AX
mov dx,42h ;LSB into AL
out dx,al ;send it to Timer2
mov al,ah ;MSB in AL
out dx,al ;send it to Timer2
mov dx,61h ;port 61h in DX
in al,dx ;read port value into AL
or al,3 ;turn on bits 0 and 1...
out dx,al ;...to turn on speaker
;
; Visually indicate the pressed key on the screen.
;
call set_col ;go compute value for screen locating sequence
mov dx,offset pos ;point to our screen locating sequence
call prt_str ;print it
mov dx,offset mark ;point to our screen indicator mark
call prt_str ;print it
;
; If 'sustain' function is on, go get another keypress.
; If 'sustain' function is off, sound note for 2/18ths of a
; second, clear the keyboard buffer, turn the note off,
; turn off the on-screen key indicator, and go get another
; keypress.
;
cmp flag,1 ;is 'sustain' mode on?
je get_key ;yes, so go get another keypress
call delay ;no, so go generate a short delay
call spkr_off ;go turn off the speaker
call de_mark ;go turn off on-screen key indicator
jmp get_key ;go get another keypress
;
; Turn off the speaker. Turn on the status line and cursor,
; clear the screen, and exit.
;
exit:
call spkr_off ;go turn off the speaker
mov dx,offset onn ;point to screen control sequence
call prt_str ;print it
xor cx,cx ;function 0 - reset system
int 224 ;call BDOS services
;
; Routine to toggle the 'SUSTAIN' function.
;
toggle:
cmp flag,1 ;is 'sustain' mode currently on?
je sust_off ;yes, so go turn it off
mov flag,1 ;no, so turn it on
mov dx,offset sonn ;point to on-screen 'On' message
jmp sust_done ;go print it
sust_off:
call spkr_off ;go silence the speaker
call de_mark ;go turn off visual on-screen key indicator
mov flag,0 ;turn off 'sustain' mode
mov dx,offset soff ;point to on-screen 'Off' message
sust_done:
call prt_str ;go print it
jmp get_key ;go get another keypress
;
;================================================= ===================
;
; Following are the program's called sub-routines.
;
;================================================= ===================
;
; Routine to turn off the speaker.
;
spkr_off:
push dx ;preserve DX
mov dx,61h ;port 61h in DX
in al,dx ;read port value into AL
and al,11111100b ;mask lower 2 bits...
out dx,al ;...and send it to the port
pop dx ;restore DX
ret ;return to caller
;
; Routine to delay for 2/18ths of a second.
;
delay:
mov ah,00h ;function 0 - get timer tick
int 01Ah ;call ROM BIOS time-of-day services
add dx,2 ;add our delay value to DX
mov bx,dx ;store result in BX
pozz:
int 01Ah ;call ROM BIOS time-of-day services
cmp dx,bx ;has the delay duration passed?
jl pozz ;no, so go check again
;
; Routine to clear the keyboard buffer (to prevent over-run
; if the user holds a key down).
;
push es ;preserve ES
push di ;preserve DI
mov ax,40h ;BIOS segment in AX
mov es,ax ;transfer to ES
mov ax,1Ah ;keyboard head pointer in AX
mov di,ax ;transfer to DI
mov ax,1Eh ;keyboard buffer start in AX
mov es: word ptr [di],ax ;transfer to head pointer
inc di ;bump pointer to...
inc di ;...keyboard tail pointer
mov es: word ptr [di],ax ;transfer to tail pointer
pop di ;restore DI
pop es ;restore ES
ret ;return to caller
;
; Routine to set screen location for the visual keypress indicator.
; (The variable 'stor' contains a hex representation [0h through 7h]
; of which key was pressed.)
;
; This routine is a bit clumsy, but what do you expect in a free
; program? ;)
;
set_col:
cmp stor,0 ;key 1 pressed?
je complete ;yes
add col,6 ;no, so increase our screen column value
cmp stor,1 ;key 2 pressed?
je complete ;yes
add col,6 ;no, so increase our screen column value
cmp stor,2 ;key 3 pressed?
je complete ;yes
add col,6 ;no, so increase our screen column value
cmp stor,3 ;key 4 pressed?
je complete ;yes
add col,6 ;no, so increase our screen column value
cmp stor,4 ;key 5 pressed?
je complete ;yes
add col,6 ;no, so increase our screen column value
cmp stor,5 ;key 6 pressed?
je complete ;yes
add col,6 ;no, so increase our screen column value
cmp stor,6 ;key 7 pressed?
je complete ;yes
add col,6 ;no, so it must be key 8
complete:
ret ;return to caller
;
; Routine to turn off the visual key indicator on the screen.
;
de_mark:
mov dx,offset pos ;point to scrren-positioning sequence
call prt_str ;print it
mov dx,offset unmark ;point to the 'unmark' sequence
call prt_str ;print it
mov col,58 ;reset the default 'column' value
ret ;return to caller
;
; Routine to print a string (in offset DX) to the screen.
;
prt_str:
mov cl,09h ;function 9 - print string
int 224 ;call BDOS services
ret ;return to caller
;
end



Запускаю PIANO.CMD вот таким батником


dosbox -noconsole -userconf -c "mount c h:\CPM86" -c "c:" -c "CPM86 PIANO.CMD"
81071

CityAceE
16.08.2024, 15:19
Снял небольшой поверхностный обзор плат Tang Nano 9K и 20K. Последнюю треть ролика показываю Next186.

YouTube:

https://youtu.be/XbyUcJ8XVyc

RuTube:

https://rutube.ru/video/20259f7756d2650d64e538d2956f3c8f/