debug=0

;lispstack=#6100

IMVEC=#8000;#be00
IMSTACK=#8140;#bf40
ON_INT=#8181;#bfbf
STACK=ON_INT

basetime=192
endtime=-1;(5*192)

timer=23728

bright=64

rebyte=#e000
endmem=rebyte

chmap=#d020
chmhgt=64
chmwid=64

scrtop=#4080
attrtop=#5880

mctop=#5880
mchgt=16 ;chmhgt/2

c0=#00
c1=#44
c2=#66
c3=#ee
c4=#ff
;c0=%00000000
;c1=%00010001
;c2=%00110011
;c3=%01110111
;c4=%11111111


TWOAXES=1
sz=5;31;70 ;NU для куба, рассматривается просто как положительное значение

xbase=#40;#c0 ;todo #80 (только при scrbuf=#d000+: scf:rr h:sra h)
ybase=#e0;#c0 ;#80 удобнее сравнивать (по CY - можно высоты >128) ;при #80+(scrhgt/2) проблема с переполнением в большую сторону - линии не туда

DIVCHECKOVERFLOW=1 ;1=проверка переполнения за двойной экран (если не проверять, то рандомный результат вне экрана (нас устраивает), но при делении через квадраты вообще рандомный результат (нас не устраивает)) ;2=урезание делимого до DIVMAX
;DIVMAX=#49;#40 заметно; #50 еле заметно; #70 незаметно ;#a0 надо по теории для 7.5/6.5
_rangeshiftsz=6
rangeshiftmax=4
MATRIXDIV2=1
MINZ=#1e ;#16..#18 (редкие пропадания на половинных гранях) ;#1e (нет пропаданий на половинных гранях) ;#30 (в теории для кубика с единичными гранями)
;SORTLEVELS=128 ;256 (разница 8000t только за счёт количества и 3000t ещё за счёт терминатора)



	device pentagon1024

	org #6100
begin
	xor a
	out (#fe),a
	ld (#5d10),a ;иначе не работает лоадер
	ld (iy+1),#cc
	;ld sp,STACK

	;ld hl,module
	;call pt3player.INIT

	;ld hl,wasimer
	;ld de,ON_INT
	;ld bc,szimer
	;ldir
	if IMVEC==#3bff
           ;LD hl,#c9fb
           ;LD (#fff4),hl
	   ld a,#c3
	   ld (#fff4),a
           ld hl,ON_INT
           ld (#fff5),hl
	   ld a,#18
	   ld (#ffff),a
	ld a,IMVEC/256
	else
           ;ld hl,ON_INT
           ;ld (IMVEC+255),hl
	ld hl,IMVEC
	ld a,h
	ld d,ON_INT/256
	ld (hl),d
	inc l
	jr nz,$-2
	inc h
	ld (hl),d
	endif
	ld i,a

        ld hl,wasrebyte+8191
        ld de,rebyte+8191
        ld bc,8192
        lddr
        
        ;call loader
        ;ld a,#10
        ;call setpg
        
;init

	ld hl,#5800
	ld de,#5801
	ld (hl),7+bright
	ld bc,767
	ldir ;зачерняем, чтобы не было кривых атрибутов

	ld hl,#4000
	ld de,#4001
        ld bc,#17ff
        ld (hl),l;#ff
        ldir
        
	halt
       
	im 2
	ei 
	jp maingo

loader
        ld hl,tfiles
        ld e,#50
loader0
        ld a,(hl)
        or a
        ret z
        ld a,e
        call setpg
        call loadpage
        inc e
        ld a,e
        cp #58
        jr nz,$+4
        ld e,#d0
        jr loader0
loadpage
        push de
        ld de,#5cdd
        ld bc,9
        ldir
        push hl
        ld c,#a ;find
        call #3d13
        ld a,c
        ld c,#8 ;load descr
        call #3d13
        xor a
        ld (23801),a ;?
        ld hl,#c000
        ld de,(#5ce8)
        ld a,3
        ld c,#e
        call #3d13
        pop hl
        pop de
        ret
tfiles
        db "frame0  f"
        db "frame1  f"
        db "frame2  f"
        db "frame3  f"
        db "frame4  f"
        db "frame5  f"
        db "frame6  f"
        db "frame7  f"
        db "frame8  f"
        db "frame9  f"
        db "frame10 f"
        db "frame11 f"
        db "frame12 f"
        db "frame13 f"
        db "frame14 f"
        db "frame15 f"
        db 0
        
	include "pt3play.asm"
module
	incbin "testmusic.pt3"

        
;=====================================
	ds ON_INT-$
	;org #8000
wasimer
	disp ON_INT
	ld (imstack),sp
        ex (sp),hl
        ld (imjp),hl
        pop hl
        push bc
	ld sp,IMSTACK
	push af
	;push bc
	push de
	push hl
	
        exx
        push bc
        push de
        push hl
        
	push ix
	ex af,af'
	push af
	push iy

	ld hl,(timer)
	inc hl
	ld (timer),hl
        ;xor a:xor a
        bit 0,l
intcall1=$+1
        call z,reter;multicolor
intcall2=$+1
	call reter;pt3player.PLAY
        
	 ld iy,23610
	 rst #38
	
timersec=$+1
	ld a,50
	dec a
	jr nz,timernsec
	;call showfps
	ld a,50
timernsec
	ld (timersec),a

	pop iy
	pop af
	ex af,af'
	pop ix

        pop hl
        pop de
        pop bc
        exx
        
	pop hl
	pop de
	;pop bc
	pop af
imstack=$+1
	ld sp,0
        pop bc
	ei
imjp=$+1
	jp 0
;timer
	;dw 0
	ent
szimer=$-wasimer

fillline
        ld b,#20
        push hl
        ld (hl),a
        inc hl
        djnz $-2
        pop hl
        inc h
        ld a,h
        and 7
        ret nz
        ld a,l
        add a,32
        ld l,a
        ret c
        ld a,h
        sub 8
        ld h,a
        ret

maingo

        ld hl,#6000
        ld e,192/3
rgb0
        ld a,#42
        call fillline
        ld a,#44
        call fillline
        ld a,#41
        call fillline
        dec e
        jr nz,rgb0
        
        ld bc,#eff7
        ld a,#20 ;hardware multicolor
        ;out (c),a
        
	ei
	halt
	
        ;ld hl,pt3player.PLAY
        ;ld (intcall2),hl

	ld hl,(timer)
	ld (oldtimer),hl
maingostart
        ld e,#50
maingo0
        ;ld a,e
        ;call setpg
        push de
        ;halt
        ld hl,#c000
        ld de,#4000
        ld bc,256*(#c0+#18)
ldir0
        dup 32
        ;ldi
        edup
        djnz ldir0
        
        call drawnoise
        
        pop de
        inc e
        ld a,e
        cp #58
        jr nz,$+4
        ld e,#d0
        cp #d8
        jr nz,maingo0
        jp maingostart

mainloop
        ;halt
        
        ld hl,framesdrawn
        inc (hl)
        
	ld hl,(timer)
oldtimer=$+1
	ld de,0
	ld (oldtimer),hl
	or a
	sbc hl,de
	jp z,mainloop
	ld b,l
	;call moveall
	djnz $-3
	ld hl,(timer)
	ld de,endtime-28;20
	ld (oldtimer),hl
	or a
	sbc hl,de
	jp c,mainloop
quit

        jp $

reter
        ret

tachunk
        db 0x7, 0xe, 0x2, 0xa
        db 0x9, 0x0, 0xc, 0x4
        db 0xd, 0xb, 0x6, 0x1
        db 0x3, 0x5, 0x8, 0xf
        db 0
        
drawnoise
        ;di
        ld (drawnoisesp),sp
        ld sp,repic
curachunk=$+1
        ld hl,tachunk
        ld a,(hl)
        or a
        jr nz,$+2+3+1
         ld hl,tachunk
         ld a,(hl)
        inc hl
        ld (curachunk),hl
        add a,a
        add a,rebyte/256
        ld h,a ;rebyte/256 ;+512*(4*y + x)
        ld lx,192
drawnoise0
        dup 32/2
        pop bc ;4pix + 4pix
        ld l,c
        ld a,(hl) ;%abcd0000
        inc h
        ld l,b
        or (hl)   ;%0000efgh
        ld (de),a
        inc e
        pop bc ;4pix + 4pix
        ld l,b
        ld a,(hl) ;%0000efgh
        dec h
        ld l,c
        or (hl)   ;%abcd0000
        ld (de),a
        inc e
        edup
        org $-1
        ld a,e
        sub 31
        ld e,a
        ld a,h
        add a,4*2
        or rebyte/256
        ;cp rebyte/256+16
        ;jr c,$+4
        ;sub 16
        ld h,a
        inc d
        ld a,d
        and 7
        jp nz,drawnoisenchr
        ld a,e
        sub -32
        ld e,a
        sbc a,a
        and -8
        add a,d
        ld d,a
drawnoisenchr
        dec lx
        jp nz,drawnoise0
drawnoisesp=$+1
        ld sp,0
        ret
       
showfps
	ld a,(framesdrawn)
	push de
	ld de,#4000
	ld bc,10-256
	inc b
	sub c
	jr nc,$-2
	add a,c
	ld c,a
	ld a,b
	call showdig
	ld a,c
	call showdig
         ;ld a,0x0d
         ;call _ttyputa
	pop de
	xor a
	ld (framesdrawn),a
	ret
showdig
	add a,"0"
         ;jp _ttyputa
showchar
	push de
	add a,a
	ld h,15
	ld l,a
	add hl,hl
	add hl,hl
	ld b,8
showdig0
	ld a,(hl)
	ld (de),a
	inc l
	inc d
	djnz showdig0
	pop de
	inc e
	ret
framesdrawn
	db 0

_tables=#8000;endfree
	macro BEGIN256 size
_codes=$
	org _tables-size
	.ALIGN 256
_tables=$
	endm
	macro END256
	org _codes
	endm

setpg
        push bc
        ld (#5b5c),a
        ld bc,#7ffd
        out (c),a
        pop bc
        ret
        
        ;INCLUDE "listh.asm"
        
        dw 0 ;для стека
repic
        incbin "repic"
        ;align 8192
wasrebyte
        incbin "rebyte"

activeend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

end

	display "End=",end
	display "Free after end=",/d,endmem-end
	display "Size ",/d,end-begin," bytes"
	
	savebin "code.c",begin,end-begin
	
	LABELSLIST "..\us\user.l"
