;8x2image by pulsar.smb 1o..12.o9.2oo9//process
device zxspectrum128
;;equ
_equ
prog=#6400
progsp=#C000
rutina1=#8000
rutina2=rutina1+#1F00
image=#6700
limage=#1800*3+#100
eimage=image+limage
atr1=image
atrl=32*96
atr2=atr1+atrl
fix=0 ;fix version=1, fix key 8,9
fixc=1 ;color of fix border
classic=0 ;fix 4 classic=1 else no slow memory and 224 4 line
;;паузы до начала экрана ~ в тактах/24
pclassic=#23F
ppentagon=#2D3
;;incbin
;;;For MG1,MG2,MG4,MG8 file have HEADER 256 bytes length (one sector on tr-dos disk):
;;;[3] MGx_FILE_ID Identifier for MG files = "MGH" (Milti Gigascreen ZX File Header) - NOP
;;;[1] MGx_FILE_VER MG zx file format Version - NOP
;;;[1] MGS_CharSize Size of Char[1=8x1, 2=8x2, 4=8x4, 8=8x8] - NOP
;;;[1]* ZX Color1 Border - YEP
;;;[1]* ZX Color2 Border - YEP
ORG image
INCBIN "img.mg2"
endimage
;;main prog
ORG prog
LD SP,progsp
JP start
;;;подпрограмки
_pause
;;;;пауза до начала экрана
IF !classic ;pentagon
pau_x LD BC,ppentagon;#2d4;23f;23b;2D0
ELSE ;classic
pau_x LD BC,pclassic;#23f
ENDIF
pau_l DEC BC: LD A,B: OR C: JP NZ,pau_l ;//24
LD A,E: OUT (-2),A
RET
_fix
;;;;
IF fix
LD BC,(pau_x+1)
LD A,#EF: IN A,(-2)
RRCA: RRCA: JR C,fix1
DEC BC
fix1 RRCA: JR C,fix2
INC BC
fix2 LD (pau_x+1),BC
LD A,E: OUT (-2),A
ENDIF
RET
_grut
;;;;рутинагенерилка
;;;;in: de - адрес атриков, hl - adrrutina, bc - адрес возврата из рутины, hl' - экран
PUSH BC
EXX: LD BC,#20,E,5: EXX: LD LX,96
grut2 LD BC,31: EXD: ADD HL,BC: EXD
LD (HL),#31: INC HL ;ld sp,0
EXX: DEC E: JR NZ,grut3: LD E,4: ADD HL,BC
grut3 PUSH HL: LD A,H: XOR #80: LD H,A: EXX
POP BC: LD (HL),C: INC HL: LD (HL),B: INC HL ;адрес атриков закидываем в стек
LD B,16
grut1 LD (HL),#21: INC HL,HL: LD A,(DE): DEC DE: LD (HL),A: DEC HL: LD A,(DE): DEC DE: LD (HL),A: INC HL,HL ;ld hl,({de})
LD (HL),#E5: INC HL ;push hl
DJNZ grut1
IF !classic ;for clones with 224 t per line and no slow memory
DUP 6: LD (HL),9: INC HL: EDUP
LD (HL),#23: INC HL: LD (HL),0: INC HL
LD (HL),#23: INC HL: LD (HL),0: INC HL
ELSE ;classic
LD (HL),#26: INC HL,HL
ENDIF
LD (HL),#AB: INC HL ;xor e
LD (HL),#ED: INC HL: LD (HL),#79: INC HL ;out (c),a
LD BC,33: EXD: ADD HL,BC: EXD
DEC LX: JP NZ,grut2
POP DE: LD (HL),#C3: INC HL: LD (HL),E: INC HL: LD (HL),D ;jp {de}
RET
_fatr
;;;;
LD B,A
DUP 2: RLA: EDUP
OR B
LD D,H,E,L,BC,#2FF,(HL),A: INC DE: LDIR
RET
_mov
;;;;
LD A,48
lo1 LD BC,32: LDIR
LD BC,32: EXD: ADD HL,BC: EXD: ADD HL,BC
DEC A: JR NZ,lo1
RET
;;;подготовка
;;;;установка прерываний
start DI: LD HL,#BE00,A,H,I,A
LD B,0,A,#BF,(HL),A: INC HL: DJNZ $-2: LD (HL),A
IM 2: LD H,A,L,H,(HL),#C9
LD BC,#7FFD,A,#17: OUT (C),A
;;;;set border, paper, ink, подгрузка скрина под адресс image из бэйсика (внешнего загрузчика)
LD IX,image
EI: HALT: LD A,(IX+5),(b1+1),A,HL,#5800: OUT (-2),A: CALL _fatr
LD A,(IX+6),(b2+1),A,HL,#D800: CALL _fatr
LD HL,image+#100
LD DE,#4000,BC,#1800: LDIR
LD DE,#C000,BC,#1800: LDIR
LD DE,atr1
PUSH HL
CALL _mov
PUSH HL
CALL _mov
POP HL
LD DE,atr1
LD BC,32: EXD: ADD HL,BC: EXD: ADD HL,BC
CALL _mov
POP HL
LD BC,32: ADD HL,BC
CALL _mov
;;;main start
LD A,#17,BC,#7FFD: OUT (C),A:
LD HL,rutina1,DE,atr1,BC,ssp1: EXX: LD HL,#5820: EXX: CALL _grut
LD HL,rutina2,DE,atr2,BC,ssp2: EXX: LD HL,#D820: EXX: CALL _grut
mloop EI: HALT
b1 LD A,0: OUT (-2),A
IF fix
LD E,fixc
ELSE
LD E,A
ENDIF
CALL _pause
LD A,#1F,E,8,BC,#7FFD: OUT (C),A
LD (ssp1+1),SP
JP rutina1
ssp1 LD SP,0
LD A,(b1+1),E,A: CALL _fix
EI: HALT
b2 LD A,0: OUT (-2),A
IF fix
LD E,fixc
ELSE
LD E,A
ENDIF
CALL _pause
LD A,#17,E,8,BC,#7FFD: OUT (C),A
LD (ssp2+1),SP
JP rutina2
ssp2 LD SP,0
LD A,(b2+1),E,A: CALL _fix
JP mloop
;;save trd
eprog
emptytrd "8x2image.trd"
savetrd "8x2image.trd","CODE.C",prog,eimage-prog
ORG #C000
INCBIN "boot.bin"
savetrd "8x2image.trd","boot.B",#C000,256