Subversion Repositories NedoOS

Rev

Rev 946 | 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.  
  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.         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.         if 1==0
  256.         ;jr $
  257.         ld c,10
  258.         ld b,2
  259.         ld de,0
  260. ;c=X, b=Y, de=tile
  261. ;координаты в тайлах
  262.         call _draw_tile
  263.         endif
  264.         call _swap_screen
  265. jpaddr=$+1
  266.         jp 0
  267.  
  268. quit ;TODO
  269.         call swapimer
  270. pgmusic=$+1
  271.         ld a,0
  272.         SETPG4000
  273.         ld hl,0x4008 ;stop
  274.         OS_SETMUSIC
  275.         halt
  276.         QUIT
  277.  
  278.         ds 0x0200-$
  279. tpages
  280.         ds 256 ;pages
  281.  
  282. loadbinpg
  283.         push hl
  284.         OS_OPENHANDLE
  285.         pop de ;addr
  286.         push bc
  287.          ;ld de,BINADDR ;addr
  288.          ;ld hl,0x4000 ;size
  289.          ;OS_READHANDLE
  290.          ;pop bc
  291.          ;push bc
  292.         ;ld de,BINADDR ;addr
  293.         ld hl,-BINADDR ;size
  294.         OS_READHANDLE
  295.         pop bc
  296.         OS_CLOSEHANDLE                
  297.         ret
  298.  
  299. loadpage
  300. ;заказывает страничку и грузит туда файл (имя файла в hl)
  301. ;out: hl=после имени файла, a=pg
  302. ;or else CY
  303.         push hl
  304.         ex de,hl
  305.         OS_OPENHANDLE
  306.         pop hl
  307.         or a
  308.         scf
  309.         ret nz
  310.         push hl
  311.        push bc
  312.         OS_NEWPAGE
  313.        pop bc
  314.         pop hl
  315.         ld a,e
  316.         push af ;pg
  317.        push bc
  318.         SETPGC000
  319.        pop bc
  320.         push hl
  321.         ex de,hl
  322.         ;OS_OPENHANDLE
  323.         push bc
  324.         ld de,0xc000 ;addr
  325.         ld hl,0x4000 ;size
  326.         OS_READHANDLE
  327.         pop bc
  328.         OS_CLOSEHANDLE                
  329.         pop hl
  330.         ld b,1
  331.         xor a
  332.         cpir ;after 0
  333.         pop af ;pg
  334.         or a ;CY=0
  335.         ret
  336.  
  337. CURPAL
  338. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  339.         dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  340.         dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  341. ;RSTPAL
  342. ;        STANDARDPAL
  343.  
  344. sndfilename
  345.         db "page_0.bin",0
  346. sprtblfilename
  347.         db "page_1.bin",0
  348. palfilename
  349.         db "page_2.bin",0
  350.  
  351. texfilename
  352. texfilename_pgnumend=$+7;8
  353.         db "page_10.bin",0
  354.  
  355.  
  356.  
  357.  
  358. setpgsmain40008000
  359. pgmain4000=$+1
  360.         ld a,0
  361.         ;ld (curpg4000),a
  362.         SETPG4000
  363. pgmain8000=$+1
  364.         ld a,0
  365.         ;ld (curpg8000),a
  366.         SETPG8000
  367.         ret
  368.  
  369. setpgsscr40008000_current
  370.         call getuser_scr_low_cur
  371.         ;ld (curpg4000),a ;TODO kill
  372.         SETPG4000
  373.         call getuser_scr_high_cur
  374.         ;ld (curpg8000),a ;TODO kill
  375.         SETPG8000
  376.         ret
  377.  
  378. setpgsscr40008000
  379.         call getuser_scr_low
  380.         ;ld (curpg4000),a ;TODO kill
  381.         SETPG4000
  382.         call getuser_scr_high
  383.         ;ld (curpg8000),a ;TODO kill
  384.         SETPG8000
  385.         ret
  386.  
  387. setpgscrlow4000
  388.         call getuser_scr_low
  389.         SETPG4000
  390.         ret
  391.  
  392. setpgscrhigh4000
  393.         call getuser_scr_high
  394.         SETPG4000
  395.         ret
  396.  
  397. getuser_scr_low
  398. getuser_scr_low_patch=$+1
  399. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  400.         ld a,(user_scr1_low) ;ok
  401.         ret
  402.  
  403. getuser_scr_high
  404. getuser_scr_high_patch=$+1
  405. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  406.         ld a,(user_scr1_high) ;ok
  407.         ret
  408.  
  409. getuser_scr_low_cur
  410. getuser_scr_low_cur_patch=$+1
  411. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  412.         ld a,(user_scr0_low) ;ok
  413.         ret
  414.  
  415. getuser_scr_high_cur
  416. getuser_scr_high_cur_patch=$+1
  417. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  418.         ld a,(user_scr0_high) ;ok
  419.         ret
  420.  
  421. changescrpg_current
  422. ;        ld a,(setpgs_scr_low)
  423. ;setpgs_scr_scrxor=$+1
  424. ;        xor 0
  425. ;        ld (setpgs_scr_low),a
  426.         ld hl,getuser_scr_low_patch
  427.         ld a,(hl)
  428.         xor getuser_scr_low_patchN
  429.         ld (hl),a
  430.         ld hl,getuser_scr_high_patch
  431.         ld a,(hl)
  432.         xor getuser_scr_high_patchN
  433.         ld (hl),a
  434.         ld hl,getuser_scr_low_cur_patch
  435.         ld a,(hl)
  436.         xor getuser_scr_low_cur_patchN
  437.         ld (hl),a
  438.         ld hl,getuser_scr_high_cur_patch
  439.         ld a,(hl)
  440.         xor getuser_scr_high_cur_patchN
  441.         ld (hl),a
  442.  
  443.         ld a,1
  444. curscrnum=$+1
  445.         xor 0
  446.         ld ($-1),a
  447.         ret
  448.        
  449. changescrpg
  450. ;TODO убрать
  451.         call changescrpg_current
  452.         ;ld (curscrnum_physical),a
  453.         ld e,a
  454.         OS_SETSCREEN
  455.         ret
  456.  
  457. setpg4000
  458.         ;ld ($+4),a
  459.         ;ld a,(tpages) ;нереентерабельно!
  460.         ld b,tpages/256
  461.         ld c,a
  462.         ld a,(bc)
  463.         SETPG16K
  464.         ret
  465.  
  466. setpg8000
  467.         ;ld ($+4),a
  468.         ;ld a,(tpages) ;нереентерабельно!
  469.         ld b,tpages/256
  470.         ld c,a
  471.         ld a,(bc)
  472.         SETPG32KLOW
  473.         ret
  474.  
  475. setpgc000
  476.         ;ld ($+4),a
  477.         ;ld a,(tpages) ;нереентерабельно!
  478.         ld b,tpages/256
  479.         ld c,a
  480.         ld a,(bc)
  481.         SETPG32KHIGH
  482.         ret
  483.  
  484. setShadowScreen
  485.         MSetShadowScreen
  486.         ret
  487.  
  488. _clear_screen
  489.         and 15
  490.         ld l,a
  491.         ld h,high colorMaskTable
  492.         ld e,(hl)
  493.         call setShadowScreen
  494.         ld hl,#4000
  495.         ld (hl),e
  496.         ld de,#4001
  497.         ld bc,#7fff
  498.         call _fast_ldir
  499. RestoreMemMap12
  500.         MRestoreMemMap12
  501.         ret
  502.  
  503. _swap_screen
  504.         push ix
  505.         push iy
  506.  
  507.         ld a,(spritesActive)
  508.         or a
  509.         push af
  510.         jr z,.noSpr0
  511.         call setShadowScreen
  512.         call updateTilesToBuffer
  513.         call prspr
  514. .noSpr0
  515.  
  516.         halt
  517.  
  518.         ld a,(_screenActive)
  519.         xor 2
  520.         ld (_screenActive),a ;for select sprqueue
  521.         ;ld e,a
  522.  
  523.         ;ld a,#10
  524.         ;bit 1,e
  525.         ;jr z,$+4
  526.         ;or #08
  527.         ;ld bc,#7ffd
  528.         ;out (c),a
  529.          call changescrpg
  530.          ;rra
  531.          ;and 1 ;+cpl?
  532.          ;ld e,a
  533.          ;OS_SETSCREEN
  534.  
  535.         pop af
  536.         jr z,.noSpr1
  537.  
  538.         call setShadowScreen
  539.         call respr
  540.         call updateTilesFromBuffer
  541.         ;MRestoreMemMap012
  542.         call RestoreMemMap3;0
  543.         call RestoreMemMap12
  544. .noSpr1
  545.         pop iy
  546.         pop ix
  547.         ret
  548.  
  549. pal_get_address
  550.         ld h,0
  551.         ld l,a
  552.         add hl,hl
  553.         add hl,hl
  554.         add hl,hl
  555.         add hl,hl
  556.          set 7,h
  557.          set 6,h
  558.  
  559.         ;ld bc,MEM_SLOT0
  560.         ld a,PAL_PAGE
  561.         ;out (c),a
  562.         call setpgc000;SETPG32KHIGH
  563.         ret
  564.  
  565.  
  566.  
  567. _pal_select
  568.         call pal_get_address
  569.  
  570.         ld de,_palette
  571.         ld bc,16
  572.         ldir
  573.  
  574.         ld a,d
  575.         ld (_palChange),a
  576. RestoreMemMap3;0
  577.         ;ld bc,MEM_SLOT0
  578.         ld a,CC_PAGE3;0
  579.         ;out (c),a
  580.         call setpgc000;SETPG32KHIGH
  581.         ret
  582.  
  583.  
  584.  
  585. _pal_bright
  586.         cp 7
  587.         jr c,.l1
  588.         ld a,6
  589. .l1
  590.         ld h,a
  591.         ld l,0
  592.         srl h
  593.         rr l
  594.         srl h
  595.         rr l
  596.         ld (_palBright),hl
  597.         ld a,1
  598.         ld (_palChange),a
  599.         ret
  600.  
  601.  
  602.  
  603. _pal_copy
  604.         push de
  605.         call pal_get_address
  606.  
  607.         ld de,palTemp
  608.         ld bc,16
  609.         ldir
  610.  
  611.         ;ld bc,MEM_SLOT0
  612.         ld a,CC_PAGE3;0
  613.         ;out (c),a
  614.         call setpgc000;SETPG32KHIGH
  615.  
  616.         pop de
  617.         ld hl,palTemp
  618.         ld bc,16
  619.         ldir
  620.  
  621.         ret
  622.  
  623.  
  624.  
  625. ;более быстрая версия ldir, эффективна при bc>12
  626. ;из статьи на MSX Assembly Page
  627. ;в отличие от нормального ldir портит A и флаги
  628.  
  629. _fast_ldir
  630. DOSorTFM=0
  631.         ifdef DOS
  632. DOSorTFM=1
  633.         endif
  634.         ifdef TFM
  635. DOSorTFM=1
  636.         endif
  637.        
  638.         if DOSorTFM
  639.         ldir
  640.         ret
  641.         else
  642.  
  643.         xor a
  644.         sub c
  645.         and 63
  646.         add a,a
  647.         ld (.jump),a
  648. .jump=$+1
  649.         jr nz,.loop
  650. .loop
  651.         dup 64
  652.         ldi
  653.         edup
  654.         jp pe,.loop
  655.         ret
  656.  
  657.         endif ;~DOSorTFM
  658.  
  659.         align 256       ;#nn00
  660. tileUpdateXTable
  661.         dup 8
  662.         db #01,#02,#04,#08,#10,#20,#40,#80
  663.         edup
  664. .x=0
  665.         dup 64
  666.         db .x>>3
  667. .x=.x+1
  668.         edup
  669.  
  670.  
  671.         align 256       ;#nn00
  672. colorMaskTable
  673.         db #00,#09,#12,#1b,#24,#2d,#36,#3f      ;для двух пикселей
  674.         db #c0,#c9,#d2,#db,#e4,#ed,#f6,#ff
  675.         db #00,#01,#02,#03,#04,#05,#06,#07      ;для ink
  676.         db #40,#41,#42,#43,#44,#45,#46,#47
  677.         ds 16,0
  678.         db #00,#08,#10,#18,#20,#28,#30,#38      ;для paper
  679.         db #80,#88,#90,#98,#a0,#a8,#b0,#b8
  680.  
  681.  
  682.         align 256
  683. _sprqueue
  684. _sprqueue0      ;формат 4 байта на спрайт, idh,idl,y,x (idh=255 конец списка)
  685.         ds 256,255
  686. _sprqueue1
  687.         ds 256,255
  688.  
  689.         align 256
  690. palBrightTable
  691.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff      ;bright 0
  692.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
  693.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
  694.         db #ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff,#ff
  695.         db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f      ;bright 1
  696.         db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
  697.         db #ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#ff,#ff,#ff,#bf,#7f,#7f,#7f,#3f
  698.         db #df,#df,#df,#9f,#df,#df,#df,#9f,#df,#df,#df,#9f,#5f,#5f,#5f,#1f
  699.         db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed      ;bright 2
  700.         db #ff,#ff,#bf,#fd,#ff,#ff,#bf,#fd,#7f,#7f,#3f,#7d,#ef,#ef,#af,#ed
  701.         db #df,#df,#9f,#dd,#df,#df,#9f,#dd,#5f,#5f,#1f,#5d,#cf,#cf,#8f,#cd
  702.         db #fe,#fe,#be,#fc,#fe,#fe,#be,#fc,#7e,#7e,#3e,#7c,#ee,#ee,#ae,#ec
  703.         db #ff,#bf,#fd,#bd,#7f,#3f,#7d,#3d,#ef,#af,#ed,#ad,#6f,#2f,#6d,#2d      ;bright 3
  704.         db #df,#9f,#dd,#9d,#5f,#1f,#5d,#1d,#cf,#8f,#cd,#8d,#4f,#0f,#4d,#0d
  705.         db #fe,#be,#fc,#bc,#7e,#3e,#7c,#3c,#ee,#ae,#ec,#ac,#6e,#2e,#6c,#2c
  706.         db #de,#9e,#dc,#9c,#5e,#1e,#5c,#1c,#ce,#8e,#cc,#8c,#4e,#0e,#4c,#0c
  707.         db #1f,#5d,#1d,#1d,#8f,#cd,#8d,#8d,#0f,#4d,#0d,#0d,#0f,#4d,#0d,#0d      ;bright 4
  708.         db #3e,#7c,#3c,#3c,#ae,#ec,#ac,#ac,#2e,#6c,#2c,#2c,#2e,#6c,#2c,#2c
  709.         db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
  710.         db #1e,#5c,#1c,#1c,#8e,#cc,#8c,#8c,#0e,#4c,#0c,#0c,#0e,#4c,#0c,#0c
  711.         db #ec,#ac,#ac,#ac,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c,#6c,#2c,#2c,#2c      ;bright 5
  712.         db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
  713.         db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
  714.         db #cc,#8c,#8c,#8c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c,#4c,#0c,#0c,#0c
  715.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c      ;bright 6
  716.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
  717.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
  718.         db #0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c,#0c
  719.  
  720.         align 256       ;#nn00
  721. scrTable
  722. adr=#4000
  723.         dup 25
  724.         db low adr
  725. adr=adr+(40*8)
  726.         edup
  727.         align 32        ;#nn20
  728. adr=#4000
  729.         dup 25
  730.         db high adr
  731. adr=adr+(40*8)
  732.         edup
  733.  
  734.         align 256       ;#nn00
  735. tileUpdateMap   ;битовая карта обновившихся знакомест, 64x25 бит
  736.         ds 8*25,0
  737.  
  738.         ;export changescrpg
  739.  
  740.         export _pal_select
  741.         export _pal_copy
  742.         export _pal_bright
  743.         export _swap_screen
  744.         export _clear_screen
  745.         export _fast_ldir
  746.  
  747.         include "../_sdk/lib_int.asm"
  748.         include "../_sdk/lib_tiles.asm"
  749.         export _draw_tile
  750.         export _draw_image
  751.         export _select_image
  752.         export _draw_tile_key
  753.         export _color_key
  754.  
  755.         include "../_sdk/lib_sprites.asm"
  756.         export _sprites_start
  757.         export _sprites_stop
  758.  
  759.         include "../_sdk/lib_input.asm"
  760.  
  761.         export _joystick
  762.         export _keyboard
  763.         export _mouse_apply_clip
  764.  
  765. _sample_play
  766. ;проигрывание сэмпла
  767. ;l=номер сэмпла
  768.        push ix
  769.         ld a,(curpg32khigh) ;ok
  770.         push af
  771.         ld a,SND_PAGE
  772.         call setpgc000
  773.         ld a,(SMP_COUNT|0xc000)
  774.         ld e,a
  775.         ld a,l
  776.         cp e
  777.         jr nc,.skip
  778.  
  779.         ld h,high (SMP_LIST|0xc000)
  780.         ld e,(hl)       ;lsb
  781.         inc h
  782.         ld a,(hl)       ;msb
  783.         or 0xc0
  784.         ld d,a
  785.         inc h
  786.         ld a,(hl)       ;page
  787.         cpl
  788.         inc h
  789.         ld h,(hl)       ;delay
  790.         ex de,hl ;hl=data
  791.         ld hx,d ;delay
  792.         ld e,a
  793.         ld d,tpages/256
  794. ;hl=data (0xc000+, 0x00=end), de=pagetable (0x0000+), hx=delay (18=11kHz, 7=22kHz, 1=44kHz)
  795.         OS_PLAYCOVOX
  796. .skip
  797.         pop af
  798.         SETPG32KHIGH
  799.        pop ix
  800.         ret
  801.  
  802. ;выключение звука на указанном чипе
  803. ;a=0 или 1
  804. reset_ay
  805. ;используется в _sfx_stop, _music_stop
  806.         ifdef TFM
  807.         push af
  808.         di
  809.  
  810.         call turbo_off
  811.  
  812.         ld a,SND_PAGE
  813.         call setpg4000
  814.         ld a,(TURBOFMON)
  815.         or a
  816.         call nz,#400f;tfmshut
  817.         ld a,CC_PAGE1
  818.         call setpg4000
  819.         pop af
  820.         call reset_ay_ay
  821.  
  822.         call turbo_on
  823.  
  824.         ei
  825.         ret
  826.  
  827.         else
  828.  
  829.         di
  830.         call reset_ay_ay
  831.         ei
  832.         ret
  833.  
  834.         endif
  835.  
  836.         if 1==0
  837. turbo_on
  838.         ld a,%10101000 ;режим EGA с турбо
  839.         ld bc,#bd77
  840.         out (c),a
  841.         ret
  842.  
  843. turbo_off
  844.         ld a,%10100000 ;режим EGA без турбо, так как в 14 МГц скорость нестабильна
  845.         ld bc,#bd77
  846.         out (c),a
  847.         ret
  848.         endif
  849.  
  850. reset_ay_ay
  851. ;в TFM нужно для глушения AY перед выводом эффектов
  852.         push af
  853.         ifdef TFM
  854.         or %11111000
  855.         ;or %11111010           ;no wait sync
  856.         else
  857.         or #fe
  858.         endif
  859.         ld bc,#fffd
  860.         out (c),a
  861.  
  862.         xor a
  863.         ld l,a
  864. .l0
  865.         ld b,#ff
  866.         ifdef TFM
  867.         call libstartup_waitstatus
  868.         endif
  869.         out (c),a
  870.         ifdef TFM
  871.         call libstartup_waitstatus
  872.         endif
  873.         ld b,#bf
  874.         out (c),l
  875.         inc a
  876.         cp 14
  877.         jr nz,.l0
  878.         pop af
  879.         ret
  880.  
  881. ;запуск звукового эффекта
  882. _sfx_play
  883.         push bc
  884.         ld a,SND_PAGE
  885.         call setpg4000
  886.         pop bc
  887.         ld a,b
  888.         call AFX_PLAY
  889.         ld a,CC_PAGE1
  890.         jp setpg4000
  891.  
  892. ;останов звуковых эффектов
  893. _sfx_stop
  894.         xor a
  895.         jp reset_ay
  896.  
  897. ;запуск музыки
  898. _music_play
  899.         push ix
  900.         push iy
  901.         push af
  902.         ld a,SND_PAGE
  903.         call setpg4000
  904.  
  905.         ld a,(MUS_COUNT)
  906.         ld l,a
  907.         pop af
  908.  
  909.         cp l
  910.         jr nc,.skip
  911.  
  912.         ld h,high MUS_LIST
  913.         ld l,a
  914.  
  915.         ld e,(hl)
  916.         inc h
  917.         ld d,(hl)
  918.         inc h
  919.         ld a,(hl)
  920.         ex de,hl
  921.         di
  922.         ld (musicPage),a
  923.         call setpg8000
  924.         ifdef TFM
  925.         ld a,(TURBOFMON)
  926.         or a
  927.         call nz,PT3_INIT
  928.         else
  929.         ld bc,#fffd
  930.         ld a,#fe
  931.         out (c),a
  932.         call PT3_INIT
  933.         endif
  934.         ei
  935.         ld a,CC_PAGE2
  936.         call setpg8000
  937.  
  938. .skip
  939.         pop iy
  940.         pop ix
  941.  
  942.         ld a,CC_PAGE1
  943.         jp setpg4000
  944.  
  945.  
  946.  
  947. ;выключение музыки
  948. _music_stop
  949.         xor a
  950.         ld (musicPage),a
  951.         jp reset_ay
  952.        
  953.         export _music_play
  954.         export _music_stop
  955.         export _sample_play
  956.         export _sfx_play
  957.         export _sfx_stop
  958.  
  959.  
  960. ;переменные
  961.  
  962. musicPage               db 0
  963. tileOffset              dw 0
  964. spritesActive   db 0    ;1 если вывод спрайтов разрешён
  965. tileUpdate              db 0    ;1 если выводились тайлы, для системы обновления фона под спрайтами
  966. palTemp                 ds 16,0
  967. keysPrevState   ds 40,0
  968.         ifdef TFM
  969. ;turboFM                        db 0    ;!=0 если есть TFM
  970.         else
  971. turboSound              db 0    ;!=0 если есть TS
  972.         endif
  973.  
  974. ;экспортируемые переменные
  975.  
  976.         macro rgb222 b2,g2,r2
  977.         db (((r2&3)<<4)|((g2&3)<<2)|(b2&3))
  978.         endm
  979.  
  980.         align 16
  981. _palette
  982.         rgb222(0,0,0)
  983.         rgb222(0,0,2)
  984.         rgb222(2,0,0)
  985.         rgb222(2,0,2)
  986.         rgb222(0,2,0)
  987.         rgb222(0,2,2)
  988.         rgb222(2,2,0)
  989.         rgb222(2,2,2)
  990.         rgb222(0,0,0)
  991.         rgb222(0,0,3)
  992.         rgb222(3,0,0)
  993.         rgb222(3,0,3)
  994.         rgb222(0,3,0)
  995.         rgb222(0,3,3)
  996.         rgb222(3,3,0)
  997.         rgb222(3,3,3)
  998.  
  999. ;_memSlot1
  1000. ;curpg4000
  1001. ;        db 0
  1002. ;_memSlot2
  1003. ;curpg8000
  1004. ;        db 0
  1005. ;_memSlot3
  1006. ;curpgc000
  1007. ;        db 0
  1008.  
  1009. _borderCol      db 0
  1010. _palBright      dw 3<<6
  1011. _palChange      db 1
  1012. _screenActive   db 0    ;~1 или ~3
  1013. _mouse_dx       db 0
  1014. _mouse_dy       db 0
  1015. _mouse_x        db 80
  1016. _mouse_y        db 100
  1017. _mouse_cx1      db 0
  1018. _mouse_cx2      db 160
  1019. _mouse_cy1      db 0
  1020. _mouse_cy2      db 200
  1021. _mouse_btn      db 0
  1022. _mouse_prev_dx  db 0
  1023. _mouse_prev_dy  db 0
  1024. _time           dd 0
  1025.  
  1026.         export _borderCol
  1027.         export _palBright
  1028.         export _palChange
  1029.         export _sprqueue
  1030.         export _screenActive
  1031.         export _mouse_dx
  1032.         export _mouse_dy
  1033.         export _mouse_x
  1034.         export _mouse_y
  1035.         export _mouse_cx1
  1036.         export _mouse_cx2
  1037.         export _mouse_cy1
  1038.         export _mouse_cy2
  1039.         export _mouse_btn
  1040.         export _time
  1041.         export _palette
  1042.  
  1043.        
  1044. res_path
  1045. ;в этом относительном пути будут лежать все загружаемые данные игры
  1046.         ;db "nedoload"
  1047.         include "_temp_/sets.asm"
  1048.         db 0
  1049. fnbin
  1050.         ;db "code0.bin",0
  1051.         db "page_101.bin",0
  1052. fnbin2
  1053.         db "page_102.bin",0
  1054. fnbin3
  1055.         db "page_103.bin",0
  1056. fnaddr
  1057.         db "addr.bin",0
  1058. end        
  1059.  
  1060.         display "begin=",begin
  1061.         display "end=",end
  1062.         display "Size ",/d,end-begin," bytes"
  1063.        
  1064.         savebin "nedoload.com",begin,end-begin
  1065.        
  1066.         LABELSLIST "..\..\..\us\user.l"
  1067.