;LAST UPDATE: 05.02.2014 savelij
;сначала компилим atm=0, пакуем ZXRAR header=off
;потом компилим atm=1
COVPORT EQU 251
sound EQU 1
;atm EQU 0
smuc EQU atm
sectcycl EQU 8 ;1 из них звуковой
reaction EQU 5;4 ;время реакции
z EQU 6;5 ;задержка относительно Tих/1.7554
IF smuc=1; IFN smuc
IF atm=1; IFN atm
;схема ATM:
hddstat EQU 0XFEEF
hddcmd EQU 0XFEEF
hddhead EQU 0XFECF
hddcylhi EQU 0XFEAF
hddcyllo EQU 0XFE8F
hddsec EQU 0XFE6F
hddcount EQU 0XFE4F
hdderr EQU 0XFE2F
hdddatlo EQU 0XFE0F
hdddathi EQU 0XFF0F
hddupr EQU 0XFEBE ;при установленном b7 FFBA
hdduprON EQU 0XFFBA
hddupr1 EQU 0XF7
hddupr0 EQU 0X77
ELSE
;схема SMUC:
hddstat EQU 0XFFBE
hddcmd EQU 0XFFBE
hddhead EQU 0XFEBE
hddcylhi EQU 0XFDBE
hddcyllo EQU 0XFCBE
hddsec EQU 0XFBBE
hddcount EQU 0XFABE
hdderr EQU 0XF9BE
hdddatlo EQU 0XF8BE
hdddathi EQU 0XD8BE
hddupr EQU 0XFEBE ;при установленном b7 FFBA
hdduprON EQU 0XFFBA
hddupr1 EQU 0XF7
hddupr0 EQU 0X77
ENDIF
ELSE
;схема Nemo:
hddstat EQU 0XF0
hddcmd EQU 0XF0
hddhead EQU 0XD0
hddcylhi EQU 0XB0
hddcyllo EQU 0X90
hddsec EQU 0X70
hddcount EQU 0X50
hdderr EQU 0X30
hdddatlo EQU 0X10
hdddathi EQU 0X11
hddupr EQU 0XC8
hdduprON EQU 0
ENDIF
SECBUF EQU 0XB500
LASTSND EQU 0XB500
SNDLEN EQU 2048
pusto EQU 0XBF00
PROUTBUF EQU 0XBF00 ;32 bytes спрайт символа
TY EQU 0XBD00 ;512 ;обязательно для ATM A8=1!!!
RARS EQU 0X4000 ;для распаковки экранов
addr EQU 0X9F00 ;для распаковки экранов (<0XA000)
IF atm=1; IFN atm
pgspr EQU 0X10
pgfnt EQU 0X10
pgIQ EQU 0X10
pgpic EQU 0X14
pgmuz EQU 0X16
p14 EQU 0X11 ;экр0 слой0
p15 EQU 0X15 ;экр0 слой1
p16 EQU 0X13 ;экр1 слой0 (выводится экр0)
p17 EQU 0X17 ;экр1 слой1
p1C EQU 0X19 ;экр0 слой0 (выводится экр1)
xy2adr MACRO; xy2adr
_a := _y*40+_x+0XC004
ENDM
ELSE
pgspr EQU 0X10
pgfnt EQU 0X10
pgIQ EQU 0X10
pgpic EQU 0X11
pgmuz EQU 0X13
p14 EQU 0X14 ;экр0 слой0
p15 EQU 0X15 ;экр0 слой1
p16 EQU 0X16 ;экр1 слой0 (выводится экр0)
p17 EQU 0X17 ;экр1 слой1
p1C EQU 0X1C ;экр0 слой0 (выводится экр1)
xy2adr MACRO; xy2adr
_a := (_y&7)<<8+((_y&56)<<2)+((_y&192)<<5)+_x+0XC000
ENDM
ENDIF
outim MACRO; outi
IF atm=0
CALL pause
ENDIF
OUTI
ENDM
ORG 0X6000
begin
JP LOADPEX
WASLOA
binclude loa16.bin; INCBIN "loa16. "
Lloa := $-WASLOA
WASPENT
binclude pent.bin; INCBIN "PENT. "
DUPL 0X7F00-$,0; DS 0X7F00-$
LOADPEX
;B=тип компьютера:
;0=PENTAGON, 1=ATM, 2=SCORPION, 3=PROFI, 4=SPRINTER
PUSH BC
DEC B
POP BC
JP Z,GO ;ATM
PUSH AF
PUSH BC
PUSH DE
PUSH HL
;depack PENT version
LD HL,0X5800
LD DE,0X5801
LD BC,0X2FF
LD (HL),L
LDIR
LD IX,WASPENT
LD DE,0X8200
LD HL,0X3E00
CALL UNILDRAR ;распаковываем IX->DE (длина=HL)
POP HL
POP DE
POP BC
POP AF
JP GO
DUPL 0X8000-$,0; DS 0X8000-$
include smallunr.a80; INCLUDE "B:smallunr",0X44
;дальше заменяемая часть
DUPL 0X8200-$,0; DS 0X8200-$
GO
;SP=0X6000, DI
;A=0XA0 (master) или 0XB0 (slave)
;C=тип контроллера IDE:
;0=NEMO, 1=ATM, 2=SMUC, 3=PROFI, 4=SPRINTER
;D=язык:
;0=ENGLISH, 1=РУССКИЙ
;E=адрес COVOX:
;0XFB=ATM/PENTAGON
;H=доступные видеорежимы (накладываются по OR)
;1=512x192 BW VMG
;2=384x304 ZX AC
;4=256x192 15 AC
;8=320x200 16 ATM
LD SP,0X8000
LD (REG_SDH),A
LD A,E
LD (varcovport),A
;LD A,4
;OUT (-2),A
LD BC,32765
LD A,0X10
OUT (C),A
LD HL,WASLOA
LD DE,loa
LD BC,Lloa
LDIR
CALL CLSATM
IF 1; IFN 1
LD BC,32765
LD A,pgpic
OUT (C),A
LD HL,0X9F00
LD DE,0XC000
LD BC,0X2100
LDIR
LD BC,32765
LD A,0X10
OUT (C),A
;LD A,5
;OUT (-2),A
LD HL,loa
LD BC,Lloa
;включаем 2-й экран и стр. с картинками
LD A,0X18
LD (curplane),A
LD IXH,0X00 ;черные поля экрана
CALL DEPKS16
IF atm=1; IFN atm
LD BC,0XFF77 ;выкл.теневые порты
LD A,%10101000 ;EGA
CALL OUTSHAD
ELSE
LD A,0XFE
IN A,(0XFE)
RRA
LD BC,0XEFF7
LD A,1
;JNC $+4 ;CS - turbo for Pentagon 1024SL 2.2
;OR 0X10 ;noturbo for ZX Evo
OUT (C),A
ENDIF
LD BC,32765
LD A,pgpic
OUT (C),A ;вкл 1-й экран
LD HL,0XC000
LD DE,0X9F00
LD BC,0X2100
LDIR
LD A,0X17
LD (curplane),A
LD DE,0
WAIT1S REPT 4; DUP 4
ADD HL,HL
ENDM; EDUP
DEC DE
LD A,D
OR E
JR NZ,WAIT1S
ENDIF
LD BC,32765
LD A,0X10
OUT (C),A
LD HL,AP_READTOC
CALL SEND_ATAPI
;RET C
CALL NO_BSY
;RET C
CALL WAIT_DRQ
;RET C
CALL LEN_TO_HL
LD B,H
LD C,L
LD HL,SECBUF
CALL TRANS_IN
CALL NO_BSY
CALL SCANCAT
;LD A,4
;OUT (-2),A
LD HL,AP_1x
CALL SEND_ATAPI
;LD A,5
;OUT (-2),A
LD HL,TY
;для 2 битпланов (+0/64), +128 - код нового кадра
MKTY
LD A,L
AND 31
JR NZ,MKTYN0
IF atm=1; IFN atm
LD DE,0XC004
ELSE
LD DE,0XC000
ENDIF
MKTYN0
LD A,L
AND 31
CP 24
JR C,$+5
LD DE,0
LD (HL),E
INC H
LD (HL),D
DEC H
IF atm=1; IFN atm
LD A,E
ADD A,LOW (40*8)
LD E,A
JR NC,$+3
INC D
INC D
ELSE
LD A,E
ADD A,32
LD E,A
JR NC,$+6
LD A,D
ADD A,8
LD D,A
ENDIF
INC L
JR NZ,MKTY
CALL CLSATM
IF atm=1; IFN atm
LD A,%10101000 ;EGA
CALL OPENPORTS_A
LD A,0XED
LD (IN_A),A
LD (OUT_A),A
LD A,0X78 ;in a,(c)
LD (IN_A+1),A
INC A ;out (c),a
LD (OUT_A+1),A
LD A,0XC9
LD (IN_A+2),A
LD (OUT_A+2),A
ELSE
LD BC,0XEFF7
LD A,1
OUT (C),A
ENDIF
LD DE,0XE00
SHUT0 DEC D
CALL OUTAY
JR NZ,SHUT0
;играет тон с огибающей в канале B
LD DE,0X7FD
CALL OUTAY
LD DE,0X910
CALL OUTAY
;LD A,7
;OUT (-2),A
LD HL,TFILES
NEWVIDEO
LD DE,SECTOR
LD BC,4
LDIR
LD DE,CUREVENT
LDI ;адрес скрипта
LDI ;
LD DE,CURENDOFVIDEO
LDI
LDI
LD HL,LASTSND
LD DE,LASTSND+1
LD BC,SNDLEN-1
LD (HL),0X80
LDIR
CALL READ_P1
XOR A
OUT (0XFE),A
LD HL,0
LD (SOUNDFRAME),HL
LD HL,(CUREVENT)
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD (CUREVENT),HL
LD (EVENTTIME),DE ;когда будет первое событие
LD HL,NEWPLANEOK
LD (JPENDOFVIDEO),HL ;после каждого кадра
XOR A
LD (CURKEY),A ;запрещаем кнопки, пока нет стрелки
LD HL,BADBIBIK
LD (keySND),HL
EXX
LD HL,LASTSND
varcovport := $+1
LD C,COVPORT
EXX
SNDLOOP
CALL INKEY
LD A,C
OLDKEY := $+1
CP 0
LD (OLDKEY),A
JR Z,KEYOFF ;если сост. кнопок не менялось - обходим
CURKEY := $+1
LD A,-1
CP -1
JR NZ,KEYOFF ;если уже нажимали что-то - обходим
LD A,C
LD (CURKEY),A
NEEDKEY := $+1
CP 111
JR Z,KEYGOOD
INC A
keySND := $+1
CALL NZBADBIBIK ;Z=отпустили, NZ=нажали
;а из интро выходить надо и так,и эдак
JR KEYOFF
KEYGOOD
CALL GOODBIBIK
KEYOFF
SOUNDFRAME := $+1
LD HL,0
EVENTTIME := $+1
LD DE,0
OR A
SBC HL,DE
ADD HL,DE
INC HL
LD (SOUNDFRAME),HL
JR NZ,NOEVENT
CUREVENT := $+1
LD HL,0
LD E,(HL) ;тип события
INC HL ;
LD D,(HL) ;
INC HL
LD C,(HL) ;параметр события
INC HL ;
LD B,(HL) ;
INC HL
LD (EVENTPARAM),BC
PUSH HL
LD ($+5),DE
CALL 0
POP HL
LD E,(HL) ;время следующего события
INC HL ;
LD D,(HL) ;
INC HL
LD (EVENTTIME),DE
LD (CUREVENT),HL
NOEVENT
IF sound=0
LD IXL,sectcycl-2 ;не -1!
JP SECTLOOP
ENDIF
;чтение сектора звука и доигрывание остатка
;доигрываем остаток звука без 128 байт (время чтения)
LD C,LOW (hddstat)
LD DE,-1
EXX
outim
EXX
LD HL,pusto
sldoigr
IF atm=1; IFN atm
IN A,(C)
LD A,A
OR A
JR C,$+2
LD A,H
IN A,(LOW (hddstat))
ADD A,(HL)
INC A
LD A,(HL)
LD A,A
ADC A,H
SUB L
LD A,A
PUSH HL
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
EXX
OUTI
EXX
SET 5,A
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
POP HL
EXX
OUTI
ELSE ;~atm
IN A,(LOW (hddstat))
LD A,A
OR A
JR C,$+2
IN A,(LOW (hddstat))
ADD A,(HL)
INC A
LD A,(HL)
REPT 7; DUP 8
IN A,(LOW (hddstat))
LD A,(HL)
INC H
ENDM; EDUP
IN A,(LOW (hddstat))
LD A,(HL)
; ORG $-1
NOP
EXX
outim
EXX
LD C,H
SET 5,A
REPT 7; DUP 8
IN A,(LOW (hddstat))
LD A,(HL)
INC H
ENDM; EDUP
IN A,(LOW (hddstat))
LD A,(HL)
; ORG $-1
EXX
outim
ENDIF
LD A,H
EXX
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR C,sldoigr
EXX
LD HL,LASTSND+SNDLEN-256
EXX
LD HL,LASTSND
LD BC,LOW (hdddatlo+0X0000) ;B=0X00 (2*128)
LD DE,0
RDSND0
IF atm=1; IFN atm
INC B
IN A,(C)
DEC B
OR A
JR C,$+2
EXX
OUTI
EXX
IN A,(LOW (hddstat))
ADD A,(HL)
INC A
LD A,(HL)
LD A,A
ADC A,H
SUB L
LD A,A
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
PUSH HL
POP HL
SET 5,A
EXX
OUTI
EXX
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
ELSE ;~atm
IN A,(LOW (hddstat))
OR A
JR C,$+2
EXX
outim
EXX
IN A,(LOW (hddstat))
ADD A,(HL)
INC A
LD A,A
REPT 4; DUP 4
IN A,(LOW (hdddatlo))
LD (HL),A
INC L
IN A,(LOW (hdddathi))
LD (HL),A
INC L
ENDM; EDUP
LD C,H
SET 5,A
EXX
outim
EXX
REPT 3; DUP 4
IN A,(LOW (hdddatlo))
LD (HL),A
INC L
IN A,(LOW (hdddathi))
LD (HL),A
INC L
ENDM; EDUP
IN A,(LOW (hdddatlo))
LD (HL),A
INC L
IN A,(LOW (hdddathi))
LD (HL),A
; ORG $-1
INC HL
ENDIF
LD A,H
CP HIGH (SNDLEN+LASTSND); CP 'SNDLEN+'LASTSND
JR C,RDSND0
EXX
LD HL,LASTSND
outim
EXX
LD IXL,sectcycl
JP LOOPNEXTSEC ;1-е знакоместо - с битом 7
NEWPLANE
IF atm=0
IN A,(LOW (hdddathi))
ENDIF
curplane := $+1
LD A,0X17
;порядок обработки: SCR0(lo,hi), SCR1(lo,hi)
;0X1C,0X1D 0X16,0X17
;ATM ;0X19,0X1D 0X13,0X17
IF atm=1; IFN atm
XOR 4
BIT 2,A
ELSE
XOR 1
BIT 0,A
ENDIF
JR NZ,NONEWSCR
XOR 0X1C!0X16 ;=0X19!0X13 ;=0X0A
INC L
JP Z,ENDOFVIDEO
DEC L
JPENDOFVIDEO := $+1
JP NEWPLANEOK ;ENDOFVIDEODEAD; ENDOFVIDEO
NEWPLANEOK
NONEWSCR
LD (curplane),A
PUSH BC
LD BC,32765
OUT (C),A
POP BC
JP NEWPLQ
SECTLOOP
IF atm=1; IFN atm
LD BC,0XF20F ;B=0XF2 (18*113)
LD DE,39
ELSE
LD B,113
ENDIF
EXX
outim
EXX
FRAMELOOP
IF atm=1; IFN atm
IN A,(C)
ELSE
IN A,(LOW (hdddatlo))
ENDIF
LD L,A
RLA
JR C,NEWPLANE
NEWPLQ LD H,HIGH (TY);'TY ;22
IF atm=1; IFN atm
LD A,H
ENDIF
IN A,(LOW (hdddathi))
ADD A,(HL)
INC H
LD H,(HL)
LD L,A ;33
IF atm=1; IFN atm
ADC A,H
SUB L
LD H,A
PUSH HL
ELSE
LD C,H ;4
ENDIF
;HL=screen
IF atm=1; IFN atm
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI
ELSE
REPT 3; DUP 4
IN A,(LOW (hdddatlo))
LD (HL),A
INC H
IN A,(LOW (hdddathi))
LD (HL),A
INC H
ENDM; EDUP
IN A,(LOW (hdddatlo))
LD (HL),A
INC H
IN A,(LOW (hdddathi))
LD (HL),A
ENDIF
; ORG $-1
;172
IF sound=1; IFN sound
EXX
outim
EXX ;24
ENDIF
IF atm=1; IFN atm
POP HL
ELSE
LD H,C
ENDIF
SET 5,H ;12
IF atm=1; IFN atm
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI
ELSE
REPT 3; DUP 4
IN A,(LOW (hdddatlo))
LD (HL),A
INC H
IN A,(LOW (hdddathi))
LD (HL),A
INC H
ENDM; EDUP
IN A,(LOW (hdddatlo))
LD (HL),A
INC H
IN A,(LOW (hdddathi))
LD (HL),A
ENDIF
; ORG $-1
;172
IF atm=1; IFN atm
DEC B ;для четности порта данных
ENDIF
IF sound=1; IFN sound
EXX
outim
EXX ;24
ENDIF
DJNZ FRAMELOOP ;13 ;476 PENT / 576 ATM
;остаток сектора (14 байт)
REPT 7; DUP 7
IF atm=1; IFN atm
IN A,(C)
ELSE
IN A,(LOW (hdddatlo))
IN A,(LOW (hdddathi)) ;ZX Evo fix
ENDIF
ENDM; EDUP ;77 PENT / 84 ATM
LOOPNEXTSEC
LD HL,SECTOR+3
INC (HL)
DEC HL
JR Z,$-2 ;29*N-5 (можно считать 24)
;типы команд должны совпадать с теми, к-е в главном цикле
LD C,LOW (hddstat)
LD DE,-1
LD HL,pusto
EXX
outim
EXX ;24
BSYDOATAPI
IF atm=1; IFN atm
IN A,(C)
LD A,A
LD A,H
INC A
ADC A,H
SUB L
LD A,A
PUSH HL
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,$+4
OUTI
EXX
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
POP HL
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,$+4
OUTI
EXX
XOR A
ELSE ;~atm
IN A,(LOW (hddstat))
LD A,A
REPT 7; DUP 8
IN A,(LOW (hddstat))
LD A,(HL)
INC H
ENDM; EDUP
IN A,(LOW (hddstat))
LD A,(HL)
; ORG $-1
EXX
NOP
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,_nouti
outim
_nouti
EXX
SET 5,A
REPT 7; DUP 8
IN A,(LOW (hddstat))
LD A,(HL)
INC H
ENDM; EDUP
IN A,(LOW (hddstat))
LD A,(HL)
; ORG $-1
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,_nouti2
outim
_nouti2
EXX
ENDIF
IN A,(LOW (hddstat))
BIT 7,A
JR NZ,BSYDOATAPI
;SEND_ATAPI
LD A,(REG_SDH)
;AND 16
;OR 0XA0
OUT (LOW (hddhead)),A ;38
XOR A
OUT (LOW (hddcyllo)),A ;15
LD A,8
OUT (LOW (hddcylhi)),A ;18
LD A,0XA0
OUT (LOW (hddcmd)),A ;18
LD C,LOW (hddstat)
LD DE,-1
EXX
outim
EXX
LD HL,pusto
sAdrq
IF atm=1; IFN atm
IN A,(C)
LD A,A
LD A,H
INC A
ADC A,H
SUB L
LD A,A
PUSH HL
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,$+4
OUTI
EXX
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
POP HL
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,$+4
OUTI
EXX
XOR A
ELSE ;~atm
IN A,(LOW (hddstat))
LD A,A
REPT 7; DUP 8
IN A,(LOW (hddstat))
LD A,(HL)
INC H
ENDM; EDUP
IN A,(LOW (hddstat))
LD A,(HL)
; ORG $-1
EXX
NOP
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,_nouti3
outim
_nouti3
EXX
SET 5,A
REPT 7; DUP 8
IN A,(LOW (hddstat))
LD A,(HL)
INC H
ENDM; EDUP
IN A,(LOW (hddstat))
LD A,(HL)
; ORG $-1
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,_nouti4
outim
_nouti4
EXX
ENDIF
IN A,(LOW (hddstat))
BIT 3,A
JR Z,sAdrq
LD HL,AP_READ
REPT 2; DUP 2
IF atm=1; IFN atm
INC HL
LD A,(HL)
LD BC,hdddathi
OUT (C),A
DEC HL
LD A,(HL)
LD BC,hdddatlo
OUT (C),A
INC HL
INC HL ;117*2=244(+10)
DUPL 7,0; DS 7
ELSE
LD C,(HL)
INC HL
LD A,(HL)
OUT (LOW (hdddathi)),A
LD A,C
OUT (LOW (hdddatlo)),A
INC HL ;52
ENDIF
ENDM; EDUP
EXX
outim
EXX
REPT 2; DUP 2
IF atm=1; IFN atm
INC HL
LD A,(HL)
LD BC,hdddathi
OUT (C),A
DEC HL
LD A,(HL)
LD BC,hdddatlo
OUT (C),A
INC HL
INC HL ;117*2=244(+22)
DUPL 7,0; DS 7
ELSE
LD C,(HL)
INC HL
LD A,(HL)
OUT (LOW (hdddathi)),A
LD A,C
OUT (LOW (hdddatlo)),A
INC HL ;52
ENDIF
ENDM; EDUP
EXX
outim
EXX
REPT 2; DUP 2
IF atm=1; IFN atm
INC HL
LD A,(HL)
LD BC,hdddathi
OUT (C),A
DEC HL
LD A,(HL)
LD BC,hdddatlo
OUT (C),A
INC HL
INC HL ;
ELSE
LD C,(HL)
INC HL
LD A,(HL)
OUT (LOW (hdddathi)),A
LD A,C
OUT (LOW (hdddatlo)),A
INC HL ;52
ENDIF
ENDM; EDUP
;(где-то 2000 тактов ищет)
;(точнее, 20000 каждый 10-й раз)
;XOR A
;IN A,(hddstat)
;RLCA ;BSY
;JC $-4
LD C,LOW (hddstat)
LD DE,-1
EXX
outim
EXX
LD HL,pusto
sldrq
IF atm=1; IFN atm
IN A,(C)
LD A,A
LD A,H
INC A
ADC A,H
SUB L
LD A,A
PUSH HL
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,$+4
OUTI
EXX
REPT 7; DUP 8
INI
ADD HL,DE
ENDM; EDUP
INI; ORG $-1
POP HL
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,$+4
OUTI
EXX
XOR A
ELSE ;~atm
IN A,(hddstat)
LD A,A
REPT 7; DUP 8
IN A,(hddstat)
LD A,(HL)
INC H
ENDM; EDUP
IN A,(hddstat)
LD A,(HL)
; ORG $-1
EXX
NOP
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,_nouti5
outim
_nouti5
EXX
SET 5,A
REPT 7; DUP 8
IN A,(hddstat)
LD A,(HL)
INC H
ENDM; EDUP
IN A,(hddstat)
LD A,(HL)
; ORG $-1
EXX
LD A,H
CP HIGH (SNDLEN)+HIGH (LASTSND)-1; CP 'SNDLEN+'LASTSND-1
JR NC,_nouti6
outim
_nouti6
EXX
ENDIF
IN A,(LOW (hddstat))
BIT 3,A
JR Z,sldrq
DEC IXL
JP NZ,SECTLOOP
IF sound=0
EXX
LD HL,LASTSND
EXX
LD IXL,sectcycl-1
LD HL,SECTOR+3
INC (HL)
DEC HL
JR Z,$-2 ;29*N-5 (можно считать 24)
JP SECTLOOP
ELSE
JP SNDLOOP
ENDIF
ENDOFVIDEO
CALL CLSATM
IF 0; IFN 0
LD HL,LEVEL
INC (HL)
LD A,(HL)
CP 16
JR C,EOVNOPRINT
LD A,(LIVES)
ADD A,"0"
LD (TLIVESN),A
LD HL,TLIVES
_y := 96
_x := 9
xy2adr
LD DE,_a
CALL PRW
LD A,(LEVEL)
CALL CODEDIG
LD A,(LIVES)
CALL CODEDIG
LD A,(SCORE)
CALL CODEDIG
LD A,(SCORE+1)
CALL CODEDIG
LD HL,(SCORE)
LD A,(LIVES)
XOR L
XOR H
LD L,A
LD A,(LEVEL)
XOR L
CALL CODEDIG
LD HL,TCODEN
LD B,8
TCODELET0
LD A,(HL)
AND 31
ADD A,"0"
CP ":"
JR C,$+4
ADD A,0X41-0X3A; A,"A"-":"
LD (HL),A
INC HL
DJNZ TCODELET0
LD HL,TCODE
_y := 80
_x := 9
xy2adr
LD DE,_a
CALL PRW
EOVNOPRINT
ENDIF
ENDOFVIDEODEAD
CURENDOFVIDEO := $+1
LD HL,TFILES
PUSH HL
LD HL,LASTSND
CALL READ_P2
POP HL
JP NEWVIDEO
CODEDIG
LD HL,TCODEN
LD B,8
CODEDIG0
RLA
RL (HL)
INC HL
DJNZ CODEDIG0
RET
TLIVES DB " LIVES: 0",0
TLIVESN := $-2
TCODE DB "CODE: 00000000",0
TCODEN := $-9
PRW
;C=фоновый цвет (в виде атрибута)
LD C,0
;IX=таблица раскраски буквы по строкам
LD IX,BUK_W
CALL PRTXT88
LD A,(curplane)
LD BC,32765
OUT (C),A
RET
INKEY
;C=11LRDUBF (B=break)
LD A,254
IN A,(254)
RRA
LD A,239
IN A,(254)
JR C,UANOCAP
LD C,0XFF
RRA ;CS+"0" = "0"
JR C,$+3
DEC C
RRA
RRA ;CS+"8"
JR C,$+4
RES 4,C
RRA ;CS+"7"
JR C,$+4
RES 2,C
RRA ;CS+"6"
JR C,$+4
RES 3,C
LD A,0XF7
IN A,(254)
BIT 4,A ;CS+"5"
JR NZ,$+4
RES 5,C
RLA ;CS+"1"
JR C,INKEYF
RES 1,C
JR INKEYF
UANOCAP
RRCA
RLA
RLA
OR 0XC2
LD C,A
LD A,0XDF
IN A,(254)
RRA ;"P"
JR C,$+4
RES 4,C
RRA ;"O"
JR C,$+4
RES 5,C
LD A,0XFB
IN A,(254)
RRA ;"Q"
JR C,$+4
RES 2,C
RRA
RRA ;"E"
JR C,$+4
RES 1,C
LD A,0XFD
IN A,(254)
RRA ;"A"
JR C,$+4
RES 3,C
INKEYF LD A,0X7F
IN A,(254)
CPL
AND 31
RET Z
RES 0,C
RET
CLSATM
REPT 2; DUP 2
;чистим невидимый экран
CALL CLSATMPLANE
;переключаем экран
LD A,(curplane)
XOR 8
LD (curplane),A
ENDM; EDUP
RET
;чистим невидимый экран
CLSATMPLANE
LD A,(curplane)
AND 0X18
LD C,A
CPL
RRA
RRA
AND 2
OR C
OR 5
CALL CLSPG
IF atm=1; IFN atm
SUB 4
ELSE
DEC A
ENDIF
CLSPG LD BC,32765
OUT (C),A
LD HL,0XC000
CALL CLS7999
LD HL,0XE000
CLS7999 LD BC,7999
CLSI1 LD D,H
LD E,1
LD (HL),L
LDIR
RET
SCANCAT
;берем посл сессию (предпосл запись)
LD HL,SECBUF+1
LD A,(HL)
ADD A,-10
LD L,A
;грузим начало сессии (17*0X800 байт)
LD D,7
CALL LOADER
LD B,16
SCANL0 PUSH BC
LD B,1
CALL LOADERLOOP
POP BC
DJNZ SCANL0
LD C,0XA2
ADD HL,BC
;CY=0
CALL LOADER ;грузим корневой каталог
;HL=SECBUF
LD DE,TFILES
FNDNEWFILE
LD HL,SECBUF
FNDFILELOOP
PUSH HL
LD C,33
ADD HL,BC
LD C,4
PUSH DE
FNDFI0 LD A,(DE)
CPI
JR NZ,FNDFIN
INC DE
JP PE,FNDFI0
POP DE
POP HL
LD C,6
ADD HL,BC
LD C,4
LDIR
FNDFIOK REPT 4
INC DE
ENDM
LD A,D
CP HIGH (ENDFILES); CP 'ENDFILES
JR NZ,FNDNEWFILE
LD A,E
CP LOW (ENDFILES)
JR NZ,FNDNEWFILE
RET
FNDFIN
POP DE
POP HL
PADDIN0 LD C,(HL)
INC HL
LD B,(HL)
DEC HL
LD A,B
OR C
JR NZ,NOPADDING
INC H
LD L,A
NOPADDING
INC B
DJNZ CATEND ;B<>0
ADD HL,BC
LD A,H
CP 64
JR NC,FNDFILELOOP
CATEND
LD A,-2 ;нет файла
LD (DE),A
REPT 4
INC DE
ENDM
JR FNDFIOK
LOADER
;грузим файл
;HL указывает на поле координат файла в motorola порядке
;CY=1: размер в DE
;CY=0: размер в (HL+4)
PUSH DE
LD DE,SECTOR
LD BC,4
LDIR
POP DE
JR C,$+5
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
SCF
LD DE,2048
INC B
SBC HL,DE
JR NC,$-3
LOADERLOOP
LD HL,SECBUF
PUSH HL
LOADER0 PUSH BC
CALL READCD
CALL READ_P2 ;!!! в буте он входит в READCD
LD BC,2048
ADD HL,BC
PUSH HL
LD HL,SECTOR+3
INC (HL)
DEC HL
JR Z,$-2
POP HL
POP BC
DJNZ LOADER0
POP HL
RET
READ_P1
PUSH BC
PUSH DE
PUSH HL
CALL READCD
POP HL
POP DE
POP BC
RET
READ_P2
PUSH BC
PUSH DE
PUSH HL
CALL READ_S
CALL READ_S
CALL READ_S
CALL READ_S
CALL NO_BSY
POP HL
POP DE
POP BC
RET
NXTSEC
PUSH HL
LD HL,SECTOR+3
INC (HL)
DEC HL
JR Z,$-2
POP HL
RET
IF atm=1; IFN atm
OUTSHAD
LD IX,10835
PUSH IX
JP 0X3D2F
ENDIF
;ЧТЕНИЕ 512 байт
READ_S
IF smuc=1; IFN smuc
LD B,0
READ_S0 PUSH BC
LD BC,hdddatlo
CALL IN_A
LD (HL),A
INC HL
LD BC,hdddathi
CALL IN_A
LD (HL),A
INC HL
POP BC
DJNZ READ_S0
ELSE ;nemo
LD C,hdddatlo
REPT 256; DUP 256
INI
INC C
INI
DEC C
ENDM; EDUP
ENDIF
RET
OUT_A
IF smuc=1; IFN smuc
IF atm=1; IFN atm
PUSH AF
PUSH BC
CALL OPENPORTS
POP BC
POP AF
OUT (C),A
JR CLOSEPORTS
OPENPORTS
LD A,%10101000;11
OPENPORTS_A
LD BC,0X2A53
PUSH BC
LD BC,0X4177
JP 0X3D2F
ELSE
LD IX,0X3FF0
PUSH IX
JP 0X3D2F
ENDIF
ELSE ;nemo
OUT (C),A
RET
ENDIF
IN_HDDSTAT
LD BC,hddstat
IN_A
IF smuc=1; IFN smuc
IF atm=1; IFN atm
PUSH BC
CALL OPENPORTS
POP BC
IN A,(C)
CLOSEPORTS
PUSH AF
PUSH BC
LD A,%10101000;11
LD BC,0XFF77
OUT (C),A
POP BC
POP AF
RET
ELSE
LD IX,0X3FF3
PUSH IX
JP 0X3D2F
ENDIF
ELSE
IN A,(C)
RET
ENDIF
;ПОСЛАТЬ КОМАНДУ НА ВИНТ
HDSC
LD BC,hddcmd
CALL OUT_A
;ОЖИДАНИЕ ОСВОБОЖДЕНИЯ УСТРОЙСТВА
NO_BSY
CALL IN_HDDSTAT
RLCA
RET NC
JR NO_BSY
;ОЖИДАНИЕ ГОТОВНОСТИ ПЕРЕДАЧИ ДАННЫХ
WAIT_DRQ
CALL IN_HDDSTAT
OR A
BIT 3,A
RET NZ
JR WAIT_DRQ
;ЧТЕНИE ЧИСЛА ИЗ РЕГИСТРА ЦИЛИНДРА
LEN_TO_HL
LD BC,hddcyllo
CALL IN_A
LD L,A
LD BC,hddcylhi
CALL IN_A
LD H,A
RET
;IN:HL-АДРЕС ПРИЕМА ДАННЫХ
; BC-КОЛ-ВО БАЙТ
TRANS_IN
PUSH BC
CALL NO_BSY
POP BC
RET C
PUSH BC
CALL WAIT_DRQ
POP BC
RET C
INC BC
SRL B
RR C
TR_IN0 PUSH BC
LD BC,hdddatlo
CALL IN_A
LD (HL),A
INC HL
LD BC,hdddathi
CALL IN_A
LD (HL),A
POP BC
CPI
JP PE,TR_IN0
RET
;ПЕРЕДАЧА ATAPI-ПАКЕТА
SEND_ATAPI
REG_SDH := $+1
LD A,0XB0
LD BC,hddhead
CALL OUT_A
LD BC,hddcyllo
XOR A
CALL OUT_A
LD BC,hddcylhi
LD A,HIGH (2048); LD A,'2048
CALL OUT_A
LD A,0XA0
CALL HDSC
LD B,6
TR_OUT0 PUSH BC
INC HL
LD A,(HL)
LD BC,hdddathi
CALL OUT_A
DEC HL
LD A,(HL)
LD BC,hdddatlo
CALL OUT_A
INC HL
INC HL
POP BC
DJNZ TR_OUT0
RET
READCD
;ЧТЕНИЕ СЕКТОРА
LOAD_SECTOR_
PUSH HL
LD HL,AP_READ
CALL SEND_ATAPI
POP HL
;бывает ситуация,что CHECK CONDITION (D0 статуса)=0,
;а при этом DRQ не выдается!
;CALL IN_HDDSTAT
;RRA
CALL NO_BSY ;иначе виснет при иниц-ции CD
;CALL WAIT_DRQ ;здесь виснет, если инитить слишком рано
;после выхода разгоняется, ждет кнопку и читает
;ожидание DRQ по рецепту Budder'а
LD DE,0
RDCDDRQ CALL IN_HDDSTAT
BIT 3,A
RET NZ ;потом прочитаем
INC DE
BIT 2,D ;4,D
JR Z,RDCDDRQ
PUSH HL
LD HL,AP_00
CALL SEND_ATAPI
POP HL
JR LOAD_SECTOR_
;ATAPI-ПАКЕТ "ПУСТЫШКА"
AP_00
DW 0
DUPL 10,0; DS 10
;ATAPI-ПАКЕТ "SPEED 1x"
AP_1x
DW 0XBB
DB 0
DB 176 ;1x=176k/s
DUPL 8,0; DS 8
;ATAPI-ПАКЕТ "ЧТЕНИЕ"
AP_READ
IF 0; IFN 0
DW 0XBE ;"READ CD"
SECTOR DB 0,0,0,0
DB 0
DB 0,1 ;=1 сектор
DB 0X10 ;читаем только данные
DB 0,0
ELSE
DW 0X28 ;"READ(10)"
SECTOR DB 0,0,0,0
DB 0
DB 0,1 ;=1 сектор
DB 0
DB 0,0
ENDIF
AP_READTOC
DW 0X43 ;SCMSF=0,т.е.секторы,а не MSF
DB 0 ;FORMAT=0:все сессии
DUPL 3,0; DS 3
DB 0 ;с 1-й сессии
DB HIGH (2048);'2048 ;длина табл
DB LOW (2048)
DB 0X00 ;FUNC
DUPL 2,0; DS 2
IF atm=0
pause
;162t - 17 (call) - 10 (ret) = 135
REPT 11; DUP 11
JR $+2
ENDM; EDUP
NOP ;136
RET
ENDIF
evEMPTY
RET
evRIGHTOFF
LD DE,HINTOFF
CALL evRIGHTPM
JR UMER
evRIGHTON
LD A,%11101111
LD (NEEDKEY),A
LD A,-1
LD (CURKEY),A
CALL ASKBIBIK
LD DE,HINTRIGHT
evRIGHTPM
_y := 88
_x := 31
xy2adr
LD HL,_a
JR evLRPM
evLEFTOFF
LD DE,HINTOFF
CALL evLEFTPM
JR UMER
evLEFTON
LD A,%11011111
LD (NEEDKEY),A
LD A,-1
LD (CURKEY),A
CALL ASKBIBIK
LD DE,HINTLEFT
evLEFTPM
_y := 88
_x := 0
xy2adr
LD HL,_a
evLRPM
LD A,(curplane)
;0X1C,0X1D 0X16,0X17
;ATM;0X19,0X1D 0X13,0X17
OR 7
PUSH AF
PUSH DE
PUSH HL
CALL evSPR16PP
POP HL
POP DE
POP AF
SUB 2
CALL evSPR16PP
LD A,(curplane)
LD BC,32765
OUT (C),A
RET
evFIREOFF
LD DE,HINTOFF
CALL evFIREPM
UMER
LD A,(NEEDKEY)
LD C,A
LD A,(CURKEY)
CP C
RET Z
INC A
CALL Z,BADBIBIK ;не нажимали ничего - смерть
EVENTPARAM := $+1
LD HL,0
LD (CURENDOFVIDEO),HL
LD HL,ENDOFVIDEODEAD
LD (JPENDOFVIDEO),HL
RET
evFIREON
LD A,%11111110
LD (NEEDKEY),A
LD A,-1
LD (CURKEY),A
CALL ASKBIBIK
LD DE,HINTFIRE
evFIREPM
_y := 184
_x := 28
xy2adr
LD HL,_a
JR evUDPM
evDOWNOFF
LD DE,HINTOFF
CALL evDOWNPM
JR UMER
evDOWNON
LD A,%11110111
LD (NEEDKEY),A
LD A,-1
LD (CURKEY),A
CALL ASKBIBIK
LD DE,HINTDOWN
evDOWNPM
_y := 184
_x := 15
xy2adr
LD HL,_a
JR evUDPM
evUPOFF
LD DE,HINTOFF
CALL evUPPM
JR UMER
evUPON
LD A,%11111011
LD (NEEDKEY),A
LD A,-1
LD (CURKEY),A
CALL ASKBIBIK
LD DE,HINTUP
evUPPM
_y := 0
_x := 15
xy2adr
LD HL,_a
evUDPM
LD A,(curplane)
;0X1C,0X1D 0X16,0X17
;ATM ;0X19,0X1D 0X13,0X17
OR 7
PUSH AF
PUSH HL
CALL evUD88
POP HL
POP AF
INC HL
evUD88
PUSH AF
PUSH DE
PUSH HL
CALL evSPR8PP
POP HL
POP DE
POP AF
SUB 2
CALL evSPR8PP
LD A,(curplane)
LD BC,32765
OUT (C),A
RET
evSPR16PP
LD BC,32765
OUT (C),A
PUSH AF
PUSH HL
PUSH HL
CALL HINTSTOLB
POP HL
SET 5,H
CALL HINTSTOLB
POP HL
POP AF
IF atm=1; IFN atm
SUB 4
ELSE
DEC A
ENDIF
LD BC,32765
OUT (C),A
PUSH HL
CALL HINTSTOLB
POP HL
SET 5,H
HINTSTOLB
IF atm=1; IFN atm
LD BC,40
REPT 15; DUP 16
LD A,(DE)
INC E
LD (HL),A
ADD HL,BC
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
ELSE
REPT 7; DUP 8
LD A,(DE)
INC E
LD (HL),A
INC H
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
; ORG $-1
LD A,L
ADD A,32
LD L,A
LD A,H
SUB 7
LD H,A
REPT 7; DUP 8
LD A,(DE)
INC E
LD (HL),A
INC H
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
ENDIF
; ORG $-1
RET
evSPR8PP
LD BC,32765
OUT (C),A
PUSH AF
PUSH HL
PUSH HL
CALL HINTSTOLB8
POP HL
SET 5,H
CALL HINTSTOLB8
POP HL
POP AF
IF atm=1; IFN atm
SUB 4
ELSE
DEC A
ENDIF
LD BC,32765
OUT (C),A
PUSH HL
CALL HINTSTOLB8
POP HL
SET 5,H
HINTSTOLB8
IF atm=1; IFN atm
LD BC,40
REPT 7; DUP 8
LD A,(DE)
INC E
LD (HL),A
ADD HL,BC
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
ELSE
REPT 7; DUP 8
LD A,(DE)
INC E
LD (HL),A
INC H
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
ENDIF
; ORG $-1
RET
IF 0; IFN 0
CLSTOLB
IF atm=1; IFN atm
LD BC,40
XOR A
REPT 16; DUP 16
LD (HL),A
ADD HL,BC
ENDM; EDUP
ELSE
REPT 7; DUP 8
LD A,(DE)
INC E
LD (HL),A
INC H
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
; ORG $-1
LD A,L
ADD A,32
LD L,A
LD A,H
SUB 7
LD H,A
REPT 7; DUP 8
LD A,(DE)
INC E
LD (HL),A
INC H
ENDM; EDUP
LD A,(DE)
INC E
LD (HL),A
ENDIF
; ORG $-1
RET
ENDIF
OUTA
PUSH BC
LD C,A
LD A,(curplane)
AND 0X18
OR C
LD BC,32765
OUT (C),A
POP BC
RET
include galarr.a80; INCLUDE "GALARR",0X84
SCORE DW 0
LIVES DB 0
LEVEL DB 0
include galscrip.a80; INCLUDE "GALSCRIP",0XC4
; DISPLAY $
DUPL LOW (-$),0; DS .(-$)
f88 binclude 88kriv.bin,0,0X800; INCBIN "88kriv$",0X800
loa
end
IF 0
DUPL 0XC000-$,0; DS 0XC000-$
; DISPLAY /T,end
ORG 0X5B00
ObjTab DB "AUTORUN "
DB "Z"
DW begin,end-begin
DB 16
DB "X "
IF atm
DB "PENT "
DB "C"
DW 0X8200,0X3E00
DB 16
DB " "
ENDIF
ENDIF
; include saveobj5.a80; INCLUDE "SAVEOBJ*",0XC0