Просто генерация символов

 

Пришла в голову простая задача, и вышло два решения:

58 байт

device zxspectrum128
        ORG #6000
begin
mask equ $8000
; generate
ld hl,mask
ld bc,$400; B for empty,C for filled
ld de,0; D - empty,E for fill
gsq:
ld a,b
call putd
; now square
inc c
dec c
jr z,nosq
ld a,c
pud1:
ld (hl),e
inc hl
dec a
jr nz,pud1
nosq:
ld a,b
call putd
; for sq
ld a,e
and $F0
add a,a
or 16
xor e
and $F0
xor e
ld e,a
;2
ld a,e
and $0F
srl a
or 8
xor e
and $0F
xor e
ld e,a
dec b
inc c,c
ld a,c
cp 10
jr nz,gsq
gend
;draw
ld hl,$4000
ld de,mask
ld c,10
drwlp:
push hl
ld b,8
drwlp1:
ld a,(de),(hl),a
inc de,h
djnz drwlp1
pop hl
inc l
dec c
jr nz,drwlp
jr $
putd:
or a
ret z
push bc
ld b,a
pulp:
ld (hl),d
inc hl
djnz pulp
pop bc
ret
end
display /d,gend-begin
savesna "gensqm1.sna",begin

Можно и остаться на этом коде, но есть другое решение, дающее 53 байт.


device zxspectrum128
        ORG #6000
begin
mask equ $8000
; generate
ld hl,mask
ld bc,$0404;B - edge for up,C - edge for down
ld e,0
; jr $
gsq:
; ld d,0
ld a,l
and 7
;up?
cp b
jr c,put
ld d,e
cp c
jr c,put
ld d,0
put:
ld (hl),d
inc l
ld a,l
and 7
jr nz,gsq
; for sq
ld a,e
and $F0
add a,a
; or 16
xor e
and $F0
xor e
ld e,a
;2
ld a,e
and $0F;$1F
srl a
; or 8
xor e
and $0F
xor e
or $18
ld e,a
inc c
dec b
jp p,gsq
gend
;draw
ld hl,$4000
ld de,mask
ld c,10
drwlp:
push hl
ld b,8
drwlp1:
ld a,(de),(hl),a
inc de,h
djnz drwlp1
pop hl
inc l
dec c
jr nz,drwlp
jr $
end
display /d,gend-begin
savesna "gensqm2.sna",begin

Исходники.

Комментарии