?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;*L+
  2. ;*** IO FOR ЧЁРНЫЙ ВОРОН: A-N(1..) HL-START DE-LENTGTH / CY=0 - ERROR
  3.  
  4. ;;SIDE    DEFB    0 ;сторона
  5. ;;tDRIVE  DEFB    1 ;текущ дисковод 0/1
  6. ;;MEM16   DEFW    0 ;?
  7. ;;fADR    DEFW    0 ;адр загр ф-ла
  8.  
  9. ;-------запись
  10.  
  11.         if 1==0
  12. D_WRITE DI   ;запись 256 бт секторов
  13.         CALL    POS
  14. LOPWR1  PUSH    HL
  15.         PUSH    BC
  16.         LD      C,#5F
  17.         LD      A,E
  18.         CALL    RG_DOS
  19.         CALL    WR_SC
  20.         POP     BC
  21.         POP     HL
  22.         INC     E
  23.         INC     H
  24.         DJNZ    LOPWR1
  25.         RET
  26.  
  27. WR_SC   LD      A,#A0
  28.         LD      C,#1F
  29.         CALL    RG_DOS
  30.         LD      C,#7F
  31.         LD      IX,#3FCA; IN A,(FF): AND C0: JR Z,3FCA: RET M: OUTI: JR 3FCA
  32.         JR      DOS
  33.  
  34. ;----общие
  35.  
  36. RG_DOS  LD      IX,#2A53 ;выв в рег TRDOS (out (C),A:ret)
  37.         JR      DOS
  38.  
  39. DOS     PUSH    IX
  40.         JP      #3D2E
  41.  
  42. POS     ;позиционир трек
  43.         LD C,#3C
  44.         LD A,(SIDE)
  45.         OR A
  46.         JR      Z,DW_SID
  47.         RES     4,C
  48. DW_SID  LD A,(tDRIVE)
  49.         OR C
  50.         LD      C,#FF
  51.         CALL    RG_DOS
  52.         LD      A,D
  53.         LD      C,#7F
  54.         CALL    RG_DOS
  55.         LD      A,#18
  56.         LD      IX,#2F57 ;вып ком TRDOS
  57.         JP DOS
  58.  
  59. RD_SCT  LD      BC,RD_SCT ;по этому адресу = 1
  60.         PUSH    BC
  61.         LD      BC,#17F
  62.         LD      IX,#2090  ;чтение сектора из п/п форматирования(портит#5cd6)
  63.         JR      DOS
  64.  
  65. TR000   CALL TR00 ;иниц дисковода + задержка
  66.         CALL TR00
  67.         CALL TR00
  68. TR00    DI
  69.         LD      D,0
  70.         CALL    POS
  71.         LD      IX,#2F65 ;ld a,8:jr 2f57
  72.         JR      DOS
  73.  
  74. D_READ  DI ;E-sec,D-trk,B-sec.num,HL-mem.adr
  75.         CALL    POS
  76. d_rea_  LD      A,(#5CD6)
  77.         EX      AF,AF'
  78. NXT_S   DEFB    #DD
  79.        LD      L,#3 ;retry.num
  80. NXT_SC  PUSH    HL
  81.        PUSH    BC
  82. NXC_C1  PUSH    IX
  83.        LD      C,#5F
  84.        LD      A,E
  85.        CALL    RG_DOS
  86.        CALL    RD_SCT
  87.        DI;обязательно
  88.        LD      HL,#5CD6
  89.        EX      AF,AF'
  90.         CP      (HL)
  91.         POP     IX
  92.         JR      Z,GOOD
  93.         LD      (HL),A
  94.         DEFB    #DD
  95.         DEC     L
  96.         POP     BC
  97.         POP     HL
  98.         JR      Z,ERR_RW
  99.         EX      AF,AF'
  100.        JR      NXT_SC
  101. GOOD    POP     BC
  102.        POP     HL
  103.        EX      AF,AF'
  104. GOOD1   INC     E
  105.         LD      A,E
  106.         CP      #F9
  107.         JR      C,OLD_TR
  108.         LD      E,#F4
  109.         INC     D
  110.         CALL    POS
  111. OLD_TR  INC     H
  112.         INC     H
  113.         INC     H
  114.         INC     H
  115.         DJNZ    NXT_S
  116.         XOR     A
  117.         RET
  118.  
  119. ERR_RW  SCF
  120.         RET
  121.  
  122. ;-------логич чтение
  123.  
  124. READ1   CALL    D_READ ;чтение сектора с проверкой
  125.         RET     NC
  126.         LD      A,(SIDE)
  127.         XOR #FF
  128.         LD      (SIDE),A
  129. ;;;     LD A,0 ;разница треков сверху/снизу==0
  130. ;;;     JR NZ,RTR1
  131. ;;;     NEG
  132. ;;;RTR1 ADD A,D
  133. ;;;     LD D,A
  134.         PUSH DE
  135.         CALL    TR000
  136.         POP DE
  137.         JR      READ1
  138.  
  139. READ    ;A-No.файла, HL - adr
  140.         LD (fADR),HL
  141.         LD HL,WX_LEN
  142.         LD D,0
  143.         CP (HL) ;N файла, где к_во секторов >256
  144.         JR C,REA0
  145.         INC D
  146. REA0    INC HL ;табл_hl - Ncект;смещ в секторе/4
  147.         CALL WA
  148.         PUSH AF
  149.         PUSH HL
  150.         LD E,A
  151.         LD L,5
  152.         CALL DIVB2
  153.         LD A,D
  154.         LD D,E
  155.         ADD A,#F4 ;f4..f8
  156.         LD E,A
  157.         LD A,D ;+14 треков
  158.         ADD A,14
  159.         LD D,A
  160.         LD B,1
  161.         LD HL,(fADR)
  162.         PUSH HL
  163.         XOR A
  164.         LD (SIDE),A
  165.         CALL READ1
  166.         LD (MEM16),DE
  167.         POP DE
  168.         POP HL
  169.         INC HL
  170.         PUSH HL
  171.         LD L,(HL)
  172.         LD H,0
  173.         ADD HL,HL
  174.         ADD HL,HL
  175.         PUSH HL
  176.         ADD HL,DE
  177.         LD BC,1024
  178.         PUSH BC
  179.         LDIR
  180.         POP HL
  181.         POP BC
  182.         OR A
  183.         SBC HL,BC
  184.         LD BC,(fADR)
  185.         ADD HL,BC
  186.         POP DE
  187.         INC DE
  188.         LD A,(DE)
  189.         POP BC
  190.         SUB B
  191.         RET Z
  192.         LD B,A
  193.         LD DE,(MEM16)
  194.         JR READ1
  195.  
  196. ;--------Работа с файлами
  197.  
  198. numFL   EQU 129 ;длина т.ф-лов (111+8+8)
  199.  
  200. ;1-5    -ландшафты
  201. ;6      -панель
  202. ;7-8    -кнопки
  203. ;9-17   -музыки
  204. ;18-49  -уровни
  205.  
  206.  
  207. READ_F  PUSH HL  ;загр и декомпр
  208.         CALL READ
  209.         POP HL
  210.  
  211.         endif
  212.        
  213.        
  214. DELPZF  LD DE,#FFFF
  215. ;Декомпрессор
  216. ;HL - ОТКУДА И КУДА, DE - ВЕРХНЯЯ ГРАНИЦА ОБЛАСТИ
  217. DELPZX  PUSH HL
  218.         LD C,(HL)
  219.         INC HL
  220.         LD B,(HL)
  221.         ADD     HL,BC
  222.         LDDR
  223.         EX      DE,HL
  224.         INC     HL
  225.         POP     DE
  226.         JP      DELPZ
  227.  
  228. selSAV  LD A,(SAVDSK)
  229.         JR selD_
  230. selD_2  LD A,(DISK_2)
  231. selD_   LD (tDRIVE),A
  232.         RET
  233.  
  234. muzfilename
  235. muzfilename_number=$+5 ;0..7
  236.         db "brmuz0.dat",0
  237. barfilename
  238.         db "brbar.dat",0
  239. butfilename
  240.         if EGA
  241. butfilename_number=$+1 ;0..1
  242.         db "W0BUT.bin",0
  243.         else
  244. butfilename_number=$+5 ;0..1
  245.         db "brbut0.dat",0
  246.         endif
  247. sprfilename
  248.         if EGA
  249. sprfilename_number=$+1 ;1..4
  250.         db "W1LAND.bin",0
  251.         else
  252. sprfilename_number=$+5 ;1..4
  253.         db "brspr1.dat",0
  254.         endif
  255.  
  256. LOADOSpp
  257.         push hl
  258.         OS_OPENHANDLE
  259.         pop de
  260.        push de
  261.         ld hl,0x4000 ;size
  262.         push bc
  263.         OS_READHANDLE
  264.         pop bc
  265.         OS_CLOSEHANDLE
  266.        POP HL
  267.         ret
  268.  
  269. LOADms  ;загр. офрмл. уровня
  270.  
  271.         if EGA
  272.         push af
  273.         ld e,3
  274.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  275.         ld e,1
  276.         OS_SETSCREEN
  277.         ld de,RSTPAL
  278.         OS_SETPAL
  279.         pop af
  280.         endif
  281.  
  282.         ;пров защиты
  283.         EX AF,AF'
  284.        CALL MEM0
  285.        if 1==0        
  286.        CALL PROTeC ;AF'=NC/C-нов ур/подгр ;???
  287.         else
  288.         EX AF,AF'
  289.         JR C,LOADms_nonewlevel ;подгр
  290.         CALL SEEonn     ;0 нов ур
  291.         CALL setC1      ;0
  292.         CALL setMAP     ;0
  293. LOADms_nonewlevel
  294.        endif
  295.  
  296.        if 1==1
  297.        call swapimer ;делает ei
  298.        ;im 1
  299.        ;загр ландш A=1..4
  300.        CALL MEM1
  301.        LD A,(fsLAND)
  302.        LD HL,_sLAND
  303.        CP (HL)
  304.        JR Z,lad2 ;загружено
  305.        LD (HL),A
  306.        add a,"0"
  307.        ld (sprfilename_number),a
  308.        if EGA
  309.        ld a,26
  310.        call _128
  311.        ld de,sprfilename
  312.        OS_OPENHANDLE
  313.        ld de,0xc000 ;addr
  314.        ld hl,0x4000 ;size
  315.        push bc
  316.        push de
  317.        push hl
  318.        OS_READHANDLE
  319.        pop hl
  320.        pop de
  321.        ld a,27
  322.        call _128
  323.        pop bc
  324.        push bc
  325.        push de
  326.        push hl
  327.        OS_READHANDLE
  328.        pop hl
  329.        pop de
  330.        ld a,28
  331.        call _128
  332.        pop bc
  333.        push bc
  334.        OS_READHANDLE
  335.        pop bc
  336.        OS_CLOSEHANDLE        
  337.        else
  338.        ld de,sprfilename
  339.        ld hl,LAND ;addr
  340.        call LOADOSpp
  341.        LD DE,#FFFF
  342.         di
  343.        CALL DELPZX
  344.        endif
  345. lad2
  346.        ;--загр панели
  347.        ld de,barfilename
  348.        ld hl,DSCR ;addr
  349.        call LOADOSpp
  350.        
  351.        ;--загр кнопок A=0..1
  352.        CALL MEM7
  353.        LD A,(MASTER)
  354.        LD HL,_sBUTT
  355.        CP (HL)
  356.        JR Z,lad3 ;загружено
  357.        LD (HL),A
  358.        add a,"0"
  359.        ld (butfilename_number),a
  360.        ld de,butfilename
  361.        
  362.        if EGA
  363.        ld a,29
  364.        call _128
  365.        OS_OPENHANDLE
  366.        ld de,0xc000 ;addr
  367.        ld hl,0x4000 ;size
  368.        push de
  369.        push hl
  370.        push bc
  371.        OS_READHANDLE
  372.        ld a,30
  373.        call _128
  374.        pop bc
  375.        push bc
  376.        ld de,0
  377.        ld hl,0x2000
  378.        OS_SEEKHANDLE ;грузим во вторую страницу то же со сдвигом в 8К, чтобы кнопки не резались границей страниц (вариант: грузить с разрывом ровно по кнопке)
  379.        pop bc
  380.        pop hl
  381.        pop de
  382.        push bc
  383.        OS_READHANDLE
  384.        pop bc
  385.        OS_CLOSEHANDLE        
  386.        
  387.        else ;~EGA
  388.        
  389.        ld hl,WBUTT ;addr
  390.        call LOADOSpp
  391.        LD DE,WNAMES
  392.         di
  393.        CALL DELPZX
  394.        endif ;~EGA
  395.        
  396. lad3
  397.        ;--загр муз A=0..7
  398.        CALL MEM6
  399.        LD A,(fsMUS)
  400.        LD HL,_sMUS
  401.        CP (HL)
  402.        JR Z,lad1 ;загружено
  403.        LD (HL),A
  404.        add a,"0"
  405.        ld (muzfilename_number),a
  406.        ld de,muzfilename
  407.        ld hl,WMUSIC ;addr
  408.        call LOADOSpp
  409.        LD DE,#FFFF
  410.         di
  411.        CALL DELPZX
  412. lad1
  413.        call swapimer ;делает ei
  414.        ;im 2
  415.        
  416.        else
  417.  
  418.        ;загр ландш A=1..4
  419.        CALL MEM1
  420.        LD A,(fsLAND)
  421.        LD HL,_sLAND
  422.        CP (HL)
  423.        JR Z,lad2 ;загружено
  424.        LD (HL),A
  425.        LD HL,LAND
  426.        CALL READ_F
  427. lad2    ;--загр панели
  428.        LD A,6
  429.        LD HL,DSCR
  430.        CALL READ
  431.        ;--загр кнопок A=0..1
  432.        CALL MEM7
  433.        LD A,(MASTER)
  434.        LD HL,_sBUTT
  435.        CP (HL)
  436.        JR Z,lad3 ;загружено
  437.        LD (HL),A
  438.        ADD A,7
  439.        LD HL,WBUTT
  440.        PUSH HL
  441.        CALL READ
  442.        POP HL
  443.        LD DE,WNAMES
  444.        CALL DELPZX
  445. lad3    ;--загр муз A=0..7
  446.        CALL MEM6
  447.        LD A,(fsMUS)
  448.        LD HL,_sMUS
  449.        CP (HL)
  450.        JR Z,lad1 ;загружено
  451.        LD (HL),A
  452.        ADD A,9
  453.        LD HL,WMUSIC
  454.        CALL READ_F
  455. lad1    
  456.        endif
  457.  
  458.        if 1==1
  459.        JP MEM0
  460.        else
  461.        LD HL,(WX_BAD+1) ;[--8]
  462.        LD A,H
  463.        SUB L
  464.        LD HL,WX_BAD+8
  465.        CP (HL)
  466.        JP Z,MEM0
  467.        endif
  468.  
  469. ;----------сохр игры--
  470.  
  471. pasw    EQU #0C5E ;к/с отгрузки
  472. ENCODE  DI
  473.        LD DE,pasw
  474.        LD HL,G_DATA
  475.        LD BC,DSCR-G_DATA
  476.        CALL enc1
  477.        LD HL,HUMAN
  478.        LD BC,#BFFA-HUMAN
  479.        CALL enc1
  480.        LD (HL),E
  481.        INC HL
  482.        LD (HL),D
  483.        RET
  484.        ;
  485. enc1    LD A,(HL)
  486.        ADD A,E
  487.        LD E,A
  488.        JR NC,enc2
  489.        INC D
  490. enc2    RRC (HL)
  491.        INC HL
  492.        DEC BC
  493.        LD A,C
  494.        OR B
  495.        JR NZ,enc1
  496.        RET
  497.  
  498. DECODE  DI
  499.        LD DE,pasw
  500.        LD HL,G_DATA
  501.        LD BC,DSCR-G_DATA
  502.        CALL dnc1
  503.        LD HL,HUMAN
  504.        LD BC,#BFFA-HUMAN
  505.        CALL dnc1
  506.        LD A,(HL)
  507.        CP E
  508.        RET NZ
  509.        INC HL
  510.        LD A,(HL)
  511.        CP D
  512.        RET ;NZ/Z- err/ok
  513.        ;
  514. dnc1    RLC (HL)
  515.        LD A,(HL)
  516.        ADD A,E
  517.        LD E,A
  518.        JR NC,dnc2
  519.        INC D
  520. dnc2    INC HL
  521.        DEC BC
  522.        LD A,C
  523.        OR B
  524.        JR NZ,dnc1
  525.        RET
  526.  
  527. savgamfilename
  528. savgamletter=$+5
  529.        db "brsav0.dat",0
  530.  
  531. SAVgam  ;сохр A=0-7
  532.        if 1==1
  533.        add a,'1'
  534.        ld (savgamletter),a
  535.        else
  536.        ADD A,A
  537.        ADD A,A
  538.        ADD A,A
  539.        ADD A,4
  540.        LD D,A ;c 4-ого трека
  541.        PUSH DE
  542.        endif
  543.        CALL selSAV
  544.        CALL MEM6
  545.        CALL WMUSIC
  546.        CALL MEM7
  547.        CALL ENCODE ;-di
  548.        
  549.        if 1==1
  550.        call swapimer
  551.        ;im 1
  552.  
  553.        ld de,savgamfilename
  554.        OS_CREATEHANDLE
  555.        ;TODO catch errors
  556.        push bc
  557.        LD de,G_DATA ;отгрузка идёт с #7700
  558.        ld hl,0x4900 ;size
  559.        OS_WRITEHANDLE
  560.        pop bc
  561.        OS_CLOSEHANDLE
  562.        
  563.        call swapimer
  564.        ;im 2
  565.        else
  566.        
  567. Srtry   POP DE
  568.        PUSH DE
  569.        XOR A
  570.        LD (SIDE),A
  571.        CALL TR000
  572.        ;---запись данных
  573.        POP DE
  574.        PUSH DE
  575.        LD HL,G_DATA
  576.        LD A,5
  577. svv0    PUSH AF
  578.        CP 1
  579.        LD B,16
  580.        JR NZ,svv1
  581.        LD B,9
  582. svv1    LD E,1
  583.        CALL D_WRITE
  584.        INC D
  585.        POP AF
  586.        DEC A
  587.        JR NZ,svv0
  588.        ;----пров  перв сект
  589.        POP DE
  590.        PUSH DE
  591.        LD HL,DSCR
  592.        PUSH HL
  593.        LD B,1
  594.        LD E,B
  595.        CALL D_READ
  596.        POP HL
  597.        LD DE,G_DATA
  598.        LD B,255
  599. svvCP0  LD A,(DE)
  600.        CP (HL)
  601.        JR NZ,Srtry ;--err
  602.        INC HL
  603.        INC DE
  604.        DJNZ svvCP0
  605.        POP DE
  606.        endif
  607.        
  608.        JP DECODE
  609.  
  610. levfilename
  611. levfilename_master=$+2
  612. levfilename_number=$+3
  613.        ;db "br101.dat",0
  614.        db "br215.dat",0
  615.  
  616. ;-------- i/o
  617. LODlev  ;загр нов уровня
  618.  
  619.        if 1==1
  620. ;TODO ei и восстановить патч музыки???
  621.        ;jr $
  622.        call swapimer ;делает ei
  623.        ;im 1
  624.        ;jr $
  625.        LD A,(MASTER)
  626.        add a,"1"
  627.        ld (levfilename_master),a
  628.        LD A,(LEVEL)
  629.        inc a
  630.        cp 10
  631.        ld hl,levfilename_number
  632.        ld (hl),"0"
  633.        jr c,$+5 ;1..9
  634.         sub 10 ;10..17
  635.         inc (hl)
  636.        add a,"0"
  637.        inc hl
  638.        ld (hl),a
  639.        ld de,levfilename
  640.        OS_OPENHANDLE
  641.        ld de,LEVDAT ;addr
  642.       push de
  643.        ld hl,0x4000 ;size
  644.        push bc
  645.        OS_READHANDLE
  646.        pop bc
  647.        OS_CLOSEHANDLE
  648.       pop hl
  649.        LD DE,#BFFE
  650.         di
  651.         ld a,(LEVDAT)
  652.         cp 0xc9
  653.         jr z,$+3
  654.         or a
  655.        CALL nz,DELPZX ;begins with nop/ret = unpacked
  656.        
  657.        call swapimer
  658.        ;im 2
  659.        
  660.        else
  661.  
  662.        CALL selD_2
  663.        LD A,(MASTER)
  664.        OR A
  665.        LD C,18 ;1й ур л
  666.        JR Z,LLV0
  667.        LD C,36 ;1й ур к
  668. LLV0    LD A,(LEVEL)
  669.        ADD A,C ;# file
  670.        LD HL,LEVDAT
  671.        PUSH HL
  672.        CALL READ
  673.        POP HL
  674.  
  675.        LD DE,#BFFE
  676.        CALL DELPZX
  677.        
  678.        endif
  679.        
  680.         ;jr $
  681.        CALL MEM0
  682.        CALL isRUNL ;для заключ уровней - набор данных
  683.         if EGA
  684. ;scrpg7=$+1
  685. ;         ld a,0
  686. ;        LD (R128),A
  687. ;         SETPG32KHIGH
  688.        ld a,31
  689.        call _128
  690.         else
  691.         CALL OFFS
  692.         endif
  693.        LD HL,datSCR
  694.        LD DE,SCR
  695.        LD BC,6912
  696.        LDIR
  697.        XOR A
  698.        OUT (254),A
  699.         ld hl,0x6080
  700.         ld (COORD),hl
  701.        
  702.        RET
  703.  
  704.        if 1==0
  705. ;----диск 2
  706.  
  707. TXds21  DEFB 14,65,66,48,50,74,66,53,10, 52,56,65,58,10, 02,127 ;insert d2
  708. TXds22  DEFB 50,10, 52,56,65,58,62,50,62,52,10, 44,43, 127 ;в д-д Х:
  709. TXdsEn  DEFB 56,10, 61,48,54,60,56,66,53,10, 17,81,30,17,82, 127 ;& Enter
  710.  
  711. CHNGd2  CALL MEM7
  712.        LD DE,#403  ;смени диск2
  713.        LD BC,#1307
  714.        CALL MU_BOX
  715.        ATRs #403,#0713,#69
  716.        LD DE,#605
  717.        LD HL,TXds21
  718.        CALL PRINTS
  719.        LD DE,#706
  720.        LD HL,TXds22
  721.        CALL PRINTS
  722.        DEC DE
  723.        DEC DE
  724.        LD A,(DISK_2)
  725.        ADD A,12
  726.        CALL PRINT
  727.        LD DE,#805
  728.        LD HL,TXdsEn
  729.        CALL PRINTS
  730. isENTR  LD BC,#BFFE
  731.        IN A,(C)
  732.        RRA
  733.        RET NC
  734.        JR C,isENTR
  735.  
  736.        endif
  737.