2011-10-17 9 views
9

मेरे कंप्यूटर नेटवर्क पाठ्यक्रम में हमें मूल रजिस्टरों का उपयोग करके समांतर बंदरगाह प्रोग्रामिंग सीखना है (जैसे कमांड जैसे आउटपोर्टब का उपयोग करना)। मेरे पास समांतर बंदरगाह नहीं है (क्योंकि मैं 2011 में रहता हूं) लेकिन कार्यक्रमों का अभ्यास करना चाहता हूं (मैंने डॉसबॉक्स का उपयोग कर पुराने टर्बोक 3 आईडीई स्थापित किया है)। क्या कोई ऐसा प्रोग्राम है जो समानांतर बंदरगाहों को अनुकरण करता है जैसे this प्रोग्राम धारावाहिक बंदरगाहों का अनुकरण करता है?आभासी समांतर बंदरगाह एमुलेटर

+6

+1 "क्योंकि मैं 2011 में रहता हूं" :-) –

+0

आप इसे स्वयं क्यों अनुकरण नहीं करते? आउटपोर्टब() का अपना संस्करण लिखें। –

+0

मुझे यकीन है कि अगर आप $ 10 के साथ घूमते हैं तो कोई आपके कारण के लिए पुराना पेंटियम दान करेगा :) – Earlz

उत्तर

0

ऐसा लगता है कि डॉसबॉक्स patches के बिना समांतर बंदरगाहों का समर्थन नहीं कर सकता है। यह भी प्रतीत होता है कि virtualbox भी doesn't yet support समांतर बंदरगाहों। लेकिन अगर उन्होंने समांतर बंदरगाहों का समर्थन किया, तो आपको अभी भी दूसरी छोर पर कुछ चाहिए - या तो आपके मेजबान ऑपरेटिंग सिस्टम पर डीबग-ड्राइवर, या यूएसबी जैसे समांतर एडाप्टर (सामान्य खुदरा विक्रेताओं पर उपलब्ध)।

क्या आप parallel port के बारे में क्यों जानना चाहते हैं इसके बारे में और अधिक कह सकते हैं? जैसा कि आप सुझाव देते हैं, 2011 में यह ज्यादातर मृत इंटरफ़ेस है। यदि आप वास्तव में निम्न-स्तर समानांतर शैली I/O के साथ खेलना चाहते हैं, तो आप Arduino प्लेटफ़ॉर्म में देखना चाहेंगे।

+0

मैं बकवास के साथ खेलना नहीं चाहता, बस इतना है कि इस पर 3 लैब असाइनमेंट हैं और मैं उस प्रयोगशाला में नहीं जाना चाहता जहां पुरानी विंडोज 98 सिस्टम रखे गए हों। –

+0

पर्याप्त मेला - लेकिन क्या आपको समांतर बंदरगाह में प्लग किए गए कुछ एल ई डी को जोड़ने, कुछ सामान प्रिंट करने, या पूरी तरह से कुछ और करने की आवश्यकता है? – ObscureRobot

+0

दो कंप्यूटरों को धारावाहिक बंदरगाहों का उपयोग करके बात करने की आवश्यकता है –

0

मुझे किसी भी सॉफ्टवेयर ऑफहैंड के बारे में पता नहीं है, हालांकि मुझे आश्चर्य नहीं होगा अगर Linux Wine ने समानांतर बंदरगाह का समर्थन करने का अच्छा काम किया है, हालांकि मुझे नहीं पता कि भौतिक एलपीटी की कमी होने पर यह पूरी तरह आभासी हो सकता है या नहीं।

जब विरासत संगतता परीक्षण क्या करने वाले हैं, मैं हमेशा बाहर चकित हूँ कितना आसान है एक सस्ते पुराने पीसी मिल रहा है।

अलास, यह अत्यधिक क्षेत्रीय केंद्रित है, लेकिन स्थानीय पुनर्विक्रय स्टोर या कंप्यूटर रीसाइक्लिंग ऑपरेशन पर जाएं। उदाहरण के लिए, पोर्टलैंड में, मैं Free Geek और गुडविल पर जाऊंगा और $ 15 से अधिक का भुगतान करने की उम्मीद नहीं करता हूं। यदि आपका समय अधिक मूल्यवान है, तो यह संभवतः अनुकरणकर्ताओं के साथ गड़बड़ करने की तुलना में अधिक किफायती है और फिर सोच रहा है कि वे कितने अच्छे हैं।

2

चूंकि वातावरण नकली है, यानी आपके पास खेलने के लिए एक वास्तविक बंदरगाह नहीं है, आप अपने कार्यक्रम में बंदरगाह कार्यक्षमता को अनुकरण भी कर सकते हैं।

यहाँ कैसे का उपयोग कर Windows में यह करने के लिए है Structured Exception Handling (SEH):

// Filename: PortEmu.c 
// Compiled with Open Watcom 1.9 as: wcl386 PortEmu.c 

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 

// Port state. Holds the last value written by OUT. 
// IN reads from it. 
volatile UINT32 PortState = 0; 

UINT32 ReadPort(UINT16 PortNumber, UINT OperandSize) 
{ 
    UNREFERENCED_PARAMETER(PortNumber); 

    switch (OperandSize) 
    { 
    default: 
    case 8: 
    return PortState & 0xFF; 

    case 16: 
    return PortState & 0xFFFF; 

    case 32: 
    return PortState; 
    } 
} 

void WritePort(UINT16 PortNumber, UINT OperandSize, UINT32 Value) 
{ 
    UNREFERENCED_PARAMETER(PortNumber); 

    switch (OperandSize) 
    { 
    default: 
    case 8: 
    PortState = (PortState & ~0xFF) | (Value & 0xFF); 
    break; 

    case 16: 
    PortState = (PortState & ~0xFFFF) | (Value & 0xFFFF); 
    break; 

    case 32: 
    PortState = Value; 
    break; 
    } 
} 

// Exception filter to emulate x86 IN and OUT instructions 
// in 32-bit Windows application. 
int IoExceptionFilter(LPEXCEPTION_POINTERS ep) 
{ 
    CONTEXT* c = ep->ContextRecord; 
    UINT8* instr = (UINT8*)c->Eip; 
    int OperandSizeIs16Bit = 0; 

    switch (ep->ExceptionRecord->ExceptionCode) 
    { 
    case EXCEPTION_PRIV_INSTRUCTION: 
    if (instr[0] == 0x66) 
    { 
     OperandSizeIs16Bit = 1; 
     instr++; 
    } 

    switch (instr[0]) 
    { 
    case 0xE4: // IN AL, imm8 
     *(UINT8*)&c->Eax = ReadPort(instr[1], 8); 
     c->Eip += 2 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xE5: // IN (E)AX, imm8 
     if (OperandSizeIs16Bit) 
     *(UINT16*)&c->Eax = ReadPort(instr[1], 16); 
     else 
     c->Eax = ReadPort(instr[1], 32); 
     c->Eip += 2 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xEC: // IN AL, DX 
     *(UINT8*)&c->Eax = ReadPort((UINT16)c->Edx, 8); 
     c->Eip += 1 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xED: // IN (E)AX, DX 
     if (OperandSizeIs16Bit) 
     *(UINT16*)&c->Eax = ReadPort((UINT16)c->Edx, 16); 
     else 
     c->Eax = ReadPort((UINT16)c->Edx, 32); 
     c->Eip += 1 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xE6: // OUT imm8, AL 
     WritePort(instr[1], 8, (UINT8)c->Eax); 
     c->Eip += 2 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xE7: // OUT imm8, (E)AX 
     if (OperandSizeIs16Bit) 
     WritePort(instr[1], 16, (UINT16)c->Eax); 
     else 
     WritePort(instr[1], 32, c->Eax); 
     c->Eip += 2 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xEE: // OUT DX, AL 
     WritePort((UINT16)c->Edx, 8, (UINT8)c->Eax); 
     c->Eip += 1 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    case 0xEF: // OUT DX, (E)AX 
     if (OperandSizeIs16Bit) 
     WritePort((UINT16)c->Edx, 16, (UINT16)c->Eax); 
     else 
     WritePort((UINT16)c->Edx, 32, c->Eax); 
     c->Eip += 1 + OperandSizeIs16Bit; 
     return EXCEPTION_CONTINUE_EXECUTION; 

    default: 
     return EXCEPTION_CONTINUE_SEARCH; 
    } 

    default: 
    return EXCEPTION_CONTINUE_SEARCH; 
    } 
} 

int main(void) 
{ 
    __try 
    { 
    outp(0x278, 0x00); 
    printf("portb=0x%X\n", inp(0)); 

    outp(0x278, 0x55); 
    printf("portb=0x%X\n", inp(0)); 

    outp(0x278, 0xFF); 
    printf("portb=0x%X\n", inp(0)); 

    outpw(0x278, 0xAAAA); 
    printf("portw=0x%X\n", inpw(0)); 

    outpd(0x278, 0x12345678); 
    printf("portd=0x%X\n", inpd(0)); 

    outpw(0x278, 0xAAAA); 
    outp(0x278, 0x55); 
    printf("portd=0x%X\n", inpd(0)); 
    } 
    __except(IoExceptionFilter(GetExceptionInformation())) 
    { 
    } 

    return 0; 
} 

आउटपुट:

C:\>PortEmu.exe 
portb=0x0 
portb=0x55 
portb=0xFF 
portw=0xAAAA 
portd=0x12345678 
portd=0x1234AA55 

बस और अधिक उपयोगी या उससे अधिक कुछ करने के लिए ReadPort() और WritePort() के कार्यान्वयन में परिवर्तन प्रिंटर पोर्ट ऑपरेशन के साथ लाइन में।

+0

आप दृश्यों के पीछे कुछ टीसीपी/आईपी संचार (रीडपोर्ट() और WritePort() में) वास्तव में 2 पीसी के बीच संवाद करने के लिए कर सकते हैं। –