;********************************************************
; 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.