DEVICE ZXSPECTRUM128
include "../../_sdk/sys_h.asm"
STACK=0x4000
MAXVERTICES=256
MAXEDGES=512;256
scrbase=0x8000
scrwid=320
scrhgt=200
COLORS_UNCROSSED=%11100100;%11001001
COLORS_CROSSED=%11010010
org PROGSTART
begin
ld sp,STACK
ld e,0
OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
OS_GETSCREENPAGES
;de=ёЄЁрэшЎ√ 0-ую ¤ъЁрэр (d=ёЄрЁ°р ), hl=ёЄЁрэшЎ√ 1-ую ¤ъЁрэр (h=ёЄрЁ°р )
ld a,e
SETPG32KLOW
ld a,d
SETPG32KHIGH
ld a,r
ld (rndseed1),a
OS_GETTIMER ;hlde=timer
ld (rndseed2),de
ld (oldupdtimer),de
ld de,filename
OS_OPENHANDLE
;jr $
;ld a,-1
or a
jr nz,noloadini
push bc
ld de,SAVEDATA
ld hl,SAVEDATAsz
OS_READHANDLE
pop bc
OS_CLOSEHANDLE
jr loadiniq
noloadini
;ld a,12
xor a
ld (level),a
call countverticesneeded
;jr $
call genmesh
loadiniq
call redraw
jr mouseloop_go
mouseloop
;1. тё╕ т√тюфшь
;2. цф╕ь ёюс√Єшх
;[3. тё╕ ёЄшЁрхь]
;4. юсЁрсрЄ√трхь ёюс√Єшх (схч яхЁхЁшёютъш)
;5. тё╕ ёЄшЁрхь
ld a,(clickstate)
or a
jr z,mouseloop_nomove
call drawcurvertex
;call drawconnectedvertices
call drawcuredges
;call ahl_coords
call movecurvertex
call drawcuredges
;call drawconnectedvertices
call drawcurvertex
call ahl_coords
cp 8
jr nc,$+2+2+3
ld a,1
ld (invalidatetime),a
mouseloop_nomove
call redrawifneeded ;TODO єсЁрЄ№?
;TODO яЁютхЁшЄ№, хёЄ№ ыш Їюъєё! хёыш эхЄє, Єю эх т√ч√трЄ№ prlevelifneeded
call prlevelifneeded
mouseloop_go
;ёхщўрё тё╕ т√тхфхэю, ъЁюьх ёЄЁхыъш
call ahl_coords
call shapes_memorizearr
call ahl_coords
call shapes_prarr8c
;call waitsomething ;т ¤Єю тЁхь ёЄЁхыър тшфэр
mainloop_nothing0
call updatetime
;т ¤Єю тЁхь ёЄЁхыър тшфэр
YIELD ;halt
call control
jr nz,mainloop_something
ld a,(invalidatetime)
or a
jr z,mainloop_nothing0
mainloop_something
;ўЄю-Єю шчьхэшыюё№
call ahl_oldcoords
call shapes_rearr
;ёхщўрё тё╕ т√тхфхэю, ъЁюьх ёЄЁхыъш
key=$+1
ld a,0
cp key_esc
call z,quitifnoclickstate
cp key_redraw
call z,redraw
;call control_keys
clickstate=$+1
ld a,0
or a
jr nz,mouseloop_wasclicked
ld a,(mousebuttons)
cpl
and 7
call nz,mouse_fire
jr mouseloop
mouseloop_wasclicked
ld a,(mousebuttons)
cpl
and 7
call z,mouse_unfire
jp mouseloop
mouse_unfire
ld a,1
ld (doredraw),a
xor a
ld (clickstate),a
;юсэютшЄ№ ёў╕Єўшъ crossededges ъюэъЁхЄэю яю Ё╕сЁрь, ъюЄюЁ√х яхЁхёхърышё№ т эрўрых ш т ъюэЎх фтшцхэш
;фы ¤Єюую фы ёЄрЁющ яючшЎшш тхЁ°шэ√ фы ърцфюую шч ёт чрээ√ї Ё╕схЁ фхъЁхьхэЄшЁєхь тёх яхЁхёхўхэш (є эхую ш є яхЁхёхў╕ээюую)
;р фы эютющ яючшЎшш тхЁ°шэ√ фы ърцфюую шч ёт чрээ√ї Ё╕схЁ шэъЁхьхэЄшЁєхь тёх яхЁхёхўхэш (є эхую ш є яхЁхёхў╕ээюую)
;фы эютющ яючшЎшш тхЁ°шэ√ фы ърцфюую шч ёт чрээ√ї Ё╕схЁ шэъЁхьхэЄшЁєхь тёх яхЁхёхўхэш (є эхую ш є яхЁхёхў╕ээюую)
ld hl,inccrossedandself
call inccrossededges
;шыш яЁюёЄю яюёўшЄрхь ърцф√щ ё ърцф√ь
;call countcrossededges
;яюёых яюсхф√ єцх эх яЁютхЁ хь яюсхфє
ld a,(nextlevelon)
or a
ret nz
;check if untangled
;ld hl,(ncrossededges)
ld hl,edges
ld de,0 ;count*2
ld bc,(nedges)
sumcrossededges0
inc hl
inc hl
ld a,(hl) ;crossed
inc hl
add a,e
ld e,a
adc a,d
sub e
ld d,a
dec bc
ld a,b
or c
jr nz,sumcrossededges0
;de=2*ncrossededges
ld a,d
or e
jr z,levelcomplete
ret
levelcomplete
ld a,' '
ld (nextlevelon),a
;ld a,1
ld (invalidatetime),a
ret
mouse_fire_nextlevel
call ahl_coords
cp 8
jr nc,mouse_fire_nonextlevel
ld bc,8*(nextlevelon+1-tlevel)
or a
sbc hl,bc
ld bc,8*10 ;"NEXT LEVEL"
or a
sbc hl,bc
jr nc,mouse_fire_nonextlevel
;levelcomplete_go
xor a
ld (nextlevelon),a
inc a;ld a,1
ld (invalidatetime),a
ld hl,level
inc (hl)
call countverticesneeded
call genmesh
ld a,1
ld (doredraw),a
;call redraw ;хёЄ№ doredraw
ret
mouse_fire
ld a,(nextlevelon)
or a
jr nz,mouse_fire_nextlevel
mouse_fire_nonextlevel
call ahl_coords
call findvertex
ret c ;not found
ld (curvertex),a
ld a,1
ld (clickstate),a
;фы ёЄрЁющ яючшЎшш тхЁ°шэ√ фы ърцфюую шч ёт чрээ√ї Ё╕схЁ фхъЁхьхэЄшЁєхь тёх яхЁхёхўхэш (є эхую ш є яхЁхёхў╕ээюую)
ld hl,deccrossedandself
call inccrossededges
;ёЄшЁрхь Єхъє∙є■ тхЁ°шэє, Єхъє∙шх Ё╕сЁр ш яхЁхЁшёют√трхь шї шэтхЁёшхщ
call undrawcurvertex
call undrawconnectedvertices
call undrawcuredges
;call cls
call drawunconnectededges
call drawunconnectedvertices
call prlevel
call drawcuredges
call drawconnectedvertices
call drawcurvertex
ret
movecurvertex
ld a,(clickstate)
or a
ret z ;unclicked
call getcurvertexaddr
push hl
call ahl_coords
cp 7
jr nc,$+4
ld a,7 ;max dy = 192 (for fast mul)
ex de,hl
pop hl
ld (hl),e
inc hl
ld (hl),d ;x
inc hl
ld (hl),a ;y
inc hl
ld (hl),0
ret
drawcurvertex
;ld a,(clickstate)
;or a
;ret z ;unclicked
call getcurvertexxy_ahl
jp shapes_prarr_ring8c
drawringon
bit 0,l
ld de,sprringon_l+1
jr nz,$+5+2
ld de,sprringon_r+1
dec hl
dec hl
jp prarr_cross8c_go
undrawcurvertex
;ld a,(clickstate)
;or a
;ret z ;unclicked
call getcurvertexxy_ahl
;jp shapes_prarr_ring8c
drawringoff
bit 0,l
ld de,sprringoff_l+1
jr nz,$+5+2
ld de,sprringoff_r+1
dec hl
dec hl
jp prarr_cross8c_go
getcurvertexxy_ahl
call getcurvertexaddr
ld c,(hl)
inc hl
ld b,(hl) ;x
inc hl
ld e,(hl)
inc hl
ld d,(hl) ;y
ld a,e ;y
ld h,b
ld l,c ;x
ret
getcurvertexaddr
curvertex=$+1
ld de,0
ld hl,vertices
add hl,de
add hl,de
add hl,de
add hl,de
ret
undrawcuredges
ld hl,prpixel
ld a,0
jr drawcuredges_go
drawcuredges
ld hl,invpixel
ld a,0xff
drawcuredges_go
ld (pixelprocver),hl
ld (pixelprochor),hl
ld (drawcuredges_color),a
ld a,(clickstate)
or a
ret z ;unclicked
;find all edges with current vertex (1st or 2nd), draw them
;vertex1,vertex2,crossed
ld hl,edges
ld bc,(nedges)
drawcuredges0
push bc
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,(curvertex)
cp d
jr z,$+3
cp e
jr nz,drawcuredgesno
ld a,(hl)
push hl
;e=vertex1
;d=vertex2
;a=crossed
or a
ld a,COLORS_UNCROSSED;%11001001
jr z,$+4
ld a,COLORS_CROSSED;%11010010
drawcuredges_color=$+1
and 0
call drawedge
pop hl
drawcuredgesno
inc hl
pop bc
dec bc
ld a,b
or c
jr nz,drawcuredges0
ld hl,prpixel
ld (pixelprocver),hl
ld (pixelprochor),hl
ret
drawconnectedvertices
ld hl,shapes_prarr_ring8c;drawringon
jr drawconnectedvertices_go
undrawconnectedvertices
ld hl,drawringoff
drawconnectedvertices_go
ld (drawconnectedvertices_drawproc),hl
ld hl,edges
ld bc,(nedges)
drawconnectedvertices0
push bc
ld e,(hl)
inc hl
ld d,(hl)
inc hl
;e=vertex1
;d=vertex2
ld a,(curvertex)
cp d
jr z,drawconnectedvertices_e
cp e
jr nz,drawconnectedverticesno
ld e,d
drawconnectedvertices_e
push hl
ld d,0 ;e=connected vertex
ld hl,vertices
add hl,de
add hl,de
add hl,de
add hl,de
ld c,(hl)
inc hl
ld b,(hl) ;x
inc hl
ld e,(hl)
inc hl
ld d,(hl) ;y
ld a,e ;y
ld h,b
ld l,c ;x
drawconnectedvertices_drawproc=$+1
call drawringon
pop hl
drawconnectedverticesno
inc hl
pop bc
dec bc
ld a,b
or c
jr nz,drawconnectedvertices0
ret
drawunconnectededges
;Ёшёєхь тёх Ё╕сЁр, ъЁюьх ёт чрээ√ї ё Єхъє∙хщ тхЁ°шэющ
;find all edges with current vertex (1st or 2nd), draw others
;vertex1,vertex2,crossed
ld hl,edges
ld bc,(nedges)
drawunconnectededges0
push bc
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,(curvertex)
cp d
jr z,$+3
cp e
jr z,drawunconnectededgesno
ld a,(hl)
push hl
;e=vertex1
;d=vertex2
;a=crossed
or a
ld a,COLORS_UNCROSSED;%11001001
jr z,$+4
ld a,COLORS_CROSSED;%11010010
call drawedge
pop hl
drawunconnectededgesno
inc hl
pop bc
dec bc
ld a,b
or c
jr nz,drawunconnectededges0
ret
drawunconnectedvertices
;Ёшёєхь тёх тхЁ°шэ√, ъЁюьх Єхъє∙хщ ш ёт чрээ√ї ё эхщ
;фы ¤Єюую:
;ўшёЄшь ЄрсышЎє ёт чрээ√ї тхЁ°шэ
ld hl,vertlinkflags
ld de,vertlinkflags+1
ld bc,MAXVERTICES-1
ld (hl),0
ldir
;яюьхўрхь Єрь Єхъє∙є■ тхЁ°шэє
ld de,vertlinkflags
ld hl,(curvertex)
ld h,0
add hl,de
inc (hl)
;яхЁхсшЁрхь тёх Ё╕сЁр, ш∙хь Єрь ёт чрээ√х тхЁ°шэ√ ш яюьхўрхь т ЄрсышЎх ёт чрээ√ї тхЁ°шэ
ld hl,edges
ld bc,(nedges)
drawunconnectedvertices0
ld e,(hl)
inc hl
ld d,(hl)
inc hl
;e=vertex1
;d=vertex2
ld a,(curvertex)
cp d
jr z,drawunconnectedvertices_e
cp e
jr nz,drawunconnectedverticesno
ld e,d
drawunconnectedvertices_e
push hl
ld d,0 ;e=connected vertex
ld hl,vertlinkflags
add hl,de
inc (hl)
pop hl
drawunconnectedverticesno
inc hl
dec bc
ld a,b
or c
jr nz,drawunconnectedvertices0
;яхЁхсшЁрхь тёх тхЁ°шэ√, т√тюфшь Єюы№ъю эх яюярт°шх т ЄрсышЎє
ld hl,vertlinkflags
ld a,(nvertices)
ld b,a
drawunconnectedvertices1
push bc
push hl
ld a,(nvertices)
sub b
ld e,a
ld a,(hl) ;linkflag
ld d,0 ;e=connected vertex
ld hl,vertices
add hl,de
add hl,de
add hl,de
add hl,de
ld c,(hl)
inc hl
ld b,(hl) ;x
inc hl
ld e,(hl)
inc hl
ld d,(hl) ;y
or a
ld a,e ;y
ld h,b
ld l,c ;x
call z,drawringon
pop hl
inc hl
pop bc
djnz drawunconnectedvertices1
ret
countverticesneeded
ld a,6
ld (verticesneeded),a
ld a,(level)
or a
ret z
ld b,a
countverticesneeded0
ld a,b
add a,3 ;a=4..
ld hl,verticesneeded
add a,(hl)
jr nc,$+3
sbc a,a
ld (hl),a
djnz countverticesneeded0
ret
ahl_coords
ld a,(arry)
ld hl,(arrx)
ret
ahl_oldcoords
ld a,(oldarry)
ld hl,(oldarrx)
ret
if 1==0
gameover
ld hl,endtext
ld bc,0x0b0f
call prtext
gameoverloop
YIELD
GET_KEY
cp key_esc
jr nz,gameoverloop
endif
quitifnoclickstate
ld a,(clickstate)
or a
ret nz
quit
ld de,filename
OS_CREATEHANDLE
push bc
ld de,SAVEDATA
ld hl,SAVEDATAsz
OS_WRITEHANDLE
pop bc
OS_CLOSEHANDLE
QUIT
filename
db "untangle.ini",0
redrawifneeded
doredraw=$+1
ld a,0
or a
ret z
redraw
xor a
ld (doredraw),a
call cls
call drawedges
call drawvertices
jp prlevel
prlevelifneeded
invalidatetime=$+1
ld a,0
or a
ret z
prlevel
ld a,(level)
inc a
ld hl,tleveldig1
call dectotxt12
;ld (tleveldig2),a
;ld a,b
;ld (tleveldig1),a
ld a,(cur_h)
ld hl,ttimeh1
call dectotxt12
ld a,(cur_m)
ld hl,ttimem1
call dectotxt12
ld a,(cur_s)
ld hl,ttimes1
call dectotxt12
ld bc,0
ld hl,tlevel
call prtext
xor a
ld (invalidatetime),a
ret
dectotxt12
ld b,'0'-1
inc b
sub 10
jr nc,$-3
add a,'0'+10
ld (hl),b
inc hl
ld (hl),a
ret
updatetime
OS_GETTIMER ;hlde=timer
ld hl,(oldupdtimer)
ex de,hl
ld (oldupdtimer),hl
or a
sbc hl,de ;hl=frames
ret z
ld b,h
ld c,l
updatetime0
call inctime
dec bc
ld a,b
or c
jr nz,updatetime0
ret
inctime
ld hl,cur_f
inc (hl)
ld a,(hl)
sub 50
ret c
ld (hl),a
ld a,1
ld (invalidatetime),a
ld hl,cur_s
inc (hl)
ld a,(hl)
sub 60
ret c
ld (hl),a
ld hl,cur_m
inc (hl)
ld a,(hl)
sub 60
ret c
ld (hl),a
ld hl,cur_h
inc (hl)
ret
if 1==0
genvertices
;x,X,y,Y
ld hl,vertices
ld a,(nvertices)
ld b,a
genvertices0
push bc
ld c,160
call rnd
add a,a
ld (hl),a
inc hl
ld (hl),0
rl (hl)
inc hl
ld c,200
call rnd
ld (hl),a
inc hl
ld (hl),0
inc hl
pop bc
djnz genvertices0
ret
endif
if 1==0
genedges
;vertex1,vertex2,crossed
ld hl,edges
ld bc,(nedges)
genedges0
push bc
ld a,(nvertices)
ld c,a
call rnd
ld (hl),a
inc hl
ld a,(nvertices)
ld c,a
call rnd
ld (hl),a
inc hl
ld (hl),0 ;uncrossed
inc hl
pop bc
dec bc
ld a,b
or c
jr nz,genedges0
ret
endif
drawedges
;vertex1,vertex2,crossed
ld hl,edges
ld bc,(nedges)
drawedges0
push bc
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,(hl)
push hl
;e=vertex1
;d=vertex2
;a=crossed
or a
ld a,COLORS_UNCROSSED;%11001001
jr z,$+4
ld a,COLORS_CROSSED;%11010010
call drawedge
pop hl
inc hl
pop bc
dec bc
ld a,b
or c
jr nz,drawedges0
ret
drawedge
;e=vertex1
;d=vertex2
;a=color
ex af,af'
ld a,d ;vertex2
ld d,0
ld hl,vertices
add hl,de
add hl,de
add hl,de
add hl,de
ld c,(hl)
inc hl
ld b,(hl) ;x
inc hl
ld e,(hl)
inc hl
ld d,(hl) ;y
push de
ld d,0
ld e,a ;vertex2
ld hl,vertices
add hl,de
add hl,de
add hl,de
add hl,de
pop de
ld a,(hl)
ld lx,a
inc hl
ld a,(hl) ;x2
ld hx,a
inc hl
ld a,(hl)
inc hl
ld h,(hl) ;y2
ld l,a
ex af,af' ;color
;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
;ix=x2
;hl=y2
;a=color = %332103210
call shapes_line
ret
drawvertices
;x,X,y,Y
ld hl,vertices
ld a,(nvertices)
ld b,a
drawvertices0
push bc
ld c,(hl)
inc hl
ld b,(hl) ;x
inc hl
ld e,(hl)
inc hl
ld d,(hl) ;y
inc hl
push hl
ld a,e ;y
ld h,b
ld l,c ;x
call drawringon;shapes_prarr_ring8c
pop hl
pop bc
djnz drawvertices0
ret
findvertex
;in: hl=arrx, a=arry
;out: CY=not found, or else a=vertex #
ex de,hl
ld c,a
;x,X,y,Y
ld hl,vertices
ld a,(nvertices)
ld b,a
findvertex0
ld a,(hl)
inc hl
push hl
ld h,(hl)
ld l,a ;x
or a
sbc hl,de ;x-arrx
inc hl
inc hl
push de
ld de,5
or a
sbc hl,de ;CY = -2..+2
pop de
pop hl
inc hl
jr nc,findvertexno
push hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a ;y
push bc
xor a
ld b,a
sbc hl,bc ;y=arry
inc hl
inc hl
ld bc,5
or a
sbc hl,bc ;CY = -2..+2
pop bc
pop hl
jr c,findvertexok
findvertexno
inc hl
inc hl
djnz findvertex0
scf
ret
findvertexok
ld a,(nvertices)
sub b
or a
ret
rnd
;0..c-1
;ld a,r
push de
push hl
call func_rnd
pop hl
pop de
rnd0
sub c
jr nc,rnd0
add a,c
ret
func_rnd
;Patrik Rak
rndseed1=$+1
ld hl,0xA280 ; xz -> yw
rndseed2=$+1
ld de,0xC0DE ; yw -> zt
ld (rndseed1),de ; x = y, z = w
ld a,e ; w = w ^ ( w << 3 )
add a,a
add a,a
add a,a
xor e
ld e,a
ld a,h ; t = x ^ (x << 1)
add a,a
xor h
ld d,a
rra ; t = t ^ (t >> 1) ^ w
xor d
xor e
ld h,l ; y = z
ld l,a ; w = t
ld (rndseed2),hl
;ex de,hl
;ld hl,0
;res 7,c ;int
ret
div4signedup
or a
jp m,$+5
add a,3
sra a
sra a
ret
cls
ld e,0
OS_CLS
ret
prtext
;bc=ъююЁфшэрЄ√
;hl=text
ld a,(hl)
or a
ret z
call prcharxy
inc hl
inc c
jr prtext
prnum
ld bc,1000
call prdig
ld bc,100
call prdig
ld bc,10
call prdig
ld bc,1
prdig
ld a,'0'-1
prdig0
inc a
or a
sbc hl,bc
jr nc,prdig0
add hl,bc
;push hl
;call prchar
;pop hl
;ret
prchar
;a=code
;de=screen
push de
push hl
call prcharin
pop hl
pop de
inc e
ret
calcscraddr
;bc=yx
;ьюцэю яюЁЄшЄ№ bc
ex de,hl
ld a,c ;x
ld l,b ;y
ld h,0
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,bc ;*5
add hl,hl
add hl,hl
add hl,hl ;*40
add hl,hl
add hl,hl
add hl,hl
add a,l
ld l,a
ld a,h
adc a,0x80
ld h,a
ex de,hl
ret
prtilexy
;hl=tile
;bc=yx
push de
push bc
call calcscraddr
call prcharin_go
pop bc
pop de
ret
prcharxy
;a=code
;bc=yx
push de
push hl
push bc
push af
call calcscraddr
pop af
call prcharin
pop bc
pop hl
pop de
ret
prcharin
sub 32
ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
;ld bc,font-(32*32)
;add hl,bc
ld a,h
add a,font/256
ld h,a
prcharin_go
ex de,hl
ld bc,40
push hl
push hl
dup 8
ld a,(de) ;font
ld (hl),a ;scr
inc de
add hl,bc
edup
pop hl
set 6,h
;ld d,font/256
dup 8
ld a,(de) ;font
ld (hl),a ;scr
inc de
add hl,bc
edup
pop hl
set 5,h
push hl
;ld d,font/256
dup 8
ld a,(de) ;font
ld (hl),a ;scr
inc de
add hl,bc
edup
pop hl
set 6,h
;ld d,font/256
dup 8
ld a,(de) ;font
ld (hl),a ;scr
inc de
add hl,bc
edup
ret
invpixel
;bc=x (эх яюЁЄшЄё ) ;de
;e=y (de эх яюЁЄшЄё ) ;c
;lx=color = %33210210
;ld a,d;b
ld l,e;c
;ld h,0
;ld d,scrbase/256/8 ;b
ld h,scrbase/256/32
add hl,hl
add hl,hl
add hl,de;bc
add hl,hl
add hl,hl
add hl,hl ;y*40 + scrbase
;ld d,a;b,a
;invpixel_cury
;bc=x (эх яюЁЄшЄё );de
;hl=addr(y)
;lx=color = %33210210
ld a,b;d
rra
ld a,c;e
rra
jr c,invpixel_r
rra
jr nc,$+4
set 6,h
rra
jr nc,$+4
set 5,h
and %00111111
add a,l
ld l,a
adc a,h
sub l
ld h,a
invpixel_color_l=$+1
ld a,0;lx
;xor (hl)
;and %01000111 ;keep left pixel
xor (hl) ;right pixel from screen
ld (hl),a
ret
invpixel_r
rra
jr nc,$+4
set 6,h
rra
jr nc,$+4
set 5,h
and %00111111
add a,l
ld l,a
adc a,h
sub l
ld h,a
invpixel_color_r=$+1
ld a,0;lx
;xor (hl)
;and %10111000 ;keep right pixel
xor (hl) ;left pixel from screen
ld (hl),a
ret
prpixel
;de=x (эх яюЁЄшЄё )
;c=y (bc эх яюЁЄшЄё )
;[lx=color = %33210210]
;ld a,d;b
ld l,e;c
;ld h,0
;ld d,scrbase/256/8 ;b
ld h,scrbase/256/32
add hl,hl
add hl,hl
add hl,de;bc
add hl,hl
add hl,hl
add hl,hl ;y*40 + scrbase
;ld d,a;b,a
;prpixel_cury
;bc=x (эх яюЁЄшЄё );de
;hl=addr(y)
;lx=color = %33210210
ld a,b;d
rra
ld a,c;e
rra
jr c,prpixel_r
rra
jr nc,$+4
set 6,h
rra
jr nc,$+4
set 5,h
and %00111111
add a,l
ld l,a
adc a,h
sub l
ld h,a
prpixel_color_l=$+1
ld a,0;lx
xor (hl)
and %01000111 ;keep left pixel
xor (hl) ;right pixel from screen
ld (hl),a
ret
prpixel_r
rra
jr nc,$+4
set 6,h
rra
jr nc,$+4
set 5,h
and %00111111
add a,l
ld l,a
adc a,h
sub l
ld h,a
prpixel_color_r=$+1
ld a,0;lx
xor (hl)
and %10111000 ;keep right pixel
xor (hl) ;left pixel from screen
ld (hl),a
ret
shapes_line
;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
;ix=x2
;hl=y2
;a=color = %332103210
ld (prpixel_color_l),a
ld (prpixel_color_r),a
ld ly,a
and %01000111 ;keep left pixel
ld (invpixel_color_l),a
xor ly ;keep right pixel
ld (invpixel_color_r),a
or a
sbc hl,de
add hl,de
jp p,shapes_line_noswap
ex de,hl ;y <-> y2
push ix
push bc
pop ix
pop bc ;x <-> x2
shapes_line_noswap
or a
sbc hl,de ;dy >= 0
push hl ;dy
push ix
pop hl
sbc hl,bc
push hl ;dx
exx
pop bc ;dx
ld a,#03 ;inc bc
jp p,shapes_line_nodec
xor a
sub c
ld c,a
sbc a,b
sub c
ld b,a ;dx >= 0
ld a,#0b ;dec bc
shapes_line_nodec
pop de ;dy
;a=ъюф inc/dec bc
;bc'=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
;de'=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
;bc=dx
;de=dy
ex de,hl
or a
sbc hl,bc
add hl,bc
ex de,hl
jr nc,shapes_linever ;dy>=dx
ld hy,b
ld ly,c ;counter=dx
;0x0000 -> 0x0101
;0x0001 -> 0x0102
;0x00ff -> 0x0100
;0x0100 -> 0x0201
inc ly
inc hy
;inc iy ;inc hy ;Ёшёєхь, тъы■ўр яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
ld h,b
ld l,c
sra h
rr l ;ym=dx div 2 ;TODO р хёыш dx<0?
;xor a
;sub l
;ld l,a
;sbc a,h
;sub l
;ld h,a ;mym=256-(dx div 2)
exx
ld (shapes_lineincx),a
;bc=x
;de=y
;hl'=xm
;bc'=dx
;de'=dy
shapes_linehor0
pixelprochor=$+1
call prpixel
shapes_lineincx=$
inc bc ;x+1
exx
;add hl,de ;mym+dy
or a
sbc hl,de ;ym-dy
exx
jr nc,shapes_linehor1
inc de ;y+1
exx
;or a
;sbc hl,bc ;mym-dx
add hl,bc ;ym+dx
exx
shapes_linehor1
dec ly
jp nz,shapes_linehor0
dec hy
jp nz,shapes_linehor0
ret
shapes_linever
ld hy,d
ld ly,e ;counter=dy
;0x0000 -> 0x0101
;0x0001 -> 0x0102
;0x00ff -> 0x0100
;0x0100 -> 0x0201
inc ly
inc hy
;inc iy ;inc hy ;Ёшёєхь, тъы■ўр яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
ld h,d
ld l,e
sra h
rr l
;xor a
;sub l
;ld l,a
;sbc a,h
;sub l
;ld h,a ;mxm=256-(dy div 2)
exx
ld (shapes_lineincx2),a
;bc=x
;de=y
;hl'=xm
;bc'=dx
;de'=dy
shapes_linever0
pixelprocver=$+1
call prpixel
inc de ;y+1
exx
;add hl,bc ;mxm+dx
or a
sbc hl,bc ;xm-dx ;TODO р хёыш dx<0?
exx
jr nc,shapes_linever1
shapes_lineincx2=$
inc bc ;x+1
exx
;or a
;sbc hl,de ;mxm-dy
add hl,de ;xm+dy
exx
shapes_linever1
dec ly
jp nz,shapes_linever0
dec hy
jp nz,shapes_linever0
ret
macro cols data
_l=data/16
_r=data&15
db ((_r&8)<<4) + ((_r&7)<<3) + ((_l&8)<<3) + (_l&7)
endm
macro cols8 d0,d1,d2,d3,d4,d5,d6,d7
cols d0
cols d1
cols d2
cols d3
cols d4
cols d5
cols d6
cols d7
endm
endtext
db "GAME OVER!",0
oldupdtimer
dw 0
align 256
font
incbin "fontgfx"
genmesh
xor a
ld (nvertices),a
ld (nvertices2),a
ld (curmeshvertex),a
ld hl,0
ld (nedges),hl
;ld (ncrossededges),hl
ld (genmeshedge_old),hl ;эхтючьюцэюх ЁхсЁю
;ёючфрЄ№ Ё ф шч 2 Єюўхъ (шыш ыєў°х шч sqrt(verticesneeded)) ё Ё╕сЁрьш ьхцфє эшьш:
ld (genmeshx),hl
ld (genmeshy),hl
call genmeshvertex ;in verlist2
ld hl,(verticesneeded)
ld h,0
call sqrt
ld b,d ;сєфхЄ юфэр ыш°э ётхЁї sqrt
genmeshfirstrow0
push bc
call newedgeinlist2 ;Ўхяы хь эютюх ЁхсЁю т vertlist2
pop bc
djnz genmeshfirstrow0
call copyvertlist2to1
genmeshrows0
;эрўшэрхь ёыхфє■∙шщ Ё ф
ld hl,(genmeshy)
ld bc,25
add hl,bc
ld (genmeshy),hl
ld hl,0
ld (genmeshx),hl
xor a
ld (curopenvertinlist1),a
ld (nvertices2),a
;ёэрўрыр Ўхяы хь ъ яхЁтющ юЄъЁ√Єющ Єюўъх ЁхсЁю
;. . . .
;| ^Єхъє∙р юЄъЁ√Єр Єюўър
;* Єхъє∙р Ўхяы хьр Єюўър
ld a,(nvertices)
push af
call genmeshvertex ;in verlist2
pop af ;эютр Єюўър
ld (curmeshvertex),a
call linktoopenvertex
genmeshrow00
call func_rnd
cp 128
;хёыш rnd>0.?, Єю ёючфр╕ь ЁхсЁю ш Ўшъышьё чфхё№, шэрўх Ўхяы хь яюёыхфэхх ЁхсЁю чр ёыхфє■∙є■ юЄъЁ√Єє■ Єюўъє
;TODO тхЁю ЄэюёЄ№ яюёЄртшЄ№ т ёююЄтхЄёЄтшх ё ўшёыюь nvertices2 - хёыш ёшы№эю ьхэ№°х, ўхь эрфю, Єю эрфю ухэхЁшЄ№ Ё╕сЁр
;. . . .
;|_\/
;. . . .
;|_\__|
;. . . .
;|_\_.__\
; * Єхъє∙р Ўхяы хьр Єюўър
;ш Єръ яюър эх ъюэўрЄё юЄъЁ√Є√х Єюўъш
jr c,genmesh_nextopenvert
call newedgeinlist2 ;Ўхяы хь эютюх ЁхсЁю т vertlist2
ld a,(nvertices)
ld hl,verticesneeded
cp (hl)
jr nc,genmesh_finishlastvertex;jp nc,linktoopenvertex ;ёухэхЁшыш Єюўхъ ёЄюы№ъю, ёъюы№ъю яЁюёшыш
;ё эхъюЄюЁющ тхЁю ЄэюёЄ№■ Ўхяы хь ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх
call func_rnd
cp 128
call c,linktoopenvertex
jr genmeshrow00
genmesh_finishlastvertex
;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх (фрцх ъю тёхь юЄъЁ√Є√ь фю ъюэЎр! шэрўх яЁш 2 Ё фрї ьюцхЄ юёЄрЄ№ё їтюёЄ т тхЁїэхь Ё фє) ш т√їюфшь
genmesh_finishlastvertex0
call linktoopenvertex ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх
ld de,curopenvertinlist1
ld a,(de)
inc a
ld hl,nvertices1
cp (hl)
ret nc ;сюы№°х эхЄ юЄъЁ√Є√ї Єюўхъ - чрърэўштрхь
ld (de),a
jr genmesh_finishlastvertex0
genmesh_nextopenvert
;яхЁхїюфшь ъ ёыхфє■∙хщ юЄъЁ√Єющ Єюўъх, хёыш юэр хёЄ№, ш Ўхяы хь ъ эхщ ЁхсЁю
ld de,curopenvertinlist1
ld a,(de)
inc a
ld hl,nvertices1
cp (hl)
jr nc,genmesh_rowend ;сюы№°х эхЄ юЄъЁ√Є√ї Єюўхъ - чрърэўштрхь Ё ф
ld (de),a
call linktoopenvertex ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх
jr genmeshrow00
genmesh_rowend
call linktoopenvertex ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ (яюёыхфэхщ) юЄъЁ√Єющ Єюўъх
;Ё ф юЄъЁ√Є√ї Єюўхъ чрьхэшЄ№ эют√ь
call copyvertlist2to1
jr genmeshrows0
newedgeinlist2
;Ўхяы хь эютюх ЁхсЁю т vertlist2
ld a,(nvertices)
push af
call genmeshvertex ;in verlist2
ld a,(curmeshvertex)
ld e,a ;Єхъє∙р Ўхяы хьр Єюўър
pop af ;эютр Єюўър
ld (curmeshvertex),a
ld d,a
jp genmeshedge
linktoopenvertex
curmeshvertex=$+1
ld d,0 ;эюьхЁ Єюўъш, ъюЄюЁє■ эрфю яЁшЎхяшЄ№
curopenvertinlist1=$+1
ld a,0
ld hl,vertlist1
add a,l
ld l,a
adc a,h
sub l
ld h,a
ld e,(hl) ;Єхъє∙р юЄъЁ√Єр Єюўър
jp genmeshedge
genmeshvertex
;in verlist2
genmeshx=$+1
ld bc,0
genmeshy=$+1
ld de,0
if 1==0
push bc
ld c,160
call rnd
add a,a
ld a,a
ld a,0
rl a
ld c,200
call rnd
ld a,a
ld a,0
pop bc
else
ld c,160
call rnd
add a,a
ld c,a
ld b,0
rl b
push bc
ld c,200-8
call rnd
add a,8
ld e,a
ld d,0
pop bc
endif
;bc=x
;de=y
ld a,(nvertices2)
ld hl,vertlist2
add a,l
ld l,a
adc a,h
sub l
ld h,a
ld a,(nvertices)
ld (hl),a
ld l,a
ld h,0
add hl,hl
add hl,hl
push bc
ld bc,vertices
add hl,bc
pop bc
ld (hl),c
inc hl
ld (hl),b ;x
inc hl
ld (hl),e
inc hl
ld (hl),d ;y
ld hl,nvertices
inc (hl)
ld hl,nvertices2
inc (hl)
ld hl,(genmeshx)
ld bc,24
add hl,bc
ld (genmeshx),hl
ret
copyvertlist2to1
ld hl,vertlist2
ld de,vertlist1
ld bc,MAXVERTICES
ldir
ld a,(nvertices2)
ld (nvertices1),a
ret
genmeshedge
;d=vertex1
;e=vertex2
;яЁютхЁшь, ўЄю ь√ єцх эх яЁшЎхяшыш ¤Єю ЁхсЁю
genmeshedge_old=$+1
ld hl,0
or a
sbc hl,de
ld (genmeshedge_old),de
ret z
ld bc,(nedges)
ld hl,edges
add hl,bc
add hl,bc
add hl,bc
ld (hl),d
inc hl
ld (hl),e
dec hl
;check if this edge crossed with something, mark crossing here and there
ld bc,(nedges)
call checkcrossedwith_oldedges
ld hl,(nedges)
inc hl
ld (nedges),hl
ret
if 1==0
countcrossededges
;яЁютхЁ хь яхЁхёхўхэшх тёхї ёю тёхьш
;ld hl,0
;ld (ncrossededges),hl
ld hl,edges
ld bc,(nedges)
initcrossededges0
inc hl
inc hl
ld (hl),0 ;uncrossed
inc hl
dec bc
ld a,b
or c
jr nz,initcrossededges0
ld hl,edges
ld bc,(nedges)
ld de,0 ;counter (+1)
countcrossededges0
push bc
push de
push hl
ld b,d
ld c,e
call checkcrossedwith_oldedges
pop hl
inc hl
inc hl
inc hl
pop de
pop bc
inc de
dec bc
ld a,b
or c
jr nz,countcrossededges0
ret
endif
inccrossededges
ld (inccrossededges_proc),hl
;фы ърцфюую шч ёт чрээ√ї Ё╕схЁ шэъЁхьхэЄшЁєхь/фхъЁхьхэЄшЁєхь тёх яхЁхёхўхэш (є эхую ш є яхЁхёхў╕ээюую)
ld hl,edges
ld bc,(nedges)
inccrossededges0
;ш∙хь ёт чрээ√х Ё╕сЁр
ld e,(hl)
inc hl
ld d,(hl)
dec hl
;e=vertex1
;d=vertex2
ld a,(curvertex)
cp d
jr z,inccrossededgesok
cp e
jr nz,inccrossededgesno
inccrossededgesok
;эр°ыш ёт чрээюх ЁхсЁю, ш∙хь тёх хую яхЁхёхўхэш (яю тёхь Ё╕сЁрь, ъЁюьх ёрьюую ёхс ) ш шї шэъЁхьхэЄшЁєхь (ш є ёхс Єюцх)
push bc
push hl
ld (inccrossededges_selfaddr),hl
ld hl,edges
ld bc,(nedges)
inccrossededges00
inccrossededges_selfaddr=$+1
ld de,0
or a
sbc hl,de
add hl,de
jr z,inccrossededges00_skipself
push bc
;hl=edge1addr
;de=edge2addr
push hl
call checkcrossed_edge ;out: CY=crossed
pop hl
inccrossededges_proc=$+1
call c,inccrossedandself
pop bc
inccrossededges00_skipself
inc hl
inc hl
inc hl
dec bc
ld a,b
or c
jr nz,inccrossededges00
;ъюэхЎ юсЁрсюЄъш ёт чрээюую ЁхсЁр
pop hl
pop bc
inccrossededgesno
inc hl
inc hl
inc hl
dec bc
ld a,b
or c
jr nz,inccrossededges0
ret
inccrossedandself
push hl
inc hl
inc hl
inc (hl)
ld hl,(inccrossededges_selfaddr)
inc hl
inc hl
inc (hl)
pop hl
ret
deccrossedandself
push hl
inc hl
inc hl
dec (hl)
ld hl,(inccrossededges_selfaddr)
inc hl
inc hl
dec (hl)
pop hl
ret
checkcrossedwith_oldedges
;hl=edge to check
;bc=nedges before current edge
;inc hl
;inc hl
;ld (hl),0
;dec hl
;dec hl
ld de,edges
ld a,b
or c
ret z;jr z,genmeshedge_nocheckcrossed
;bc=was nedges
genmeshedge_checkcrossed0
push bc
push de
push hl
call checkcrossed_edge
pop hl
pop de
pop bc
inc de
inc de
jr nc,genmeshedge_nocrossed
ld a,(de)
inc a
ld (de),a
inc hl
inc hl
inc (hl)
dec hl
dec hl
genmeshedge_nocrossed
inc de
dec bc
ld a,b
or c
jr nz,genmeshedge_checkcrossed0
;genmeshedge_nocheckcrossed
ret
checkcrossed_edge
;hl=edge1addr
;de=edge2addr
;out: CY=crossed
;фы эрф╕цэюёЄш ёфхырхь hl>=de тёхуфр (яюїюцх, ЄхёЄ эхъюььєЄрЄштэ√щ т Ёхфъшї ёыєўр ї)
or a
sbc hl,de
add hl,de
jr nc,$+3
ex de,hl
;хёыш A=C шыш A=D шыш B=C шыш B=D, Єю эхяхЁхёхўхэшх (яЁшь√ърэшх) - эрфю яЁютхЁ Є№ эх ъююЁфшэрЄ√, р эюьхЁр тхЁ°шэ!!!
ld a,(de)
cp (hl)
ret z ;яЁшь√ърэшх
inc hl
cp (hl)
ret z ;яЁшь√ърэшх
inc de
ld a,(de)
cp (hl)
ret z ;яЁшь√ърэшх
dec hl
cp (hl)
ret z ;яЁшь√ърэшх
ld c,(hl) ;edge1vertex1
inc hl
ld a,(hl) ;edge1vertex2
ld b,0
ld hl,vertices
add hl,bc
add hl,bc
add hl,bc
add hl,bc
ld c,(hl)
inc hl
ld b,(hl)
ld (checkxA),bc
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld (checkyA),bc
ld c,a ;edge1vertex2
ld b,0
ld hl,vertices
add hl,bc
add hl,bc
add hl,bc
add hl,bc
ld c,(hl)
inc hl
ld b,(hl)
ld (checkxB),bc
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld (checkyB),bc
ex de,hl
ld a,(hl) ;edge2vertex2
dec hl
ld c,(hl) ;edge2vertex1
ld b,0
ld hl,vertices
add hl,bc
add hl,bc
add hl,bc
add hl,bc
ld c,(hl)
inc hl
ld b,(hl)
ld (checkxC),bc
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld (checkyC),bc
ld c,a ;edge2vertex2
ld b,0
ld hl,vertices
add hl,bc
add hl,bc
add hl,bc
add hl,bc
ld c,(hl)
inc hl
ld b,(hl)
ld (checkxD),bc
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld (checkyD),bc
;яЁютхЁър яхЁхёхўхэш AB ш CD
;яЁютхЁшЄ№ юфшэръютє■ ыхтюёЄ№ (чэръ тхъЄюЁэюую яЁюшчтхфхэш фтєї ёЄюЁюэ) ЄЁхєуюы№эшъют ABC ш BCD. ┼ёыш юфшэръютр , Єю яхЁхёхўхэшх.
;╦юцэюх ёЁрсрЄ√трэшх! ╧ю¤Єюьє хёыш ыхтюёЄ№ юфшэръютр , эрфю яЁютхЁшЄ№ х∙╕ ыхтюёЄ№ DBA - хёыш Єрър цх, Єю яхЁхёхўхэшх.
;ыюцэюх ёЁрсрЄ√трэшх яЁш ярыъх B,A эрф CD ;яЁютхЁ хь DCA
;╩ръ яЁш ¤Єюь урЁрэЄшЁютрЄ№ [0..1]?
;┼ёыш (A=C ш B=D) шыш (B=C ш A=D), Єю яхЁхёхўхэшх (ўЄюс√ эх т√шуЁ√трыш ьхЄюфюь эрыюцхэш юЄЁхчъют)
if 1==1
ld hl,(checkxA)
ld de,(checkxC)
or a
sbc hl,de
jr nz,checkcrossed_noAC
ld hl,(checkyA)
ld de,(checkyC)
or a
sbc hl,de
jr nz,checkcrossed_noAC
ld hl,(checkxB)
ld de,(checkxD)
or a
sbc hl,de
jr nz,checkcrossed_noAC
ld hl,(checkyB)
ld de,(checkyD)
or a
sbc hl,de
scf
ret z ;яхЁхёхўхэшх
checkcrossed_noAC
ld hl,(checkxB)
ld de,(checkxC)
or a
sbc hl,de
jr nz,checkcrossed_noBC
ld hl,(checkyB)
ld de,(checkyC)
or a
sbc hl,de
jr nz,checkcrossed_noBC
ld hl,(checkxA)
ld de,(checkxD)
or a
sbc hl,de
jr nz,checkcrossed_noBC
ld hl,(checkyA)
ld de,(checkyD)
or a
sbc hl,de
scf
ret z ;яхЁхёхўхэшх
checkcrossed_noBC
endif
;хёыш A=C шыш A=D шыш B=C шыш B=D, Єю эхяхЁхёхўхэшх (яЁшь√ърэшх) - эрфю яЁютхЁ Є№ эх ъююЁфшэрЄ√, р эюьхЁр тхЁ°шэ!!! яю¤Єюьє єсЁрэю ЄєЄ, ёь. т√°х
if 1==0
ld hl,(checkxA)
ld de,(checkxC)
or a
sbc hl,de
jr nz,checkcrossed_noACcommon
ld hl,(checkyA)
ld de,(checkyC)
or a
sbc hl,de
ret z ;яЁшь√ърэшх
checkcrossed_noACcommon
ld hl,(checkxA)
ld de,(checkxD)
or a
sbc hl,de
jr nz,checkcrossed_noADcommon
ld hl,(checkyA)
ld de,(checkyD)
or a
sbc hl,de
ret z ;яЁшь√ърэшх
checkcrossed_noADcommon
ld hl,(checkxB)
ld de,(checkxC)
or a
sbc hl,de
jr nz,checkcrossed_noBCcommon
ld hl,(checkyB)
ld de,(checkyC)
or a
sbc hl,de
ret z ;яЁшь√ърэшх
checkcrossed_noBCcommon
ld hl,(checkxB)
ld de,(checkxD)
or a
sbc hl,de
jr nz,checkcrossed_noBDcommon
ld hl,(checkyB)
ld de,(checkyD)
or a
sbc hl,de
ret z ;яЁшь√ърэшх
checkcrossed_noBDcommon
endif
;or a
;ret
;шэрўх ёўшЄрхь ьрЄхьрЄшъє
ld hl,(checkxA)
ld (trix1),hl
ld hl,(checkxB)
ld (trix2),hl
ld hl,(checkxC)
ld (trix3),hl
ld hl,(checkyA)
ld (triy1),hl
ld hl,(checkyB)
ld (triy2),hl
ld hl,(checkyC)
ld (triy3),hl
call checktriangle ;ABC
if 1==1
sbc a,a
push hl
push af
ld hl,(checkxD)
ld (trix1),hl
ld hl,(checkyD)
ld (triy1),hl
call checktriangle ;DBC
sbc a,a
pop bc
pop de
xor b
ret nz ;Ёрчэр ыхтюёЄ№ - эхЄ яхЁхёхўхэш
ld a,h
or l
or d
or e
jr z,checkcrossed_collinear ;тёх 4 эр юфэющ ышэшш - юЄфхы№эр яЁютхЁър
push bc
ld hl,(checkxA)
ld (trix3),hl
ld hl,(checkyA)
ld (triy3),hl
call checktriangle ;DBA
sbc a,a
pop bc
xor b
ret nz ;Ёрчэр ыхтюёЄ№ - эхЄ яхЁхёхўхэш
;ыюцэюх ёЁрсрЄ√трэшх яЁш ярыъх B,A эрф CD
;яЁютхЁ хь DCA
push bc
ld hl,(checkxC)
ld (trix2),hl
ld hl,(checkyC)
ld (triy2),hl
call checktriangle ;DCA
sbc a,a
pop bc
xor b
rla
ccf
ret ;юфшэръютр ыхтюёЄ№ - хёЄ№ яхЁхёхўхэшх
else
push hl
ld hl,(checkxD)
ld (trix1),hl
ld hl,(checkyD)
ld (triy1),hl
call checktriangle ;DBC
pop de
ld a,h
xor d
rla
ccf
ret nc ;Ёрчэр ыхтюёЄ№ - эхЄ яхЁхёхўхэш
push hl
ld hl,(checkxA)
ld (trix3),hl
ld hl,(checkyA)
ld (triy3),hl
call checktriangle ;DBA
pop bc
ld a,h
xor b
rla
ccf
ret nc ;Ёрчэр ыхтюёЄ№ - эхЄ яхЁхёхўхэш
ld a,h
or l
or d
or e
jr z,checkcrossed_collinear ;яыю∙рф№ DBC = 0 - юЄфхы№эр яЁютхЁър
;ыюцэюх ёЁрсрЄ√трэшх яЁш ярыъх B,A эрф CD
;яЁютхЁ хь DCA
push hl
ld hl,(checkxC)
ld (trix2),hl
ld hl,(checkyC)
ld (triy2),hl
call checktriangle ;DCA
pop de
ld a,h
xor d
rla
ccf
ret ;юфшэръютр ыхтюёЄ№ - хёЄ№ яхЁхёхўхэшх
endif
checkcrossed_collinear
;юЄЁхчъш эр юфэющ яЁ ьющ
;юЄфхы№эю яЁютхЁшЄ№, ўЄю юЄЁхчъш ыхцрЄ фЁєу эр фЁєух (Ёрэ№°х яыю∙рфш 0 ёўшЄрышё№ ъръ эхяхЁхёхўхэшх)
;эрщЄш ёрьє■ сюы№°є■ юё№ (max-min)
ld hl,(checkxA)
ld bc,(checkxB)
call minhl_bc_tobc
ld (checkxminAB),bc
push bc
ld hl,(checkxC)
ld bc,(checkxD)
call minhl_bc_tobc
ld (checkxminCD),bc
pop hl
call minhl_bc_tobc
;bc=minx
ld hl,(checkxA)
ld de,(checkxB)
call maxhl_de_tode
ld (checkxmaxAB),de
push de
ld hl,(checkxC)
ld de,(checkxD)
call maxhl_de_tode
ld (checkxmaxCD),de
pop hl
call maxhl_de_tode
;de=maxx
ex de,hl
or a
sbc hl,bc
push hl ;maxx-minx
ld hl,(checkyA)
ld bc,(checkyB)
call minhl_bc_tobc
ld (checkyminAB),bc
push bc
ld hl,(checkyC)
ld bc,(checkyD)
call minhl_bc_tobc
ld (checkyminCD),bc
pop hl
call minhl_bc_tobc
;bc=miny
ld hl,(checkyA)
ld de,(checkyB)
call maxhl_de_tode
ld (checkymaxAB),de
push de
ld hl,(checkyC)
ld de,(checkyD)
call maxhl_de_tode
ld (checkymaxCD),de
pop hl
call maxhl_de_tode
;de=maxy
ex de,hl
or a
sbc hl,bc ;maxy-miny
pop de ;maxx-minx
;хёыш эхЄ яхЁхёхўхэш , Єю фюыцэю с√Є№ max(A,B)<min(C,D) шыш max(C,D)<min(A,B)
or a
sbc hl,de ;NC: ЁрчсЁюё яю y >= ЁрчсЁюё яю x, схЁ╕ь y
jr nc,checkcrossed_collinear_y
;ЁрчсЁюё яю y < ЁрчсЁюё яю x, схЁ╕ь x
checkxmaxAB=$+1
ld hl,0
checkxminCD=$+1
ld de,0
or a
sbc hl,de
ccf
ret nc ;эхЄ яхЁхёхўхэш
checkxmaxCD=$+1
ld hl,0
checkxminAB=$+1
ld de,0
or a
sbc hl,de
ccf
ret
checkcrossed_collinear_y
;ЁрчсЁюё яю y >= ЁрчсЁюё яю x, схЁ╕ь y
checkymaxAB=$+1
ld hl,0
checkyminCD=$+1
ld de,0
or a
sbc hl,de
ccf
ret nc ;эхЄ яхЁхёхўхэш
checkymaxCD=$+1
ld hl,0
checkyminAB=$+1
ld de,0
or a
sbc hl,de
ccf
ret
minhl_bc_tobc
or a
sbc hl,bc
add hl,bc
ret nc ;bc<=hl
ld b,h
ld c,l
ret
maxhl_de_tode
or a
sbc hl,de
add hl,de
ret c ;de>hl
ex de,hl
ret
checkxA
dw 0
checkyA
dw 0
checkxB
dw 0
checkyB
dw 0
checkxC
dw 0
checkyC
dw 0
checkxD
dw 0
checkyD
dw 0
checktriangle
;out: CY=ыхтюёЄ№, hl==0 т√ЁюцфхээюёЄ№
; x21:=vert[poly[i].v2].xscr-vert[poly[i].v1].xscr;
; x31:=vert[poly[i].v3].xscr-vert[poly[i].v1].xscr;
; y21:=vert[poly[i].v2].yscr-vert[poly[i].v1].yscr;
; y31:=vert[poly[i].v3].yscr-vert[poly[i].v1].yscr;
ld bc,tsqr/2
triy2=$+1
ld hl,0
triy1=$+1
ld de,0
or a
sbc hl,de
ld (y21),hl
triy3=$+1
ld hl,0
or a
sbc hl,de
ld (y31),hl
trix2=$+1
ld hl,0
trix1=$+1
ld de,0
or a
sbc hl,de
add hl,bc
ld (x21),hl
trix3=$+1
ld hl,0
or a
sbc hl,de
add hl,bc
;ld (x31),hl
; poly[i].visible := ((x21*y31 - x31*y21) > 0);
;x31=$+1
;ld hl,0
ld bc,0
y21=$-2
call mul9 ;out: CYhl ;_MULLONG. ;out: hl(high), de(low)
sbc a,a
ld lx,a ;hsb
ex de,hl
x21=$+1
ld hl,0
ld bc,0
y31=$-2
call mul9 ;out: CYhl ;_MULLONG. ;out: hl(high), de(low)
sbc a,a
or a
sbc hl,de ;lsw
sbc a,lx ;hsb
rla ;CY=Ёхчєы№ЄрЄ ёЁртэхэш чэръют√ї (LVD)
ret
mul9
;9*9 -> 18
;ьюцэю шёяюы№чютрЄ№ фы +-319*+-192, Єюуфр Ёхчєы№ЄрЄ ёю чэръюь т CY
;hl=A+(tsqr/2) (A=+-319)
;bc=B = +-192
;A*B = ((A+B)^2)/4 - ((A-B)^2)/4 ;ьырф°шх 2 сшЄр яхЁхф фхыхэшхь юфшэръют√х ёыхтр ш ёяЁртр, юяЁхфхы ■Єё ў╕ЄэюёЄ№■
push hl
add hl,bc
;hl=A+B
add hl,hl
;CY=0
ld (mulpatchadd),hl
pop hl
sbc hl,bc
;hl=A-B
add hl,hl
;CY=0
ld (mulpatchsub),hl
mulpatchadd=$+1
ld hl,(0)
mulpatchsub=$+2
ld bc,(0)
sbc hl,bc
;HL = %rrrrrrrr rrrrrrrr
ret
align 2
tsqrsize=(320+200)
_=tsqrsize
dup tsqrsize
_=_-1
dw ((_*_)/4)&0xffff
edup
tsqr
_=0
dup tsqrsize
dw ((_*_)/4)&0xffff
_=_+1
edup
sqrt
;in: hl
;out: d
or a
ld a,l
ld l,h
ld de,64
ld h,d
ld b,8
sqrt0
sbc hl,de
jr nc,$+3
add hl,de
ccf
rl d
add a,a
adc hl,hl
add a,a
adc hl,hl
djnz sqrt0
ret
if 1==0
;hl * de (signed = unsigned)
;out: hl
_MUL.
ld a,h
ld c,l
ld hl,0
ld b,16
_MUL0.
add hl,hl
rl c
rla
jr nc,$+3
add hl,de
djnz _MUL0.
ret
endif
if 1==0
;hl, de * bc, ix
;out: hl(high), de(low)
_MULLONG.
;EXPORT _MULLONG.
;signed mul is equal to unsigned mul
;hlde*bcix = hlde*b000 + hlde*c00 + hlde*i0 + hlde*x
ld a,lx
push af ;lx
push ix ;hx
ld a,c
push af ;c
ld a,b
;bcde <= hlde:
ld b,h
ld c,l
;hlix <= 0
ld hl,0
;ld ix,0
push hl
pop ix
call _MULLONGP. ;hlix = (hlix<<8) + "b*hlde"
pop af ;c
call _MULLONGP. ;hlix = (hlix<<8) + "c*hlde"
pop af ;hx
call _MULLONGP. ;hlix = (hlix<<8) + "hx*hlde"
pop af ;lx
call _MULLONGP. ;hlix = (hlix<<8) + "lx*hlde"
push ix
pop de
ret
;hlix = (hlix<<8) + a*bcde
_MULLONGP.
exx
ld b,8
_MULLONG0.
exx
add ix,ix
adc hl,hl
rla
jr nc,$+2+2+2
add ix,de
adc hl,bc
exx
djnz _MULLONG0. ;ьюцэю яю a==0 (яхЁт√щ тїюф ё scf:rla, фрыхх add a,a)
exx
ret
endif
SAVEDATA
level
db 0
verticesneeded
db 10
nvertices
db 0
nvertices1
db 0
nvertices2
db 0
vertlinkflags
vertlist1
ds MAXVERTICES
vertlist2
ds MAXVERTICES
vertices
;x,X,y,Y
ds MAXVERTICES*4
edges
;vertex1,vertex2,crossed
ds MAXEDGES*3
nedges
dw 0
;ncrossededges
; dw 0
cur_h
db 0
cur_m
db 0
cur_s
db 0
cur_f
db 0
tlevel
db "LEVEL 00"
tleveldig1=$-2
tleveldig2=$-1
db " TIME 00:00:00"
ttimeh1=$-8
ttimeh2=$-7
ttimem1=$-5
ttimem2=$-4
ttimes1=$-2
ttimes2=$-1
nextlevelon=$ ;¤ЄюЄ Їыру эрфю ёюїЁрэ Є№
db 0
db "NEXT LEVEL"
db 0
SAVEDATAsz=$-SAVEDATA
macro SHAPESPROC name
name
endm
ZONE_NO=0
ZONE_TOP=1
ZONE_LEFT=2
ZONE_RIGHT=3
ZONE_WORK=4
ZONE_PAL=5
ZONE_NAVIGATOR=6
TOOL_WINDOW=0
TOOL_PENCIL=1
TOOL_BRUSH=2
TOOL_LINE=3
TOOL_FILL=4
TOOL_TEXT=5
NTOOLS=6
prarr_zone
db 0
curtool1
db 0
sprringon_l
;mask,pixels = #ppmm
;%rlrrrlll
db 4
dw #00ff,#3847,#07b8,#07b8,#07b8,#3847,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #07b8,#3847,#00ff,#00ff,#00ff,#3847,#07b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #00ff,#00ff,#07b8,#07b8,#07b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
sprringon_r
;mask,pixels = #ppmm
;%rlrrrlll
db 4
dw #00ff,#00ff,#3847,#3847,#3847,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #3847,#07b8,#00ff,#00ff,#00ff,#07b8,#3847,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #00ff,#07b8,#3847,#3847,#3847,#07b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
sprringoff_l
;mask,pixels = #ppmm
;%rlrrrlll
db 4
dw #00ff,#0047,#00b8,#00b8,#00b8,#0047,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #0000,#00ff,#00ff,#00ff,#00ff,#00ff,#0000,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #00b8,#0047,#00ff,#00ff,#00ff,#0047,#00b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #00ff,#00ff,#00b8,#00b8,#00b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
sprringoff_r
;mask,pixels = #ppmm
;%rlrrrlll
db 4
dw #00ff,#00ff,#0047,#0047,#0047,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #0047,#00b8,#00ff,#00ff,#00ff,#00b8,#0047,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #0000,#00ff,#00ff,#00ff,#00ff,#00ff,#0000,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
dw #00ff,#00b8,#0047,#0047,#0047,#00b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
include "prarrow.asm"
include "control.asm"
end
display "End=",end
;display "Free after end=",/d,#c000-end
display "Size ",/d,end-begin," bytes"
savebin "untangle.com",begin,end-begin
;LABELSLIST "..\us\user.l"