Dasturlash

ZX Spectrumda mashin kodi: 48K arxitekturasi va BASIC bilan hamkorlik

4-avgust, 2026, 16:210 ko'rish4 daqiqa o'qish
ZX Spectrumda mashin kodi: 48K arxitekturasi va BASIC bilan hamkorlik

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.

Nega bu bugungi kun ham muhim?

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.

a video game screen

Xotira xaritasi: har baytning qiymati

Z80 protsessori 64 KB (16-bit manzil) ko'ra oladi. 48K Spectrumda bu to'liq band:

  • $0000–$3FFF — 16 KB tizim ROM (BASIC interpretyor, klaviatura, ekran rutinalari).
  • $4000–$5AFF — grafik xotira (bitmap + rang atributlari).
  • $5B00–$FFFF — foydalanuvchi dasturlari, BASIC o'zgaruvchilari va tizim o'zgaruvchilari uchun RAM.

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.

The same banner with rounded edges

BASIC va mashin kodi: qanday ham yashashadi

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
  • SAVE "name" CODE start, length — ikkilik (binary) blokni kasetga yozadi.
  • LOAD "" CODE — ikkilik faylni yuklaydi (adres avtomatik).
  • CLEAR address — BASIC ning yuqori chegarasini pastlantirib, mashin kodi uchun xavfsiz zona yaratadi.
  • RANDOMIZE USR address — mashin kodi podprogrammasini chaqiradi; 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

Dasturchi cheklovlari: nima qilib bo'lmaydi

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
  • Interrupt vektorlari va xizmati (IM 1 rejimi).
  • G'alati registr to'plami (shadow registers) — tizim ichki keraklari uchun.
  • IY registri — BASIC interpretyori buni o'zgaruvchilar jadvali ko'rsatgichi sifatida ishlatadi.

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

Kelajakda nima kutiladi

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

Manba: Hacker News
#zx-spectrum #z80 #assembly #retro-programming #machine-code
Telegram da muhokama qilish