================================================================================ COMMODORE 64 - TAHÁK PRO ZX SPECTRISTU ================================================================================ Na základě rotozoom dema od Shrek/MB Maniax ================================================================================ ================================================================================ 1. ZÁKLADNÍ PŘEHLED C64 VS ZX SPECTRUM ================================================================================ +---------------------+---------------------+---------------------+ | Vlastnost | Commodore 64 | ZX Spectrum | +---------------------+---------------------+---------------------+ | CPU | MOS 6510 @ 0.985MHz | Zilog Z80 @ 3.5MHz | | Architektura | 8-bit, little-end. | 8-bit, little-end. | | Registry | A, X, Y (8-bit) | A,B,C,D,E,H,L,IX,IY | | RAM | 64 KB | 48/128 KB | | Video chip | VIC-II | ULA | | Zvukovy chip | SID (3 kanaly) | AY-3-8912 (128) | | Rozliseni text | 40x25 znaku | 32x24 znaku | | Barev | 16 fixnich | 15 (8 + bright) | | Sprites | 8 HW sprites | zadne | | IRQ (PAL) | 50 Hz | 50 Hz | +---------------------+---------------------+---------------------+ DŮLEŽITÉ ROZDÍLY PRO PROGRAMÁTORA: * 6510 má MÁLO registrů - proto Zero Page ($00-$FF) slouží jako "rozšířené registry" * 6510 nemá 16-bit registry - vše musíš dělat po 8 bitech s Carry * 6510 nemá blokové instrukce - žádné LDIR, DJNZ apod. * 6510 má jednodušší flag systém - jen N, V, B, D, I, Z, C ================================================================================ 2. PAMĚŤOVÁ MAPA C64 ================================================================================ +----------+----------+--------------------------------------------+ | Od | Do | Popis | +----------+----------+--------------------------------------------+ | $0000 | $00FF | ZERO PAGE - rychle promenne, "registry" | | | | * Instrukce kratsi o 1 byte, rychlejsi! | +----------+----------+--------------------------------------------+ | $0100 | $01FF | STACK - zasobnik (roste dolu od $01FF) | | | | * Jako na Z80, ale fixni pozice | +----------+----------+--------------------------------------------+ | $0200 | $03FF | Systemove promenne, I/O buffery | +----------+----------+--------------------------------------------+ | $0400 | $07FF | * SCREEN RAM - 1000 bytu (40x25 znaku) | | | | Kazdy byte = kod znaku PETSCII | +----------+----------+--------------------------------------------+ | $0800 | $9FFF | BASIC programy (nebo tvuj kod!) | | $0801 | | * Standardni start adresa pro programy | +----------+----------+--------------------------------------------+ | $A000 | $BFFF | BASIC ROM (8KB, muze byt RAM pod ni) | +----------+----------+--------------------------------------------+ | $C000 | $CFFF | 4KB volne RAM | +----------+----------+--------------------------------------------+ | $D000 | $DFFF | * I/O OBLAST - VIC-II, SID, CIA... | | $D000 | $D3FF | VIC-II registry (grafika) | | $D400 | $D7FF | SID registry (zvuk) | | $D800 | $DBFF | * COLOR RAM - 1000 nibblu (4-bit barva) | | $DC00 | $DCFF | CIA1 (klavesnice, joystick) | | $DD00 | $DDFF | CIA2 (seriovy port, VIC bank) | +----------+----------+--------------------------------------------+ | $E000 | $FFFF | KERNAL ROM (8KB, muze byt RAM pod ni) | +----------+----------+--------------------------------------------+ | $FFFA | $FFFB | NMI vektor | | $FFFC | $FFFD | RESET vektor | | $FFFE | $FFFF | IRQ/BRK vektor | +----------+----------+--------------------------------------------+ POROVNÁNÍ S ZX SPECTRUM: +---------------------+---------------------+---------------------+ | Oblast | C64 | ZX Spectrum | +---------------------+---------------------+---------------------+ | Screen RAM | $0400-$07FF | $4000-$57FF | | Atributy/Barvy | $D800-$DBFF | $5800-$5AFF | | Volna RAM | $0800-$9FFF | $5B00-$FFFF (48K) | | Systemove promenne | $0000-$03FF | $5B00-$5CFF | | Stack | $0100-$01FF (fix!) | Kdekoli (SP reg) | +---------------------+---------------------+---------------------+ ================================================================================ 3. REGISTRY 6510 VS Z80 ================================================================================ HLAVNÍ REGISTRY: +---------+---------+---------------------------------------------------+ | Registr | Velik. | Popis | +---------+---------+---------------------------------------------------+ | A | 8-bit | Akumulator - hlavni pracovni registr | | | | * Jako A na Z80, ale dulezitejsi! | +---------+---------+---------------------------------------------------+ | X | 8-bit | Index registr X | | | | * Pouziva se pro indexovani a smycky | +---------+---------+---------------------------------------------------+ | Y | 8-bit | Index registr Y | | | | * Pouziva se pro Indirect Indexed mod | +---------+---------+---------------------------------------------------+ | SP | 8-bit | Ukazatel zasobniku (vzdy $01xx, high byte fixni!) | | | | * Roste DOLU, jako na Z80 | +---------+---------+---------------------------------------------------+ | PC | 16-bit | Citac programu | | | | * Jako PC na Z80 | +---------+---------+---------------------------------------------------+ | P | 8-bit | Stavovy registr (flagy) | | | | * Jako F na Z80, ale jine usporadani | +---------+---------+---------------------------------------------------+ STAVOVÝ REGISTR (P) - FLAGY: +-----+-----+-----+-----+-----+-----+-----+-----+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | N | V | 1 | B | D | I | Z | C | +-----+-----+-----+-----+-----+-----+-----+-----+ N = Negative (bit 7 vysledku = 1) Z80: S flag V = oVerflow (znamenkove preteceni) Z80: P/V flag (overflow) 1 = (vzdy 1) (nepouzito) Z80: - B = Break (BRK instrukce) Z80: nema D = Decimal (BCD mod pro ADC/SBC) Z80: N a H flagy I = Interrupt (1 = IRQ zakazano) Z80: IFF1/IFF2 Z = Zero (vysledek = 0) Z80: Z flag C = Carry (prenos/vypujcka) Z80: C flag POROVNÁNÍ REGISTRŮ 6510 vs Z80: +--------------+------------------+--------------------------------+ | 6510 | Z80 | Poznamka | +--------------+------------------+--------------------------------+ | A | A | Hlavni akumulator | | X | B | Index/citac smycky | | Y | C | Index/offset | | (zadny) | HL | * CHYBI! Pouzij 2 byty v ZP | | (zadny) | IX, IY | * CHYBI! Indirect pres ZP | | (zadny) | BC | * CHYBI pary! | | (zadny) | DE | * CHYBI pary! | | ZP $xx | HL | 2 byty v Zero Page = 16-bit ptr| +--------------+------------------+--------------------------------+ KLÍČOVÝ ROZDÍL: Na Z80 máš HL, IX, IY pro 16-bit adresování. Na 6510 používáš 2 po sobě jdoucí byty v Zero Page jako 16-bit ukazatel! Priklad - Z80: Priklad - 6510: LD HL, $4000 LDA #$00 ; Nizky byte LD A, (HL) STA $10 ; Uloz do ZP $10 LDA #$40 ; Vysoky byte STA $11 ; Uloz do ZP $11 LDY #0 ; Y = offset 0 LDA ($10),Y ; A = obsah ($4000+Y) ================================================================================ 4. ADRESNÍ MÓDY 6502 ================================================================================ Klíčová věc na 6502 - má MNOHO adresních módů! +---------------------+---------------------+---------------------+ | Mod | Syntaxe | Z80 ekvivalent | +---------------------+---------------------+---------------------+ | Immediate | LDA #$10 | LD A, $10 | | (prima hodnota) | (A = hodnota $10) | | +---------------------+---------------------+---------------------+ | Zero Page | LDA $10 | LD A, ($0010) | | (adresa $00-$FF) | (A = obsah $0010) | (ale kratsi/rychl.) | +---------------------+---------------------+---------------------+ | Zero Page,X | LDA $10,X | LD A, (IX+d) | | | (A = obsah $10+X) | (ale wrap v ZP!) | +---------------------+---------------------+---------------------+ | Zero Page,Y | LDX $10,Y | (podobne) | | (jen LDX, STX) | | | +---------------------+---------------------+---------------------+ | Absolute | LDA $D020 | LD A, ($D020) | | (plna 16-bit adr.) | | | +---------------------+---------------------+---------------------+ | Absolute,X | LDA $0400,X | LD HL,$0400 | | | (A = obsah $0400+X) | LD B,0; LD C,X | | | | ADD HL,BC; LD A,(HL)| +---------------------+---------------------+---------------------+ | Absolute,Y | LDA $0400,Y | (podobne) | +---------------------+---------------------+---------------------+ | Indirect Indexed | LDA ($10),Y | * UNIKATNI! | | (ZP ukazatel + Y) | ptr=mem[$10,$11] | ptr=HL z ZP, pak | | | A = mem[ptr+Y] | ADD HL,Y; LD A,(HL) | +---------------------+---------------------+---------------------+ | Indexed Indirect | LDA ($10,X) | (mene pouzivane) | | (ZP+X = ukazatel) | ptr=mem[$10+X] | | +---------------------+---------------------+---------------------+ | Implied | INX | INC B | | (bez operandu) | (X = X + 1) | | +---------------------+---------------------+---------------------+ | Accumulator | ASL A | SLA A | | (operace na A) | (A = A * 2) | | +---------------------+---------------------+---------------------+ | Relative | BNE navesti | JR NZ, navesti | | (pro skoky) | (-128 az +127) | (stejny rozsah) | +---------------------+---------------------+---------------------+ ================================================================================ 5. PŘEHLED INSTRUKCÍ Z DEMA ================================================================================ NAČÍTÁNÍ A UKLÁDÁNÍ: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | LDA #n | Nacti A primo hodnotou | LD A, n | | | A = n | | +------------+--------------------------------+--------------------+ | LDA addr | Nacti A z pameti | LD A, (nn) | | | A = obsah adresy | | +------------+--------------------------------+--------------------+ | LDA addr,X | Nacti A z pameti + X | (viz vyse) | | | A = obsah (addr + X) | | +------------+--------------------------------+--------------------+ | LDA (zp),Y | Nacti A neprime indexovane | (viz vyse) | | | ptr = [zp, zp+1] | | | | A = obsah (ptr + Y) | | +------------+--------------------------------+--------------------+ | LDX #n | Nacti X primo hodnotou | LD B, n | +------------+--------------------------------+--------------------+ | LDX addr | Nacti X z pameti | LD A,(nn); LD B,A | +------------+--------------------------------+--------------------+ | LDY #n | Nacti Y primo hodnotou | LD C, n | +------------+--------------------------------+--------------------+ | STA addr | Uloz A do pameti | LD (nn), A | +------------+--------------------------------+--------------------+ | STA addr,X | Uloz A do pameti + X | (viz Absolute,X) | +------------+--------------------------------+--------------------+ | STA (zp),Y | Uloz A neprime indexovane | (viz Indir.Idx.) | +------------+--------------------------------+--------------------+ | STX addr | Uloz X do pameti | LD A,B; LD (nn),A | +------------+--------------------------------+--------------------+ ARITMETIKA: +------------+--------------------------------+---------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+---------------------+ | ADC #n | Pricti s prenosem | ADC A, n | | | A = A + n + Carry | | | | * VZDY pricita Carry! | | +------------+--------------------------------+---------------------+ | ADC addr | Pricti z pameti s prenosem | LD HL,nn; ADC A,(HL)| +------------+--------------------------------+---------------------+ | SBC #n | Odecti s vypujckou | SBC A, n | | | A = A - n - (1 - Carry) | * POZOR: Borrow je | | | * Carry=1 = ZADNA vypujcka | OPACNE nez na Z80!| | | * Pred SBC musis dat SEC! | | +------------+--------------------------------+---------------------+ | SBC addr | Odecti z pameti | LD HL,nn; SBC A,(HL)| +------------+--------------------------------+---------------------+ | CLC | Vynuluj Carry | AND A (nebo OR A) | | | * NUTNE pred scitanim! | | +------------+--------------------------------+---------------------+ | SEC | Nastav Carry | SCF | | | * NUTNE pred odcitanim! | | +------------+--------------------------------+---------------------+ | INC addr | Zvys hodnotu v pameti | LD HL,nn; INC (HL) | | | [addr]++ (NEMENI Carry!) | | +------------+--------------------------------+---------------------+ | DEC addr | Sniz hodnotu v pameti | LD HL,nn; DEC (HL) | | | [addr]-- (NEMENI Carry!) | | +------------+--------------------------------+---------------------+ | INX | Zvys X o 1 | INC B | +------------+--------------------------------+---------------------+ | INY | Zvys Y o 1 | INC C | +------------+--------------------------------+---------------------+ | DEX | Sniz X o 1 | DEC B | +------------+--------------------------------+---------------------+ | DEY | Sniz Y o 1 | DEC C | +------------+--------------------------------+---------------------+ DŮLEŽITÝ ROZDÍL - CARRY/BORROW: Z80: 6510: ADD A, n ; A = A + n (neexistuje! vzdy ADC) ADC A, n ; A = A + n + C CLC ; Carry = 0 ADC #n ; A = A + n + 0 SUB n ; A = A - n (neexistuje! vzdy SBC) SBC A, n ; A = A - n - C SEC ; Carry = 1 SBC #n ; A = A - n - 0 POZOR na SBC: Z80: Borrow = Carry (C=1 = byla vypujcka) 6510: Borrow = NOT Carry (C=0 = byla vypujcka, C=1 = nebyla) LOGICKÉ OPERACE: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | AND #n | Logicky soucin (AND) | AND n | | | A = A AND n | | +------------+--------------------------------+--------------------+ | ORA #n | Logicky soucet (OR) | OR n | | | A = A OR n | | +------------+--------------------------------+--------------------+ | EOR #n | Exkluzivni OR (XOR) | XOR n | | | A = A XOR n | | +------------+--------------------------------+--------------------+ POSUNY A ROTACE: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | ASL A | Aritmeticky posun vlevo | SLA A | | | C <- [7..0] <- 0 | (nebo ADD A,A) | | | A = A * 2 | | +------------+--------------------------------+--------------------+ | ASL addr | ASL na pameti | LD HL,nn; SLA (HL) | +------------+--------------------------------+--------------------+ | LSR A | Logicky posun vpravo | SRL A | | | 0 -> [7..0] -> C | | | | A = A / 2 (beze znam.) | | +------------+--------------------------------+--------------------+ | LSR addr | LSR na pameti | LD HL,nn; SRL (HL) | +------------+--------------------------------+--------------------+ | ROR A | Rotace vpravo pres Carry | RR A | | | C -> [7..0] -> C | | | | 9-bitova rotace | | +------------+--------------------------------+--------------------+ | ROL A | Rotace vlevo pres Carry | RL A | | | C <- [7..0] <- C | | +------------+--------------------------------+--------------------+ POROVNÁNÍ: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | CMP #n | Porovnej A s hodnotou | CP n | | | Provede A - n, NEMENI A | | | | Z=1 pokud A == n | | | | C=1 pokud A >= n (beze znam.) | | +------------+--------------------------------+--------------------+ | CMP addr | Porovnej A s pameti | LD HL,nn; CP (HL) | +------------+--------------------------------+--------------------+ | CPX #n | Porovnej X s hodnotou | (pres A) | +------------+--------------------------------+--------------------+ | CPY #n | Porovnej Y s hodnotou | (pres A) | +------------+--------------------------------+--------------------+ SKOKY A VĚTVENÍ: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | JMP addr | Nepodmineny skok | JP nn | +------------+--------------------------------+--------------------+ | JSR addr | Skok do podprogramu | CALL nn | | | Uloz PC+2 na zasobnik, skoc | | +------------+--------------------------------+--------------------+ | RTS | Navrat z podprogramu | RET | | | Vyzvedni PC ze zasobniku | | +------------+--------------------------------+--------------------+ | BEQ rel | Skoc kdyz rovno (Z=1) | JR Z, rel | +------------+--------------------------------+--------------------+ | BNE rel | Skoc kdyz nerovno (Z=0) | JR NZ, rel | +------------+--------------------------------+--------------------+ | BCC rel | Skoc kdyz Carry=0 | JR NC, rel | +------------+--------------------------------+--------------------+ | BCS rel | Skoc kdyz Carry=1 | JR C, rel | +------------+--------------------------------+--------------------+ | BPL rel | Skoc kdyz kladne (N=0) | JP P, nn (ale rel!)| +------------+--------------------------------+--------------------+ | BMI rel | Skoc kdyz zaporne (N=1) | JP M, nn (ale rel!)| +------------+--------------------------------+--------------------+ Vsechny Branch instrukce maji rozsah -128 az +127 bytu! PŘESUNY MEZI REGISTRY: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | TAX | Presun A do X | LD B, A | +------------+--------------------------------+--------------------+ | TAY | Presun A do Y | LD C, A | +------------+--------------------------------+--------------------+ | TXA | Presun X do A | LD A, B | +------------+--------------------------------+--------------------+ | TYA | Presun Y do A | LD A, C | +------------+--------------------------------+--------------------+ ŘÍZENÍ PŘERUŠENÍ: +------------+--------------------------------+--------------------+ | Instrukce | Popis | Z80 ekvivalent | +------------+--------------------------------+--------------------+ | SEI | Zakaz preruseni | DI | | | I flag = 1 (zakazat IRQ) | | +------------+--------------------------------+--------------------+ | CLI | Povol preruseni | EI | | | I flag = 0 (povolit IRQ) | | +------------+--------------------------------+--------------------+ ================================================================================ 6. VIC-II GRAFICKÝ ČIP ================================================================================ DŮLEŽITÉ REGISTRY: +---------+------------------------------------------------------------+ | Adresa | Popis | +---------+------------------------------------------------------------+ | $D012 | RASTER - aktualni rasterova radka (0-255) | | | * Pro VSYNC: cekej na radku v VBLANK (napr. 251) | | $D011 | Bit 7 = 9. bit RASTER (PAL ma 312 radek) | +---------+------------------------------------------------------------+ | $D020 | BORDER COLOR (barva okraje, 0-15) | | | * Jako OUT (254),A na Spectru (ale 16 barev!) | +---------+------------------------------------------------------------+ | $D021 | BACKGROUND COLOR 0 (barva pozadi, 0-15) | | | * Na Spectru nemas globalni pozadi | +---------+------------------------------------------------------------+ BARVY C64 (16 barev): +-----+-----------------+-----+-----------------+ | Kod | Barva | Kod | Barva | +-----+-----------------+-----+-----------------+ | 0 | Cerna | 8 | Oranzova | | 1 | Bila | 9 | Hneda | | 2 | Cervena | 10 | Svetle cervena | | 3 | Azurova (Cyan) | 11 | Tmave seda | | 4 | Fialova | 12 | Stredni seda | | 5 | Zelena | 13 | Svetle zelena | | 6 | Modra | 14 | Svetle modra | | 7 | Zluta | 15 | Svetle seda | +-----+-----------------+-----+-----------------+ SCREEN RAM VS COLOR RAM: SCREEN RAM ($0400-$07FF) = Kody znaku (0-255) - Kazdy byte urcuje KTERY znak z CHAR ROM se zobrazi - 40 x 25 = 1000 bytu (zbytek do $07FF nepouzit) COLOR RAM ($D800-$DBFF) = Barva popredi pro kazdy znak - Jen 4 bity na znak (hodnoty 0-15), hornich 4 bitu ignorovano - Pozadi je globalni ($D021) TRIK V DEMU: Screen RAM ma vsude znak 160 (PETSCII plny blok) Menime jen COLOR RAM = "pixel grafika" bez zmeny CHAR ROM! ================================================================================ 7. ZERO PAGE TRIKY ================================================================================ PROČ JE ZERO PAGE TAK DŮLEŽITÁ: Na Z80 mas: Na 6510 mas: - HL, BC, DE (16b) - Jen A, X, Y (8-bit!) - IX, IY (16b) - ZERO PAGE = nahrada za chybejici reg! Zero Page ($0000-$00FF) je specialni: 1. Instrukce jsou KRATSI (2 byty misto 3) 2. Instrukce jsou RYCHLEJSI (o 1 takt mene) 3. Lze pouzit jako 16-bit ukazatele (Indirect Indexed mode) PŘÍKLAD Z DEMA - 16-BIT UKAZATEL: ; Definice v Zero Page ptr = $0e ; 16-bit ukazatel (zabira $0e a $0f) ; Nastaveni ukazatele na Color RAM ($D852) lda #$52 ; Nizky byte adresy sta ptr ; -> $0E lda #$d8 ; Vysoky byte sta ptr+1 ; -> $0F (ted ptr ukazuje na $D852) ; Zapis barvy na obrazovku ldy #0 ; Y = offset od ptr lda #5 ; Barva 5 = zelena sta (ptr),y ; Zapis na $D852+0 = $D852 ; Zapis na dalsi pozici iny ; Y = 1 lda #2 ; Barva 2 = cervena sta (ptr),y ; Zapis na $D852+1 = $D853 EKVIVALENT NA Z80: ; Z80 verze - JEDNODUSSI diky 16-bit registrum! ld hl, $D852 ; HL = adresa Color RAM (primo!) ld (hl), 5 ; Zapis zelenou barvu inc hl ; HL = $D853 ld (hl), 2 ; Zapis cervenou barvu ; Vyhoda 6510: (ptr),Y pricte Y automaticky, ; nemusis menit samotny ukazatel v pameti! KOMPLETNÍ MAPA ZERO PAGE V DEMU: +---------+-------------+------------------------------------------+ | Adresa | Nazev | Popis | +---------+-------------+------------------------------------------+ | $02 | u_lo | Texturova U souradnice - nizky byte | | $03 | u_hi | Texturova U souradnice - vysoky byte | | $04 | v_lo | Texturova V souradnice - nizky byte | | $05 | v_hi | Texturova V souradnice - vysoky byte | | $06 | du_lo | Delta U na pixel - nizky byte | | $07 | du_hi | Delta U na pixel - vysoky byte | | $08 | dv_lo | Delta V na pixel - nizky byte | | $09 | dv_hi | Delta V na pixel - vysoky byte | | $0a | row_u_lo | U na zacatku radku - nizky byte | | $0b | row_u_hi | U na zacatku radku - vysoky byte | | $0c | row_v_lo | V na zacatku radku - nizky byte | | $0d | row_v_hi | V na zacatku radku - vysoky byte | | $0e | ptr | 16-bit ukazatel (nizky byte) | | $0f | ptr+1 | 16-bit ukazatel (vysoky byte) | | $10 | cnt | Obecny citac | | $11 | tmp | Docasna promenna | | $12 | zoom | Aktualni zoom faktor | | $13 | angle | Aktualni uhel rotace (0-255 = 0-360) | | $14 | zoom_ph | Faze pro zoom animaci | | $15 | move_ph | Faze pro pohyb | | $16 | rot_ph | Faze pro rotaci | | $17 | mztmp | Pomocna pro mulzoom rutinu | | $fd | (beze jm.) | Nasobitel pro mulzoom | +---------+-------------+------------------------------------------+ ================================================================================ 8. PRAKTICKÉ TIPY ================================================================================ TYPICKÉ VZORY KÓDU: Smycka pres 256 hodnot: ; 6510: ; Z80: ldx #0 ; ld b, 0 loop: ; ... kod ... ; loop: ; ... kod ... dex ; dec b bne loop ; jr nz, loop ; Projde X: 0,255,254,...,1 ; Projde B: 0,255,254,...,1 16-bit scitani: ; 6510: ; Z80: lda num_lo ; ld hl, (num) clc ; ld de, (add) adc add_lo ; add hl, de sta num_lo ; ld (num), hl lda num_hi ; adc add_hi ; sta num_hi ; 16-bit odcitani: ; 6510: ; Z80: lda num_lo ; ld hl, (num) sec ; ld de, (sub) sbc sub_lo ; or a ; vynuluj C sta num_lo ; sbc hl, de lda num_hi ; ld (num), hl sbc sub_hi ; sta num_hi ; Absolutni hodnota: ; 6510: ; Z80: ; A = znamenkove cislo ; ; A = znamenkove cislo bpl kladne ; or a eor #$ff ; jp p, kladne clc ; neg adc #1 ; kladne: ; kladne: Cekani na VSYNC: ; C64 (PAL): ; ZX Spectrum: cekej: lda $d012 ; halt ; ceka na IRQ cmp #251 ; ; (presne 1/50s) bne cekej ; ; Ceka az VIC-II dosahne radku 251 (VBLANK oblast) CO CHYBÍ NA 6510 (A JAK TO ŘEŠIT): +--------------------+----------------------------------------------+ | Z80 ma, 6510 nema | Jak to resit na 6510 | +--------------------+----------------------------------------------+ | ADD (bez carry) | CLC pred ADC | | SUB (bez borrow) | SEC pred SBC | | 16-bit registry | Dva byty v Zero Page | | LDIR (blok. kopie) | Smycka s LDA/STA a INX/INY | | DJNZ | DEX + BNE (nebo DEY + BNE) | | EX DE,HL | Rucne pres A nebo pres zasobnik | | PUSH BC/DE/HL | Jen PHA/PLA (A), PHX/PLX na 65C02 | | NEG | EOR #$FF / CLC / ADC #1 | | CPL | EOR #$FF | | JP (HL) | JMP (addr) - neprimy skok existuje | +--------------------+----------------------------------------------+ ================================================================================ RYCHLÝ PŘEHLED ================================================================================ +====================================================================+ | 6510 RYCHLY PREHLED | +====================================================================+ | NACTI: LDA LDX LDY ULOZ: STA STX STY | | MATIKA: ADC SBC INC DEC LOGIKA: AND ORA EOR | | POSUNY: ASL LSR ROL ROR POROVNEJ: CMP CPX CPY | | VETVENI: BEQ BNE BCC BCS BPL BMI BVC BVS | | SKOKY: JMP JSR RTS RTI ZASOBNIK: PHA PLA PHP PLP | | FLAGY: CLC SEC CLI SEI CLD SED CLV | | PRESUNY: TAX TAY TXA TYA TSX TXS | | OSTATNI: NOP BRK BIT | +====================================================================+ | FLAGY: N=Zaporne V=Preteceni B=Break D=BCD I=IRQ Z=Nula C=Prenos | +====================================================================+ | ADRESNI MODY: | | #$nn Primo (hodnota) $nn Zero Page (2B, rychle!) | | $nn,X ZP,X $nn,Y ZP,Y (jen LDX/STX) | | $nnnn Absolutne (3B) $nnnn,X Absolutne,X | | $nnnn,Y Absolutne,Y ($nn),Y Neprime Indexovane (dulezite!)| | ($nn,X) Indexovane Neprime | +====================================================================+ | PAMET C64: | | $0000-$00FF Zero Page $D800-$DBFF Color RAM | | $0100-$01FF Stack (fixni!) $D000-$D3FF VIC-II | | $0400-$07FF Screen RAM $D400-$D7FF SID | +====================================================================+ ================================================================================ Tahak vytvoren na zaklade rotozoom 1K dema pro C64 Autor dema: Shrek/MB Maniax (c) 2026 Forever 2026 ================================================================================