Retro UNIX 386 v2 için kernel programlama/geliştirme notları... (Erdoğan Tan).. Tarih sırasına göre günlük taslak notlar. ------------------------------------------------------------------------------ (Yapılmış ve yapılacak işlemleri/değişiklikleri açıklamak ve hatırlamak için.) benioku2.txt'den devam.. (O dosyanın sonunda Retro UNIX v1.2, Kernel v0.2.2.1 tamamlanmış oldu) ..burada yazdıklarım Retro UNIX v1.2, Kernel v0.2.2.2'in geliştirme notları. 11/06/2022'de.... 1) 'keyboard.s' dosyası kontrolü ve 'KB_INT_1' içinde ufak (short jmp) düzeltme. 2) 'kybdata.s' dosyasında 'K8:' tablosunda PC-XT 286 BIOS'a göre ufak düzeltme. 3) 'sysdefs.s' dosyasında NBUF (buffer) sayısını 6'dan 16'ya çıkardım. 12/06/2022'de... 1) u6.s'de 'writei' içinde syswrite'i 0 character count ile çağırınca lpr (LPT) inode'u ise (LPT1) printer status ('lpr_stat' üzerinden) döndürecek şekilde ufak değişiklik. 2) u6.s'de 'wlpr' prosedürü LPT1'e istenen sayıda karakterleri 'cpass' kullanarak yazıyor. Kod MSDOS 3.3 bios'undaki printer driver (PRN$WRIT) kodundan değiştirme. 3) u6.s'de 'lpr_stat' prosedürü printer'ın durumunu döndürüyor/veriyor. Kod MSDOS 3.3 bios'undaki printer driver (PRN$STAT) kodundan değiştirme. 4) u9.s'de IBM PC-AT BIOS v3 (PRT.ASM) kaynak kodundan (INT 17h kodundan) uyarlarma int17h prosedürünü yazdım. Paralel porttan yazdıma düşük seviye (donanım düzeyi) kodu. Sadece LPT1 (378h) protuna göre basitleştirdim. Bu kod write, status ve init kısmından oluşuyor. Printer initialization kısmını u7.s'de 'sysopen' ile çalıştıracak şekilde düzenledim. Hata dönüşünde yeniden denemeden önce bekleme süresi için original PC-AT bios kodu yerine 1999 yılında yazılmış award bios kodundan, printer kontrolünde kullanılan (refresh süresine bağlanmış, 30 mikro saniye temelinde döngü sayısı kullanılan) bekleme/geciktirme (delay) yöntemini kullandım. (Tekrar sayısı ve her br deneme için bekleme süresi 386 bios'una göre.) 5) u7.s'de /dev/lpr için 'ejec' ('lpr_init') initialization kodunu yazdım. 'sysopen' ile '/dev/lpr' (inode 16) açılınca )'iopen' içinden) 'ejec' initialization kodu çağrılıyor. 'iopen' içinde 'sysclose' için herhangi bir işlem yapılmıyor. Diğer ayrıntıları yukarıda (4'deki) gibi. 6) 'sysdefs.s' içine olası printer hata kodlarını ekledim. Hata kodları MSDOS 3.3'deki gibi, time_out, out of paper, io error, busy 7) Printerdan sayfa(lar) yazdırmak için.. 'syswrite' şu şekilde kullanılabilecek: sys _write, ebx, ecx, edx ebx = 'sysopen' den dönüşteki file descriptor ecx = kullanıcının (programın) yazdırma buffer'ı/tamponu edx = yazdırılacak karakter sayısı (yazdırma işlemi, boş karakter de yazdırılsa edx'deki sayı kadar karakter yazınca tamamlanacak). Yazdırma hatası olmazsa... Dönüşte: (cf=0) eax = yazdırılan karakter sayısı Yazdıma hatası olursa... Dönüşte: (cf=1) eax = hata kodu ('sysdefs.s' içinde tanımlanmış kodlardan) edx = yazdırılan karakter sayısı (istenilenden az) syswrite sistem çağrısı edx = 0 ile yapılırsa, eax'de printer status döner (IBM PC-AT ROMBIOS printer status flag AH'de, error code AL'de) 14/06/2022'de... shell'de '>' ile başka bir ekrana (tty'ye) yönlendirme yapıldığı zaman, u9.s'deki putc' prosedürünün dallandığı 'write_tty' prosedürünün en son 'set_cpos' aşamasında aktif ekran sayfası kıyaslaması yaparken (aktif ekran index -pseudo tty- numarası yazmanın yönlendirildiği ekranın -pseudo tty'nin- index numarasından küçük olduğu için), 'cmp' işlemci komutu sonucunda cf = 1 olarak dönüyordu. Bu da 'putc' prosedürünün (u6.s'deki 'wtty_1' de) carry/hata ile dönmesi dolayısıyla, yönlendirilmiş ekranda 'sleep' durumuna yol açıyordu; yönlendirilmiş ekran aktif ekran olmadıkça da 'sleep' durumundan çıkılamıyordu. 'putc'nin pseduo tty'ye yazdıktan sonra carry ile dönmesini, dönüşe 'clc' koyarak önledim. *** Retro UNIX 386 v1.2 (Kernel v0.2.2.2) değişiklik/düzeltme notları sonu. ***