Makine Kodu ile Red Alert 3 Yazdık

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.

error error  

En az beş altı defa çöktü. Ve biz bu IDE’de yılan yazdık!

keil keil   {right}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.

program-ss program-ss  

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.

Kodlar

[plain] ; 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 [/plain]