;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