Retro Sistemler > Amstrad

CPC'de Assembler ile imtihanım...

<< < (9/9)

Fero:
Şahanesiniz. Matahari'nin son paylaştığı kodu anlayabilmem için z80 heaven 'da biraz zaman geçirmem gerekecek. :)

matahari:

--- Alıntı yapılan: Fero - 07 Ocak 2019, 02:18:45 ---Matahari'nin son paylaştığı kodu anlayabilmem için z80 heaven 'da biraz zaman geçirmem gerekecek. :)

--- Alıntı sonu ---

Aynı tekniği kullanan basit bir örnek, konuyu daha hızlı kavramanıza yardımcı olabilir. ;)


--- Kod: --- LET ADDR_CodeExec = &4000
LET ADDR_ScrFirstPixel = &c000
LET ADDR_ScrMemoryEnd = &ffff + 1

LET CONST_InitialColour = &ff
LET CONST_ClearColour = &0000

;----------------------------------------------------------------------
; Fast screen clear/fill routine v1.0
; for Amstrad 464/664/6128 computers
;
; (c) matahari - (Jan 07, 2019)
;----------------------------------------------------------------------

run CodeExec
org ADDR_CodeExec

CodeExec: ;------ Generate a dummy interrupt handler ----------------------------

di ; Disable interrupts
im 1 ; Interrupt mode = 1
ld hl,&c9fb ; Interrupt handler = EI,RET
ld (&0038),hl ; Overwrite interrupt vector

;------ Fill whole screen with a single colour (for test purpose) -----

ld hl,ADDR_ScrFirstPixel ; Screen addr to fill
ld de,ADDR_ScrFirstPixel + 1
ld bc,16383 ; Number of bytes to fill
ld (hl),CONST_InitialColour ; Fill using this colour
ldir ; Memory fill using LDIR

;------ Press any key to continue -------------------------------------

call &bb18 ; Wait for a key!

;**********************************************************************
; MAIN LOOP - INITIALIZE! - (Only SP,DE,B registers are used!)
;**********************************************************************

ld (OldSP),sp ; Save current SP value
ld sp,ADDR_ScrMemoryEnd ; SP = screen end addr
ld de,CONST_ClearColour ; Clear using this colour
ld b,128 ; Number of times to loop

;**********************************************************************
; MAIN LOOP - BEGIN
;**********************************************************************

LoopClear: REPEAT 64 ; Paste 'PUSH DE' for 64 times
push de ; Poke clear colour using DE
REND ; End paste

djnz LoopClear ; Decrease B, Loop B times

; 1 PUSH pokes 2 bytes on scr
; 2 bytes * 64 PUSH * 128 times
; => 16384 bytes

;**********************************************************************
; MAIN LOOP - END - (Back to normal life)
;**********************************************************************

ld sp,(OldSP) ; Restore previous SP value
ei ; Enable interrupts

LoopForever: jr LoopForever

OldSP: dw 0


--- Kod sonu ---

hades:
Kodlamalara devam.


--- Kod: ---;---------------------------------------------------------------;
; CPC RUTINI #06 - EKRAN EFEKTI #03 ;
; PIXEL PIXEL YATAY EKRAN KOPYALAMA ;
; (C) 06-01-2019 / HADES ;
;---------------------------------------------------------------;
; Bu rutin hafizadaki ekran goruntusunu pixel satirlari
; seklinde ekran belleginin pixel satirlarina kopyalar
;===============================================================;
run start
org &8000
;===============================================================;
; ekran modunu ayarla ve renkleri duzenle
;===============================================================;
start call &bc14 ;firmware cls
di
setmode ld bc,&7f00
ld a,%10001100
out (c),a
ld de,PaletteArray
pcolor out (c),c
ld a,(de)
inc de
out (c),a
inc c
bit 4,c
jr z,pcolor
ld bc,&7f10 ;select border
out (c),c
ld bc,&7f54 ;set border colour to black
out (c),c
;===============================================================;
call effect_03
halt
;===============================================================;
PaletteArray db &54,&4b,&43,&44,&4e,&4c,&5c,&5b
       ;blk;wht;yel;dbl;org;brd;red;lcy
db &57,&55,&45,&46,&40,&58,&4b,&54
       ;lbl;blu;pur;cya;gry;mgn;bmg;blk

;---------------------------------------------------------------;
; EFEKT RUTINI BURADAN BASLIYOR
;---------------------------------------------------------------;
effect_03 ld ix,&4000 ;hafizada saklanan ekran
ld iy,&c000 ;default ekran bellegi
ld h,25 ;ekrandaki karakter satiri sayaci
next_line push ix ;ix registerini yigina sakla
push iy ;iy registerini yigina sakla
;===============================================================;
; hafizadan o anki pixel satirini kopyala
;===============================================================;
ld c,8 ;kopyalanacak pixel satir sayaci
next_pixel ld b,80 ;bir pixel satirindaki byte sayisi
next_byte ld a,(ix+0) ;hafizadaki ekrandan bir byte oku
ld (iy+0),a ;default ekrana bellegine yaz
inc ix ;hafizadaki ekran adresini 1 arttir
inc iy ;default ekran adresini 1 arttir
djnz next_byte ;80 byte kopyalanincaya kadar tekrarla
;===============================================================;
; biraz bekleyelim
;===============================================================;
ld de,&0400
bekle dec de
ld a,d
or e
jr nz,bekle
;===============================================================;
; bir alttaki pixel satiri icin hesapla
;===============================================================;
ld de,2048-80 ;bir sonraki pixel satiri icin adres farki
add ix,de ;yeni pixel satirinin adresini hesapla
add iy,de ;yeni pixel satirinin adresini hesapla
dec c ;pixel satir sayacini 1 azalt
jr nz,next_pixel ;0 oluncaya kadar islemleri tekrarla
;===============================================================;
; bir sonraki karakter satiri icin islem yap
;===============================================================;
pop iy ;iy registerini yigindan geri al
pop ix ;ix registerini yigindan geri al
ld de,80 ;bir sonraki karakter satiri icin adres farki
add ix,de ;yeni karakter satirinin adresini hesapla
add iy,de ;yeni karakter satirinin adresini
dec h ;karakter satiri sayacini 1 azalt
jr nz,next_line ;0 oluncaya kadar islemleri tekrarla
ret
;===============================================================;
org &4000

screen incbin "BatR2.scr"
;===============================================================;

--- Kod sonu ---

Navigasyon

[0] Mesajlar

[*] Önceki Sayfa

Tam sürüme git