Farid
Posts : 111 Join date : 2010-07-25 Age : 39 Location : IRAN گروهبان سوم
| Subject: ترجمه 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 شروع میشن رو تغییر بدیم. |
|
Farid
Posts : 111 Join date : 2010-07-25 Age : 39 Location : IRAN گروهبان سوم
| Subject: 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 | نتیجه نهایی مقایسه | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
مثال : سوال : بین مقدارهای 5B و AD مقایسه منطقی AND انجام بدین. جواب : معادل مقدار 5B در مبنای باینری به صورت 01011011 هست معادل مقدار AD در مبنای باینری به صورت 10101101 هست هر کدوم از بیتها رو با بیت هموزن خودش مقایسه میکنیم که نتیجه در مبنای باینری 00001001 و در مبنای هگز 09 میشه. 5B | 01011011 | AD | 10101101 | 09 | 00001001 |
ادامه مبحث مربوط به دسته در هر بار که آدرس 4016 یا 4017 خونده میشه، بیت صفرشون نشان دهنده وضعیت فشار داده شدن دکمه رو نشون میده. اگه بیت صفر مقدارش یک باشه یعنی دکمه مربوطه فشار داده شده ولی اگه صفر باشه یعنی اون دکمه فشار داده نشده. برای هدایت برنامه با توجه به وضعیت دکمه نیاز به مقایسه و پرش داریم. برای این کار از کد زیر استفاده میکنیم : - Code:
-
ReadA: LDA $4016 AND #%00000001 BEQ ReadADone LDA $0203 CLC ADC #$01 STA $0203 ReadADone: در کد بالا عمل خوندن 4016 مربوط به وضعیت دکمه A هست. برای مشخص شدن وضعیت این دکمه با استفاده از دستور AND مقایسه منطقی به صورت زیر انجام میشه : وضعیت بیتهای دیگه نامعلوم هست | XXXXXXX0 | مقایسه منطقی AND | 00000001 | پس دکمه فشار داده نشده | 00000000 |
وضعیت بیتهای دیگه نامعلوم هست | XXXXXXX1 | مقایسه منطقی AND | 00000001 | پس دکمه فشار داده شده | 00000001 |
در صورتی که دکمه مربوطه فشار داده نشه مقدار ثبات A در اثر مقاسیه منطقی صفر میشه و این باعث فعال شدن بیت صفر ثبات پردازنده میشه و در این صورت اگه دستور BEQ استفاده بکنیم عمل پرش انجام میشه. ولی اگه مشخص بشه که دکمه مربوطه فشار داده شده مقدار ثبات A یک میشه و در نتیجه بیت صفر ثبات پردازنده فعال نمیشه و در این صورت دستور BEQ عمل پرش رو انجام نمیده. به همین خاطر به راحتی میشه دستوراتی که در اثر فشار داده شدن دکمه میخواهیم انجام بشن رو در ادامه دستور BEQ قرار میدیم. به عنوان مثال در کد بالا دستوراتی که بعد از BEQ به کار رفتن باعث میشن بایت مربوط به مختصات افقی یکی از کاشیهای گرافیک متحرک از آدرس 0203 لود بشه و بعد یه واحد بهش اضافه میشه و دوباره توی همین آدرس ذخیره میشه. این کار باعث میشه که با هر بار زدن دکمه A اون کاشی یه پیکسل به سمت راست حرکت بکنه! همچنین اگه بعد از کد BEQ از کد زیر استفاده بکنیم باعث میشه که با زدن دکمه مربوطه کاشی یه پیکسل به سمت چپ حرکت بکنه : - Code:
-
LDA $0203 SEC SBC #$01 STA $0203 از اینجا میتونین کدهای بالا رو به همراه اسمبلر دانلود بکنین با زدن دکمه A یه کاشی متحرک به سمت راست میره و با زدن دکمه B به سمت چپ میره. سعی بکنین برنامه رو طوری تغییر بدین که با زدن دکمههای جهتها همه کاشیها در جهت مطلوب حرکت بکنن!
|
|