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.
  • 25. 5. 2023 22:29

    xbastaj

    Děkuju za další lekci. Zkouším si to psát po svém, neřeším tolik jestli ušetřím pár byte, ale preferuju abych to měl přehledný. Mám rád když je oddělený testování klavesnice od akcí, kterou má stisk klávesy vyvolat, takže jsem použil podobně jako minule (děkuji ".DW" za připomínky a rady, už jsem si opravil chyby co jsem tam měl) podprogramy "vpravo", "vlevo", "nahoru", "dolu".
    Chtěl jsem tam taky mít dorazy na kraje obrazovky. První co mne napadlo mít v DE souřadnice Y,X a před každou změnou atributu vypočítat adresu atributu do HL.

    att_adr:                        ;vypocet adresy atributu 32*D+E
            push bc
            ld h,0
            ld l,d                  ;Y
            add hl,hl               ;Y*2
            add hl,hl               ;Y*4
            add hl,hl               ;Y*8
            add hl,hl               ;Y*16
            add hl,hl               ;Y*32
            ld bc, ATTRIBUTE_ADR
            add hl,bc               ;ADR+32*Y
            ld b,0
            ld c,e                  ;X
            add hl,bc               ;ADR+32*Y+X
            pop bc
            ret

    Funguje to, nevím jestli by to šlo napsat elegantněji (na nic lepšího jsem zatím nepřišel), ale přijde mi to dost brutální dělat po každé takovýhle výpočet.
    Druhý nápad byl tedy, že budu při pohybu současně přičítat/odčítat 1 v D/E a zároveň modifikovat HL (trik s přičítáním -32 mne napadl taky hned - na atmelu zas chybí instrukce pro přičtení konstanty, tak se musí odečítat záporná hodnota). Je to sice kratší, ale zas se mi moc nelíbí, že musím současně aktualizovat dvoje souřadnice.
    Verze pro Sinclair / Interface 2:

    ENTRY_POINT      equ $8000
    ROM_OPEN_CHANNEL equ $1601
    ATTRIBUTE_ADR    equ $5800
    ROM_CLS          equ $0DAF
    
    
    X0               equ 15
    Y0               equ 10
    XMIN             equ 0
    XMAX             equ 31
    YMIN             equ 0
    YMAX             equ 23
    
    KB_R0            equ $fe
    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
    Color1           equ $48
    Color2           equ $50
    
    INIPOS           equ ATTRIBUTE_ADR+32*Y0+X0
    ;-------------------------------------------------------------------------------
    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
    
    ;-------------------------------------------------------------------------------
    
            org ENTRY_POINT
    
    start:  call ROM_CLS
    
            ld d,Y0
            ld e,X0
            ld hl,INIPOS
            CH_ATTR Color1
    
    ;-------------------------------------------------------------------------------
    main:   call delay
    
            KEYB KB_R3
    
            rra                ;1
            call nc,vlevo
            rra                ;2
            call nc,dolu
            rra                ;3
            call nc,nahoru
            rra                ;4
            call nc,vpravo
            rra                ;5
            call nc,palba
            call c,klid
            jp main
    
    ;-------------------------------------------------------------------------------
    vpravo: push AF
            CH_ATTR Color0
            ld a,e
            cp XMAX
            jr Z,vp0
            inc e
            inc hl
    vp0:    CH_ATTR Color1
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    vlevo:  push AF
            CH_ATTR Color0
            ld a,e
            cp XMIN
            jr Z,vl0
            dec e
            dec hl
    vl0:    CH_ATTR Color1
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    dolu:   push AF
            CH_ATTR Color0
            ld a,d
            cp YMAX
            jr Z,do0
            inc d
            ld bc,32
            add hl,bc
    do0:    CH_ATTR Color1
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    nahoru: push AF
            CH_ATTR Color0
            ld a,d
            cp YMIN
            jr Z,na0
            dec d
            ld bc,-32
            add hl,bc
    na0:    CH_ATTR Color1
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    palba:  push AF
            CH_ATTR Color2
            pop AF
            ret
    
    ;-------------------------------------------------------------------------------
    klid:   push AF
            CH_ATTR Color1
            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
    
    end ENTRY_POINT