Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; screenshot https://imgbox.com/tAUffQw9
- SCREEN_ADR equ $4000
- CHAR_ADR equ $3c00
- ENTRY_POINT equ $8000
- ATTR_T equ $5C8F
- ZX_EOL equ 0x0D ; zx_constant end of line
- ZX_INK equ 0x10 ; zx_constant colour
- ZX_PAPER equ 0x11 ; zx_constant colour
- ZX_FLASH equ 0x12 ; zx_constant 0 or 1
- ZX_BRIGHT equ 0x13 ; zx_constant 0 or 1
- ZX_INVERSE equ 0x14 ; zx_constant
- ZX_OVER equ 0x15 ; zx_constant 0 or 1=xor, 2=font_2, ... ,9=font_9
- ZX_AT equ 0x16 ; zx_constant Y,X
- ZX_TAB equ 0x17 ; zx_constant # spaces
- ZX_BLUE EQU %001 ; zx_constant
- ZX_YELLOW EQU %110 ; zx_constant
- INIT_OVER equ 0
- org ENTRY_POINT
- ; Input: x = 0..31
- ; y = 0..23
- ; Output:
- ; ld de, 0x4000 + ((0x1F & y ) << 5) + ( 0x1F & x )
- LD_R_XY2addr MACRO _r, _x, _y
- ld _r, 0x5800+((31&(_y))<<5)+(31&(_x))
- ENDM
- start:
- LD_R_XY2addr DE,15,12
- ld HL, TEXT ; 3:10 adresa prvního znaku v řetězci
- ; call print_string ; 3:17 tisk celého řetězce
- finish:
- ; jr finish ; 2:12 žádný návrat do systému
- print_string:
- ld A,(ATTR_T) ; 3:13
- ld C, A ; 1:4
- print_string_l:
- ld A, (HL) ; 1:7 načíst kód znaku z řetězce
- inc HL ; 1:6 přechod na další znak
- cp 0x20 ; 2:7
- call nc, draw_char ; 3:10/17
- jr nc, print_string_l ; 2:12 na další znak
- or A ; 1:4 test na kód znak s kódem 0
- ret z ; 1:5/11 ukončit podprogram na konci řetězce
- call print_set ; 3:17
- jr print_string_l ; 2:12 na další znak
- ; Input: A = spec char
- print_set:
- sub ZX_EOL ; 2:7
- ret c ; 1:5/11
- jr nz, print_set_ink ; 2:7/12
- ld A, 0x1F ; 2:7
- or E ; 1:4
- ld E, A ; 1:4 nastaveni X na 31
- inc DE ; 1:6 prechod na dalsi radek
- ret ; 1:10
- print_set_ink:
- sub ZX_INK-ZX_EOL ; 2:7
- jr nz, print_set_paper; 2:7/12
- ld A, C ; 1:4
- and 0xF8 ; 2:7
- or (HL) ; 1:7
- inc HL ; 1:6 přechod na další znak
- ld C, A ; 1:4 save new ink
- ret ; 1:10
- print_set_paper:
- dec A ; 1:4
- jr nz, print_set_flash; 2:7/12
- ld A,(HL) ; 1:7
- inc HL ; 1:6 přechod na další znak
- add A, A ; 1:4 2x
- add A, A ; 1:4 4x
- add A, A ; 1:4 8x
- xor C ; 1:4
- and 0x38 ; 2:7
- xor C ; 1:4
- ld C, A ; 1:4 save new paper
- ret ; 1:10
- print_set_flash:
- dec A ; 1:4
- jr nz, print_set_brig ; 2:7/12
- ld A, C ; 1:4
- add A, A ; 1:4
- or (HL) ; 1:7
- inc HL ; 1:6 přechod na další znak
- rrca ; 1:4
- ld C, A ; 1:4 save new flash
- ret ; 1:10
- print_set_brig:
- dec A ; 1:4
- jr nz, print_set_inv ; 2:7/12
- ld A,(HL) ; 1:7
- inc HL ; 1:6 přechod na další znak
- rrca ; 1:4
- rrca ; 1:4
- xor C ; 1:4
- and 0x40 ; 2:7
- xor C ; 1:7
- ld C, A ; 1:4 save new bright
- ret ; 1:10
- print_set_inv:
- dec A ; 1:4
- jr nz, print_set_over ; 2:7/12
- ld A, C ; 1:4 inverse
- and 0x38 ; 2:7 A = 00pp p000
- add A, A ; 1:4
- add A, A ; 1:4 A = ppp0 0000
- xor C ; 1:4
- and 0xF8 ; 2:7
- xor C ; 1:4 A = ppp0 0iii
- rlca ; 1:4
- rlca ; 1:4
- rlca ; 1:4 A = 00ii ippp
- xor C ; 1:4
- and 0x3F ; 2:7
- xor C ; 1:4 A = fbii ippp
- ld C, A ; 1:4
- ret ; 1:10
- print_set_over:
- dec A ; 1:4
- jr nz, print_set_at ; 2:7/12
- ld A,(HL) ; 1:7
- add A, A ; 1:4
- add A,(HL) ; 1:7 3x
- inc HL ; 1:6 přechod na další znak
- push HL ; 1:10
- push DE ; 1:11
- add A, MODIFY_DATA ; 2:7
- ld L, A ; 1:4
- adc A, high MODIFY_DATA; 2:7
- sub L ; 1:4
- ld H, A ; 1:4
- ld E,(HL) ; 1:7
- inc HL ; 1:6
- ld D,(HL) ; 1:7
- inc HL ; 1:6
- ld A,(HL) ; 1:7
- ld (modify),DE ; 4:20
- ld (modify+2),A ; 3:13
- pop DE ; 1:10
- pop HL ; 1:10
- ret ; 1:10
- print_set_at:
- dec A ; 1:4
- jr nz, print_set_tab ; 2:7/12
- ld A,(HL) ; 1:7 new y
- inc HL ; 1:6 přechod na další znak
- ld D, 0x16 ; 2:7
- add A, A ; 1:4
- add A, A ; 1:4
- add A, A ; 1:4
- add A, A ; 1:4
- rl D ; 2:8
- add A, A ; 1:4
- rl D ; 2:8
- xor (HL) ; 1:7 new x
- inc HL ; 1:6 přechod na další znak
- ld E, A ; 1:4
- ret ; 1:10
- print_set_tab:
- dec A ; 1:4
- ret nz ; 1:5/11
- ld A, E ; 1:4
- xor (HL) ; 1:7
- and 0xE0 ; 2:7
- xor (HL) ; 1:7 new x mod 32
- inc HL ; 1:6 přechod na další znak
- cp E ; 1:4
- ld E, A ; 1:4
- ret nc ; 1:5/11 (new x) mod 32 >= (old x+1)
- add A, 0x20 ; 2:7 old_y+1
- ld E, A ; 1:7
- ret nc ; 1:5/11
- inc D ; 1:4
- ret ; 1:10
- ; Input: A = char, DE = address, C = attr
- ; Output: DE = adress next char (overflow DE=0x5800)
- ; Poluttes: none
- draw_char:
- push AF ; 1:11 uschovat AF na zásobník
- push BC ; 1:11 uschovat BC na zásobník
- push HL ; 1:11 uschovat HL na zásobník
- ld L, A ; 1:4 kód znaku do L
- ld A, C ; 1:4
- ld (DE),A ; 1:7 uložení atributu znaku
- ld BC, CHAR_ADR ; 3:10 adresa, od níž začínají masky znaků
- if CHAR_ADR & 255
- .warning Pouzivas adresu fontu nezarovnanou na segment, to neni nejlepsi napad.
- ld H, 0x00 ; 1:4 C je nenulové
- else
- ld H, C ; 1:4 C je nulové, protože CHAR_ADR=0x..00
- endif
- add HL, HL ; 1:11 2x
- add HL, HL ; 1:11 4x
- add HL, HL ; 1:11 8x
- add HL, BC ; 1:11 přičíst bázovou adresu masek znaků
- ld B, 8 ; 2:7 počitadlo zapsaných bajtů
- ld C, D ; 1:4 uschovat D
- sla D ; 2:8 2x
- sla D ; 2:8 4x
- sla D ; 2:8 8x
- res 7, D ; 2:8
- loop:
- ld A,(HL) ; 1:7 načtení jednoho bajtu z masky
- modify:
- if INIT_OVER=0
- nop
- nop
- nop
- endif
- if INIT_OVER=1
- ex DE, HL ; 1:4
- xor (HL) ; 1:7
- ex DE, HL ; 1:4
- endif
- if INIT_OVER=2
- call font_2 ; 3:17
- endif
- if INIT_OVER=3
- call font_3 ; 3:17
- endif
- if INIT_OVER=4
- call font_4 ; 3:17
- endif
- if INIT_OVER=5
- call font_5 ; 3:17
- endif
- if INIT_OVER=6
- call font_6 ; 3:17
- endif
- if INIT_OVER=7
- call font_7 ; 3:17
- endif
- if INIT_OVER=8
- call font_8 ; 3:17
- endif
- if INIT_OVER=9
- call font_9 ; 3:17
- endif
- ld (DE),A ; 1:7 zápis hodnoty na adresu (DE)
- inc L ; 1:4 posun na další bajt masky (nemusíme řešit přetečení do vyššího bajtu)
- inc D ; 1:4 posun na definici dalšího obrazového řádku
- djnz loop ; 2:8/13 vnitřní smyčka: blok s osmi zápisy
- ld D, C ; 1:4 obnovit obsah D
- inc DE ; 1:6
- pop HL ; 1:10 obnovit obsah HL ze zásobníku
- pop BC ; 1:10 obnovit obsah BC ze zásobníku
- pop AF ; 1:10 obnovit obsah AF ze zásobníku
- ret ; 1:10 DE+=1
- font_2: ; leftside_bolt
- add A, A ; 1:4
- xor (HL) ; 1:7
- rra ; 1:4
- and 0xF0 ; 2:7
- and (HL) ; 1:4
- add A, A ; 1:4
- or (HL) ; 1:7
- ret ; 1:10
- font_3: ; funny
- and 0xC0 ; 2:7
- rra ; 1:4
- rra ; 1:4
- or (HL) ; 1:7
- ret ; 1:10
- font_4: ; funny_double_lowbit
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 jen nejnizsi jednickovy bit
- rra ; 1:4
- or (HL) ; 1:7
- ld (DE),A ; 1:7 zápis hodnoty na adresu (DE)
- and 0xC0 ; 2:7
- rra ; 1:4
- rra ; 1:4
- ex DE, HL ; 1:4
- or (HL) ; 1:7
- ex DE, HL ; 1:4
- ret ; 1:10
- font_5: ; double_last_2_lowbit
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 jen nejnizsi jednickovy bit
- xor (HL) ; 1:7
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 jen nejnizsi jednickovy bit
- rra ; 1:4
- or (HL) ; 1:7
- ld (DE),A ; 1:7 zápis hodnoty na adresu (DE)
- ex DE, HL ; 1:4
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 druhy nejnizsi jednickovy bit
- rra ; 1:4
- or (HL) ; 1:7
- ex DE, HL ; 1:4
- ret ; 1:10
- font_6: ; double_lowbit
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 jen nejnizsi jednickovy bit
- rra ; 1:4
- or (HL) ; 1:7
- ret ; 1:10
- font_7: ; bolt
- and 0xF0 ; 2:7
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 jen nejnizsi jednickovy bit
- rra ; 1:4
- or (HL) ; 1:7
- ld (DE),A ; 1:7 zápis hodnoty na adresu (DE)
- ld A,(HL) ; 1:7 načtení jednoho bajtu z masky
- dec A ; 1:4
- xor (HL) ; 1:7
- and (HL) ; 1:7 jen nejnizsi jednickovy bit
- rra ; 1:4
- or (HL) ; 1:7
- ex DE, HL ; 1:4
- or (HL) ; 1:7
- ex DE, HL ; 1:4
- ret ; 1:10
- font_8: ; triple_bolt
- rrca ; 1:4
- rrca ; 1:4
- xor (HL) ; 1:7
- rlca ; 1:4
- or (HL) ; 1:4
- ret ; 1:10
- font_9: ; triple_bolt_with_space_right ;
- rrca ; 1:4
- rrca ; 1:4
- xor (HL) ; 1:7
- add A, A ; 1:4
- or (HL) ; 1:7
- ret ; 1:10
- MODIFY_DATA:
- db 0x00, 0x00, 0x00
- ex DE, HL ; 1:4
- xor (HL) ; 1:7
- ex DE, HL ; 1:4
- db 0xCD
- dw font_2
- db 0xCD
- dw font_3
- db 0xCD
- dw font_4
- db 0xCD
- dw font_5
- db 0xCD
- dw font_6
- db 0xCD
- dw font_7
- db 0xCD
- dw font_8
- db 0xCD
- dw font_9
- ; nulou ukončený řetězec
- TEXT:
- db ZX_OVER, 2, "Hello,",ZX_INVERSE, ZX_OVER, 8, " Speccy! ", ZX_INVERSE
- db ZX_AT,0,0
- db ZX_OVER, 2, ZX_PAPER, ZX_YELLOW
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER, 3, ZX_INK, ZX_BLUE
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER, 4
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER, 5
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER, 6, ZX_EOL
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER, 7
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER, 9
- db " !",0x22,"#$%&'()*+,-./0123456789:;<=>?"
- db "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[",0x5C,"]^_"
- db "`abcdefghijklmnopqrstuvwxyz{|}~",0x7F
- db ZX_OVER,0,"abc",ZX_TAB,5,"x",ZX_TAB,6,"y",ZX_TAB,38,"z"
- db ZX_AT,22,12,"AT(22,12) ",ZX_BRIGHT,1,"BRIGHT",ZX_BRIGHT,0
- db ZX_AT,23,12,"AT(23,12) ",ZX_FLASH, 1,"FLASH", ZX_FLASH, 0,"end",0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement