?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. BINADDR=0x4000
  5.  
  6.         ;include "../_sdk/target.asm"
  7.  
  8. ;MEM_SLOT0=#37f7
  9. ;MEM_SLOT1=#77f7
  10. ;MEM_SLOT2=#b7f7
  11. ;MEM_SLOT3=#f7f7
  12.  
  13. INVMASK=#ff
  14.  
  15.         ;include "_temp_/pages.asm"
  16. NUMBER_OF_PAGES=10
  17.  
  18. scrbase=0x4000
  19. sprmaxwid=32
  20. sprmaxhgt=32
  21. scrwid=160 ;double pixels
  22. scrhgt=200
  23. clswid=40 ;*8
  24. clshgt=200
  25.  
  26. STACK=0x4000
  27. tempsp=0x3f06 ;6 bytes for prspr
  28. INTSTACK=0x3f00
  29.  
  30.  
  31. SND_PAGE=0;(0^INVMASK)
  32. SPTBL_PAGE=1;(6^INVMASK)
  33. PAL_PAGE=2;(4^INVMASK)
  34.  
  35. SPBUF_PAGE0=3;(8^INVMASK)
  36. SPBUF_PAGE1=4;(9^INVMASK)
  37. SPBUF_PAGE2=5;(10^INVMASK)
  38. SPBUF_PAGE3=6;(11^INVMASK)
  39.  
  40. ;CC_PAGE0=(12^INVMASK)
  41. CC_PAGE1=7;(13^INVMASK)
  42. CC_PAGE2=8;(14^INVMASK)
  43. CC_PAGE3=9;(12^INVMASK)
  44.  
  45. GFX_PAGE=10;(16^INVMASK) ;и далее
  46.  
  47.  
  48. IMG_LIST =0xd000;#1000
  49.  
  50. ;смещения в SND_PAGE
  51.  
  52. AFX_INIT =#4000
  53. AFX_PLAY =#4003
  54. AFX_FRAME=#4006
  55. PT3_INIT =#4009
  56. PT3_FRAME=#400c
  57. PT3_MUTE =#400f ;NEW for TFM
  58. TURBOFMON=#4012 ;NEW for TFM
  59.  
  60. MUS_COUNT=#49fe
  61. SMP_COUNT=#49ff
  62. SFX_COUNT=#5000
  63.  
  64. MUS_LIST =#4a00
  65. SMP_LIST =#4d00
  66. SFX_DATA =#5100
  67.  
  68.  
  69.  
  70.         macro MDebug color
  71.         push af
  72.         ld a,color
  73.         out (#fe),a
  74.         pop af
  75.         endm
  76.  
  77.         macro MSetShadowScreen
  78.         ;ld a,(_screenActive)
  79.         ;SETPG16K
  80.         ;sub 4
  81.         ;SETPG32KLOW
  82.         call setpgsscr40008000;_current
  83.         endm
  84.  
  85.         macro MRestoreMemMap012
  86. ;TODO переделать на (pgmain4000) и т.п. (сейчас с пересчётом по таблице)
  87.         ;ld bc,MEM_SLOT3
  88.         ld a,CC_PAGE3
  89.         ;out (c),a
  90.         call setpgc000;SETPG32KHIGH
  91.  
  92.         ;ld b,high MEM_SLOT1
  93.         ld a,CC_PAGE1
  94.         ;ld (_memSlot1),a
  95.         ;out (c),a
  96.         call setpg4000;SETPG16K
  97.  
  98.         ;ld b,high MEM_SLOT2
  99.         ld a,CC_PAGE2
  100.         ;ld (_memSlot2),a
  101.         ;out (c),a
  102.         call setpg8000;SETPG32KLOW
  103.         endm
  104.  
  105.         macro MRestoreMemMap12
  106.         ;ld bc,MEM_SLOT1
  107.         ld a,CC_PAGE1
  108.         ;ld (_memSlot1),a
  109.         ;out (c),a
  110.         call setpg4000;SETPG16K
  111.  
  112.         ;ld b,high MEM_SLOT2
  113.         ld a,CC_PAGE2
  114.         ;ld (_memSlot2),a
  115.         ;out (c),a
  116.         call setpg8000;SETPG32KLOW
  117.         endm
  118.  
  119.         org PROGSTART
  120. begin
  121.         ld sp,STACK
  122.         OS_HIDEFROMPARENT
  123.  
  124. ;        ld b,25
  125. ;waitcls0
  126. ;        push bc
  127. ;        YIELD
  128. ;        pop bc
  129. ;        djnz waitcls0 ;чтобы nv не перехватил фокус при вызове через комстроку
  130.  
  131.         ld e,0+128 ;+128=keep
  132.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  133.         ld e,0
  134.         OS_SETSCREEN
  135.         ld e,0 ;color byte
  136.         OS_CLS
  137.         ld e,1
  138.         OS_SETSCREEN
  139.         ld e,0 ;color byte
  140.         OS_CLS
  141.        
  142.         OS_GETMAINPAGES
  143. ;dehl=номера страниц в 0000,4000,8000,c000
  144.         ld a,e
  145.         LD (pgmain4000),A
  146.         ld (tpages+CC_PAGE1),a
  147.         ld a,h
  148.         LD (pgmain8000),A
  149.         ld (tpages+CC_PAGE2),a
  150.         ld a,l
  151.         ;LD (pgmainc000),A
  152. ;pgmainc000=$+1
  153. ;        ld a,0
  154.         ld (tpages+CC_PAGE3),a
  155.         call setpgsmain40008000 ;записать в curpg...
  156.  
  157.         ;OS_GETSCREENPAGES
  158. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  159.         ;ld a,l
  160.         ;ld (setpgs_scr_low),a
  161.         ;xor e
  162.         ;ld (setpgs_scr_scrxor),a
  163.         ;ld a,h
  164.          ;ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
  165.         ;xor l
  166.         ;ld (setpgs_scr_pgxor),a
  167.        
  168.         ld de,res_path
  169.         OS_CHDIR
  170.  
  171.         ld de,fnaddr
  172.         OS_OPENHANDLE
  173.         push bc
  174.         ld de,jpaddr ;addr
  175.         ld hl,2 ;size
  176.         OS_READHANDLE
  177.         pop bc
  178.         OS_CLOSEHANDLE
  179.  
  180.         ld hl,sndfilename
  181.         call loadpage ;CY=error
  182.         ld (tpages+0),a
  183.         ld hl,sprtblfilename
  184.         call loadpage ;CY=error
  185.         ld (tpages+1),a
  186.         ld hl,palfilename
  187.         call loadpage ;CY=error
  188.         ld (tpages+2),a
  189.  
  190.         ld de,tpages+GFX_PAGE
  191.  
  192.         ;ld b,NUMBER_OF_PAGES
  193. loadloop0
  194.         ;push bc
  195.         push de
  196.         ld hl,texfilename
  197.         call loadpage ;CY=error
  198.         pop de
  199.        jr c,loadloop0q
  200.         ld (de),a
  201.         inc e
  202.         ld hl,texfilename_pgnumend
  203. loadloop_nextdigit0
  204.         dec hl
  205.         ld a,(hl)
  206.         inc a
  207.         cp "0"+10
  208.         ld (hl),"0"
  209.         jr z,loadloop_nextdigit0
  210.         ld (hl),a
  211.         jr loadloop0
  212.         ;pop bc
  213.         ;djnz loadloop0
  214. loadloop0q
  215.        
  216.         ld hl,tpages+SPBUF_PAGE0
  217.         ld b,4
  218. mkpages0
  219.         push bc
  220.         push hl
  221.         OS_NEWPAGE
  222.         pop hl
  223.         ld (hl),e
  224.         inc l
  225.         pop bc
  226.         djnz mkpages0
  227.  
  228.         call initsfx
  229.  
  230.         if 1==0
  231.         call loadpage
  232.         ld (pgmusic),a
  233.         SETPG4000
  234.         push af
  235.         call 0x4000 ;init
  236.         pop af
  237.         ld hl,0x4005 ;play
  238.         OS_SETMUSIC
  239.         endif
  240.         call setpgsmain40008000
  241.         call RestoreMemMap3
  242.         ld de,fnbin
  243.         ld hl,0x4000
  244.         call loadbinpg
  245.         ld de,fnbin2
  246.         ld hl,0x8000
  247.         call loadbinpg
  248.         ld de,fnbin3
  249.         ld hl,0xc000
  250.         call loadbinpg
  251.        
  252.         call swapimer
  253.  
  254.         ld de,CURPAL
  255.         OS_SETPAL
  256.  
  257.         call _swap_screen
  258. jpaddr=$+1
  259.         call 0
  260.  
  261. quit ;TODO
  262.         call swapimer
  263. pgmusic=$+1
  264.         ld a,0
  265.         SETPG4000
  266.         ld hl,0x4008 ;stop
  267.         OS_SETMUSIC
  268.         halt
  269.         QUIT
  270.  
  271.         ds 0x0200-$
  272. tpages
  273.         ds 256 ;pages
  274.  
  275. initsfx
  276.         ;определение TS
  277.         ld bc,#fffd     ;чип 0
  278.         out (c),b
  279.         xor a           ;регистр 0
  280.         out (c),a
  281.         ld b,#bf        ;значение #bf
  282.         out (c),b
  283.         ld b,#ff        ;чип 1
  284.         ld a,#fe
  285.         out (c),a
  286.         xor a           ;регистр 0
  287.         out (c),a
  288.         ld b,#bf        ;значение 0
  289.         out (c),a
  290.         ld b,#ff        ;чип 0
  291.         out (c),b
  292.         xor a           ;регистр 0
  293.         out (c),a
  294.         in a,(c)
  295.         ld (turboSound),a
  296.         ld a,SND_PAGE
  297.         call setpg4000
  298.         xor a
  299.         call reset_ay_ay
  300.         inc a
  301.         call reset_ay_ay
  302.         ld hl,SFX_DATA
  303.         jp AFX_INIT
  304.  
  305. loadbinpg
  306.         push hl
  307.         OS_OPENHANDLE
  308.         pop de ;addr
  309.         push bc
  310.          ;ld de,BINADDR ;addr
  311.          ;ld hl,0x4000 ;size
  312.          ;OS_READHANDLE
  313.          ;pop bc
  314.          ;push bc
  315.         ;ld de,BINADDR ;addr
  316.         ld hl,-BINADDR ;size
  317.         OS_READHANDLE
  318.         pop bc
  319.         OS_CLOSEHANDLE                
  320.         ret
  321.  
  322. loadpage
  323. ;заказывает страничку и грузит туда файл (имя файла в hl)
  324. ;out: hl=после имени файла, a=pg
  325. ;or else CY
  326.         push hl
  327.         ex de,hl
  328.         OS_OPENHANDLE
  329.         pop hl
  330.         or a
  331.         scf
  332.         ret nz
  333.         push hl
  334.        push bc
  335.         OS_NEWPAGE
  336.        pop bc
  337.         pop hl
  338.         ld a,e
  339.         push af ;pg
  340.        push bc
  341.         SETPGC000
  342.        pop bc
  343.         push hl
  344.         ex de,hl
  345.         ;OS_OPENHANDLE
  346.         push bc
  347.         ld de,0xc000 ;addr
  348.         ld hl,0x4000 ;size
  349.         OS_READHANDLE
  350.         pop bc
  351.         OS_CLOSEHANDLE                
  352.         pop hl
  353.         ld b,1
  354.         xor a
  355.         cpir ;after 0
  356.         pop af ;pg
  357.         or a ;CY=0
  358.         ret
  359.  
  360. CURPAL
  361. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  362.         dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  363.         dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  364. ;RSTPAL
  365. ;        STANDARDPAL
  366.  
  367. sndfilename
  368.         db "page_0.bin",0
  369. sprtblfilename
  370.         db "page_1.bin",0
  371. palfilename
  372.         db "page_2.bin",0
  373.  
  374. texfilename
  375. texfilename_pgnumend=$+7;8
  376.         db "page_10.bin",0
  377.  
  378.  
  379.  
  380.  
  381. setpgsmain40008000
  382. pgmain4000=$+1
  383.         ld a,0
  384.         ;ld (curpg4000),a
  385.         SETPG4000
  386. pgmain8000=$+1
  387.         ld a,0
  388.         ;ld (curpg8000),a
  389.         SETPG8000
  390.         ret
  391.  
  392. setpgsscr40008000_current
  393.         call getuser_scr_low_cur
  394.         ;ld (curpg4000),a ;TODO kill
  395.         SETPG4000
  396.         call getuser_scr_high_cur
  397.         ;ld (curpg8000),a ;TODO kill
  398.         SETPG8000
  399.         ret
  400.  
  401. setpgsscr40008000
  402.         call getuser_scr_low
  403.         ;ld (curpg4000),a ;TODO kill
  404.         SETPG4000
  405.         call getuser_scr_high
  406.         ;ld (curpg8000),a ;TODO kill
  407.         SETPG8000
  408.         ret
  409.  
  410. setpgscrlow4000
  411.         call getuser_scr_low
  412.         SETPG4000
  413.         ret
  414.  
  415. setpgscrhigh4000
  416.         call getuser_scr_high
  417.         SETPG4000
  418.         ret
  419.  
  420. getuser_scr_low
  421. getuser_scr_low_patch=$+1
  422. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  423.         ld a,(user_scr1_low) ;ok
  424.         ret
  425.  
  426. getuser_scr_high
  427. getuser_scr_high_patch=$+1
  428. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  429.         ld a,(user_scr1_high) ;ok
  430.         ret
  431.  
  432. getuser_scr_low_cur
  433. getuser_scr_low_cur_patch=$+1
  434. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  435.         ld a,(user_scr0_low) ;ok
  436.         ret
  437.  
  438. getuser_scr_high_cur
  439. getuser_scr_high_cur_patch=$+1
  440. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  441.         ld a,(user_scr0_high) ;ok
  442.         ret
  443.  
  444. changescrpg_current
  445. ;        ld a,(setpgs_scr_low)
  446. ;setpgs_scr_scrxor=$+1
  447. ;        xor 0
  448. ;        ld (setpgs_scr_low),a
  449.         ld hl,getuser_scr_low_patch
  450.         ld a,(hl)
  451.         xor getuser_scr_low_patchN
  452.         ld (hl),a
  453.         ld hl,getuser_scr_high_patch
  454.         ld a,(hl)
  455.         xor getuser_scr_high_patchN
  456.         ld (hl),a
  457.         ld hl,getuser_scr_low_cur_patch
  458.         ld a,(hl)
  459.         xor getuser_scr_low_cur_patchN
  460.         ld (hl),a
  461.         ld hl,getuser_scr_high_cur_patch
  462.         ld a,(hl)
  463.         xor getuser_scr_high_cur_patchN
  464.         ld (hl),a
  465.  
  466.         ld a,1
  467. curscrnum=$+1
  468.         xor 0
  469.         ld ($-1),a
  470.         ret
  471.        
  472. changescrpg
  473. ;TODO убрать
  474.         call changescrpg_current
  475.         ;ld (curscrnum_physical),a
  476.         ld e,a
  477.         OS_SETSCREEN
  478.         ret
  479.  
  480. setpg4000
  481.         ;ld ($+4),a
  482.         ;ld a,(tpages) ;нереентерабельно!
  483.         ld b,tpages/256
  484.         ld c,a
  485.         ld a,(bc)
  486.         SETPG16K
  487.         ret
  488.  
  489. setpg8000
  490.         ;ld ($+4),a
  491.         ;ld a,(tpages) ;нереентерабельно!
  492.         ld b,tpages/256
  493.         ld c,a
  494.         ld a,(bc)
  495.         SETPG32KLOW
  496.         ret
  497.  
  498. setpgc000
  499.         ;ld ($+4),a
  500.         ;ld a,(tpages) ;нереентерабельно!
  501.         ld b,tpages/256
  502.         ld c,a
  503.         ld a,(bc)
  504.         SETPG32KHIGH
  505.         ret
  506.  
  507. setShadowScreen
  508.         MSetShadowScreen
  509.         ret
  510.  
  511. _clear_screen
  512.         and 15
  513.         ld l,a
  514.         ld h,high colorMaskTable
  515.         ld e,(hl)
  516.         call setShadowScreen
  517.         ld hl,#4000
  518.         ld (hl),e
  519.         ld de,#4001
  520.         ld bc,#7fff
  521.         call _fast_ldir
  522. RestoreMemMap12
  523.         MRestoreMemMap12
  524.         ret
  525.  
  526. _swap_screen
  527.         push ix
  528.         ;push iy
  529.  
  530.         ld a,(spritesActive)
  531.         or a
  532.         push af
  533.         jr z,.noSpr0
  534.         call setShadowScreen
  535.         call updateTilesToBuffer
  536.         call prspr
  537. .noSpr0
  538.  
  539.         halt
  540.  
  541.         ld a,(_screenActive)
  542.         xor 2
  543.         ld (_screenActive),a ;for select sprqueue
  544.         ;ld e,a
  545.  
  546.         ;ld a,#10
  547.         ;bit 1,e
  548.         ;jr z,$+4
  549.         ;or #08
  550.         ;ld bc,#7ffd
  551.         ;out (c),a
  552.          call changescrpg
  553.          ;rra
  554.          ;and 1 ;+cpl?
  555.          ;ld e,a
  556.          ;OS_SETSCREEN
  557.  
  558.         pop af
  559.         jr z,.noSpr1
  560.  
  561.         call setShadowScreen
  562.         call respr
  563.         call updateTilesFromBuffer
  564.         ;MRestoreMemMap012
  565.         call RestoreMemMap3;0
  566.         call RestoreMemMap12
  567. .noSpr1
  568.         ;pop iy
  569.         pop ix
  570.         ret
  571.  
  572. pal_get_address
  573.         ld h,0
  574.         ld l,a
  575.         add hl,hl
  576.         add hl,hl
  577.         add hl,hl
  578.         add hl,hl
  579.          set 7,h
  580.          set 6,h
  581.  
  582.         ;ld bc,MEM_SLOT0
  583.         ld a,PAL_PAGE
  584.         ;out (c),a
  585.         call setpgc000;SETPG32KHIGH
  586.         ret
  587.  
  588.  
  589.  
  590. _pal_select
  591.         call pal_get_address
  592.  
  593.         ld de,_palette
  594.         ld bc,16
  595.         ldir
  596.  
  597.         ld a,d
  598.         ld (_palChange),a
  599. RestoreMemMap3;0
  600.         ;ld bc,MEM_SLOT0
  601.         ld a,CC_PAGE3;0
  602.         ;out (c),a
  603.         call setpgc000;SETPG32KHIGH
  604.         ret
  605.  
  606.  
  607.  
  608. _pal_bright
  609.         cp 7
  610.         jr c,.l1
  611.         ld a,6
  612. .l1
  613.         ld h,a
  614.         ld l,0
  615.         srl h
  616.         rr l
  617.         srl h
  618.         rr l
  619.         ld (_palBright),hl
  620.         ld a,1
  621.         ld (_palChange),a
  622.         ret
  623.  
  624.  
  625.  
  626. _pal_copy
  627.         push de
  628.         call pal_get_address
  629.  
  630.         ld de,palTemp
  631.         ld bc,16
  632.         ldir
  633.  
  634.         ;ld bc,MEM_SLOT0
  635.         ld a,CC_PAGE3;0
  636.         ;out (c),a
  637.         call setpgc000;SETPG32KHIGH
  638.  
  639.         pop de
  640.         ld hl,palTemp
  641.         ld bc,16
  642.         ldir
  643.  
  644.         ret
  645.  
  646.  
  647.  
  648. ;более быстрая версия ldir, эффективна при bc>12
  649. ;из статьи на MSX Assembly Page
  650. ;в отличие от нормального ldir портит A и флаги
  651.  
  652. _fast_ldir
  653. DOSorTFM=0
  654.         ifdef DOS
  655. DOSorTFM=1
  656.         endif
  657.         ifdef TFM
  658. DOSorTFM=1
  659.         endif
  660.        
  661.         if DOSorTFM
  662.         ldir
  663.         ret
  664.         else
  665.  
  666.         xor a
  667.         sub c
  668.         and 63
  669.         add a,a
  670.         ld (.jump),a
  671. .jump=$+1
  672.         jr nz,.loop
  673. .loop
  674.         dup 64
  675.         ldi
  676.         edup
  677.         jp pe,.loop
  678.         ret
  679.  
  680.         endif ;~DOSorTFM
  681.  
  682.         align 256       ;#nn00
  683. tileUpdateXTable
  684.         dup 8
  685.         db #01,#02,#04,#08,#10,#20,#40,#80
  686.         edup
  687. .x=0
  688.         dup 64
  689.         db .x>>3
  690. .x=.x+1
  691.         edup
  692.  
  693.  
  694.         align 256       ;#nn00
  695. colorMaskTable
  696.         db #00,#09,#12,#1b,#24,#2d,#36,#3f      ;для двух пикселей
  697.         db #c0,#c9,#d2,#db,#e4,#ed,#f6,#ff
  698.         db #00,#01,#02,#03,#04,#05,#06,#07      ;для ink
  699.         db #40,#41,#42,#43,#44,#45,#46,#47
  700.         ds 16,0
  701.         db #00,#08,#10,#18,#20,#28,#30,#38      ;для paper
  702.         db #80,#88,#90,#98,#a0,#a8,#b0,#b8
  703.  
  704.  
  705.         align 256
  706. _sprqueue
  707. _sprqueue0      ;формат 4 байта на спрайт, idh,idl,y,x (idh=255 конец списка)
  708.         ds 256,255
  709. _sprqueue1
  710.         ds 256,255
  711.  
  712.         align 256
  713. palBrightTable
  714.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff      ;bright 0
  715.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
  716.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
  717.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
  718.         db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f      ;bright 1
  719.         db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
  720.         db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
  721.         db #df,#df,#df,#9f,#df,#df,#df,#9f,#df,#df,#df,#9f,#5f,#5f,#5f,#1f
  722.         db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed      ;bright 2
  723.         db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed
  724.         db #df,#df,#9f,#dd,#df,#df,#9f,#dd,#5f,#5f,#1f,#5d,#cf,#cf,#8f,#cd
  725.         db #fe,#fe,#be,#fc,#fe,#fe,#be,#fc,#7e,#7e,#3e,#7c,#ee,#ee,#ae,#ec
  726.         db #ff,#bf,#fd,#bd,#7f,#3f,#7d,#3d,#ef,#af,#ed,#ad,#6f,#2f,#6d,#2d      ;bright 3
  727.         db #df,#9f,#dd,#9d,#5f,#1f,#5d,#1d,#cf,#8f,#cd,#8d,#4f,#0f,#4d,#0d
  728.         db #fe,#be,#fc,#bc,#7e,#3e,#7c,#3c,#ee,#ae,#ec,#ac,#6e,#2e,#6c,#2c
  729.         db #de,#9e,#dc,#9c,#5e,#1e,#5c,#1c,#ce,#8e,#cc,#8c,#4e,#0e,#4c,#0c
  730.         db #1f,#5d,#1d,#1d,#8f,#cd,#8d,#8d,#0f,#4d,#0d,#0d,#0f,#4d,#0d,#0d      ;bright 4
  731.         db #3e,#7c,#3c,#3c,#ae,#ec,#ac,#ac,#2e,#6c,#2c,#2c,#2e,#6c,#2c,#2c
  732.         db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
  733.         db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
  734.         db #ec,#ac,#ac,#ac,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c      ;bright 5
  735.         db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
  736.         db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
  737.         db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
  738.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c      ;bright 6
  739.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
  740.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
  741.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
  742.  
  743.         align 256       ;#nn00
  744. scrTable
  745. adr=#4000
  746.         dup 25
  747.         db low adr
  748. adr=adr+(40*8)
  749.         edup
  750.         align 32        ;#nn20
  751. adr=#4000
  752.         dup 25
  753.         db high adr
  754. adr=adr+(40*8)
  755.         edup
  756.  
  757.         align 256       ;#nn00
  758. tileUpdateMap   ;битовая карта обновившихся знакомест, 64x25 бит
  759.         ds 8*25,0
  760.  
  761.         ;export changescrpg
  762.  
  763.         export _pal_select
  764.         export _pal_copy
  765.         export _pal_bright
  766.         export _swap_screen
  767.         export _clear_screen
  768.         export _fast_ldir
  769.  
  770.         include "../_sdk/lib_int.asm"
  771.         include "../_sdk/lib_tiles.asm"
  772.         export _draw_tile
  773.         export _draw_image
  774.         export _select_image
  775.         export _draw_tile_key
  776.         export _color_key
  777.  
  778.         include "../_sdk/lib_sprites.asm"
  779.         export _sprites_start
  780.         export _sprites_stop
  781.  
  782.         include "../_sdk/lib_input.asm"
  783.  
  784.         export _joystick
  785.         export _keyboard
  786.         export _mouse_apply_clip
  787.  
  788. _sample_play
  789. ;проигрывание сэмпла
  790. ;l=номер сэмпла
  791.        push ix
  792.         ld a,(curpg32khigh) ;ok
  793.         push af
  794.         ld a,SND_PAGE
  795.         call setpgc000
  796.         ld a,(SMP_COUNT|0xc000)
  797.         ld e,a
  798.         ld a,l
  799.         cp e
  800.         jr nc,.skip
  801.  
  802.         ld h,high (SMP_LIST|0xc000)
  803.         ld e,(hl)       ;lsb
  804.         inc h
  805.         ld a,(hl)       ;msb
  806.         or 0xc0
  807.         ld d,a
  808.         inc h
  809.         ld a,(hl)       ;page
  810.         cpl
  811.         inc h
  812.         ld h,(hl)       ;delay
  813.         ex de,hl ;hl=data
  814.         ld hx,d ;delay
  815.         ld e,a
  816.         ld d,tpages/256
  817. ;hl=data (0xc000+, 0x00=end), de=pagetable (0x0000+), hx=delay (18=11kHz, 7=22kHz, 1=44kHz)
  818.         OS_PLAYCOVOX
  819. .skip
  820.         pop af
  821.         SETPG32KHIGH
  822.        pop ix
  823.         ret
  824.  
  825. ;выключение звука на указанном чипе
  826. ;a=0 или 1
  827. reset_ay
  828. ;используется в _sfx_stop, _music_stop
  829.         ifdef TFM
  830.         push af
  831.         di
  832.  
  833.         call turbo_off
  834.  
  835.         ld a,SND_PAGE
  836.         call setpg4000
  837.         ld a,(TURBOFMON)
  838.         or a
  839.         call nz,#400f;tfmshut
  840.         ld a,CC_PAGE1
  841.         call setpg4000
  842.         pop af
  843.         call reset_ay_ay
  844.  
  845.         call turbo_on
  846.  
  847.         ei
  848.         ret
  849.  
  850.         else
  851.  
  852.         di
  853.         call reset_ay_ay
  854.         ei
  855.         ret
  856.  
  857.         endif
  858.  
  859.         if 1==0
  860. turbo_on
  861.         ld a,%10101000 ;режим EGA с турбо
  862.         ld bc,#bd77
  863.         out (c),a
  864.         ret
  865.  
  866. turbo_off
  867.         ld a,%10100000 ;режим EGA без турбо, так как в 14 МГц скорость нестабильна
  868.         ld bc,#bd77
  869.         out (c),a
  870.         ret
  871.         endif
  872.  
  873. reset_ay_ay
  874. ;в TFM нужно для глушения AY перед выводом эффектов
  875.         push af
  876.         ifdef TFM
  877.         or %11111000
  878.         ;or %11111010           ;no wait sync
  879.         else
  880.         or #fe
  881.         endif
  882.         ld bc,#fffd
  883.         out (c),a
  884.  
  885.         xor a
  886.         ld l,a
  887. .l0
  888.         ld b,#ff
  889.         ifdef TFM
  890.         call libstartup_waitstatus
  891.         endif
  892.         out (c),a
  893.         ifdef TFM
  894.         call libstartup_waitstatus
  895.         endif
  896.         ld b,#bf
  897.         out (c),l
  898.         inc a
  899.         cp 14
  900.         jr nz,.l0
  901.         pop af
  902.         ret
  903.  
  904. ;запуск звукового эффекта
  905. _sfx_play
  906.         push bc
  907.         ld a,SND_PAGE
  908.         call setpg4000
  909.         pop bc
  910.         ld a,b
  911.         call AFX_PLAY
  912.         ld a,CC_PAGE1
  913.         jp setpg4000
  914.  
  915. ;останов звуковых эффектов
  916. _sfx_stop
  917.         xor a
  918.         jp reset_ay
  919.  
  920. ;запуск музыки
  921. _music_play
  922.         push ix
  923.         push iy
  924.         push af
  925.         ld a,SND_PAGE
  926.         call setpg4000
  927.  
  928.         ld a,(MUS_COUNT)
  929.         ld l,a
  930.         pop af
  931.  
  932.         cp l
  933.         jr nc,.skip
  934.  
  935.         ld h,high MUS_LIST
  936.         ld l,a
  937.  
  938.         ld e,(hl)
  939.         inc h
  940.         ld d,(hl)
  941.         inc h
  942.         ld a,(hl)
  943.         ex de,hl
  944.         di
  945.         ld (musicPage),a
  946.         call setpg8000
  947.         ifdef TFM
  948.         ld a,(TURBOFMON)
  949.         or a
  950.         call nz,PT3_INIT
  951.         else
  952.         ld bc,#fffd
  953.         ld a,#fe
  954.         out (c),a
  955.         call PT3_INIT
  956.         endif
  957.         ei
  958.         ld a,CC_PAGE2
  959.         call setpg8000
  960.  
  961. .skip
  962.         pop iy
  963.         pop ix
  964.  
  965.         ld a,CC_PAGE1
  966.         jp setpg4000
  967.  
  968.  
  969.  
  970. ;выключение музыки
  971. _music_stop
  972.         xor a
  973.         ld (musicPage),a
  974.         jp reset_ay
  975.        
  976.         export _music_play
  977.         export _music_stop
  978.         export _sample_play
  979.         export _sfx_play
  980.         export _sfx_stop
  981.  
  982.  
  983. ;переменные
  984.  
  985. musicPage               db 0
  986. tileOffset              dw 0
  987. spritesActive   db 0    ;1 если вывод спрайтов разрешён
  988. tileUpdate              db 0    ;1 если выводились тайлы, для системы обновления фона под спрайтами
  989. palTemp                 ds 16,0
  990. keysPrevState   ds 40,0
  991.         ifdef TFM
  992. ;turboFM                        db 0    ;!=0 если есть TFM
  993.         else
  994. turboSound              db 0    ;!=0 если есть TS
  995.         endif
  996.  
  997. ;экспортируемые переменные
  998.  
  999.         macro rgb222 b2,g2,r2
  1000.         db (((r2&3)<<4)|((g2&3)<<2)|(b2&3))
  1001.         endm
  1002.  
  1003.         align 16
  1004. _palette
  1005.         rgb222(0,0,0)
  1006.         rgb222(0,0,2)
  1007.         rgb222(2,0,0)
  1008.         rgb222(2,0,2)
  1009.         rgb222(0,2,0)
  1010.         rgb222(0,2,2)
  1011.         rgb222(2,2,0)
  1012.         rgb222(2,2,2)
  1013.         rgb222(0,0,0)
  1014.         rgb222(0,0,3)
  1015.         rgb222(3,0,0)
  1016.         rgb222(3,0,3)
  1017.         rgb222(0,3,0)
  1018.         rgb222(0,3,3)
  1019.         rgb222(3,3,0)
  1020.         rgb222(3,3,3)
  1021.  
  1022. ;_memSlot1
  1023. ;curpg4000
  1024. ;        db 0
  1025. ;_memSlot2
  1026. ;curpg8000
  1027. ;        db 0
  1028. ;_memSlot3
  1029. ;curpgc000
  1030. ;        db 0
  1031.  
  1032. _borderCol      db 0
  1033. _palBright      dw 3<<6
  1034. _palChange      db 1
  1035. _screenActive   db 0    ;~1 или ~3
  1036. _mouse_dx       db 0
  1037. _mouse_dy       db 0
  1038. _mouse_x        db 80
  1039. _mouse_y        db 100
  1040. _mouse_cx1      db 0
  1041. _mouse_cx2      db 160
  1042. _mouse_cy1      db 0
  1043. _mouse_cy2      db 200
  1044. _mouse_btn      db 0
  1045. _mouse_prev_dx  db 0
  1046. _mouse_prev_dy  db 0
  1047. _time           dd 0
  1048.  
  1049.         export _borderCol
  1050.         export _palBright
  1051.         export _palChange
  1052.         export _sprqueue
  1053.         export _screenActive
  1054.         export _mouse_dx
  1055.         export _mouse_dy
  1056.         export _mouse_x
  1057.         export _mouse_y
  1058.         export _mouse_cx1
  1059.         export _mouse_cx2
  1060.         export _mouse_cy1
  1061.         export _mouse_cy2
  1062.         export _mouse_btn
  1063.         export _time
  1064.         export _palette
  1065.  
  1066.        
  1067. res_path
  1068. ;в этом относительном пути будут лежать все загружаемые данные игры
  1069.         ;db "nedoload"
  1070.         include "_temp_/sets.asm"
  1071.         db 0
  1072. fnbin
  1073.         ;db "code0.bin",0
  1074.         db "page_101.bin",0
  1075. fnbin2
  1076.         db "page_102.bin",0
  1077. fnbin3
  1078.         db "page_103.bin",0
  1079. fnaddr
  1080.         db "addr.bin",0
  1081. end        
  1082.  
  1083.         display "begin=",begin
  1084.         display "end=",end
  1085.         display "Size ",/d,end-begin," bytes"
  1086.        
  1087.         savebin "nedoload.com",begin,end-begin
  1088.        
  1089.         LABELSLIST "..\..\..\us\user.l"
  1090.