?login_element?

Subversion Repositories NedoOS

Rev

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