atarionline.pl z80-6502 - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthormuffy
    • CommentTime11 Feb 2014
     
    Może godzina już nie ta albo zbyt zmęczony umysł mam.
    Pytanie do znających procesory Z-80:
    Czy rozkaz LDIR możemy przetłumaczyć na
    LDIR	
    pha
    lda #0
    sta temp
    LDIR_loop
    mwx HL_reg DE_reg
    inw DE_reg
    inw HL_reg
    dew BC_reg
    cpw temp BC_reg
    beq LDIR_loop
    pla
    rts

    Adresy pomocnicze B,C,itd na str. zerowej, proszę nie zwracać uwagi na tymczasowy "temp" oraz inne działanie dla BC=0 dla kodu 6502
    Czy jestem blisko czy lepiej iść na piwo i wrócić do tego w wakacje?
    • 2: CommentAuthor8bit
    • CommentTime11 Feb 2014 zmieniony
     
    na końcu powinno być chyba coś takiego
    dew BCreg ;IF BC=-1 THEN end
    cmp BCreg_low,#FF
    bne LDIRloop
    cmp BCreg_high,#FF
    bne LDIRloop
    pla
    rts
    • 3: CommentAuthorxxl
    • CommentTime11 Feb 2014
     
    moze cos takiego:

    LDIR ldx B_reg
    beq B0

    ldy #$00
    @ lda (HL_reg),y
    sta (DE_reg),y
    iny
    bne @-
    inc H_reg
    inc D_reg
    dex
    bne @-

    B0 ldx C_reg
    beq LDIR_end

    ldy #$00
    @ lda (HL_reg),y
    sta (DE_reg),y
    iny
    dex
    bne @-
    LDIR_cd
    tya
    clc
    adc L_reg
    sta L_reg
    bcc @+
    inc H_reg
    @ tya
    clc
    adc E_reg
    sta E_reg
    bcc @+
    inc D_reg
    @ stx B_reg
    stx C_reg
    LDIR_end rts


    jesli nie zalezy Ci na prawidlowych wartosciach rejestrow HL,DE,BC po wyjsciu z procki to mozesz pominac wszystko od etykiety LDIR_cd do RTS

    nie jest to wersja optymalna i nawet nie wiem czy dziala :D nie testowane.
    • 4: CommentAuthormono
    • CommentTime11 Feb 2014 zmieniony
     
    Jeśli ci nie zależy na wartości rejestrow po wyjściu to:
    .zpvar bc .word
    .zpvar de .word
    .zpvar hl .word

    lda bc+1
    eor #$ff
    tax
    lda bc
    eor #$ff
    tay
    sec
    adc hl
    sta hl
    scs
    dec hl+1
    tya
    sec
    adc de
    sta de
    scs
    dec de+1
    iny
    bne *+3
    inx
    ?loop:
    lda (hl),y
    sta (de),y
    iny
    bne ?loop
    inc hl+1
    inc de+1
    inx
    bne ?loop

    a jeśli ci zależy to na końcu dodaj:
    clc
    lda bc
    adc hl
    sta hl
    scc
    inc hl+1
    clc
    lda bc
    adc de
    sta de
    scc
    inc de+1
    sty bc
    stx bc+1

    lub wolniej, ale prościej i krócej:
    ldx #0
    ?loop:
    lda (hl,x)
    sta (de,x)
    inc hl
    sne
    inc hl+1
    inc de
    sne
    inc de+1
    lda bc
    sne
    dec bc+1
    dec bc
    lda bc
    ora bc+1
    bne ?loop
    • 5: CommentAuthorxxl
    • CommentTime11 Feb 2014
     
    Mono, sprobuj tym programem skopiowac 10 bajtow.
    • 6: CommentAuthor8bit
    • CommentTime11 Feb 2014 zmieniony
     
    dec bc
    lda bc
    ora bc+1
    bne ?loop


    Dowcip polega na tym że Z80 powtarza puki BC <>-1 (FFFF)
    ,a nie BC=0
    więc musi być jak napisałem wyżej ;)
    • 7: CommentAuthorxxl
    • CommentTime11 Feb 2014
     
    dokumentacja mowi cos zupelnie innego. prosty przyklad:
    do BC wpisz 1. skopiowany zostanie 1 bajt. przerywa gdy BC=0. wpisz do BC 0, skopiowanych zostanie 64kb danych.
    • 8: CommentAuthor8bit
    • CommentTime11 Feb 2014
     
    xxl - sprawdziłem jeszcze raz , masz rację
    • 9: CommentAuthormono
    • CommentTime11 Feb 2014
     
    @xxl: Fakt, nie miałem czasu sprawdzić - poprawna procedura:
    .zpvar bc .word
    .zpvar de .word
    .zpvar hl .word

    ldir:
    sec
    lda #0
    sbc bc
    tay
    lda #0
    sbc bc+1
    tax
    tya
    beq ?loop
    clc
    lda bc
    adc hl
    sta hl
    scs
    dec hl+1
    tya
    clc
    lda bc
    adc de
    sta de
    scs
    dec de+1
    ?loop:
    lda (hl),y
    sta (de),y
    iny
    bne ?loop
    inc hl+1
    inc de+1
    inx
    bne ?loop
    sty bc
    stx bc+1
    rts