HomeSearchRegisterLog in

Share | 
 

 ترجمه Nerdy Nights week 5

View previous topic View next topic Go down 
AuthorMessage
Farid
avatar

Posts : 98
Join date : 2010-07-25
Age : 32
Location : IRAN
درجه : سرباز یکم

درجه : سرباز یکم


PostSubject: ترجمه Nerdy Nights week 5   2015-02-27, 3:14 am

نمایش چندین گرافیک متحرک به طور همزمان
در درس قبلی برای نمایش یه کاشی از گرافیک متحرک از درگاه‌های 2003 و 2004 استفاده کردیم. ولی این روش برای نمایش چندین گرافیک متحرک کاربرد نداره. برای نمایش چندین کاشی از گرافیک متحرک ابتدا داده‌ها رو در قسمتی از رم ذخیره میکنیم و بعد با استفاده از درگاه‌های 2003 و 4014 به یکباره همه اون داده‌ها رو به حافظه گرافیک متحرک انتقال میدیم.

به عنوان نمونه داده‌های مربوط به چهار تا کاشی از گرافیک متحرک در قسمت sprites اعلام میشه :

Code:
sprites:
  .db $80, $32, $00, $80
  .db $80, $33, $00, $88
  .db $88, $34, $00, $80
  .db $88, $35, $00, $88



سپس با استفاده از یه حلقه این داده‌ها رو در قسمتی از رم که از آدرس 0200 شروع میشه ذخیره میکنیم :

Code:
LoadSprites:
  LDX #$00
LoadSpritesLoop:
  LDA sprites, x
  STA $0200, x
  INX
  CPX #$10
  BNE LoadSpritesLoop


بعد با استفاده از کد زیر کل داده‌های مربوط به گرافیک‌های متحرک رو از رم به حافظه گرافیک‌های متحرک انتقال میدیم :

Code:
 LDA #$00
  STA $2003
  LDA #$02
  STA $4014

در صورت نیاز به تغییر نحوه نمایش کاشی‌های متحرک فقط کافی هست که مقدار مربوط به کاشی‌های متحرک در قسمت رم که از آدرس 0200 شروع میشن رو تغییر بدیم.
Back to top Go down
http://microbaz.blogfa.com
Farid
avatar

Posts : 98
Join date : 2010-07-25
Age : 32
Location : IRAN
درجه : سرباز یکم

درجه : سرباز یکم


PostSubject: Re: ترجمه Nerdy Nights week 5   2015-02-27, 3:56 am

استفاده از دسته‌های بازی
آدرس 4016 درگاه ارتباط با دسته یک و آدرس 4017 درگاه ارتباط با دسته دو هست.

با استفاده از کد زیر اعلام میکنیم که میخواهیم وضعیت دکمه‌ها رو بررسی بکنیم. دقت بکنین که با اجرای این کد وضعیت دسته دو رو هم میتونیم بررسی بکنیم :

Code:
 LDA #$01
  STA $4016
  LDA #$00
  STA $4016

بعد با هر بار که آدرس 4016 رو بخونیم وضعیت یکی از دکمه‌ها مشخص میشه که فشار داده شده یا نه. دسته میکرو کلا هشت تا دکمه داره پس باید هشت بار عمل خوندن رو انجام بدیم. 

Code:
 LDA $4016     ; player 1 - A
  LDA $4016     ; player 1 - B
  LDA $4016     ; player 1 - Select
  LDA $4016     ; player 1 - Start
  LDA $4016     ; player 1 - Up
  LDA $4016     ; player 1 - Down
  LDA $4016     ; player 1 - Left
  LDA $4016     ; player 1 - Right

Code:
 LDA $4017     ; player 2 - A
  LDA $4017     ; player 2 - B
  LDA $4017     ; player 2 - Select
  LDA $4017     ; player 2 - Start
  LDA $4017     ; player 2 - Up
  LDA $4017     ; player 2 - Down
  LDA $4017     ; player 2 - Left
  LDA $4017     ; player 2 - Right

آشنایی با دستور AND
این دستور بین بیت‌های عملوند و ریجستر A مقاسیه منتطقی AND انجام میده که به این صورت هست :

یک بیت از عملوندیک بیت از ریجستر Aنتیجه نهایی مقایسه
000
010
100
111

مثال :
سوال : بین مقدارهای 5B و AD مقایسه منطقی AND انجام بدین.

جواب :
معادل مقدار 5B در مبنای باینری به صورت 01011011 هست
معادل مقدار AD در مبنای باینری به صورت 10101101 هست
هر کدوم از بیت‌ها رو با بیت هم‌وزن خودش مقایسه میکنیم که نتیجه در مبنای باینری 00001001 و در مبنای هگز 09 میشه.

5B01011011
AD10101101
0900001001

ادامه مبحث مربوط به دسته
در هر بار که آدرس 4016 یا 4017 خونده میشه، بیت صفرشون نشان دهنده وضعیت فشار داده شدن دکمه رو نشون میده. اگه بیت صفر مقدارش یک باشه یعنی دکمه مربوطه فشار داده شده ولی اگه صفر باشه یعنی اون دکمه فشار داده نشده.
برای هدایت برنامه با توجه به وضعیت دکمه نیاز به مقایسه و پرش داریم. برای این کار از کد زیر استفاده میکنیم :

Code:
ReadA:
  LDA $4016
  AND #%00000001
  BEQ ReadADone
  LDA $0203
  CLC
  ADC #$01
  STA $0203
ReadADone:

در کد بالا عمل خوندن 4016 مربوط به وضعیت دکمه A هست. برای مشخص شدن وضعیت این دکمه با استفاده از دستور AND مقایسه منطقی به صورت زیر انجام میشه :


وضعیت بیت‌های دیگه نامعلوم هستXXXXXXX0
مقایسه منطقی AND00000001
پس دکمه فشار داده نشده00000000


وضعیت بیت‌های دیگه نامعلوم هستXXXXXXX1
مقایسه منطقی AND00000001
پس دکمه فشار داده شده00000001


در صورتی که دکمه مربوطه فشار داده نشه مقدار ثبات A در اثر مقاسیه منطقی صفر میشه و این باعث فعال شدن بیت صفر ثبات پردازنده میشه و در این صورت اگه دستور BEQ استفاده بکنیم عمل پرش انجام میشه.
ولی اگه مشخص بشه که دکمه مربوطه فشار داده شده مقدار ثبات A یک میشه و در نتیجه بیت صفر ثبات پردازنده فعال نمیشه و در این صورت دستور BEQ عمل پرش رو انجام نمیده. به همین خاطر به راحتی میشه دستوراتی که در اثر فشار داده شدن دکمه میخواهیم انجام بشن رو در ادامه دستور BEQ قرار میدیم.

به عنوان مثال در کد بالا دستوراتی که بعد از BEQ به کار رفتن باعث میشن بایت مربوط به مختصات افقی یکی از کاشی‌های گرافیک متحرک از آدرس 0203 لود بشه و بعد یه واحد بهش اضافه میشه و دوباره توی همین آدرس ذخیره میشه. این کار باعث میشه که با هر بار زدن دکمه A اون کاشی یه پیکسل به سمت راست حرکت بکنه!

همچنین اگه بعد از کد BEQ از کد زیر استفاده بکنیم باعث میشه که با زدن دکمه مربوطه کاشی یه پیکسل به سمت چپ حرکت بکنه :
Code:
  LDA $0203
  SEC
  SBC #$01
  STA $0203

از اینجا میتونین کدهای بالا رو به همراه اسمبلر دانلود بکنین
با زدن دکمه A یه کاشی متحرک به سمت راست میره و با زدن دکمه B به سمت چپ میره.
سعی بکنین برنامه رو طوری تغییر بدین که با زدن دکمه‌های جهت‌ها همه کاشی‌ها در جهت مطلوب حرکت بکنن!
Back to top Go down
http://microbaz.blogfa.com
 

ترجمه Nerdy Nights week 5

View previous topic View next topic Back to top 
Page 1 of 1

Permissions in this forum:You cannot reply to topics in this forum
Microbaz :: برنامه نویسی اسمبلی 6502-