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 00:02
       
      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 08:02 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 10:02
       
      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 11:02 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 12:02
       
      Mono, sprobuj tym programem skopiowac 10 bajtow.
      • 6: CommentAuthor8bit
      • CommentTime11 Feb 2014 12:02 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 13:02
       
      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 13:02
       
      xxl - sprawdziłem jeszcze raz , masz rację
      • 9: CommentAuthormono
      • CommentTime11 Feb 2014 15:02
       
      @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
      • 10:
         
        CommentAuthorKaz
      • CommentTime23 Dec 2024 00:12 (4 dni temu) zmieniony
       
      Dla chętnych pomocna będzie też książka "Mikroprocesor Z80" Jerzego Karczmarczuka, dostałem w prezencie reedycję to się pochwalę. Dodatki: wywiad z autorem wykonany przez Jacka Trojańskiego (ostatniego rednacza Bajtka, na naszym kanale YT jest z nim wywiad), nieudokumentowane rozkazy, itd. Oryginalna książka miała notkę w Bajtku.