RipGrep x86_64-unknown-linux-musl Binaries SIGSEGV Xatoligi
RipGrep 15.2.0 versiyasi x86_64-unknown-linux-musl uchun SIGSEGV xatoliklarini keltirib chiqarishi haqida ma'lumot

ZX Spectrum — bu 8-bit avlodining eng mashhur va o'ziga xos arxitekturaga ega kompyuterlaridan biri. Ko'pgina platformalarda (Commodore 64, MSX, IBM PC) firmware interfeysi jumper jadvallari orqali standartlashtirilgan bo'lsa, Sinclair minimalist yo'lni tanlagan: faqat bir nechta kirish nuqtalari (entry points) belgilangan. Bu dasturchilarga to'g'ridan-to'g'ri tizim ROMining chuqur qismlarini chaqirishni majbur qildi — va bu o'z navbatda, Timex Sinclair 2068 dagi o'zgarishlar dasturlarni ishlamasligi sababi bo'ldi.
Retro-dasturlash faqat nostalgiya emas. ZX Spectrumning cheklovlari (64 KB manzil maydoni, bank-switching yo'qligi 48K da, IY registri va g'alati registrlardan chetlash) — bu zamonaviy tizim dasturlashining (systems programming) klassik darslari. Bugungi mikro-kontrollerlar va IoT qurilmalari ham shu cheklovlarda ishlaydi: xotira kam, interruptlar qiyin, va har bir bayt hisobga keladi. Spectrumda mashin kodi yozish — bu "hech narsasiz nima qilish mumkin" ni o'rganishdir.
Z80 protsessori 64 KB (16-bit manzil) ko'ra oladi. 48K Spectrumda bu to'liq band:
16K modelida RAM $7FFF da tugaydi. 128K versiyasida esa ROM va RAM bank-switching (sahifa almashtirish) orqali boshqariladi — lekin 48K dasturlari uchun muhim qismlar o'zgarmagan qoldi. Bu Sinclairning 2068 dagi xatodan olgan darsining natijasi edi.
Spectrum BASIC da mashin kodi bilan ishlash uchun uchta mexanizm mavjud:
org $7000
ld (iy+2),0 ; Write to upper screen
ld hl,msg
lp: ld a,(hl)
inc hl
or a
ret z
rst $10
jr lp
msg: db "Hello, world!",13,0
BC juftligi qaytaruvchi qiymat bo'ladi.Bu oddiy, lekin kuchli arxitektura: BASIC dasturi o'zini yuklaydi, CLEAR bilan joy ajratadi, keyingi faylni (mashin kodi) yuklaydi va USR orqali ishga tushiradi. Avtor 2017 yildan bu yana bunday "stub" (o'g'iz) dasturidan foydalangan — bu turnkey paketlash uslubining erta misolidir.
ld hl,gfxld e,(iy+65)ld d,(iy+66)ld bc,num_chars*8ldir
Assembler kodi yozganda tizim resurslarining bir qismi qo'lga kiritilmagan (reserved):
clrto: ld (iy+83),a ; ATTR-P and $38 ld (iy+14),a ; BORDERCR rrca rrca rrca out ($fe),a xor a ld (iy+84),a ; MASK-P ld (iy+87),a ; P-FLAGS call $0d6b ; CLS ld a,2 jp $1601 ; CHAN-OPEN
Bu degani, sizning kodingiz IY ni o'zgartirsa, BASIC to'xtab qoladi. Shuning uchun tajribali dasturchilar EXX / EX AF,AF' va IY dan chetlashadi.
getkey: halt bit 5,(iy+1) jr z,getkey ld a,(iy-50) res 5,(iy+1) ret
Ushbu seriya avvalgi BASIC darajasidagi "Manic Mechanic" o'yinini mashin kodiga o'tkazish bilan davom etadi. Keyingi qismlarda: matn rejimi (text mode), foydalanuvchi belgilangan grafikalar (UDG), klaviatura va joystick o'qish — bular BASIC da qanday amalga oshirilgan edi, endi esa "qo'lda" qanday qilinadi.
ld bc,$fdfe ; IN 65022 in BASIC
in a,(c)
rra
jr nc,pressedA
Agar siz Z80 assembler, retro-kompyuter arxitekturalari yoki resurs cheklovlarida samaradorlik haqida qiziqasangiz — bu seriya eng zo'r praktikum bo'ladi.
Asl manba: bumbershootsoft.wordpress.com