प्लेस्टेशन 2 के लिए प्रोग्रामिंग: सीडी (डीवीडी)-लाइब्रेरी से - भाग एक

छवि

1. मैं लंबे समय तक नहीं लिखने के लिए माफी चाहता हूं।
2. तैयार PS2 SDK।

मैं सीडी (डीवीडी) से-लाइब्रेरी के लिए बाहर देखना चाहता था, इसलिए आपको इस लेख के दूसरे भाग के अंत में पीएस 2 एसडीके स्थापित करने के लिए लिंक और एक गाइड मिलेगा।
विषय काफी जटिल है। अगर कोई अन्य गैर-भुगतान होस्टिंग PS2 SDK को हस्तांतरित करेगा, तो मैं भी आभारी रहूंगा
PS2 SDK यहाँ उपलब्ध हैNarod.ru
चुंबक (लिंक सामान्य रूप से हैबर पार्सर के लिए धन्यवाद पेस्ट नहीं करता है): चुंबक :? Xt = urn: btih: F6114E45C5E392E613F2547C466FADB5DA3A13 और dn = sce.zip & tr = udp% 3a // tracker.openbittbittorittor
एक और कड़ी । धन्यवाद कॉन्स्टेंटिनस और एंम्प्रो



सीडी (डीवीडी) -ROM लाइब्रेरी से।



IOP और EE दोनों का उपयोग ड्राइव के साथ काम करने के लिए किया जाता है।
ड्राइव के साथ काम करने के लिए जिम्मेदार लाइब्रेरी को "libcdvd" (वह है) कहा जाता है।

ईई लाइब्रेरी कनेक्ट करने के लिए: "libcdvd.a"।
हेडर फ़ाइल: "libcdvd.h"।
IOP पुस्तकालय कनेक्ट करने के लिए: "cdvdman.ilb"।
IOP मॉड्यूल: "cdvdman.irx" और "cdvdfsv.irx"।

क्षेत्र



डेटा पढ़ने के लिए सामान्य क्षेत्र का आकार एक डीवीडी के लिए 2048 बाइट्स है।
उनके लिए केवल एक विधा है।
खैर, सीडी के लिए मानक आकार (2048 भी)। हालाँकि, सेक्टर एक अलग आकार हो सकता है, लेकिन फिलहाल, इससे कोई फर्क नहीं पड़ता।

रोटेशन की गति और डेटा ट्रांसफर



PS2 CAV विधि का उपयोग करता है, इसलिए डिस्क गति बनाए रखी जाती है और स्थिर रहती है। इस प्रकार, बाहरी और आंतरिक पटरियों पर डेटा पढ़ने की गति अलग होगी।


विचित्र रूप से पर्याप्त है, रोटेशन की गति को निम्नलिखित तीन तरीकों से नियंत्रित किया जा सकता है:
- स्ट्रीमिंग मोड (SCECdSpinStm) का उपयोग करना: गति को इस तरह से समायोजित किया जाता है कि रीडिंग को स्थिर डेटा दर पर विश्वसनीय तरीके से किया जा सके।
- सामान्य डेटा मोड (SCECdSpinNom): शुरुआत में, अधिकतम गति से पढ़ने का प्रयास किया जाएगा और, एक पठन त्रुटि के साथ, गति उस पर कम हो जाएगी जिस पर पढ़ना सामान्य होगा।
- दोहरी परत डिस्क मोड (SCECdSpinDvdDL0): स्ट्रीमिंग मोड के समान, केवल दोहरी परत डिस्क के लिए। गति को ट्रैक शून्य से पढ़ा जाता है।

फाइल सिस्टम



फाइल सिस्टम का उपयोग ISO-9660 प्रारूप में किया जाता है।
फ़ाइलों और निर्देशिकाओं की संख्या पर एक सीमा है, हालाँकि, इसे फ़ाइलों और फ़ोल्डरों के नाम में अक्षरों की संख्या के कारण बढ़ाया जा सकता है।

फ़ोल्डर में निर्देशिकाओं की संख्या: 40।
अधिकतम घोंसले का स्तर: 8।
निर्देशिका में फ़ाइलों की संख्या: 30।
फ़ाइल और फोल्डर नामों में केवल अंग्रेजी वर्णमाला और अंडरस्कोर के अक्षर, संख्याएँ होनी चाहिए। सभी फ़ोल्डर और फ़ाइल नाम अपरकेस होना चाहिए।
फ़ाइल नाम में फ़ाइल नाम में 8 से अधिक वर्ण और एक्सटेंशन में 3 वर्ण शामिल नहीं हो सकते।
एक फ़ोल्डर नाम में 8 से अधिक वर्ण शामिल नहीं हो सकते।

डिस्क के साथ काम करें



एक डिस्क को पढ़ने के लिए, आपको इसे एक्सेस करने और मोड निर्दिष्ट करने की आवश्यकता है।
प्रोसेसर के बाद यह वैधता के लिए जाँच करता है। =)
फिर आपको इसे एक्सेस करने की आवश्यकता है।
कार्यक्रम को शुरू करने के बाद, आपको sceCdInit () फ़ंक्शन के साथ ड्राइव को इनिशियलाइज़ करना होगा।
SceCdInit फ़ंक्शन निम्न मापदंडों में से एक लेता है:

फ़ंक्शन एक संख्या देता है: 0 - आरंभीकरण विफल हुआ, 1 - आरंभीकरण ठीक हो गया, 2 - आरंभीकरण पहले ही पूरा हो चुका है।

उसके बाद, आपको sceCdMmode () फ़ंक्शन के साथ ड्राइव ऑपरेशन मोड को निर्दिष्ट करने की आवश्यकता है, जो क्रमशः सीडी और डीवीडी डिस्क के लिए दो SCECdCD या SCECdDVD मापदंडों में से एक को स्वीकार करता है। 1 या 0 देता है, जो परिणाम के अनुरूप है या नहीं।

एक उदाहरण:

int main(){
sceSifInitRpc(0);
sceCdInit(SCECdINIT); /* CD/DVD */
sceCdMmode(SCECdCD); /* = CD-ROM */
/* */
while ( !sceSifRebootIop(IOPRP) );
while ( !sceSifSyncIop() );
/* */
sceSifInitRpc(0);
sceCdInit(SCECdINIT);
sceCdMmode(SCECdCD); /* = CD-ROM */
sceFsReset();
/* … */

* This source code was highlighted with Source Code Highlighter .


फाइलें पढ़ना



किसी फ़ाइल को पढ़ने के लिए, आपको पहले यह पता लगाना होगा कि यह किस सेक्टर पर है।
ऐसा करने के लिए, एक फ़ंक्शन sceCdSearchFile () है जो निम्नलिखित तर्क लेता है:

रिटर्न 0 या 1, जिसका अर्थ है कि फ़ाइल क्रमशः नहीं मिली या नहीं मिली।

यानी कुछ इस तरह से: ret = sceCdSearchFile (& fp, "\\ SYSTEM.CNF");

यह जानकारी कैश की गई है।

किसी फ़ाइल को पढ़ने के लिए, एक sceCdRead () फ़ंक्शन होता है जो निम्न पैरामीटर लेता है: LSN, पढ़ने के लिए सेक्टरों की संख्या, पढ़ने के लिए बफर, पढ़ने का प्रकार।
आपको यह याद रखने की ज़रूरत है कि फ़ंक्शन अवरुद्ध नहीं है, इसलिए आप यह पता लगा सकते हैं कि डेटा ट्रांसफर sceCdSync () फ़ंक्शन का उपयोग करके पूरा किया गया है।

SceCdSync () फ़ंक्शन एक पैरामीटर को स्वीकार करता है, जो दो प्रकार के हो सकते हैं:


यह इंगित करने के लिए कि आप किस प्रकार के पढ़ने का उपयोग कर रहे हैं, sceCdRMode () फ़ंक्शन है, जो निम्नलिखित मापदंडों को स्वीकार करता है:


संरेखण डेटा का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि फ़ंक्शन हमेशा एक ही मेमोरी आकार में रहता है।

एक फ़ंक्शन भी है जिसके माध्यम से आप पता लगा सकते हैं कि किस प्रकार की त्रुटि हुई -
sceCdGetError ()।
यदि कोई त्रुटि नहीं थी, तो त्रुटि प्रकार या SCECdErNO लौटाता है।

कॉलबैक का उपयोग करना



प्रतीक्षा के बजाय, आप कॉलबैक फ़ंक्शन का उपयोग कर सकते हैं। उन्हें sceCdCallback () फ़ंक्शन का उपयोग करके असाइन किया गया है। यह फ़ंक्शन के पते पर एक पॉइंटर के रूप में एक पैरामीटर लेता है। ध्यान रखें कि एक फ़ंक्शन को कहा जाता है, भले ही एसिंक्रोनस फ़ंक्शन समाप्त हो गया हो। हालांकि, फ़ंक्शन कॉल का कारण कोड पहले पैरामीटर में पारित किया गया है।
आप कॉलबैक फ़ंक्शन को निष्पादित करते समय एक फ़ंक्शन असाइन नहीं कर सकते हैं जिसे (टेओटोलॉजी के लिए खेद है)।
यदि आप पैरामीटर के बजाय 0 पास करते हैं, तो कॉलबैक हटा दिया जाएगा।

कॉलबैक से फ़ंक्शन में दिया गया पैरामीटर निम्न मान ले सकता है:


आप sceCdRead () जैसे फ़ंक्शन को कॉल नहीं कर सकते;
फ़ंक्शन 0 या पिछले कॉलबैक पर पता देता है।

स्ट्रीम पढ़ने



स्ट्रीमिंग रीडिंग के लिए, IOP मेमोरी आवश्यक है। स्ट्रीम रीडिंग का उपयोग करने के लिए, आपको sdSifLoadModule () फ़ंक्शन के माध्यम से cdvdstm.irx मॉड्यूल कनेक्ट करना होगा।

स्ट्रीम को IOP में लोड किया गया है और डेटा को वहां से पढ़ा जा सकता है।

स्ट्रीमिंग रीडिंग के लिए निम्न कार्यों का उपयोग किया जाता है।

sceCdStInit () - स्ट्रीम को इनिशियलाइज़ करें और बफर सेट करें।
विकल्प:
- स्ट्रीम क्षमता (2048 बाइट्स के क्षेत्रों की संख्या का उपयोग करके निर्धारित)।
- धारा के भागों की संख्या (विनिर्देश के अनुसार - छल्ले)। 3 या अधिक भागों वाले बफर में 16 से अधिक क्षेत्रों की क्षमता होनी चाहिए।
- स्मृति में धारा का पता।
IOP में स्थान प्राप्त करने के लिए, आपको EE कर्नेल से sceSifAllocIopHeap () फ़ंक्शन का उपयोग करना होगा।
फ़ंक्शन 0 या 1 देता है, जो गलत या सही है।

sceCdStStart () - फिलिंग स्ट्रीमिंग शुरू करें।
विकल्प:
- डिस्क से पढ़ना शुरू करने की स्थिति। LSN द्वारा उपयोग किया जाता है।
- sceCdRMode () के माध्यम से पढ़ने का प्रकार।
पिछले वाले के समान ही लौटाता है।

sceCdStRead () - एक स्ट्रीम से डेटा पढ़ें।
विकल्प:
- बफर से पढ़ने के लिए सेक्टरों की संख्या।
- डेटा पढ़ने के लिए पता (64 बाइट्स से संरेखित होना चाहिए)।
- पढ़ने के प्रकार: STMNBLK - बफर में है कि जानकारी वापस कर देंगे; STMBLK - कोई त्रुटि है या नहीं, डेटा लौटाएगा।
- त्रुटि संख्या के लिए चर।
पढ़े गए सेक्टरों की संख्या लौटाता है।

त्रुटि संख्या निम्नानुसार हो सकती है:


sceCdStPause () - पॉज़ स्ट्रीमिंग फिलिंग।
कोई पैरामीटर नहीं हैं। ऑपरेशन की सफलता को 0 या 1 के रूप में लौटाता है।

sceCdStResume () - स्ट्रीम फिलिंग की वापसी।
कोई पैरामीटर नहीं हैं। ऑपरेशन की सफलता देता है।

sceCdStSeek () - एक स्ट्रीम पढ़ने के लिए स्थिति का परिवर्तन।
पैरामीटर LSN को स्वीकार करता है। ऑपरेशन की सफलता देता है।

sceCdStStat () - बफर को स्ट्रीम पढ़ने की स्थिति प्राप्त करें।
कोई पैरामीटर नहीं हैं। त्रुटि के मामले में रिटर्न 0 या सेक्टर की संख्या पढ़ी जाती है।

sceCdStStop () - एक स्ट्रीम के साथ स्थिति भरना बंद करें
कोई पैरामीटर नहीं हैं। ऑपरेशन की सफलता देता है।

SceCdStInit () को कॉल करने और sceCdStStart () को कॉल को इनिशियलाइज़ करने के बाद, डेटा को बैकग्राउंड में पढ़ा जाएगा, जो निर्दिष्ट सेक्टर से शुरू होता है, और इसे बफर में सेव करें। SceCdStRead () निष्पादित होने के बाद, बफर में डेटा को क्रमिक रूप से पढ़ा जा सकता है।
कृपया ध्यान दें कि स्ट्रीमिंग के दौरान डिस्क तक पहुँचने के लिए निम्नलिखित libcdvd फ़ंक्शन का उपयोग नहीं किया जा सकता है (मैं उन्हें बाद में समझाऊंगा):


जानने की जरूरत है



लब्बोलुआब यह है कि ड्राइव IOP से जुड़ा है और किसी तरह आपको IOP कार्यों का उपयोग करना है।
निम्न डेटा IOP और EE के बीच भिन्न होता है:
- ईई से डेटा की रीडिंग को पूरा करने का आदेश ईई प्रोसेसर में डेटा की प्राप्ति के पूरा होने का मतलब है, न कि डिस्क से डेटा को पढ़ने का पूरा होना;
- ईई पक्ष पर त्रुटियां आईओपी पक्ष पर बाद की कार्रवाई को प्रभावित करती हैं;
- डेटा को EE में ट्रांसफर करते समय, मेमोरी बाइट 64 बाइट्स तक होती है।
- ईई में स्ट्रीम की प्राथमिकता जो डिस्क के साथ काम करेगी, आईओपी में प्राथमिकता के अनुरूप होगी, इसलिए सावधान रहें, अन्यथा आप अन्य आईओपी प्रवाह के सामान्य प्रसंस्करण को खो सकते हैं।

पहले भाग के अंत की ओर



विषय बहुत जटिल है। दूसरे भाग में मैं बाकी लेख और विंडोज और लिनक्स पर पीएस 2 एसडीके को कैसे स्थापित किया जाए, इसके बारे में बताऊंगा।

पुनश्च : मैं किसी भी टाइपोस के लिए माफी माँगता हूँ।

Source: https://habr.com/ru/post/In135898/


All Articles