MS-DOS emulálás, com port megfigyelés

Sziasztok!

Van egy kb. 30 éves program amit próbáltam virtualbox, és vmware alatt is futtatni. A hostra még feltelepítettem a com0com virtuális port emulátort. (putty segítéségével látom is hogy COM1 tükröz COM2 re, oda vissza, gépelgettem terminálablakban). Emulált Windows al is kipróbáltam, hogy a hozzáadott com1 et látom a host gép com2 portján.

A problémám, hogy a futtatót dos alapú program kommunikációját sehogy nem látom. Probáltam COM1 sé COM2 paraméterrel. A programban nem sok az infó.

Hogyan tudnám elfogni virtuális gépben???

Kiolvasott asm FÁJLBAN ILYEN SZÖVEGEK VANNAK:

 

;=== CPU 8251 PROGRAMSZAVAI ES CIMEI ===
;
MOD51    EQU    0EEH    ; 9600,8 BIT,NINCS,2 STOP,x16        ( 1110 1110 )
COM51    EQU    37H    ; COMMAND SZO                ( 0011 0111 )
RES51    EQU    40H    ; RESET SZO                ( 0100 0000 )
SIODAT    EQU    0F0H    ; ADATREGISZTER CIME
SIOCOM    EQU    0F1H    ; PARANCSREGISZTER CIME
;
;=== CPU 8255 PROGRAMSZAVA ES CIMEI ===
;
CPUMOD    EQU    81H    ; CPU KARTYA 8255-OS PARANCS SZAVA    ( 1000 0001 )
;
CPUAP    EQU    0F8H    ; CPU KARTYA 8255-OS 'A' PORT CIME
CPUBP    EQU    0F9H    ; CPU KARTYA 8255-OS 'B' PORT CIME
CPUCP    EQU    0FAH    ; CPU KARTYA 8255-OS 'C' PORT CIME
CPUPP    EQU    0FBH    ; CPU KARTYA 8255-OS PARANCS CIME
;
;=== CPU 8253 PROGRAMSZAVAI ES CIMEI ===;
;
TIM0P    EQU    36H    ; 0-AS TIMER PARANCS SZAVA        ( 0011 0110 )
TIM0A    EQU    0DH    ; 0-AS TIMER ALSO BYTE ( 1=68H, 2=0DH, 4=1AH )
TIM0F    EQU    00H    ; 0-AS TIMER FELSO BYTE
;
TIM1P    EQU    70H    ; 1-ES TIMER PARANCS SZAVA        ( 0111 0000 )
TIM1A    EQU    50H    ; 1-ES TIMER ALSO BYTE
TIM1F    EQU    0C3H    ; 1-ES TIMER FELSO BYTE
;
TIM2P    EQU    0B1H    ; 2-ES TIMER PARANCS SZAVA        ( 1011 0001 )
TIM2PO    EQU    81H    ; 2-ES TIMER OLVASA PARANCS SZAVA    ( 1000 0001 )
TIM2A    EQU    14H    ; 2-ES TIMER ALSO BYTE
TIM2F    EQU    00H    ; 2-ES TIMER FELSO BYTE
;
TIM0C    EQU    0E8H    ; 0-AS TIMER CIME
TIM1C    EQU    0E9H    ; 1-ES TIMER CIME
TIM2C    EQU    0EAH    ; 2-ES TIMER CIME
TIMCC    EQU    0EBH    ; TIMER PARANCS CIME
;
;=== NYOMOGOMBOK ES ERZEKELOK LEKERDEZES CIMEI ===
;
INMOD    EQU    9BH    ; INPUT KARTYA 8255-OS PARANCS SZAVA    ( 1001 1011 )
;
OUTAP    EQU    30H    ; ALSO 8 BIT CIME
OUTBP    EQU    31H    ; FELSO 4 BIT ES MASODKIJELZO CIME
OUTCP    EQU    32H    ; MASODKIJELZO CIME
OUTPP    EQU    33H    ; PARANCS CIME
;
APNY    EQU    9CH    ; NYOMOGOMB ALSO 8 BIT CIME
BPER    EQU    9DH    ; ERZEKELO ALSO 8 BIT CIME
CP03NY    EQU    9EH    ; NYOMOGOMB FELSO 4 BIT CIME
CP47ER    EQU    9EH    ; ERZEKELO FELSO 4 BIT CIME
NY_ERP    EQU    9FH    ; NYOMOGOMB ES ERZEKELO PARANCS CIME
;
;=== OUTPUT 8255 PROGRAMSZAVA ES CIMEI ===
;
OUTMOD    EQU    80H    ; OUTPUT KARTYA 8255 PROGRAMSZAVA    ( 1000 0000 )
;
OUT1AP    EQU    20H    ; 1. 8255-OS 'A' PORT CIME
OUT1BP    EQU    21H    ; 1. 8255-OS 'B' PORT CIME
OUT1CP    EQU    22H    ; 1. 8255-OS 'C' PORT CIME
OUT1PP    EQU    23H    ; 1. 8255-OS PARANCS CIME
;
OUT2AP    EQU    24H    ; 2. 8255-OS 'A' PORT CIME
OUT2BP    EQU    25H    ; 2. 8255-OS 'B' PORT CIME
OUT2CP    EQU    26H    ; 2. 8255-OS 'C' PORT CIME
OUT2PP    EQU    27H    ; 2. 8255-OS PARANCS CIME
;
OUT3AP    EQU    28H    ; 3. 8255-OS 'A' PORT CIME
OUT3BP    EQU    29H    ; 3. 8255-OS 'B' PORT CIME
OUT3CP    EQU    2AH    ; 3. 8255-OS 'C' PORT CIME
OUT3PP    EQU    2BH    ; 3. 8255-OS PARANCS CIME
;
OUT4AP    EQU    2CH    ; 4. 8255-OS 'A' PORT CIME
OUT4BP    EQU    2DH    ; 4. 8255-OS 'B' PORT CIME
OUT4CP    EQU    2EH    ; 4. 8255-OS 'C' PORT CIME
OUT4PP    EQU    2FH    ; 4. 8255-OS PARANCS CIME
;
;=== A/D 8255 PROGRAMSZAVA ES CIMEI ===
;
MODEW    EQU    83H    ; A/D KARTYA 8255-OS PARANCS SZAVA    ( 1000 0011 )
LSB    EQU    50H    ; 1. PROGRAM SZO
MSB    EQU    30H    ; 2. PROGRAM SZO
BSZ    EQU    08H    ; 3. PROGRAM SZO
;
AD1AP    EQU    40H    ; 1. A/D KARTYA 8255-OS 'A' PORT CIME
AD1BP    EQU    41H    ; 1. A/D KARTYA 8255-OS 'B' PORT CIME
AD1CP    EQU    42H    ; 1. A/D KARTYA 8255-OS 'C' PORT CIME
AD1PP    EQU    43H    ; 1. A/D KARTYA 8255-OS PARANCS CIME
;
AD2AP    EQU    48H    ; 2. A/D KARTYA 8255-OS 'A' PORT CIME
AD2BP    EQU    49H    ; 2. A/D KARTYA 8255-OS 'B' PORT CIME
AD2CP    EQU    4AH    ; 2. A/D KARTYA 8255-OS 'C' PORT CIME
AD2PP    EQU    4BH    ; 2. A/D KARTYA 8255-OS PARANCS CIME
;

Hozzászólások

egy régi vasról szeretném átemelni és megnézni, hogy kommunikál e. sajnos ez még külön kártyát használ az alaplapon rs232 kommunikációhoz. ha a program a kártyához van írva gondolom hiába probálok emulátorokat, mert dos alatt még nincs com és fejlettebb címzések. így a régi szoftver csak azzal a kártyával fut, emulálni nem tudom, vagy átrakni modernebre

+1 a dsoboxra, ahol a konfigban

serialY=directserial realport:comX

ahol X az egyik példányban a com0com egyik virtuális portszáma, a másik példányban pedig egy másik (aztán használhatod a kedvenc serial sniffered a forgalom monitorozására/loggolására)

Y pedig a dosos proggi által használt port száma

Nekem volt, hogy az UART chip TTL szintjere kotott logikai analizator volt a megoldas. Volt, hogy Arduinoval kuldtem es fogadtam parancsokat, amikor valami hardware-t fel kellett deriteni. De az is mukodik, amit irtal.

A strange game. The only winning move is not to play. How about a nice game of chess?

ehhez neked külön kártya fog kelleni a progit elnézve, nem sima soros port

sztem valami ilyesmi fog kelleni neked: http://www.decision-computer.de/Produkte/8255/8255-N-e.html

kérdés honnan lesz ISA slotod... múltkor láttam, hogy a TPM csatiban levő LPC-t használták fel hogy kivezessék az ISA-hoz kellő signalingot:https://www.vogons.org/viewtopic.php?t=93291

https://www.youtube.com/watch?v=putHMSzu5og

8255-ös az PPI, nem RS232. Ahhoz 8251-es chip (vagy annak emulációja) kellene neki. MAME amúgy ezeket mind emulálja, talán van valami PC kompatibilis klón is, amiben ezek a megfelelő portokon ott vannak (vagy hát open source, nem nehéz átírni a portszámokat).

Bár igaz, hogy a program a 8255-t is használja valamire, F8 címen nem a beépített PPI van.

Sőt, van ott több PPI is, AD kártya, input kártya, output kártya. Jól meg lehetett tömve az eredeti gép.

Szerk.: és a timer sem a beépített PC portokon van, szóval van még egy külön PIT (timer) kártya is.

 

Szóval az eredeti gépben van egy 8251-es UART bővítés, 8 (lehetséges) PPI, és 1 PIT. Ezek mind bővítések, saját portokon.

Első körben az eredeti, vélhetően egyedi hardvert kéne látni, hogy micsoda, mi van benne, mert ugyan lehet nézegetni, hogy a kezelő sw mikor, milyen portra mit küld ki, de ha a másik "végén" nincs semmi, ami fogadná és válaszolna, akkor nem sok érdekeset fog látni...

Igen, erre figyelni kell, mert sokan azt hiszik, hogy az soros port (RS-422, RS-485, TTL UART) meg az RS-232 azonos, közben meg csak hasonló szabványok, de más jelszinttel dolgoznak adott esetben, ezt nem egy videón láttam már, hogy retrósok is végigszopják ilyen USB2serial dongle, átalakító eszközökkel, hogy rádugják, de nem működik, mert a retró eszköz RS-232 jelszintet kérne (5-15V, ami 3,3V-tól érzékelődne minimum aktívnak), de az átalakító, meg modern gép portján a UART csak TTL 5 voltra van tervezve, és még ehhez képest az aktív jelet is csak olyan gyengén küldi, hogy beesik 3,3V alá, így a valódi RS-232 eszköz azt hiszi, hogy active low / idle a jel, és nem veszi észre, hogy igazából kommunikálnak vele.

A helyzetet tovább rontja, hogy sok adapter gyártója, főleg a noname kínai szutykoké, vagy fel sem tünteti pontosan a protokollt, vagy tévesen, és csak azután veszed észre, hogy nem megy, amikor már késő, megvetted.

A másik hasonló népszerű tévedés, hogy a 9 tűs soros portot szinte mindenki DB-9-nek aposztrofálja, közben az meg DE-9, B-sől nem is létezik 9-es. Ami a keveredés alapja, hogy a DB25-ös csatlakozó volt az elődje, és ennek alapján azt hitte mindenki a 9 tűsről, hogy akkor az DB9 lesz. Ezekkel én se voltam tisztában, amíg nem kezdtem el róla videókat nézni, egy világ omlott össze bennem, mikor megértettem, hogy milyen tévedésben vagyok ezzel kapcsolatban én is.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

A 8251 itt ugyanúgy RS232, csak épp nem ez van a PC-ben, mint COMx port, máshogy kell programozni, ráadásul más IO címen is van. RS232 chip is van (volt) egy raklappal, PC-ben COMx hardverek adott IO porton levő 8250,16450 meg 16550 kompatibilis valamik voltak mindig.

A 8255 meg sima PIO, azaz párhuzamos 3x8 bit-es IO chip, semmi köze semmilyen RS-xxx-hez. Legfeljebb bit-banginggel lehet belőle soros portot csinálni, de itt nem ez van.

Szerkesztve: 2024. 05. 06., h – 15:55

A 8251 az F0/F1 címeken az nem a szabvány soros port UART (8250-16450-16550), ez egy sokkal egyszerűbb (koraibb) chip 2 regiszterrel, FIFO nélkül. Ezt nem hinném, hogy bármilyen PC emulátor támogatja. 8-bites gépekben, meg az Atari ST-ben MIDI-re használtak hasonlókat (MC6850 vagy a MOS 6551).

Szerkesztve: 2024. 05. 06., h – 16:02

A nyito alapjan gondolom hogy Win alol probalkozol. No, az nincs keznel, de linuxos QEMU-val relative egyszeru a dolog. Legalabbis a kovetkezo kombinaciot kiprobaltam a regi DOS-os rendszeremmel, es mukodott - azaz ez igy mukodokepes lehet:

  • Tedd fel a tty0tty kernel drivert: ez letrehoz (itt konkretan) 4 nullmodem-part: /dev/tnt0 <-> /dev/tnt1, ... /dev/tnt6 <-> /dev/tnt7 osszekottetesekkel
  • Elinditod a QEMU-t ezzel a parameterrel: `qemu-system-x86_64 -machine accel=kvm -hda ./dos.image -serial /dev/tnt0`

Ekkor a DOS COM1 portjanak a masik vege a nullmodem masik vege lesz, azaz a /dev/tnt1. Kiprobaltam a klasszikus DOS-os parancsokat (copy con > COM1, type COM1), mindket iranyban szepen megy a kommunikacio. Gondolom a COM0COM az a Win megfeleloje a tty0tty-nek, szoval ha az fel van telepitve akkor hasonlo QEMU-parancs kombiancioval azert illene mennie ott is. Azt mindenkepp nezd meg hogy a COM0COM az minek nevezi el ezeket a virtualis soros portokat. Nagyon halvany es/vagy keves tapasztalatom van csak Win-es soros portokkal, de az feltunt hogy ezeket a virtualis es/vagy USB-s soros portokhoz altalaban eleg nagy szamot rendel hozza. Szoval azt mindenkepp nezd meg elobb mindentol fuggetlenul hogy a COM0COM az miket hoz letre _es_ hogy tudsz-e veluk kommunikalni. Peldaul ha a COM0COM az letrehozza a COM6  <-> COM7 part, akkor nyiss meg ket puttyot, az egyiken a COM6-ot, a masikon meg a COM7-et. Es amit az egyik putty-ba begepelsz azt latnod kell a masikon es vice verza. Csak akkor probalgatsd a virtualis gepet, ha ez a teszt sikeresen lement.

Lenyeg a lenyeg hogy valoban szukseges ehhez egy olyan soros port realizacio amit a host operacios rendszere fizikainak is hihet (linux alatt ugye ez a /dev/ttyUSB*, /dev/ttyS*, /dev/ttyACM*, /dev/tnt*, stb, Win alatt pedig a COM* portok). A virtualizator (QEMU, Virtualbox, barmi) pedig megcsinalja azt hogy ezt a fizikai soros port realizaciot hozzakoti a megfelelo I/O portokhoz, igy a guest oprendszer a megfelelo I/O muveleteken keresztul (lasd: COM1:  0x3F8, IRQ 4, stb) eleri az adott fizikai (vagy fizikainak latszo) hardvert. 

Meg akkor azt neznem meg hogy a nullmodem driver mennyire es/vagy milyen gyakran flush-ol. Illetve tenyleg, az is egy fontos szempont hogy konkretan milyen soros port hardvert is virtualizal a virtualizator. Abbol is sokfele van... Jo kerdes hogy a qemu vagy barmi ilyen szempontbol "pluginezheto" esetleg, hogy sajat I/O tartomanyra vagy megszakitasra ra tud-e cuppanni egy kulso modul-szeruseg ami biztositja a szukseges funkcionalitast. Ilyesmit csak Cortex-M0-s meg RISC-V jellegu rendszerekhez csinaltam, x86-hoz annyira nem. 

Szerkesztve: 2024. 05. 06., h – 22:03

Szia!

 

Háát csöppet meredek lesz a válasz, de azt tudom javasolni, hogy szerezz be egy soros bővítő kártyát tedd bele a gépedbe és add át egy az egyben a virtualbox-nak...

Azért meredek a válasz, mert nem tudom létezik e olyan kártya ami jó a mostani gépbekbe és van hozzá DOS driver.

 

FreeDOS egyébként szóbajöhet? Gondolom az natívan is felmegy egy csomo "mostani" PC-re.

 

Szerk: http://www.tronicore.com/en/serial-rs232-pci-card

Oké, én voltam pontatlan, elnézést. :)

 

Az igazság az hogy nem sokat fogalkoztam DOS-al... Vagy túl fiatal vagyok, vagy nem dolgoztam eleget ipari környezetben...

 

Viszont jó hír, hogy az általam linkelt kártyát kezeli a DOS a leírása szerint. (Remélem most nem írtam nagy ökörséget :D )

Egy COM portot a hozzátartozó "IO PORT" és IRQ definiál.

Alapértelmezett értékek itt:
https://en.wikipedia.org/wiki/COM_(hardware_interface)

A virtuális gép BIOSában állítsd be com0-3 portjait erre:

CPUMOD    EQU    81H    ; CPU KARTYA 8255-OS PARANCS SZAVA    ( 1000 0001 )
;
CPUAP    EQU    0F8H    ; CPU KARTYA 8255-OS 'A' PORT CIME
CPUBP    EQU    0F9H    ; CPU KARTYA 8255-OS 'B' PORT CIME
CPUCP    EQU    0FAH    ; CPU KARTYA 8255-OS 'C' PORT CIME
CPUPP    EQU    0FBH    ; CPU KARTYA 8255-OS PARANCS CIME

Az IRQ-t még nézd ki a forrásból, a környéken lehet definiálva, 03h, 04h az alapok - vagy ha megvan a régi kártya nézd meg a jumpereket/dipswitcheket rajta, és lesd le onnan :)
 

Nu akkor összekeverdtem a plusz infótól :)

Ebben az esetben úgy lesz a 3 párhuzamos portból négy soros port hogy nem beszélünk hülyeséget :)
0xf8 miatt gondoltam rá, nekem az maradt meg halvány infónak sorosporttal kapcsolatban...

Lehet hogy akkor a virtuális sorosportot 0xf0 -ra ... (0x3f0 inkább?) kell konfigolni?

;=== CPU 8251 PROGRAMSZAVAI ES CIMEI ===
;
MOD51    EQU    0EEH    ; 9600,8 BIT,NINCS,2 STOP,x16        ( 1110 1110 )
COM51    EQU    37H    ; COMMAND SZO                ( 0011 0111 )
RES51    EQU    40H    ; RESET SZO                ( 0100 0000 )
SIODAT    EQU    0F0H    ; ADATREGISZTER CIME
SIOCOM    EQU    0F1H    ; PARANCSREGISZTER CIME

Mindenesetre az indító gondolatomat továbbra is fenntartom hogy a com portot egy IOport és egy IRQ definiál, ezeket kell egyeztetni a működő host és a virtuálisgép között.
 

Én azt sem értem igazán, mit is csinál az "app", és mire számít.

Az  assemblyből  beollózott részletek alapján egy MCS80 rendszer chipjeit kell megszólítani, valami magasztos cél érdekében. Az is lehet, hogy a 8251 soros portján a bővítőkártya kifelé kommunikál, vagy parancsokat fogad.

"Normális ember már nem kommentel sehol." (c) Poli

Modern gépre is tudsz ISA kártyát kötni, de csak asztali gépnél lehetséges, ha megnézed a YouTube-on ott elmutogatják, valami alaplapi header-re, vagy chipset kivezetésre kell csatlakozni, és onnan ISA riser-ezni, meg külön tápozni. Elég csúnya hack, tényleg csak akkor ajánlom, ha annyira fontos, és máshogy nem tudod megoldani.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Akár még ez is, de ennél a driverei beleszólhatnak a kompatibilitásba. Míg az alaplapi megoldás csúnyább hack, de az működik. A modern PC-k ugyanis épp úgy támogatnak ISA-t, ha más nem a chipset, mert hőmérsékletmérés, stb. azon megy, csak épp az alaplapokon nincs már kivezetése ISA csatlakozóként, bár állítólag még az is van, de csak ilyen méregdrága, ipari gépekbe szánt alaplapoknál.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Szerkesztve: 2024. 05. 07., k – 13:05

Nem egyszerűbb újraimplementálni egy modern PLC-be az egész cuccot?

Vagy akár FPGA-ban az egész HW-t, de ehhez nehezebb lesz vállalkozó embert találni.

Jobban jársz ha beruházol hardveres sniffelésre.

Ha ragaszkodsz a virtuálgépes megoldáshoz, akkor pl. ebből átemeled a megfelelő rutinokat egy qemu-ba, lefordítod és örülsz.

„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)