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