Subversion Repositories NedoOS

Rev

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

  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.         macro MDebug color
  69.         push af
  70.         ld a,color
  71.         out (#fe),a
  72.         pop af
  73.         endm
  74.  
  75.         macro MSetShadowScreen
  76.         ;ld a,(_screenActive)
  77.         ;SETPG16K
  78.         ;sub 4
  79.         ;SETPG32KLOW
  80.         call setpgsscr40008000;_current
  81.         endm
  82.  
  83.         macro MRestoreMemMap012
  84. ;TODO переделать на (pgmain4000) и т.п. (сейчас с пересчётом по таблице)
  85.         ;ld bc,MEM_SLOT3
  86.         ld a,CC_PAGE3
  87.         ;out (c),a
  88.         call setpgc000;SETPG32KHIGH
  89.  
  90.         ;ld b,high MEM_SLOT1
  91.         ld a,CC_PAGE1
  92.         ;ld (_memSlot1),a
  93.         ;out (c),a
  94.         call setpg4000;SETPG16K
  95.  
  96.         ;ld b,high MEM_SLOT2
  97.         ld a,CC_PAGE2
  98.         ;ld (_memSlot2),a
  99.         ;out (c),a
  100.         call setpg8000;SETPG32KLOW
  101.         endm
  102.  
  103.         macro MRestoreMemMap12
  104.         ;ld bc,MEM_SLOT1
  105.         ld a,CC_PAGE1
  106.         ;ld (_memSlot1),a
  107.         ;out (c),a
  108.         call setpg4000;SETPG16K
  109.  
  110.         ;ld b,high MEM_SLOT2
  111.         ld a,CC_PAGE2
  112.         ;ld (_memSlot2),a
  113.         ;out (c),a
  114.         call setpg8000;SETPG32KLOW
  115.         endm
  116.  
  117.         org PROGSTART
  118. begin
  119.         ld sp,STACK
  120.         OS_HIDEFROMPARENT
  121.  
  122. ;        ld b,25
  123. ;waitcls0
  124. ;        push bc
  125. ;        YIELD
  126. ;        pop bc
  127. ;        djnz waitcls0 ;чтобы nv не перехватил фокус при вызове через комстроку
  128.  
  129.         ld e,0+128 ;+128=keep
  130.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  131.         ld e,0
  132.         OS_SETSCREEN
  133.         ld e,0 ;color byte
  134.         OS_CLS
  135.         ld e,1
  136.         OS_SETSCREEN
  137.         ld e,0 ;color byte
  138.         OS_CLS
  139.        
  140.         OS_GETMAINPAGES
  141. ;dehl=номера страниц в 0000,4000,8000,c000
  142.         ld a,e
  143.         LD (pgmain4000),A
  144.         ld (tpages+CC_PAGE1),a
  145.         ld a,h
  146.         LD (pgmain8000),A
  147.         ld (tpages+CC_PAGE2),a
  148.         ld a,l
  149.         ;LD (pgmainc000),A
  150. ;pgmainc000=$+1
  151. ;        ld a,0
  152.         ld (tpages+CC_PAGE3),a
  153.         call setpgsmain40008000 ;записать в curpg...
  154.  
  155.         ;OS_GETSCREENPAGES
  156. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  157.         ;ld a,l
  158.         ;ld (setpgs_scr_low),a
  159.         ;xor e
  160.         ;ld (setpgs_scr_scrxor),a
  161.         ;ld a,h
  162.          ;ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
  163.         ;xor l
  164.         ;ld (setpgs_scr_pgxor),a
  165.        
  166.         ld de,res_path
  167.         OS_CHDIR
  168.  
  169.         ld de,fnaddr
  170.         OS_OPENHANDLE
  171.         push bc
  172.         ld de,jpaddr ;addr
  173.         ld hl,2 ;size
  174.         OS_READHANDLE
  175.         pop bc
  176.         OS_CLOSEHANDLE
  177.  
  178.         ld hl,sndfilename
  179.         call loadpage ;CY=error
  180.         ld (tpages+0),a
  181.         ld hl,sprtblfilename
  182.         call loadpage ;CY=error
  183.         ld (tpages+1),a
  184.         ld hl,palfilename
  185.         call loadpage ;CY=error
  186.         ld (tpages+2),a
  187.  
  188.         ld de,tpages+GFX_PAGE
  189.  
  190.         ;ld b,NUMBER_OF_PAGES
  191. loadloop0
  192.         ;push bc
  193.         push de
  194.         ld hl,texfilename
  195.         call loadpage ;CY=error
  196.         pop de
  197.        jr c,loadloop0q
  198.         ld (de),a
  199.         inc e
  200.         ld hl,texfilename_pgnumend
  201. loadloop_nextdigit0
  202.         dec hl
  203.         ld a,(hl)
  204.         inc a
  205.         cp "0"+10
  206.         ld (hl),"0"
  207.         jr z,loadloop_nextdigit0
  208.         ld (hl),a
  209.         jr loadloop0
  210.         ;pop bc
  211.         ;djnz loadloop0
  212. loadloop0q
  213.        
  214.         ld hl,tpages+SPBUF_PAGE0
  215.         ld b,4
  216. mkpages0
  217.         push bc
  218.         push hl
  219.         OS_NEWPAGE
  220.         pop hl
  221.         ld (hl),e
  222.         inc l
  223.         pop bc
  224.         djnz mkpages0
  225.  
  226.         call initsfx
  227.  
  228.         if 1==0
  229.         call loadpage
  230.         ld (pgmusic),a
  231.         SETPG4000
  232.         push af
  233.         call 0x4000 ;init
  234.         pop af
  235.         ld hl,0x4005 ;play
  236.         OS_SETMUSIC
  237.         endif
  238.         call setpgsmain40008000
  239.         call RestoreMemMap3
  240.         ld de,fnbin
  241.         ld hl,0x4000
  242.         call loadbinpg
  243.         ld de,fnbin2
  244.         ld hl,0x8000
  245.         call loadbinpg
  246.         ld de,fnbin3
  247.         ld hl,0xc000
  248.         call loadbinpg
  249.        
  250.         call swapimer
  251.  
  252.         ld de,CURPAL
  253.         OS_SETPAL
  254.  
  255.         call _swap_screen
  256. jpaddr=$+1
  257.         call 0
  258.  
  259. quit ;TODO
  260.         call swapimer
  261. pgmusic=$+1
  262.         ld a,0
  263.         SETPG4000
  264.         ld hl,0x4008 ;stop
  265.         OS_SETMUSIC
  266.         halt
  267.         QUIT
  268.  
  269.         ds 0x0200-$
  270. tpages
  271.         ds 256 ;pages
  272.  
  273.  
  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.         include "../_sdk/wyzplay.asm"
  789.  
  790. _sample_play
  791. ;проигрывание сэмпла
  792. ;l=номер сэмпла
  793.        push ix
  794.         ld a,(curpg32khigh) ;ok
  795.         push af
  796.         ld a,SND_PAGE
  797.         call setpgc000
  798.         ld a,(SMP_COUNT|0xc000)
  799.         ld e,a
  800.         ld a,l
  801.         cp e
  802.         jr nc,.skip
  803.  
  804.         ld h,high (SMP_LIST|0xc000)
  805.         ld e,(hl)       ;lsb
  806.         inc h
  807.         ld a,(hl)       ;msb
  808.         or 0xc0
  809.         ld d,a
  810.         inc h
  811.         ld a,(hl)       ;page
  812.         cpl
  813.         inc h
  814.         ld h,(hl)       ;delay
  815.         ex de,hl ;hl=data
  816.         ld hx,d ;delay
  817.         ld e,a
  818.         ld d,tpages/256
  819. ;hl=data (0xc000+, 0x00=end), de=pagetable (0x0000+), hx=delay (18=11kHz, 7=22kHz, 1=44kHz)
  820.         OS_PLAYCOVOX
  821. .skip
  822.         pop af
  823.         SETPG32KHIGH
  824.        pop ix
  825.         ret
  826.  
  827. ;выключение звука на указанном чипе
  828. ;a=0 или 1
  829. reset_ay
  830. ;используется в _sfx_stop, _music_stop
  831.         ifdef TFM
  832.         push af
  833.         di
  834.  
  835.         call turbo_off
  836.  
  837.         ld a,SND_PAGE
  838.         call setpg4000
  839.         ld a,(TURBOFMON)
  840.         or a
  841.         call nz,#400f;tfmshut
  842.         ld a,CC_PAGE1
  843.         call setpg4000
  844.         pop af
  845.         call reset_ay_ay
  846.  
  847.         call turbo_on
  848.  
  849.         ei
  850.         ret
  851.  
  852.         else
  853.  
  854.         di
  855.         call reset_ay_ay
  856.         ei
  857.         ret
  858.  
  859.         endif
  860.  
  861.         if 1==0
  862. turbo_on
  863.         ld a,%10101000 ;режим EGA с турбо
  864.         ld bc,#bd77
  865.         out (c),a
  866.         ret
  867.  
  868. turbo_off
  869.         ld a,%10100000 ;режим EGA без турбо, так как в 14 МГц скорость нестабильна
  870.         ld bc,#bd77
  871.         out (c),a
  872.         ret
  873.         endif
  874.  
  875. reset_ay_ay
  876. ;в TFM нужно для глушения AY перед выводом эффектов
  877.         push af
  878.         ifdef TFM
  879.         or %11111000
  880.         ;or %11111010           ;no wait sync
  881.         else
  882.         or #fe
  883.         endif
  884.         ld bc,#fffd
  885.         out (c),a
  886.  
  887.         xor a
  888.         ld l,a
  889. .l0
  890.         ld b,#ff
  891.         ifdef TFM
  892.         call libstartup_waitstatus
  893.         endif
  894.         out (c),a
  895.         ifdef TFM
  896.         call libstartup_waitstatus
  897.         endif
  898.         ld b,#bf
  899.         out (c),l
  900.         inc a
  901.         cp 14
  902.         jr nz,.l0
  903.         pop af
  904.         ret
  905.  
  906. ;запуск звукового эффекта
  907. _sfx_play
  908.         push bc
  909.         ld a,SND_PAGE
  910.         call setpg4000
  911.         pop bc
  912.         ld a,b
  913.         call AFX_PLAY
  914.         ld a,CC_PAGE1
  915.         jp setpg4000
  916.  
  917. ;останов звуковых эффектов
  918. _sfx_stop
  919.         xor a
  920.         jp reset_ay
  921.  
  922. ;запуск музыки
  923. _music_play
  924.         push ix
  925.         push iy
  926.         push af
  927.         ld a,SND_PAGE
  928.         call setpg4000
  929.  
  930.         ld a,(MUS_COUNT)
  931.         ld l,a
  932.         pop af
  933.  
  934.         cp l
  935.         jr nc,.skip
  936.  
  937.         ld h,high MUS_LIST
  938.         ld l,a
  939.  
  940.         ld e,(hl)
  941.         inc h
  942.         ld d,(hl)
  943.         inc h
  944.         ld a,(hl)
  945.         ex de,hl
  946.         di
  947.         ld (musicPage),a
  948.         call setpg8000
  949.         ifdef TFM
  950.         ld a,(TURBOFMON)
  951.         or a
  952.         call nz,PT3_INIT
  953.         else
  954.         ld bc,#fffd
  955.         ld a,#fe
  956.         out (c),a
  957.         call pt3player.INIT;PT3_INIT
  958.         endif
  959.         ei
  960.         ld a,CC_PAGE2
  961.         call setpg8000
  962.  
  963. .skip
  964.         pop iy
  965.         pop ix
  966.  
  967.         ld a,CC_PAGE1
  968.         jp setpg4000
  969.  
  970.  
  971.  
  972. ;выключение музыки
  973. _music_stop
  974.         xor a
  975.         ld (musicPage),a
  976.         jp reset_ay
  977.        
  978.         export _music_play
  979.         export _music_stop
  980.         export _sample_play
  981.         export _sfx_play
  982.         export _sfx_stop
  983.  
  984.  
  985. ;переменные
  986.  
  987. musicPage               db 0
  988. tileOffset              dw 0
  989. spritesActive   db 0    ;1 если вывод спрайтов разрешён
  990. tileUpdate              db 0    ;1 если выводились тайлы, для системы обновления фона под спрайтами
  991. palTemp                 ds 16,0
  992. keysPrevState   ds 40,0
  993.         ifdef TFM
  994. ;turboFM                        db 0    ;!=0 если есть TFM
  995.         else
  996. turboSound              db 0    ;!=0 если есть TS
  997.         endif
  998.  
  999. ;экспортируемые переменные
  1000.  
  1001.         macro rgb222 b2,g2,r2
  1002.         db (((r2&3)<<4)|((g2&3)<<2)|(b2&3))
  1003.         endm
  1004.  
  1005.         align 16
  1006. _palette
  1007.         rgb222(0,0,0)
  1008.         rgb222(0,0,2)
  1009.         rgb222(2,0,0)
  1010.         rgb222(2,0,2)
  1011.         rgb222(0,2,0)
  1012.         rgb222(0,2,2)
  1013.         rgb222(2,2,0)
  1014.         rgb222(2,2,2)
  1015.         rgb222(0,0,0)
  1016.         rgb222(0,0,3)
  1017.         rgb222(3,0,0)
  1018.         rgb222(3,0,3)
  1019.         rgb222(0,3,0)
  1020.         rgb222(0,3,3)
  1021.         rgb222(3,3,0)
  1022.         rgb222(3,3,3)
  1023.  
  1024. ;_memSlot1
  1025. ;curpg4000
  1026. ;        db 0
  1027. ;_memSlot2
  1028. ;curpg8000
  1029. ;        db 0
  1030. ;_memSlot3
  1031. ;curpgc000
  1032. ;        db 0
  1033.  
  1034. _borderCol      db 0
  1035. _palBright      dw 3<<6
  1036. _palChange      db 1
  1037. _screenActive   db 0    ;~1 или ~3
  1038. _mouse_dx       db 0
  1039. _mouse_dy       db 0
  1040. _mouse_x        db 80
  1041. _mouse_y        db 100
  1042. _mouse_cx1      db 0
  1043. _mouse_cx2      db 160
  1044. _mouse_cy1      db 0
  1045. _mouse_cy2      db 200
  1046. _mouse_btn      db 0
  1047. _mouse_prev_dx  db 0
  1048. _mouse_prev_dy  db 0
  1049. _time           dd 0
  1050.  
  1051.         export _borderCol
  1052.         export _palBright
  1053.         export _palChange
  1054.         export _sprqueue
  1055.         export _screenActive
  1056.         export _mouse_dx
  1057.         export _mouse_dy
  1058.         export _mouse_x
  1059.         export _mouse_y
  1060.         export _mouse_cx1
  1061.         export _mouse_cx2
  1062.         export _mouse_cy1
  1063.         export _mouse_cy2
  1064.         export _mouse_btn
  1065.         export _time
  1066.         export _palette
  1067.  
  1068.        
  1069. res_path
  1070. ;в этом относительном пути будут лежать все загружаемые данные игры
  1071.         ;db "nedoload"
  1072.         include "_temp_/sets.asm"
  1073.         db 0
  1074. fnbin
  1075.         ;db "code0.bin",0
  1076.         db "page_101.bin",0
  1077. fnbin2
  1078.         db "page_102.bin",0
  1079. fnbin3
  1080.         db "page_103.bin",0
  1081. fnaddr
  1082.         db "addr.bin",0
  1083.        
  1084.         module pt3player
  1085. BUFFER_DEC
  1086.         ds 256 ;или 1 байта хватит?
  1087.         endmodule
  1088.  
  1089. end        
  1090.  
  1091. PT3_FRAME=pt3player.PLAY
  1092.  
  1093.         display "begin=",begin
  1094.         display "end=",end
  1095.         display "Size ",/d,end-begin," bytes"
  1096.        
  1097.         savebin "nedoload.com",begin,end-begin
  1098.        
  1099.         LABELSLIST "..\..\..\us\user.l"
  1100.