ثبات کنترل پورت موازی یک ثبات خروجی است.
خواندن این مکان آخرین مقدار نوشته شده به ثبات کنترل، بجزء برای بیت 5 که فقط نوشتنی است، را بر می گرداند.
بیت 5 یا بیت مسیر داده، تنها در PS/2 و دیگر سیستم هایی که از پورت موازی دو طرفه پشتیبانی می کنند وجود دارد.
اگر شما در این بیت صفر بنویسید، خطوط داده و strobe به عنوان بیت های ورودی هستند، دقیقاً مثل پورت موازی یکطرفه، اگر شما در این بیت 1 بنویسید، خطوط داده و strobe به عنوان ورودی ها هستند.
توجه کنید که در حالت ورودی (bit5=1) بیت صفر ثبات کنترل دقیقاً یک ورودی است.
توجه: نوشتن 1 در بیت 4 ثبات کنترل، IRQ چاپگر را توانا می سازد.
این ویژگی در همه سیستم ها کار نمی کند، بطوریکه فقط برنامه های اندکی از وقفه های پورت موازی استفاده میکنند.
وقتی فعال باشد، پورت موازی یک وقفه OFH را تولید خواهد کرد هرگاه چاپگر انتقال داده را تصدیق می کند.
زمانیکه کامپیوترهای شخصی در حدود 3 پورت موازی جداگانه را پشتیبانی می کردند، می توانست بیشتر از 3 مجموعه از ثبات های پورت موازی در سیستم در هر لحظه وجود داشته باشد.
آدرس های پایه پورت موازی به 3 پورت موازی تحصیص داده شدهاند: 3Bch و 378h و 278h.
ما به اینها به عنوان آدرس های پایه برای: LPT1، LPT2 و LPT3 به ترتیب رجوع می کنیم.
ثبات داده پورت موازی همیشه واقع شده در آدرس پایه برای یک پورت موازی، ثبات وضعیت در آدرس پایه 1+ قرار گرفته و ثبات کنترل در آدرس پایه 2+ قرار گرفته است.
برای مثال برای LPT1 ثبات داده در آدرس 3Bch:I/O و ثبات وضعیت در آدرس 3BDH:I/O و ثبات کنترل در آدرس 3BEH:I/Q قرار دارد.
مشکل کوچکی وجود دارد، آدرس های I\O برای LPT1:، LPT2: و LPT3: داده شده در بالا، آدرس های فیزیکی برای پورت های موازی هستند.
بایوس آدرس های منطقی برای پورت های موازی فراهم می کند.
این امر به استفاده کنندگان اجازه می دهد چاپگرهایشان را Remap کنند (زمانیکه بیشتر نرم افزارها فقط با LPT1: نوشته شده اند).
برای انجام این امر، بایوس هشت بایت در فضای متغیر بایوس در نظر می گیرد ( ) مکان 40:8 شامل آدرس پایه برای LPT1: منطقی است.
مکان شامل آدرس پایه برای LPT2: است.
وقتی نرم افزاری به LPT1: و LPT2: و غیره دستیابی پیدا می کند، آن بطور معمول به پورت موازی آدرس پایه ای که در یکی از این مکان ها رخ داده دسترسی پیدا میکند.
3-21- کنترل یک چاپگر از طریق پورت موازی
اگرچه دستگاههای زیادی وجود دارند که به پورت موازی PC شما وصل می شوند، چاپگرها تعداد گسترده ای از این اتصالات به شمار می آیند.
بنابراین، شح اینکه چطور می شود و چاپگرها را به وسیله پورت موازی کنترل کرد احتمالاً بهترین مثال در حال حاضر است.
با استفاده از صفحه کلید، نرم افزارهای شما در 3 سطح مختلف عمل میکنند:
آن می تواند داده ها را به وسیله داس یا بوسیله استفاده از بایوس یا مستقیماً بوسیله نوشتن روی سخت افزار پورت موازی چاپ کند.
با استفاده از واسط صفحه کلید، استفاده از داس یا بایوس بهترین راه است، اگر شما می خواهید سازگاری را با وسایل دیگر که به پورت موازی وصل شده اند را حفظ کنید.
البته، اگر شما در حال کنترل دستگاههای پورت موازی دیگر هستید، تماس با سخت افزار (به صورت مستقیم) تنها راه شماست.
به هر حال، بایوس پشتیبانی خوبی از چاپگر بفرستید.
1-3-21-چاپ از طریق DOS
MS-Dos دو فراخوانی که شما می توانید برای فرستادن داده ها به چاپگر استفاده کنید را فراهم کرده است.
تابع 05h داس، کاراکتر موجود در ثبات dl را به طور مستقیم به چاپگر می نویسد.
این توابع در فصل داس و بایوس به صورت گسترده بحث شده اند، ما اینجا در این رابطه بیشتر بحث نخواهیم کرد.
برای اطلاعات بیشتر نگاه کنید به «MS-Dos و PC-BIOS و File I\O» در صفحه 699.
MS-Dos دو فراخوانی که شما می توانید برای فرستادن داده ها به چاپگر استفاده کنید را فراهم کرده است.
برای اطلاعات بیشتر نگاه کنید به «MS-Dos و PC-BIOS و File I\O» در صفحه 699.
2-3-21-چاپ تز طریق بایوس اگرچه داس توابع پاسخگویی برای فرستادن کاراکتر به چاپگر فراهم کرده است، اما توابعی که به شما اجازه مقدار دهی چاپگر برای بدست آوردن وضعیت فعلی چاپ را بدهد، فراهم نکرده است.
علاوه بر این داس فقط بر روی :LPT1 چاپ می کند.
روتین nit 17h بایوس کامپیوترهای شخصی، سه تابع چاپ، مقدار دهی مجدد و وضعیت را فراهم کرده است شما می توانید این توابع را برای هر پورت موازی پشتیبانی شده در سیستم بکار ببرید.
تابع چاپ همانند تابع کاراکتر داس است.
تابع initialize، چاپگری را که از سیستم وابسته به اطلاعات زمان استفاده می کند، مقداردهی اولیه می کند.
وضعیت چاپگر، اطلاعاتی را از وضعیت پورت چاپگر در مورد اطلاعاتی که زمانش به اتمام رسیده بر می گرداند.
برای اطلاعات بیشتر در مورد این روتین ها به MS-Dos، PC-BIOS و File I/O نگاه کنید.
3-3-21-یک روتین سرویس وقفه int 17h شاید بهترین راه برای مشاهده عملکرد توابع بایوس، نوشتن یک int 17h ISR جایگزین برای چاپگر است.
این بخش پروتکل دست تکانی و متغیرهایی که درایور چاپگر استفاده می کند را شرح می دهد.
همچنین عملکرد و نتایج برگشتی اختصاص یافته به هر ماشین را توضیح می دهد.
8 متغیر در فضای متغیر بایوس وجود دارد که درایور چاپگر استفاده می کند.
جدول زیر هر یک از این متغیرها را شرح می دهد: شما متوجه خواهید شد که یک اختلاف ناچیز در پروتکل دست تکانی در این کد وجود دارد.
این درایور چاپگر برای گرفتن تصدیق از چاپگر بعد از فرستادن یک کاراکتر منتظر نمی ماند.
در عوض، آن چک می کند تا ببیند آیا چاپگر یک تصدیق دریافت برای کاراکتر قبلی، قبل از فرستادن یک کاراکتر فرستاده است یا نه.
این عمل مقداری زمان می برد زیرا، برنامه چاپ کاراکترها می تواند به صورت موازی با دریافت تصدیق از چاپگر کار کند.
شما همچنین متوجه خواهید شد که این درایور ویژه، بر خطوط Busy(اشغال) نظارت نمی کند.
تقریباً هر چاپگر در زمان هستی خودش این خطوط را غیر فعال می گذارد (نه اشغال)، بخاطر اینکه نیازی به چک کردن آن نیست.
اگر شما با چاپگری که خط Busy ا دستکاری کرده است مواجه بشوید، تغییر کد ناچیز است.
کدهای زیر در سرویس 17h انجام می شود: ; INT17.
ASM یک TSR غیر فعال که اداره کننده Int 17h بایوس را جایگزین می کند ; این روش کار هر یک از توابع Int17h را که یک بایوس استاندارد فراهم می کند ا شرح می دهند; توجه کنید که این کد به int 2Fh وصل نشده است (وقفه تسهیم) ; به هیچ وجه شما نمی توانید این کدها را از حافظه بردارید به غیر از راه اندازی مجدد; اگر شما قصد انجام این دو چیز را دارید (همچنین چک کردن برای نصب قبلی)، فصل; مربوط به برنامه های مقیم را ببینید.
این کدها از این برنامه به خاطر اندازه شان حذف شده اند; Cseg و EndResident باید قبل از سگمنت های استاندارد قرار بگیرند.
; Cseg segment para public ‘code’ Cseg ends سگمنت نشانگر، برای پیدا کردن انتهاب بخش resident EndResident segment para public ‘Resident’ EndResident ends .Xlist include stdlib.a includelib stdlib.lib .list Byp equ Cseg segment para public ‘code’ Assume Cs:Cseg, ds:Cseg OldInt17 dword ?
متغیرهای بایوس ; prtrBase equ 8 prtrTimeout equ 78h این کد عملکرد تابع Int 17h را اداره می کند.
Int 17h یک روتین بایوس برای ; فرستادن داده به چاپگر و گزارش وضعیت چاپگر است.
برای این روتین سه نوع ; فراخوانی مختلف بر طبق محتوای ثبات AH وجود دارد.
; ثبات DX شامل شماره پورت چاپگر است.
; Dx=0 - - useLPT1: ; Dx=1 - - use LPT2: ; Dx=2 - - use LPT3: ; Dx=3 - - use LPT4: چاپ کاراکتر در AL به چاپگر، وضعیت چاپگر در AH برگردانده شده ;AH=0 - - اگر بیت باشد سپس یک خطای Timeout رخ می دهد ; چاپگر را مقدار دهی اولیه می کند.
وضعیت در AHبرگشت داده می شود ;AH=1 - - وضعیت چاپگر در AH برگردانده می شود ;AH=2 بیت های وضعیت برگشت داده شده در AH به صورت زیر هستند: ; ; Bit function Non-error values ; 0 1=timeout error ; 1 unused ; 2 unused ; 3 1=I/O error ; 4 1=selected, 0=deselected ; 5 1=out of paper ; 6 1=Acknowledge ; 7 1=not Busy توجه کنید که سخت افزار، بیت 3 با مقدار صفر بر می گرداند اگر این خطا اتفاق افتاده باشد و 1 اگر هیچ خطایی اتفاق نیفتاده باشد.
نرم افزار بطور معمول این بیت ها را قبل از برگشت دادن به فراخواننده معکوس می کند.
مکان های سخت افزار پورت چاپگر 3پورت استفاده شده بوسیله سخت افزار چاپگر وجود دارد: ; پورت خروجی که داده به چاپگر فرستاده شده است(8 بیت) ; prtporaAdrs پورت ورودی که وضعیت چاپگر می تواند خوانده شود(8 بیت) ;PrtrPortAdrs+1 پورت خروجی که اطلاعات کنترلی به چاپگر فرستاده شده است ; l prtrportAdrs+2 پورت خروجی داده 8 بیتی به چاپگر از طریق این پورت منتقل شده است ; پورت وضعیت ورودی ; ;bit0 :unused.
; bit1:unused.
; bit2:unused.
Error، به طور معمول این بیت به این معنی است که چاپگر با خطایی ; bit3: مواجه شده است به هر حال، بوسیله p101 نصب شده است.
این یک خط برگشتی داده برای اسکن صفحه کلید است.
; bit 4: +SLCT معمولاً این بیت برای تعیین اینکه آیا چاپگ انتخاب شده است یا نه بکار میرود به وسیله p101 نصب شده است.
+pe، وجود 1 در این بیت نشان می دهد که چاپگر با آخر صفحه رسیده ; bit5: است.
در بسیاری از پورت های چاپگر، این بیت به صورت پوج وجود دارد; -ACK، وجود 0 در این بیت بیانگر آن است که چاپگر آخرین کاراکتر ;bit 6 را دریافت کرده و برای پذیرش کاراکترهای دیگر آماده است.
این بیت به طور معمول در بایوس به عنوان بیت 7 استفاده نشده است.
- Busy، وقتی این سیگنال فعال باشد، پرینتر مشغول است و ;bit7 نمی تواند داده ای را بپذیرد.
وقتی این بیت به 1 بیت شده باشد چاپگر کاراکترهای دیگر را می تواند بپذیرد.
پورت کنترل خروجی , + strobe ; bit 0: ; +Auto FD xt: مقدار 1 ذخیره شده در این بیت باعث ; bit 1: می شود چاپگر بعد از چاپ خط فعلی، تعویض خط انجام دهد.
در تعدادی از واسطههای چاپگر (برای مثال کارت گرافیک Hercules) این بیت Null است ; ; -init مقدار 0 در این بیت (برای حداقل 50us) ; bit 2: باعث می شود چاپگر دوباره خودش را مقداردهی اولیه کند.
; +SLCTIN مقدار 1 در این بیت چاپگر را انتخاب می کند ;bit 3: و مقدار 0 سبب می شود چاپگر به حالت off line برود ; +IRQ Enable، مقدار 1 در این بیت اجازه می دهد یک وقفه ; bit 4: رخ بدهد وقتی –ACK از 1 به 0 تغییر می کند.
; ; کنترل مستقیم روی پورت BI-DIR ; bit 5: ; 0= خروجی و =1 ورودی ; ; رزرو شد، باید صفر باشد ; bit 6: رزرو شد، باید صفر باشد ; bit 7: ; ; My INT17 proc Far Assume ds:nothing Push ds Push bx Push cx Push dx Ds به متغیرهای بایوس اشاره می کند Mov bx,40h; Mov ds, bx; CMP dx, 3; Muste be LPT1… LPT4 Ja Invalid prtr; پرش به اختصاص دادن کد به تابع چاپگر CMp oh,0; Jz prtChar CMP ah,2 Jb prtrInit Je prtrstatus اگر آنها یک op code به ما برگردانند.
ما چیزی در این رابطه نمی دانیم فقط بر میگردیم InvalidPrtr: Jmp ISR17 Done مقدار دهی اولیه چاپگر به وسیله پالس دادن خط Init برای بیشتر از 50us ; حلقه به تأخیر زیر حتی برای سریعترین ماشین ها 50 us تأخیر ایجاد می کند ; گرفتن مقدار پورت چاپگر bx, dx; mov prtrInit: تبدیل به ایندکس بایت bx,1; Shl گرفتن آدرس پایه چاپگر dx, prtrBase[bx]; mov آیا این چاپگر وجود دارد dx,dx; test اگر هیچ چاپگری نیست خارج شو InvalidPrtr; test اشاره dx به ثبات کنترل dx,2 add خواندن وضعیت فعلی al, dx in پاک کردن بیت های Al, 11011011b; Init/BIDIR and چاپگر را دوباره ست می کند dx,al; out this will produce at least cx,0; mov PIDelay; a 50 usec delay loop عمل Reset چاپگر را متوقف می کند al, 100b or dx,al out ISR17Done JMP برگشت وضعیت فعلی چاپگر این کد وضعیت پورت چاپگر را می خواند و بیتها را برای برگشت به کد فراخوانی فرمت می کند(پاک می کند) گرفتن مقدار پورت چاپگر bx,dx; mov prtrstatuse: تبدیل به ایندکس بایت bx,1; shl آدرس پایه برای پورت چاپگرdx,prtrBase[bx]; mov هر خطای ممکن al,00101001b; DFLT mov آیا این چاپگر وجود دارد dx,dx; test اتمام اگر این چاپگر وجود نداردInvaldprtr; Je اشاره به پورت وضعیت dx; inc خواندن پورت وضعیت al,dx; in al,11111000b and ISR17Done JMP چاپ کاراکتر در انباره گرفتن مقدار time out bx,dx mov prtchar: CL,prtrTimeout[bx]; mov ; bx,1 shl گرفتن آدرس پورت چاپگر dx,prtrBase[bx]; mov پرش کن اگر اشاره گر پوچ باشد Noprtr2; Jz کد زیر بررسی می کند برای اینکه ببیند آیا یک تصدیق از چاپگر دریافت شده است اگر این کد برای مدت طولانی منتظر بماند یک خطای time out برگشت داده می شود پیام تصدیق در بیت شماره 7 پورت وضعیت چاپگر استفاده شده (که آدرس بعدی از پورت داده چاپگر است) push ax اشاره به پورت وضعیت ; dx inc گذاشتن مقدار Timeout در bl ; bl,cl mov نگاه کن اگر کاربر هیچ tiome out را انتخاب نکرده است.
خطای time out رخ داده است.
در این نقطه خطای I/O- Time out به سیستم برگشت داده می شود و طبقه گفته بالا یا ما شکست می خوریم (خطای time out) یا پورت چاپگر رجوع شده وجود ندارد؛ در هر صورت یک خطا برگشت داده می شود؛ بسیار خوب، ثبات ها را بازیابی کنید و به فراخواننده بر گردانید.
اگر پورت چاپگر وجود دارد و ما یک تصدیق (ACK) دریافت کرده ایم، پس آن برای انتقال به چاپگر خوب است.
این کار بصورت زیر انجام می شود.
تأخیر کوتاه زیر، مدت زمان لازم را برای گردش اطلاعات در طول خطوط موازی فراهم می کند این عمل اطمینان می دهد که داده ها قبل از strobe به چاپگر رسیده اند (این زمان می تواند متغیر باشد و بستگی به ظرفیت خطوط کابل موازی دارد) گرفتن زمان داده برای مقیم کردن ; cx,16 mov قبل از فرستادن strobe ; datasettlep: Loop datasettleLp حالا که داده در پورت خروجی داده چاپگر قرار داده شد یک strobe باید به چاپگر فرستاده شود.
خط strobe به بیت صفر پورت کنترل متصل شده است.
همچنین توجه کنید که این عمل بیت 5 از پورت کنترل را پاک می کند.
این عمل باعث می شود که پورت عملکرد خودش را ادامه بدهد بعنوان یک پورت خروجی اگر یک دستگاه دو طرفه است.
این کد همچنین بیت های 6 و 7 را که IBM ادعا می کند باید صفر باشد را پاک می کند.
وصل به داخل بردار وقفه Int 17.
توجه کنید که جملات بالا cseg را به عنوان سگمنت داده فعلی ساخته اند، بطوریکه ما می توانیم مقدار قدیمی Int 17h را مستقیماً در متغیر old Int 17 ذخیره کنیم.
ما به یک سیستم مرکزی وصل شده ایم، تنها چیزی که باقی می ماند پایان دادن و مستقر شدن است.
Zzzzzzseg segment para public ‘zzzzzz’ Last Bytes byte 16 Dup (?) Zzzzzzseg ends end main 4-21-ارتباطات کامپیوترهای داخلی روی پورت موازی اگرچه چاپ کردن، متداول ترین ابزار استفاده از پورت موازی در کامپیوترهای شخصی است بسیاری از دستگاههای دیگر از پورت موازی برای اهداف مختلفی استفاده میکنند.
ما این فصل را بدون مثالی از برنامه ای به غیر از چاپگر، که از پورت موازی استفاده می کند به پایان نمی بریم این بخش توضیح خواهد داد که چطور فایلها بین دو کامپیوتر از طریق پورت موازی جابجا می شود LAPLink از نرم افزارهای انتقالی یک مثال خوبی از تولیدات تجاری شرحآدرسآدرس پایه برای LPT1:device40:08آدرس پایه برای LPT2:device40:0Aآدرس پایه برای LPT3:device40:0Cآدرس پایه برای LPT4:device40:0ELPT1:Time-out value: نرم افزار گرداننده پورت چاپگر باید یک خطا برگرداند اگر دستگاه چاپگر در یک زمان معقول پاسخگو نباشد.
این متغیر (اگر صفر نباشد) تعیین می کند که چطور درایور برای گرفتن ACK چاپگر در حلقه های 65536 بار تکرار باید منتظر بماند.
اگر صفر باشد درایور برای همیشه منتظر خواهد ماند40:78LPT2:Time out value توضیح بالا را ببینید40:79LPT3:Time out value توضیح بالا را ببینید40:7ATime-out value توضیح بالا را ببینید40:7B و bh;Bh,clmovتخصیص شماره به 65536;Cx,cxWaitlp1 :xorخواندن پورت وضعیت;Al,dxWaitLP2: inذخیره وضعیت فعلی;ah,almovتصدیق چاپگر؟;al, 80hTestپرش کن اگر تصدیق باشد;gotACKJNZ65536 بار تکرار می کند;WaitLPt2Loopکاهش مقدار Time out;bldecRepeat 65536*Time out tims.;WaitLP1JNZ BH,0CMPWaitLP1Je ست کردن فلگ های time out-I/o;ah,9Noprtr2: orخاموش کردن فلگ های استفاده نشده;Ah, of9h;andFlip Busy bit;Ah, 4ohxor برداشتن ax قبلی;Cxpopبازیابی al قبلی;Al, clmov;ISR17DoneJMP Short delay if crazy prtr;Xc,16GetAck: movنیاز به نگهداری زمان بعد از ACK;GALPGALP: Loopدادن کاراکتر به خروجی و;Axpopذخیره دوباره;AxPushاشاره به dx به پورت چاپگر;DxDecخاموش کردن وقفه ها;Push fcliداده خروجی به چاپگر;Dx,alOut اشاره dx به;dxIncپورت خروجی کنترل چاپگر;dxIncگرفتن بیت های کنترل فعلی;Al, dxInوادار کردن خط strobe به مقدار 0 و;Al,01ehAndاطمینان از اینکه آن یک پورت خروجی است;Ax,alOutتأخیر کوتاه برای اینکه;Cx,16Movداده درست بشود;Delay0Delay0: LoopSend out the (t) strobe;Al, 1OrOutput (t) strobe to bit 0;Dx,alOutتأخیر کوتاه برای طولانی کردن strobe;Cx,16MovStrobeDelayStrobedelay:Loopپاک کردن بیت strobe;Al, ofehAndخروجی به پورت کنترل;Dx,alOutذخیره وقفه ها;Popfنگه داشتن مقدار قبلی ax;dxpopذخیره مقدار قبلی al;Al,dlMovdxISR17Done:popCxpopbxpopdspopiretendpMyInt17 MainProcMovAx,csegMovDs,axPrintByte“INT 17h Replacement”, Cr, LfByte“Installing…” Cr, Lf, 0 خاموش کردن وقفه ها;endpCilAx,0MovAx,es:[17h*4]MovWord ptr old int17, axMovEs:[17*4], offset MyInt17MovEs:[17h*4+2], csMov; okay, ints back onSti Print“installed” , cr, Lf, 0ByteAh, 62h ; get this program’s pspMov21 hintdx, End resident; محاسبه سایز برنامهMovSx,bxSubAx,3100h ; Dos TSR commandMov21hIntendpMainEndsCsegSegment para stack ‘stack’SsegByte 1024 Duo (“stack”stkEndssseg