Advertisement
vito-Z80

Vertical Scroll 16x16 with STACK (Z80)

Feb 27th, 2020
1,338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     В 16-битные регисты записывается содержимое экрана (слева направо)
  3.     со строки ниже той на которую содержимое регистров будет возвращено (справа налево).
  4.         Используем 8 16-битных регистров перенося 16 символов экрана
  5.  
  6.     Ускорить можно за счет избавления от цикла в halfHoriz и подставлении
  7.     значений в стек. То-есть firstTblAddr нужно размножить на кол-во
  8.     сдвигаемых строк с генерацией адресов стека для каждого размноженного блока.
  9.         (избавимся от таблицы, но займем памяти больше на firstTblAddr * (lineCount - 1) )
  10. */
  11.     module vScrollStack
  12. lineCount:  equ 128     //  max 128 line addresses for two tables (visual 129 lines)
  13. tableSize:      equ lineCount * 2
  14.     align 256
  15. tables: //  two tables screen addresses
  16.     block tableSize * 2
  17. saveSP: dw #0000
  18. //------------------------------
  19. run:
  20.  
  21.     xor a
  22.     out (254),a
  23.     call build
  24. repeat:
  25.     ei
  26.     halt
  27.     call textPrint
  28.     call halfHoriz
  29.     jr repeat
  30. //------------------------------
  31. /*
  32.     create 2 table
  33.     first   |   x = 0; y = 1    |  
  34.     second  |   x = 16;y = 0    |  
  35. */
  36. build:
  37.     //  second table addresses
  38.     ld de,#4010
  39.     ld ix,tables+tableSize
  40.     ld b,lineCount
  41. 1:
  42.     ld (ix),e
  43.     ld (ix+1),d
  44.     inc ixl
  45.     inc ixl
  46.     call down_de
  47.     djnz 1B
  48.     //  first table addresses
  49.     ld de,#4100
  50.     ld ix,tables
  51.     ld b,lineCount
  52. 2:
  53.     ld (ix),e
  54.     ld (ix+1),d
  55.     inc ixl
  56.     inc ixl
  57.     call down_de
  58.     djnz 2B
  59.     ret
  60. //------------------------------
  61. down_de:   
  62.     inc d
  63.         ld  a,d
  64.         and 7
  65.         jr  nz,$+12
  66.         ld  a,e
  67.         add a,32
  68.         ld  e,a
  69.         jr  c,$+6
  70.         ld  a,d
  71.         sub 8
  72.         ld  d,a
  73.         ret
  74. //-------------------------------
  75. halfHoriz:
  76.     ld (saveSP),sp
  77.     ld iyl,lineCount
  78.     ld ix,tables
  79. hh:
  80.     ld l,(ix)
  81.     ld h,(ix+1)
  82.     ld (firstTblAddr+1),hl
  83.     inc ixh
  84.     ld l,(ix)
  85.     ld h,(ix+1)
  86.     ld (secondTblAddr+1),hl
  87.     dec ixh
  88.     inc ixl
  89.     inc ixl
  90.  
  91. firstTblAddr:
  92.     ld sp,0
  93.  
  94.     //  load bottom line into 8 16-bit registers (16 symbols (half screen on horizontal))
  95.     pop hl
  96.     pop de
  97.     pop bc
  98.     exx
  99.     pop hl
  100.     pop de
  101.     pop bc
  102.  
  103.     pop af
  104.     ex af,af
  105.     pop af
  106. secondTblAddr:
  107.     ld sp,0
  108.  
  109.     //  keep the top line in reverse
  110.     push af
  111.     ex af,af
  112.     push af
  113.  
  114.     push bc
  115.     push de
  116.     push hl
  117.     exx
  118.     push bc
  119.     push de
  120.     push hl
  121.  
  122.     dec iyl
  123.     jp nz,hh
  124.     ld sp,(saveSP)
  125.     ret
  126. //------------------------------
  127. restartPause:   db 0
  128. fontLine:   db 0
  129. textPrint:
  130.     ld hl,text
  131.     ld a,(fontLine)
  132.     ex af,af
  133.     ld de,(run-260)
  134.     ld b,16
  135. plt:
  136.     push bc
  137.     push hl
  138.     ld a,(hl)
  139.     or a
  140.     jr z,waitRestart
  141.     call font
  142.     ld b,0
  143.     ex af,af
  144.     ld c,a
  145.     ex af,af
  146.     add hl,bc
  147.     ld a,(showType)
  148.     or a
  149.     jp nz,bold
  150.     ld a,(hl)
  151.     jr endPrtS
  152. bold:
  153.  
  154.     ld a,(hl)
  155.     ld c,a
  156.     rrca
  157.     or c
  158. endPrtS:
  159.     ld (de),a
  160.     inc e
  161.     pop hl
  162.     inc hl
  163.     pop bc
  164.     djnz plt
  165.     ld a,(showType)
  166.     cp 2
  167.     jr nz,std
  168. dHeightBit
  169.     ld a,0
  170.     xor 1
  171.     ld (dHeightBit+1),a
  172.     or a
  173.     ret z
  174. std:
  175.     ex af,af
  176.     inc a
  177.     cp 8
  178.     jr c,cont
  179.     ld hl,(textPrint+1)
  180.     ld bc,16
  181.     add hl,bc
  182.     ld (textPrint+1),hl
  183.     xor a
  184. cont:
  185.     ld (fontLine),a
  186.     ret
  187. //------------------------------
  188. waitRestart:
  189.     pop af
  190.     pop af
  191.     xor a
  192.     dup 16
  193.     ld (de),a
  194.     inc e
  195.     edup
  196.     ld a,(restartPause)
  197.     dec a
  198.     ld (restartPause),a
  199.     ret nz
  200.     ld hl,text
  201.     ld (textPrint+1),hl
  202.     ret
  203. //------------------------------
  204. font:
  205.         ; calc address of char in font
  206.         ld l,a,h,0      ; a=char
  207.         add hl,hl,hl,hl,hl,hl
  208.         ld bc,15616-256
  209.         add hl,bc       ; hl=address in font
  210.         ret
  211. //------------------------------
  212. //------------------------------
  213. text:
  214.     dm  "      Hello     "
  215.     dm  "  Hello  WORLD  "
  216.     dm  " any text show  "
  217.     dm  "again,again....."
  218.     db  #0
  219. //------------------------------
  220. showType: db 2
  221. /*
  222.     0 - standart
  223.     1 - bold
  224.     2 - double height + bold
  225. */
  226.     endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement