Odpověď na názor

Odpovídáte na názor k článku Ovládání hráčů ve hře klávesnicí nebo joystickem na ZX Spectru. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.

  • Článek je starý, nové názory již nelze přidávat.
  • 26. 5. 2023 18:25

    xbastaj

    Tak jsem si "pohrál" a tady je výsledek pro dva hráče. Dorazy testuju přímo v HL. No a protože jsou hráči dva, jsou jejich souřadnice primárně uloženy v proměnných HracA_XY a HracB_XY.

    ENTRY_POINT      equ $8000
    ROM_OPEN_CHANNEL equ $1601
    ATTRIBUTE_ADR    equ $5800
    ROM_CLS          equ $0DAF
    ;-------------------------------------------------------------------------------
    X0A              equ 10        ;pocatecni souradnice
    Y0A              equ 10
    X0B              equ 20
    Y0B              equ 10
    
    XMIN             equ 0         ;meze
    XMAX             equ 31
    YMIN             equ ATTRIBUTE_ADR
    YMAX             equ ATTRIBUTE_ADR+23*32
    
    KB_R0            equ $fe       ;radky klavesnice
    KB_R1            equ $fd
    KB_R2            equ $fb
    KB_R3            equ $f7
    KB_R4            equ $ef
    KB_R5            equ $df
    KB_R6            equ $bf
    KB_R7            equ $7f
    
    Color0           equ $38 ;bila
    Color1A          equ $48 ;modra
    Color2A          equ $58 ;magenta
    Color1B          equ $60 ;zelena
    Color2B          equ $70 ;zluta
    Color3           equ $50 ;cervena
    
    INIPOS_A         equ ATTRIBUTE_ADR+32*Y0A+X0A
    INIPOS_B         equ ATTRIBUTE_ADR+32*Y0B+X0B
    
    ;-------------------------------------------------------------------------------
    CH_ATTR macro  attr
            ld  (hl), attr
    endm
    
    KEYB    macro port
            ld  c, $fe           ;adresa portu
            ld  b, port          ;adresa radku
            in  a, (c)           ;vlastní čtení z portu (5 bitů)
    endm
    
    LOAD_HracXY macro            ;nacteni pozice hrace z pameti do HL
            ld l,(IX)
            ld h,(IX+1)
    endm
    
    STORE_HracXY macro          ;ulozeni pozice hrace z HL do pameti
            ld (IX),l
            ld (IX+1),h
    endm
    
    ;-------------------------------------------------------------------------------
            org ENTRY_POINT
    
    start:  call ROM_CLS       ;vymazani obrazovky
    
            ld ix,HracA_XY     ;pocatecni zobrazeni hrace A
            LOAD_HracXY
            CH_ATTR Color1A
    
            ld ix,HracB_XY     ;pocatecni zobrazeni hrace B
            LOAD_HracXY
            CH_ATTR Color1B
    
    ;-------------------------------------------------------------------------------
    main:   call delay         ;zpozdeni
    
            ld ix,HracA_XY     ;adresa pozice hrace A
            KEYB KB_R3         ;test joysticku A
            ld e,Color1A       ;barva hrace A
            rra                ;1
            call nc,vlevo
            rra                ;2
            call nc,dolu
            rra                ;3
            call nc,nahoru
            rra                ;4
            call nc,vpravo
            rra                ;5
            ld e,Color2A       ;barva pri strelbe
            call nc,palba
            ld e,Color1A       ;barva hrace A
            call c,klid
    
            ld ix,HracB_XY     ;adresa pozice hrace B
            KEYB KB_R4         ;test joysticku B
            ld e,Color1B       ;barva hrace B
            rla
            rla
            rla
            rla                ;6
            call nc,vlevo
            rla                ;7
            call nc,dolu
            rla                ;8
            call nc,nahoru
            rla                ;9
            call nc,vpravo
            rla                ;0
            ld e,Color2B       ;barva pri strelbe
            call nc,palba
            ld e,Color1B       ;barva hrace B
            call c,klid
    
            call kolize        ;test kolize hracu
    
            jp main            ;hlavni cyklus
    
    ;-------------------------------------------------------------------------------
    vpravo: push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            ld a,l              ;test okraje
            cpl
            and 0x1F            ;poslednich 5 bitu 11111
            jr Z,vp0            ;nebude zmena pozice
            inc hl              ;nova pozice
    vp0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    vlevo:  push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            ld a,l              ;test okraje
            and 0x1F            ;poslednich 5 bitu 00000
            jr Z,vl0            ;nebude zmena pozice
            dec hl              ;nova pozice
    vl0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    dolu:   push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            push HL             ;zalohovani pozice
            ld a,l
            and 0xE0            ;nulovani poslednich 5 bitu
            ld l,a
            ld bc,YMAX          ;nastaveni maxima
            sbc hl,bc           ;otestovani hodnoty
            pop HL
            jr Z,do0            ;nebude zmena pozice
            ld bc,32            ;nova pozice
            add hl,bc
    do0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    nahoru: push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            push HL             ;zalohovani pozice
            ld a,l
            and 0xE0            ;nulovani poslednich 5 bitu
            ld l,a
            ld bc,YMIN          ;nastaveni maxima
            sbc hl,bc           ;otestovani hodnoty
            pop HL
            jr Z,na0            ;nebude zmena pozice
            ld bc,-32           ;nova pozice
            add hl,bc
    na0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    palba:  push AF             ;zmena barvy pri strelbe
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR e
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    klid:   push AF             ;zmena barvy kdyz se nestrili
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR e
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    kolize: push AF
            ld ix,HracA_XY
            LOAD_HracXY         ;nacteni pozice hrace A
            ld b,h              ;kopie do BC
            ld c,l
            ld ix,HracB_XY
            LOAD_HracXY         ;nacteni pozice hrace B
            or a                ;nulovani cary
            sbc hl,bc           ;porovnani
            jr nz,ko0           ;neni kolize
            LOAD_HracXY
            CH_ATTR Color3      ;nastaveni barvy kolize
    ko0:    pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    delay:  push bc            ;zpozdeni
            push de
            ld d,60
            ld e,0
    d01:    dec e
            jr nz, d01
            dec d
            jr nz, d01
            pop de
            pop bc
            ret
    
    ;-------------------------------------------------------------------------------
    HracA_XY: dw INIPOS_A     ;pozice hrace A v pameti
    HracB_XY: dw INIPOS_B     ;pozice hrace B v pameti
    
    end ENTRY_POINT
    
    ENTRY_POINT      equ $8000
    ROM_OPEN_CHANNEL equ $1601
    ATTRIBUTE_ADR    equ $5800
    ROM_CLS          equ $0DAF
    ;-------------------------------------------------------------------------------
    X0A              equ 10        ;pocatecni souradnice
    Y0A              equ 10
    X0B              equ 20
    Y0B              equ 10
    
    XMIN             equ 0         ;meze
    XMAX             equ 31
    YMIN             equ ATTRIBUTE_ADR
    YMAX             equ ATTRIBUTE_ADR+23*32
    
    KB_R0            equ $fe       ;radky klavesnice
    KB_R1            equ $fd
    KB_R2            equ $fb
    KB_R3            equ $f7
    KB_R4            equ $ef
    KB_R5            equ $df
    KB_R6            equ $bf
    KB_R7            equ $7f
    
    Color0           equ $38 ;bila
    Color1A          equ $48 ;modra
    Color2A          equ $58 ;magenta
    Color1B          equ $60 ;zelena
    Color2B          equ $70 ;zluta
    Color3           equ $50 ;cervena
    
    INIPOS_A         equ ATTRIBUTE_ADR+32*Y0A+X0A
    INIPOS_B         equ ATTRIBUTE_ADR+32*Y0B+X0B
    
    ;-------------------------------------------------------------------------------
    CH_ATTR macro  attr
            ld  (hl), attr
    endm
    
    KEYB    macro port
            ld  c, $fe           ;adresa portu
            ld  b, port          ;adresa radku
            in  a, (c)           ;vlastní čtení z portu (5 bitů)
    endm
    
    LOAD_HracXY macro            ;nacteni pozice hrace z pameti do HL
            ld l,(IX)
            ld h,(IX+1)
    endm
    
    STORE_HracXY macro          ;ulozeni pozice hrace z HL do pameti
            ld (IX),l
            ld (IX+1),h
    endm
    
    ;-------------------------------------------------------------------------------
            org ENTRY_POINT
    
    start:  call ROM_CLS       ;vymazani obrazovky
    
            ld ix,HracA_XY     ;pocatecni zobrazeni hrace A
            LOAD_HracXY
            CH_ATTR Color1A
    
            ld ix,HracB_XY     ;pocatecni zobrazeni hrace B
            LOAD_HracXY
            CH_ATTR Color1B
    
    ;-------------------------------------------------------------------------------
    main:   call delay         ;zpozdeni
    
            ld ix,HracA_XY     ;adresa pozice hrace A
            KEYB KB_R3         ;test joysticku A
            ld e,Color1A       ;barva hrace A
            rra                ;1
            call nc,vlevo
            rra                ;2
            call nc,dolu
            rra                ;3
            call nc,nahoru
            rra                ;4
            call nc,vpravo
            rra                ;5
            ld e,Color2A       ;barva pri strelbe
            call nc,palba
            ld e,Color1A       ;barva hrace A
            call c,klid
    
            ld ix,HracB_XY     ;adresa pozice hrace B
            KEYB KB_R4         ;test joysticku B
            ld e,Color1B       ;barva hrace B
            rla
            rla
            rla
            rla                ;6
            call nc,vlevo
            rla                ;7
            call nc,dolu
            rla                ;8
            call nc,nahoru
            rla                ;9
            call nc,vpravo
            rla                ;0
            ld e,Color2B       ;barva pri strelbe
            call nc,palba
            ld e,Color1B       ;barva hrace B
            call c,klid
    
            call kolize        ;test kolize hracu
    
            jp main            ;hlavni cyklus
    
    ;-------------------------------------------------------------------------------
    vpravo: push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            ld a,l              ;test okraje
            cpl
            and 0x1F            ;poslednich 5 bitu 11111
            jr Z,vp0            ;nebude zmena pozice
            inc hl              ;nova pozice
    vp0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    vlevo:  push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            ld a,l              ;test okraje
            and 0x1F            ;poslednich 5 bitu 00000
            jr Z,vl0            ;nebude zmena pozice
            dec hl              ;nova pozice
    vl0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    dolu:   push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            push HL             ;zalohovani pozice
            ld a,l
            and 0xE0            ;nulovani poslednich 5 bitu
            ld l,a
            ld bc,YMAX          ;nastaveni maxima
            sbc hl,bc           ;otestovani hodnoty
            pop HL
            jr Z,do0            ;nebude zmena pozice
            ld bc,32            ;nova pozice
            add hl,bc
    do0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    nahoru: push AF
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR Color0      ;barva pozadi
            push HL             ;zalohovani pozice
            ld a,l
            and 0xE0            ;nulovani poslednich 5 bitu
            ld l,a
            ld bc,YMIN          ;nastaveni maxima
            sbc hl,bc           ;otestovani hodnoty
            pop HL
            jr Z,na0            ;nebude zmena pozice
            ld bc,-32           ;nova pozice
            add hl,bc
    na0:    CH_ATTR e           ;barva hrace
            STORE_HracXY        ;ulozeni pozice hrace
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    palba:  push AF             ;zmena barvy pri strelbe
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR e
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    klid:   push AF             ;zmena barvy kdyz se nestrili
            LOAD_HracXY         ;nacteni pozice hrace
            CH_ATTR e
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    kolize: push AF
            ld ix,HracA_XY
            LOAD_HracXY         ;nacteni pozice hrace A
            ld b,h              ;kopie do BC
            ld c,l
            ld ix,HracB_XY
            LOAD_HracXY         ;nacteni pozice hrace B
            or a                ;nulovani cary
            sbc hl,bc           ;porovnani
            jr nz,ko0           ;neni kolize
            LOAD_HracXY
            CH_ATTR Color3      ;nastaveni barvy kolize
    ko0:    pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    delay:  push bc            ;zpozdeni
            push de
            ld d,60
            ld e,0
    d01:    dec e
            jr nz, d01
            dec d
            jr nz, d01
            pop de
            pop bc
            ret
    
    ;-------------------------------------------------------------------------------
    HracA_XY: dw INIPOS_A     ;pozice hrace A v pameti
    HracB_XY: dw INIPOS_B     ;pozice hrace B v pameti
    
    end ENTRY_POINT