Tamam tamam yazmadık. Abarttım ben.
Ama ASM ile yılan oyunu yaptık. 8051 serisi mikrodenetleyicilerde çalışacak bir yılan oyunu. Sırf ASM ile.
Vallahi boş işler yapmıyoruz. Ödev bu, ondan yaptık. 😀
Evet C gibi bir dil varken, bizden inatla ASM’de yazmamızı istediler, yanlış anlamadınız.
Yo yo, C’yi derste de gördük. Gösterdiler yani. Ama yine de inatla ASM’de yazmamızı istediler.
Vallahi ben anlamadım mantığını. Nedenini sordum, “Biz öyle uygun gördük.” dediler.
Cidden.
Hiçbir okurumu inandıramadım. Özlem’e sorun. İnanırsınız. Zaten takım arkadaşım da o. Kod yazdığıma falan inanmazsanız ona da inandırır.
Ödev
Her neyse… ASM ile bizden oyun istediler. Derste C görmemize rağmen hem de. Uğraşmazsak olmaz ya!
Biz de tasarladık. Net 15 saatimizi aldı. Hata ayıklarken canımız çıktı. Programı yazarken bize derste gösterilen Linux üzerinde çalışan MCU IDE isimli yazılımı kullandık. Ama program öyle yavaş ve öyle sorunluydu ki, defalarca çöktüğü gibi, mikrosaniyelik işi yapması saniyeler alıyordu. Yani görüp görülebilecek en kötü IDE’lerden biriydi.
En az beş altı defa çöktü. Ve biz bu IDE’de yılan yazdık!
Daha doğrusu yazamadık ve bir süre sonra FxDev’den yardım isteyince, bize Windows’ta çalışan ve adam gibi çalışan, orası burası çökmeyen ve yazdığımız kodu 8051’e göre gerçekzamanlı işleyebilen bir yazılım önerdi: Keil uVision.
Kodu hemencecik Windows’a taşıdık ve bu programda tasarıma devam ettik. Canımız çıka çıka, saya söve ödevi bitirdik.
Kontrol
Ödev kontrolünde hocamız bize bu ödevin bize ne kattığını sordu. Ben de açık açık söyledim kendisine: “Açıkçası üç günümüzü boşa harcamaktan başka bir şey katmadı.” Meğerse öyle değilmiş… Bu ödev bize, eğer ileride alt seviyeli işlerle meşgul bir yerde çalışırsak (mesela embedded) o zaman işlerin nasıl gittiğine dair fikrimiz olmasını sağlayacakmış.
Kimse bu ödevi vermeden önce, gelecekte ne yapacağımı sormadı ki bana! Ben gelecekte alt seviyeyle falan uğraşmayacağım, “webci” olacağım ben, ben niye yapıyorum o zaman? Bunun cevabı yok tabi. Aslında var: Finali %20 etkiliyor da ondan yapıyorum.
Neyse, böyle bir ödevi yaptık.
Teknik Bilgiler
Biraz da teknik bilgi verelim şimdi.
- Program klasik bir yılan oyunudur.
- Oyun 40H ile 7FH bellek bölgeleri arasında oynanmaktadır.
- Elmalar 0FFH’tir.
- Yılan’ın başı 01H ve devamı 02H, 03H.. diye gitmektedir.
- Veriler Port 0’dan alınır.
- 0.0 sol, 0.1 sağ, 0.2 yukarı, 0.3 aşağı yönlerini kontrol eder. Aynı anda iki tane girişe basılmamalıdır. Basılırsa sistem bir tanesini kabul eder, diğerini yok sayar.
- 0.4 yılanı yavaşlatır, 0.5 hızlandırır.
- Yılanı kontrol etmek için yön tuşuna sürekli basmanız gerekmemektedir. Hiçbir tuşa basmazsanız aynı yönde devam eder.
- Yılan sola giderken bir anda sağa gidemez. (180 derece dönüş olmaz.)
- Oyun tahtasında sınır yoktur. Bir taraftan çıkınca öbür taraftan girer.
- Elmalar, T1 zamanlayıcısındaki MOD2 sayacı ile rastgele üretilir.
- T0, MOD1 yılanın hızını ayarlamak için kullanılır.
- Oyun yılan kendine çarpınca biter.
- Çarpışmanın olduğu yer 0FEH ile gösterilir.
- Skor oyunun sonunda bilumum registerlara ve aküye yazılır.
- Skor, yenilen elma sayısıdır.
- Elmalar GDO’lu değildir.
Bitirirken
Bu kadar incik cıncık özelliği olan bir ödevi, zaten kısıtlı ve değerli olan vaktimizde bize yaptırılmasının yanlış olduğunu düşündüğümü tekrar söylemeden geçemiyor ve oyunun ödev metinini, raporumuzu ve kaynak kodumuzu aşağıda paylaşıyorum.
Teknik birkaç ayrıntıya rapordan ulaşabilirsiniz.
Kaynak kodları (olur da anlarsanız 😀 ) istediğiniz gibi kullanabilirisiniz. Kodları indirmek istemezseniz her zamanki gibi yazının sonunda bulabilirsiniz.
- Ödev Metni
- Proje Raporu
- Bizim Çözümümüz (snake.asm)
Kodlar
; YILANIN BASINI KUCUKKEN EZECEKSIN YEGEN (16:1 )
MOV 63H, #001H ;YILANIN BASLANGIC KONUMU
MOV 64H, #002H ;YILANIN BASLANGIC KONUMU
MOV R2, #00H ; YILANIN GIDECEGI YON 00H:sol, 01H:sag, 02H:ust, 03H:alt -Default olarak soldan baslatilir.-
MOV R6, #002H ;YILANIN BASLANGIC UZUNLUGU
MOV 008H, #0100D ;BASLANGIC HIZI
; ZAMANLAYICIYA AIT SURUYLE KOD
BASLA:
MOV R7, 008H ;Baslangic hizi R7 registerina atilir.
ZAMANLAYICI:
MOV 16H, #0FFH
IC_ZAMANLAYICI:
MOV TMOD, #00100001B ;ZAMANLAYICI 1 MOD2'DE ZAMANLAYICI ZAMANLAYICI 0 MOD 1'DE
MOV TH0, #0FFH ;Zamanlayici 0'ın donme sayisi TH0 ve TL0 ile ayarlanir.
MOV TL0, #0FFH
MOV TH1, #63D ;Zamanlayici 1'in donme sayisi TH1 ve TL1 ile ayarlanir.
MOV TL1, #63D
SETB TR0 ; Zamanlayici 0 calismaya baslar.
SETB TR1 ; Zamanlayici 1 calismaya baslar.
; YILAN HIZINA GORE BEKLEMEK
BEKLE: JNB TF0, BEKLE
CLR TF0
DJNZ 16H, IC_ZAMANLAYICI
DJNZ R7, ZAMANLAYICI
; EKRANA RASTGELE ELMA KOYMA (ELMALAR FFH)
; GUNCEL ELMANIN YERI O9H ADRESINDE TUTULUR. BU ADRESTE 00 VARSA ELMA YOK DEMEKTIR.
; EGER ELMA YOKSA BIR TANE RASTGELE YARATILIR VE BELLEGE FFH OLARAK ISLENIR.
MOV A, 09H
JNZ PORT_KONTROL
MOV A, R6
SUBB A, #64D
JNZ ELMA_YARAT
LJMP BITTI
ELMA_YARAT: ;ELMA YARAT
MOV R0, TL1;SAYACTAKI DEGERI (YENI ELMA KOORDINATINI AL)
MOV A,@R0 ;ELMANIN OLUSTURULMASI DUSUNULEN NOKTANIN ICI A'YA ATILIR.
;BU NOKTADA 00H DISINDA BIR SEY VARSA, YILANIN USTUNDE ELMA OLUSTUYORUZ DEMEKTIR.
JNZ ELMA_YARAT
;BU NOKTADA ARTIK ELMAYI YARATABILIRIZ
MOV @R0, #0FFH
MOV 09H, R0
JMP PORT_KONTROL
; PORTTAN BILGI ALIP GIDILECEK YONE KARAR VERMEK VEYA HIZ ARTIRIP AZALTMAK
PORT_KONTROL:
MOV P0, #0FFH ;P0 giris portu olarak ayarlanir.
MOV C, P0.0 ; Yilanin sola donmesi isteniyorsa
JNB CY, SOLL
MOV C, P0.1 ;Yilanin saga donmesi isteniyorsa
JNB CY, SAGL
MOV C, P0.2 ;Yilanin yukari cikmasi isteniyorsa
JNB CY, USTL
MOV C, P0.3 ;Yilanin asagi inmesi isteniyorsa
JNB CY, ALTL
MOV C, P0.4 ;Yilan hizlandirilmak isteniyorsa
JNB CY, HIZLANDIR
MOV C, P0.5 ;Yilan yavaslatilmak isteniyorsa
JNB CY, YAVASLAT
; YON BELIRTILMEMISSE (YANI HIC GIRDI YOKSA, EN SON NEREYE GIDILIYORSA ORAYA GITMEYE DEVAM ETMEK)
YONBELIRTILMEMIS:
CJNE R2, #00H, YON_SOL_DEGIL ; Bir onceki yonun ne olduguna bakilir, teker teker. Yukarida aciklanan kabullenmeler kullanilir.
JMP SOLL
YON_SOL_DEGIL:
CJNE R2, #01H, YON_SAG_DA_DEGIL
JMP SAGL
YON_SAG_DA_DEGIL:
CJNE R2, #02H, YON_UST_DEGIL
JMP USTL
YON_UST_DEGIL:
JMP ALTL
HIZLANDIR: ;Yilan hizlandiriliyor...
MOV A, 008H
CLR C
SUBB A, #20D
MOV 008H, A
JNZ BASLA
MOV 008H, #20D
JMP BASLA
YAVASLAT: ;Yilan yavaslatiliyor...
MOV A, 008H
ADD A, #20D
MOV 008H, A
CLR CY
SUBB A,#0F0H
JNZ LBASLA
MOV 008H, #0DCH
LJMP BASLA
LBASLA: LJMP BASLA
;Asagida, yilan belli bir yone giderken tam ters yon secilmisse, secilen yonun ignore edilip yilanin gittigi yonde devam etmesi saglanmistir.
;Ters yonden kastimiz, yilan sola giderken saga gitmesinin istenmesi ya da yilan yukari cikarken asagi gitmesinin istenmesidir.
;Boyle bir durumda yilan yon secimi hic yapilmamis gibi gittigi yonde devam eder.
SOLL: CJNE R2, #01H, SOLDAN_DEVAM_ET
LJMP SAG
SOLDAN_DEVAM_ET:
MOV R2, #00H
LJMP SOL
SAGL: CJNE R2, #00H, SAGDAN_DEVAM_ET
LJMP SOL
SAGDAN_DEVAM_ET:
MOV R2, #01H
LJMP SAG
USTL: CJNE R2, #03H, USTTEN_DEVAM_ET
LJMP ALT
USTTEN_DEVAM_ET:
MOV R2, #02H
LJMP UST
ALTL: CJNE R2, #02H, ALTTAN_DEVAM_ET
LJMP UST
ALTTAN_DEVAM_ET:
MOV R2, #03H
LJMP ALT
SOL:
;YILAN HAREKETLERI
MOV R5, #001H
;YILANIN BASINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
BAS_SOL_ARA:
MOV A,@R0
CJNE A, 005H, BAS_SOL_YOK
JMP BAS_SOL_VAR
BAS_SOL_YOK:
INC R0
JMP BAS_SOL_ARA
BAS_SOL_VAR:
;R0'IN ICERISINDE YILANIN BIYERI VAR.
HAREKET_SOL:
MOV @R0, #0FEH
; KOSELERE GELMIS MI KONTROLLERI (SOL)
; Her kose teker teker kontrol edilir ve yilanin duvardan gecmesi saglanir.
MOV A,#40H
CJNE A, 00H, YOK40_SOL
MOV R0, #47H
JMP SOL_TAMAM
YOK40_SOL:
MOV A,#48H
CJNE A, 00H, YOK48_SOL
MOV R0, #4FH
JMP SOL_TAMAM
YOK48_SOL:
MOV A,#50H
CJNE A, 00H, YOK50_SOL
MOV R0, #57H
JMP SOL_TAMAM
YOK50_SOL:
MOV A,#58H
CJNE A, 00H, YOK58_SOL
MOV R0, #5FH
JMP SOL_TAMAM
YOK58_SOL:
MOV A,#60H
CJNE A, 00H, YOK60_SOL
MOV R0, #67H
JMP SOL_TAMAM
YOK60_SOL:
MOV A,#68H
CJNE A, 00H, YOK68_SOL
MOV R0, #6FH
JMP SOL_TAMAM
YOK68_SOL:
MOV A,#70H
CJNE A, 00H, YOK70_SOL
MOV R0, #77H
JMP SOL_TAMAM
YOK70_SOL:
MOV A,#78H
CJNE A, 00H, YOK78_SOL
MOV R0, #7FH
JMP SOL_TAMAM
YOK78_SOL:
DEC R0
SOL_TAMAM:
;OYUN SONU VE YILAN ELMA YEDI MI KONTROLLERI
MOV A, @R0
JNZ SOL_BUYU
JMP SOL_ILERI
SOL_BUYU: ; Yilanin buyumesi lazım.
CLR C
SUBB A, #0FFH
JNZ SOL_BITTI
MOV 010H, #0FFH ;BUYU BAYTINI SET ET
JMP SOL_ILERI
SOL_BITTI: ;Yilanin boyunun 8 olmasi durumunda bir sirada yuruyebilmesinin saglanmasi amaciyla yazilmis bir dizi kod...
MOV A, @R0
CLR C
SUBB A, R6
JNZ SOL_CIDDEN_BITTI
MOV 011H, #0FFH ;YILAN TAM UCTA BAYTINI SET SET
JMP SOL_ILERI
SOL_CIDDEN_BITTI:
LJMP BITTI
SOL_ILERI:
MOV @R0, #001H
;DEGISECEK BITTI
MOV R4, #002H ; BIR SONRAKI YILANIN YERI (SBIZLEYE PARAMATRE OLARAK KULLANDIK)
JMP SBIZLE
SAG:
;YILAN HAREKETLERI
MOV R5, #001H
;YILANIN BASINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
BAS_SAG_ARA:
MOV A,@R0
CJNE A, 005H, BAS_SAG_YOK
JMP BAS_SAG_VAR
BAS_SAG_YOK:
INC R0
JMP BAS_SAG_ARA
BAS_SAG_VAR:
;R0'IN ICERISINDE YILANIN BIYERI VAR.
HAREKET_SAG:
MOV @R0, #0FEH
; KOSELERE GELMIS MI KONTROLLERI (SAG)
; Her kose teker teker kontrol edilir ve yilanin duvardan gecmesi saglanir.
;DEGISECEK BASLA
MOV A,#47H
CJNE A, 00H, YOK47_SAG
MOV R0, #40H
JMP SAG_TAMAM
YOK47_SAG:
MOV A,#4FH
CJNE A, 00H, YOK4F_SAG
MOV R0, #48H
JMP SAG_TAMAM
YOK4F_SAG:
MOV A,#57H
CJNE A, 00H, YOK57_SAG
MOV R0, #50H
JMP SAG_TAMAM
YOK57_SAG:
MOV A,#5FH
CJNE A, 00H, YOK5F_SAG
MOV R0, #58H
JMP SAG_TAMAM
YOK5F_SAG:
MOV A,#67H
CJNE A, 00H, YOK67_SAG
MOV R0, #60H
JMP SAG_TAMAM
YOK67_SAG:
MOV A,#6FH
CJNE A, 00H, YOK6F_SAG
MOV R0, #68H
JMP SAG_TAMAM
YOK6F_SAG:
MOV A,#77H
CJNE A, 00H, YOK77_SAG
MOV R0, #70H
JMP SAG_TAMAM
YOK77_SAG:
MOV A,#7FH
CJNE A, 00H, YOK7F_SAG
MOV R0, #78H
JMP SAG_TAMAM
YOK7F_SAG:
INC R0
SAG_TAMAM:
;OYUN SONU VE YILAN ELMA YEDI MI KONTROLU
MOV A, @R0
JNZ SAG_BUYU
JMP SAG_ILERI
SAG_BUYU:
CLR C
SUBB A, #0FFH
JNZ SAG_BITTI
MOV 010H, #0FFH ;BUYU BAYTINI SET ET
JMP SAG_ILERI
SAG_BITTI: ;Yilanin boyunun 8 olmasi durumunda bir sirada yuruyebilmesinin saglanmasi amaciyla yazilmis bir dizi kod...
MOV A, @R0
CLR C
SUBB A, R6
JNZ SAG_CIDDEN_BITTI
MOV 011H, #0FFH ;YILNAN TAM UCTA BAYTINI SET SET
JMP SAG_ILERI
SAG_CIDDEN_BITTI:
LJMP BITTI
SAG_ILERI:
MOV @R0, #001H
;DEGISECEK BITTI
MOV R4, #002H ; BIR SONRAKI YILANIN YERI (SBIZLEYE PARAMATRE OLARAK KULLANDIK)
JMP SBIZLE
UST:
;YILAN HAREKETLERI
MOV R5, #001H
;YILANIN BASINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
BAS_UST_ARA:
MOV A,@R0
CJNE A, 005H, BAS_UST_YOK
JMP BAS_UST_VAR
BAS_UST_YOK:
INC R0
JMP BAS_UST_ARA
BAS_UST_VAR:
;R0'IN ICERISINDE YILANIN BIYERI VAR.
HAREKET_UST:
MOV @R0, #0FEH
; KOSELERE GELMIS MI KONTROLLERI (UST)
; Her kose teker teker kontrol edilir ve yilanin duvardan gecmesi saglanir.
MOV A,#40H
CJNE A, 00H, YOK40_UST
MOV 78H, #001H
JMP UST_TAMAM
YOK40_UST:
MOV A,#41H
CJNE A, 00H, YOK41_UST
MOV R0, #79H
JMP UST_TAMAM
YOK41_UST:
MOV A,#42H
CJNE A, 00H, YOK42_UST
MOV R0, #7AH
JMP UST_TAMAM
YOK42_UST:
MOV A,#43H
CJNE A, 00H, YOK43_UST
MOV R0, #7BH
JMP UST_TAMAM
YOK43_UST:
MOV A,#44H
CJNE A, 00H, YOK44_UST
MOV R0, #7CH
JMP UST_TAMAM
YOK44_UST:
MOV A,#45H
CJNE A, 00H, YOK45_UST
MOV R0, #7DH
JMP UST_TAMAM
YOK45_UST:
MOV A,#46H
CJNE A, 00H, YOK46_UST
MOV R0, #7EH
JMP UST_TAMAM
YOK46_UST:
MOV A,#47H
CJNE A, 00H, YOK47_UST
MOV R0, #7FH
JMP UST_TAMAM
YOK47_UST:
CLR C
MOV A,R0
SUBB A, #8H
MOV R0,A
UST_TAMAM:
;OYUN SONU VE YILAN ELMA YEDI MI KONTROLU
MOV A, @R0
JNZ UST_BUYU
JMP UST_ILERI
UST_BUYU:
CLR C
SUBB A, #0FFH
JNZ UST_BITTI ;Yilanin boyunun 8 olmasi durumunda bir sirada yuruyebilmesinin saglanmasi amaciyla yazilmis bir dizi kod...
MOV 010H, #0FFH ;BUYU BAYTINI SET ET
JMP UST_ILERI
UST_BITTI:
MOV A, @R0
CLR C
SUBB A, R6
JNZ UST_CIDDEN_BITTI
MOV 011H, #0FFH ;YILNAN TAM UCTA BAYTINI SET SET
JMP UST_ILERI
UST_CIDDEN_BITTI:
LJMP BITTI
UST_ILERI:
MOV @R0, #001H
;DEGISECEK BITTI
MOV R4, #002H ; BIR SONRAKI YILANIN NOSU (SBIZLEYE PARAMATRE OLARAK KULLANDIK)
JMP SBIZLE
ALT:
;YILAN HAREKETLERI
MOV R5, #001H
;YILANIN BASINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
BAS_ALT_ARA:
MOV A,@R0
CJNE A, 005H, BAS_ALT_YOK
JMP BAS_ALT_VAR
BAS_ALT_YOK:
INC R0
JMP BAS_ALT_ARA
BAS_ALT_VAR:
;R0'IN ICERISINDE YILANIN BIYERI VAR.
HAREKET_ALT:
MOV @R0, #0FEH
; KOSELERE GELMIS MI KONTROLLERI (ALT)
; Her kose teker teker kontrol edilir ve yilanin duvardan gecmesi saglanir.
;DEGISECEK BASLA
MOV A,#78H
CJNE A, 00H, YOK78_ALT
MOV R0, #40H
JMP ALT_TAMAM
YOK78_ALT:
MOV A,#79H
CJNE A, 00H, YOK79_ALT
MOV R0, #41H
JMP ALT_TAMAM
YOK79_ALT:
MOV A,#7AH
CJNE A, 00H, YOK7A_ALT
MOV R0, #42H
JMP ALT_TAMAM
YOK7A_ALT:
MOV A,#7BH
CJNE A, 00H, YOK7B_ALT
MOV R0, #43H
JMP ALT_TAMAM
YOK7B_ALT:
MOV A,#7CH
CJNE A, 00H, YOK7C_ALT
MOV R0, #44H
JMP ALT_TAMAM
YOK7C_ALT:
MOV A,#7DH
CJNE A, 00H, YOK7D_ALT
MOV R0, #45H
JMP ALT_TAMAM
YOK7D_ALT:
MOV A,#7EH
CJNE A, 00H, YOK7E_ALT
MOV R0, #46H
JMP ALT_TAMAM
YOK7E_ALT:
MOV A,#7FH
CJNE A, 00H, YOK7F_ALT
MOV R0, #47H
JMP ALT_TAMAM
YOK7F_ALT:
MOV A,R0
ADD A, #8H
MOV R0,A
ALT_TAMAM:
;OYUN SONU VE YILAN ELMA YEDI MI KONTROLU
MOV A, @R0
JNZ ALT_BUYU
JMP ALT_ILERI
ALT_BUYU:
CLR C
SUBB A, #0FFH
JNZ ALT_BITTI ;Yilanin boyunun 8 olmasi durumunda bir sirada yuruyebilmesinin saglanmasi amaciyla yazilmis bir dizi kod...
MOV 010H, #0FFH ;BUYU BAYTINI SET ET
JMP ALT_ILERI
ALT_BITTI:
MOV A, @R0
CLR C
SUBB A, R6
JNZ ALT_CIDDEN_BITTI
MOV 011H, #0FFH ;YILNAN TAM UCTA BAYTINI SET SET
JMP ALT_ILERI
ALT_CIDDEN_BITTI:
LJMP BITTI
ALT_ILERI:
MOV @R0, #001H
;DEGISECEK BITTI
MOV R4, #002H ; BIR SONRAKI YILANIN YERI (SBIZLEYE PARAMATRE OLARAK KULLANDIK)
JMP SBIZLE
SBIZLE: ;BIR SONRAKI YILANIN YERI (R4 ILE SETTIRILIR)
MOV 003H, 006H
MOV A, 11H
JNZ SON_BASA_DENK_GELMIS
JMP DONGU_BAS
SON_BASA_DENK_GELMIS:
DEC 003H
DONGU_BAS:
DJNZ 003H, IZLE_DONGU
SJMP IZLE_BITTI
IZLE_DONGU:
;YILAN HAREKETLERI
MOV R5, #0FEH
;YILANIN BIR YERINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
IZLE_FE_ARA:
MOV A,@R0
CJNE A, 005H, IZLE_FE_ARA_YOK
JMP IZLE_FE_ARA_VAR
IZLE_FE_ARA_YOK:
INC R0
JMP IZLE_FE_ARA
IZLE_FE_ARA_VAR:
;R0'DA FEhın yeri var
MOV B,R0
;YILAN HAREKETLERI
MOV R5, 004H
; YILANIN DEGISECEK PARCASININ YERINI TESPIT ET
MOV R0, #40H
IZLE_DEGISECEK_ARA:
MOV A,@R0
CJNE A, 005H, IZLE_DEGISECEK_ARA_YOK
JMP IZLE_DEGISECEK_ARA_VAR
IZLE_DEGISECEK_ARA_YOK:
INC R0
JMP IZLE_DEGISECEK_ARA
IZLE_DEGISECEK_ARA_VAR:
;R0'DA DEGISECEK ELEMANIN FE hın yeri var
MOV @R0, #0FEH
MOV R0,B
MOV @R0, 004H
INC R4
JMP DONGU_BAS
IZLE_BITTI:
;YILANIN SON ELEMANI ILE ILK ELEMANI CAKISMIS MI
MOV A, 11H
JNZ SON_BASA_DENK_GELMIS_2
JMP SONU_HALLET
SON_BASA_DENK_GELMIS_2:
MOV 11H,#00H ;;SON BASA GELMIS BITINI TEMIZLE
;YILAN HAREKETLERI
MOV R5, #0FEH
;YILANIN BIR YERINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
IZLE_SON_ARA:
MOV A,@R0
CJNE A, 005H, IZLE_SON_ARA_YOK
JMP IZLE_SON_ARA_VAR
IZLE_SON_ARA_YOK:
INC R0
JMP IZLE_SON_ARA
IZLE_SON_ARA_VAR:
;R0'DA FEh'nin yeri var
MOV @R0, 006H
JMP SBIZLE_BITTI
SONU_HALLET:
; YILAN HAREKET ETTIKTEN SONRA, EN SONDA KALACAK FE'YI KALDIRMAMIZ GEREKIR.
; BU KISIM BU ISLEMI YAPMAKTADIR.
MOV R5, #0FEH
;YILANIN BIR YERINI BUL (BULUNACAK OLAN YE R5'E ATILMALIDIR)
MOV R0, #040H
IZLE_FE_BITTI:
MOV A,@R0
CJNE A, 005H, IZLE_FE_BITTI_YOK
JMP IZLE_FE_BITTI_VAR
IZLE_FE_BITTI_YOK:
INC R0
JMP IZLE_FE_BITTI
IZLE_FE_BITTI_VAR:
;R0'DA FE'IN yeri var
MOV A, 010H
JNZ BUYUYECEK
MOV @R0, #00h
JMP SBIZLE_BITTI
BUYUYECEK:
MOV 010H, #00H ;YILAN UZAYACAK MI BAYTINI SIFIRLA
MOV 009H, #00H ;ELMANIN BELLEKTEKI ADRESINI SIFIRLA KI TEKRAR YARATILSIN
INC R6 ;YILANIN UZUNLUGUNU ARTIR
MOV @R0, 006H ;BELLEK GORUNTUSUNDE YILANI UZAT
JMP SBIZLE_BITTI
SBIZLE_BITTI:
LJMP BASLA
BITTI:
DEC R6
DEC R6
MOV R0, 06H
MOV R1, 06H
MOV R2, 06H
MOV R3, 06H
MOV R4, 06H
MOV R5, 06H
MOV R6, 06H
MOV R7, 06H
MOV A, 06H
MOV B, 06H
END

