Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; MEMCPY --
  2. ; Copy a block of memory from one location to another.
  3. ;
  4. ; Entry parameters
  5. ;       SRC: 14-bit address of source data block
  6. ;       DST: 14-bit address of target data block
  7. ;       CNT: 14-bit count of bytes to copy
  8.  
  9.             ORG     1700Q       ;Data at 001700q
  10. SRC         DFB     0           ;SRC, low byte
  11.             DFB     0           ;     high byte
  12. DST         DFB     0           ;DST, low byte
  13.             DFB     0           ;     high byte
  14. CNT         DFB     0           ;CNT, low byte
  15.             DFB     0           ;     high byte
  16.  
  17.             ORG     2000Q       ;Code at 002000q
  18. MEMCPY      LLI     CNT & 255   ;HL = addr(CNT)
  19.             LHI     CNT >> 8    ;(AND and SHR not supported)
  20.             LCM                 ;BC = CNT
  21.             INL
  22.             LBM
  23. LOOP        LAC                 ;If BC = 0,
  24.             ORB
  25.             RTZ                 ;Return
  26. DECCNT      LAC                 ;BC = BC - 1
  27.             SUI     1
  28.             LCA
  29.             LAB
  30.             SBI     0
  31.             LBA
  32. GETSRC      LLI     SRC & 255   ;HL = addr(SRC)
  33.             LHI     SRC >> 8
  34.             LAC                 ;HL = SRC + BC
  35.             ADM                 ;E = C + (HL)
  36.             LEA                 ;(lower sum)
  37.             INL                 ;point to upper SRC
  38.             LAB
  39.             ACM                 ;H = B + (HL) + CY
  40.             LHA                 ;(upper sum)
  41.             LLE                 ;L = E
  42.             LDM                 ;Load D from (HL)
  43. GETDST      LLI     DST & 255   ;HL = addr(DST)
  44.             LHI     DST >> 8
  45.             LAC                 ;HL = DST + BC
  46.             ADM                 ;ADD code same as above
  47.             LEA
  48.             INL
  49.             LAB
  50.             ACM
  51.             LHA
  52.             LLE
  53.             LMD                 ;Store D to (HL)
  54.             JMP     LOOP        ;Repeat the loop
  55.  
  56. ; The same with Z80-style syntax:
  57.  
  58.             Z80SYNTAX EXCLUSIVE
  59.  
  60.             ORG     2100Q
  61. MEMCPY2     LD      L,CNT & 255 ;HL = addr(CNT)
  62.             LD      H,CNT >> 8  ;(AND and SHR not supported)
  63.             LD      C,(HL)      ;BC = CNT
  64.             INC     L
  65.             LD      B,(HL)
  66. LOOP2       LD      A,C         ;If BC = 0,
  67.             OR      A,B
  68.             RET     Z           ;Return
  69. DECCNT2     LD      A,C         ;BC = BC - 1
  70.             SUB     A,1
  71.             LD      C,A
  72.             LD      A,B
  73.             SBC     A,0
  74.             LD      B,A
  75. GETSRC2     LD      L,SRC & 255 ;HL = addr(SRC)
  76.             LD      H,SRC >> 8
  77.             LD      A,C         ;HL = SRC + BC
  78.             ADD     A,(HL)      ;E = C + (HL)
  79.             LD      E,A         ;(lower sum)
  80.             INC     L           ;point to upper SRC
  81.             LD      A,B
  82.             ADC     A,(HL)      ;H = B + (HL) + CY
  83.             LD      H,A         ;(upper sum)
  84.             LD      L,E         ;L = E
  85.             LD      D,(HL)      ;Load D from (HL)
  86. GETDST2     LD      L,DST & 255 ;HL = addr(DST)
  87.             LD      H,DST >> 8
  88.             LD      A,C         ;HL = DST + BC
  89.             ADD     A,(HL)      ;ADD code same as above
  90.             LD      E,A
  91.             INC     L
  92.             LD      A,B
  93.             ADC     A,(HL)
  94.             LD      H,A
  95.             LD      L,E
  96.             LD      (HL),D      ;Store D to (HL)
  97.             JP      LOOP2       ;Repeat the loop
  98.             END
  99.