Subversion Repositories NedoOS

Rev

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