;z80
;zx-spectrum
;assembler

;  48
;   " " N1
;    (  BORN DEAD-16)
;   + 7  (  2 )
;  4  (   64   1024
;.  BORN DEAD   192)

;BASED BY WOCEN/TRIUMPH 28  2000
;WRTTEN BY WOCEN/TRIUMPH 5  2000

; 

;5-
;#4000-#5AFF [#1B00] -  0
;#5B00-#5FFF [#500] - 
;#6000-#72BF [#12C0] -   , 24+1   192 
;#7300-#76FF [#400] -   
;#7700-#7FFF [#C80] - 

;2-
;#8000-#9850 [#1851] - 
;#9851-#99FC [#1AC] -     
;#99FD-#BDFF [#2403] -     
;#BE00-#BF00 [#101] -   IM2
;#BF01-#BFBE [#BE] -     IM2
;#BFBF-#BFC1 [3] -   IM2
;#BFC2-#BFFF [#3E] -   

;0- 

;1- 

;3,4- 

;6-   
;#C000,#C2FF [#300]   
;#C300,#D2FF [#1000]   4x8
;#D300,#DAFF [#800]     
;#DB00,#FFFF FREE


BUF_SCR EQU     #6000           ;   [#1200+#180]
COL_LINE EQU    #7300           ;   
PRN_LIN EQU     #9851
PRN_SCR EQU     #99FD           ;   
TIME_SP EQU     #BFBF           ; 
ADR_LINE EQU    #D300           ;  

        ORG     #C000,3
-       INCBIN  "yama!!!.W"

        ORG     #C000,6
FONT_M
-       INCBIN  "6ECfont2"      ;[#300]

        ORG     #C300,6
FONT
-       INCBIN  "becfont"       ;[#800]

        ORG     #7700

        XOR     A
        OUT     (#FE),A
        LD      (CUR_LINE),A
        CALL    INSTALL
        LD      A,7
        CALL    PAGE
        LD      HL,#C000
        LD      DE,#C001
        LD      BC,#1800
        LD      (HL),L
        LDIR 
        LD      BC,#2FF
        LD      (HL),#7
        LDIR 
        LD      HL,#4000
        LD      DE,#4001
        LD      BC,#1800
        LD      (HL),L
        LDIR 
        LD      BC,#2FF
        LD      (HL),#7
        LDIR 

        LD      A,3             ;
        CALL    PAGE
TEXT_C  LD      A,1             ;  ?
        OR      A
        JP      Z,NO_CONV       ;
LEN_TXT LD      BC,3045         ; 
        LD      HL,#C000
        LD      DE,#FFFF
        ADD     HL,BC
        DEC     HL      ;    
        LDDR 
        EX      DE,HL
        INC     HL      ;.     
        LD      IY,COL_LINE     ;  
        LD      IX,BUF_SCR      ;   
        LD      DE,#C000

TEXT_C2 PUSH    DE
        LD      B,48            ; 
        LD      A,(HL)
        CP      ","             ;   ?
        JR      NZ,NO_COL       ;
        INC     HL
        LD      A,(HL)          ; 
        SUB     "0"
        ADD     A,A
        ADD     A,A
        ADD     A,A
        ADD     A,A
        LD      C,A
        INC     HL
        LD      A,(HL)          ; 
        SUB     "0"
        OR      C
        LD      (CUR_COL+3),A
        INC     HL
NO_COL  LD      A,(HL)
        INC     HL
        CP      #0D
        JR      Z,END_LINE
KOD_0D  LD      (DE),A
        INC     DE
        DEC     B
        JR      NO_COL
END_LINE
        LD      A,(HL)
        CP      #0A
        LD      A,#0D
        JR      NZ,KOD_0D
        INC     HL

        LD      A,B
        OR      A
        JR      Z,LINE_OK
        CP      48
        JR      NZ,L_ESTX
        EX      (SP),HL         ; 
        LD      HL,LINE_SP      ;  
        JR      LINE_O1

L_ESTX  LD      A," "
LIN_FIL LD      (DE),A
        INC     DE
        DJNZ    LIN_FIL
LINE_OK
        EX      (SP),HL
LINE_O1 LD      (IX+0),L        ;  
        LD      (IX+1),H
CUR_COL LD      (IY+0),0
        INC     IX
        INC     IX
        INC     IY
        POP     HL
        LD      A,H
        OR      L
        JR      NZ,TEXT_C2

        LD      A,6
        CALL    PAGE
        LD      HL,BUF_SCR
        LD      DE,ADR_LINE
        LD      BC,#800
        LDIR 
        PUSH    IY
        POP     HL
        LD      DE,0-COL_LINE
        ADD     HL,DE
        LD      (ALL_LINE),HL   ;-   
        LD      DE,(KOL_STR)    ;-   
        OR      A
        SBC     HL,DE
        DEC     HL
        LD      (DW_STR),HL     ; ,  
        LD      HL,0
        LD      (CUR_STR),HL    ;  
NO_CONV
        XOR     A
        LD      (TEXT_C+1),A
        CALL    PAGE

        CALL    PRN_ALL         ;    

L1      CALL    SCR_0
        HALT 
        LD      A,7             ;7 
        CALL    PAGE            ;0 
        LD      A,7
        OUT     (#FE),A
        CALL    PRN_SCR_
        CALL    UPR_KEY
        LD      A,1
        OUT     (#FE),A

        CALL    SCR_1           ;1 
        HALT 
        LD      A,5             ;5 
        CALL    PAGE
        LD      A,7
        OUT     (#FE),A
        CALL    PRN_SCR_
        CALL    UPR_KEY
        LD      A,1
        OUT     (#FE),A
        JR      L1

UPR_KEY
        LD      A,#EF
        IN      A,(#FE)
        RRA 
        JP      NC,EXIT
        AND     3
        JR      Z,UPR_1         ;  /
        CP      3
        JR      Z,UPR_1         ;  
        LD      (UPR_1+1),A     ;  
        EX      AF,AF'
        LD      HL,SPEED
        LD      A,(HL)
        CP      #1F
        JR      NC,$+2+1
        INC     A
        LD      (HL),A
UPR_0   SRL     A
        LD      C,A
        LD      B,0
        LD      HL,T_SPEED
        ADD     HL,BC           ;  
        LD      C,(HL)          ;  SIN
        LD      HL,CUR_LINE
        LD      A,(HL)
        RRCA 
        RRCA 
        RRCA 
        AND     #1F
        LD      D,A             ; 
        LD      A,(HL)
        EX      AF,AF'
        RRA 
        JR      NC,UP
        JR      DOWN

UPR_1   LD      A,0             ;  
        EX      AF,AF'
        LD      A,(SPEED)
        OR      A
        RET     Z
        DEC     A
        LD      (SPEED),A
        JR      UPR_0

DOWN    LD      A,1
        LD      (UP_0+1),A
        EX      AF,AF'
        ADD     A,C
        RRCA 
        RRCA 
        RRCA 
        AND     #1F
        LD      E,A             ; 
        SUB     D
        LD      B,A             ;- 
        JR      NZ,DOWN_1
DOWN_0  LD      A,1             ; 0,   
        OR      A               ;
        RET     Z
        LD      A,(HL)          ;  1 
        ADD     A,C
LINE_1  CP      200
        JR      C,$+2+2
LINE_2  SUB     200
        LD      (HL),A
        RET 

DOWN_1  LD      HL,(CUR_STR)
        INC     HL
        LD      DE,(DW_STR)
        OR      A
        SBC     HL,DE
        JR      NC,DOWN_2       ; 
        ADD     HL,DE
        LD      (CUR_STR),HL
        LD      A,(KOL_STR)
        LD      E,A
        LD      D,0
        ADD     HL,DE
        PUSH    BC
        CALL    PRN_STR         ; 1 
        POP     BC
        LD      HL,CUR_LINE
        DEC     B
        JR      Z,DOWN_0        ;.   1 
        LD      A,C
        SUB     8
        LD      C,A
        LD      A,(HL)
        ADD     A,8
LINE_11 CP      200
        JR      C,$+2+2
LINE_21 SUB     200
        LD      (HL),A
        JR      DOWN_1

DOWN_2  EX      DE,HL
        LD      (CUR_STR),HL
        LD      HL,CUR_LINE
        XOR     A
        LD      (SPEED),A
        LD      (DOWN_0+1),A
        LD      A,(HL)
        AND     7
        RET     Z
        LD      A,(HL)
        AND     %11111000
        ADD     A,8
        JR      LINE_1


UP      LD      A,1
        LD      (DOWN_0+1),A
        EX      AF,AF'
        INC     D
        INC     D       ;+16
        ADD     A,16
        SUB     C
        RRCA 
        RRCA 
        RRCA 
        AND     #1F
        LD      E,A             ; 
        LD      A,D
        SUB     E
        LD      B,A
        JR      NZ,UP_1
UP_0    LD      A,1             ; 0,   
        OR      A               ;
        RET     Z
        LD      A,(HL)          ;  1 
        SUB     C
        JR      NC,$+2+2
LINE_3  ADD     A,200
        LD      (HL),A
        RET 

UP_1    LD      HL,(CUR_STR)
        LD      A,H
        OR      L
        JR      Z,UP_2          ; 
        DEC     HL
        LD      (CUR_STR),HL
        PUSH    HL
        LD      HL,CUR_LINE
        DEC     B
        JR      NZ,UP_11         ;.   1 
        CALL    UP_0
        POP     HL
        JP      PRN_STR         ; 1 

UP_11   LD      A,C
        SUB     8
        LD      C,A
        LD      A,(HL)
        SUB     8
        JR      NC,$+2+2
LINE_31 ADD     A,200
        LD      (HL),A
        POP     HL
        PUSH    BC
        CALL    PRN_STR         ; 1 
        POP     BC
        JR      UP_1

UP_2    LD      HL,CUR_LINE
        LD      A,(HL)
        AND     7
        JR      Z,UP_3
        LD      A,(HL)
        AND     %11111000
        LD      (HL),A
        RET 

UP_3    XOR     A
        LD      (SPEED),A
        LD      (UP_0+1),A
        RET 


EXIT    POP     AF
        DI 
        LD      A,#3F
        LD      I,A
        IM      1
        EI 
        RET 

;-------   
PRN_ALL
        LD      A,(CUR_LINE)
        PUSH    AF
        LD      A,(KOL_STR)     ;-   
        LD      B,A             ;  
        INC     B               ; 1  
        LD      HL,(CUR_STR)
PRN_AL1 PUSH    BC
        PUSH    HL
        CALL    PRN_STR         ;   
        LD      HL,CUR_LINE
        LD      A,8             ; 
        ADD     A,(HL)          ;+  
LINE_4  CP      200             ;  ?
        JR      C,$+2+2         ;
        AND     7               ;   0 
        LD      (HL),A
        POP     HL
        POP     BC
        INC     HL              ;.  
        DJNZ    PRN_AL1
        POP     AF
        LD      (CUR_LINE),A
        RET 


;-------   
;:  (CUR_LINE)    
;HL=   
PRN_STR
        PUSH    HL
        LD      HL,BUF_SCR      ;  
        LD      A,(CUR_LINE)
        RRA 
        RRA 
        RRA 
        AND     #1F             ;    
        JR      Z,PRN_ST1
        LD      DE,192          ; 1  
        LD      B,A
        ADD     HL,DE
        DJNZ    $-1
PRN_ST1 LD      B,H             ;HL=   
        LD      C,L
        POP     HL

        LD      A,#16
        CALL    PAGE            ;.   
        ADD     HL,HL
        LD      DE,ADR_LINE
        ADD     HL,DE
        LD      A,(HL)
        INC     L
        LD      H,(HL)
        LD      L,A             ;HL=  

        LD      A,#13
        CALL    PAGE            ;.   

        LD      LX,8            ; 
PRN_ST2 LD      (0),SP
        DEC     HL
        DEC     HL              ; 
        DI                      ;  
        LD      SP,HL           ;INTA
        POP     HL              ;  HL
        EI 
        JP      PRN_LIN


;-------   
;  (CUR_LINE)  0-7     1 
;      = JP (IX)   ,
;  ,  K,   
;        

PRN_SCR_
        LD      A,(CUR_LINE)
        LD      HL,(CUR_STR)
        AND     7
        JR      Z,$+2+1
        INC     HL
        LD      DE,COL_LINE
        ADD     HL,DE           ; 
        LD      B,H
        LD      C,L
        LD      HL,#D804+24
        LD      A,(KOL_STR)
        LD      (OUT_SP+1),SP
        DI 
OUTCOL  EX      AF,AF'
        LD      A,(BC)
        INC     BC
        LD      D,A
        LD      E,A
        LD      SP,HL
       DUP      48/4
        PUSH    DE
       EDUP 
        LD      DE,#20
        ADD     HL,DE
        EX      AF,AF'
        DEC     A
        JR      NZ,OUTCOL
OUT_SP  LD      SP,0
        EI 

        LD      A,(CUR_LINE)    ;0-199
        CP      8+1
        JR      C,PRN_S3
;   
        LD      B,A
LINE_5  LD      A,200
        SUB     B               ;A=-    
                                ; 
        LD      C,A
        LD      HL,PRN_SCR
        LD      DE,384          ;    1 
        RRA 
        RRA 
        RRA 
        AND     #1F             ; 
        OR      A
        JR      Z,PRN_S1
        LD      B,A
        ADD     HL,DE
        DJNZ    $-1
PRN_S1  LD      A,C
        LD      DE,48           ;    1 
        AND     7
        OR      A
        JR      Z,PRN_S2
        LD      B,A
        ADD     HL,DE
        DJNZ    $-1
PRN_S2  LD      (E_CUR+2),HL    ;HL=  
        LD      (HL),#DD
        INC     HL
        LD      (HL),#E9        ;JP (IX)
        INC     HL
        LD      IX,E_CUR

PRN_S3  LD      A,(CUR_LINE)    ;0-207
        LD      C,A
        LD      HL,BUF_SCR
        LD      DE,192          ; 1  
        RRA 
        RRA 
        RRA 
        AND     #1F             ; 
        OR      A
        JR      Z,PRN_S4
        LD      B,A
        ADD     HL,DE
        DJNZ    $-1
PRN_S4  LD      A,C
        LD      DE,24           ; 1  
        AND     7
        OR      A
        JR      Z,PRN_S5
        LD      B,A
        ADD     HL,DE
        DJNZ    $-1
PRN_S5  DEC     HL              ;HL=  
        DEC     HL
        LD      (SP_EXIT+1),SP
        DI 
        LD      SP,HL
        POP     HL
        EI 
        JP      PRN_SCR         ;   

E_PRN   NOP 
SP_EXIT LD      SP,0            ; 
        EI 
        RET                     ;

E_CUR   LD      IX,0            ; 
        LD      (IX+0),#E1      ;POP HL
        LD      (IX+1),#22      ;LD ( ),HL
        DI 
        LD      SP,BUF_SCR-2
        POP     HL
        EI 
        JP      (IX)            ;   


;-------    -------
INSTALL:

;       
;[MAX=288]

        LD      DE,48/2*9+PRN_LIN+8+4+1 ;( /2)*9
                                ;. .;SP ;   H,D; +1
        LD      HL,PRN_LIN
        LD      B,48/2          ; /2
INST_1  LD      (HL),#E1        ;POP HL
        INC     HL
        LD      (HL),#7D        ;LD A,L
        INC     HL
        LD      (HL),#32        ;LD ( ),A
        INC     HL
        LD      (HL),E
        INC     HL
        LD      (HL),D          ;
        INC     HL
        INC     DE
        INC     DE
        LD      (HL),#7C        ;LD A,H
        INC     HL
        LD      (HL),#32        ;LD ( ),A
        INC     HL
        LD      (HL),E
        INC     HL
        LD      (HL),D          ;
        INC     HL
       DUP      6
        INC     DE
       EDUP 
        DJNZ    INST_1

;     [8]

        LD      (HL),#31        ;LD SP,N
        INC     HL
        LD      (PRN_ST2+2),HL  ;  SP
        INC     HL
        INC     HL
        LD      (HL),#3E        ;LD A,#17
        INC     HL
        LD      (HL),#16
        INC     HL
        LD      (HL),#CD        ;CALL ...
        INC     HL
        LD      (HL),PAGE
        INC     HL
        LD      (HL),'PAGE
        INC     HL

;      [MAX=4+256+8=268]

        LD      (HL),#16        ;LD D,N
        INC     HL
        LD      (HL),'FONT
        INC     HL
        LD      (HL),#26        ;LD H,N
        INC     HL
        LD      (HL),'FONT+8
        INC     HL

        PUSH    HL
        LD      B,48/2          ; 
INST_2  LD      (HL),#1E        ;LD E,N
        INC     HL
        INC     HL
        LD      (HL),#2E        ;LD L,N
        INC     HL
        INC     HL
        LD      (HL),#1A        ;LD A,(DE)
        INC     HL
        LD      (HL),#B6        ;OR (HL)
        INC     HL
        LD      (HL),#02        ;LD (BC),A
        INC     HL
        LD      (HL),#03        ;INC BC
        INC     HL
        DJNZ    INST_2

        LD      (HL),#14        ;INC H
        INC     HL
        LD      (HL),#24        ;INC D
        INC     HL
        LD      (HL),#DD
        INC     HL
        LD      (HL),#2D        ;DEC LX
        INC     HL
        LD      (HL),#C2        ;JP NZ
        INC     HL
        POP     DE
        LD      (HL),E
        INC     HL
        LD      (HL),D          ;
        INC     HL
        LD      (HL),#C9        ;RET

;  POP HL: LD (SCREEN),HL [MAX=#2403]

        LD      HL,PRN_SCR      ; 
        LD      DE,#C004        ;  

        LD      A,(KOL_STR)     ;-   
INST_3  EX      AF,AF'
        LD      C,8             ; 
INST_4  LD      B,48/4          ; /4
        PUSH    DE
INST_5  LD      (HL),#E1        ;POP HL
        INC     HL
        LD      (HL),#22        ;LD (  ),HL
        INC     HL
        LD      (HL),E
        INC     HL
        LD      (HL),D          ; 
        INC     HL
        INC     E
        INC     E               ;     2
        DJNZ    INST_5
        POP     DE
        CALL    DOWN_DE
        DEC     C
        JR      NZ,INST_4
        EX      AF,AF'
        DEC     A
        JR      NZ,INST_3
        LD      (HL),#C3        ;JP
        INC     HL
        LD      (HL),E_PRN
        INC     HL
        LD      (HL),'E_PRN     ;  
;   IM 2

        DI 
        LD      HL,#BE00
        LD      DE,#BE01
        LD      B,E
        LD      C,L             ;BC=#100
        LD      A,H
        LD      I,A
        IM      2
        INC     A
        LD      (HL),A
        LDIR 
        LD      L,H             ;HL=#BFBF
        LD      (HL),#C3
        INC     L
        LD      (HL),INTA
        INC     L
        LD      (HL),'INTA
        EI 

;    

        LD      A,6
        CALL    PAGE

        LD      HL,FONT
        LD      DE,FONT+#800
INST_7  LD      A,(HL)
        AND     #F0
        LD      (HL),A
        RRA 
        RRA 
        RRA 
        RRA 
        LD      (DE),A
        INC     HL
        INC     DE
        LD      A,H
        CP      'FONT+8
        JR      NZ,INST_7

        LD      A,(KOL_STR)     ;- 
        INC     A
        LD      B,A             ;-   +1
        XOR     A
        ADD     A,8             ;+ 1 
        DJNZ    $-2
        LD      (LINE_1+1),A    ;-  
        LD      (LINE_2+1),A
        LD      (LINE_3+1),A
        LD      (LINE_4+1),A
        LD      (LINE_5+1),A
        LD      (LINE_11+1),A
        LD      (LINE_21+1),A
        LD      (LINE_31+1),A
        RET 

; 
PAGE    PUSH    BC
OLD_SCR OR      #10
        LD      (OLD_PAGE+1),A
        LD      BC,#7FFD
        OUT     (C),A
        POP     BC
        RET 

; 
CH_SCR  LD      A,(OLD_SCR+1)
        XOR     8
CH_SCR1 LD      (OLD_SCR+1),A
        RET 
SCR_0   LD      A,#10
        JR      CH_SCR1
SCR_1   LD      A,#18
        JR      CH_SCR1

DOWN_DE INC     D
        LD      A,D
        AND     7
        RET     NZ
        LD      A,E
        ADD     A,#20
        LD      E,A
        RET     C
        LD      A,D
        SUB     8
        LD      D,A
        RET 

;------- 
INTA:
        DI 
        EX      (SP),HL
        LD      (JP_BUF+1),HL
        LD      (OLD_SP+1),SP
        LD      SP,TIME_SP
        PUSH    DE,BC,AF,IX,IY
        EXX 
        EX      AF,AF'
        PUSH    HL,DE,BC,AF
        LD      A,(OLD_SCR+1)
        LD      BC,#7FFD
        OUT     (C),A           ;  
;       CALL    MUSIC
OLD_PAGE LD      A,0            ; 
        CALL    PAGE
        POP     AF,BC,DE,HL
        EX      AF,AF'
        EXX 
        POP     IY,IX,AF,BC,DE
OLD_SP  LD      SP,0
        POP     HL
        EI 
JP_BUF  JP      0

;       
;  
T_SPEED DEFB    1,1,2,2,3,3,4,5,6,7,9,10,11,13,14,16

LINE_SP DEFS    48," "


;-------
ALL_LINE DEFW   0               ;-   
CUR_STR DEFW    0               ;   
DW_STR  DEFW    0               ;   

KOL_STR DEFB    24              ;-    
CUR_LINE DEFB   0               ;   
SPEED   DEFB    0               ;  


END
