CHECKSUMMER V1.0
Başlığa bakıp da "bu ne?" diye soranlar için hemen kısa bir açıklama yapalım. Hatırlarsanız derginin ilk sayısında MDE (makine dili editörü) isimli bir program vermiştik. Bu programla C64 için yazılmış programları belli bir formatta hatasız olarak yazabiliyordunuz. Eğer elinizde MDE formatında yazılmış bir doküman varsa bu program işinize yarıyordu.
C64 TÜRKİYE dergisinin program dökümlerini MDE ile hazırlamayı düşünüyordum. Dergiye koymak istediğim programların listesini MDE ile yazıcıdan çıkarttıktan sonra bunları WORD'de tek tek girersem derginin program dökümü hazır olacak ve gerekli açıklamaları da ekleyince işim bitecekti. Kolay gibi gözükse de aslında benim kullanacağım yöntem tam bir işkenceydi. Üstelik hata yapma ihtimali de oldukça yüksekti. Buna bir çare bulmak gerekiyordu. Öyle bir program olmalıydı ki, bu program ile benim PC üzerinde yazıp derlemiş olduğum C64 assembler programlarını MDE formatında listelemeli, kontrol toplamını hesaplamalı ve elde edilen listeyi .txt uzantılı olarak kaydetmeliydi. SLOWHAND ile yaptığım bir ICQ sohbeti sırasında bu programdan bahsettim ve 2 saat içinde istediğim özelliklerin hepsini yerine getiren bir programı DELPHI ile yazdı. Böylece dergi için döküm hazırlama işini PC ile yapabilir hale geldik. Bu dökümleri ister emülatör ile ister gerçek bir C64'te yazabilmek için gerekli olan programı ise ben hazırladım. Sonuçta CHECK-SUMMER V1.0 ortaya çıktı. Fakat bu program "MDE" kadar gelişmiş bir program değil. Sadece program dökümlerindeki baytları girmeye yarıyor. MDE'deki gibi herhangi bir programı yükleyip MDE formatında liste alma özelliği, printerden çıkış alma özelliği ve hepsinden önemlisi bir program yazarken istediğiniz anda SAVE yapma ve başka bir zaman yazma işlemine kaldığınız yerden devam etme özelliği yok. Ya programı tek seferde yazıp SAVE edeceksiniz ya da aşağıdaki işlemleri yapacaksınız. 1 - Programı kaydetme işini mutlaka yeni bir satıra geçtiğiniz zaman yapın. 2 - Yeni satırdaki adresi bir yere kaydedin. Fakat sakın kaybetmeyin. 3 - RUN/STOP-RESTORE tuşlarına basarak CHECKSUMMER'dan çıkın. 4 - Aşağıdaki POKE komutlarını dikkatlice girin. POKE 43, başlangıç adresi alçak byte POKE 44, başlangıç adresi yüksek byte POKE 45, bitiş adresi alçak byte POKE 46, bitiş adresi yüksek byte
Ve diskete kayıt için
SAVE "programadı",8,1
kasete kayıt için,
SAVE "programadı",1,1
yazın. (NOT : Adres byte'larını onlu sayı sistemine göre girmeyi unutmayın)
Yazma işlemine kaldığınız yerden devam etmek için ise aşağıdakileri yapın: 1 - CHECKSUMMER'ı yükleyin ve çalıştırın. Hiçbir şey yapmadan RUN/STOP-RESTORE ile çıkın. 2 - Yazmaya devam edeceğiniz programı LOAD "programadı",1,1 veya LOAD "programadı",8,1 komutlarıyla yükleyin. 3 - SYS 51968 komutu ile CHECKSUMMER'ı tekrar çalıştırın. 4 - Program adını girin. Başlangıç adresi olarak yazma işlemine ara verdiğiniz sırada not aldığınız adresi girin. Bitiş adresi olarak ise program dökümündeki bitiş adresini girin. 5 - Daha sonra yazma işlemine devam edebilirsiniz.
CHECKSUMMER ilk yüklendiğinde kendisini $CB00 - $CFFF adresleri arasına transfer eder. Böylece $0801 - $9FFF ve $C000 - $CAFF arasındaki bölgeleri kullanabilirsiniz.
CHECKSUMMER formatında verdiğimiz programlar mümkün olduğu kadar $0801 adresinden başlayacaktır. Böylece yazma ve save işleminden sonra RUN komutuyla rahatça çalışacaktır.
Şimdiye kadar dergide çıkan programların checksummer dökümünü bu sayıda bulabilirsiniz. Böylece uzun uzun assembler satırlarını girmenize gerek kalmayacak. Güle güle kullanın. Eğer bir sorun çıkarsa bana bir mail atın. İşte adresler: hades@independentonline.org ve hades6510@yahoo.com.
CHECKSUMMER'ı tamamen PC üzerinde yazdım ve denedim (Gerçek C64'te hiç denemedim ama buna benzer programları zamanında yazmıştım). Aslında "F" tuşlarıyla Directory alma, LOAD, SAVE ve EXIT işlemleri de olacaktı. Tamamen zaman buldukça yaptığım için her şeyin hazır olması çok zaman alacaktı. O nedenle V1 olarak bu şekilde yaptım. Ayrıca daha gelişmiş bir şeklini tamamen PC'de yapmayı planladık. PC versiyonunda .d64 oluşturma vs. gibi özellikler de olacak. (SLOWHAND bak okuyucularımız sabırsızlanıyor. Birazcık "FASTHAND" ol. :)) CHECKSUMMER'ın assembler listesini sayfanın sonunda bulabilirsiniz. İsteyen satır satır yazabilir :) Veya http://hades6510.sitemynet.com adresinde dosyalar bölümünden .d64 dosyasına kaydedilmiş halini ve dergide çıkan programları .zip'li olarak indirebilirsiniz.
VICE emülatörde "attach disk image" seçeneğinde bir .d64 dosyası seçilmişse, Checksummer kullanarak program yazarsanız save sonunda "programadı.prg" şeklinde bir dosya oluşur. Eğer .d64 seçimi yapılmadıysa kaydedilen program, "programadı.p00" şeklinde olur. Her iki şekilde de emülatörü kullanabilirsiniz.
Şimdi herkes klavyelerinin başına ve herkese iyi çalışmalar.
;--------------------------------------------;
; PROGRAM ADI: CHECKSUMMER V1
;
; PROGRAM BİTİŞ TARİHİ: 28-09-2003
;
; PROGRAMI YAZAN: İSMAİL "HADES" ŞAHİN ;
;--------------------------------------------;
*=$cb00
start_prg
sei
lda
#$4c
sta
sw
lda
#<irq
ldx
#>irq
sta
$0314
stx
$0315
cli
jmp
new_prg
;--------------------------------------------;
irq
inc
$d019
sw
.byte
$4c
.word
$ea31
ldx
#$00
up_text0
lda
#$07
sta
$d800,x
lda
#$20
sta
$0428,x
inx
cpx
#$28
bne
up_text0
ldx
#$00
inp_01
nop
lda
prg_name,x
cmp
#$40
bcc
write
sec
sbc
#$40
write
sta
$0400,x
inx
cpx
#$0e
bne
inp_01
ldx
#$00
header
lda
name,x
cmp
#$40
bcc
wri2
sec
sbc
#$40
wri2
sta
$0436-$28,x
inx
cpx
name_len
bne
header
ldx
#$00
opad
lda
oper,x
sta
$0447-$28,x
lda
#$20
sta
$044b-$28
lda
oper+4,x
sta
$044c-$28,x
inx
cpx
#$04
bne
opad
jsr
$ea87
jmp
$ea31
;----------------------------------------;
new_prg
lda
#$07
jsr
$e536
dex
stx
$d020
stx
$d021
txa
spr_loop
sta
$02c0,x
inx
cpx
#$40
bne
spr_loop
lda
#$ff
sta
$02d5
lda
#$0b
sta
$07f8
lda
#<main_text
ldy
#>main_text
jsr
$ab1e
clc
ldy
#$00
;x poz.
ldx
#$08
;y poz.
jsr
$fff0
lda
#<pre_text
ldy
#>pre_text
jsr
$ab1e
;--------------------------------------------;
;
isim girme bölümü
;--------------------------------------------;
lda
#$00
sta
name_len
clc
ldy
#$0e
;x poz.
ldx
#$0a
;y poz.
jsr
$fff0
lda
#$ff
sta
letter_cnt
isim_loop
lda
#$05
jsr
$ffd2
inc
letter_cnt
isim_loop_1
jsr
spr_cursor
jsr
$ffe4
cmp
#$0d
beq
enter
cmp
#$14
beq
delete
cmp
#$20
bcc
isim_loop_1
isim_devam
cmp
#$60
bcs
isim_loop_1
jsr
$ffd2
ldx
letter_cnt
sta
name,x
cpx
#$10
bne
isim_loop
stx
name_len
jmp
adres_gir
;--------------------------------------------;
enter
ldx
letter_cnt
beq
isim_loop_1
stx
name_len
lda
#$20
jsr
$ffd2
jmp
adres_gir
;--------------------------------------------;
;
silme bölümü
;--------------------------------------------;
delete
ldx
letter_cnt
beq
isim_loop_1
jsr
$ffd2
dec
letter_cnt
jmp
isim_loop_1
;--------------------------------------------;
spr_cursor
lda
$d3
cmp
#$1d
bcc
no_extra
ldx
#$01
.byte
$2c
no_extra
ldx
#$00
stx
$d010
asl
asl
asl
clc
adc
#$18
sta
$d000
lda
$d6
asl
asl
asl
clc
adc
#$32
sta
$d001
inc
$d027
lda
#$01
sta
$d015
rts
;--------------------------------------------;
;
adres girme bölümü
;--------------------------------------------;
adres_gir
clc
ldy
#$0f
;x poz.
ldx
#$0b
;y poz.
jsr
$fff0
jsr
key_in
sta
$fc
;başlangıç adresi hi byte
sta
start_hi
jsr
key_in
sta
$fb
;başlangıç adresi lo byte
sta
start_lo
clc
ldy
#$0f
;x poz.
ldx
#$0c
;y poz.
jsr
$fff0
jsr
key_in
sta
$fe
;bitiş adresi hi byte
jsr
key_in
sta
$fd
;bitiş adresi lo byte
lda
#$00
sta
$d015
;--------------------------------------------;
; başlangış ve bitiş adresleri kontrolü
;--------------------------------------------;
lda
$fe
cmp
$fc
bcc
error
;small
bne
devam_yes
lda
$fd
cmp
$fb
beq
error
;equal
bcc
error
;small
;--------------------------------------------;
;
hata yoksa devam et
;--------------------------------------------;
devam_yes
lda
#<yes_no
ldy
#>yes_no
jsr
$ab1e
evet_no
jsr
$ffe4
cmp
#$45
beq
devam_
cmp
#$48
bne
evet_no
jmp
new_prg ;start_prg
devam_
jmp
input_bytes
;--------------------------------------------;
; hata mesajı yazdırma ve tuş kontrolu
;--------------------------------------------;
error
lda
#<error_mes
ldy
#>error_mes
jsr
$ab1e
space_key
jsr
$ffe4
cmp
#$20
bne
space_key
jmp
new_prg
;--------------------------------------------;
key_in
jsr
hex_key
asl
asl
asl
asl
sta
temp
jsr
hex_key
ora
temp
rts
;--------------------------------------------;
hex_key
jsr
spr_cursor
jsr
$ffe4
hex_sys
cmp
#$30
bcc
hex_key
cmp
#$3a
bcs
hex_letter
jsr
$ffd2
sec
sbc
#$30
rts
hex_letter
cmp
#$41
bcc
hex_key
cmp
#$47
bcs
hex_key
jsr
$ffd2
sec
sbc
#$37
rts
;--------------------------------------------;
convert
pha
lsr
lsr
lsr
lsr
jsr
convert0
sta
temp0
convert1
pla
and
#$0f
convert0
cmp
#$0a
bcs
hexharf
clc
adc
#$39
hexharf
sec
sbc
#$09
sta
temp1
rts
;--------------------------------------------;
convex
jsr
convert
lda
temp0
sta
oper,x
inx
lda
temp1
sta
oper,x
inx
rts
;--------------------------------------------;
input_bytes
ldx
#$00
lda
$fc
;start hi
jsr
convex
lda
$fb
;start lo
jsr
convex
lda
$fe
;finish hi
jsr
convex
lda
$fd
;finish lo
jsr
convex
lda
#$2c
sta
sw
jsr
$e544
dex
lda
#$0d
jsr
$ffd2
lda
#$05
jsr
$ffd2
check_1
lda
#$0d
jsr
$ffd2
ldy
#$00
sty
byte_cnt
jsr
start_adr
lda
#$3a
jsr
$ffd2
lda
#$20
jsr
$ffd2
;--------------------------------------------;
; bir satırdaki baytların girilmesi
;--------------------------------------------;
one_line
jsr
key_in
ldy
byte_cnt
sta
($fb),y
lda
#$20
jsr
$ffd2
inc
byte_cnt
ldy
byte_cnt
cpy
#$08
bne
one_line
jsr
checksum
;kontrol toplamı burada hesaplanıyor
;--------------------------------------------;
;kullanıcının kontrol toplamı girdiği yer
;--------------------------------------------;
jsr
key_in
sta
$05
jsr
key_in
sta
$04
;--------------------------------------------;
;
kontrol toplamları karşılaştırma
;
önce yüksek byte'ı karşılaştır
;--------------------------------------------;
lda
$05
cmp
$03
bne
check_err
;--------------------------------------------;
;
sonra alçak byte'ı karşılaştır
;--------------------------------------------;
lda
$04
cmp
$02
bne
check_err
;--------------------------------------------;
;
programın sonuna gelindi mi?
;--------------------------------------------;
;
önce alçak baytı karşılaştır
;--------------------------------------------;
lda
$fb
clc
adc
#$08
sta
$fb
bcc
no_hi_adr
inc
$fc
no_hi_adr
lda
$fb
cmp
$fd
bne
check_1
;--------------------------------------------;
;
sonra yüksek baytı karşılaştır
;--------------------------------------------;
lda
$fc
cmp
$fe
bne
check_1
jsr
end_of
jmp
save
;--------------------------------------------;
check_err
lda
#<err_mes
ldy
#>err_mes
jsr
$ab1e
jmp
check_1
;--------------------------------------------;
; program sonunda yapılacak olan işler
;--------------------------------------------;
end_of
lda
#$00
sta
$d015
sei
lda
#$31
ldx
#$ea
sta
$0314
stx
$0315
cli
rts
;--------------------------------------------;
save
lda
#<save_msg
ldy
#>save_msg
jsr
$ab1e
save_key
jsr
$ffe4
cmp
#$45
beq
cihaz
cmp
#$48
bne
save_key
jsr
end_of
jmp
$a474
;--------------------------------------------;
cihaz
lda
#<kas_dis
ldy
#>kas_dis
jsr
$ab1e
kd_key
jsr
$ffe4
cmp
#$4b
beq
kaset
cmp
#$44
bne
kd_key
;--------------------------------------------;
;
SETLFS rutini için hazırlık
;--------------------------------------------;
disket
lda
#$08
.byte
$2c
kaset
lda
#$01
ldx
#$08
ldy
#$ff
jsr
$ffba
;--------------------------------------------;
;
SETNAM rutini için hazırlık
;--------------------------------------------;
lda
name_len
ldx
#<name
ldy
#>name
jsr
$ffbd
;--------------------------------------------;
;
SAVE rutini için hazırlık
;--------------------------------------------;
lda
start_lo
ldx
start_hi
sta
$fb
stx
$fc
lda
#$fb
ldx
$fd
;finish lo
ldy
$fe
;finish hi
jsr
$ffd8
jmp
$a474
;--------------------------------------------;
start_adr
lda
$fc
jsr
memtohex
lda
$fb
jsr
memtohex
rts
;--------------------------------------------;
memtohex
pha
lsr
lsr
lsr
lsr
jsr
nibble
pla
and
#$0f
nibble
cmp
#$0a
bcc
number
clc
adc
#$07
number
clc
adc
#$30
jsr
$ffd2
rts
;--------------------------------------------;
checksum
lda
#$00
sta
$02
sta
$03
lda
#<linechar1
ldy
#>linechar1
jsr
$ab1e
ldy
#$00
next_byte
ldx
multiple,y
read_it
lda
($fb),y
clc
adc
$02
sta
$02
bcc
noinc03
inc
$03
noinc03
dex
bne
read_it
iny
cpy
#$08
bne
next_byte
rts
;--------------------------------------------;
pre_text
.byte 13,13
prg_name
.text
"program adi : "
.byte
13
.text
"baslama adr.: "
.byte
5,36
.byte
13,158
.text
"bitis adresi: "
.byte
5,36
.byte
13,0
yes_no
.byte
13,13
.text
"emin misiniz ?
(e/h)"
.byte
0
error_mes
.byte
13,13,13
.text
"adres hatasi!!"
space_mes
.byte
13
.text
"tekrar icin 'space'
tusuna basin !!"
.byte
13,0
err_mes
.byte
158,13,13
.text
"kontrol toplami
farkli !!"
.byte
13
.text
"girilen degerleri
kontrol edin !!"
.byte
13,5,0
save_msg
.byte
13,13
.text
"save ? (e/h)"
.byte 13,0
kas_dis
.byte
13
.text
"kaset/disket ?
(k/d)"
.byte
13,0
main_text
.byte
$9f
.text
" check
summer v1.0"
.byte
13,13
.text
" (c)2003
hades/independent"
.byte
$9e,0
;--------------------------------------------;
letter_cnt
.byte
0
byte_cnt
.byte
0
start_lo
.byte
0
start_hi
.byte
0
name_len
.byte
0
name
.text
" "
;--------------------------------------------;
*=name+17
linechar1
.byte
32,45,32,5,0
oper
.byte
0,0,0,0,0,0,0,0
temp
.byte
0
multiple
.byte
17,19,23,29,31,37,41,59
temp0
.byte
0
temp1
.byte
0
end_of_prg
.byte
0
;----------------------------------------;
.end
Ve bunlar da CHECKSUMMER'in ekran görüntüleri:

