;SPG runner, version 0.2

;  ᯮ  
;㭪 - LOADING
;  ⮫쪮 2 室 ࠬ:
;HL -  㤠 㧨
;B  - -  ࠧ஬  2,
;      㦭 㧨

;।  맮 LOADING', 
;  ᯮ樮஢  砫
;䠩 SPG

;⥬,   ᫥饬 饭
; ,  㧨 । ᮪
; 䠩.
;  .. ᫥  饭  
;楤,   ࠭ 
;  䠩  த  
;   ⮣    ,    ஬
;⠭  諮 饭...

        ORG $
PAGER   EQU #4800
LOBU    EQU #A000
;---------------------------------------
RUNSPG2 LD HL,LOBU
        LD B,1:CALL LOADING
        LD HL,LOBU+32,DE,IDNT,B,12
RAZ     LD A,(DE):CP (HL):RET NZ
        INC HL,DE
        DJNZ RAZ
        LD A,(HL):CP 3:RET NC
        CP 2:JR C,OF4
        LD A,15,(VrS+1),A
        LD A,16,(V2A+1),A,(V2F+1),A
        LD A,4,(V2B+1),A
        LD A,15,(V2C+1),A
OF4     LD HL,SPGLOG:CALL SPGLOG
        LD HL,LOBU,DE,PAGER,BC,#0800
        LDIR
        CALL GO_M
;-------
V2A     LD A,8,(C0),A;         COUNTER!
        LD HL,(PAGER+64),(SAR+1),HL

        LD A,(PAGER+66),(SPA+1),A
        LD HL,(PAGER+74)
        LD A,H:CP #40:JR NC,NSPZ
        LD HL,(SPBU)
NSPZ    LD (SSPA+1),HL

        LD HL,(PAGER+68),(V2E+1),HL

        LD HL,(PAGER+76),(V2D+1),HL
        LD BC,(PAGER+78)
        LD A,B:OR C:JR Z,MAA
        LD A,B:OR A:JR Z,MAA:LD B,1
        LD A,C:CP #41:JR C,MAA:LD C,0
MAA     LD (LAA+1),BC

        LD IX,PAGER+128
GROP    LD A,(IX+2):CP 14:JR C,NSPL
        LD A,13
NSPL    LD (SPGL+1),A

        LD A,(IX+3)
VrS     AND 7
        DI:CALL PAGER; 室  A
;                     .  #7FFD

        LD HL,PAGER+512,E,(IX),D,(IX+1)
        LD BC,#0600
        CALL LC
        EX DE,HL
        LD A,H:CP #A0:JR C,DIPL
SPGL    LD B,1,A,B:OR A:CALL NZ,LOADING

V2B     LD DE,8:ADD IX,DE

        LD A,(C0):DEC A
        LD (C0),A:JR NZ,GROP
;-------
DIPL    DI
        LD A,63,I,A:IM 1

        LD HL,PAGER
V2E     LD DE,0
        LD BC,32
        LDIR

LAA     LD BC,0,A,B:OR C:JR Z,SPA
        LD HL,PAGER+192
V2D     LD DE,#5B00
        LDIR

SPA     LD A,0
V2C     AND 7
        CALL PAGER

        LD A,(PAGER+67)
        CP 1:JR NZ,NNx
        LD A,(DRVE),(#5CF6),A

NNx     LD A,(V2C+1):CP 7:JR Z,SSPA
        LD HL,PAGER+49,E,5
OUTZ    LD C,(HL):INC HL
        LD B,(HL):INC HL
        LD A,B:OR C:JR Z,OUTz
        LD A,(HL)
        OUT A
OUTz    INC HL
        DEC E:JR NZ,OUTZ

SSPA    LD SP,0
SAR     JP 0
;-------
LC      LD A,(C0)
V2F     CP 8:RET NZ
        LD A,D:CP #A0:JR NC,V01

        LD (SREZ+4),DE
        ADD A,6:LD D,A
        PUSH DE
        LD HL,(SAR+1),(SR1+1),HL
        LD DE,#4820,(SAR+1),DE
        LD HL,SREZ,BC,16:LDIR
        POP DE
        RET
V01     LDIR
        RET
SREZ    LD HL,PAGER+512
        LD DE,0
        LD BC,#0600
        LDIR
SR1     JP 0

IDNT    DB "SpectrumProg"
;-------
SPBU    DW #6000
C0      NOP
DRVE    DB 0; ⨢ ᪮

;---------------------------------------
GO_M    CALL MEMD
        LD HL,MANAG0:OR A:JR Z,REZIM
        LD HL,MANAG1:CP 1:JR Z,REZIM
        LD HL,MANAG2:CP 2:JR Z,REZIM
        LD HL,MANAGF
REZIM   LD DE,PAGER,BC,32:LDIR
        XOR A:CALL PAGER
        EI
        RET

MEMD    DI
        LD HL,#C000
        LD BC,#7FFD
        LD D,H,E,L
TPEN    LD A,%10010000:OUT A
        LD (HL),E
        LD A,%00010000:OUT A
        LD (HL),D

        LD A,%10010000:OUT A
        LD A,(HL):CP E:JR NZ,NPENT
        LD A,%00010000:OUT A
        LD A,(HL):CP D:JR NZ,NPENT
        XOR A
        RET

NPENT   LD B,#1F
        LD A,16:OUT A
        LD (HL),E
        XOR A:OUT A
        LD (HL),D

        LD A,16:OUT A
        LD A,(HL):CP E:JR NZ,NSCORP
        XOR A:OUT A
        LD A,(HL):CP D:JR NZ,NSCORP
        LD A,1
        RET

NSCORP  LD B,#DF
        LD A,%00000001:OUT A
        LD (HL),E
        XOR A:OUT A
        LD (HL),D

        LD A,%00000001:OUT A
        LD A,(HL):CP E:JR NZ,NPROF
        XOR A:OUT A
        LD A,(HL):CP D:JR NZ,NPROF
        LD A,2
        RET
NPROF   LD A,#FF
        RET
;-------
MANAG0  ;I:A - num of PAGE (VALID: 0-15)
        PUSH BC
        LD C,A
        AND %11111000:LD A,C:JR Z,K128
        AND 7:OR %10000000
K128    OR 16:LD BC,#7FFD:OUT A
        POP BC
        RET

MANAG1  PUSH BC,DE
        LD E,A
        AND %11111000
        LD A,16:JR NZ,$+3:XOR A
        LD BC,#1FFD:OUT A
        LD A,E:AND 7
        OR 16:LD B,#7F:OUT A
        POP DE,BC
        RET

MANAG2  PUSH BC,DE
        LD E,A
        AND %11111000
        LD A,1:JR NZ,$+3:XOR A
        LD BC,#DFFD:OUT A
        LD A,E:AND 7
        OR 16:LD B,#7F:OUT A
        POP DE,BC
        RET

MANAGF  PUSH BC
        AND 7
        OR 16
        LD BC,#7FFD:OUT A
        POP BC
        RET

;---------------------------------------
SPGLOG  LD DE,SIMG-SPGLOG:ADD HL,DE
        LD DE,#5900
FIlz    LD A,(HL):INC HL
        OR A:RET Z
        CP 8:JR C,ONES
        LD B,(HL):INC HL
        LD (DE),A:INC DE:DJNZ $-2
        JR FIlz
ONES    LD C,A
.3      ADD A,A
        OR C
        LD (DE),A:INC DE
        JR FIlz

SIMG    DB 63,32+7
        DB 2,7,18,4,7,18,4,7,18,4,7,2
        DB 63,14
_DB 2,7,2,63,4,2,7,7,2,7,2,7,7,2,7,2
        DB 63,14
        DB 2,7,18,4,7,18,4,7,2,63,4,2
        DB 63,14
        DB 2,63,4,2,7,2,63,4,2,7,2,2,7,2
        DB 63,14
        DB 2,63,4,2,7,2,63,4,2,7,7,2,7,2
        DB 63,14
        DB 2,7,18,4,7,2,63,4,18,4,7,2
        DB 63,32+7
        NOP
;---------------------------------------