; Спрайт-хакер для BGE

 ;   ORG PgnAdr      ; адрес старта модуля


SpHCode    EQU #C000-384    ; -10   ; идентификаторы данных для проверки изменения
SpHCode_   EQU SpHCode+2
SpHack_id  EQU SpHCode_+2
StepH      EQU SpHack_id+1
ADDE       EQU StepH+1
STCH       EQU ADDE+2



SpHackOvb ; LD (.RETAD+1),HL

            call .NAvarif          ; проверка наличия данных /DA
           CALL BHack
            call .SAvarif          ; запись проверочных кодов страницы /DA
           ret
;           XOR A
;.RETAD    JP 0

.NAvarif                           ; проверка наличия данных /DA
            ld a,(SpHack_id)
            cp "S"
           jr nz,.new
            call .Avarif
            push hl
            ld hl,(SpHCode_)
            or a
            sbc hl,de
            pop hl
           jr nz,.new
            ex de,hl
            ld hl,(SpHCode)
            or a
            sbc hl,de
           ret z
.new        ld a,"S"
            ld (SpHack_id),a
            ld a,8
            ld (StepH),a
            ld hl,0
            ld (ADDE),hl
            ld (STCH),hl
           ret
.SAvarif   call .Avarif            ; запись проверочных кодов страницы /DA
           ld (SpHCode),hl
           ld (SpHCode_),de
           ret
.Avarif    call AddRam              ; получение проверочных кодов данных /DA
           ld bc,SpHack_id
           ld h,c
           ld l,c
           ld d,c
           ld e,c
1          ld a,(bc)
           add a,h                  ; проверка по add
           ld h,a
           ld a,(bc)
           xor l                    ; проверка по xor
           ld l,a
           ld a,(bc)
           rra
           adc a,e
           ld e,a
           rrca
           adc a,d
           ld d,a
           inc bc
           ld a,b
           or c
          jr nz,1B
           ret

;HackPgn
;        DISP PgnAdr

BHack   CALL SV_UNDO
        CALL CLOSE_ALLW
        ld (BHack.spp),sp
        JR sopli
SHA     CALL ERASE_ALLW
        CALL ReWin
sopli   LD A,%1111
sha     LD IX,SPH_WIN
        LD (IX+6),A
      ;  LD SP,(SPP)
        ld sp,0
BHack.spp  EQU $-2
        CALL Win_
        CP #FF
       ; JP Z,RES_TSK2
      ;  ret z
       jp z,CLOSE
        LD BC,TABjp
        JP TAB_JP

sha_    LD A,%1101
        JR sha

TABjp   DW Open
        DW GO
        DW OnScr
        DW toLoupe    ; добавлена лупа /DA
        DW Save
        DW ZDrives

Open    LD HL,SORTall
        CALL FilerE
        JP C,sha_
        LD HL,(START_SEC)
        LD (STCH),HL
        LD B,#40
        EXLOAD #8000,#C000,START_SEC,AddPage
        JP C,errsh
        LD HL,#C000
shaa    LD (ADDE),HL
        JR sha_

errsh   AND A
        SBC HL,HL
        JR shaa

Save   ; ld hl,(ADDE) ;LD HL,0    ; изменил /DA
;ADDE    EQU $-2
         call NOKEY_
         ld hl,(ADDE)
        LD DE,#C000
        AND A
        SBC HL,DE
        JP C,sha_
        LD IX,MESSAGE
        CALL Window_
      ;   call WAITKEY_
        CALL NOKEY_
        CALL ASK
        CALL CLOSE_
        JP C,sha_
        CALL LOADSCR
        CALL AddRam
        LD DE,(ADDE)
        LD IX,IXXM
        CALL SaveWS
        CALL save
        JP SHA

save    LD HL,#8000
        LD DE,#C000
        LD B,#40
        LD IX,(STCH)
        LD (START_SEC),IX
        LD A,4
        LD C,#06
        EX AF,AF'
        LD A,SL_BANK
        JP GUI

ZDrives CALL Driver
        JP sha_

toLoupe                    ; вызов лупы /DA
        call SpHackOvb.SAvarif
        call TBBGE.LOUPE
        call SpHackOvb.NAvarif
       jp SHA


;SPH_WIN DEFB 0,2,8,9,2*8+7,7,%00001111  ; изменено для лупы /DA
;SPH_WIN DEFB 1,2,8,10,2*8+7,7,%00001111
;        DEFB 0
;        DEFW THack        ; объект-текст
;        DEFW SHack        ; объект-подсветка (выборка)
;        DEFW #FFFF

SPH_WIN    DB 10,8,11,10,2*8+7,7,%00001111
           DB 0
           DW THack        ; объект-текст
           DW SHack        ; объект-подсветка (выборка)
           DW #FFFF
THack
  ;  if rus
  ;      DB #91,#aa,#a0,#ad,#a5,#e0,13 ;"Сканер",13
  ;      DB #8e,#e2,#aa,#e0,#eb,#e2,#ec,#5f,13 ;"Открыть_",13
  ;      DB #91,#aa,#a0,#ad,#a5,#e0,13 ;"Сканер",13
  ;      DB #8d,#a0,#20,#ed,#aa,#e0,#a0,#ad,13 ;"На экран",13
  ;      DB #8B,#E3,#AF,#A0,13 ;Лупа               ; добавлена лупа /DA
  ;      DB #8d,#a0,#20,#a4,#a8,#e1,#aa,13;"На диск_",13
  ;      DB #84,#a8,#e1,#aa,#ae,#a2,#ae,#a4,0;"Дисковод",0
  ;  else
  ;      DB "Scanner",13
  ;      DB "Open_",13
  ;      DB "Scanner",13
  ;      DB "To screen",13
  ;      DB "Loupe",13             ; added magnifier /DA
  ;      DB "To disk_",13
  ;      DB "Drive",0
  ;  endif

        MSG_SpHack_Title : DB 13
        MSG_SpHack_Open : DB 13
        MSG_SpHack_Scan: DB 13
        MSG_SpHack_Toscr : DB 13
        MSG_SpHack_Loupe : DB 13
        MSG_SpHack_toDSK : DB 13
        DB #0A : DW TDriveNum : DB 0

SHack ;  DB 1,3,6,1,%11
      ;  DB 1,4,6,1,%11
      ;  DB 1,5,6,1,%11
      ;  DB 1,6,6,1,%11
      ;  DB 1,7,6,1,%11
      ;  DB 1,8,6,1,%11
         DB 1,3,9,128+6,%11
        DB #FF

MESSAGE DEFB 7,0,19,9,7*8,2*8+7,%00001111
        DEFB 0
        DEFW TMES         ; объект-текст
        DEFW #FFFF

TMES
  ;  if rus
  ;      DB "          Внимание!",13
  ;      DB "Перед тем, как пользоваться",13
  ;      DB " данной опцией, необходимо",13
  ;      DB " прочитать описание, т.к.",13
  ;      DB " велика возможность потери",13
  ;      DB "      данных на диске..."
  ;  else
  ;      DB "          Warning!",13
  ;      DB "Please read the manual",13
  ;      DB "before using this option,",13
  ;      DB "because there is a",13
  ;      DB "possibility to corrupt data",13
  ;      DB "       on the disk..."
  ;  endif

        MSG_SpHack_Warning
        DB #00
;------------------------------------------------------

COIX    DEFB 27,22,4,1,7,7,%00000000,0
        DW ADRTXT
        DW #FFFF
ADRTXT  DB "49152",0

OUT_ADR PUSH IX
        LD HL,(ADDE)
        LD DE,ADRTXT
        LD C,1
        CALL GET_NUM_
        LD IX,COIX
        XOR A
        LD (IX+6),A
        CALL Window_
        LD IX,WCO
        XOR A
        LD (IX+6),A
        CALL Window_
        POP IX
        RET

GO      CALL AddRam
        CALL CLS
        CALL FUCK
        JP SHA

OnScr   CALL LOADSCR
        CALL AddRam
        LD IX,IXXM
        LD DE,(ADDE)
        CALL LoadWS
        CALL SAVESCR
        JP SHA

FUCK    HALT
        XOR A
        LD (23560),A

        LD IX,IXXM
Lplay   LD DE,(ADDE)
        CALL LoadWS
        CALL OUT_ADR
lplay   HALT
lplay_  CALL BREAK
        BIT 1,A
        JP NZ,scf            ;!!!!!!!!!!!!

        CALL IMM

        LD IX,IXXM

        CALL DIRSCN_
        LD A,(DIRECT)
        BIT 4,A
        JP NZ,FFire
        BIT 0,A
        JP NZ,RightH
        BIT 1,A
        JP NZ,LeftH
        BIT 2,A
        JP NZ,DownH
        BIT 3,A
        JP NZ,UpH
        JR lplay

LeftH   HALT
        LD HL,(ADDE)
        INC HL
        LD (ADDE),HL
        JR Lplay

RightH  HALT
        LD HL,(ADDE)
        DEC HL
        LD (ADDE),HL
        JR Lplay

UpH     LD A,(StepH)
        LD B,A
        LD C,(IX+2)
        CALL Mult
        EX DE,HL
        LD HL,(ADDE)
        ADD HL,DE
        LD (ADDE),HL
        JP Lplay

DownH   LD A,(StepH)
        LD B,A
        LD C,(IX+2)
        CALL Mult
        EX DE,HL
        LD HL,(ADDE)
        AND A
        SBC HL,DE
        LD (ADDE),HL
        JP Lplay
;***************************************************************
FFire   LD DE,(ADDE)
        CALL LoadWS
        CALL OUT_ADR

ffire   HALT
        CALL DIRSCN_
        LD A,(DIRECT)

        BIT 4,A
        JP Z,lplay;           ffire
        BIT 0,A
        JP NZ,FRight
        BIT 1,A
        JP NZ,FLeft
        BIT 2,A
        JP NZ,FDown
        BIT 3,A
        JP NZ,FUp
        JP ffire
        JP lplay

FRight  LD A,(IX+2)
        CP 32
        JP Z,ffire
        INC (IX+2)
        JP FFire

FLeft   LD A,(IX+2)
        CP 1
        JP Z,ffire

        LD A,(IX+2)
        DEC A
        LD (ixxM+0),A
        XOR A
        LD (ixxM+1),A
        LD A,1
        LD (ixxM+2),A
        LD A,(IX+3)
        LD (ixxM+3),A
        LD IX,ixxM
        CALL CLSVV

        LD IX,IXXM
        DEC (IX+2)
        JP FFire

FDown   LD A,(IX+3)
        CP 24
        JP Z,ffire
        INC (IX+3)
        JP FFire

FUp     LD A,(IX+3)
        CP 1
        JP Z,ffire

        XOR A
        LD (ixxM+0),A
        LD A,(IX+3)
        DEC A
        LD (ixxM+1),A
        LD A,(IX+2)
        LD (ixxM+2),A
        LD A,1
        LD (ixxM+3),A
        LD IX,ixxM
        CALL CLSVV

        LD IX,IXXM
        DEC (IX+3)
        JP FFire
;...
IXXM    DB 0,0,1,1
ixxM    DB 0,0,0,0

IMM     LD A,(23560)
        EX AF,AF'
        XOR A
        LD (23560),A
        EX AF,AF'
        CP "+"
        JP Z,PLUS
        CP "-"
        JP Z,MINUS
         cp "j"
         jp z,MINUS
         cp "J"
         jp z,MINUS
         cp "k"
         jp z,PLUS
         cp "K"
         jp z,PLUS
        CP "n"
        JP Z,NEXT
        CP "N"
        JP Z,NEXT
        RET

MINUS   ld a,(StepH) ;LD A,8  ; изменил /DA
;StepH   EQU $-1
        CP 1
        JR Z,ouwco
        DEC A
        LD (StepH),A
        JR ouwco

PLUS    LD A,(StepH)
        INC A
        LD (StepH),A
ouwco   LD DE,ADRCO
        LD C,0
        CALL GET_NUM_
        LD IX,WCO
        XOR A
        LD (IX+6),A
        JP Window_

WCO     DB 27,21,4,1,7,7,%00000000,0
        DW ADRCO
        DW #FFFF
ADRCO   DB "008",0

NEXT    ld hl,(STCH) ;LD HL,0   ; изменил /DA
;STCH    EQU $-2
        LD B,#40
        CALL TRAK
        LD (STCH),HL
        LD (START_SEC),HL
        LD B,#40
        EXLOAD #8000,#C000,START_SEC,AddPage
        LD HL,#C000
        LD (ADDE),HL
        LD IX,IXXM
        LD DE,(ADDE)
        CALL LoadWS
        JP OUT_ADR

TRAK     inc l      ; приехало из 'Add.asm' /DA
         ld a,l
         cp #10
         call z,RESL
        djnz TRAK
        ret
RESL     ld l,0
         inc h
        ret

LHack   EQU $-SpHackOvb
;        ENT
        DISPLAY "SprHack len :",/a, LHack

