Login

Subversion Repositories NedoOS

Rev

Rev 960 | Rev 1497 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

        DEVICE ZXSPECTRUM128
        include "../../_sdk/sys_h.asm"

BINADDR=0x4000

        ;include "../_sdk/target.asm"

;MEM_SLOT0=#37f7
;MEM_SLOT1=#77f7
;MEM_SLOT2=#b7f7
;MEM_SLOT3=#f7f7

INVMASK=#ff

        ;include "_temp_/pages.asm"
;NUMBER_OF_PAGES=10

scrbase=0x4000
sprmaxwid=32
sprmaxhgt=32
scrwid=160 ;double pixels
scrhgt=200
clswid=40 ;*8
clshgt=200

STACK=0x3f80
tempsp=0x3f86 ;6 bytes for prspr
INTSTACK=0x4000


SND_PAGE=0;(0^INVMASK)
SPTBL_PAGE=1;(6^INVMASK)
PAL_PAGE=0;2;(4^INVMASK)

SPBUF_PAGE0=3;(8^INVMASK)
SPBUF_PAGE1=4;(9^INVMASK)
SPBUF_PAGE2=5;(10^INVMASK)
SPBUF_PAGE3=6;(11^INVMASK)

;CC_PAGE0=(12^INVMASK)
CC_PAGE1=7;(13^INVMASK)
CC_PAGE2=8;(14^INVMASK)
CC_PAGE3=9;(12^INVMASK)

GFX_PAGE=10;(16^INVMASK) ;и далее

;IMG_LIST =0xd000;#1000

;смещения в SND_PAGE

AFX_INIT =#4000
AFX_PLAY =#4003
AFX_FRAME=#4006
PT3_INIT =#4009
PT3_FRAME=#400c
PT3_MUTE =#400f ;NEW for TFM
TURBOFMON=#4012 ;NEW for TFM

MUS_COUNT=#49fe
SMP_COUNT=#49ff
SFX_COUNT=#5000

MUS_LIST =#4a00
SMP_LIST =#4d00
SFX_DATA =#5100

;------------------------ addition
uvscroll_scrbase=0x4000
uvscroll_pushbase=0x8000
uvscroll_callbase=0xc000

UVSCROLL_WID=1024
UVSCROLL_HGT=512
TILEMAPWID=42 ;целые метатайлы
TILEMAPHGT=24 ;целые метатайлы
UVSCROLL_SCRWID=320 ;8*(TILEMAPWID-2)
UVSCROLL_SCRHGT=200;192-16 ;(делится на 16!!!) ;8*(TILEMAPHGT-2) ;чтобы выводить всегда 12 метатайлов (3 блока по 8) по высоте
UVSCROLL_NPUSHES=UVSCROLL_WID/2/4/2
UVSCROLL_SCRNPUSHES=UVSCROLL_SCRWID/2/4/2

UVSCROLL_SCRSTART=uvscroll_scrbase+((UVSCROLL_SCRHGT-1)*40)
UVSCROLL_LINESTEP=-40

UVSCROLL_NCALLPGS=4

UVSCROLL_TEMPSP=tempsp

METATILEMAPWID=256;64
METATILEMAPHGT=64
TILEGFX=0xc000

DELETEDYHIGH=0x7f

pushbase=0x8000;c000
        macro SETPGPUSHBASE
         ;ld (curpgc000),a
         ;SETPG32KHIGH
        ;ld (curpg8000),a
        SETPG32KLOW
        endm

        macro RECODEBYTE
        ld a,(de)
        ld ($+4),a
        ld a,(trecodebyteright)
        ld c,a
        dec de
        ld a,(de)
        dec de
        ld ($+4),a
        ld a,(trecodebyteleft)
        or c
        endm        




;---------------------------------

        macro MDebug color
        push af
        ld a,color
        out (#fe),a
        pop af
        endm

        macro MSetShadowScreen
        ;ld a,(_screenActive)
        ;SETPG16K
        ;sub 4
        ;SETPG32KLOW
        call setpgsscr40008000
        ;call setpgsscr40008000_current
        endm

        macro MRestoreMemMap012
;TODO переделать на (pgmain4000) и т.п. (сейчас с пересчётом по таблице)
        ;ld bc,MEM_SLOT3
        ld a,CC_PAGE3
        ;out (c),a
        call setpgc000;SETPG32KHIGH

        ;ld b,high MEM_SLOT1
        ld a,CC_PAGE1
        ;ld (_memSlot1),a
        ;out (c),a
        call setpg4000;SETPG16K

        ;ld b,high MEM_SLOT2
        ld a,CC_PAGE2
        ;ld (_memSlot2),a
        ;out (c),a
        call setpg8000;SETPG32KLOW
        endm

        macro MRestoreMemMap12
        ;ld bc,MEM_SLOT1
        ld a,CC_PAGE1
        ;ld (_memSlot1),a
        ;out (c),a
        call setpg4000;SETPG16K

        ;ld b,high MEM_SLOT2
        ld a,CC_PAGE2
        ;ld (_memSlot2),a
        ;out (c),a
        call setpg8000;SETPG32KLOW
        endm

        org PROGSTART
begin
        ld sp,STACK

;        ld b,25
;waitcls0
;        push bc
;        YIELD
;        pop bc
;        djnz waitcls0 ;чтобы nv не перехватил фокус при вызове через комстроку

        ld e,0;+128 ;+128=keep
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
        ld e,0
        OS_SETSCREEN
        ld e,0 ;color byte
        OS_CLS
        ld e,1
        OS_SETSCREEN
        ld e,0 ;color byte
        OS_CLS
       
        OS_GETMAINPAGES
;dehl=номера страниц в 0000,4000,8000,c000
        ld a,e
        LD (pgmain4000),A
        ld (tpages+CC_PAGE1),a
        ld a,h
        LD (pgmain8000),A
        ld (tpages+CC_PAGE2),a
        ld a,l
        ;LD (pgmainc000),A
;pgmainc000=$+1
;        ld a,0
        ld (tpages+CC_PAGE3),a

;d=pgmain0000
        call dropotherapps ;OS_HIDEFROMPARENT

        call setpgsmain40008000 ;записать в curpg...

        ;OS_GETSCREENPAGES
;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
        ;ld a,l
        ;ld (setpgs_scr_low),a
        ;xor e
        ;ld (setpgs_scr_scrxor),a
        ;ld a,h
         ;ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
        ;xor l
        ;ld (setpgs_scr_pgxor),a
       
        ld de,res_path
        OS_CHDIR

        ld de,fnaddr
        OS_OPENHANDLE
        push bc
        ld de,jpaddr ;addr
        ld hl,2 ;size
        OS_READHANDLE
        pop bc
        OS_CLOSEHANDLE

        ld hl,sndfilename
        call loadpage ;CY=error
        ld (tpages+0),a
        ld hl,sprtblfilename
        call loadpage ;CY=error
        ld (tpages+1),a
        ld de,palfilename
        ld hl,palettes
        ld bc,12*16
        call loadbinpg_sizebc
        ;call loadpage ;CY=error
        ;ld (tpages+2),a

        call uvscroll_prepare

        ld de,tpages+GFX_PAGE

        ;ld b,NUMBER_OF_PAGES
loadloop0
        ;push bc
        push de
        ld hl,texfilename
        call loadpage ;CY=error
        pop de
       jr c,loadloop0q
        ld (de),a
        inc e
        ld hl,texfilename_pgnumend
loadloop_nextdigit0
        dec hl
        ld a,(hl)
        inc a
        cp "0"+10
        ld (hl),"0"
        jr z,loadloop_nextdigit0
        ld (hl),a
        jr loadloop0
        ;pop bc
        ;djnz loadloop0
loadloop0q
       
       if 0 ;для touhou не нужен буфер фона
        ld hl,tpages+SPBUF_PAGE0
        ld b,4
mkpages0
        push bc
        push hl
        OS_NEWPAGE
        pop hl
        ld (hl),e
        inc l
        pop bc
        djnz mkpages0
       endif

        call initsfx

        call swapimer

        if 1==0
        call loadpage
        ld (pgmusic),a
        SETPG4000
        push af
        call 0x4000 ;init
        pop af
        ld hl,0x4005 ;play
        OS_SETMUSIC
        endif
        call setpgsmain40008000
        call RestoreMemMap3
        ld de,fnbin
        ld hl,0x4000
        call loadbinpg
        ld de,fnbin2
        ld hl,0x8000
        call loadbinpg
        ld de,fnbin3
        ld hl,0xc000
        call loadbinpg
       
        ld de,CURPAL
        OS_SETPAL
       ;jp testscrolluv
        call _swap_screen
jpaddr=$+1
        call 0


quit ;TODO
        call swapimer
pgmusic=$+1
        ld a,0
        SETPG4000
        ld hl,0x4008 ;stop
        OS_SETMUSIC
        halt
        QUIT

        ds 0x0200-$
tpages
        ds 256 ;pages

dropotherapps
;d=pgmain0000
;от последних id (детей) к первым (родителям), т.к. при dropapp будится родитель
        ld e,0xfe ;no id 0xff
dropotherapps0
        push de
        OS_GETAPPMAINPAGES ;d,e,h,l=pages in 0000,4000,8000,c000, c=flags ;a!=0: no app
        or a
        ld a,d
        pop de
        jr nz,dropotherapps_skip ;no app
       cp d
       jr z,dropotherapps_skip ;my app
        push de
        ;e=id
        OS_DROPAPP
        pop de
dropotherapps_skip
        dec e
        ld a,e
        dec a ;no id 0 ;id 1 = idle
        jr nz,dropotherapps0
        ret

       if 0
testscrolluv
;UV scroll
        ld de,bgxyfilename
        call uvscroll_preparebmp
         ;call uvscroll_preparetiles
;TODO обновить allscroll
;allscroll=yscroll*(UVSCROLL_WID/512)+xscroll
       if 0
        ld hl,-160 ;top left
        ld (cameraym),hl
        ld de,1024-160 ;top left
        add hl,de
        ld (yscroll),hl
       
        ld hl,-160 ;top left
        ld (cameraxm),hl
        ld de,2048-160 ;top left
        add hl,de
        ld (x2scroll),hl
       endif

         ;call uvscroll_preparetilemap

        ;call importcoords
        ;ld iy,bullets
        ;call genbullet_terminate

        ;ld de,pal
        ;OS_SETPAL
mainloop_uv0

        call uvscroll_draw ;367574/391621
        call setpgsmain40008000
       
        ;call mousetrackcamera
;d=camera dy
;e=camera dx
;l=mousekey
        ;call uvscroll_scroll

cury=$+1
        ld hl,0
        inc hl
        ld (cury),hl
        ld de,0
;hl=y
;de=x
        call uvscroll_setscroll

       
       ld a,(_time)
       push af
        call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
mainloop_uvwaittimer0
        ld a,(_time)
uvoldtimer=$+1
        ld b,0
        ld (uvoldtimer),a
        sub b
        ld b,a
        jr z,mainloop_uvwaittimer0
mainloop_uvlogic0
        push bc
        ;call logic
        pop bc
        djnz mainloop_uvlogic0

;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
       pop bc ;b=timer на момент changescrpg
waitchangescr0
        ld a,(_time)
        cp b
        jr z,waitchangescr0

        jp mainloop_uv0

        ret
     
cameraxm
        dw 0
cameraym
        dw 0

     
mousetrackcamera
       ld hl,(curmouse)
oldmouse=$+1
       ld de,0
       ld (oldmouse),hl
       ld a,h
       sub d
       ld d,a
       ld a,l
       sub e
       ld e,a
;de=delta (d>0: go up) (e>0: go left)
;out: d=camera dy, e=camera dx
        ld hl,(cameraxm)
        ld c,e
        ld a,c
        rla
        sbc a,a
        ld b,a
        add hl,bc
        ld (cameraxm),hl
        ld hl,(cameraym)
        ld c,d
        ld a,c
        rla
        sbc a,a
        ld b,a
        add hl,bc
        ld (cameraym),hl
        ret

       
bgxyfilename
        db "bg1-16.bmp",0
       endif

initsfx
        ;определение TS
        ld bc,#fffd     ;чип 0
        out (c),b
        xor a           ;регистр 0
        out (c),a
        ld b,#bf        ;значение #bf
        out (c),b
        ld b,#ff        ;чип 1
        ld a,#fe
        out (c),a
        xor a           ;регистр 0
        out (c),a
        ld b,#bf        ;значение 0
        out (c),a
        ld b,#ff        ;чип 0
        out (c),b
        xor a           ;регистр 0
        out (c),a
        in a,(c)
        ld (turboSound),a
        ld a,SND_PAGE
        call setpg4000
        xor a
        call reset_ay_ay
        inc a
        call reset_ay_ay
        ld hl,SFX_DATA
        jp AFX_INIT

       if 1==0

testscroll0
        call bgpush_draw ;359975t

        ;ld de,spritesA+1
        ;call preparedrawsprites
        ;dec de
        ;ld (drawsprites_data),de
        ;call drawsprites
       
       ld a,(_time)
       push af
        call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
       
mainloopwaittimer0
        ld a,(_time)
oldtimer=$+1
        ld b,0
        ld (oldtimer),a
        sub b
        ld b,a
        jr z,mainloopwaittimer0
mainlooplogic0
        push bc
        ;call logic
        pop bc
        djnz mainlooplogic0
       
;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
       pop bc ;b=timer на момент changescrpg
waitchangescr1
        ld a,(_time)
        cp b
        jr z,waitchangescr1
       
;waitkey
        ;halt ;в играх не юзаем YIELD, иначе может сработать чужой обработчик прерываний
        ;ld a,(curkey)
        ;cp key_esc
        jp testscroll0
        ret

        endif


loadbinpg
        ld bc,0x4000
loadbinpg_sizebc
;de=filename
;hl=addr
;bc=size
        push hl
       push bc
        OS_OPENHANDLE
       pop hl ;size
        pop de ;addr
        push bc
        ;ld hl,-BINADDR ;size
        OS_READHANDLE
        pop bc
        OS_CLOSEHANDLE                
        ret

loadpage
;заказывает страничку и грузит туда файл (имя файла в hl)
;out: hl=после имени файла, a=pg
;or else CY
        push hl
        ex de,hl
        OS_OPENHANDLE
        pop hl
        or a
        scf
        ret nz
        push hl
       push bc
        OS_NEWPAGE
        or a
        jr nz,$
       pop bc
        pop hl
        ld a,e
        push af ;pg
       push bc
        SETPGC000
       pop bc
        push hl
        ex de,hl
        ;OS_OPENHANDLE
        push bc
        ld de,0xc000 ;addr
        ld hl,0x4000 ;size
        OS_READHANDLE
        pop bc
        OS_CLOSEHANDLE                
        pop hl
        ld b,1
        xor a
        cpir ;after 0
        pop af ;pg
        or a ;CY=0
        ret

CURPAL
pal
;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
        dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
        dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
;RSTPAL
;        STANDARDPAL

sndfilename
        db "page_0.bin",0
sprtblfilename
        db "page_1.bin",0
palfilename
        db "page_2.bin",0

texfilename
texfilename_pgnumend=$+7;8
        db "page_10.bin",0




setpgsmain40008000
pgmain4000=$+1
        ld a,0
        ;ld (curpg4000),a
        SETPG4000
pgmain8000=$+1
        ld a,0
        ;ld (curpg8000),a
        SETPG8000
        ret

setpgsscr40008000_current
        call getuser_scr_low_cur
        ;ld (curpg4000),a ;TODO kill
        SETPG4000
        call getuser_scr_high_cur
        ;ld (curpg8000),a ;TODO kill
        SETPG8000
        ret

setpgsscr40008000
        call getuser_scr_low
        ;ld (curpg4000),a ;TODO kill
        SETPG4000
        call getuser_scr_high
        ;ld (curpg8000),a ;TODO kill
        SETPG8000
        ret

setpgscrlow4000
        call getuser_scr_low
        SETPG4000
        ret

setpgscrhigh4000
        call getuser_scr_high
        SETPG4000
        ret

getuser_scr_low
getuser_scr_low_patch=$+1
getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
        ld a,(user_scr1_low) ;ok
        ret

getuser_scr_high
getuser_scr_high_patch=$+1
getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
        ld a,(user_scr1_high) ;ok
        ret

getuser_scr_low_cur
getuser_scr_low_cur_patch=$+1
getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
        ld a,(user_scr0_low) ;ok
        ret

getuser_scr_high_cur
getuser_scr_high_cur_patch=$+1
getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
        ld a,(user_scr0_high) ;ok
        ret

changescrpg_current
;        ld a,(setpgs_scr_low)
;setpgs_scr_scrxor=$+1
;        xor 0
;        ld (setpgs_scr_low),a
        ld hl,getuser_scr_low_patch
        ld a,(hl)
        xor getuser_scr_low_patchN
        ld (hl),a
        ld hl,getuser_scr_high_patch
        ld a,(hl)
        xor getuser_scr_high_patchN
        ld (hl),a
        ld hl,getuser_scr_low_cur_patch
        ld a,(hl)
        xor getuser_scr_low_cur_patchN
        ld (hl),a
        ld hl,getuser_scr_high_cur_patch
        ld a,(hl)
        xor getuser_scr_high_cur_patchN
        ld (hl),a

        ld a,1
curscrnum=$+1
        xor 0
        ld ($-1),a
        ret
       
changescrpg
;TODO убрать
        call changescrpg_current
        ;ld (curscrnum_physical),a
        ld e,a
        OS_SETSCREEN
        ret

setpg4000
        ;ld ($+4),a
        ;ld a,(tpages) ;нереентерабельно!
        ld b,tpages/256
        ld c,a
        ld a,(bc)
        SETPG16K
        ret

setpg8000
        ;ld ($+4),a
        ;ld a,(tpages) ;нереентерабельно!
        ld b,tpages/256
        ld c,a
        ld a,(bc)
        SETPG32KLOW
        ret

setpgc000
        ;ld ($+4),a
        ;ld a,(tpages) ;нереентерабельно!
        ld b,tpages/256
        ld c,a
        ld a,(bc)
        SETPG32KHIGH
        ret

setShadowScreen
        MSetShadowScreen
        ret

_clear_screen
        and 15
        ld l,a
        ld h,high colorMaskTable
        ld e,(hl)
        call setShadowScreen
        ld hl,#4000
        ld (hl),e
        ld de,#4001
        ld bc,#7fff
        call _fast_ldir
RestoreMemMap12
        MRestoreMemMap12
        ret

_swap_screen
        push ix
        ;push iy

        ld a,(spritesActive)
        or a
        push af
        jr z,.noSpr0
        call setShadowScreen
       ;TODO draw changed tiles to another screen (or copy them screen to screen)
       call getuser_scr_low_cur
       SETPGC000
       ld hl,0x4000
       ld de,0xc000
       ld bc,0x4000
       ldir
       call getuser_scr_high_cur
       SETPGC000
       ld hl,0x8000
       ld de,0xc000
       ld bc,0x4000
       ldir
        ;call updateTilesToBuffer
        ;call prspr
.noSpr0

        halt

        ld a,(_screenActive)
        xor 2
        ld (_screenActive),a ;for select sprqueue
        ;ld e,a

        ;ld a,#10
        ;bit 1,e
        ;jr z,$+4
        ;or #08
        ;ld bc,#7ffd
        ;out (c),a
         call changescrpg
         ;rra
         ;and 1 ;+cpl?
         ;ld e,a
         ;OS_SETSCREEN

        pop af
        jr z,.noSpr1

        ;call setShadowScreen
        ;call respr ;remove only for touhou
        ;call updateTilesFromBuffer
        ;MRestoreMemMap012
        call RestoreMemMap3;0
        call RestoreMemMap12
.noSpr1
        ;pop iy
        pop ix
        ret

_swap_screen_scroll
        push ix
        ;push iy

        ld a,(spritesActive)
        or a
        push af
        jr z,.noSpr0
        call setShadowScreen
        ;call updateTilesToBuffer
        call prspr
.noSpr0

        halt

        ld a,(_screenActive)
        xor 2
        ld (_screenActive),a ;for select sprqueue
        ;ld e,a

        ;ld a,#10
        ;bit 1,e
        ;jr z,$+4
        ;or #08
        ;ld bc,#7ffd
        ;out (c),a
         call changescrpg
         ;rra
         ;and 1 ;+cpl?
         ;ld e,a
         ;OS_SETSCREEN

        pop af
        jr z,.noSpr1

        call setShadowScreen
        ;call respr
        ;call updateTilesFromBuffer
        ;MRestoreMemMap012
        call RestoreMemMap3;0
        call RestoreMemMap12
.noSpr1
        ;pop iy
        pop ix
        ret

pal_get_address
        ld h,0
        ld l,a
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
         ;set 7,h
         ;set 6,h
       ld de,palettes
       add hl,de

        ;ld a,PAL_PAGE
        ;call setpgc000;SETPG32KHIGH
        ret

palettes
        ds 12*16
IMG_LIST ;was in PAL_PAGE +0x1000 ;1 image: font
        db 0
        db 0
        db 0x10
        db 0x10

_pal_select
        call pal_get_address

        ld de,_palette
        ld bc,16
        ldir

        ld a,d
        ld (_palChange),a
RestoreMemMap3;0
        ;ld bc,MEM_SLOT0
        ld a,CC_PAGE3;0
        ;out (c),a
        call setpgc000;SETPG32KHIGH
        ret



_pal_bright
        cp 7
        jr c,.l1
        ld a,6
.l1
        ld h,a
        ld l,0
        srl h
        rr l
        srl h
        rr l
        ld (_palBright),hl
        ld a,1
        ld (_palChange),a
        ret



_pal_copy
        push de
        call pal_get_address

        ld de,palTemp
        ld bc,16
        ldir

        ;ld bc,MEM_SLOT0
        ld a,CC_PAGE3;0
        ;out (c),a
        call setpgc000;SETPG32KHIGH

        pop de
        ld hl,palTemp
        ld bc,16
        ldir

        ret



;более быстрая версия ldir, эффективна при bc>12
;из статьи на MSX Assembly Page
;в отличие от нормального ldir портит A и флаги

_fast_ldir
DOSorTFM=0
        ifdef DOS
DOSorTFM=1
        endif
        ifdef TFM
DOSorTFM=1
        endif
       
        if DOSorTFM
        ldir
        ret
        else

        xor a
        sub c
        and 63
        add a,a
        ld (.jump),a
.jump=$+1
        jr nz,.loop
.loop
        dup 64
        ldi
        edup
        jp pe,.loop
        ret

        endif ;~DOSorTFM

        align 256       ;#nn00
tileUpdateXTable
        dup 8
        db #01,#02,#04,#08,#10,#20,#40,#80
        edup
.x=0
        dup 64
        db .x>>3
.x=.x+1
        edup


        align 256       ;#nn00
colorMaskTable
        db #00,#09,#12,#1b,#24,#2d,#36,#3f      ;для двух пикселей
        db #c0,#c9,#d2,#db,#e4,#ed,#f6,#ff
        db #00,#01,#02,#03,#04,#05,#06,#07      ;для ink
        db #40,#41,#42,#43,#44,#45,#46,#47
        ds 16,0
        db #00,#08,#10,#18,#20,#28,#30,#38      ;для paper
        db #80,#88,#90,#98,#a0,#a8,#b0,#b8


        align 256
_sprqueue
_sprqueue0      ;формат 4 байта на спрайт, idh,idl,y,x (idh=255 конец списка)
        ds 256,255
_sprqueue1
        ds 256,255

        align 256
palBrightTable
        db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff      ;bright 0
        db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
        db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
        db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
        db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f      ;bright 1
        db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
        db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
        db #df,#df,#df,#9f,#df,#df,#df,#9f,#df,#df,#df,#9f,#5f,#5f,#5f,#1f
        db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed      ;bright 2
        db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed
        db #df,#df,#9f,#dd,#df,#df,#9f,#dd,#5f,#5f,#1f,#5d,#cf,#cf,#8f,#cd
        db #fe,#fe,#be,#fc,#fe,#fe,#be,#fc,#7e,#7e,#3e,#7c,#ee,#ee,#ae,#ec
        db #ff,#bf,#fd,#bd,#7f,#3f,#7d,#3d,#ef,#af,#ed,#ad,#6f,#2f,#6d,#2d      ;bright 3
        db #df,#9f,#dd,#9d,#5f,#1f,#5d,#1d,#cf,#8f,#cd,#8d,#4f,#0f,#4d,#0d
        db #fe,#be,#fc,#bc,#7e,#3e,#7c,#3c,#ee,#ae,#ec,#ac,#6e,#2e,#6c,#2c
        db #de,#9e,#dc,#9c,#5e,#1e,#5c,#1c,#ce,#8e,#cc,#8c,#4e,#0e,#4c,#0c
        db #1f,#5d,#1d,#1d,#8f,#cd,#8d,#8d,#0f,#4d,#0d,#0d,#0f,#4d,#0d,#0d      ;bright 4
        db #3e,#7c,#3c,#3c,#ae,#ec,#ac,#ac,#2e,#6c,#2c,#2c,#2e,#6c,#2c,#2c
        db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
        db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
        db #ec,#ac,#ac,#ac,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c      ;bright 5
        db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
        db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
        db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
        db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c      ;bright 6
        db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
        db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
        db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c

        align 256       ;#nn00
scrTable
adr=#4000
        dup 25
        db low adr
adr=adr+(40*8)
        edup
        align 32        ;#nn20
adr=#4000
        dup 25
        db high adr
adr=adr+(40*8)
        edup

        align 256       ;#nn00
tileUpdateMap   ;битовая карта обновившихся знакомест, 64x25 бит
        ds 8*25,0

        ;export changescrpg

        export _pal_select
        export _pal_copy
        export _pal_bright
        export _swap_screen
        export _swap_screen_scroll
        export _clear_screen
        export _fast_ldir

        include "../_sdk/lib_int.asm"
        include "../_sdk/lib_tiles.asm"
        export _draw_tile
        export _draw_image
        export _select_image
        export _draw_tile_key
        export _color_key

        include "../_sdk/lib_sprites.asm"
        export _sprites_start
        export _sprites_stop

        include "../_sdk/lib_input.asm"

        export _joystick
        export _keyboard
        export _mouse_apply_clip

        include "../../_sdk/file.asm"
        include "bmp.asm"
        include "bgpush.asm"
        include "bgpushxy.asm"
_preparescroll=bgpush_prepare ;de=filename
_incscroll=bgpush_inccurscroll ;bc=scroll (-1)
_drawscroll=bgpush_draw ;359975t
_setscroll=bgpush_setcurscroll ;hl=scroll
_drawscrollxy=uvscroll_draw
_setscrollxy=uvscroll_setscroll
_prepscrollxy=uvscroll_preparebmp ;de=filename
        export _preparescroll
        export _incscroll
        export _drawscroll
        export _drawscrollxy
        export _setscroll
        export _setscrollxy
        export _prepscrollxy

genpush_newpage
;заказывает страницу, заносит в tpushpgs, a=pg
        push bc
        push de
        push hl
        push ix
        OS_NEWPAGE
        pop ix
        ld a,e
        ld (ix),a
        ld de,4
        add ix,de
        pop hl
        pop de
        pop bc
        ret

_sample_play
;проигрывание сэмпла
;l=номер сэмпла
       push ix
        ld a,(curpg32khigh) ;ok
        push af
        ld a,SND_PAGE
        call setpgc000
        ld a,(SMP_COUNT|0xc000)
        ld e,a
        ld a,l
        cp e
        jr nc,.skip

        ld h,high (SMP_LIST|0xc000)
        ld e,(hl)       ;lsb
        inc h
        ld a,(hl)       ;msb
        or 0xc0
        ld d,a
        inc h
        ld a,(hl)       ;page
        cpl
        inc h
        ld h,(hl)       ;delay
        ex de,hl ;hl=data
        ld hx,d ;delay
        ld e,a
        ld d,tpages/256
;hl=data (0xc000+, 0x00=end), de=pagetable (0x0000+), hx=delay (18=11kHz, 7=22kHz, 1=44kHz)
        OS_PLAYCOVOX
.skip
        pop af
        SETPG32KHIGH
       pop ix
        ret

;выключение звука на указанном чипе
;a=0 или 1
reset_ay
;используется в _sfx_stop, _music_stop
        ifdef TFM
        push af
        di

        call turbo_off

        ld a,SND_PAGE
        call setpg4000
        ld a,(TURBOFMON)
        or a
        call nz,#400f;tfmshut
        ld a,CC_PAGE1
        call setpg4000
        pop af
        call reset_ay_ay

        call turbo_on

        ei
        ret

        else

        di
        call reset_ay_ay
        ei
        ret

        endif

        if 1==0
turbo_on
        ld a,%10101000 ;режим EGA с турбо
        ld bc,#bd77
        out (c),a
        ret

turbo_off
        ld a,%10100000 ;режим EGA без турбо, так как в 14 МГц скорость нестабильна
        ld bc,#bd77
        out (c),a
        ret
        endif

reset_ay_ay
;в TFM нужно для глушения AY перед выводом эффектов
        push af
        ifdef TFM
        or %11111000
        ;or %11111010           ;no wait sync
        else
        or #fe
        endif
        ld bc,#fffd
        out (c),a

        xor a
        ld l,a
.l0
        ld b,#ff
        ifdef TFM
        call libstartup_waitstatus
        endif
        out (c),a
        ifdef TFM
        call libstartup_waitstatus
        endif
        ld b,#bf
        out (c),l
        inc a
        cp 14
        jr nz,.l0
        pop af
        ret

;запуск звукового эффекта
_sfx_play
        push bc
        ld a,SND_PAGE
        call setpg4000
        pop bc
        ld a,b
        call AFX_PLAY
        ld a,CC_PAGE1
        jp setpg4000

;останов звуковых эффектов
_sfx_stop
        xor a
        jp reset_ay

;запуск музыки
_music_play
        push ix
        push iy
        push af
        ld a,SND_PAGE
        call setpg4000

        ld a,(MUS_COUNT)
        ld l,a
        pop af

        cp l
        jr nc,.skip

        ld h,high MUS_LIST
        ld l,a

        ld e,(hl)
        inc h
        ld d,(hl)
        inc h
        ld a,(hl)
        ex de,hl
        di
        ld (musicPage),a
        call setpg8000
        ifdef TFM
        ld a,(TURBOFMON)
        or a
        call nz,PT3_INIT
        else
        ld bc,#fffd
        ld a,#fe
        out (c),a
        call PT3_INIT
        endif
        ei
        ld a,CC_PAGE2
        call setpg8000

.skip
        pop iy
        pop ix

        ld a,CC_PAGE1
        jp setpg4000



;выключение музыки
_music_stop
        xor a
        ld (musicPage),a
        jp reset_ay
       
        export _music_play
        export _music_stop
        export _sample_play
        export _sfx_play
        export _sfx_stop


;переменные

musicPage               db 0
tileOffset              dw 0
spritesActive   db 0    ;1 если вывод спрайтов разрешён
tileUpdate              db 0    ;1 если выводились тайлы, для системы обновления фона под спрайтами
palTemp                 ds 16,0
keysPrevState   ds 40,0
        ifdef TFM
;turboFM                        db 0    ;!=0 если есть TFM
        else
turboSound              db 0    ;!=0 если есть TS
        endif

;экспортируемые переменные

        macro rgb222 b2,g2,r2
        db (((r2&3)<<4)|((g2&3)<<2)|(b2&3))
        endm

        align 16
_palette
        rgb222(0,0,0)
        rgb222(0,0,2)
        rgb222(2,0,0)
        rgb222(2,0,2)
        rgb222(0,2,0)
        rgb222(0,2,2)
        rgb222(2,2,0)
        rgb222(2,2,2)
        rgb222(0,0,0)
        rgb222(0,0,3)
        rgb222(3,0,0)
        rgb222(3,0,3)
        rgb222(0,3,0)
        rgb222(0,3,3)
        rgb222(3,3,0)
        rgb222(3,3,3)

;_memSlot1
;curpg4000
;        db 0
;_memSlot2
;curpg8000
;        db 0
;_memSlot3
;curpgc000
;        db 0

_borderCol      db 0
_palBright      dw 3<<6
_palChange      db 1
_screenActive   db 0    ;~1 или ~3
_mouse_dx       db 0
_mouse_dy       db 0
_mouse_x        db 80
_mouse_y        db 100
_mouse_cx1      db 0
_mouse_cx2      db 160
_mouse_cy1      db 0
_mouse_cy2      db 200
_mouse_btn      db 0
_mouse_prev_dx  db 0
_mouse_prev_dy  db 0
_time           dd 0

        export _borderCol
        export _palBright
        export _palChange
        export _sprqueue
        export _screenActive
        export _mouse_dx
        export _mouse_dy
        export _mouse_x
        export _mouse_y
        export _mouse_cx1
        export _mouse_cx2
        export _mouse_cy1
        export _mouse_cy2
        export _mouse_btn
        export _time
        export _palette

tpushpgs
        ds 128 ;первая страница 0 слоя, первая страница 1 слоя, первая страница 2 слоя, первая страница 3 слоя, вторая страница 0 слоя...

        align 256
trecodebyteleft
        dup 256
;%00003210 => %.3...210
_3=$&8
_210=$&7
        db (_3*0x08) + (_210*0x01)
        edup
       
trecodebyteright
        dup 256
;%00003210 => %3.210...
_3=$&8
_210=$&7
        db (_3*0x10) + (_210*0x08)
        edup

;bgpush_bmpbuf=0x4000 ;ds 1024;320 ;заголовок bmp или одна строка
bgpush_bmpbuf ds 1024;320 ;заголовок bmp или одна строка
bgpush_loadbmplinestack=bgpush_bmpbuf+1024 ;ds pushhgt*2+32
       
res_path
;в этом относительном пути будут лежать все загружаемые данные игры
        ;db "nedoload"
        include "_temp_/sets.asm"
        db 0
fnbin
        ;db "code0.bin",0
        db "page_101.bin",0
fnbin2
        db "page_102.bin",0
fnbin3
        db "page_103.bin",0
fnaddr
        db "addr.bin",0
end        

        display "begin=",begin
        display "end=",end
        display "Size ",/d,end-begin," bytes"
       
        savebin "nedoload.com",begin,end-begin
       
        LABELSLIST "..\..\..\us\user.l"