Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

            DEVICE ZXSPECTRUM1024
;23.05.08,24.05.08

;(C) Perspective, 2008

;Основной загрузчик игры Вера,
;распаковщики, титульная картинка

LOADBYNAME=1

        ORG #6000


DEHR2   EQU #6AC9  ;распаковщик, который есть внутри игры
INTRO   EQU #4071  ;старт интро

PG_SPR  EQU 0+16+8 ;спрайты 2*2 512 штук
PG_MAP  EQU 1+16+8 ;карта,массив,путь,скрипты,звуки
PG_MISC EQU 3+16+8 ;распак. текст,ключевой кадр,
                   ;упак.карта,массив
PG_HERO EQU 4+16+8 ;спрайты героя
PG_MUZ  EQU 6+16+8 ;Плеер,музыка
PG_VIEW EQU 7+16+8 ;упак. экран

PG0=60 ;спрайты мира
PG1=11 ;карта и т.д.
PG31=80 ;движок
PG32=64 ;всякие разности
PG41=13 ;спрайты героя
PG42=40 ;видео
PG6=45 ;музыка и т.д.
PG7=24 ;шрифт и т.д.
PG00=12 ;интро

LOADER
       if LOADBYNAME
        ld sp,0x6000
        call loadmain
        ld hl,fn_vars
        ld de,0x6066
        ld a,0x10
        call loadpage
        ld hl,fn_main
        ld de,0x6666
        ld a,0x17 ;0x10 запорет начало спрайтов
        call loadpage
        jp 0x6663
       
fn_main
        db "VERAMAINC"
fn_vars
        db "VERAVARSC"
       
loadpage
        ld bc,0x7ffd
        ld (0x5b5c),a
        out (c),a
        push de
        ld c,0x13
        call 0x3d13 ;copy to 5cdd
        ld c,0x0a
        call 0x3d13 ;find file on disk
        ld a,c ;file descriptor #
        ld c,8
        call 0x3d13 ;load file descriptor
        ld c,0x0e
        ld a,3 ;"load file to hl"
        pop hl ;load addr
        jp 0x3d13
       
loadmain
        xor a
        out (0xfe),a
        ld (0x5d10),a ;for TR-DOS find file
        ld (iy+1),0xcc
        ld a,9
        ld (23814),a
        ld hl,fn_0;main
        ld de,0xc000
        ld a,0x10
        call loadpage
        ld hl,fn_1;main
        ld de,0xf000
        ld a,0x11
        call loadpage
        ld hl,fn_3;main
        ld de,0xc000
        ld a,0x13
        call loadpage
        ld hl,fn_4;main
        ld de,0xc000
        ld a,0x14
        call loadpage
        ld hl,fn_6;main
        ld de,0xc000
        ld a,0x16
        call loadpage
        ld hl,fn_7;main
        ld de,0xdb00
        ld a,0x17
        jp loadpage
       
fn_0
        db "0_PAGE  C"
fn_1
        db "1_PAGE  C"
fn_3
        db "3_PAGE  C"
fn_4
        db "4_PAGE  C"
fn_6
        db "6_PAGE  C"
fn_7
        db "7_PAGE  C"
       endif

        DISP #4000
        DI
        LD A,PG_VIEW-8
        CALL PAGE

;       CALL CLEANER

        LD HL,SCR
        CALL LC5  ;распаковываем экран

        LD A,PG_VIEW
        CALL PAGE      ;включаем видимым второй экран

;Грузим и распаковываем спрайты мира
;0
        LD HL,#6000
        PUSH HL
        LD B,PG0
        CALL DOS
        LD A,PG_SPR
        CALL PAGE
        POP HL
        LD DE,#C000
        CALL DEHRUST

;Грузим и распаковываем карту и т.д.
;1
        LD HL,#6000
        PUSH HL
        LD B,PG1
        CALL DOS
        LD A,PG_MAP
        CALL PAGE

;       CALL CLEANER

        POP HL
        LD DE,#F000
        CALL DEHRUST

;Грузим и распаковываем спрайты героя и видео
;4
        LD HL,#6000
        PUSH HL
        LD B,PG41
        CALL DOS
        LD A,PG_HERO
        CALL PAGE

;       CALL CLEANER

        POP HL
        LD DE,#C000
        CALL DEHRUST

        LD HL,#C000+6144 ;Video
        LD B,PG42
        CALL DOS

;Грузим НЕ распаковывая музыку и т.д.
;6
        LD A,PG_MUZ
        CALL PAGE

;       CALL CLEANER

        LD HL,#D35E
        LD B,PG6
        CALL DOS

;Грузим и распаковываем шрифт и т.д.
;7
        LD HL,#6000
        PUSH HL
        LD B,PG7
        CALL DOS
        LD A,PG_VIEW
        CALL PAGE
        POP HL
        LD DE,#DB00
        CALL DEHRUST

;Грузим и распаковываем главный файл игры
;(движок и прочее)
;3
        LD A,PG_MISC
        CALL PAGE

;       LD HL,#C000
;       LD BC,384
;       LD DE,0
;       CALL CLNR

        LD HL,#AEFF
        PUSH HL
        LD B,PG31
        CALL DOS
        POP HL
        LD DE,#6666
        CALL DEHRUST

;Грузим НЕ распаковывая всякие разности
;3
        LD HL,#C000
        LD B,PG32
        CALL DOS

;Грузим, распаковываем и запускаем интро
;1
        LD A,PG_MAP
        CALL PAGE
        LD HL,#C000
        PUSH HL
        LD B,PG00
        CALL DOS
        POP HL
        LD DE,#4040
        LD BC,INTRO
        PUSH BC
        JP DEHR2

PAGE
        LD BC,#7FFD
        OUT (C),A
        RET

DOS
        LD DE,(#5CF4)
        LD C,5
        JP #3D13

;Чистилка
;заполняет память задом наперед

;CLEANER
;       LD HL,0    ;откуда+2
;       LD D,H     ;чем
;       LD E,H
;       LD BC,256  ;сколько*32*2
;CLNR   DI
;       LD (CLN+1),SP
;       LD SP,HL

;CLNRLOOP

;       DUP 32
;       PUSH DE
;       EDUP

;       DEC BC
;       LD A,B
;       OR C
;       JR NZ,CLNRLOOP
;
;CLN    LD SP,0
;       EI
;       RET

DEHRUST
;HL - FROM, DE - TO
        INC HL
        INC HL
        INC HL ;SKIP "HR2"
        LD A,(HL)
        INC HL
        PUSH DE
        LD C,(HL)
        INC HL
        LD B,(HL)
        INC HL
        DEC BC

        EX DE,HL
        ADD HL,BC
        EX DE,HL

        LD C,(HL)
        INC HL
        LD B,(HL)
        ADD HL,BC

        SBC HL,DE
        ADD HL,DE
        JR C,$+4
        LD D,H
        LD E,L
        PUSH BC
        LDDR
        POP BC

        EX DE,HL
        RLA
        JR NC,DPCYES
        POP DE
        INC HL
        LDIR
        RET

DPCYES  LD DE,7
        ADD HL,DE

        PUSH HL
        EXX
        POP HL
        POP DE

        LD B,6
        DEC HL
        LD A,(HL)
        PUSH AF
        INC SP
        DJNZ $-4

        EXX
        LD DE,#1003
        LD C,#80

DPC1    LD A,(HL)
        INC HL
        EXX
        LD (DE),A
        INC DE
DPC0    EXX
DPC0A   CALL SLAC
        JR C,DPC1

        LD B,#01
DPC4    LD A,%01000000
DPC2    CALL SLAC
        RLA
        JR NC,DPC2

        CP E ;3
        JR C,DPC3
        ADD A,B
        LD B,A
        XOR D ;#10
        JR NZ,DPC4
DPC3    ADD A,B
        CP 4
        JR Z,DPC5 ;B<>1;B=4
        ADC A,#FF
DPC8A   CP 2
DPC8    EXX
        LD C,A
        LD H,#FF
        EXX
        JR C,DPC9 ;B=1

        JR Z,DPC12

        CALL SLAC
        JR C,DPC12

        ;B>=4
        LD A,%01111111
        LD B,E ;3
        DJNZ DPC9A1 ;JR...B=2
DPC9A2  DJNZ DPC5A2
        LD B,A
        SBC A,A

DPC9B   CALL SLAC
        RLA
        DEC A
        INC B
        JR NZ,DPC9B
        CP #FF-30
        JR NZ,$+4
        LD A,(HL)
        INC HL

        EXX
        LD H,A
        EXX

DPC12   LD A,(HL)
        INC HL
DPC11   EXX
        LD L,A
        ADD HL,DE
        LDIR
        JR DPC0

DPC5A2  ADD A,6
        RLA
        LD B,A
DPC5C   LD A,(HL)
        INC HL
        EXX
        LD (DE),A
        INC DE
        EXX
        DJNZ DPC5C
        JR DPC0A

DPC5    ;B=4
        CALL SLAC
        LD A,D ;%00010000
        JR NC,DPC5A1

        LD A,(HL)
        INC HL
        CP D ;16
        JR NC,DPC8A
        OR A
        JR Z,DPC6

        EXX
        LD B,A
        EXX
        LD A,(HL)
        INC HL
        JR DPC8

DPC9    ;B=1
        LD A,%00111111
DPC5A1  ;B=4
DPC9A1  ;B=2
DPC10   CALL SLAC
        RLA
        JR NC,DPC10
        DJNZ DPC9A2
        JR DPC11

SLAC    SLA C
        RET NZ
        LD C,(HL)
        INC HL
        RL C
        RET

DPC6    EXX
        LD B,6
        DEC SP
        POP AF
        LD (DE),A
        INC DE
        DJNZ $-4
        RET

;Распаковка...
LC5
       LD DE,7;SKIP "LCMP5" & LENGTH
       ADD HL,DE

       LD A,(HL)
       INC HL
       LD E,A
       ADD HL,DE

       LD A,(HL)
       LD E,A;pазpыв

       AND 3
       RLCA
       RLCA
       RLCA
       OR #C000/256

       EXX
       LD D,A;начало
       LD E,0
       EXX

       LD A,(HL)
       INC HL
       XOR #C000/256+#18
       AND #FC
       LD HX,A;конец ч/б.

DLC1   LD A,(HL)
       INC HL
       LD LX,#FF
DLC2   EXX
       JR NZ,DLC10
       LD B,1

DLC3   EXA
       SLA D
       JR NZ,$+6
       LD D,(HL)
       INC HL
       SLI D
       DJNZ DLC7
       JR C,DLC1
       INC B
DLC4   LD C,%01010110
       LD A,#FE
DLC5   SLA D
       JR NZ,$+6
       LD D,(HL)
       INC HL
       RL D
       RLA
       SLA C
       JR Z,DLC6
       JR C,DLC5
       RRCA
       JR NC,DLC5
       SUB 8
DLC6   ADD A,9
       DJNZ DLC3

       CP 0-8+1
       JR NZ,$+4
       LD A,(HL)
       INC HL

       ADC A,#FF
       LD LX,A
       JR C,DLC4
;      DI
;      LD A,16+8+7  ;Вкл. видимым 2-й экран
;      LD (page),A
;      LD BC,#7FFD
;      OUT (C),A
;      EI
       RET
DLC7   LD A,(HL)
       INC HL

       EXX
       LD L,A
       EXA
       LD H,A
       ADD HL,DE

       CP #FF-2
       JR NC,DLC8
       DEC LX
DLC8   LD A,H
       CP HX
       JR NC,DLC13
       XOR L
       AND #F8
       XOR L
       LD B,A
       XOR L
       XOR H
       RLCA
       RLCA
       LD C,A

DLC9   EXA
       LD A,(BC)
DLC10  EXA
       LD A,D
       CP HX
       JR NC,DLC14
       XOR E
       AND #F8
       XOR E
       LD B,A
       XOR E
       XOR D
       RLCA
       RLCA
       LD C,A

DLC11  EXA
       LD (BC),A

       INC DE
       JR NC,$+4
       DEC HL
       DEC HL
       INC HL
       EXA
       INC LX
       JR NZ,DLC8
       JP DLC2

DLC13  SCF
DLC14  PUSH AF
       EXX
       ADD A,E
       EXX
       LD B,A
       POP AF
       LD C,E
       JR NC,DLC11
       LD C,L
       JR DLC9

SCR
        INCBIN "VeraTitl.plc"

        ENT

        DISPLAY "Длина загрузчика =",$-LOADER;#6000
        DISPLAY "Старт загрузчика =",LOADER

        ;page PG_SPR
        savebin "code.c",LOADER,$-LOADER