Subversion Repositories NedoOS

Rev

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

  1. ; Чёрный Ворон (С) Медноногов В.С, 1996,97
  2.         DEVICE ZXSPECTRUM1024
  3.         include "../../_sdk/sys_h.asm"
  4.  
  5. scrbase=0x4004;0
  6. sprmaxwid=32;24
  7. sprmaxhgt=32;24
  8. scrwid=96 ;double pixels
  9. scrhgt=192
  10.  
  11. EGA=1
  12.        
  13. ;*L+
  14. ;*D-
  15. SCR     EQU #C000
  16. ATR     EQU #D800
  17. ;-----------------------
  18. STACK=0x4000
  19. tempsp=0x3f06 ;6 bytes
  20. DBL_SP=0x3f00 ;INTSTACK
  21. ;timer=0x3f00 ;???
  22.  
  23. ;D$      MAC ;debug
  24. ;        DI
  25. ;        HALT
  26. ;        EI
  27. ;        ENDM
  28.  
  29. ;M$      MAC
  30. ;        LD      A,=0
  31. ;        CALL    MEM
  32. ;        ENDM
  33.  
  34.         macro ATRs _hl,_bc,_e
  35.         LD      HL,_hl;=0
  36.         LD      BC,_bc;=1
  37.         LD      E,_e;=2
  38.         CALL    ATRBAR
  39.         ENDM
  40.  
  41.         macro PUSHs
  42.         PUSH    HL
  43.         PUSH    DE
  44.         PUSH    BC
  45.         ENDM
  46.         macro POPs
  47.         POP     BC
  48.         POP     DE
  49.         POP     HL
  50.         ENDM
  51.  
  52.         slot 0
  53.         page 8
  54.  
  55.         slot 3
  56.         page 0
  57.         org PROGSTART
  58. begin
  59.         jp begingo ;/prsprqwid
  60.         jp _128
  61.         jp swapimer
  62. _128
  63.         push bc
  64.         ;LD     BC,#7FFD
  65.         LD      (R128),A
  66.         ;OUT    (C),A
  67.         ;and 7
  68.         ld ($+3+1),a
  69.         ld a,(ttexpgs)
  70.         ;LD     (R128),A
  71.         SETPG32KHIGH
  72.         pop bc
  73.         RET
  74. R128
  75.         db 0
  76.  
  77. swapimer
  78.         di
  79.          ;ld hl,(0x0038+3) ;адрес intjp
  80.          ;ld (intjpaddr),hl        
  81.         ld de,0x0038
  82.         ld hl,oldimer
  83.         ld bc,3
  84. swapimer0
  85.         ld a,(de)
  86.         ldi ;[oldimer] -> [0x0038]
  87.         dec hl
  88.         ld (hl),a ;[0x0038] -> [oldimer]
  89.         inc hl
  90.         jp pe,swapimer0
  91.         ei
  92.         ret
  93. oldimer
  94.         jp on_int ;заменится на код из 0x0038
  95.         jp 0x0038+3
  96.  
  97. on_int
  98. ;restore stack with de
  99.         EX DE,HL
  100.         EX (SP),HL
  101.         LD (on_int_jp),HL
  102.         EX DE,HL
  103.         LD (on_int_sp2),SP
  104.         LD SP,DBL_SP
  105.         CALL INAR0
  106.         call oldimer ;ei
  107. on_int_sp2=$+1
  108.         ld sp,0
  109.         pop de
  110.         EI
  111. on_int_jp=$+1
  112.         jp 0
  113.  
  114.  
  115.         align 256 ;0x200
  116. ttexpgs
  117.         ds 32 ;pg31=scr7
  118.  
  119.         include "w_intv.asm"
  120.         include "wlib1a.asm"
  121.         include "wlid.asm"
  122.         include "wmisc_4.asm"
  123. br_path
  124.         defb "br",0
  125. begingo
  126.         ld sp,STACK
  127.         OS_HIDEFROMPARENT
  128.         ld e,3
  129.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  130.         ld e,0
  131.         OS_SETSCREEN
  132.         ld e,0 ;color byte
  133.         OS_CLS
  134.         ld e,1
  135.         OS_SETSCREEN
  136.         ld e,0 ;color byte
  137.         OS_CLS
  138.  
  139.         ld b,25
  140. waitcls0
  141.         push bc
  142.         YIELD
  143.         pop bc
  144.         djnz waitcls0 ;чтобы nv не затёр pg7
  145.        
  146.                 ld de,br_path
  147.                 OS_CHDIR
  148.        if EGA
  149.         OS_GETMAINPAGES
  150. ;dehl=номера страниц в 0000,4000,8000,c000
  151.         ld a,e
  152.         LD (pgmain4000),A
  153.         ld a,h
  154.         LD (pgmain8000),A
  155.        endif
  156.  
  157.         ;OS_GETSCREENPAGES
  158. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  159.         ;ld a,l
  160.        if EGA
  161.         ;ld (setpgs_scr_low),a
  162.        endif
  163.         ;xor e
  164.        if EGA
  165.         ;ld (setpgs_scr_scrxor),a
  166.        endif
  167.         ld a,(user_scr1_high) ;ok
  168.          ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
  169.        if EGA
  170.          ;ld (scrpg7),a
  171.        else
  172.          ;ld (getttexpgs_basepg7),a
  173.        endif
  174.        if EGA
  175.         ;xor l
  176.         ;ld (setpgs_scr_pgxor),a
  177.        endif
  178.        
  179. ;не будем брать физические страницы, кроме 7, т.к. pg4 используется для запарывания осью
  180.  
  181.         if EGA
  182.         OS_NEWPAGE
  183.         ld a,e
  184.         ld (pgfake),a
  185.         ld (pgfake2),a
  186.         endif
  187.  
  188.         if 1==1
  189.        
  190.         ld hl,texfilename
  191.         ld b,ntexfilenames
  192. getttexpgs0
  193.         push bc
  194.         ld a,(hl)
  195.        if EGA==0
  196.         cp 7
  197. getttexpgs_basepg7=$+1
  198.         ld a,0
  199.         jr z,getttexpgs7
  200.        endif
  201.         push de
  202.         push hl
  203.         OS_NEWPAGE
  204.         ld a,e
  205.         pop hl
  206.         pop de
  207. getttexpgs7
  208.         ld c,(hl)
  209.         ld b,ttexpgs/256
  210.         ld (bc),a
  211.         inc hl
  212.         push hl
  213.         SETPG32KHIGH
  214.  
  215.         ld a,(hl)
  216.         cp ' '
  217.         jr nc,gettexpgs_noskipdata
  218.          ;jr $
  219.         inc hl
  220. gettexpgs_noskipdata
  221.         ex de,hl
  222.         push af
  223.         OS_OPENHANDLE
  224.         pop af ;CY=skip data, a=number of 8Ks to skip
  225.         jr nc,gettexpgs_noskipdata2
  226.         push bc
  227.         ld de,0
  228.         ld hl,0
  229.         rra
  230.         rr h
  231.         rra
  232.         rr h
  233.         rra
  234.         rr h
  235.         OS_SEEKHANDLE ;dehl=offset
  236.         pop bc
  237. gettexpgs_noskipdata2
  238.         push bc
  239.         ld de,0xc000 ;addr
  240.         ld hl,0x4000 ;size
  241.         OS_READHANDLE
  242.         pop bc
  243.         OS_CLOSEHANDLE
  244.                
  245.         pop hl
  246.         ld b,1
  247.         xor a
  248.         cpir ;after 0
  249.         pop bc
  250.         djnz getttexpgs0
  251.  
  252.         endif
  253.        
  254.         if EGA
  255. ;показываем флажки
  256.         call MEM7
  257.         call setpgsscr40008000 ;scr1
  258.         ld hl,0xc000
  259.         ld de,0x8000
  260.         ld bc,0x1b00
  261.         ldir
  262.         call setpgsmain40008000
  263.         endif
  264.        
  265.        
  266.         if EGA
  267.         ld hl,prsprqwid
  268.         ld (0x0101),hl
  269.         endif
  270.        
  271.         if EGA
  272.         call changescrpg ;на всякий случай, для заполнения переменных
  273.         call setpgsmain40008000 ;на всякой случай, для прерывания
  274.         endif
  275.      
  276.         call swapimer
  277.         jp JP_ST;wMAIN;GO
  278.         ;call GO
  279.         ;call swapimer
  280.         ;QUIT
  281.  
  282. setpal
  283.         if EGA
  284.         ld de,SUMMERPAL
  285.         else
  286.         ld de,RSTPAL
  287.         endif
  288.         OS_SETPAL
  289.         ret
  290.  
  291. SUMMERPAL
  292. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  293. ;high B, high b, low B, low b               6f G        ;,,в степи светло-жёлтый, а не ярко-зелёный 4d
  294.            ;ok      ;ok?    ;ok?   ;ok?   ;ok?  ;ok    ;ok   ;ok
  295.         dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  296.            ;ok?     ;ok     ;ok?   ;ok?   ;ok?  ;ok?   ;ok?  ;ok
  297.         dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  298. RSTPAL
  299.         STANDARDPAL
  300.  
  301.  
  302. texfilename
  303.         db 0,"br0.dat",0
  304.         db 1,"br1.dat",0
  305.         db 3,"br3.dat",0
  306.         db 4,"br4.dat",0
  307.         db 6,"br6.dat",0
  308.         db 7,"br7.dat",0
  309.        
  310.         if EGA==0
  311. ntexfilenames=6
  312.         else
  313.         db 8,"WHUM1.bin",0
  314.         db 9,"WHUM1b.bin",0
  315.         db 10,"WHUM1c.bin",0
  316.         db 11,"WHUMCAT.bin",0
  317.         db 12,"WHUMHOR.bin",0
  318.         db 13,"WORC1.bin",0
  319.         db 14,"WORC1b.bin",0
  320.         db 15,"WORC1c.bin",0
  321.         db 16,"WORCCAT.bin",0
  322.         db 17,"WORCHOR.bin",0
  323.         db 18,"WCREAT1.bin",0
  324.         db 19,"WCREAT1b.bin",0
  325.         db 20,"WCREAT1c.bin",0
  326.         db 21,"WCREAT2.bin",0 ;там же в 0xe800 demobar
  327.         db 22,"WCREAT2b.bin",0
  328.         db 23,"WCREAT2c.bin",0 ;там же трупы
  329.          db 24,"WBAR.bin",0 ;там же надписи
  330.         db 25,"WBULLET.bin",0
  331. ;26..28=land
  332.         db 26,"W1LAND.bin",0
  333.         db 27,2,"W1LAND.bin",0
  334.         db 28,4,"W1LAND.bin",0
  335.          db 29,"W0BUT.bin",0
  336.          db 30,1,"W0BUT.bin",0
  337. ntexfilenames=24+5
  338.         endif
  339.  
  340.         if EGA
  341. MP_OFF 
  342.         if 1==0
  343.         ld e,0
  344.         OS_SETSCREEN
  345.         ld e,0
  346.         OS_CLS
  347.         ld e,1
  348.         OS_SETSCREEN
  349.         ld e,0
  350.         OS_CLS
  351.         ret
  352.         else
  353. _mpoffwid=24
  354.         call setpgsscr40008000
  355.        
  356.         ld ix,scrbase+_mpoffwid
  357.         call MP_OFFlayer
  358.         ld ix,scrbase+0x4000+_mpoffwid
  359.         call MP_OFFlayer
  360.         ld ix,scrbase+0x2000+_mpoffwid
  361.         call MP_OFFlayer
  362.         ld ix,scrbase+0x6000+_mpoffwid
  363.         call MP_OFFlayer
  364.         jp setpgsmain40008000
  365.         endif
  366.  
  367.         if 1==1
  368. MP_OFFlayer  
  369.         LD (MP_OFFlayerSP),SP
  370.         LD bc,40
  371.         ld d,b
  372.         ld e,b
  373.         LD a,192
  374. MP_OFFlayer0
  375.         LD SP,ix
  376.         dup _mpoffwid/2-1
  377.         push de
  378.         edup
  379.         ld (ix-(_mpoffwid-1)),d
  380.         ld (ix-_mpoffwid),e
  381.         add ix,bc
  382.         dec a
  383.         jr nz,MP_OFFlayer0
  384. MP_OFFlayerSP=$+1
  385.         ld sp,0
  386.         ret
  387.         endif
  388.        
  389.         endif
  390.  
  391.  
  392.         if EGA
  393. putBAR
  394.         ld a,24
  395.         LD DE,0xc000;DSCR
  396. putBAR_ade
  397.         push de
  398.         call _128
  399.         LD A,2
  400.         LD (V_FLAG),A ;cursor off
  401.         CALL V_PUT1 ;visible screen
  402.         call setpgsscr40008000_current
  403.         pop de
  404.         push de
  405.         call putBARdoscr
  406.         CALL V_GET1 ;visible screen
  407.         CALL V_MRK1 ;visible screen
  408.         xor a
  409.         LD (V_FLAG),A ;cursor on
  410.         CALL V_PUT2
  411.         call setpgsscr40008000
  412.         pop de
  413.         call putBARdoscr
  414.         CALL V_GET2
  415.         call V_MRK2
  416.         jp setpgsmain40008000
  417. putBARdoscr
  418.         ;call changescrpg_current
  419.         ;LD DE,0xc000;DSCR
  420.         LD HL,scrbase+0x0018
  421.         LD BC,#1808
  422.         jr primgega
  423.  
  424. PUTSYM
  425. ;HL - adr in scr; DE-adr spr; BC-size(yx)
  426.         call setpgsscr40008000_current
  427. primgega
  428.         sla c
  429.         sla c
  430.         ld a,b
  431.         add a,a
  432.         add a,a
  433.         add a,a
  434.         ld b,a
  435. primgega_pixsz
  436. ;b=hgt,c=wid
  437. ;de=gfx
  438. ;hl=scr
  439. primgega0
  440.         push bc
  441.         ld hx,b
  442.         push hl
  443.         ld bc,40
  444. primgegacolumn0
  445.         ld a,(de)
  446.         inc de
  447.         ld (hl),a
  448.         add hl,bc
  449.         dec hx
  450.         jr nz,primgegacolumn0
  451.         pop hl
  452.         ld a,0x9f;0xa0
  453.         cp h
  454.         ld bc,0x4000
  455.         adc hl,bc
  456.         jp pe,primgegacolumn0q ;в половине случаев
  457. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  458.          inc a
  459.         xor h
  460.         ld h,a
  461. primgegacolumn0q
  462.         pop bc
  463.         dec c
  464.         jr nz,primgega0
  465.         jp setpgsmain40008000
  466.         endif
  467.        
  468.         macro MASKBYTE
  469.         ld a,(hl)
  470.         and e
  471.         or d
  472.         ld (hl),a
  473.         endm
  474.         macro DOWNBYTE
  475.         add hl,bc
  476.         endm
  477.  
  478.         if EGA
  479. prsprega
  480.         ld a,(Xh)
  481.         add a,a
  482.         add a,a
  483.         ld hl,(SHIFTh)
  484.         srl l
  485.         add a,l
  486.         add a,sprmaxwid-1
  487.         ld e,a
  488. ;e?1=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  489.         ld a,(Yh)
  490.         ld c,a
  491. ;c?2=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  492.  
  493.         ;di
  494.         push bc
  495.         call setpgsscr40008000
  496.         pop bc
  497.         ;ld c,0
  498.         ;ld e,sprmaxwid-1
  499.        
  500.         ld a,e
  501.         cp scrwid+(sprmaxwid-1)
  502.         jr nc,noprspr
  503.         ld a,c
  504.          add a,sprmaxhgt-1
  505.         cp scrhgt+(sprmaxhgt-1)
  506.         jr nc,noprspr
  507.         ;jr $
  508.         call prspr
  509. noprspr
  510.        
  511.         ;call setpgsmain40008000
  512.         ;ei
  513.         ;ret
  514. setpgsmain40008000
  515. pgmain4000=$+1
  516.         ld a,0
  517.         ;ld (curpg4000),a
  518.         SETPG16K
  519. pgmain8000=$+1
  520.         ld a,0
  521.         ;ld (curpg8000),a
  522.         SETPG32KLOW
  523.         ret
  524.  
  525. setpgsscr40008000_current
  526.         call getuser_scr_low_cur
  527.         ;ld (curpg4000),a ;TODO kill
  528.         SETPG16K
  529.         call getuser_scr_high_cur
  530.         ;ld (curpg8000),a ;TODO kill
  531.         SETPG32KLOW
  532.         ret
  533.  
  534. setpgsscr40008000
  535.         call getuser_scr_low
  536.         ;ld (curpg4000),a ;TODO kill
  537.         SETPG16K
  538.         call getuser_scr_high
  539.         ;ld (curpg8000),a ;TODO kill
  540.         SETPG32KLOW
  541.         ret
  542.  
  543. getuser_scr_low
  544. getuser_scr_low_patch=$+1
  545. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  546.         ld a,(user_scr1_low) ;ok
  547.         ret
  548.  
  549. getuser_scr_high
  550. getuser_scr_high_patch=$+1
  551. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  552.         ld a,(user_scr1_high) ;ok
  553.         ret
  554.  
  555. getuser_scr_low_cur
  556. getuser_scr_low_cur_patch=$+1
  557. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  558.         ld a,(user_scr0_low) ;ok
  559.         ret
  560.  
  561. getuser_scr_high_cur
  562. getuser_scr_high_cur_patch=$+1
  563. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  564.         ld a,(user_scr0_high) ;ok
  565.         ret
  566.  
  567. changescrpg_current
  568. ;        ld a,(setpgs_scr_low)
  569. ;setpgs_scr_scrxor=$+1
  570. ;        xor 0
  571. ;        ld (setpgs_scr_low),a
  572.         ld hl,getuser_scr_low_patch
  573.         ld a,(hl)
  574.         xor getuser_scr_low_patchN
  575.         ld (hl),a
  576.         ld hl,getuser_scr_high_patch
  577.         ld a,(hl)
  578.         xor getuser_scr_high_patchN
  579.         ld (hl),a
  580.         ld hl,getuser_scr_low_cur_patch
  581.         ld a,(hl)
  582.         xor getuser_scr_low_cur_patchN
  583.         ld (hl),a
  584.         ld hl,getuser_scr_high_cur_patch
  585.         ld a,(hl)
  586.         xor getuser_scr_high_cur_patchN
  587.         ld (hl),a
  588.  
  589.         ld a,1
  590. curscrnum=$+1
  591.         xor 0
  592.         ld ($-1),a
  593.         ret
  594.        
  595. changescrpg
  596.         call changescrpg_current
  597.         ld e,a
  598.         OS_SETSCREEN
  599.         ret
  600.        
  601. copyscreen
  602.         call setpgsscr40008000
  603.         ;ld a,(setpgs_scr_scrxor)
  604.         ;ld hl,setpgs_scr_low
  605.         ;xor (hl)
  606.         ;push af
  607.          call getuser_scr_low_cur
  608.         ;ld (curpg8000),a
  609.         SETPG32KLOW
  610.         ld hl,0x8000
  611.         ld de,0x4000
  612.         ld bc,0x4000
  613.         ldir
  614.         call setpgsscr40008000
  615.         ;pop bc
  616.         ;ld a,(setpgs_scr_pgxor)
  617.         ;xor b
  618.          call getuser_scr_high_cur
  619.         ;ld (curpg4000),a
  620.         SETPG16K
  621.         ld hl,0x4000
  622.         ld de,0x8000
  623.         ld bc,0x4000
  624.         ldir
  625.         jp setpgsmain40008000
  626.        
  627.         endif
  628.  
  629.         if EGA
  630. IND1    DEFB 127        ;тек знач ind1
  631. IND1MX  DEFB 145        ;макc знач
  632. IND2    DEFB 10
  633. IND2MX  DEFB 67
  634. IND2TP  DEFB 2          ;тип ind2 (0-none,1-magic,2-%)
  635. LMask   DEFB #C3 ;маска линии
  636. LMask_  DEFB 10
  637. timer
  638.         db 0
  639.         endif
  640.  
  641. SLOWER  ;замедлитель
  642.         EI
  643.         XOR A
  644.         OUT (254),A ;sys установки
  645.         LD A,(MAXTRY)
  646.         LD (makTRY),A ;ограничитель числа трассировок
  647.         ;
  648.         if EGA
  649.         display "wascurkeyredraw=",$,"<0x4000"
  650. wascurkeyredraw=$+1
  651.         ld a,0
  652.         cp key_redraw
  653.         if 1==1
  654.         jr nz,EmulatePPU_nofullcls
  655.         xor a
  656.         ld (wascurkeyredraw),a
  657.         ;push ix ;
  658.         ;push iy ;на всякий случай
  659.         ld e,0
  660.         OS_SETSCREEN
  661.         ld e,0 ;color byte
  662.         OS_CLS
  663.         ld e,1
  664.         OS_SETSCREEN
  665.         ld e,0 ;color byte
  666.         OS_CLS
  667.         call putBAR
  668.         call MAPoffclbuttons
  669.         call OUTBAR
  670.         call copyscreen
  671.         ;pop iy
  672.         ;pop ix
  673. EmulatePPU_nofullcls
  674.         endif
  675. ;ждать не менее 3 фреймов с прошлого раза
  676. oldtimer=$+1
  677.         ld c,0
  678. SLOWER0
  679.         ld a,(timer)
  680.         ld (oldtimer),a
  681.         sub c
  682.         cp 3;5
  683.         jr c,SLOWER0
  684.         else
  685.        
  686.         LD A,(SLOW)
  687.         OR A
  688.         RET Z
  689.         LD B,A
  690. ssLW    LD DE,4000 ;x112000тактов
  691. ssL1    DEC DE
  692.         LD A,E
  693.         OR D
  694.         JR NZ,ssL1
  695.         DJNZ ssLW
  696.         endif
  697.        
  698.         RET
  699.  
  700. ;;MATHEMATICAL LIBRARY  MATH-ZX
  701. ;MULB2  PUSH    HL       ;HL*E--DE  (C)
  702. ;       JR      MULENT
  703. ;MULB   PUSH    HL       ;L*E--DE
  704. ;       LD      H,0
  705. ;MULENT LD      A,E
  706. ;       LD      E,0
  707. ;       LD      D,E
  708. ;       JR      MMULB2
  709. ;MMULB1 ADD     HL,HL
  710. ;       JR      C,ENDMUL
  711. ;MMULB2 OR      A
  712. ;       JR      Z,ENDMUL
  713. ;       RRA
  714. ;       JR      NC,MMULB1
  715. ;       EX      DE,HL
  716. ;       ADD     HL,DE
  717. ;       EX      DE,HL
  718. ;       JR      MMULB1
  719. ;ENDMUL POP     HL
  720. ;       RET
  721. ;MUL    PUSH    HL ;HL*DE--DE
  722. ;       XOR     A
  723. ;       OR      D
  724. ;       JR      Z,MULENT
  725. ;       EX      DE,HL
  726. ;       XOR     A
  727. ;       OR      D
  728. ;       JR      Z,MULENT
  729. ;       SCF
  730. ;       POP     HL
  731. ;       RET
  732. DIVB    LD      D,0 ;E/L--E (MOD in D)
  733. DIVB2   PUSH    HL ;DE/L--E
  734.         PUSH    BC
  735.         LD      B,8
  736.         EX      DE,HL
  737.         LD      D,E
  738.         LD      E,0
  739. DIV1B   OR      A
  740.         RR      D
  741.         RR      E
  742.         SBC     HL,DE
  743.         JR      NC,MDIVB
  744.         ADD     HL,DE
  745. MDIVB   RLA
  746.         DJNZ    DIV1B
  747.         CPL
  748.         LD      D,L
  749.         LD      E,A
  750.         POP     BC
  751.         POP     HL
  752.         RET
  753.  
  754.         include "wmenu2.asm" ;было в pg7
  755.         include "wlie.asm"
  756.        
  757.         if EGA
  758. prspr
  759. ;в 4000,8000 уже включен экран (setpgsscr40008000)
  760. ;найти адрес, ширину, высоту спрайта по ID, phase + включить страницу в 0xc000
  761. ;...
  762.  
  763. ;iy=sprite data+2
  764. ;e?1=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  765. ;c?2=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  766. ;(iy-3)?3=sprhgt
  767. ;(iy-4)?4=sprwid
  768. ;по x,y, ширине, высоте найти адрес на экране, куда выводим видимую часть спрайта
  769. ;спрайт полной высоты и ширины должен работать максимально быстро!
  770.         ld a,scrwid+(sprmaxwid-1)
  771.         sub e ;x ;a=расстояние до правой границы экрана
  772.         ld hx,a
  773.         ;ld lx,0 ;по умолчанию нет фальшивого экрана, выход по правой границе экрана будет сразу ;для полной ширины не надо - выход будет по окончанию спрайта
  774.          ;ld lx,0 ;для спрайта полной высоты, клипированного справа - выход сразу на границе
  775.         ld a,e ;x
  776.         sub sprmaxwid-1
  777.         jr nc,prsprnocropleft
  778. ;[найти адрес начала видимой части спрайта:]
  779. ;[сначала столбец (прибавить hgt*2*число скрытых столбцов) можно в цикле, т.к. пропуск столбцов бывает редко]
  780. ;или включить фальшивый экран в 0x4000,0x8000 и заменить адреса выхода на переключалку страниц, так можно работать со спрайтами процедурой
  781. ;a=-число отрезанных слева столбцов
  782. ;посчитать hx для правильного выхода из фальшивого экрана
  783. ;посчитать lx для правильного выхода из спрайта в y-клипированной выводилке
  784.         ld l,a
  785.         add a,(iy-4)
  786.         ld lx,a ;sprwid-число отрезанных слева столбцов
  787. ;если <=0, то спрайта нет на экране!!! выходим!!!
  788.          ret m
  789.          ret z
  790.         xor a
  791.         sub l
  792.         ld hx,a ;число отрезанных слева столбцов
  793.         push bc
  794.         ld a,(pgfake)
  795.         ;ld (curpg4000),a
  796.         SETPG16K
  797.         ;ld (curpg8000),a
  798.         SETPG32KLOW
  799. ;hl будет вычислен с ошибкой +64
  800.         pop bc
  801.         ld a,l
  802.         or a
  803. prsprnocropleft
  804.         ld (prsprqsp),sp
  805. ;NC
  806.         ld b,0
  807.         ld l,c ;y
  808.         rra ;x bit 0
  809.         ;ld h,0x40/32/2
  810.         ;jr nc,$+4 ;x bit 0
  811.         ; ld h,0x80/32/2
  812.          ld h,b;0
  813.          rl h
  814.          inc h ;0x40/32/2 или 0x80/32/2
  815.         srl a ;x bit 1
  816.          rl h
  817.         add hl,hl
  818.         add hl,hl
  819.         add hl,bc
  820.         add hl,hl
  821.         add hl,hl
  822.         add hl,hl ;y*40+scrbase
  823.          add a,scrbase&0xff
  824. ;a=x/4
  825.         add a,l
  826.         ld l,a
  827.         adc a,h
  828.         sub l
  829.         ld h,a ;hl=scr ;не может быть переполнения при отрицательных x? maxhl = 199*40 + 127 = 8087
  830.         ld a,c ;y
  831.         ;add a,sprmaxhgt-1
  832.         ;sub sprmaxhgt-1
  833.         ;jp c,prsprcroptop
  834.          cp scrhgt
  835.          jp nc,prsprcroptop
  836.         add a,(iy-3) ;sprhgt
  837.         cp scrhgt+1 ;200=OK, >200=crop
  838.         jp nc,prsprcropbottom
  839. ;hx=расстояние до правой границы экрана (columns)
  840. ;x=156: hx=4
  841. ;x=157: hx=3
  842. ;x=158: hx=2
  843. ;x=159: hx=1
  844. ;если нет клипирования справа, то при нечётном x и чётном sprwid надо сделать строго hx>sprwid/2!
  845. ;lx важен только при клипировании слева
  846.          ld a,hx
  847.          inc a
  848.          srl a
  849.          ld hx,a ;lx не пересчитываем, он завышен в 2 раза, но тут в полном спрайте есть выход по ширине раньше
  850. ;hx=расстояние до правой границы экрана (double columns)
  851. ;x=156: hx=2
  852. ;x=157: hx=2
  853. ;x=158: hx=1
  854. ;x=159: hx=1
  855.         ld c,40 ;b=0
  856. ;iy=sprite data+2
  857.         ld e,(iy-2)
  858.         ld d,(iy-1)
  859.         ld sp,iy
  860. ;выбрать ветку в зависимости от sprhgt
  861.         ld a,(iy-3) ;sprhgt
  862.         cp 16
  863.         jr z,prspr16
  864.         jr nc,prspr24
  865. prspr8
  866.         ld a,prspr8column&0xff
  867.         ld (prsprcolumnpatch),a
  868.         ld (prsprcolumnpatch2),a
  869.         jp prspr8column+1
  870. prspr16
  871.         ld a,prspr16column&0xff
  872.         ld (prsprcolumnpatch),a
  873.         ld (prsprcolumnpatch2),a
  874.         jp prspr16column+1
  875. prspr24
  876.         cp 32
  877.         jr z,prspr32
  878.         ld a,prspr24column&0xff
  879.         ld (prsprcolumnpatch),a
  880.         ld (prsprcolumnpatch2),a
  881.         jp prspr24column+1
  882. prspr32
  883.         ld a,prspr32column&0xff
  884.         ld (prsprcolumnpatch),a
  885.         ld (prsprcolumnpatch2),a
  886.         jp prspr32column+1
  887.         align 256
  888. ;отдельная процедура для спрайта полной высоты, т.к. там не надо на каждом столбце переставлять sp
  889. prspr32column
  890.         dup 8
  891.         pop de
  892.         MASKBYTE
  893.         DOWNBYTE
  894.         edup
  895. prspr24column
  896.         dup 8
  897.         pop de
  898.         MASKBYTE
  899.         DOWNBYTE
  900.         edup
  901. prspr16column
  902.         dup 8
  903.         pop de
  904.         MASKBYTE
  905.         DOWNBYTE
  906.         edup
  907. prspr8column
  908.         display prspr32column," HSB equal to ",$
  909.         dup 7
  910.         pop de
  911.         MASKBYTE
  912.         DOWNBYTE
  913.         edup
  914.         pop de
  915.         MASKBYTE
  916. ;найти адрес следующего столбца на экране или выйти        
  917. ;4000,8000,[c000]6000,a000,[e001]4001... ;единственное расположение для такой логики (из-за константы 0xa0) (другой вариант - константа 0x60? тогда надо экран в 0000!!!)
  918. ;нельзя использовать строки, где h=0xa0, т.е. верхние 7 строк (остаётся 193 строки), иначе надо ld a,0x9f...inc a (+2t)
  919.         pop de ;годится только для спрайтов полной высоты (не прокатит даже если делать pop всех данных столбца, т.к. сдвиг hl разный - разве что и hl сдвигать при клипировании)
  920.         ld a,0x9f;0xa0
  921.         cp h
  922.         adc hl,de ;de = 0x4000 - ((sprhgt-1)*40)
  923.          ret c ;выход по ширине спрайта, там надо восстановить sp и константу в стеке
  924. prsprcolumnpatch=$+1
  925.         jp pe,prspr16column ;в половине случаев
  926. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  927.          inc a
  928.         xor h
  929.         ld h,a
  930.          dec hx
  931. goprsprcolumn
  932.          jp nz,prspr16column
  933. prsprcolumnpatch2=$-2
  934.          ;выход по границе экрана
  935. ;10+11+15+14 = 40t (+5+9)
  936. ;это может быть граница фальшивого экрана! надо иметь возможность продолжить (с hl-64 из-за ошибки адреса при отрицательных x?)
  937.         ld a,(curpg16k) ;ok
  938. pgfake2=$+1
  939.         cp 0
  940.         jp nz,prsprqright ;действительно выход по правой границе
  941. ;был фальшивый экран для клипирования по левой границе, продолжаем на настоящем экране
  942.         ld hx,lx
  943.         ld bc,-64
  944.         add hl,bc ;из-за ошибки адреса при отрицательных x
  945.          dec c ;NZ!!!
  946. ;как не запороть стек? даже если инлайнить вызов, там внутри всё равно rst
  947.         ld (prsprmaybeqrightsp),sp
  948.         ld sp,tempsp
  949.         call setpgsscr40008000 ;выключаем фальшивый экран, включаем настоящий
  950. prsprmaybeqrightsp=$+1
  951.         ld sp,0
  952.         ld bc,40
  953.         ;ld lx,b;0 ;второй раз будет действительно выход
  954.         jp goprsprcolumn ;NZ!!!
  955. ;можно то же самое сделать при спрайте кодом (патчи не нужны, de присваивать только если меняется, 13-1 байт (36.5t) лишних на столбец, выход по dec hx:ret z и просто ret в конце)
  956. ;а как делать вход в середину, если спрайты кодом, а de присваивается только при изменении? сначала рисовать в фальшивый экран и переключать по call z?
  957. ;но клипирование по y уже надо делать с данными спрайта, а не с кодом (т.е. нужна копия спрайта в виде данных)
  958.  
  959. ;выход по ширине спрайта
  960. prsprqwid
  961. ;у нас de взят с прошлого раза, и обработчик прерываний может запороть стек
  962.         ld hl,$
  963.         push hl ;если теперь произойдёт прерывание, то de не запорет стек
  964. prsprqright
  965. prsprqsp=$+1
  966.         ld sp,0
  967.         ret
  968.  
  969.        
  970. ;для вывода спрайта неполной высоты:
  971.  
  972. ;клипирование снизу
  973. prsprcropbottom
  974. ;a=sprbottom
  975. ;e?1=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  976. ;c?2=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  977. ;(iy-3)?3=sprhgt
  978. ;(iy-4)?4=sprwid
  979. ;hl=scr
  980.         sub scrhgt;200
  981.         ;sub (iy-3) ;sprhgt
  982.          ld d,(iy-3) ;sprhgt
  983.          sub d
  984.         ld c,a ;-sprvisiblehgt = sprbottom-200-sprhgt
  985. ;если клипировано слева, то сейчас lx = sprwid-число отрезанных слева столбцов
  986. ;иначе lx не задано
  987.        
  988.         ld a,(iy-4) ;sprwid
  989.         cp hx ;расстояние до правого края экрана
  990.         jr nc,prsprcropygo;_cropx ;берём меньшее из sprwid и расстояния до правой границы экрана
  991.         ld hx,a ;столько столбцов выведем
  992.         jp prsprcropygo
  993.  
  994. prsprcroptop
  995. ;a=sprtop
  996. ;e?1=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  997. ;c?2=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  998. ;(iy-3)?3=sprhgt
  999. ;(iy-4)?4=sprwid
  1000. ;hl=scr неверный (выше экрана)
  1001.        
  1002.         neg ;a=number of lines to crop
  1003.          ld d,(iy-3) ;sprhgt
  1004.          sub d
  1005. ;a = -sprvisiblehgt = -(sprtop+sprhgt) = linestocrop-sprhgt
  1006. ;если sprvisiblehgt<=0, то спрайта нет на экране!!! выходим!!!
  1007.          ret p
  1008.         ld c,a ;-sprvisiblehgt = -(sprtop+sprhgt) = linestocrop-sprhgt
  1009.  
  1010. ;если клипировано слева, то сейчас lx = sprwid-число отрезанных слева столбцов
  1011. ;иначе lx не задано
  1012.        
  1013.         ld a,(iy-4) ;sprwid
  1014.         cp hx ;расстояние до правого края экрана
  1015.         jr nc,prsprcropygo_cropx ;берём меньшее из sprwid и расстояния до правой границы экрана
  1016.         ld hx,a ;столько столбцов выведем
  1017. prsprcropygo_cropx
  1018.  
  1019.          ld a,c
  1020.          add a,d ;a=number of lines to crop
  1021.         add a,a
  1022. ;прибавить 2*число скрытых строк к адресу
  1023.         add a,ly
  1024.         ld ly,a
  1025.         jr nc,$+4
  1026.         inc hy
  1027.        
  1028.         ld a,e ;x
  1029.         sub sprmaxwid-1 ;NC для положительных x
  1030.         srl a
  1031.         ld h,0x40
  1032.         jr nc,$+4 ;x bit 0
  1033.          ld h,0x80
  1034.         srl a
  1035.         jr nc,$+4 ;x bit 1
  1036.          set 5,h
  1037.        add a,scrbase&0xff
  1038.         ld l,a
  1039.        
  1040. prsprcropygo
  1041. ;d=(iy-3)?3=sprhgt
  1042. ;(iy-4)?4=sprwid
  1043.         ld a,d ;sprhgt
  1044.         ;add a,c ;-sprvisiblehgt
  1045.         ; add a,3 ;inc a
  1046.         ;add a,a
  1047.         ;ld (prsprNspraddpatch),a ;2*(sprhgt-sprvisiblehgt)+2 +4
  1048.          inc a
  1049.          add a,a
  1050.         ld (prsprNspraddpatch),a ;2*sprhgt+2
  1051.  
  1052.         ld a,c ;-sprvisiblehgt
  1053.         add a,a
  1054.         add a,c
  1055.         add a,a
  1056.         ld (prsprNpatch),a ;PRSPR24 и т.п. (по 6 байт)        
  1057.  
  1058.         ex de,hl
  1059.          ;ld b,-1 ;убрать за счёт перемещения ld h
  1060.          ;ld h,0x40/32-1
  1061.          inc c
  1062.         ld l,c ;-sprvisiblehgt
  1063.         add hl,hl
  1064.         add hl,hl
  1065.          ld h,0x40/8-1 -1
  1066.          jr nz,$+4
  1067.          ld h,0x40/8 ;для sprvisiblehgt-1 == 0
  1068.         add hl,bc
  1069.         add hl,hl
  1070.         add hl,hl
  1071.         add hl,hl
  1072.         ld (prsprNscraddpatch),hl ;0x4000 - ((sprvisiblehgt-1)*40)
  1073.         ex de,hl
  1074.  
  1075. ;hl=scr
  1076.         ;ld c,40
  1077.         jp prsprN
  1078.  
  1079. ;выравнивание на нужный младший байт адреса:
  1080. _lowaddr=256-(sprmaxhgt*6)
  1081.         ds (_lowaddr-$)&0xff
  1082. ;младший байт адреса равен 256-(sprvisiblehgt*6)
  1083. PRSPR32
  1084.         dup 8
  1085.         MASKBYTE
  1086.         DOWNBYTE
  1087.         pop de
  1088.         edup
  1089. PRSPR24
  1090.         MASKBYTE
  1091.         DOWNBYTE
  1092.         pop de
  1093. PRSPR23
  1094.         MASKBYTE
  1095.         DOWNBYTE
  1096.         pop de
  1097. PRSPR22
  1098.         MASKBYTE
  1099.         DOWNBYTE
  1100.         pop de
  1101. PRSPR21
  1102.         MASKBYTE
  1103.         DOWNBYTE
  1104.         pop de
  1105. PRSPR20
  1106.         MASKBYTE
  1107.         DOWNBYTE
  1108.         pop de
  1109. PRSPR19
  1110.         MASKBYTE
  1111.         DOWNBYTE
  1112.         pop de
  1113. PRSPR18
  1114.         MASKBYTE
  1115.         DOWNBYTE
  1116.         pop de
  1117. PRSPR17
  1118.         MASKBYTE
  1119.         DOWNBYTE
  1120.         pop de
  1121. PRSPR16
  1122.         MASKBYTE
  1123.         DOWNBYTE
  1124.         pop de
  1125. PRSPR15
  1126.         MASKBYTE
  1127.         DOWNBYTE
  1128.         pop de
  1129. PRSPR14
  1130.         MASKBYTE
  1131.         DOWNBYTE
  1132.         pop de
  1133. PRSPR13
  1134.         MASKBYTE
  1135.         DOWNBYTE
  1136.         pop de
  1137. PRSPR12
  1138.         MASKBYTE
  1139.         DOWNBYTE
  1140.         pop de
  1141. PRSPR11
  1142.         MASKBYTE
  1143.         DOWNBYTE
  1144.         pop de
  1145. PRSPR10
  1146.         MASKBYTE
  1147.         DOWNBYTE
  1148.         pop de
  1149. PRSPR9
  1150.         MASKBYTE
  1151.         DOWNBYTE
  1152.         pop de
  1153. PRSPR8
  1154.         MASKBYTE
  1155.         DOWNBYTE
  1156.         pop de
  1157. PRSPR7
  1158.         MASKBYTE
  1159.         DOWNBYTE
  1160.         pop de
  1161. PRSPR6
  1162.         MASKBYTE
  1163.         DOWNBYTE
  1164.         pop de
  1165. PRSPR5
  1166.         MASKBYTE
  1167.         DOWNBYTE
  1168.         pop de
  1169. PRSPR4
  1170.         MASKBYTE
  1171.         DOWNBYTE
  1172.         pop de
  1173. PRSPR3
  1174.         MASKBYTE
  1175.         DOWNBYTE
  1176.         pop de
  1177. PRSPR2
  1178.         MASKBYTE
  1179.         DOWNBYTE
  1180.         pop de
  1181. PRSPR1
  1182.         display PRSPR32," HSB equal to ",$
  1183.         MASKBYTE
  1184.        
  1185. ;найти адрес следующего столбца на экране или выйти        
  1186. ;4000,8000,[c000]6000,a000,[e001]4001...
  1187. ;восстановить начальный hl
  1188. prsprNscraddpatch=$+1
  1189.         ld bc,0 ;bc = 0x4000 - ((sprvisiblehgt-1)*40)
  1190.         ld a,0x9f;0xa0
  1191.         cp h
  1192.         adc hl,bc
  1193.         jp pe,prsprNcolumnq ;в половине случаев
  1194. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  1195.          inc a
  1196.         xor h
  1197.         ld h,a
  1198. prsprNcolumnq
  1199.         dec hx
  1200.         jp z,prsprNmaybeqright ;это может быть граница фальшивого экрана! надо иметь возможность продолжить (с hl-64 из-за ошибки адреса при отрицательных x?)
  1201. prsprNcolumnqq
  1202. ;найти адрес данных следующего столбца спрайта
  1203. ;можно просто сделать много пустых pop de, т.к. пропуск строк бывает редко
  1204. prsprNspraddpatch=$+1
  1205.         ld bc,0 ;bc = 2*(sprhgt-sprvisiblehgt)+2
  1206.         add iy,bc
  1207. prsprN
  1208. ;iy=sprite data
  1209.         ld c,40
  1210.         ld sp,tempsp ;чтобы не намусорить новым de в старых данных
  1211.         ld e,(iy-2)
  1212.         ld d,(iy-1)
  1213.         ld sp,iy
  1214. prsprNpatch=$+1
  1215.         jp PRSPR24
  1216.        
  1217. prsprNmaybeqright
  1218.         ld a,(curpg32klow) ;ok
  1219. pgfake=$+1
  1220.         cp 0
  1221.         jp nz,prsprqright ;действительно выход
  1222.         ld hx,lx
  1223.         ld bc,-64
  1224.         add hl,bc ;из-за ошибки адреса при отрицательных x
  1225.         ld sp,tempsp
  1226.         call setpgsscr40008000 ;выключаем фальшивый экран, включаем настоящий
  1227.         ;ld bc,40
  1228.         ;ld lx,b;0 ;второй раз будет действительно выход
  1229.         jp prsprNcolumnqq
  1230.         endif
  1231.        
  1232.         if EGA
  1233. G_MX    DEFB  010
  1234. G_MY    DEFB  010
  1235.  
  1236. ARRHGT=8
  1237.  
  1238. getarr
  1239. ;hl=x
  1240. ;a=y
  1241. ;de=buf
  1242.          ;di
  1243.         ex de,hl
  1244.         ld (hl),e
  1245.         inc hl
  1246.         ld (hl),a
  1247.         inc hl
  1248.         ex de,hl
  1249.         push de
  1250.         call prarr_calccur
  1251.         pop hl
  1252. getarrcolumn0
  1253.         ld bc,40
  1254.         ld hy,ly
  1255.         ex de,hl
  1256. ;hl=scr
  1257. ;de=buf
  1258.         push hl
  1259.         dup ARRHGT-1
  1260.         ld a,(hl) ;scr
  1261.         ld (de),a
  1262.         inc de
  1263.          dec hy
  1264.          jr z,getarrcolumnq
  1265.         add hl,bc
  1266.         edup
  1267.         ld a,(hl) ;scr
  1268.         ld (de),a
  1269.         inc de
  1270. getarrcolumnq
  1271.         pop hl
  1272.         ld a,0x9f;0xa0
  1273.         cp h
  1274.         ld bc,0x4000
  1275.         adc hl,bc
  1276.         jp pe,getarrcolumnqq ;в половине случаев
  1277. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  1278.          inc a
  1279.         xor h
  1280.         ld h,a
  1281. getarrcolumnqq
  1282.         ex de,hl
  1283.         dec lx
  1284.         jr nz,getarrcolumn0
  1285.          ;ei
  1286.         ret ;jp setpgsmain40008000
  1287.  
  1288. rearr
  1289. ;hl=buf
  1290.         ld e,(hl)
  1291.         inc hl
  1292.         ld a,(hl)
  1293.         inc hl
  1294.         ex de,hl
  1295.         ld h,0
  1296. ;hl=x
  1297. ;a=y
  1298.         push de
  1299.         call prarr_calccur
  1300.         pop hl
  1301. rearrcolumn0
  1302.         ld bc,40
  1303.         ld hy,ly
  1304.         ex de,hl
  1305. ;hl=scr
  1306. ;de=buf
  1307.         push hl
  1308.         dup ARRHGT-1
  1309.         ld a,(de)
  1310.         ld (hl),a ;scr
  1311.         inc de
  1312.          dec hy
  1313.          jr z,rearrcolumnq
  1314.         add hl,bc
  1315.         edup
  1316.         ld a,(de)
  1317.         ld (hl),a ;scr
  1318.         inc de
  1319. rearrcolumnq
  1320.         pop hl
  1321.         ld a,0x9f;0xa0
  1322.         cp h
  1323.         ld bc,0x4000
  1324.         adc hl,bc
  1325.         jp pe,rearrcolumnqq ;в половине случаев
  1326. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  1327.          inc a
  1328.         xor h
  1329.         ld h,a
  1330. rearrcolumnqq
  1331.         ex de,hl
  1332.         dec lx
  1333.         jr nz,rearrcolumn0
  1334.         ret ;jp setpgsmain40008000
  1335.  
  1336.  
  1337. prarr
  1338. ;hl=x
  1339. ;a=y
  1340.          ;di
  1341.         call prarr_calccur
  1342. prarrcolumn0
  1343.         ld bc,40
  1344.         ld hy,ly
  1345.         push de
  1346.         push hl
  1347.         dup ARRHGT-1
  1348.         ld a,(de) ;scr
  1349.         and (hl) ;mask
  1350.         inc hl
  1351.         xor (hl) ;pixels
  1352.         ld (de),a ;scr
  1353.          dec hy
  1354.          jr z,prarrcolumnq
  1355.         inc hl
  1356.         ex de,hl
  1357.         add hl,bc
  1358.         ex de,hl
  1359.         edup
  1360.         ld a,(de) ;scr
  1361.         and (hl) ;mask
  1362.         inc hl
  1363.         xor (hl) ;pixels
  1364.         ld (de),a ;scr
  1365. prarrcolumnq
  1366.         pop hl
  1367.         ld de,ARRHGT*2
  1368.         add hl,de
  1369.         pop de
  1370.         ex de,hl
  1371.         ld a,0x9f;0xa0
  1372.         cp h
  1373.         ld bc,0x4000
  1374.         adc hl,bc
  1375.         jp pe,prarrcolumnqq ;в половине случаев
  1376. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  1377.          inc a
  1378.         xor h
  1379.         ld h,a
  1380. prarrcolumnqq
  1381.         ex de,hl
  1382.         dec lx
  1383.         jp nz,prarrcolumn0
  1384.          ;ei
  1385.         ret ;jp setpgsmain40008000
  1386.  
  1387. prarr_calccur
  1388. ;hl=x
  1389. ;a=y
  1390. ;out: hl=scr+, de=gfx, lx=wid
  1391.         ld e,a
  1392.         push hl ;x
  1393.         ld c,l
  1394.         rr c
  1395.          ;push af ;CY=x0
  1396.         ex de,hl ;push de ;e=y
  1397.         ;ld a,(prarr_zone)
  1398.         ;cp ZONE_WORK
  1399. G_IMG=$+1
  1400.         ld de,G_IMG1;sprarr_l
  1401.         ;ld bc,sprarr_r
  1402.         ;pop hl ;l=y
  1403. ;l=y
  1404. ;de=spr_l
  1405. ;bc=spr_r
  1406.         ;pop af ;CY=x0
  1407.         jr nc,prarr_nor ;de=спрайт для чётного x
  1408.         ;ld d,b
  1409.         ;ld e,c ;de=спрайт для нечётного x
  1410.         ld a,e
  1411.         add a,8*ARRHGT+1
  1412.         ld e,a
  1413.         jr nc,$+3
  1414.         inc d
  1415. prarr_nor
  1416.         pop bc ;x
  1417.         ld a,(de)
  1418.         ld lx,a
  1419.         inc de
  1420. ;l=y
  1421. ;bc=x
  1422. ;de=spr
  1423. ;lx=wid
  1424.         ;ret      
  1425. ;prarr_calcscr
  1426. ;l=y
  1427. ;bc=x
  1428. ;de=spr
  1429. ;lx=wid
  1430.         push de ;spr
  1431.         ld h,0 ;y HSB
  1432.         ld a,scrhgt
  1433.         sub l ;y
  1434.         ld ly,a ;200-y
  1435.         ld d,h;0x80/8;scrbase/256/8
  1436.         ld e,l
  1437.         add hl,hl
  1438.         add hl,hl
  1439.         add hl,de ;y*5
  1440.         add hl,hl
  1441.         add hl,hl
  1442.         add hl,hl ;y*40 + scrbase
  1443.         pop de ;spr
  1444.         srl b ;теперь b=0
  1445.         rr c ;c=x/2
  1446.         ld a,160;scrwid/2
  1447.         sub c ;scrwid/2-(x/2)
  1448.         cp lx
  1449.         jr nc,$+2+2 ;scrwid/2-(x/2) >= ширина
  1450.         ld lx,a ;scrwid/2-(x/2) < ширина
  1451.         srl c
  1452.         jr nc,$+4
  1453.         set 6,h
  1454.         srl c
  1455.         jr nc,$+4
  1456.         set 5,h
  1457.          ;ld b,-0x40 ;для scrbase=0x4000
  1458.         add hl,bc
  1459.          ld bc,scrbase
  1460.          add hl,bc
  1461.         ex de,hl
  1462. ;de=scr
  1463. ;lx=ширина
  1464. ;ly=200-y
  1465.         ret
  1466.  
  1467. arbuf0
  1468.         ds 2 + (8*ARRHGT)
  1469. arbuf1
  1470.         ds 2 + (8*ARRHGT)
  1471.        
  1472. ;%rlrrrlll
  1473. _xx=0x00ff
  1474. _x0=0x0047
  1475. _0x=0x00b8
  1476. _x1=0xb847
  1477. _1x=0x47b8
  1478. _10=0x4700
  1479. _01=0xb800
  1480. _00=0x0000
  1481. _11=0xff00
  1482.  
  1483. G_IMG1
  1484. sprarr_l
  1485. ;mask,pixels = 0xppmm
  1486. ;%rlrrrlll
  1487.         db 4
  1488.         ;dw 0x0000,0xb800,0xb800,0xb800,0xb800,0xb800,0xb800,0xb800,0xb800,0x0047,0x00ff,0x00ff,0x00ff
  1489.         ;dw 0x00ff,0x00b8,0x4700,0xff00,0xff00,0xff00,0xff00,0xff00,0x0000,0x0047,0x00ff,0x00ff,0x00ff
  1490.         ;dw 0x00ff,0x00ff,0x00ff,0x00b8,0x4700,0xff00,0xff00,0x4700,0x4700,0x4700,0xb800,0xb800,0x0047
  1491.         ;dw 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00b8,0x4700,0x00b8,0x00ff,0x00ff,0x00b8,0x00b8,0x00ff
  1492.         dw _11,_10,_10,_10,_10,_11,_x1,_xx
  1493.         dw _11,_00,_00,_00,_00,_01,_11,_xx
  1494.         dw _11,_01,_00,_01,_00,_00,_10,_11
  1495.         dw _xx,_1x,_1x,_1x,_11,_01,_11,_1x
  1496. sprarr_r
  1497. ;mask,pixels = 0xppmm
  1498. ;%rlrrrlll
  1499.         db 5
  1500.         ;dw 0x0047,0x0047,0x0047,0x0047,0x0047,0x0047,0x0047,0x0047,0x0047,0x00ff,0x00ff,0x00ff,0x00ff
  1501.         ;dw 0x00b8,0x4700,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0x4700,0x00b8,0x00ff,0x00ff,0x00ff
  1502.         ;dw 0x00ff,0x00ff,0x00b8,0x4700,0xff00,0xff00,0xff00,0xff00,0xb800,0xb800,0x0047,0x0047,0x00ff
  1503.         ;dw 0x00ff,0x00ff,0x00ff,0x00ff,0x00b8,0x4700,0xff00,0x0000,0x00b8,0x00b8,0x4700,0x4700,0x00b8
  1504.         ;dw 0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00b8,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff
  1505.         dw _x1,_x1,_x1,_x1,_x1,_x1,_xx,_xx
  1506.         dw _11,_00,_00,_00,_00,_10,_11,_xx
  1507.         dw _11,_00,_00,_00,_00,_10,_11,_x1
  1508.         dw _1x,_11,_01,_11,_01,_00,_01,_11
  1509.         dw _xx,_xx,_xx,_xx,_1x,_1x,_1x,_xx
  1510.  
  1511. G_FIX1
  1512. sprarrfix_l
  1513.         db 4
  1514.         dw _00,_01,_01,_01,_01,_00,_x0,_xx
  1515.         dw _00,_11,_11,_11,_11,_10,_00,_xx
  1516.         dw _00,_10,_11,_10,_11,_11,_01,_00
  1517.         dw _xx,_0x,_0x,_0x,_00,_10,_00,_0x
  1518. sprarrfix_r
  1519.         db 5
  1520.         dw _x0,_x0,_x0,_x0,_x0,_x0,_xx,_xx
  1521.         dw _00,_11,_11,_11,_11,_01,_00,_xx
  1522.         dw _00,_11,_11,_11,_11,_01,_00,_x0
  1523.         dw _0x,_00,_10,_00,_10,_11,_10,_00
  1524.         dw _xx,_xx,_xx,_xx,_0x,_0x,_0x,_xx
  1525.  
  1526. G_MAP1
  1527. sprarrmap_l
  1528.         db 4
  1529.         dw _00,_01,_01,_01,_01,_00,_x0,_xx
  1530.         dw _00,_11,_00,_00,_01,_10,_00,_xx
  1531.         dw _00,_10,_01,_10,_01,_10,_01,_00
  1532.         dw _xx,_0x,_0x,_0x,_00,_10,_00,_0x
  1533. sprarrmap_r
  1534.         db 5
  1535.         dw _x0,_x0,_x0,_x0,_x0,_x0,_xx,_xx
  1536.         dw _00,_11,_10,_10,_10,_01,_00,_xx
  1537.         dw _00,_11,_00,_01,_10,_01,_00,_x0
  1538.         dw _0x,_00,_10,_00,_10,_01,_10,_00
  1539.         dw _xx,_xx,_xx,_xx,_0x,_0x,_0x,_xx
  1540.         endif ;EGA
  1541.        
  1542.         if EGA
  1543. WFONT
  1544.         incbin "data/wfont.fnt"
  1545.  
  1546.         macro PRCHARBYTE
  1547.         xor a
  1548.         sla b
  1549.         jr nc,$+4
  1550.         or 0x47 ;L
  1551.         sla b
  1552.         jr nc,$+4
  1553.         or 0xb8 ;R
  1554.         ld (hl),a
  1555.         endm
  1556.        
  1557.         macro PRCHARINVBYTE
  1558.         xor a
  1559.         sla b
  1560.         jr c,$+4
  1561.         or 0x47 ;L
  1562.         sla b
  1563.         jr c,$+4
  1564.         or 0xb8 ;R
  1565.         ld (hl),a
  1566.         endm
  1567.        
  1568.         macro PRCHAR4BYTES
  1569.         ld a,(de)
  1570.         ld b,a
  1571.         PRCHARBYTE
  1572.         ld a,h
  1573.         add a,0x40
  1574.         ld h,a
  1575.         PRCHARBYTE
  1576.         ld a,h
  1577.         add a,0x20-0x40
  1578.         ld h,a
  1579.         PRCHARBYTE
  1580.         ld a,h
  1581.         add a,0x40
  1582.         ld h,a
  1583.         PRCHARBYTE
  1584.         endm
  1585.        
  1586.         macro PRCHARINV4BYTES
  1587.         ld a,(de)
  1588.         ld b,a
  1589.         PRCHARINVBYTE
  1590.         ld a,h
  1591.         add a,0x40
  1592.         ld h,a
  1593.         PRCHARINVBYTE
  1594.         ld a,h
  1595.         add a,0x20-0x40
  1596.         ld h,a
  1597.         PRCHARINVBYTE
  1598.         ld a,h
  1599.         add a,0x40
  1600.         ld h,a
  1601.         PRCHARINVBYTE
  1602.         endm
  1603.  
  1604. prchar
  1605. ;de=yx
  1606. ;a=char
  1607.         ADD A,A
  1608.         LD BC,(FONT)
  1609.         LD L,A
  1610.         LD H,0
  1611.         ADD HL,HL
  1612.         ADD HL,HL
  1613.         ADD HL,BC
  1614.         call setpgsscr40008000_current
  1615.         ex de,hl ;de=font+
  1616. ;hl=yx
  1617.         ld a,l
  1618.         ld l,h
  1619.         ld h,0
  1620.         sla l
  1621.         sla l
  1622.         sla l ;y*8
  1623.         ld b,0x40/8
  1624.         ld c,l
  1625.         add hl,hl
  1626.         add hl,hl
  1627.         add hl,bc
  1628.         add hl,hl
  1629.         add hl,hl
  1630.         add hl,hl ;y*8*40
  1631.          add a,scrbase&0xff
  1632.         add a,l
  1633.         ld l,a
  1634.         jr nc,$+3
  1635.         inc h
  1636.        
  1637. ;hl=scr
  1638.         ld c,40
  1639.         dup 7
  1640.         PRCHAR4BYTES
  1641.         ld b,-0x60
  1642.         add hl,bc        
  1643.         inc de
  1644.         edup
  1645.         PRCHAR4BYTES
  1646.  
  1647.         jp setpgsmain40008000
  1648.  
  1649.  
  1650. prcharinv
  1651. ;de=yx
  1652. ;a=char
  1653.         ADD A,A
  1654.         LD BC,(FONT)
  1655.         LD L,A
  1656.         LD H,0
  1657.         ADD HL,HL
  1658.         ADD HL,HL
  1659.         ADD HL,BC
  1660.         call setpgsscr40008000;_current
  1661.         ex de,hl ;de=font+
  1662. ;hl=yx
  1663.         ld a,l
  1664.         ld l,h
  1665.         ld h,0
  1666.         sla l
  1667.         sla l
  1668.         sla l ;y*8
  1669.         ld b,0x40/8
  1670.         ld c,l
  1671.         add hl,hl
  1672.         add hl,hl
  1673.         add hl,bc
  1674.         add hl,hl
  1675.         add hl,hl
  1676.         add hl,hl ;y*8*40
  1677.          add a,scrbase&0xff
  1678.         add a,l
  1679.         ld l,a
  1680.         jr nc,$+3
  1681.         inc h
  1682.        
  1683. ;hl=scr
  1684.         ld c,40
  1685.         dup 7
  1686.         PRCHARINV4BYTES
  1687.         ld b,-0x60
  1688.         add hl,bc        
  1689.         inc de
  1690.         edup
  1691.         PRCHARINV4BYTES
  1692.  
  1693.         jp setpgsmain40008000
  1694.  
  1695.         endif ;EGA
  1696.  
  1697.        if EGA
  1698.         align 256
  1699. ;---выровн табл (H-без изменений)------------
  1700. MLtab1  DEFB #FF,#7F,#3F,#1F,#F,#7,#3,#1        ;для hLINE
  1701. MLtab2  DEFB #80,#C0,#E0,#F0,#F8,#FC,#FE,#FF
  1702. MLtabV  DEFB #80,#40,#20,#10,#8,#4,#2,#1        ;для vLINE
  1703.        endif
  1704.  
  1705.         if 1==0
  1706.         ds 0x3b00-$
  1707.         ;include "WHUM1.ast"
  1708. testspr
  1709. _hgt=16
  1710. _wid=8 ;width/2
  1711.         db _wid
  1712.         db _hgt
  1713. _=_wid
  1714.         dup _wid
  1715.         dup _hgt*2
  1716.         db (0xaa+$)&0xff
  1717.         edup
  1718. _=_-1
  1719.         if _ != 0
  1720.         dw 0x4000 - ((_hgt-1)*40)
  1721.         else
  1722.         dw 0xffff
  1723.         endif
  1724.         edup
  1725.         dw prsprqwid
  1726.         endif
  1727.        
  1728.         ds 0x3e00-$
  1729.         ds 0x4000-$ ;ORG #4000
  1730. ;--------/MEM--------
  1731.         nop ;IR128   DEFB    0
  1732.         nop ;R128    DEFB    %11000
  1733.         nop ;CHK#0   DEFB    #EE       ;[**B] чек-сум0 ;#4002 ;???
  1734. ;--------- i/o переменные ---
  1735. DISK_2  DEFB    1 ;номер дисковода для диска 2
  1736. DISK_T  DEFB    0 ;номер дисковода для отгрузок
  1737. SIDE    DEFB    0 ;сторона
  1738. MEM16   DEFW    0 ;?
  1739. tDRIVE  DEFB    1 ;текущ дисковод 0/1
  1740. fADR    DEFW    0 ;адр загр ф-ла
  1741. ;-------- текущ файлы ----
  1742. MORTE   DEFB 0;86 - супер энергия
  1743.         nop ;CHK#1   DEFB    #EE       ;[**B] чек-сум1 ;#400C ;???
  1744. ;
  1745. _sBUTT  DEFB 0; 0-1
  1746. _sLAND  DEFB #FE; 1-4
  1747. _sMUS   DEFB #FB; 0-7
  1748.         nop ;isTST5  DEFB    %11000 ;пров 5 [**] ;???
  1749.  
  1750.        
  1751.         ;ENT $ ;>>>>>
  1752. ;GO
  1753.         ;ds 2
  1754. JP_ST   DI
  1755.         ;LD A,#41
  1756.         ;LD I,A
  1757.         LD SP,STACK;#403E
  1758.         JP wMAIN
  1759.  
  1760.         db "Made by Copper Feet 1997 v1.01.B"
  1761.        
  1762.         ds #4040-$
  1763.         JP INTRP ;in #4040
  1764. ;--адреса.некот.таблиц--
  1765. CHK#2   DEFW    #EEEE   ;[**W] чек-сум2 ;#4043
  1766. CHK#3   DEFB    #EE     ;[**B] чек-сум3 ;#4045
  1767.         DEFW    BFORCE  ;#4046
  1768.         DEFW    hBUT    ;#4048
  1769.         DEFW    hMSG    ;#404A
  1770.         DEFW    hCLRIC  ;#404C
  1771.         DEFW    hWIZRD  ;#404E
  1772. ;==================================обслуживание клавиатуры
  1773. PRSKEY  PUSH    BC
  1774.         LD      C,#FE
  1775.         CALL    PRSROW
  1776.         POP     BC
  1777.         AND     C
  1778.         RET
  1779.  
  1780. PRSROW  IN      A,(C)
  1781.         CPL
  1782.         AND     #1F
  1783.         RET
  1784.  
  1785. CONTR  
  1786.         PUSHs
  1787.         LD      A,(KEYJOY)
  1788.         OR      A
  1789.         JR      Z,CO1
  1790.         LD      C,#1F
  1791.         CALL    PRSROW
  1792.         XOR     #1F
  1793. CO2     LD      (CONTRB),A
  1794.         LD      A,(PMOUSE)
  1795.         OR      A
  1796.         CALL    NZ,MOUSE
  1797.         POPs
  1798.         LD      A,(CONTRB)
  1799.         RET
  1800. CO1     LD      HL,(KEYS)
  1801.         LD      E,0
  1802.         LD      D,5
  1803. CO3     LD      C,(HL)
  1804.         INC     HL
  1805.         LD      B,(HL)
  1806.         CALL    PRSKEY
  1807.         JR      Z,CO4
  1808.         SET     5,E
  1809. CO4     RRC     E
  1810.         DEC     D
  1811.         INC     HL
  1812.         JR      NZ,CO3
  1813.         LD      A,E
  1814.         JR      CO2
  1815.  
  1816. DELAY   HALT
  1817.         DEC A
  1818.         JR NZ,DELAY
  1819.         RET Z
  1820.  
  1821. KBR     DEFW    #DF01,#DF02,#FD01,#FB01,#7F15
  1822. INT2    DEFW    #EF08,#EF10,#EF04,#EF02,#EF01
  1823. ;;KUR   DEFW    #EF04,#F710,#EF10,#EF08,#EF01 ;;;
  1824.  
  1825. RND     PUSH    HL
  1826.         LD      HL,(RNA)
  1827.         INC     HL
  1828. ;;;     LD      A,R
  1829. ;;;     ADD     A,H
  1830.         LD      A,H ;;;
  1831.         AND     #3F;#1F
  1832.         LD      H,A
  1833.         LD      A,(RNB)
  1834.         RRCA
  1835.         XOR     (HL)
  1836.         ADD     A,L
  1837.         LD      (RNA),HL
  1838.         LD      (RNB),A
  1839.         POP     HL
  1840.         RET
  1841.  
  1842. ;--------------проверка денег---
  1843. chkCRC  PUSH HL ;проверить к/сумму денег
  1844.         PUSH AF
  1845.         CALL suMdig
  1846.         display "chkCRC cp (hl)=",$
  1847.         display "MONEY=",MONEY
  1848.         display "MORTE 86=",MORTE
  1849.         CP a;(HL)
  1850.         JR Z,exiCRC
  1851. suMdig  ;вычислить к/с денег
  1852.         PUSH BC
  1853.         LD HL,MONEY-1
  1854.         LD B,6
  1855.         LD A,(TASK_M+10)
  1856. suM1    INC HL
  1857.         RLCA
  1858.         RLCA
  1859.         RLCA
  1860.         XOR (HL)
  1861.         SUB L
  1862.         DJNZ suM1
  1863.         POP BC
  1864.         LD HL,MNYcrc
  1865.         RET
  1866. setC1   SCF
  1867. setCRC  PUSH HL ;установить к/с денег
  1868.         PUSH AF
  1869.         CALL suMdig
  1870.         LD (HL),A
  1871. exiCRC  POP AF
  1872.         POP HL
  1873.         RET
  1874. ;----------------Interupt table
  1875.         ds #4100-$
  1876.         DEFS 257,#40
  1877. ;---выровн табл (H-без изменений)------------
  1878. inMAP   DEFW 64,65,1,-63,-64,-65,-1,63 ;for MAKE_R
  1879.         if EGA==0
  1880. MLtab1  DEFB #FF,#7F,#3F,#1F,#F,#7,#3,#1        ;для hLINE
  1881. MLtab2  DEFB #80,#C0,#E0,#F0,#F8,#FC,#FE,#FF
  1882. MLtabV  DEFB #80,#40,#20,#10,#8,#4,#2,#1        ;для vLINE
  1883.         endif
  1884. GO_Ntb  ;смещ по напр y,x;y,x;y,x...  для GO_NXT
  1885.         DEFB 0,1, 1,1, 1,0, 1,-1, 0,-1, -1,-1, -1,0, -1,1; (8)
  1886. ;---------------------------------------------
  1887. GO_Nt2  ;...продолж для расст =2
  1888.         DEFB 2,-1, 2,0, 2,1, -2,1, -2,0, -2,-1
  1889.         DEFB 1,2, 0,2, -1,2, -1,-2, 0,-2, 1,-2 ;(20)
  1890.         ;=2max
  1891.         DEFB -2,2, -2,-2, 2,-2, 2,2 ;(24)
  1892.         ;=3
  1893.         DEFB 0,-3, 3,0, 0,3, -3,0
  1894.         DEFB 1,-3, 3,1, -1,3, -3,-1
  1895.         DEFB -1,-3, 3,-1, 1,3, -3,1
  1896.         DEFB 2,-3, 3,2, -2,3, -3,-2
  1897.         DEFB -2,-3, 3,-2, 2,3, -3,2 ;(44)
  1898.         ;=3max
  1899.         DEFB -3,3, -3,-3, 3,-3, 3,3 ;(48)
  1900.         ;=4
  1901.         DEFB 0,-4, 4,0, 0,4, -4,0
  1902.         DEFB 1,-4, 4,1, -1,4, -4,-1
  1903.         DEFB -1,-4, 4,-1, 1,4, -4,1
  1904.         DEFB 2,-4, 4,2, -2,4, -4,-2
  1905.         DEFB -2,-4, 4,-2, 2,4, -4,2 ;(68)
  1906.  
  1907. ;Main procedures
  1908.         ;include "wlid.asm"
  1909.         include "w_io.asm"
  1910.         if EGA==0
  1911. WFONT
  1912.         incbin "data/wfont.fnt"
  1913.         endif
  1914.         include "xdelpz.asm"
  1915.         ;include "w_intv.asm"
  1916.         include "wlib2.asm"
  1917.         if EGA==0
  1918.         ds 157 ;просто так ;???
  1919.         include "wlib2x3.asm"
  1920.         endif
  1921.         ;include "wlie.asm"
  1922.         ;include "wlib1a.asm"
  1923.         include "wsound2.asm"
  1924.         include "wlik.asm"
  1925.  
  1926.         if 1==0
  1927. M_Mexi  OUT (C),A ;выход
  1928.         DI
  1929.         LD SP,#FFFF
  1930.         JP 0 ;???
  1931.         endif
  1932. ;-------- переменные -----
  1933. ;*L+
  1934.         ds #7650-$
  1935.         nop ;CHK_4   DEFB #EE ;[**B] чек-сум4 #7650 ;???
  1936. G_DATA  EQU  #7700  ;отгрузка идёт с #7700
  1937.         include "w~local.asm" ;??? грузит w_demo.asm
  1938.         include "w~var.asm"
  1939.         ds #79C0-$
  1940.         include "w~level.asm"
  1941.         ;include "levels/w~115.a80"
  1942.         NOP
  1943. WBAR
  1944.         incbin "data/wbar.dat" ;подгружается сюда
  1945.         NOP
  1946. end
  1947.  
  1948.         page 0 ;*P0 ;--------------------
  1949.         ORG #C000
  1950. begin0
  1951.         include "wlib3.asm"
  1952.         include "wlib3vi.asm"
  1953.         include "wlif.asm"
  1954.         include "wintel.asm"
  1955.         include "wlic.asm"
  1956.         ds 101 ;просто так ;???
  1957.         include "wlig.asm"
  1958.         include "wlib4.asm"
  1959.         ;include "w_protec.asm" ;???
  1960.         include "wstrateg.asm"
  1961.         include "wlih.asm"
  1962.         include "wwizard.asm"
  1963. ;;*L+
  1964.         ds #F4AE-$
  1965.         nop ;CHK_9   DEFB #EE ;[**B] чек-сум5 0:#F4AE
  1966.         nop ;CHK_5   DEFB #EE ;[**B] чек-сум5 0:#F4AF
  1967.         incbin "data/wscreat2.dat"
  1968.         DEFS #FFFF-$+1,#C2
  1969. ;где creat25 equ #F4C0 ;creat26 equ #FA60
  1970. end0
  1971.  
  1972. ;*P0 ;--------------------
  1973.  
  1974.  
  1975. ;---------формат данных героя (HUMAN,KUNGE,SLAVE)---
  1976. ;0      X (1..62,=0-труп)
  1977. ;1      Y (1..62,=0-пусто)
  1978. ;2      Hапр (0..7)
  1979. ;3      Фаза (=0 - целиком в квадрате)
  1980. ;          или (%1ibttttt, где i-удар b-назад ttttt-задержка)
  1981. ;          или (%10000xxx, где ххх-ожидание свободного прохода)
  1982. ;          или (тоже, время нахождения в шахте/на базе)
  1983. ;4      Тип (0..26)
  1984. ;5      Здоровье
  1985. ;6      Мана / Время магич. жизни
  1986. ;7      Длина шага при перемещении (1..4)
  1987. ;8      Тип движения:
  1988. ;               0-стоп
  1989. ;               #80-free move
  1990. ;               %0len-обход по часовой
  1991. ;               %1len-против (где len-длина обхода)
  1992. ;       На стоянке: #FF/xx - посмотрел/не посмотрел вокруг
  1993. ;9      Тип действий:
  1994. ;        (cм.ниже)
  1995.  
  1996. ;10     Цель X
  1997. ;11     Цель Y
  1998. ;12     N врага (если ix+9 == 4) (%txxxxxxx, где t=0/1=герой/дом)
  1999. ;       Для лесоруба - к_во оставшихся ударов
  2000. ;13     -
  2001. ;14     Xwood ;для крестьян - коорд, куда идти за лесом/золотом
  2002. ;15     Ywood ;
  2003. ;Формат массива XY - TODO зачем?
  2004. ;0-1    Xpos (0..1024) (левая)
  2005. ;2-3    Ypos (0..1024) (нижняя)
  2006. ;-------------------------------
  2007. ;Примеч: Невидимый герой: (IX+1)=%1xxxxxxx, (IY+1)=%1xxxxxxx
  2008.  
  2009. ;(ix+9) -тип действий
  2010. ;        0-ничего
  2011. ;        1-стоять насмерть
  2012. ;        2-перемещение
  2013. ;        3-атаковать позицию
  2014. ;        4-атаковать врага (для крестьян - убегать)
  2015. ;        5-идти на базу
  2016. ;        6-идти за лесом
  2017. ;        7-идти за золотом
  2018. ;        8-идти на ремонт/строительство
  2019. ;        9-?
  2020.  
  2021. ;        10-родить скорпиона
  2022. ;        11-огненный дождь
  2023. ;        12-родить стеногрыза
  2024. ;        13-родить паука
  2025. ;        14-наслать смерч
  2026. ;        15-родить демона
  2027.  
  2028. ;        16-дать здоровье
  2029. ;        17-дальнее зрение
  2030. ;        18-огненный пояс
  2031. ;        19-поднять скелетов
  2032. ;        20-чёрное зрение
  2033. ;        21-хрустальная сфера
  2034. ;        22-находиться на строительстве
  2035. ;        23-находиться в шахте
  2036. ;        24-находиться на базе
  2037. ;        25-рубить лес
  2038. ;------------------------------------
  2039. ;---------формат данных трупа ---
  2040. ;0      Х=0
  2041. ;1      если 0-труп исчез
  2042. ;2      -
  2043. ;3      Время гниения текущ фазы (1..хх)
  2044. ;4      Вид трупа (0-16) >=17 труп катапульты
  2045. ;(10)   Х коорд. трупа
  2046. ;(11)   Y
  2047. ;Формат массива XY - тот же
  2048. ;-------------------------------
  2049.  
  2050.  
  2051. ;Формат данных здания
  2052. ;-------------------------------
  2053. ;0      X  (0-нет)
  2054. ;1      Y
  2055. ;2      тип
  2056. ;3      жизн сила
  2057. ;4      тип пр-ва (255-нет,253/254-строится)    ;4 (для шахты)
  2058. ;5      степень готовности                      ;-деньги/100
  2059. ;6      начальная жизн сила /2
  2060. ;7      Для строящегося здания:
  2061. ;         255-стр_во не начато/N-стр_во ведёт герой N
  2062. ;-------------------------------
  2063. ;тип: 0-main,1-креп,2-лесоп,3-церкв,4-кузня,5-конюш,6-башн,7-дворец,8-хата
  2064. ;кунги:10-18, 255-шахта
  2065.  
  2066.  
  2067. ;Формат снаряда/взрыва/заклинания (12байт)
  2068. ;-------------------------------
  2069. ;0-1    * * -   Xpos \ пиксельные коорд
  2070. ;2-3    * * -   Ypos /
  2071. ;4      * * *   тип/фаза (0-нет)
  2072. ;5      * - *   Xtar \ коорд. цели      Ntar \ номер цели
  2073. ;6      * - -   Ytar / (для катап)  OR  -    / (стрелы,заклинания)
  2074. ;7      * - -   автор выстрела
  2075. ;8      * - -   напр. полёта (0-7)
  2076. ;9      * * *   time (время полёта/действия/фазы)
  2077. ;10     * ? ?   dX \смещение при перемещении
  2078. ;11     * ? ?   dY /
  2079. ;---------------------------------
  2080. ; Типы (iy+4):
  2081. ;1      наши стрелы
  2082. ;2      стрелы врага
  2083. ;3      огонь волшебников
  2084. ;4      взрыв огня волшебников (фаза iy+9)
  2085. ;5      -
  2086. ;6      снаряд катапульты
  2087. ;7      снаряд стеногрыза
  2088. ;8      снаряд огненного дождя
  2089. ;9      колдовские звёздочки
  2090. ;10     взрыв снаряда катапульты (фаза iy+9)
  2091. ;11     взрыв здания
  2092. ;12     заклинание "смерч"
  2093. ;-------------------------------(iy+0,1,2,3 - от объекта N)
  2094. ;13     заклинание "хрустальная сфера"
  2095. ;14     заклинание "огненный пояс"
  2096. ;15     -
  2097. ;--------------------------------(дым пожарищ)
  2098. ;16     дым (низ,50%)
  2099. ;17     дым (низ,25%)
  2100. ;18     дым (верх)
  2101.  
  2102. ;*L+
  2103.         page 7 ;--------SCR,...-----
  2104.         ORG #C000
  2105. begin7
  2106.         incbin "barkov/w_world.scr"
  2107. ;        ORG #DB00
  2108.         nop ;CHK_6       DEFB #EE; [**B] чек-сум6 7:#DB00
  2109. WBUTT
  2110.         incbin "data/whumbutt.dat" ;0(*)
  2111.         ;incbin "data/worcbutt.dat" ;1
  2112. WNAMES
  2113.         incbin "data/wnames.dat"
  2114.         ;include "wmenu2.asm"
  2115. end7
  2116.  
  2117.         page 3 ;--------Кунги+эффекты-------
  2118.         ORG #C000
  2119. begin3
  2120.         incbin "data/wsorc.dat"
  2121.  
  2122. SOU0    ;удар меча
  2123.         DEFW 27
  2124.         DEFB 12,#FF
  2125.         DEFW 25
  2126.         DEFB 15,10
  2127.         DEFW 15
  2128.         DEFB 15,16
  2129.         DEFW 15
  2130.         DEFB 15,20
  2131.         DEFW 14
  2132.         DEFB 14,23
  2133.         DEFW 14
  2134.         DEFB 11,28
  2135.         DEFW 14
  2136.         DEFB 7,30
  2137.         DEFB #FF
  2138.  
  2139. SOU1    ;удар топора, cкелета, стеногрыза, полоза
  2140.         DEFW 1540
  2141.         DEFB 13,1
  2142.         DEFB #FF
  2143.  
  2144. SOU7    ;укус паука, скорпиона
  2145.         DEFW 1340
  2146.         DEFB 14,#FF
  2147.         DEFB #FF
  2148.  
  2149. SOU5    ;колдовство
  2150.         DEFW 40
  2151.         DEFB 14,#FF
  2152.         DEFW 80
  2153.         DEFB 14,#FF
  2154.         DEFW 50
  2155.         DEFB 14,#FF
  2156.         DEFW 100
  2157.         DEFB 13,#FF
  2158.         DEFW 56
  2159.         DEFB 14,#FF
  2160.         DEFW 110
  2161.         DEFB 14,#FF
  2162.         DEFW 60
  2163.         DEFB 14,#FF
  2164.         DEFW 120
  2165.         DEFB 13,#FF
  2166.         DEFW 70
  2167.         DEFB 14,#FF
  2168.         DEFW 140
  2169.         DEFB 14,#FF
  2170.         DEFW 80
  2171.         DEFB 14,#FF
  2172.         DEFW 150
  2173.         DEFB 13,#FF
  2174.         DEFW 300
  2175.         DEFB 11,#FF
  2176.         DEFB #FF
  2177.  
  2178. SOU6    ;волш/свящ стреляют
  2179.         DEFW 540
  2180.         DEFB 11,4
  2181.         DEFW 354
  2182.         DEFB 13,4
  2183.         DEFW 568
  2184.         DEFB 10,#FF
  2185.         DEFB #FF
  2186.  
  2187. SOU2    ;взрыв
  2188.         DEFW 1000
  2189.         DEFB 10,27
  2190.         DEFW 1200
  2191.         DEFB 14,24
  2192.         DEFW 1450
  2193.         DEFB 15,18
  2194.         DEFW 1650
  2195.         DEFB 15,15
  2196.         DEFW 1700
  2197.         DEFB 15,11
  2198.         DEFW 1800
  2199.         DEFB 15,16
  2200.         DEFW 1950
  2201.         DEFB 15,20
  2202.         DEFW 2050
  2203.         DEFB 15,26
  2204.         DEFW 2100
  2205.         DEFB 15,22
  2206.         DEFW 2200
  2207.         DEFB 15,21
  2208.         DEFW 2250
  2209.         DEFB 15,29
  2210.         ;
  2211.         DEFW 2300
  2212.         DEFB 15,23
  2213.         DEFW 2350
  2214.         DEFB 15,22
  2215.         DEFW 2400
  2216.         DEFB 15,17
  2217.         DEFW 2450
  2218.         DEFB 15,14
  2219.         DEFW 2500
  2220.         DEFB 15,10
  2221.         DEFW 2550
  2222.         DEFB 15,06
  2223.         DEFW 2600
  2224.         DEFB 15,07
  2225.         DEFW 2650
  2226.         DEFB 14,12
  2227.         DEFW 2700
  2228.         DEFB 14,18
  2229.         DEFW 2750
  2230.         DEFB 14,22
  2231.         DEFW 2800
  2232.         DEFB 14,27
  2233.         ;
  2234. SOU8    DEFW 2850 ;малый взр
  2235.         DEFB 13,31
  2236.         DEFW 2900
  2237.         DEFB 13,30
  2238.         DEFW 2950
  2239.         DEFB 13,27
  2240.         DEFW 3100
  2241.         DEFB 12,26
  2242.         DEFW 3200
  2243.         DEFB 12,22
  2244.         DEFW 3300
  2245.         DEFB 12,17
  2246.         DEFW 3400
  2247.         DEFB 11,12
  2248.         DEFW 3500
  2249.         DEFB 11,07
  2250.         DEFW 3600
  2251.         DEFB 10,09
  2252.         DEFW 3750
  2253.         DEFB 10,16
  2254.         DEFW 3900
  2255.         DEFB 08,21
  2256.         DEFB #FF
  2257. end3
  2258.  
  2259.         page 4 ;--------Люди-------
  2260.         ORG #C000
  2261. begin4
  2262.         incbin "data/wshum.dat"
  2263. ;вспомогательн. подпрограмы
  2264.         nop;CHK_8        DEFB #EE; [**B] чек-сум7 4:#FF00
  2265.         ;include "wmisc_4.asm"
  2266. end4
  2267.  
  2268.         page 6 ;---Магич.создания--
  2269.         ORG #C000
  2270. begin6
  2271.         include "wmap.asm" ;первый!
  2272.         DEFS #C400-$ ;c #C300 - invTAB
  2273. WSCREA
  2274.         incbin "data/wscreat1.dat"
  2275. WMISC3  EQU WSCREA+8608   ;доп.спр3Х3
  2276. ;вспомогательн. подпрограмы
  2277.         include "wmisc_6.asm"
  2278. end6
  2279.  
  2280.         page 1 ;---Cпрайты ландшафта--
  2281.         ORG #C000
  2282. begin1
  2283.         if EGA==0
  2284. WMISC2                  ;доп.спр2Х2
  2285.         incbin "data/wmisc.dat"
  2286. WMISC4  EQU WMISC2+1792 ;доп.спр4Х4
  2287. WMISC1  EQU WMISC2+3328 ;доп.спр1Х1
  2288.         endif
  2289.         include "wmisc_1.asm" ;доп п/п
  2290. ;селект-рамки----
  2291.         if EGA
  2292. ;_=0x1b00
  2293. _=0x1200
  2294. _l=_&0x4700+0xb8
  2295. _r=_&0xb800+0x47
  2296. _0=0x00ff
  2297. _hgt=16
  2298. fr2x2h=$+4
  2299.         db 8 ;wid/2
  2300.         db _hgt
  2301.         dw _,_l,_l,_l,_l,_l,_l,_l, _l,_l,_l,_l,_l,_l,_l,_
  2302.         dw 0x4000 - ((_hgt-1)*40)
  2303.        dup 8-2
  2304.         dw _,0,_0,_0,_0,_0,_0,_0, _0,_0,_0,_0,_0,_0,0,_
  2305.         dw 0x4000 - ((_hgt-1)*40)
  2306.        edup
  2307.         dw _,_r,_r,_r,_r,_r,_r,_r, _r,_r,_r,_r,_r,_r,_r,_
  2308.         dw 0xffff
  2309.         dw prsprqwid
  2310.  
  2311. _hgt=24
  2312. fr3x3h=$+4
  2313.         db 12 ;wid/2
  2314.         db _hgt
  2315.         dw _,_l,_l,_l,_l,_l,_l,_l, _l,_l,_l,_l,_l,_l,_l,_l, _l,_l,_l,_l,_l,_l,_l,_
  2316.         dw 0x4000 - ((_hgt-1)*40)
  2317.        dup 12-2
  2318.         dw _,0,_0,_0,_0,_0,_0,_0, _0,_0,_0,_0,_0,_0,_0,_0, _0,_0,_0,_0,_0,_0,0,_
  2319.         dw 0x4000 - ((_hgt-1)*40)
  2320.        edup
  2321.         dw _,_r,_r,_r,_r,_r,_r,_r, _r,_r,_r,_r,_r,_r,_r,_r, _r,_r,_r,_r,_r,_r,_r,_
  2322.         dw 0xffff
  2323.         dw prsprqwid
  2324.  
  2325.         else
  2326. ;or,xor, стоблцами
  2327. fr2x2h  DEFW #FFFF,#80FF,#80C0,#80C0,#80C0,#80C0,#80C0,#80C0
  2328.         DEFW #80C0,#80C0,#80C0,#80C0,#80C0,#80C0,#80FF,#FFFF
  2329.         DEFW #FFFF,#01FF,#0103,#0103,#0103,#0103,#0103,#0103
  2330.         DEFW #0103,#0103,#0103,#0103,#0103,#0103,#01FF,#FFFF
  2331. fr3x3h  DEFW #FFFF,#80FF,#80C0,#80C0,#80C0,#80C0,#80C0,#80C0
  2332.         DEFW #80C0,#80C0,#80C0,#80C0,#80C0,#80C0,#80C0,#80C0
  2333.         DEFW #80C0,#80C0,#80C0,#80C0,#80C0,#80C0,#80FF,#FFFF
  2334.         DEFW #FFFF,#00FF,0,0,0,0,0,0
  2335.         DEFW 0,0,0,0,0,0,0,0
  2336.         DEFW 0,0,0,0,0,0,#00FF,#FFFF
  2337.         DEFW #FFFF,#01FF,#0103,#0103,#0103,#0103,#0103,#0103
  2338.         DEFW #0103,#0103,#0103,#0103,#0103,#0103,#0103,#0103
  2339.         DEFW #0103,#0103,#0103,#0103,#0103,#0103,#01FF,#FFFF
  2340.         endif
  2341.         ds #D000-$
  2342. LAND                    ;ландшафт
  2343. shadwA  EQU     49*32+LAND
  2344. SHADOW  EQU     383*32+LAND
  2345.         incbin "data/w2spr.dat" ;1(*)
  2346. ;*B ..\DATA\w2SPR.DAT ;2
  2347. ;*B ..\DATA\w3SPR.DAT ;3
  2348. ;*B ..\DATA\w4SPR.DAT ;4
  2349. end1
  2350. ;*P0 ;-------------------
  2351.  
  2352.         if EGA
  2353. MONEYPRINT=iPRINT
  2354.         else
  2355. MONEYPRINT=PRINT
  2356.         endif
  2357.  
  2358.  
  2359.         display "COORD=",COORD
  2360.         display "begin=",begin
  2361.         display "end=",end
  2362.         ;display "Free after end=",/d,#c000-end
  2363.         display "Size ",/d,end-begin," bytes"
  2364.        
  2365.         page 0
  2366.         savebin "br.com",begin,end-begin
  2367.         page 0
  2368.         savebin "br/br0.dat",begin0,end0-begin0
  2369.         page 1
  2370.         savebin "br/br1.dat",begin1,end1-begin1
  2371.         page 3
  2372.         savebin "br/br3.dat",begin3,end3-begin3
  2373.         page 4
  2374.         savebin "br/br4.dat",begin4,end4-begin4
  2375.         page 6
  2376.         savebin "br/br6.dat",begin6,end6-begin6
  2377.         page 7
  2378.         savebin "br/br7.dat",begin7,end7-begin7
  2379.        
  2380.         ;LABELSLIST "..\us\user.l"
  2381.  
  2382.         display "putBAR=",putBAR
  2383.         display "BUT_1=",BUT_1
  2384.