?login_element?

Subversion Repositories NedoOS

Rev

Rev 660 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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