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 22:21

    _dw

    A pro dva hrace to jde napsat i takto:

    ENTRY_POINT      equ $8000
    ATTRIBUTE_ADR    equ $5800
    ROM_CLS          equ $0DAF
    
    X0A              equ 10        ;pocatecni souradnice
    Y0A              equ 10
    X0B              equ 20
    Y0B              equ 10
    
    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_
    
    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
    ;-------------------------------------------------------------------------------
    KEYB    macro port
            ld bc, 256*port+$fe  ;adresa radku & adresa portu
    endm
    
    ;-------------------------------------------------------------------------------
    
            org ENTRY_POINT
    
    start:  call ROM_CLS
    
            ld hl,INIPOS_B
            ld (hl),Color1B
            ex de,hl
            ld hl,INIPOS_A
            ld (hl),Color1A
    
    ;-------------------------------------------------------------------------------
    main:   halt
            halt
    
            ld bc, KB_R3
            in  a, (c)         ;vlastní čtení z portu (5 bitů)
            call move
            ld a,Color1A       ;klid
            jr c,$+4
            ld a,Color2A       ;palba
            ld (hl),a          ;1:7
    
            ex de,hl
            ld bc, KB_R4
            in  a, (c)         ;vlastní čtení z portu (5 bitů)
            ld  c,a
            ld  b,5
    invert_loop:
            rr c
            adc a,a
            djnz invert_loop
    
            call move
            ld a,Color1B       ;klid
            jr c,$+4
            ld a,Color2B       ;palba
            ld (hl),a          ;1:7
            ex de,hl
    
            or a
            sbc hl,de
            add hl,de
            jr nz,$+4
            ld (hl),Color3     ; kolize
    
            jp main
    
    ;-------------------------------------------------------------------------------
    
    
    ; in:
    ;       A=read port
    ;       HL= ATTRIBUTE_ADR
    move:
            push hl
            ld   bc,  0x0020   ;3:10 = 32
    vlevo:
            rra                ;1
            jr c,vpravo
    
    if 1
            ; 31x 43 taktu, 1x 44 taktu
            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
    else
            ; 50% 24 taktu, 3% 43 taktu, 47% 42 taktu
            dec l              ;1:4  ...0 0000-1?
            bit 4,l            ;2:8
            jr  z,vpravo       ;2:7/12
            inc l              ;1:4  ...1 ....+1?
            bit 4,l            ;2:8
            jr  z,vpravo       ;2:7/12
            dec l              ;1:4
    endif
    
    vpravo:
            rra                ;4
            jr c,dolu
    
    if 1
            push af            ;1:11
      if 1
            ; o trochu rychlejsi, protoze 31x 47 taktu, 1x48 taktu
            ld  a,%00011111    ;2:7
            inc l              ;1:4
            and l              ;1:4
            jr nz,$+3          ;2:7/12
            dec l              ;1:4
      else
            ; o trochu pomalejsi, protoze 31x 48 taktu, 1x47 taktu
            ld  a,%11100000    ;2:7
            or  l              ;1:4
            inc a              ;1:4
            jr  z,$+3          ;2:7/12
            inc l              ;1:4
      endif
            pop  af            ;1:10
    else
            ; 50% 24 taktu, 3% 43 taktu, 47% 42 taktu
            inc l              ;1:4  ...1 1111+1?
            bit 4,l            ;2:8
            jr nz,dolu         ;2:7/12
            dec l              ;1:4  ...0 ....-1?
            bit 4,l            ;2:8
            jr nz,dolu         ;2:7/12
            inc l              ;1:4
    endif
    
    dolu:
            rra                ;2
            jr c,nahoru
    
    ; 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,nahoru-1     ;2:7/12
            sbc hl,bc          ;2:15
            dec h              ;1:4
    nahoru:
            rra                ;3
            jr c,palba
    
    ; 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
            jr   z,palba      ;2:7/12
            add hl,bc          ;1:11
    
    palba:
            rra                ;5
            ex (sp),hl         ;1:19
            ld (hl),Color0     ;2:10
            pop hl             ;1:11
            ret
    
    ;-------------------------------------------------------------------------------
    
    
    end ENTRY_POINT

    Je to 122 bajtu z puvodnich 313. Opet tam mas tu chybu ze mas jinak poprehazene klavesy a pohyby.

    A tady jsem se sam spalil! Protoze jsem jen prohodil u druheho hrace puvodne jen radek ktery se cte a zbytek nechal shodny jenze...

    V clanku to neni zdurazneno ale na te strance:
    https://worldofspectrum.org/faq/reference/peripherals.htm
    je uvedeno ze:
    Sinclair

    The 'left' Sinclair joystick maps the joystick directions and the fire button to the 1 (left), 2 (right), 3 (down), 4 (up) and 5 (fire) keys on the ZX Spectrum keyboard, and can thus be read via port 0xf7fe; see the Port 0xfe section for full details. For any of the joystick interfaces which map to keys, any game offering the appropriate form of joystick control can instead be played with the listed keys.

    The 'right' Sinclair joystick maps to keys 6 (left), 7 (right), 8 (down), 9 (up) and 0 (fire) and can therefore be read via port 0xeffe.

    Vypada to logicky az do chvile kdy zjistis, ze se ti ty bity mapuji takto

    KB_R3            equ $f7fe  ;BC=0xF7FE ->A=...54321
    KB_R4            equ $effe  ;BC=0xEFFE ->A=...67890

    Je to inverzne! Tak jsem to jen narychlo ohackoval ze prohazuji 5 bitu nez volam rutinu co resi druheho hrace.