Login

Subversion Repositories NedoOS

Rev

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

;Kурсор на прерываниях  ******

BLITER  ;обновл экр с уч прерыв
        ;jr $
       if EGA==0
        CALL MEM7
        XOR A
        LD (P_FLAG),A
        DEC A
        LD (V_LINE),A
       endif
       if EGA
        call changescrpg
       else
       endif
       if EGA==0
        LD A,2
        LD (V_FLAG),A
        CALL V_GET2
        CALL V_MRK2
        LD A,1
        LD (V_FLAG),A
       endif
       if EGA==0
        CALL DS2SC
       endif
       if EGA==0
        CALL V_copy ;м.быть уч P_FLAG=1 :)
        XOR A
        LD (V_FLAG),A
       endif
        RET

        if EGA==0
DS2SC   ;регенер экр
        LD HL,DSCR
        LD DE,SCR
        LD B,192
DSS0    LD A,H
        CPL
        AND %11000
        RET Z
        PUSH BC
        PUSH DE
        PUSH HL
        LDI;
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI;
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI;
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LDI
        LD HL,V_LINE
        INC (HL)
        POP HL
        POP DE
        POP BC
        INC H
        INC D
        LD A,H
        AND 7
        JR NZ,DSS1
        LD A,L
        ADD A,32
        LD L,A
        LD E,A
        JR C,DSS1
        LD A,H
        SUB 8
        LD H,A
        LD A,D
        SUB 8
        LD D,A
DSS1    LD A,(P_FLAG)
        OR A
        CALL NZ,V_BLIT
        DJNZ DSS0
        RET

Vforce  ;принудительный выв A строк
        EXX
        LD B,8
        CALL DSS0
        EXX
        RET

V_BLIT  ;выв курс во время рефреша
        DI
        EXX
        XOR A
        LD (P_FLAG),A
        LD HL,V_LINE
        LD A,(G_MY) ;очистка
        CP (HL)
        JR C,vbt1
        JR NZ,vbt2
vbt1    ADD A,8
        CP (HL)
        JR C,vbt4
        CALL Vforce
vbt4    CALL V_copy
vbt2    CALL V_PUT1
        CALL V_PUT2
        LD HL,(MX)  ;взятие в буф
        LD (G_MX),HL
        LD A,H
        LD HL,V_LINE
        CP (HL)
        JR C,vpt1
        JR NZ,vpt2
vpt1    ADD A,8
        CP (HL)
        JR C,vpt4
        CALL Vforce
vpt4    CALL V_GET1
        CALL V_GET2
        LD A,(GBAD2+1)
        XOR #60
        LD (GBAD1+1),A
        CALL V_copy
        CALL V_MRK1
        JR vptR
vpt2    CALL V_GET1
        CALL V_GET2
        CALL V_MRK1
        CALL V_MRK2
vptR    EXX
        EI
        RET
        endif ;~EGA

        if 1==0
ON256   LD      A,%10000
        JR      M2
OFF256  XOR     A
M2      LD      BC,#1FFD ;скорп
        OUT     (C),A
        LD      A,%11000
        LD      B,#7F
        OUT     (C),A ;пент
        RET
        endif

INAR0   ;Обр прерываний
        PUSHs
        EXX
        PUSHs
        PUSH AF
        EX AF,AF
        PUSH AF
        PUSH IX
        PUSH IY
        LD A,(R128)
        LD (IR128),A
        if EGA
        ld a,(curpg16k) ;ok
        push af
        ld a,(curpg32klow) ;ok
        push af
        ld a,(pgmain4000)
        SETPG16K
        ld a,(pgmain8000)
        SETPG32KLOW
         ;ld a,(curscrnum)
         ;push af
         ;ld a,(curscrnum_physical)
         ;ld (curscrnum),a
         ld hl,timer
         inc (hl)
        endif
        if 1==0 ;???
        ;анти-теневик
antiTM  LD HL,(G_MX) ;[**]
        LD A,H
        OR #C0
        LD H,A
        CALL ON256
        LD E,(HL) ;д.быть #A4 байт-заполнитель или (HL)
        CALL OFF256
        LD A,E
        CP #A4
        JR Z,INAMM
        CP (HL)
        RET NZ
INAMM  
        endif
        ;музыка
        CALL MEM6
        LD A,(MUSONF)
        OR A
        JR Z,INA0FX
        ;патч к музыке
         XOR A
         LD (#EEC9),A
         LD (#F221),A
        CALL WMUSIC+6  ;6
        JR INA0M
INA0FX  LD BC,#FFFD
        LD A,7
        OUT (C),A
        LD A,B
        LD B,#BF
        OUT (C),A
        LD (#EEC9),A
INA0M   CALL pSOUND ;эффекты
        CALL MMOV
       ;if EGA==0
        LD A,(V_FLAG)
        CP 1
        JR Z,INA01
        JR NC,INA02
       ;endif
        CALL MEM7
        LD HL,(JP_SUB+1)
        PUSH HL
        LD HL,(SET_SP+1)
        PUSH HL
        LD HL,(SCRADR)
        PUSH HL
        CALL V_PUT1 ;восстановление старой стрелочки
        LD HL,(MX)
        LD (G_MX),HL
        CALL V_GET1 ;взятие с экрана из-под новой стрелочки
        CALL V_MRK1 ;рисование стрелочки
        POP HL
        LD (SCRADR),HL
        POP HL
        LD (SET_SP+1),HL
        POP HL
        LD (JP_SUB+1),HL
        JR INA02
INA01   LD (P_FLAG),A
INA02   ;LD A,(IR128)
IR128=$+1
        ld a,0
        CALL MEM
         ;SETPG32KHIGH
        if EGA
        GET_KEY
        cp key_redraw
        jr nz,$+5
        ld (wascurkeyredraw),a ;иначе не пишем
       
         ;pop af
         ;ld (curscrnum),a
        pop af ;ld a,(curpg8000)
        ;ld (curpg8000),a
        SETPG32KLOW
        pop af ;ld a,(curpg4000)
        ;ld (curpg4000),a
        SETPG16K
        endif
        POP IY
        POP IX
        POP AF
        EX AF,AF
        POP AF
        POPs
        EXX
        POPs
        RET


;---------------------------------------

        if EGA==0
G_IMG1  DEFB %11111100,%11111100 ;обычн курсор
        DEFB %11111110,%10000110
        DEFB %11111110,%10000010
        DEFB %11111110,%10000110
        DEFB %11111111,%10000011
        DEFB %11111111,%11010001
        DEFB %01111111,%01111011
        DEFB %00001110,%00001110

G_MAP1  DEFB %11111100,%00000000 ;курсор на карте/при нажатом FIRE
        DEFB %11111110,%01111000
        DEFB %11111110,%01000100
        DEFB %11111110,%01001000
        DEFB %11111111,%01010100
        DEFB %11111111,%00101010
        DEFB %01111111,%00000100
        DEFB %00001110,%00000000

G_FIX1  DEFB %11111100,%00000000 ;курсор при зафикс. цели
        DEFB %11111110,%01111000
        DEFB %11111110,%01111100
        DEFB %11111110,%01111000
        DEFB %11111111,%01111100
        DEFB %11111111,%00101110
        DEFB %01111111,%00000100
        DEFB %00001110,%00000000
        endif

        if EGA==0
V_copy  ;gbu2->gbu1
        LD BC,16
        LD HL,GBU2
        LD DE,GBU1
        LDIR
        RET
        endif

V_PUT1onint
        if EGA
         ld a,(curscrnum)
         or a
         ld hl,arbuf0
         jr z,$+5
         ld hl,arbuf1
        jp rearr
        endif
V_PUT1  ;  gbu1->[SCR]
        if EGA
;на видимом экране
        call setpgsscr40008000_current
         ld a,(curscrnum)
         or a
         ld hl,arbuf0
         jr z,$+5
         ld hl,arbuf1
        else
        LD HL,(GBAD1)
         ld a,h
         or a
         ret z
        LD DE,GBU1
        endif
        JR v1pEN

V_PUT2  ;  gbu2->[DSCR]
        if EGA
;на рисуемом экране
        call setpgsscr40008000;_current
         ld a,(curscrnum)
         or a
         ld hl,arbuf0
         jr nz,$+5
         ld hl,arbuf1
        else
        LD HL,(GBAD2)
        LD DE,GBU2
        endif
v1pEN
        if EGA
        ;LD hl,(G_MX)
        ;ld a,h
        ;ld h,0
        call rearr
        jp setpgsmain40008000
       
        else
        CALL v1p0
        LD A,L
        AND 31
        CP 31
        RET Z
        INC L
v1p0    LD B,8
        PUSH HL
v1p1    LD A,(DE)
        LD (HL),A
        INC DE
        INC H
        LD A,H
        AND 7
        JR NZ,v1p2
        LD A,L
        ADD A,32
        LD L,A
        JR C,v1p3
        LD A,H
        SUB 8
        LD H,A
        JR v1p2
v1p3    LD A,H
        CPL
        AND %11000
        JR Z,v1p6
v1p2    DJNZ v1p1
        POP HL
        RET
v1p5    INC DE
v1p6    DJNZ v1p5
        POP HL
        RET
        endif

V_GET1onint
        if EGA
         ld a,(curscrnum)
         or a
         ld de,arbuf0
         jr z,$+5
         ld de,arbuf1
        LD hl,(G_MX)
        ld a,h
        ld h,0
        jp getarr
        endif
V_GET1  ; HL->gbad1  [SCR]->gbu1
;выв гр курс
        if EGA
;на видимом экране
        call setpgsscr40008000_current
         ld a,(curscrnum)
         or a
         ld de,arbuf0
         jr z,$+5
         ld de,arbuf1
V_GETgo
        LD hl,(G_MX)
        ld a,h
        ld h,0
        call getarr
        jp setpgsmain40008000
       
        else
        LD DE,(G_MX)
        CALL STS
        CALL PCOORD
        LD (GBAD1),HL
        LD DE,GBU1
        CALL v1g0
        INC L
v1g0    LD B,8
        PUSH HL
v1g1    LD A,(HL)
        LD (DE),A
        INC DE
        INC H
        LD A,H
        AND 7
        JR NZ,v1g2
        LD A,L
        ADD A,32
        LD L,A
        JR C,v1g2
        LD A,H
        SUB 8
        LD H,A
v1g2    DJNZ v1g1
        POP HL
        RET
        endif

V_GET2  ; HL->gbad2  [DSCR]->gbu2
;выв гр курс
        if EGA
;на рисуемом экране
        call setpgsscr40008000;_current
         ld a,(curscrnum)
         or a
         ld de,arbuf0
         jr nz,$+5
         ld de,arbuf1
        jp V_GETgo
        else
        LD DE,(G_MX)
        CALL STD
        CALL PCOORD
        LD (GBAD2),HL
        LD DE,GBU2
        CALL v2g0
        INC L
v2g0    LD B,8
        LD A,L
        AND 31
        CP 24
        JR C,v2g00
        PUSH HL
        LD HL,GBU1-GBU2
        ADD HL,DE
        LD BC,8
        LDIR
        POP HL
        RET
v2g00   PUSH HL
v2g1    LD A,(HL)
        LD (DE),A
        INC DE
        INC H
        LD A,H
        AND 7
        JR NZ,v2g2
        LD A,L
        ADD A,32
        LD L,A
        JR C,v2g2
        LD A,H
        SUB 8
        LD H,A
v2g2    DJNZ v2g1
        POP HL
        RET
        endif

        if EGA
V_GET_MRK2
;гарантирует, что считаем фон и рисуем в одном и том же месте
;на рисуемом экране
        call setpgsscr40008000;_current
        LD HL,(G_MX)
        push hl
         ld a,(curscrnum)
         or a
         ld de,arbuf0
         jr nz,$+5
         ld de,arbuf1
        ld a,h
        ld h,0
        call getarr
        pop hl
        ld a,h
        ld h,0
        call prarr
        jp setpgsmain40008000
       
        endif
       
V_MRK2  ;mrk->SCR
        if EGA
;на рисуемом экране
        call setpgsscr40008000;_current
        else
        LD BC,(GBAD2)
        endif
        JR vmr1

V_MRK1onint
        if EGA
        LD hl,(G_MX)
        ld a,h
        ld h,0
        jp prarr
        endif
V_MRK1  ;mrk->SCR
        if EGA
;на видимом экране
        call setpgsscr40008000_current
        else
        LD BC,(GBAD1)
         ld a,b
         or a
         ret z
        endif
vmr1    LD HL,(G_MX)

        if EGA
        ld a,h
        ld h,0
        call prarr
        jp setpgsmain40008000
       
        else

        LD A,H
        SUB 185
        JR C,vmr2
        XOR 7
        JR vmr3
vmr2    LD A,8
vmr3    LD (G_SIZE),A
        LD A,L
        AND 7
        LD HL,HE_N
        CALL WT
        LD (JP_SUB+1),HL
        LD HL,(G_IMG)
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        LD (SET_SP+1),SP
        LD SP,HL
        LD L,C
        LD H,B
        LD A,(G_SIZE)
        LD B,A
        JP JP_SUB

        endif ;~EGA