Gönderen Konu: Spectrum'la ilgili bir soru.  (Okunma sayısı 431 defa)

0 Üye ve 4 Ziyaretçi konuyu incelemekte.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Spectrum'la ilgili bir soru.
« Yanıtla #15 : 15 Ağustos 2022, 13:19:04 »
Ben de biraz yoğunum, kafamı vererek inceleyemedim. Ama henüz uğraşmadığım, bir gün mutlaka uğraşmam gerekecek bir konu olduğu için şimdiden teşekkür edeyim İsmail'e. :)

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Spectrum'la ilgili bir soru.
« Yanıtla #16 : 18 Ağustos 2022, 21:28:08 »
Alıntı
Save işlemi bitince "C Nonsense in BASIC, 40:1" mesajı çıkıyor. Böyle bir mesajın çıkması da saçma zaten :)

Bir önceki mesajda belirttiğim hata mesajından kurtulmak için programı save eden kısmın en sonundaki RET komutu yerine

rst 8
defb 255    ; hata kodu-1

yazınca ekrana "0 OK, 40:1" çıkıyor ve hata mesajından kurtuluyoruz.

Hata kodu 27 ve sonrası değerlerde olursa saçma sapan mesajlar çıkıyor. 48K ve +2 modellerde farklı sonuçlar oluyor.

Edit: Ufak bir ekleme yapıyorum.

Listedeki tape header bilgisi kısmında file_name satırını aşağıdaki şekilde değiştiriyoruz.

Alıntı
file_name      defb   $16,1,0      ; AT 1,0
                    defb   249,192      ; RANDOMIZE USR
                    defm   "23755"      ; 23755

Oluşan yeni program yüklenirken artık klasik "PROGRAM : ........" yerine RANDOMIZE USR 23755 çıkacak.
File_name uzunluğu 10 baytı geçmemelidir.

 

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Spectrum'la ilgili bir soru.
« Yanıtla #17 : 21 Ağustos 2022, 23:38:30 »
Listedeki tape header bilgisi kısmında file_name satırını aşağıdaki şekilde değiştiriyoruz.

Alıntı
file_name      defb   $16,1,0      ; AT 1,0
                    defb   249,192      ; RANDOMIZE USR
                    defm   "23755"      ; 23755

Oluşan yeni program yüklenirken artık klasik "PROGRAM : ........" yerine RANDOMIZE USR 23755 çıkacak.
File_name uzunluğu 10 baytı geçmemelidir.

 


Spectrumdaki en sevdiğim tricklerden biri bu. "Program:" kelimesinin üzerine yazdırmaya çalışmaca. elbette sadece yükleme yapılmadan önce ekran kullanılmamışsa ya da cls ile temizlenmişse çalışıyor. Spectrumda birşey yüklemeden önce herkes reset ettiği için %99 durumda çalışıyor olur.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Spectrum'la ilgili bir soru.
« Yanıtla #18 : 16 Temmuz 2023, 22:28:31 »
Kod: [Seç]
;********************************************************
; BASIC + CODE
; Basic programının dibine makine kodu ekleme ve kodu
; normal bir basic programı gibi save etme rutini
;********************************************************
;========================================================
prg_adr equ $af00
run_adr equ $af00
uzunluk equ (prg_end-prg_str)+35
;--------------------------------------------------------
org prg_adr
;========================================================
; INCLUDE edilen dosyada END komutu olmamalıdır !!!.
;       INCLUDE edilen dosyada ORG komutları olmamalıdır. !!!
; INCLUDE edilen dosya ve varsa ilgili .bin
; dosyaları ile basic+code.asm dosyası aynı klasörde
; bulunmalıdır.
; BASIC + CODE haline getirilecek kod burada olmalıdır.
;========================================================
prg_str:
include "dikey_simetrik_ekran.asm"
prg_end:
;--------------------------------------------------------
; PROGRAM SAVE BÖLÜMÜ
;--------------------------------------------------------
; START TAPE... MESAJINI YAZDIR VE TUŞA BASILMASINI
; BEKLE (Bu kısım alıntıdır!!!)
;--------------------------------------------------------
basicode ld a,$fd ; Ensure that channel 'K' is open.
               call $1601
               xor a ; Signal 'first message'.
               ld de,$09a1 ;'Start tape, then press any key.'
               call $0c0a
               set 5,(iy+$02) ;Signal 'screen will require to be cleared'
               scf
call $15d4 ;Bir tuşa basılmasını bekle
;--------------------------------------------------------
; Basic satırını + relocatoru kendi yerine kopyala
;--------------------------------------------------------
ld hl,basic_line
ld de,23755
ld bc,35
ldir
;--------------------------------------------------------
; Asıl programı Basic satırının dibine kopyala
;--------------------------------------------------------
ld hl,prg_adr
ld de,$5cee
ld bc,uzunluk
ldir
;--------------------------------------------------------
; Header'i kaydet
;--------------------------------------------------------
               xor a
               ld ix,header
               ld de,17
               call $04c2
;--------------------------------------------------------
; Basic + Code haline getirilen programı kaydet
;--------------------------------------------------------
               ld a,$ff
               ld ix,23755
               ld de,uzunluk
               scf
               call $04c2
               rst 8
               defb 255 ; Hata kodu-1
;========================================================
; TAPE HEADER BİLGİSİ
;========================================================
header:
file_type defb 0 ;dosya tipi: program
file_name defb $16,1,0 ; AT 1,0
defb $af,$3a            ; CODE
defm "HADES"
data_lenght defw uzunluk
start_line defw 6151
prog_lenght defw uzunluk
;========================================================
; 6151 RANDOMIZE USR 23755 satırının dataları (21 byte)
; relocator dataları (14 byte) --- Toplam 35 byte
;--------------------------------------------------------
basic_line: defb $18,$07,$0e,$00,$f9,$c0,$32,$33
defb $37,$35,$35,$0e,$00,$00,$cb,$5c
defb $00,$0d,$80,$0d,$80
;--------------------------------------------------------
relocator ld hl,$5cee ; main_prg
ld de,prg_adr ; programın asıl adresi
ld bc,prg_end-prg_str
ldir
jp run_adr ; programın run adresi
main_prg ; $5cee
;========================================================
end basicode
;========================================================

Sonunda bitti gibi. Bu kısa rutinle hafızada bulunan bir kodu -Maksimum 20K- artık normal basic programı gibi kaydedip sadece LOAD "" ile yükleyip çalıştırabilirsiniz. Bu rutin ve basic+code haline gelen kod aynı tap dosyasına kaydedilir. Satır numarasını sakın değiştirmeyin. Basic+code haline gelen programın ismini değiştirebilirsiniz.
Rutin relocatable olup başlangıç adresi $AF00 olursa 20K'lık bir kod basic+code haline getirilebilir. Rutinin başlangıcına basic+code haline getirilecek kodun asm dosyası include ile eklenir. Kod içerisinde açıklamalar mevcut.
incbin ile binary kod ekleyip basic+code haline getirmeyi denemedim.