;z80
;zx-spectrum
;assembler

MNCOLOR EQU 7
BARCOL  EQU 1

WDT     EQU 30

        ORG #6000
FONT    INCB "FONT"
EFONT   ORG #6000:JP ST
        ORG EFONT
ST      DI
        LD IY,#5C3A
        RES 4,(IY+1)
        SET 3,(IY+48)
        LD (IY-48),1
        LD (IY-49),15
        CALL DPC
        LD IX,VAR
        LD HL,SEGI*256
        LD A,H:LD I,A:IM 2
        INC A
ST0     LD (HL),A : INC L : DJNZ ST0
        INC H:LD (HL),A
        LD L,H
        LD (HL),#C3
        LD HL,INT
        LD (UINT),HL
        LD HL,BEGBTX+2
        LD (ALINE),HL
        CALL PSCR
WK      EI:HALT
;        XOR A:IN A,(#FE):CPL:AND #1F
;        JR Z,WK
        XOR A:OUT (#FE),A
        LD HL,#5800:LD DE,#5801
        LD BC,#02FF:LD (HL),L
        LDIR
        LD HL,#4000:LD DE,#4001
        LD BC,#1800:LD (HL),L
        LDIR
        CALL PRSCR
        EI:HALT
        CALL DRBOX
        LD HL,#5820:LD DE,#5821
        LD BC,#02BF:LD (HL),MNCOLOR
        LDIR
INP     LD HL,#5C08
        LD (HL),0
        LD IY,#5C3A
        CALL #0038:DI
        LD A,(HL)
        LD HL,TBKEY
        LD C,(HL):INC HL
INP1    LD D,H:LD E,L
        LD B,3
INP2    CP (HL):JR Z,INP3
        INC HL
        DJNZ INP2
        INC HL:INC HL
        DEC C:JR NZ,INP1
        EI:HALT
        JR INP

INP3    CALL INP4
        JR INP

INP4    EX DE,HL
        INC HL:INC HL:INC HL
        LD E,(HL):INC HL
        LD D,(HL)
        EX DE,HL
        JP (HL)

TBKEY   DB 6
        DB "Q","S",#0B:DW SCRLUP
        DB "A","X",#0A:DW SCRLDW
        DB "O",#04,#08:DW PGUP
        DB "P",#05,#09:DW PGDW
        DB "B","B","B":DW BEG
        DB "E","E","E":DW QUIT

QUIT    LD HL,0
        PUSH HL
        JP #3D2F

BEG     LD HL,BEGBTX+2
        LD (ALINE),HL
        CALL PSCR
        JR PGDW2

SCRLUP  CALL SETKEY
        LD B,1
        JR PGUP1

PGUP    LD B,22
PGUP1   PUSH BC
        LD HL,(ALINE)
        CALL DPCLND
        POP BC
        JR Z,PGUP3
        PUSH BC
        LD (ALINE),HL
        LD A,22
        CALL PRBUFA
        LD HL,BEGBSCR
        DEC (HL)
        CALL P,PGUP2
        LD (HL),21
PGUP2   LD HL,(ESCR)
        CALL SCANDN
        LD (ESCR),HL
        POP BC
        DJNZ PGUP1
PGUP3   JR PGDW2

SCRLDW  CALL SETKEY
        LD B,1
        JR PGDW1

PGDW    LD B,22
PGDW1   PUSH BC
        LD HL,(ESCR)
        CALL DPCLNU
        POP BC
        JR Z,PGDW2
        PUSH BC
        LD (ESCR),HL
        LD A,1
        CALL PRBUFU
        LD HL,BEGBSCR
        INC (HL)
        LD A,(HL):CP 22
        JR C,$+4
        LD (HL),0
        LD HL,(ALINE)
        CALL SCANUP
        LD (ALINE),HL
        POP BC
        DJNZ PGDW1
PGDW2   EI:HALT
        JP PRSCR

SETKEY  LD A,1
        LD (#5C02),A
        LD (#5C06),A
        RET


INT     RET

DPCLNU  LD A,(HL):INC A:RET Z
        LD DE,BUFLN
        LD A,#0D
        JR DPCLN2

DPCLN1  LDI
DPCLN2  CP (HL):JP NZ,DPCLN1
        INC HL
DPCLN3  LD (DE),A
        INC E
        JR NZ,DPCLN3
        INC E
        RET

DPCLND  DEC HL:DEC HL
        LD A,(HL):INC A:RET Z
        LD DE,BUFLN1+40
        PUSH DE
        LD A,#0D:LD C,41
        JR DPCLD2

DPCLD1  LDD
DPCLD2  CP (HL):JR NZ,DPCLD1
        INC HL
        INC DE
        EX (SP),HL
        INC HL
        LD A,C:OR A
        JR Z,DPCLD4
        LD B,C:LD C,#20
DPCLD3  LD (HL),C:INC L:DJNZ DPCLD3
DPCLD4  POP HL
        XOR A:INC A
        RET

SCANUP  LD A,(HL):CP #FF:RET Z
        PUSH BC
        LD B,#FF:LD A,#0D
        CPIR
        POP BC
        XOR A:INC A
        RET

; (HL)=#0D
SCANDN  DEC HL
        DEC HL
        LD A,(HL)
        CP #0D:JR Z,SCND2
        CP #FF:JR Z,SCND1
SCND0   PUSH BC
        LD B,#FF:LD A,#0D
        CPDR
        POP BC
        XOR A
SCND1   INC HL
SCND2   INC A
        INC HL
        RET

PSCR    XOR A:LD (IX+0),A
        LD HL,(ALINE)
PSCR1   INC A
        EX AF,AF:CALL DPCLNU:EX AF,AF
        PUSH HL
        PUSH AF
        CALL PRBUFU
        POP AF
        POP HL
        CP 22
        JR NZ,PSCR1
        LD (ESCR),HL
        RET

PRBUFU  LD DE,BUFLN
PRBUFA  LD (USP),SP
        DEC A
        ADD A,(IX+0)
        CP 22
        JR C,PRBUF1
        SUB 22
PRBUF1  ADD A,A
        LD HL,TBABUF
        ADD A,L
        LD L,A
        LD SP,HL
        POP HL
        LD (ABUFLIN),HL
        LD BC,22
        ADD HL,BC
        LD A,H
        EX AF,AF
        LD A,L
        EXX
        LD E,A
        EX AF,AF
        LD D,A
        EXX
        LD BC,-11
        ADD HL,BC
        EX DE,HL
        LD SP,HL
        LD LY,5
PRBUF2  JP #FDF1

PRSCR
PRSCR0  LD (USP),SP
        LD A,(IX+0)
        LD B,A
        ADD A,A
        LD L,A
        LD H,0
        LD DE,TBABUF
        ADD HL,DE
        LD SP,HL
        POP HL
        LD SP,HL
        LD A,22
        SUB B
        LD B,A
        OR A
        JP #DE00

PRLINE  LD (USP),SP
        DEC A
        ADD A,A
        LD L,A
        LD H,0
        LD DE,TBAPR
        ADD HL,DE
        LD SP,HL
        POP HL
        LD SP,(ABUFLIN)
        LD B,1
        SCF
        JP (HL)

PRSCR1  EX (SP),HL
        JR C,PRSE
        LD SP,BUFSCR
        JP (HL)

PRSE    LD SP,(USP)
        LD IX,VAR
        RET


DRBOX   LD A,BARCOL
        LD HL,#5801
        CALL DRBOX1
        LD HL,#5AE1
        CALL DRBOX1
        LD A,#FF
        LD HL,#4601
        CALL DRBOX1
        LD HL,#51E1
DRBOX1  LD B,#1E
        LD (HL),A : INC L
        DJNZ $-2
        RET

DPC     LD HL,FONT
        LD DE,#C000
        PUSH DE
        PUSH HL
        LD B,E
        LD C,6
DPC1    LD A,(HL) : INC L
        RRCA:RRCA
        LD (DE),A : INC E
        DJNZ DPC1
        INC H:INC D:DEC C
        JR NZ,DPC1
        POP HL
        LD A,6
DPC2    EX AF,AF
DPC3    LD C,(HL) : INC L
        XOR A
        SLA C : RL A
        SLA C : RL A
        LD (DE),A : INC D
        LD A,C
        LD (DE),A : DEC D
        INC E
        DJNZ DPC3
        INC H
        INC D : INC D
        EX AF,AF
        DEC A
        JR NZ,DPC2
        POP HL
        LD A,6
DPC4    EX AF,AF
DPC5    XOR A : LD C,A
        LD A,(HL) : INC L
        RRA : RR C
        RRA : RR C
        LD (DE),A : INC D
        LD A,C
        LD (DE),A : DEC D
        INC E
        DJNZ DPC5
        INC H
        INC D : INC D
        EX AF,AF
        DEC A
        JR NZ,DPC4

        EX DE,HL
        LD IX,TBAPR
        LD DE,#4121
        LD A,22
DPC6    EX AF,AF
        LD (IX),L  : INC IX
        LD (IX),H  : INC IX
DPC7A   LD LY,WDT/2
DPC8    LD A,D
        LD B,6
DPC9    LD (HL),#E1 : INC HL
        LD (HL),#22 : INC HL
        LD (HL),E  : INC HL
        LD (HL),D  : INC HL
        INC D
        DJNZ DPC9
        LD D,A
        INC E
        INC E
        DEC LY
        JR NZ,DPC8
        LD C,A
        LD A,31-WDT
        ADD A,E:LD E,A
        LD A,C
        JR NZ,DPC10
        ADD A,8
        LD D,A
DPC10   INC E
        EX AF,AF
        DEC A
        JR Z,DPC11
        LD (HL),#10 : INC HL
        LD (HL),#03 : INC HL
        LD (HL),#CD : INC HL
        LD (HL),PRSCR1\256 : INC HL
        LD (HL),PRSCR1/256 : INC HL
        JR DPC6

DPC11   LD (HL),#C3 : INC HL
        LD (HL),PRSE\256 : INC HL
        LD (HL),PRSE/256 : INC HL
        EX DE,HL

        LD (PRBUF2+1),DE
        LD (DPCI7+1),DE
        LD HL,DPCI2
        LD BC,13
        LDIR
        PUSH DE
        LD C,21
        LDIR
        EX (SP),HL
        LD C,84
        LDIR
        POP HL
        LD C,34
        LDIR
        PUSH DE
        LD C,21
        LDIR
        EX (SP),HL
        LD C,84
        LDIR
        POP HL
        LD C,33
        LDIR

        LD DE,BUFSCR
        LD HL,TBABUF
        LD BC,WDT*6
        LD A,23
DPC12   LD (HL),E : INC HL
        LD (HL),D : INC HL
        EX DE,HL
        ADD HL,BC
        EX DE,HL
        DEC A
        JR NZ,DPC12
        RET

DPCI2   POP BC
        LD L,B
        LD H,#C6+11
        LD B,FONT/256+5
        EXX
        POP HL
        LD C,H
        LD H,#D2+11
        LD B,#C0+5

DPCI3   LD A,(BC)
        DEC B
        OR (HL)
        DEC H
        LD (DE),A
        DEC DE
        DEC E
        LD A,(HL)
        DEC H
        EXX
        OR (HL)
        DEC H
        LD (DE),A
        DEC E
        LD A,(BC)
        DEC B
        OR (HL)
        DEC H
        LD (DE),A
        DEC DE
        EXX

DPCI4   LD A,(BC)
        OR (HL)
        DEC H
        LD (DE),A
        INC E
        LD A,(HL)
        EXX
        OR (HL)
        DEC H
        LD (DE),A
        DEC E
        LD A,(BC)
        OR (HL)
        LD (DE),A
        EXX
        POP BC
        LD L,B
        LD H,#C6
        LD B,FONT/256
        EXX
        LD HL,24
        ADD HL,DE
        EX DE,HL
        POP HL
        LD C,H
        LD H,#D2
        LD B,#C0
        EXX

DPCI5   LD A,(BC)
        INC B
        OR (HL)
        INC H
        LD (DE),A
        INC DE
        INC E
        LD A,(HL)
        INC H
        EXX
        OR (HL)
        INC H
        LD (DE),A
        INC E
        LD A,(BC)
        INC B
        OR (HL)
        INC H
        LD (DE),A
        INC DE
        EXX

DPCI6   LD A,(BC)
        OR (HL)
        INC H
        LD (DE),A
        LD A,(HL)
        EXX
        OR (HL)
        INC H
        LD (DE),A
        INC E
        LD A,(BC)
        OR (HL)
        LD (DE),A
        LD HL,12
        ADD HL,DE
        EX DE,HL
        EXX
        LD HL,35
        ADD HL,DE
        EX DE,HL
        EXX
        DEC LY
DPCI7   JP NZ,#FDF1
        JP PRSE

BEGBTX  DB #FF,#0D
        INCB "RN"
        DB #FF
ETEXT

BUFSCR  EQU #9000; 4004
SEGI    EQU #A0
SEGI1   EQU SEGI+1
UINT    EQU SEGI1*256+SEGI1+1

AINT    EQU SEGI1*256

BUFLN1  EQU AINT+2; 82
TBAPR   EQU BUFLN1+82; 22*2
VAR     EQU TBAPR+44
BEGBSCR EQU VAR; 1
ABUFLIN EQU BEGBSCR+1; 2
ALINE   EQU ABUFLIN+2; 2
ESCR    EQU ALINE+2; 2
USP     EQU ESCR+2; 2
END1    EQU USP+2

TBABUF  EQU UINT+2; 23*2
END2    EQU TBABUF+46
BUFLN   EQU AINT+#D7; 41


