2015-10-06 16 views
7

C'de, belirli bir bellek konumuna nasıl yazabilirim örn. video belleği b800, DOS (gerçek DOS, MS DOS 6.22)C'de, belirli bir bellek konumuna nasıl yazabilirim, ör. video bellek b800, DOS (gerçek DOS, MS DOS 6.22)

C'nin bunu yapmak için yerleşik hiçbir şeyi olmadığını anlıyorum, ancak bazı özel platformlar olabilir. DOS özel API işlevleri yapabilir.

Bunu yapan küçük bir demo programı harika olurdu. Ben hata ayıklama yapabilir biliyorum

(örn bildiğim ayıklama küçük bit bazılarını) -f b800:0 FA0 21 CE (bazı yazar -

ben Turbo C (değil küçücük c derleyici Turbo C derleyicisi TCC.EXE) sahip komut satırına ünlem işareti. Ancak, bir C programı için b800: 0

+3

olabilir kapatmak için oylama olanlar, devlet olarak Bir neden? – barlop

+0

Sisteminizde bölümlenmiş veya disk belleği var mı? Uzak ve yakın işaretçiler yapmanız mı gerekiyor? – dawg

+0

@dawg ** DOS **, segmentasyon anlamına gelir – fjardon

cevap

7

Adresini b800:0000 adresinde 0xb800 numaralı bir segment ve 0x0000 bir ofset kullanır. Bu, 0xb8000 doğrusal adresine karşılık gelir (segment 4 bit ile sola kaydırıldığında ek 0'a dikkat edin).

char far *p = (char far *)0xb8000000; 

:

Bir far pointer inşa etmek gerekir; böylece, real mode büyük olasılıkla, sen Ancak

char *p = (char *)0xb8000; 

kullanmak istiyorum, protected mode bu adrese bir işaretçi oluşturmak için 32 bit değeri, segmente ve ofsete atanan iki 16 bit değere bölünür.

Daha sonra, normalde bu işaretçiyi kullanabilirsiniz:

*p = '!'; 
+2

emin olmak için aslında bir şey görmek için karakter niteliğini ayarlamak daha iyidir. – fjardon

+0

@fjardon haklı. "Renkle dize yaz" işlevi için bir örnek eklemek isteyebilirsiniz. OP, karakter ve öznitelik verilerinin serpiştirilmesinden habersiz olabilir. – usr2564301

+0

Bunun Windows 7 komut isteminde çalıştığından eminim. codeblocks IDE, programları çalıştırmak için bir komut konsolu başlatır. Ama şimdi deniyorum, bu hataları aldım http://i.imgur.com/7jtfbca.png gcc aynı hataları veriyor. http://pastebin.com/raw.php?i=AtscYUJW Kesinlikle win7 32bit, ''f b800: 0 FA0 21 CE' yi bırakan debug.exe dosyasıydı. Bu yüzden neden Win7'de derleme yapamadığını göremiyorum? Eminim – barlop

3

denemek Can bu (denenmemiş benim eski PC yok gibi)

char far* video = 0xb8000000L; 
*(video++) = '!'; 
*(video++) = 0x0A; 
0

Sadece tabanına bir işaretçi oluşturmak Adres ve sonra bir dizi gibi belleğe erişin. Metin modunda, ekranda gösterilen her karakter için iki bayt olduğunu hatırlayın. Birincisi, karakteri kendisi tutar. İkincisi özniteliği korur. Yüksek sıralı 4 bit arka plan niteliğidir ve düşük 4 önalandır. Ön plan özniteliğinde en yüksek bit ayarını yapmak, yüksek yoğunluklu bir renk yapar, arka plan özniteliğinde yüksek sipariş biti ayarlandığında ön planın yanıp sönmesi sağlanır. Bu, arka plan için 8 renk mevcut, ön plan için 16 ve son olarak metnin yanıp sönme yeteneğinin olduğu anlamına gelir. Örneğin modu 0x13 şeyler için

: char far *graphScreen = (char far*) 0xA0000000;

Ve metin modu şeyler için , char far *textScreen = (char far*) 0xB8000000;

ekran belleğine yazmak için o kadar basittir textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;

İlgili konular