Color Wars

 


Увидел на сайте похожую демку, решил адаптировать. Первая версия использовала 320х200, размер 256 байт, поэтому я решил вернуться к textmode 80x25. Вышло 128 байт:

org 100h
use16
mov ax,1112h
int 10h
push 0B800h
pop es
inc bh
;fill
xor di,di
fllp:
call rnd
and ah, 01110000b
mov al,32;;$DB;32
stosw
cmp di,80*25*4
jne fllp
; ret
;CX=Y.X
cmlp:
; mov dx, 3DAh
;wr:
; in al, dx ; Video status bits:
; and al, 8
; jz short wr
; mov cx,0A28h
mov dl,79-1
call rand
mov cl,al
mov dl,49
call rand
; mov ch,al
xor ah,ah;movzx ax,ch
xor dx,dx
imul ax,160
xor ch,ch
add cx,cx
add ax,cx
mov si,ax
mov ax,[es:si]
mov [es:si-2],ax
mov [es:si+2],ax
mov [es:si-160],ax
mov [es:si+160],ax
mov ch,20
z: loop z
in al,60h
dec al
jne cmlp
;ret
;http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html
;xrnd:
;  ld hl,1 ; seed must not be 0
rnd: ;BX=hl
;  ld a,h
mov al,bh
;  rra
rcr al,1
;  ld a,l
mov al,bl
;  rra Cy->A->Cy rcr
rcr al,1
;  xor h
xor bh,al;;xor al,bh
;  ld h,a
;; mov bh,al
;  ld a,l
mov al,bl
;  rra
rcr al,1
;  ld a,h
mov al,bh
;  rra
rcr al,1
;  xor l
xor al,bl
;  ld l,a
mov bl,al
;  xor h
xor al,bh
;  ld h,a
mov bh,al
mov ax,bx
ret
rand: ;DL=max
call rnd
ra1:
sub al,dl
jnc ra1
add al,dl
inc al
ret
JinX сказал, что лучше сделать 64 байта. Я с неохотой взялся за подобный код и кое-как сделал минимальный размер:

org 100h
use16

mov ax,1112h
int 10h
les ax,[si-3]

fl:
and ax,$7F20
stosw
stosw
add ax,bp
dec bp
jne fl

cmlp:
cwd;xor dh,dh
    imul ax,-7
    inc ax
push ax
and ah,$0F

add ax,ax
mov di,ax
mov cx,[es:di+160]
mov [es:di-2+160],cx
mov [es:di+2+160],cx
mov [es:di],cx
mov [es:di+160+160],cx

; mov ch,20
z: loop z
in al,60h
dec al
pop ax
jne cmlp
ret

JinX внес поправки, получилось что обращение к сегменту ES дает лишний байт.Вот его вариант:
org 100h
use16

mov ax,1112h
int 10h
mov dx,$B800
mov es,dx
fl:
and ax,$7F20
stosw
stosw
add ax,bp
dec bp
jne fl

mov bl,160
push es
pop ds

cmlp:
imul dx,-7
inc dx
; in al,40h
add ax,dx
and ah,$0F

add ax,ax
mov di,ax
mov ax,[di+bx]
mov [di-2+bx],ax
mov [di+2+bx],ax
mov [di],ax
mov [di+160+bx],ax

mov ch,20
z: loop z
in al,60h
dec al
jne cmlp
ret

Короче, sizecoding целая наука. На pouet.net HellMood предложил укороченный вариант:

org 100h
use16
lds ax,[si]
fl:
inc di
scasw ; DS -> 0xAF..
mov [di],di
jnz fl
cmlp:

    imul si,byte -7
lodsw
mov al,32
mov [si],ax
mov [si-4],ax
mov [si+156],ax
mov [si-164],ax
jmp short cmlp






Комментарии