Gönderen Konu: BASICODE V1.0  (Okunma sayısı 462 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 184
BASICODE V1.0
« : 29 Temmuz 2023, 23:15:49 »
Kod: [Seç]
;**************************************************************
; BASICODE v1.0
;    Bir basic satırının dibine makine kodu ekleme ve
; kodu normal bir basic programı gibi save etme rutini.
; Basicode'un  başlangıç adresi, basicode haline getirilecek
; çalışan kodun kendi adresinden $73 eksik olmalıdır.
; Örnek program $8000 adresinden itibaren bulunmaktadır ve
; çalışma adresi $8000'dir.
;**************************************************************
org $8000-$73
;==============================================================
run_adr equ $8000
kaynak equ prog_str
hedef equ prog_str
uzunluk equ prog_end-prog_str
prg_uzunluk equ uzunluk + (prog_str-basic_line) ; 30
; 30= Basic satırı + relocator uzunluğu
;==============================================================
; PROGRAM SAVE BÖLÜMÜ
; START TAPE... MESAJINI YAZDIR VE TUŞA BASILMASINI BEKLE
;--------------------------------------------------------------
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 ve asıl programı
; basic satırının dibine kopyala
;--------------------------------------------------------------
ld hl,basic_line
ld de,23755
ld bc,30
ldir
ld hl,kaynak
ld de,$5ce9
ld bc,uzunluk
ldir
;--------------------------------------------------------------
; Header'i ve Basic + Code haline getirilen programı kaydet
;--------------------------------------------------------------
               xor a
               ld ix,header
               ld de,17
               call $04c2

               ld a,$ff
               ld ix,23755
               ld de,prg_uzunluk
               scf
               call $04c2
               rst 8
               defb 255 ; Hata kodu-1
;==============================================================
; FILE 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 prg_uzunluk
start_line defw 6151
prog_lenght defw prg_uzunluk
;==============================================================
; 6151 RANDOMIZE USR 23755 satırının dataları (16 byte)
; relocator rutini (14 byte) --- Toplam 30 byte
;--------------------------------------------------------------
basic_line defb $18,$07,$08,$00,$f9,$c0,$32,$33
defb $37,$35,$35,$0e,$00,$00,$cb,$5c
;--------------------------------------------------------------
relocator ld hl,$5ce9 ; programın bulunduğu adres
ld de,hedef ; programın asıl adresi
ld bc,uzunluk ; programın uzunluğu
ldir
jp run_adr ; programın çalışma adresi
;==============================================================
; BASIC + CODE haline getirilecek kod burada olmalıdır.
;==============================================================
prog_str:
incbin "dikey_simetrik_ekran.bin"
prog_end:
;--------------------------------------------------------------
end basicode
;==============================================================

Başka bir başlıkta yer alan basic satırının dibine kod ekleme konusu için yeni başlık açmaya karar verdim.
Spectrumda hafızada bulunan bir makina dili program/data SAVE "programadı" CODE adres,uzunluk şeklinde kaydedilir. LOAD "" CODE ile yüklenir.
LOAD "" CODE adres komutu kullanılırsa kod farklı bir adrese yüklenebilir.
Basic programları kayıt edilirken programın auto-start olması için SAVE "programadı" LINE satır_no şeklinde komut kullanılır. satır_no basic programın hangi satırdan itibaren çalışacağını belirtir.
Ancak LOAD "" CODE komutu için autostart özelliği yoktur. Bu yüzden içinde, CLEAR adres-1, LOAD "" CODE ve kodu çalıştırmak için RANDOMIZE USR adres gibi komutlar bulunan bir basic program yazılır ve auto-start yapacak şekilde kayıt edilir. Sonrasında ise kod kaydedilir. Dolayısıyla kod yüklemek için bir basic programa ihtiyaç duyulur.
İster basic program isterse kod olsun save işlemi sırasında önce bir header bilgisi kaydedilir hemen arkasına basic program veya kod kaydedilir.
Kısaca, bir kod kaydetmek ve yükleyip çalıştırmak için,
Header + Basic Loader + Header + kod/data şeklinde bir kayıt süreci vardır.

Gelelim BASICODE programına;
BASICODE hafızada bulunan bir makina dili programını bir Basic programıymış gibi sadece Header + Kod/data şekline getirir ve save eder.
Basicode'un uzunluğu 115 ($73) bayttır. Daha önce yazıp çalıştırdığınız bir programınızın listesinin başına Basicode'u eklemeniz ve programın başlangıç adresini değiştirip yeniden compile etmeniz yeterlidir. Ayrıca kendi kodunuzun çalışma adresini listenin başındaki run_adr kısmına girmeniz gerekmektedir. Veya daha önceden binary file olarak save edilen bir programı ekleyebilirsiniz.
Örnek programda, normalde $8000 adresinde bulunan ve aynı adresten itibaren çalışan bir binary file kullanılmıştır. Programın başlangıç adresi $8000-$73 olarak tanımlanmıştır.

Şimdi gelelim basicode'un bir özelliğine.
Normalde auto-start bir programın listesini yükleme sonrası göremezsiniz. Fakat yükleme işlemini LOAD "" ile değilde MERGE "" ile yaparsanız program auto-start olsa bile çalışmaz ve programın listesini görebilirsiniz.
BASICODE ile oluşturulan program LOAD "" yüklenip çalışmasına rağmen MERGE "" ile yüklendiğinde makina resetlenmektedir.
Program listesinde, basic_line satırındaki $08 ve $00 değerleri normalde satır uzunluğunun LO-HI formatındaki değerleridir ama olması gereken değerlerden farklı girilmiştir.

$08-$00 yerine $00-$FF girilirse MERGE "" komutu ile yükleme sonrası Out Of Memory hatası alınır ve liste alınamaz.
$08-$00 yerine $09-$00 girilirse MERGE "" komutu ile yükleme sonrası ekran kayar ve spectrum kilitlenir.
$08-$00 yerine $07-$00 girilirse MERGE "" komutu ile yükleme sonrası liste gözükür ama editlenemez.

Basicode'u printer buffer'da çalışacak şekilde yazmaya çalıştım ama beceremedim. +2 modelde basicode'u printer buffera attığımda makina sapıttı. 48K modelde önce printer buffera basicode'u yükleyip sonra asıl kodu yüklediğimde printer bufferın temizlendiğini gördüm.
Daha sonra bir basic programı yazıp yükleme ve çalıştırma adreslerini gerekli yerlere poke etmeyi düşündüm. Önce .tap dosyasını manuel olarak insert edip basic üzerinden input komutuyla basicode haline getirilecek programın ismini girip load name$ code gibi birşey olur mu diye tırmaladım. Diğer yandan program uzunluğunu ve çalışma adreslerinide elle girmek gerekecekti. Yükleme sonrası sistem değişkenleri kullanarak program uzunluğu bulunabilir diye düşündüm. Düşündüm, taşındım sonunda basic bilgimin buna yetmediğini anladım. Basic'i en son 1987'de sınavda kullanmıştım.

Aşağıdaki gibi bir program tasarlamıştım :)

10 load "basicode" code 23296
20 input "program adı:" pn$
30 load pn$ code
40 input "program uzunluğu:" pu : poke ...,.. : poke ...,..
50 input "çalışma adresi:" ça : poke ...,.. : poke ...,..
60 randomize usr 23296


Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2958
  • Advanced User Simulator
    • ae unutmadan
Ynt: BASICODE V1.0
« Yanıtla #1 : 30 Ağustos 2023, 20:42:16 »
hades yaz günü kendini z80'e vermiş, darısı başıma diyorum, bu yaz çok tembellik ettim, hiçbirşey yapmadım desem yeridir.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 184
Ynt: BASICODE V1.0
« Yanıtla #2 : 09 Şubat 2025, 20:30:57 »
Kod: [Seç]
;------------------------------------------
; BASICODE V2.0
; 09-Feb-2025 / Hades
; Adding code to the end of the Basic
; line and saving the resulting program.
; Only works in 48K Spectrum!
;------------------------------------------
org $ff60
;------------------------------------------
; RANDOMIZE USR 23302 to run
;------------------------------------------
offset equ $-$5b00
;------------------------------------------
; $5b00-01 (23296-23297): Lo-Hi format real memory adress
; $5b02-03 (23298-23299): Lo-Hi format program lenght
; $5b04-05 (23300-23301): Lo-Hi format program run adress
;------------------------------------------
prg_mem dw 0 ; real memory adress of your program
prg_len dw 0 ; lenght of your program
prg_run dw 0 ; run adress of your program
;------------------------------------------
; Copy the program information to the necessary places.
;------------------------------------------
basicode ld hl,(prg_mem-offset) ; programın bellekteki asıl yeri
ld (progadr+1-offset),hl
ld hl,(prg_len-offset) ; programın uzunluğu
ld (proglen+1-offset),hl
ld de,33
add hl,de
ld (data_len-offset),hl ; data uzunluğu
               ld (prog_len-offset),hl ; program uzunluğu
               ld (save_len+1-offset),hl ; kayıt uzunluğu
               ld hl,(prg_run-offset)
               ld (progrun+1-offset),hl
;------------------------------------------
; Copy the basic start and relocator to address 23755
;------------------------------------------
ld hl,basic-offset
ld de,$5ccb ; 23755
ld bc,33
ldir
;------------------------------------------
; Print the message and wait for a key press.
;------------------------------------------
ld a,$fd
call $1601
xor a
ld de,$09a1
call $0c0a
set 5,(iy+2)
scf
call $15d4
;------------------------------------------
; Save Header
;------------------------------------------
xor a
ld ix,header-offset
ld de,17
call $04c2
;------------------------------------------
; Save New Program
;------------------------------------------
ld a,$ff
ld ix,23755
save_len ld de,$0000
call $04c2
rst $08
defb 255
;------------------------------------------
; Header Info
;------------------------------------------
header         defb 0 ; file type
filename defb 13,19,1,18,1
defm "HADES"
data_len defw 0
line_num defw 6161 ; DON'T CHANGE line number
prog_len defw 0
;------------------------------------------
; Basic start + relocator - 33 byte
;------------------------------------------
; Basic start: 19 byte
; 6161 RANDOMIZE USR 23755
;------------------------------------------
basic defb $18,$11,$0e,$00,$f9,$c0
defm "23755"
defb $0e,$00,$00,$cb,$5c,$00,$0d,$80
;------------------------------------------
; Relocator: 14 byte
;------------------------------------------
ld hl,$5cec
progadr ld de,$0000
proglen ld bc,$0000
ldir
progrun jp $0000
;==========================================
start ld hl,prg_mem
ld de,$5b00
ld bc,start-prg_mem
ldir
stop ret
;------------------------------------------
end start
;==========================================


Uzun bir aradan sonra dün tekrar baktığım kod nihayet bitti.

Hemen nasıl kullanıldığına geçeyim.

1 - Basicode'u yükleyin. Çalışınca asıl program printer buffera kopyalanacak. Eğer LOAD "" CODE 23296 ile sadece kodu yüklerseniz 2. işlemi yapmaya gerek yok.
2 - Program listesindedki satırlar silinecek. NEW kullanmayın.
3 - Kendi kodunuzu LOAD "" CODE 23788 ile yükleyin. Kendi kodunuzun asıl yükleme adresini, uzunluğunu ve çalıştırma adresini bir yere not edin.
4 - Programınızın;
Asıl yükleme adresini 23296-23297 adreslerine Lo-Hi formatında yazın.
Uzunluğunu 23298-23299  adreslerine Lo-Hi formatında yazın.
Çalışma adresini 23300-23301 adreslerine Lo-Hi formatında yazın.
5 - RANDOMIZE USR 23302 ile yeni programı kaydedin.

Yeni programda 6161 RANDOMIZE USR 23755 satırı vardır. MERGE "" ile yükleyip satırı görebilirsiniz ama RUN komutu verince  çalışmayacaktır. (6161 Bize her yer Trabzon :) )

NOT: 128K+2 modelde kod hatalı çalışıyor. Basicode yüklenince hemen "Start tape, then press any key" mesajı çıkıyor. Compile adresini değiştirsem bile sonuç aynı. Sebebini bilmiyorum. Ama 48K'da oluşturulan program 128K'da sorunsuz çalışıyor.

Hepsi bu kadar. Güle güle kullanın.

 

 

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 184
Ynt: BASICODE V1.0
« Yanıtla #3 : 21 Şubat 2025, 23:34:31 »
Kod: [Seç]
;=================================================
; BASICODE V2.1
;-------------------------------------------------
; 21-Feb-2025 / Hades
; Adding code to the end of the Basic line and
; saving the resulting program.
; This routine only works in 48K Spectrum!
; But, the created program works without any
; problems on other models.
; (SpecEmu  3.1 Build 01/11/15 + Pasmo + ConTEXT)
;=================================================
org $ff58
;-------------------------------------------------
; RANDOMIZE USR 23296 to run
;-------------------------------------------------
offset equ $-$5b00
;-------------------------------------------------
; $5b64-65 (23396-23397): Lo-Hi format real memory adress
; $5b66-67 (23398-23399): Lo-Hi format program lenght
; $5b68-69 (23400-23401): Lo-Hi format program run adress
;-------------------------------------------------
; Your program is loaded as headerless.
;-------------------------------------------------
basicode ld ix,23788
ld de,(prg_len-offset)
call $08b0
;-------------------------------------------------
; Copy the program information to the necessary places.
;-------------------------------------------------
ld hl,(prg_mem-offset) ; programın bellekteki asıl yeri
ld (progadr+1-offset),hl
ld hl,(prg_len-offset) ; programın uzunluğu
ld (proglen+1-offset),hl
ld de,33
add hl,de
ld (data_len-offset),hl ; data uzunluğu
               ld (prog_len-offset),hl ; program uzunluğu
               ld (save_len+1-offset),hl ; kayıt uzunluğu
               ld hl,(prg_run-offset)
               ld (progrun+1-offset),hl
;-------------------------------------------------
; Copy the basic start and relocator to address 23755
;-------------------------------------------------
ld hl,basic-offset
ld de,$5ccb
ld bc,33
ldir
;-------------------------------------------------
; Print the message and wait for a key press.
;-------------------------------------------------
out (254),a
ld a,$fd
call $1601
xor a
ld de,$09a1
call $0c0a
set 5,(iy+2)
scf
call $15d4
;-------------------------------------------------
; Save Header
;-------------------------------------------------
xor a
ld ix,header-offset
ld de,17
call $04c2
;-------------------------------------------------
; Save New Program
;-------------------------------------------------
ld a,$ff
ld ix,23755
save_len ld de,$0000
call $04c2
rst $08
defb 255
;-------------------------------------------------
prg_mem dw 0 ; real memory adress of your program
prg_len dw 0 ; lenght of your program
prg_run dw 0 ; run adress of your program
;-------------------------------------------------
; Header Info
;-------------------------------------------------
header         defb 0 ; file type
filename defb 13,19,1,18,1
defm "HADES"
data_len defw 0
line_num defw 6161 ; DON'T CHANGE line number
prog_len defw 0
;=================================================
; Basic start + relocator - 33 byte
; Basic start: 19 byte
; 6161 RANDOMIZE USR 23755
;=================================================
basic defb $18,$11,$0e
defb $00,$f9,$c0
defm "23755"
defb $0e,$00,$00,$cb,$5c,$00,$0d,$80
;-------------------------------------------------
; Relocator: 14 byte
;-------------------------------------------------
_5cde ld hl,$5cec
progadr ld de,$0000
proglen ld bc,$0000
ldir
progrun jp $0000
_5cec
;=================================================
start ld hl,basicode
ld de,$5b00
ld bc,start-basicode
ldir
stop ret
;-------------------------------------------------
end start
;=================================================

Kodda ufak bir düzeltme ve ekleme yaptım. Basicode haline getirilecek kodun yüklemesi program tarafından yapılıyor. Dolayısıyla bir önceki versiyondaki işlem sırasında düzenleme gerekiyor.

ÖNEMLİ NOT: Emulatörün Option penceresinde Tape Playback Option seçeneklerinde Auto Load Tapes seçeneği devre dışı bırakılmalıdır.

1 - Basicode'u yükleyin. Çalışınca 23296'dan başlayan bölgeye transfer edilecektir.

2 - Tape Browser'i açın ve basicode haline getirilecek Data Block'unu seçin. Data Blokunun yükleme adresini, uzunluğunu ve çalıştırma adresini not edin.
 
3 - Debugger penceresini açın ve Poke butonu ile;
23396-23397 adreslerine datanın yükleme adresini Lo-Hi şeklinde girin.
23398-23399 adreslerine datanın uzunluğunu Lo-Hi şeklinde girin.
23400-23401 adreslerine datanın çalışma adresini Lo-Hi şeklinde girin.

4 - RANDOMIZE USR 23296 ile Basicode'un kendisini çalıştırın. Basicode haline getirilecek data headerless olarak yüklenecektir. Yükleme sonrasında save için tuşa basmanızı bekleyecektir.

5 - İsterseniz başka kodlar için 2. adımdan itibaren işlemleri tekrarlayabilirsiniz. Basicode'u tekrar yüklemeye gerek yoktur.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2958
  • Advanced User Simulator
    • ae unutmadan
Ynt: BASICODE V1.0
« Yanıtla #4 : 23 Şubat 2025, 16:06:15 »
hades bu program güzel olmuş, bunu bir windows tool'u yapmak lazım, normal pasmo çıktısını alıp spectruma bulaşmadan hazır tape yapsın diye.

bu arada aradığın basic değerleri sistem değişkenlerinde bulunuyor, PROG (23635) - basic programının lokasyonu (default değer 23755), E_LINE(23641) da basic programının sonu. Yani bir basic programın hafızada kapladığı alanı BasicBuyukluk=PEEKW(ELINE)-PEEKW(PROG) şeklinde bulabilirsin. ayrıca basic'de değişkeneler de programla beraber kaydedilir. Yani örneğin, dim a(200) yaptığında VARS sistem değişkeninin point ettiği noktaya 1000 bytelık bir alan ayrılır. (program bir kere çalıştırılması lazım elbette) sonra save edildiğinde basic programı ve yanında bu 200 bytelık alan birlikte tek blok halinde kaydedilir. Bu da işine yarayabilir.

yani burada kafadan yazıyorum, (VARS yerine el ile 23627 yazılmalı)
kodun uzunluğu 1000 byte'tan az osun mesela, hard reset attıktan sonra,
Kod: [Seç]
10 DIM a(200):LET adr=(PEEK (VARS+1)*256+PEEK VARS)+6: LOAD""CODE adr: save "basic+prog" line 20
20 RANDOMIZE USR adr

gibi bir sistemle aynı sonuca ulaşabilirsin diye düşünüyorum.

(önce denedim çalışmadı sandım, denediğim asm kodu relocatable değilmiş, o sebeple adresi bildirmek iyi fikir gibi geldi, her neyse çalışıyormuş, sonuç ekte, bir göz atarsın)

printer buffer hakkında, o 256byte'lık alan ve VARS'ta kayıtlı değişkenler RUN komutu ile birlikte temizlenir. Yani vars ya da printer bufferını kullanıyorsan artık programları GO TO 1 ile çalıştırman gerekiyor. RUN'aslında RESTORE 0: CLEAR 0: GOTO 0 'ın birleşimi -> https://skoolkid.github.io/rom/dec/asm/7841.html

son olarak 128k işi sıkıntılı çünkü 32kb rom 2 sayfadan oluşuyor ve 128k tokenizer editörü ayrı bir program olarak çalıştığı için sayfaları switch edip duruyor. onun interrupt handlerı da diğerinden daha karmaşık. bu sebeple 128k ram'i tutarak editörü kapatmak ve 16kb rom'lu tek sayfalı rom'a geçmek için 128 basic'e geçilerek USR0 yazılır. böylece zx spectrum tokenizer basic editörü ve tüm sistem değişkenleri bellekten çıkarılır, yerine klasik token editör gelir. Not: 128k ana menüden 48k seçerseniz aynı işlem yapılır fakat bu sefer ula'da geri çevrilemez bir flag var, onu da set ediyor, bu şekilde makine tamamen 48k ram'li bir spectruma dönüşüyor. isteseniz de geri açamıyorsunuz, tek çare hard reset.

Fakat sen zaten tape dosyaları yarattığın için ram mevzusu senin ilgilenmen gereken bir husus değil.

Son olarak basic programlarını LOAD""CODE ile de yükleyebilir ve otomatik olarak çalıştırabilirsin. Zor kısım, sistem değişkenlerini de aynı şekilde kaydetmek ve LOAD komutu rom'dan geri döndüğünde bir sonraki basamağın ne olacağı da önemli yani o imajı biraz dikkatli hazırlamak lazım. En eski 16k spectrum oyunları bu şekilde yükleniyordu. Sanırım bir tür kopya koruması diyebiliriz. Ekte Meteor storm'un hiçbir program/parametre gerektirmeksizin sadece load""code ile yüklendiğini görebilirsin. 23500'den itibaren kaydedilmiş, sistem değişkenleri 23552 adresinden başlar (Basinc ile sistem değişkenlerini ve açıklamalarını görebilirsin view>debug>system variables)


edit:
tam basic code'u ekliyorum, gömülecek binary bloğuna göre a$ değişkeninin boyunu ayarlamak lazım. Ayrıca ben garanti olsun diye 50 byte ileri sardım header falan denk gelmesin diye, orayı tam hesaplarsak 14-16 falan olması lazım:

Kod: [Seç]
10 CLEAR : LET adr=50+PEEK 23628*256+PEEK 23627: DIM a$(2000)
20 PRINT "Load your asm code now:";adr: LOAD "" CODE adr
30 CLS : PRINT "insert a tape to save": SAVE "bas+code" LINE 50
40 CLS : PRINT "done. reset and load it": STOP
50 RANDOMIZE USR adr

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2958
  • Advanced User Simulator
    • ae unutmadan
Ynt: BASICODE V1.0
« Yanıtla #5 : 25 Şubat 2025, 01:29:45 »
Bu arada meteor storm'u incelerken nasıl load""code ile otomatik çalışabilen binary yükleyebildiklerini öğrendim. Aslında çok basit bir sistem,

10 CLEAR 24900 <-- burada basic'in üst sınırını belirliyorsun ki sonrasına makine kodu yüklemek için
20 LOAD "" CODE 25000  <--burada kodu 25000 adresine yüklüyorsun mesela
30 SAVE "KOD" CODE 23500,8000: RANDOMIZE USR 28000     <---- Burada basic sistem değişkenleri ile birlikte basic'in bir snapshotunu almış oluyorsun, yani program çalışırken tüm değişkenleriyle kaydedilmiş oluyor, dolayısı ile yüklendiğinde sanki SAVE satırındaki işlem tamamlanmış ve sıradaki komut çalışacakmış gibi yüklenmiş oluyor. burdaki 8000 ve 28000 rakamları örnek uydurmasyon, programınızın başlangıç adresine ve uzunluğuna göre uygun rakamlar yazılacak.

bu şekilde kaydedilen programları LOAD""CODE ile yüklemek gerekiyor. Yani senin programın yaptığı işi yapamaz.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 184
Ynt: BASICODE V1.0
« Yanıtla #6 : 25 Şubat 2025, 09:05:52 »
Alıntı
bunu bir windows tool'u yapmak lazım, normal pasmo çıktısını alıp spectruma bulaşmadan hazır tape yapsın diye.

Güzel fikir. İyi olur aslında. Hazır el atmışken biri load diğeri save için kullanılan iki tane tape browser penceresi olursa tadından yenmez. Load kısmından Code bloku seçilecek, gerekli adresler girilecek ve save butonuna basınca dosya save browserinde gözükecek. Boş .tap file üretme özelliğide olmalı aslında. (Pamuk eller klavyeye :) )

Alıntı
printer buffer hakkında, o 256byte'lık alan ve VARS'ta kayıtlı değişkenler RUN komutu ile birlikte temizlenir.

İlk denemelerimde printer bufferdaki kodun uçtuğunu farketmiştim. Rom dökümünü inceleyince makinanın ilk açılışıyla NEW komutu arasında nerdeyse hiç fark olmadığını gördüm. NEW hafızada ne var ne yoksa hepsini yok ediyor. C64'ün gözünü seveyim bu konuda. En azından kodları hafızada bırakıyor sadece bazı adresleri eski haline getiriyor.
Bu yüzden bile bazı yerleri revizyonlu yeni zx rom yazmak lazım. NEW / RUN sonrası hafızayı boşaltmadan sadece sistem değişkenleri sıfırlansa yeter.


Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2958
  • Advanced User Simulator
    • ae unutmadan
Ynt: BASICODE V1.0
« Yanıtla #7 : 09 Mart 2025, 13:10:43 »
Aslında "New", Ramtop'a kadar temizliyor, ramtop basic'in kapladığı alan olduğu için
örneğin Clear 25000 yazıp (ramtop'ı 25000'e ayarlayıp) sonra new dersen 25000'in üstü sağlam kalır. Ama değişkenler resetlenir yine ona yapacak bişey yok.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 184
Ynt: BASICODE V1.0
« Yanıtla #8 : 09 Mart 2025, 13:40:26 »
Öğrendiğim iyi oldu. Öyleyse bir kod yazarken ilk olarak ramtopu ayarlamak lazım.

Bu arada dün biraz deneme yaptım. $4000-$FFFF arasını headerless save yapıp geri yükledim. Yükleme başarılı ama yüklediğim program çalışmadı. Manuel olarak rand usr verince çalışıyor. Yükleme bitince çalışması gerekirken Nonsense in basic hatası veriyor.

Manic Miner: Randomize usr 33792

Basic satırı aşağıdaki şekilde save sırasında kaydedliyor.

;======================================
basic      defb   $18,$11,$0e
         defb   $00,$f9,$c0
         defm   "23755"
         defb   $0e,$00,$00,$cb,$5c,$00,$0d,$80
;-------------------------------------------------
;      Relocator: 14 byte
;-------------------------------------------------
_5cde      ld   ix,16384   ;   ld   hl,$5cec
progadr      ld   de,49152   ;   ld   de,$0000
proglen      call   $08b0   ;   ld   bc,$0000
         nop         ;   ldir
progrun      jp   33792   ;   jp   $0000
_5cec
;======================================

 

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2958
  • Advanced User Simulator
    • ae unutmadan
Ynt: BASICODE V1.0
« Yanıtla #9 : 09 Mart 2025, 17:35:06 »
tahminim; basic stack normalde  ram'in en sonunda oluyor ve stack üzerine yazıyor olabilir bu. öncesinde clear 39999 yapıp stack'i aşağı almak lazım. ama o  zaman da tüm veri yüklenmeyebilir. Bunu spectrum üzerinde yapmak biraz karışık bir problem. ama windows üzerinde buna uygun bir tap dosyası düzenlemek epey kolay.

uzun yıllar önce şunu çizip buralarda biryerde paylaşmıştım:


Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2958
  • Advanced User Simulator
    • ae unutmadan
Ynt: BASICODE V1.0
« Yanıtla #10 : 13 Mart 2025, 02:54:20 »
hades, bir ek olarak, bizim grup ret web sitesi hala yaşıyor ama yeri değişti, eğer release yaparsan haberim olsun eklerim: https://zx.tr/ret/