Advertisement
Guest User

Untitled

a guest
Mar 10th, 2023
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Z80 Assembler 14.90 KB | Software | 0 0
  1. ; screenshot https://imgbox.com/tAUffQw9
  2.  
  3. SCREEN_ADR      equ $4000
  4. CHAR_ADR        equ $3c00
  5. ENTRY_POINT     equ $8000
  6. ATTR_T          equ $5C8F
  7.  
  8. ZX_EOL          equ 0x0D     ; zx_constant   end of line
  9.  
  10. ZX_INK          equ 0x10     ; zx_constant   colour
  11. ZX_PAPER        equ 0x11     ; zx_constant   colour
  12. ZX_FLASH        equ 0x12     ; zx_constant   0 or 1
  13. ZX_BRIGHT       equ 0x13     ; zx_constant   0 or 1
  14. ZX_INVERSE      equ 0x14     ; zx_constant
  15. ZX_OVER         equ 0x15     ; zx_constant   0 or 1=xor, 2=font_2, ... ,9=font_9
  16. ZX_AT           equ 0x16     ; zx_constant   Y,X
  17. ZX_TAB          equ 0x17     ; zx_constant   # spaces
  18.  
  19. ZX_BLUE              EQU %001     ; zx_constant
  20. ZX_YELLOW            EQU %110     ; zx_constant
  21.  
  22.  
  23. INIT_OVER       equ 0
  24.  
  25.          org ENTRY_POINT
  26.        
  27. ; Input: x = 0..31
  28. ;        y = 0..23
  29. ; Output:
  30. ;     ld de, 0x4000 + ((0x1F & y ) << 5) + ( 0x1F & x )
  31. LD_R_XY2addr MACRO _r, _x, _y
  32.     ld _r, 0x5800+((31&(_y))<<5)+(31&(_x))
  33. ENDM
  34.  
  35. start:
  36.     LD_R_XY2addr DE,15,12
  37.     ld   HL, TEXT           ; 3:10    adresa prvního znaku v řetězci
  38. ;    call print_string       ; 3:17    tisk celého řetězce
  39.  
  40. finish:
  41. ;    jr finish               ; 2:12    žádný návrat do systému
  42.  
  43.  
  44. print_string:
  45.     ld    A,(ATTR_T)        ; 3:13
  46.     ld    C, A              ; 1:4
  47. print_string_l:
  48.     ld    A, (HL)           ; 1:7     načíst kód znaku z řetězce
  49.     inc   HL                ; 1:6     přechod na další znak
  50.  
  51.     cp  0x20                ; 2:7
  52.     call nc, draw_char      ; 3:10/17
  53.     jr   nc, print_string_l ; 2:12    na další znak
  54.  
  55.     or    A                 ; 1:4     test na kód znak s kódem 0
  56.     ret   z                 ; 1:5/11  ukončit podprogram na konci řetězce
  57.    
  58.     call print_set          ; 3:17
  59.     jr   print_string_l     ; 2:12    na další znak    
  60.  
  61. ; Input: A = spec char
  62. print_set:    
  63.     sub  ZX_EOL             ; 2:7
  64.     ret   c                 ; 1:5/11
  65.     jr  nz, print_set_ink   ; 2:7/12
  66.    
  67.     ld    A, 0x1F           ; 2:7
  68.     or    E                 ; 1:4
  69.     ld    E, A              ; 1:4     nastaveni X na 31
  70.     inc  DE                 ; 1:6     prechod na dalsi radek
  71.     ret                     ; 1:10
  72. print_set_ink:
  73.     sub  ZX_INK-ZX_EOL      ; 2:7
  74.     jr   nz, print_set_paper; 2:7/12
  75.  
  76.     ld    A, C              ; 1:4
  77.     and 0xF8                ; 2:7  
  78.     or  (HL)                ; 1:7
  79.     inc  HL                 ; 1:6     přechod na další znak
  80.     ld    C, A              ; 1:4     save new ink
  81.    
  82.     ret                     ; 1:10
  83. print_set_paper:
  84.     dec   A                 ; 1:4
  85.     jr   nz, print_set_flash; 2:7/12
  86.  
  87.     ld    A,(HL)            ; 1:7
  88.     inc  HL                 ; 1:6     přechod na další znak
  89.     add   A, A              ; 1:4     2x
  90.     add   A, A              ; 1:4     4x
  91.     add   A, A              ; 1:4     8x
  92.     xor   C                 ; 1:4
  93.     and 0x38                ; 2:7
  94.     xor   C                 ; 1:4
  95.     ld    C, A              ; 1:4     save new paper
  96.    
  97.     ret                     ; 1:10
  98. print_set_flash:
  99.     dec   A                 ; 1:4
  100.     jr   nz, print_set_brig ; 2:7/12
  101.  
  102.     ld    A, C              ; 1:4
  103.     add   A, A              ; 1:4
  104.     or   (HL)               ; 1:7
  105.     inc  HL                 ; 1:6     přechod na další znak
  106.     rrca                    ; 1:4
  107.     ld    C, A              ; 1:4     save new flash
  108.  
  109.     ret                     ; 1:10
  110. print_set_brig:
  111.     dec   A                 ; 1:4
  112.     jr   nz, print_set_inv  ; 2:7/12
  113.  
  114.     ld    A,(HL)            ; 1:7
  115.     inc  HL                 ; 1:6     přechod na další znak
  116.     rrca                    ; 1:4
  117.     rrca                    ; 1:4
  118.     xor   C                 ; 1:4
  119.     and 0x40                ; 2:7
  120.     xor   C                 ; 1:7
  121.     ld    C, A              ; 1:4     save new bright
  122.  
  123.     ret                     ; 1:10
  124.    
  125. print_set_inv:
  126.     dec   A                 ; 1:4
  127.     jr   nz, print_set_over ; 2:7/12
  128.  
  129.     ld    A, C              ; 1:4     inverse
  130.     and  0x38               ; 2:7     A = 00pp p000
  131.     add   A, A              ; 1:4
  132.     add   A, A              ; 1:4     A = ppp0 0000
  133.     xor   C                 ; 1:4
  134.     and  0xF8               ; 2:7
  135.     xor   C                 ; 1:4     A = ppp0 0iii
  136.     rlca                    ; 1:4
  137.     rlca                    ; 1:4
  138.     rlca                    ; 1:4     A = 00ii ippp
  139.     xor   C                 ; 1:4
  140.     and  0x3F               ; 2:7
  141.     xor   C                 ; 1:4     A = fbii ippp
  142.     ld    C, A              ; 1:4
  143.  
  144.     ret                     ; 1:10
  145.  
  146. print_set_over:
  147.     dec   A                 ; 1:4
  148.     jr   nz, print_set_at   ; 2:7/12
  149.    
  150.     ld    A,(HL)            ; 1:7
  151.     add   A, A              ; 1:4
  152.     add   A,(HL)            ; 1:7     3x
  153.    
  154.     inc  HL                 ; 1:6     přechod na další znak
  155.     push HL                 ; 1:10
  156.     push DE                 ; 1:11
  157.    
  158.     add   A, MODIFY_DATA    ; 2:7
  159.     ld    L, A              ; 1:4
  160.     adc   A, high MODIFY_DATA; 2:7
  161.     sub   L                 ; 1:4
  162.     ld    H, A              ; 1:4
  163.  
  164.     ld    E,(HL)            ; 1:7
  165.     inc  HL                 ; 1:6
  166.     ld    D,(HL)            ; 1:7
  167.     inc  HL                 ; 1:6
  168.     ld    A,(HL)            ; 1:7
  169.     ld (modify),DE          ; 4:20
  170.     ld (modify+2),A         ; 3:13
  171.    
  172.     pop  DE                 ; 1:10
  173.     pop  HL                 ; 1:10
  174.     ret                     ; 1:10
  175.  
  176. print_set_at:
  177.     dec   A                 ; 1:4
  178.     jr   nz, print_set_tab  ; 2:7/12
  179.    
  180.     ld    A,(HL)            ; 1:7     new y
  181.     inc  HL                 ; 1:6     přechod na další znak
  182.     ld    D, 0x16           ; 2:7
  183.     add   A, A              ; 1:4
  184.     add   A, A              ; 1:4
  185.     add   A, A              ; 1:4
  186.     add   A, A              ; 1:4
  187.     rl    D                 ; 2:8
  188.     add   A, A              ; 1:4
  189.     rl    D                 ; 2:8
  190.     xor (HL)                ; 1:7     new x
  191.     inc  HL                 ; 1:6     přechod na další znak
  192.     ld    E, A              ; 1:4
  193.  
  194.     ret                     ; 1:10
  195.  
  196. print_set_tab:
  197.     dec   A                 ; 1:4
  198.     ret  nz                 ; 1:5/11
  199.  
  200.     ld    A, E              ; 1:4
  201.     xor (HL)                ; 1:7
  202.     and 0xE0                ; 2:7
  203.     xor (HL)                ; 1:7     new x mod 32
  204.     inc  HL                 ; 1:6     přechod na další znak
  205.     cp    E                 ; 1:4
  206.     ld    E, A              ; 1:4
  207.     ret  nc                 ; 1:5/11  (new x) mod 32 >= (old x+1)
  208.     add   A, 0x20           ; 2:7     old_y+1
  209.     ld    E, A              ; 1:7
  210.     ret  nc                 ; 1:5/11
  211.     inc   D                 ; 1:4
  212.     ret                     ; 1:10
  213.  
  214. ;  Input: A = char, DE = address, C = attr
  215. ; Output: DE = adress next char (overflow DE=0x5800)
  216. ; Poluttes: none
  217. draw_char:
  218.  
  219.     push AF                 ; 1:11    uschovat AF na zásobník
  220.     push BC                 ; 1:11    uschovat BC na zásobník
  221.     push HL                 ; 1:11    uschovat HL na zásobník
  222.  
  223.     ld    L, A              ; 1:4     kód znaku do L    
  224.     ld    A, C              ; 1:4
  225.     ld  (DE),A              ; 1:7     uložení atributu znaku
  226.  
  227.     ld    BC, CHAR_ADR      ; 3:10    adresa, od níž začínají masky znaků
  228.   if CHAR_ADR & 255
  229.       .warning Pouzivas adresu fontu nezarovnanou na segment, to neni nejlepsi napad.
  230.     ld    H, 0x00           ; 1:4     C je nenulové
  231.   else
  232.     ld    H, C              ; 1:4     C je nulové, protože CHAR_ADR=0x..00  
  233.   endif
  234.  
  235.     add  HL, HL             ; 1:11    2x
  236.     add  HL, HL             ; 1:11    4x
  237.     add  HL, HL             ; 1:11    8x
  238.     add  HL, BC             ; 1:11    přičíst bázovou adresu masek znaků
  239.  
  240.     ld    B, 8              ; 2:7     počitadlo zapsaných bajtů
  241.  
  242.     ld    C, D              ; 1:4     uschovat D
  243.     sla   D                 ; 2:8     2x
  244.     sla   D                 ; 2:8     4x
  245.     sla   D                 ; 2:8     8x
  246.     res   7, D              ; 2:8
  247. loop:
  248.     ld    A,(HL)            ; 1:7     načtení jednoho bajtu z masky
  249.  
  250. modify:
  251.   if INIT_OVER=0
  252.     nop
  253.     nop
  254.     nop
  255.   endif
  256.  
  257.   if INIT_OVER=1
  258.     ex  DE, HL              ; 1:4
  259.     xor (HL)                ; 1:7
  260.     ex  DE, HL              ; 1:4
  261.   endif
  262.  
  263.   if INIT_OVER=2
  264.     call font_2             ; 3:17
  265.   endif
  266.  
  267.   if INIT_OVER=3
  268.     call font_3             ; 3:17
  269.   endif
  270.  
  271.   if INIT_OVER=4
  272.     call font_4             ; 3:17
  273.   endif
  274.  
  275.   if INIT_OVER=5
  276.     call font_5             ; 3:17
  277.   endif
  278.  
  279.   if INIT_OVER=6
  280.     call font_6             ; 3:17
  281.   endif
  282.  
  283.   if INIT_OVER=7
  284.     call font_7             ; 3:17
  285.   endif
  286.  
  287.   if INIT_OVER=8
  288.     call font_8             ; 3:17
  289.   endif
  290.  
  291.   if INIT_OVER=9
  292.     call font_9             ; 3:17
  293.   endif
  294.  
  295.     ld  (DE),A              ; 1:7     zápis hodnoty na adresu (DE)
  296.    
  297.  
  298.    
  299.    
  300.     inc   L                 ; 1:4     posun na další bajt masky (nemusíme řešit přetečení do vyššího bajtu)
  301.     inc   D                 ; 1:4     posun na definici dalšího obrazového řádku
  302.     djnz loop               ; 2:8/13  vnitřní smyčka: blok s osmi zápisy
  303.     ld    D, C              ; 1:4     obnovit obsah D
  304.     inc  DE                 ; 1:6
  305.     pop  HL                 ; 1:10    obnovit obsah HL ze zásobníku
  306.     pop  BC                 ; 1:10    obnovit obsah BC ze zásobníku
  307.     pop  AF                 ; 1:10    obnovit obsah AF ze zásobníku
  308.     ret                     ; 1:10    DE+=1
  309.  
  310. font_2:                     ; leftside_bolt
  311.     add   A, A              ; 1:4
  312.     xor (HL)                ; 1:7
  313.     rra                     ; 1:4
  314.     and 0xF0                ; 2:7
  315.     and (HL)                ; 1:4
  316.     add   A, A              ; 1:4
  317.     or  (HL)                ; 1:7
  318.     ret                     ; 1:10
  319.  
  320. font_3:                     ; funny
  321.     and  0xC0               ; 2:7
  322.     rra                     ; 1:4
  323.     rra                     ; 1:4
  324.     or  (HL)                ; 1:7    
  325.     ret                     ; 1:10
  326.  
  327. font_4:                     ; funny_double_lowbit
  328.     dec   A                 ; 1:4
  329.     xor (HL)                ; 1:7
  330.     and (HL)                ; 1:7     jen nejnizsi jednickovy bit
  331.     rra                     ; 1:4
  332.     or  (HL)                ; 1:7    
  333.     ld  (DE),A              ; 1:7     zápis hodnoty na adresu (DE)
  334.     and 0xC0                ; 2:7
  335.     rra                     ; 1:4
  336.     rra                     ; 1:4
  337.     ex   DE, HL             ; 1:4
  338.     or  (HL)                ; 1:7
  339.     ex   DE, HL             ; 1:4    
  340.     ret                     ; 1:10
  341.  
  342. font_5:                     ; double_last_2_lowbit
  343.     dec   A                 ; 1:4
  344.     xor (HL)                ; 1:7
  345.     and (HL)                ; 1:7     jen nejnizsi jednickovy bit
  346.     xor (HL)                ; 1:7
  347.     dec   A                 ; 1:4
  348.     xor (HL)                ; 1:7
  349.     and (HL)                ; 1:7     jen nejnizsi jednickovy bit
  350.     rra                     ; 1:4
  351.     or  (HL)                ; 1:7    
  352.     ld  (DE),A              ; 1:7     zápis hodnoty na adresu (DE)
  353.     ex   DE, HL             ; 1:4
  354.     dec   A                 ; 1:4
  355.     xor (HL)                ; 1:7
  356.     and (HL)                ; 1:7     druhy nejnizsi jednickovy bit
  357.     rra                     ; 1:4
  358.     or  (HL)                ; 1:7    
  359.     ex   DE, HL             ; 1:4    
  360.     ret                     ; 1:10
  361.  
  362. font_6:                     ; double_lowbit
  363.     dec   A                 ; 1:4
  364.     xor (HL)                ; 1:7
  365.     and (HL)                ; 1:7     jen nejnizsi jednickovy bit
  366.     rra                     ; 1:4
  367.     or  (HL)                ; 1:7
  368.     ret                     ; 1:10
  369.  
  370. font_7:                     ; bolt
  371.     and 0xF0                ; 2:7
  372.     dec   A                 ; 1:4
  373.     xor (HL)                ; 1:7
  374.     and (HL)                ; 1:7     jen nejnizsi jednickovy bit
  375.     rra                     ; 1:4
  376.     or  (HL)                ; 1:7
  377.     ld  (DE),A              ; 1:7     zápis hodnoty na adresu (DE)
  378.    
  379.     ld    A,(HL)            ; 1:7     načtení jednoho bajtu z masky
  380.     dec   A                 ; 1:4
  381.     xor (HL)                ; 1:7
  382.     and (HL)                ; 1:7     jen nejnizsi jednickovy bit
  383.     rra                     ; 1:4
  384.     or  (HL)                ; 1:7
  385.    
  386.     ex   DE, HL             ; 1:4
  387.     or  (HL)                ; 1:7
  388.     ex   DE, HL             ; 1:4
  389.     ret                     ; 1:10
  390.  
  391. font_8:                     ; triple_bolt
  392.     rrca                    ; 1:4
  393.     rrca                    ; 1:4
  394.     xor (HL)                ; 1:7
  395.     rlca                    ; 1:4
  396.     or  (HL)                ; 1:4
  397.     ret                     ; 1:10
  398.  
  399. font_9:                     ; triple_bolt_with_space_right  ;
  400.     rrca                    ; 1:4
  401.     rrca                    ; 1:4
  402.     xor (HL)                ; 1:7
  403.     add   A, A              ; 1:4
  404.     or  (HL)                ; 1:7
  405.     ret                     ; 1:10
  406.  
  407.  
  408. MODIFY_DATA:
  409.    db 0x00, 0x00, 0x00
  410.     ex  DE, HL              ; 1:4
  411.     xor (HL)                ; 1:7
  412.     ex  DE, HL              ; 1:4
  413.    db 0xCD
  414.    dw font_2
  415.    db 0xCD
  416.    dw font_3
  417.    db 0xCD
  418.    dw font_4
  419.    db 0xCD
  420.    dw font_5
  421.    db 0xCD
  422.    dw font_6
  423.    db 0xCD
  424.    dw font_7
  425.    db 0xCD
  426.    dw font_8
  427.    db 0xCD
  428.    dw font_9
  429.  
  430. ; nulou ukončený řetězec
  431. TEXT:  
  432.     db ZX_OVER, 2, "Hello,",ZX_INVERSE, ZX_OVER, 8, " Speccy! ", ZX_INVERSE
  433.     db ZX_AT,0,0
  434.     db ZX_OVER, 2, ZX_PAPER, ZX_YELLOW
  435.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  436.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  437.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  438.     db ZX_OVER, 3, ZX_INK, ZX_BLUE
  439.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  440.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  441.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  442.     db ZX_OVER, 4
  443.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  444.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  445.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  446.     db ZX_OVER, 5
  447.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  448.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  449.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  450.     db ZX_OVER, 6, ZX_EOL
  451.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  452.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  453.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  454.     db ZX_OVER, 7
  455.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  456.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  457.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  458.     db ZX_OVER, 9
  459.     db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
  460.     db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
  461.     db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
  462.    
  463.     db ZX_OVER,0,"abc",ZX_TAB,5,"x",ZX_TAB,6,"y",ZX_TAB,38,"z"  
  464.     db ZX_AT,22,12,"AT(22,12) ",ZX_BRIGHT,1,"BRIGHT",ZX_BRIGHT,0
  465.     db ZX_AT,23,12,"AT(23,12) ",ZX_FLASH, 1,"FLASH", ZX_FLASH, 0,"end",0
  466.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement