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.
  • 27. 5. 2023 7:02

    _dw

    Upravil jsem ten kod na minimalisticky "Dyna Blaster". Kod trosku nabobtnal na 210 bajtu, ale uplne jsem to nehrotil s optimalizaci.

    ENTRY_POINT      equ $8000
    ATTRIBUTE_ADR    equ $5800
    ROM_CLS          equ $0DAF
    
    X0A              equ 32/2-6        ;pocatecni souradnice
    Y0A              equ 23/2
    X0B              equ 32/2+5
    Y0B              equ 23/2
    
    KB_R0            equ $fefe  ;BC=0xFEFE ->A=...VCXZc
    KB_R1            equ $fdfe  ;BC=0xFDFE ->A=...GFDSA
    KB_R2            equ $fbfe  ;BC=0xFBFE ->A=...TREWQ
    KB_R3            equ $f7fe  ;BC=0xF7FE ->A=...54321
    KB_R4            equ $effe  ;BC=0xEFFE ->A=...67890
    KB_R5            equ $dffe  ;BC=0xDFFE ->A=...YUIOP
    KB_R6            equ $bffe  ;BC=0xBFFE ->A=...HJKLe
    KB_R7            equ $7ffe  ;BC=0x7FFE ->A=...BNMs_
    
    
    player_a         equ 3
    bomb             equ 4
    player_b         equ 5
    timer            equ 6
    
    
    INIPOS_A         equ ATTRIBUTE_ADR+32*Y0A+X0A
    INIPOS_B         equ ATTRIBUTE_ADR+32*Y0B+X0B
    
    ;-------------------------------------------------------------------------------
    
            org ENTRY_POINT
    
            ld  A, %00101000    ; 2:7
    start:
            rra                 ; 1:4
            rra                 ; 1:4
            rra                 ; 1:4
            out (254),A         ; 2:11      zx_border   0=blk,1=blu,2=red,3=mag,4=grn,5=cyn,6=yel,7=wht
    
            xor a
            ld (0x5C8D),a
            call ROM_CLS
    
            ld hl,INIPOS_B
            ex de,hl
            ld hl,INIPOS_A
    
    
    
    ;-------------------------------------------------------------------------------
    main:
            ld   bc, KB_R4     ;3:10
            in    a,(c)        ;2:12 vlastní čtení z portu (5 bitů)
            push af            ;1:10
            ld    b,high KB_R3 ;2:7
            in    a,(c)        ;2:12 vlastní čtení z portu (5 bitů)
            ld   bc, 0x0020    ;3:10 = 32
    
            push hl            ;1:11
            call vlevo_rra     ;3:17
            call vpravo_rra    ;3:17
            call dolu_rra      ;3:17
            call nahoru_rra    ;3:17
            call palba_rra     ;3:17
            ex  (sp),hl        ;1:19
            res player_a,(hl)  ;2:15
            pop  hl            ;1:10
            set player_a,(hl)  ;2:15
    
            ex   de,hl
            pop  af            ;1:10
            push hl            ;1:11
            call palba_rra     ;3:17
            call nahoru_rra    ;3:17
            call dolu_rra      ;3:17
            call vpravo_rra    ;3:17
            call vlevo_rra     ;3:17
            ex (sp),hl         ;1:19
            res player_b,(hl)  ;2:15
            pop hl             ;1:10
            set player_b,(hl)  ;2:15
    
    
            push hl            ;1:11
            ld   hl,ATTRIBUTE_ADR+3*256-1;3:10
    check_timer:
            ld    a,(hl)       ;1:7
            bit timer,a        ;2:8
            jr    z,no_timer   ;2:7/12
    
            bit bomb,a         ;2:8
            jr   nz,explosion  ;2:7/12
    
    flash:
            and %00000111      ;2:7         mask_time
            jr   z,save        ;2:7/12
            or  %11000000      ;2:7
            jr  dec_a          ;2:7/12
    
    explosion:
            and %00000111      ;2:7         mask_time
            jr  nz,dec_timer   ;2:7/12
            ld    a,%11000111  ;2:7         init flash
    
            push hl
            call vlevo
            ld  (hl),a
            pop  hl
    
            push hl
            call vpravo
            ld  (hl),a
            pop  hl
    
            push hl
            call dolu
            ld  (hl),a
            pop  hl
    
            push hl
            call nahoru
            ld  (hl),a
            pop  hl
    
    
            jr save            ;2:12
    
    dec_timer:
            ld    a,(hl)       ;1:7
    dec_a:
            dec   a            ;1:4
    save:
            ld  (hl),a         ;1:7
    no_timer:
            dec  hl            ;1:6
            bit   2,h          ;2:8    0x57 1001 0111
            jr    z,check_timer;2:7/12
            pop  hl            ;1:10
    
    ; check live
            ld   a,(hl)        ;1:7
            ex   de,hl         ;1:4
            or (hl)            ;1:7
            and %00101000      ;2:7
            cp  %00101000      ;2:7
            jp   nz,start      ;3:10
    
            halt
            halt
            jp main
    
    ;-------------------------------------------------------------------------------
    
    if 0
    read_row:
            ld  c, 0xFE        ;2:7
            in  a, (c)         ;2:12 vlastní čtení z portu (5 bitů)
            ld   bc,  0x0020   ;3:10 = 32
            ret                ;1:10
    endif
    ;-------------------------------------------------------------------------------
    
    vlevo_rra:
            rra                ;1:4
            ret c              ;1:5/11
    vlevo:
            push af            ;1:11
            ld a,%00011111     ;2:7
            and l              ;1:4
            jr z,$+3           ;2:7/12
            dec l              ;1:4
            pop  af            ;1:10
            ret                ;1:10
    
    ;-------------------------------------------------------------------------------
    
    vpravo_rra:
            rra                ;1:4
            ret c              ;1:5/11
    vpravo:
            push af            ;1:11
            ld  a,%00011111    ;2:7
            inc l              ;1:4
            and l              ;1:4
            jr nz,$+3          ;2:7/12
            dec l              ;1:4
            pop  af            ;1:10
            ret                ;1:10
    
    ;-------------------------------------------------------------------------------
    
    dolu_rra:
            rra                ;1:4
            ret c              ;1:5/11
    dolu:
    ; last row 0x5AE0..0x5AFF => 0101 1010 111. ....
            add hl,bc          ;1:11    fail:0x5B ...1011; ok:0x58 ...1000,0x59 ...1001,0x5A ...1010
            inc h              ;1:4
            bit 2,h            ;2:8
            jr  z,$+4          ;2:7/12
            sbc hl,bc          ;2:15
            dec h              ;1:4
            ret                ;1:10
    
    ;-------------------------------------------------------------------------------
    
    nahoru_rra:
            rra                ;1:4
            ret c              ;1:5/11
    nahoru:
    ; first row 0x5800..0x581F => 0101 1000 000. ....
            sbc hl,bc          ;2:15    no carry! fail:0x57 ...0(1)11; ok:0x58 ...1(0)00,0x59 ...1(0)01,0x5A ...1(0)10
            bit 2,h            ;2:8
            ret z              ;1:5/11
            add hl,bc          ;1:11
            ret                ;1:10
    
    ;-------------------------------------------------------------------------------
    
    palba_rra:
            rra                ;1:4
            ret c              ;1:5/11
    palba:
            push af            ;1:11
            ld   a,%01010111   ;2:7
            or (hl)            ;1:7
            ld (hl),a          ;1:7
            pop  af            ;1:10
            ret                ;1:10
    
    end ENTRY_POINT

    Tezko rici jak je to "hratelne" bez 2 hracu a joysticku. Na emulatoru me moje klavesnice nepodporuje pro prvniho hrace fire+sikmy pohyb, krome vlevo dolu.