PROTRACKER372 PT3D H

From MSX MUSIC WIKI
Jump to: navigation, search

pt3D C��tА�Б№Ц MAIN "",#C6 BEGcur

       LD A,(EPAT)
       CALL iPATq
      CALL XPP2
      LD A,C
       CALL ICHNQ
       LD A,(CURY),(beg1),A
      XOR A
       JR IBEGq

DECBEG2 DECBEG1 LD A,-1

       JR IBEG1Q

INCBEG2 INCBEG1 LD A,1 IBEG1Q LD HL,ARX

       BIT 5,(HL)

IBEGq LD HL,beg1,DE,#2E0B

       JZ $+8

IBEG2q LD HL,beg2,DE,#380B

       ADD A,(HL)
       AND 63
       LD (HL),A

toOO

       LD BC,#2F0A
       INC B
       SUB C
       JNC $-2
       ADD A,C
       PUSH AF
       LD A,B
       CALL PRADD
       POP AF

toOOQ INC D

       ADD A,"0
       JP PRADD

prpatl

       LD A,(PATLEN)
       INC A
       LD DE,#0C07
       JR toOO

toOOOO

       PUSH DE,IX
       LD IX,OOOO
       LD DE,1000
       CALL toOPP
       LD DE,100
       CALL toOPP
       LD DE,10
       CALL toOPP
       LD (IX),L
       POP IX,DE
       LD L,"0
       LD A,(OOOO)
       ADD A,L
       CALL PRADD
       INC D
       LD A,(OOOO+1)
       ADD A,L
       CALL PRADD
       INC D
       LD A,(OOOO+2)
       ADD A,L
       CALL PRADD
       LD A,(OOOO+3)
       JR toOOQ

toOPP

       LD B,-1
       OR A
       INC B
       SBC HL,DE
       JNC $-3
       ADD HL,DE
       LD (IX),B
       INC IX
       RET 

POSFON TEMPO=$+1

       LD A,4
       LD DE,#4106
       CALL PRF8
       LD A,(LENG)
       LD E,#66
       CALL PRF8
       LD A,(LOOP)
       LD E,#86
       CALL PRF8
       LD HL,TTITLE
       LD DE,#60C
       LD B,32
       CALL PRTXADD
       LD HL,TAUTHOR
       LD DE,#60D
       LD B,32
       CALL PRTXADD

PATFON

       LD A,(POS)
       PUSH AF
       LD DE,#4126
       CALL PRF8
       POP AF
       LD L,A
       LD H,'TPOSS
       LD A,(HL)
       LD DE,#4146
       CALL PRF8
      CALL prpatl
       LD A,(EPAT)
       LD DE,#41C6

PRF8 LD B,#F8 PR88 PUSH DE

       LD L,A,H,0
       LD C,H
       ADD HL,HL
       ADD HL,HL
       ADD HL,HL
       ADD HL,BC
       LD A,(pg)
       PUSH AF

PR88PG=$+1

       LD A,pg4
       CALL OUTME
      DUP 5
       LD A,(HL),(DE),A
       INC D,L
      EDUP 
       LD A,(HL),(DE),A
       POP AF,DE
       INC E
       JP OUTME

PR7D LD B,'FNTNOTE

       JR PR88

INCTMP

       LD A,(TEMPO)
       INC A
       AND 63
       RET Z

ITMPQ LD (TEMPO),A

       LD (temp1),A
       LD DE,#4106
       JR PRF8

DECTMP

       LD A,(TEMPO)
       DEC A
       RET Z
       JR ITMPQ

INCPOSU LD A,(ESNGon)

       OR A
       JP Z,INCEPAT
      CALL ROLnxPO
      JR IPOSQA

INCPOS

       LD A,(POS)
       INC A

IPOSQ LD (POS),A IPOSQA LD A,(POS)

       PUSH AF
       LD A,(ESNGon)
       OR A
       JNZ IPOSPAT
       POP AF
       LD DE,#4126
       CALL PRF8
       LD HL,(POS)
       LD H,'TPOSS
       LD A,(HL)
       LD DE,#4146
       JR PRF8

DECPOSU LD A,(ESNGon)

       OR A
       JP Z,DECEPAT
      SCF 
      CALL UPRnxPO
      JR IPOSQA

DECPOS

       LD A,(POS)
       DEC A
       JR IPOSQ

IPOSPAT POP AF

       LD L,A
       LD H,'TPOSS
       LD A,(HL)
       LD L,A
       LD (EPAT),A
       INC H
       LD A,(HL)
       LD (PATLEN),A
       CALL PATFON

IPOSPATQ

      XOR A
      LD (CURY),A
      INC A          ;
      LD (tempCNT),A ;
      JP PRPATUU     ;иначе глючит перекл.на лету в режиме TS
8

JPITEM

      LD A,(NOPKA)
      OR A
      RET Z
       LD D,0;A
       LD A,(ITEM)
       CP -1
       RET Z
       DEC A
       ADD A,A
       LD E,A
      CALL RE ;повторное не страшно?

useadr=$+1

       LD HL,MENUUSE
       ADD HL,DE
       LD A,(HL)
       INC HL
       LD H,(HL)
       LD L,A
       JP (HL)

STROKA

A=line#
E=scrY
B=pat
       PUSH BC,AF
      ;AND 63
       LD C,A
       LD A,E
       LD (STROKY),A
       EXA 
       PUSH DE
       CALL GETnADR
       PUSH HL
       POP IX
       POP DE
       LD D,0
       CALL DE2SCR
       EXD 
       LD A,C
       INC D
       LD B,'FNTDEC
       CALL PR88
       INC E
       LD A,(IX)
       OR (IX+1)
       JNZ $+7
       LD A,pg7,(PR88PG),A
       INC E
        LD A,(IX)
       CALL PRF8 ;NZ,NC
        LD A,(IX+1)
       CALL PRF8
       INC E
       LD A,pg7,(PR88PG),A
      LD A,(IX+2)
      CALL PRF8
      INC E
       LD A,16+4
       EXA 
       LD BC,3
      LD A,C

STROK0 PUSH AF

       ADD IX,BC
       LD A,(IX)
       AND #7F
       LD BC,13
       JZ sTRNbl
       DEC C
       DEC A
       CP 96
       JZ sTRNres
       INC B
       SUB C
       JNC $-2
       ADD A,C
       PUSH BC
       CALL PR7D
       POP AF
       JR sTRNQ

sTRNbl sTRNres LD A,C

       CALL PR7D
       LD A,C

sTRNQ

       ADD A,14
       CALL PR7D
       LD A,(IX+3)
       CALL PRF8 ;XX..
       PUSH DE
       EXA 
       LD D,A
       ADD A,10+6
       EXA 
       LD A,(IX)
       RLA 
       JNC STRnG
       LD A,(IX+3)
       RRA 
       RRA 
       RRA 
       RRA 
       AND 15
       ADD A,"G

STROKY=$+1

       LD E,0
       CALL PRADD

STRnG POP DE

       LD A,(IX+4)
       CALL PRF8
       INC E
       LD A,(IX+1)
       CALL PRF8
       LD A,(IX+2)
       CALL PRF8
       INC E
       LD BC,5
       POP AF
       DEC A
       JP NZ,STROK0
       LD A,pg4
       LD (PR88PG),A
       POP AF,BC
       RET 
1

TSTFIRH

      HALT 

TSTFIRE CALL CANCEL

       JNC TST1
       LD A,(NOPKA)
       OR A
       RET Z
       LD A,(ARX)

TSTXMIN=$+1

       CP 0
       RET C

TSTXMAX=$+1

       CP 0
       JNC TST1
       LD A,(ARXY)

TSTYMIN=$+1

       CP 0
       RET C

TSTYMAX=$+1

       CP 0

TST1 CCF

       RET 
       LD B,"-

NEGHL

       XOR A
       SUB L
       LD L,A
       SBC A,A
       SUB H
       LD H,A
       RET 

CLORNSM CALL CLORNS CLSMPS

       XOR A
       CALL CLSMP
       INC A
       AND 31
       JNZ $-6
       RET 

CLORNS

       XOR A
       CALL CLORN
       INC A
       AND #F
       JNZ $-6
      LD HL,TORNSZ+1
      LD B,6
      LD A,B
      INC HL,HL
      LD (HL),3
      DJNZ $-4
       LD HL,TDEFORN

CLORNS1 EXD

       PUSH AF
       CALL HLOR3
       POP AF
       EXD 
       LDI 
       LDI 
       LDI 
       DEC A
       JNZ CLORNS1
       RET 

CLSMP

       PUSH AF
       ADD A,'SMPS
       LD H,A
      SUB 'SMPS+#F
      SUB 1
       CALL OUT4
       LD BC,252
       LD L,B
      JNZ CLSMPnG
       LD (HL),264  ;сэмпл G
       INC HL       ;=тихая огибающая
       LD (HL),'264 ;(для орнамента F)
      JR CLSMPqG

CLSMPnG

       LD (HL),B
       INC HL
       LD (HL),B

CLSMPqG INC HL

       LD (HL),64
      JNC $+4
      LD (HL),192   ;сэмпл F = --E
       INC L
       LD (HL),B
       INC L
       EXD 
      LD H,D
       LD L,B
       LDIR 
       LD L,3
       LD (HL),15
       POP AF
       LD L,A
       ADD HL,HL
       LD H,'TSMPSZ
       LD (HL),0
       INC L
       LD (HL),1
       RET 

CLORN

       PUSH AF
       LD HL,TORNSZ+1
       ADD A,A
       ADD A,L
       LD L,A
      CP #F*2+TORNSZ+1
       CALL OUT4
       LD BC,63
       LD (HL),1
       DEC HL
       LD (HL),B
       CALL _orn
       LD (HL),B
      JNZ $+4
      LD (HL),-96
       LD D,H
       LD E,L
       INC E
       LDIR 
       POP AF
       RET 

DECOMS

       LD A,1,(yedecom),A
       LD A,"C",(extS),A
       DEC A
       LD (extF),A

DISKS

       LD (IY),-1
       LD (IY+48),8
       LD A,201,(MHEXFNTpg),A
       XOR A
       LD (#5CF9),A
      ;LD L,A,H,A,(#5D0F),HL ;в DOS уже есть
       LD A,9,(#5D06),A
       LD (DISKSP),SP
       LD HL,DISKCOO
       LD DE,DISKUSE
       LD BC,mDISK
       CALL WINDOW
       LD HL,tDISK
       LD DE,0
       CALL PRMENU
       LD HL,#5CDD
       LD DE,#B06
       LD B,8
       CALL PRTXADD
      LD A,(comped)
      OR A
      JR Z,DISKnsz
       LD HL,tSZ
       LD DE,0
       CALL PRMENU
       LD HL,(SNGLEN)
       LD DE,#1500
       CALL PRHL

DISKnsz

      LD A,(catH)
      INC A
      CALL Z,READCAT
       CALL PRCATEI

CATLOOP

      CALL RESHALT
       CALL NZ,REREAD
       CALL JPITEM
       CALL USEBAR
       CALL TSTFIRE
       JNC CATLOOP

DISKQ movd0a0=$+1

       LD A,0
       OR A
       JZ DSKQnMV
       CALL OUT7
       LD HL,ld000
       LD DE,la000
       LD BC,#2000
       LDIR 
       XOR A
       LD (movd0a0),A

DSKQnMV;LD A,'IMVEC

      ;LD I,A
      ;IM 2

DISKSP=$+1

       LD SP,0
       LD A,205,(MHEXFNTpg),A
      CALL DOWNMER
       CALL CLOSWIN
       LD A,"S",(extS),A
       LD A,"F",(extF),A
       XOR A
       LD (comped),A
       LD (yedecom),A
       CALL MKSCROL
       CALL POSFON
       CALL PRPAT
       JR COPYFRQ
      IFN set

SETUP

       LD HL,SETUCOO
       LD DE,SETUUSE
       LD BC,mSETUP
       CALL WINDOW
       LD HL,tSETUP
       LD DE,0
       CALL PRMENU
       CALL PRSETS

SETUPP0

      CALL HALTER
       CALL JPITEM
       CALL TSTFIRE
       JNC SETUPP0
       CALL SETCOLS
       CALL CLOSWIN
       CALL PRPAT
      ENDIF 

COPYFRQ

       CALL OUT6

FRQn=$+1

       LD DE,1
       LD HL,NT_DATA
       ADD HL,DE,HL,DE,HL,DE
       LD BC,T_
       LD E,(HL)
       INC HL
       EXD 
       ADD HL,BC
       LD A,(DE),(COPF3),A
       INC DE
       LD A,(DE)
       ADD A,C
       LD C,A
       ADC A,B
       SUB C
       LD B,A
       LD DE,FrTab
       PUSH BC,DE
       LD B,12

COPF1 PUSH BC

       LD C,(HL)
       INC HL
       LD B,(HL)
       PUSH HL,DE
       EXD 
       LD DE,23
       LD HX,8

COPF2 SRL B

       RR C
       LD A,C

COPF3 ADC A,D ;=ADC 0

       LD (HL),A
       INC HL
       LD A,B
       ADC A,D
       LD (HL),A
       ADD HL,DE
       DEC HX
       JNZ COPF2
       POP DE,HL
       INC DE,DE
       INC HL
       POP BC
       DJNZ COPF1
       POP HL,DE

CORR_1 LD A,(DE)

       OR A
       RET Z
       INC DE
       RRA 
       PUSH HL
       PUSH AF
       ADD A,A
       LD C,A
       ADD HL,BC
       POP AF
       INC (HL)
       JNC $+4
       DEC (HL),(HL)
       POP HL
       JR CORR_1
      IFN set

suPOI LD HL,poion

       JR suCPL

suKJ XOR A

       IN A,(31)
       CPL 
       AND #F
       RET Z
       LD HL,joy
       JR suCPL

suSND LD A,(SHOLK)

       OR A
       LD A,201
       JZ $+3
       XOR A
       LD (SHOLK),A
       JR PRSETS

suPLAY LD HL,playon suCPL LD A,(HL)

       CPL 
       LD (HL),A
       JR PRSETS

suPAP1 LD HL,pap1

       JR suATR

suINK2 LD HL,ink2

       JR suATR

suPAP2 LD HL,pap2

       JR suATR

suBORD LD HL,bord

       JR suATR

suFRQ LD HL,FRQn

       INC (HL)
       RES 2,(HL)
       JR PRSETS

suINK1 LD HL,ink1 suATR LD A,(HL)

       ADD A,8
       AND 56
       LD (HL),A

PRSETS

       LD BC,(FRQn-1)
       INC B
       LD DE,12
       LD HL,tPTST-12
       ADD HL,DE
       DJNZ $-1
       LD DE,#1301
       CALL PRMENU
       LD A,(poion)
       LD HL,tON
       OR A
       JNZ $+5
       LD HL,tOFF
       LD DE,#1602
       CALL PRMENU
       LD HL,#5971
       LD BC,32
       LD A,(ink1),(HL),A
       INC L
       LD A,(pap1),(HL),A
       ADD HL,BC
       LD A,(pap2),(HL),A
       DEC L
       LD A,(ink2),(HL),A
       LD A,(bord),(#59B2),A
       LD A,(SHOLK)
       LD HL,tON
       OR A
       JZ $+5
       LD HL,tOFF
       LD DE,#1407
       CALL PRMENU
       LD A,(joy)
       LD HL,tON
       OR A
       JNZ $+5
       LD HL,tOFF
       LD DE,#1909
       CALL PRMENU
       LD A,(playon)
       OR A
       LD HL,tALL
       JNZ $+5
       LD HL,tNOTE
       LD DE,#1408
       JP PRMENU
      ENDIF 
1+?

SETCOLS

       LD HL,ink1
       LD A,(HL)
       INC HL
       RRCA 
       RRCA 
       RRCA 
       OR (HL)
       LD L,A,H,A
       LD (col1),HL
       LD HL,ink2
       LD A,(HL)
       INC HL
       RRCA 
       RRCA 
       RRCA 
       OR (HL)
       LD L,A,H,A
       LD (col2),HL
       LD A,(bord)
       RRCA 
       RRCA 
       RRCA 
       OUT (-2),A
       RET 

EDFILE

       LD HL,#5CDD
       LD DE,#B06
       LD A,8
       CALL EDTXT
       JP WAITNOK

SAVSMP

       LD HL,TSSMP,DE,#C01
       CALL PRMENU
       LD A,"s",(#5CE5),A
       LD C,#12
       CALL DOS
       CALL OUT4
       LD A,(smp)
       PUSH AF
       ADD A,'SMPS
       LD H,A
       LD DE,BUF
       LD BC,256
       LD L,C
       LDIR 
       POP AF
       ADD A,A
       LD L,A,H,'TSMPSZ
       LDI 
       LDI 
       LD HL,BUF
       LD DE,258

DOSb

       LD C,#B

DOSbQ CALL DOS

      LD HL,#5D0F,A,(HL),(HL),0
      OR A
      JZ $+4
       OUT (-2),A
      LD A,-1,(catH),A
       JP DISKQ

SAVORN

       LD HL,TSORN,DE,#B01
       CALL PRMENU
       LD A,"o",(#5CE5),A
       LD C,#12
       CALL DOS
       CALL OUT4
       CALL HLORN
       LD DE,BUF,BC,64
       LDIR 
       LD H,'TORNSZ,L,A
       LDI 
       LDI 
       LD HL,BUF,DE,66
       JR DOSb

SAVPAT

       LD HL,TSPAT,DE,#B01
       CALL PRMENU

CURY=$+1 EPAT=$+2

       LD BC,0,C,0
       CALL GETnADR
       PUSH HL
       LD A,"p",(#5CE5),A
       LD C,#12
       CALL DOS
       POP HL
       LD DE,#480
       JR DOSb

SAVCOMP

       CALL OUT7
       LD C,#12
     IFN cmpilmnu
      LD A,(plyrON)
      OR A
       LD HL,plaer,A,"C
      JNZ $+7
     ENDIF 
       LD HL,mod,A,"m
       LD (#5CE5),A
      PUSH HL
       CALL DOS
      POP HL
       LD DE,(SNGLEN)
       LD C,#B
       CALL DOS
       LD C,#A
       CALL DOS
       LD A,C
       PUSH AF
       LD C,8
       CALL DOS
       LD HL,(SNGST),(#5CE6),HL
       POP AF
       LD C,9
      IF0 alasm
       JP DOSbQ
      ELSE 
       CALL DOS
      LD A,-1,(catH),A
      LD HL,#5D0F,A,(HL),(HL),0
      OR A
      JZ COMPOK
       OUT (-2),A
       JP DISKQ

COMPOK

       LD HL,RESALM
       LD BC,#80
       LD DE,#5B80
       LDIR 
       CALL #5B80
       JP DISKQ
      ENDIF 

SAVE comped=$+1

       LD A,0
       OR A
       JNZ SAVCOMP
       CALL EXB0
      LD A,40 ;NOKILL
       CALL cMPILE
       PUSH HL,DE
       CALL EXB0
       CALL OUT7
       LD C,#12
       LD A,"m",(#5CE5),A
       CALL DOS
       POP DE,HL
       JP DOSb

CATUP

       LD A,(cattop)
       DEC A
       RET M
       LD (cattop),A
       JR PRCATEI

CATDN

       LD A,(cattop)
       INC A
       ADD A,7

catH=$+1

       CP 255
       RET NC
       SUB 7
       LD (cattop),A
2

PRCATEI

       JP PRCAT

DESCADR

       LD L,A,H,0,E,L,D,H
       ADD HL,HL
       ADD HL,HL
      ADD HL,DE
       ADD HL,HL
       LD DE,CATfilt
       ADD HL,DE
       RET 

LDORN

       LD HL,TLORN,DE,#A01
       CALL PRMENU
       CALL OUT4
       LD HL,BUF
       PUSH HL
       LD (LDADR),HL
       CALL LDFILE
       CALL HLORN
       EXD 
       POP HL
       LD BC,64
       LDIR 
       LD D,'TORNSZ

LDORNQ LD E,A

       LDI 
       LDI 
       JP DISKQ

LDSMP

       LD HL,TLSMP,DE,#B01
       CALL PRMENU
       CALL OUT4
       LD HL,BUF
       PUSH HL
       LD (LDADR),HL
       CALL LDFILE
       LD A,(smp)
       PUSH AF
       ADD A,'SMPS
       LD D,A
       POP AF
       ADD A,A
       POP HL
       LD BC,256
       LD E,C
       LDIR 
       LD D,'TSMPSZ
       JR LDORNQ

LOAD

       LD A,(ITEM)
       SUB 9
       LD C,A,A,(cattop)
       ADD A,C
       CALL DESCADR
       LD DE,#5CDD,BC,9
       LDIR 
      LD C,(HL)

yedecom=$+1

       LD A,0
       DEC A
       JP Z,DECOM
       DEC HL
       LD A,(HL)
       CP "o
       JZ LDORN
       CP "S
       JZ LDST
       CP "m
       JZ LDSNG
       CP "F
       JZ LDSTP
       CP "p
       JZ LDPAT
       CP "s
       JZ LDSMP
       CP "M
       RET NZ
       CALL OUT7
       LD HL,mod,(LDADR),HL
       CALL LDFILE
        DI 
       CALL EXB0
       CALL LDPT2PP
       CALL EXB0
       LD IY,iy
        EI 
       JR ex9BQ

LDST

       CALL MOVD0A0
       CALL LDFILE
       CALL LDSTPP
       JR ex9BQ

LDSTP

       CALL MOVD0A0
       LD (LDADR),HL
       CALL LDFILE
       LD A,-1,(ksaON),A,(STand),A
       CALL LDKSAPP
       XOR A
       LD (ksaON),A
       LD A,#F,(STand),A

ex9BQ LD A,(TPOSS),(EPAT),A

       JP DISKQ

LDPAT

      LD A,C
      CP "t
      JZ LDSNG
       LD HL,TLPAT,DE,#B01
       CALL PRMENU
       LD A,(EPAT),B,A,C,0
       CALL GETnADR
       LD (LDADR),HL
       CALL LDFILE
       JP DISKQ

LDSNG

       CALL OUT7
       LD HL,mod
      IFN tstPT
      PUSH HL
      ENDIF 
       LD (LDADR),HL
       CALL LDFILE
       LD HL,TPROTR
      IFN tstPT
      POP DE
       LD B,13

LDSNGCP LD A,(DE)

       CP (HL)
       JNZ PRSORRY
       INC DE
       INC HL
       DJNZ LDSNGCP
      ENDIF 

LDSNGQ DI

       CALL EXB0
       CALL LDPT3PP
       CALL EXB0
        EI 
       XOR A
       LD (POS),A
       LD A,(TPOSS)
       LD (EPAT),A
       JP DISKQ

PRSORRY LD HL,TSORRY

       JP PRDISKQ

DOSTSPP LD (#5C3D),SP

       JP #3D13
1

DOSTEST

       CALL DOSTSPP
       LD A,#C9,(#5CC2),A
       LD A,'IMVEC,I,A
       IM 2
       EI 
       LD A,(#5D0F)
       INC A
       JZ DOSTSOK
       LD A,(iy)
       INC A
       RET Z

DOSTSOK LD HL,TDISKER

       LD A,(#5D0F)
       CP -1
       JNZ $+5
       LD HL,TNOFILE
       LD (IY),-1

PRDISKQ LD DE,#601

       CALL PRMENU
      ;LD B,50
      ;HALT
      ;DJNZ $-1
       JP DISKQ

LDFILE

       LD C,#A
       CALL DOS
       LD A,C
       LD C,8
       CALL DOS
       LD DE,(#5CE8)

LDADR=$+1

       LD HL,mod
       LD A,3
       LD C,#E

DOS

       IM 1
       PUSH AF,HL
       LD A,#3F,I,A
       LD HL,0,(#5D0F),HL
       LD A,#C3,(#5CC2),A
       LD HL,ONERR,(#5CC3),HL
       POP HL,AF
       PUSH IX
       CALL DOSTEST
       POP IX
       RET 

ONERR EX (SP),HL

       PUSH AF
       LD A,H
       CP #D
       JZ ONERRIA
       POP AF
       EX (SP),HL
       RET 

ONERRIA POP HL

       POP HL
       POP HL
       POP HL
       POP HL
       CALL msgRIA

ONERIA0 LD A,#FB

       IN A,(-2)
       LD B,"R
       BIT 3,A
       JZ ONERIAQ
       LD A,#DF
       IN A,(-2)
       LD B,"I
       BIT 2,A
       JZ ONERIAQ
       LD A,#FD
       IN A,(-2)
       RRCA 
       LD B,"A
       JC ONERIA0

ONERIAQ PUSH AF

       CALL CLOSWIN

OLDPG=$+1

       LD A,0
       CALL OUTME
       POP AF
       LD HL,#3F7E
       EX (SP),HL
       JP #3D2F

msgRIA

       PUSH AF
       LD A,(pg),(OLDPG),A
       LD BC,mDISKER
       CALL WINDUM
       LD HL,tDISKER
       LD DE,0
       CALL PRMENU
       POP AF
       RET 

REREAD

       SUB "1
       RET C
       CP 4
       RET NC
       LD (23833),A
       LD (23798),A
       LD (23800),A
       LD (23801),A
       CALL drive
       LD C,1
       CALL DOS

READCAT

       LD A,8,(DSKopts),A
        LD HL,CATfilt
       LD DE,CATfilt+1
       LD (HL),32
      LD B,1;C,#48
       LDIR 
       LD A,8,(catopts),A
       XOR A
       LD (catH),A
       LD (cattop),A
       CALL PRCAT
       LD HL,CATdos
       LD DE,0
       LD BC,#805
       CALL DOS
        LD IX,CATdos
        LD DE,CATfilt
       XOR A
       EXA 
       LD B,128

RDCAT0 PUSH BC

      LD BC,7
       LD A,(IX)
       OR A
       JZ RDCATQ-1
       DEC A
       JZ RDBADXT
       LD HL,FILEXTS
       LD A,(IX+8)
      CPIR 
      JNZ RDBADXT
       PUSH IX
       POP HL
      LD C,10;9
       LDIR 
       EXA 
       INC A
       EXA 

RDBADXT LD C,16

       ADD IX,BC
       POP BC
       DJNZ RDCAT0
       PUSH BC
       POP BC

RDCATQ EXA

       LD (catH),A
       LD C,8
       CP C
       JC $+3
       LD A,C
       LD (catopts),A
       ADD A,C
       LD (options),A
       LD (DSKopts),A
       XOR A
       LD (cattop),A

PRCAT

       LD A,(cattop)
       CALL DESCADR

catopts=$+1

       LD A,8
       LD B,A
       OR A
       JZ pRCATQ
       LD DE,#1504

PRCAT0 PUSH BC,DE

       LD B,8
       CALL PRTXADD
       INC D,B
       CALL PRTXT
      INC HL
       POP DE,BC
       INC E
       DJNZ PRCAT0

pRCATQ JP CATBAR DECPAT

       LD A,-1
       JR IPATQ

INCPAT LD A,1 IPATQ LD HL,(POS),H,'TPOSS

       ADD A,(HL)
       JP P,$+5
       LD A,PATS-1
       CP PATS
       JC $+3
       XOR A
       LD HL,(POS),H,'TPOSS
       LD (HL),A,C,A
       LD A,(ESNGon)
       OR A
       LD A,C
       LD DE,#4146
       JP Z,PRF8
       LD (EPAT),A
       INC H
       LD L,C
       LD A,(HL),(PATLEN),A
       CALL PATFON
       JP IPOSPATQ;PRPAT ;v3+698

INCLENG

       LD A,(LENG)
       INC A
       JNZ $+3
       INC A

ILENQ LD (LENG),A

       LD DE,#4166
       JP PRF8

DECLENG LD A,(LENG)

       DEC A
       JNZ ILENQ
       DEC A
       JR ILENQ

INCLOOP

       LD A,(LOOP)
       INC A

ILOOPQ LD (LOOP),A

       LD DE,#4186
       JP PRF8

DECLOOP LD A,(LOOP)

       DEC A
       JR ILOOPQ

INCVOL VOL=$+1

       LD A,#F
       INC A
       AND #F
       RET Z

IVOLQ LD (VOL),A

       PUSH AF
       LD DE,#41A6
       CALL PRF8
       POP AF
       ADD A,A
       ADD A,A
       ADD A,A
       ADD A,A
       LD (glovol),A
       RET 

DECVOL LD A,(VOL)

       DEC A
       RET M
       JR IVOLQ

INCEPAT

       LD A,(EPAT)
       INC A
       LD B,0

IEPATQ CP PATS

       JC $+3
       LD A,B
       LD (EPAT),A
       PUSH AF
       LD HL,TPATSZ
       ADD A,L
       LD L,A
       LD A,(HL)
       LD (PATLEN),A
       LD A,(ESNGon)
       OR A
       JNZ IESNG
      CALL prpatl
       POP AF
       LD DE,#41C6
       CALL PRF8

iEPATQQ

       JP IPOSPATQ;PRPAT ;v3+698

DECEPAT LD A,(EPAT)

       DEC A
       LD B,PATS-1
       JR IEPATQ

IESNG LD HL,(POS),H,'TPOSS

       POP AF
       LD (HL),A
       CALL PATFON
       JR iEPATQQ

CPLm

       LD A,(HL)
       XOR -1
       LD (HL),A
       LD HL,tON
       RET Z
       LD HL,tOFF
       RET 

AUTOON

       LD HL,auto
       CALL CPLm
       LD DE,#A0A
       JR NXDIVQ

ENVON

       LD HL,aenv
       CALL CPLm
       LD DE,#A0B
       JR NXDIVQ

NXTDIV

       LD A,127
       IN A,(-2)
       RRA 
       RRA 
       CALL C,CANCEL2
       LD HL,div
       LD A,(HL)
       INC A
       JC $+4
       SUB 2
       AND 7
       LD (HL),A
       LD D,A
       ADD A,A
       ADD A,D
       LD E,A
       LD D,0
       LD HL,DIVS
       ADD HL,DE
       LD DE,#F0B

NXDIVQ JP PRMENU MKSCROL

     CALL OUT7
       LD HL,scrolin
       LD DE,_d000
       PUSH DE
       LD BC,scroLEN
       LDIR 
       POP HL
       PUSH HL
       LD BC,scroSIZ
       LDIR 
       EXD 
       LD (HL),#C3
       INC HL
       LD (HL),scrolQ
       INC HL
       LD (HL),'scrolQ
       INC HL
       LD (scrol2J),HL
       POP DE
      PUSH HL
       PUSH DE
       LD BC,scroSIZ+scroLEN
        EXD 
        LDIR 
        EXD ;#
       LD (HL),#C3
       INC HL
       LD (HL),scrol2Q
       INC HL
       LD (HL),'scrol2Q
       POP IX
       LD HL,#5103
       LD DE,#49E0
       LD C,8

MSCR0 LD B,6 MSCR1 CALL MscrPP

       CALL DDE,DHL
       DJNZ MSCR1
       CALL DDE,DHL
      INC D,H
       DEC C
       JNZ MSCR0
      POP IX
       LD HL,#56C3
       LD DE,#56E0
       LD C,8

MSCR2 LD B,6 MSCR3 CALL MscrPP

       CALL UDE,UHL
       DJNZ MSCR3
       CALL UDE,UHL
      DEC D,H
       DEC C
       JNZ MSCR2
       RET 

MscrPP

      PUSH BC
      LD C,-3
       LD A,L
       LD (IX+1),A
       LD (IX+2),H
       ADD A,C
       LD (IX+4),A
       LD (IX+5),H
       LD A,E
       LD (IX+7),A
       LD (IX+8),D
       SUB C
       LD (IX+11),A
       LD (IX+12),D
       SUB C
       LD (IX+15),A
       LD (IX+16),D
       SBC A,C
       LD (IX+20),A
       LD (IX+21),D
       SBC A,C
       LD (IX+24),A
       LD (IX+25),D
       ADD A,21
       LD (IX+40),A
       LD (IX+41),D
       LD BC,scroLEN ;54
       ADD IX,BC
      POP BC
       RET 

scrolST

       DI 
       PUSH AF,BC,DE,HL,IX
       CALL OUT7
       LD (scrolQ+1),SP
       JP _d000

scrolQ

       LD SP,0
       POP IX,HL,DE,BC,AF
       RET 

scrol2

       PUSH AF,BC,DE,HL,IX
       CALL OUT7
       LD (scrol2Q+1),SP

scrol2J=$+1

       JP _d000

scrol2Q

       LD SP,0
       POP IX,HL,DE,BC,AF
       RET 

scrolin

       LD SP,0;0
       LD A,(0);3
       LD (0),A;6
       POP HL
       LD (0),HL;10
       POP AF
       LD (0),A;14
       INC SP
       POP HL
       LD (0),HL;19
       POP HL
       LD (0),HL;23
       INC SP
       POP AF
       INC SP
       POP BC,DE
       INC SP
       POP HL
       INC SP
       EXX 
       POP BC,DE
       INC SP
       POP HL
       LD SP,0;39
       PUSH HL
       DEC SP
       PUSH DE,BC
       DEC SP
       EXX 
       PUSH HL
       DEC SP
       PUSH DE,BC
       DEC SP
       PUSH AF

scroLEN=$-scrolin scroSIZ=scroLEN*47

3

UDE

       LD A,D
       DEC D
       AND 7
       RET NZ
       LD A,E
       SUB 32
       LD E,A
       RET C
       LD A,D
       ADD A,8
       LD D,A
       RET 
3

UHL

       LD A,H
       DEC H
       AND 7
       RET NZ
       LD A,L
       SUB 32
       LD L,A
       RET C
       LD A,H
       ADD A,8
       LD H,A
       RET 

EXB0

       LD HL,COMFROM
       LD DE,lb000
       CALL OUT6

EXPG0 LD C,(HL),A,(DE),(HL),A,A,C,(DE),A

       INC DE,HL
      LD A,D
      CP #BF
      JNZ EXPG0
       RET 

COMPILS

       CALL EXB0
      LD A,24 ;KILL
       CALL cMPILE
      IFN cmpilmnu
       LD A,(plyrON)
       OR A
       JZ COMPnPL
       LD HL,mod-plaer
       ADD HL,DE
       EXD 

COMPnPL

      ENDIF 
       LD (SNGLEN),DE
       CALL EXB0
      IFN cmpilmnu
       LD HL,COMPCOO
       LD DE,COMPUSE
       LD BC,mCOMPIL
       CALL WINDOW
       LD HL,tCOMPIL
       LD A,H,(EDTXQIF),A
       LD DE,0
       CALL PRMENU
       CALL PRCOMPI

COMPLOP

      CALL HALTER
       CALL JPITEM
       CALL TSTFIRE
       JNC COMPLOP
       CALL CLOSWIN
       XOR A
       LD (EDTXQIF),A
       JP MKSCROL

COMSAVE

      ENDIF 
       LD A,-1
       LD (comped),A
      IF0 ply+cmpilmnu
      JP DISKS
      ELSE 
       LD A,"C",(extS),A
       LD A,201,(MHEXFNTpg),A
       CALL CLOSWIN
       LD A,205,(MHEXFNTpg),A
       XOR A
       LD (EDTXQIF),A
       POP HL
       CALL OUT7
      IF0 ply
      JP DISKS
      ELSE 
       LD A,(SNGST+1)
       LD IX,TRELOC
       LD HL,plaer
       LD D,#C0
       LD ($-1),A
       LD E,A
       LD B,L

REL0 LD C,(IX)

       LD A,C
       OR A
      JP Z,DISKS
       INC IX
       ADD HL,BC
      INC A
      JZ REL0
       LD A,(HL)
       SUB D
       ADD A,E
       LD (HL),A
       JR REL0
      ENDIF 
      ENDIF 
      IFN cmpilmnu

PLYRyn

       LD HL,plyrON
       LD A,(HL)
       XOR -1
       LD (HL),A
       LD BC,(SNGLEN)
       LD HL,mod-plaer
       CALL Z,NEGHL
       ADD HL,BC
       LD (SNGLEN),HL
       JP PRCOMPI

EcomADR

       CALL WAITNOK
       LD A,2
       LD DE,#1004
       LD HL,tC0
       CALL EDTXT
       LD A,(TXTBUF)
       CP "0
       JC EcomAQ
       CP "G
       JNC EcomAQ
       CP "A
       JC $+6
       SUB #37
       JR EcomA1
       CP ":
       JNC EcomAQ
       SUB "0

EcomA1 RRCA

       RRCA 
       RRCA 
       RRCA 
       LD B,A
       LD A,(TXTBUF+1)
       CP "0
       JC EcomAQ
       CP "G
       JNC EcomAQ
       CP "A
       JC $+6
       SUB #37
       JR EcomA2
       CP ":
       JNC EcomAQ
       SUB "0

EcomA2 OR B

       LD (SNGST+1),A

EcomAQ JP PRCOMPI PRCOMPI plyrON=$+1

       LD A,-ply
       OR A
       LD HL,TYES
       JNZ $+5
       LD HL,TNO
       LD DE,#1103
       CALL PRMENU
       LD HL,(SNGST)
       LD DE,#1004
       CALL PRHL
       LD DE,#1008
       CALL PRHL
       LD DE,#1009
       LD L,5
       CALL PRHL
       LD DE,#100A
       LD L,8
       CALL PRHL
       LD DE,#100B
       LD BC,mod-plaer-8
       ADD HL,BC
       CALL PRHL
       LD HL,(SNGLEN)
       LD DE,#100D
      ENDIF 

PRHL

       LD A,H
       CALL PRHEX
       INC D
       LD A,L

PRHEX

       PUSH AF
       RRCA 
       RRCA 
       RRCA 
       RRCA 
       CALL PRBCD
       INC D
       POP AF

PRBCD

       AND #F
       ADD A,#90
       DAA 
       ADC A,#40
       DAA 

PRADD

       PUSH DE
       CALL PRADDPP
       CALL PR4X8
       POP DE
       RET 

INCCHN

       LD A,(chn1)
       INC A
       CP 4
       JNZ $+4
       LD A,1

ICHNQ LD (chn1),A

       LD DE,#2F0A
       JR PRBCD

DECCHN LD A,(chn1)

       DEC A
       JNZ ICHNQ
       LD A,3
       JR ICHNQ

INCCHN2

       LD A,(chn2)
       INC A
       CP 4
       JNZ $+4
       LD A,1

ICHN2Q LD (chn2),A

       LD DE,#390A
       JR PRBCD

DECCHN2 LD A,(chn2)

       DEC A
       JNZ ICHN2Q
       LD A,3
       JR ICHN2Q

D2HEX

       CP 10
       JC $+4
       ADD A,"A"-":
       ADD A,"0
       LD (digit),A
       JR PRADD

drive

       LD C,A
       LD A,(#5D16)
       AND #FC
       OR C
       LD (#5D16),A
       LD A,C
       RET 

BLOBER

       LD E,0
       LD D,H
       LD (HL),E
       INC H
       LD (HL),E
       INC H
       LD (HL),A
       INC H
       LD (HL),A
       INC H
       LD (HL),E
       INC H
       LD (HL),E
       LD H,D
       RET 

BLOBER7 LD E,#70

       JR BLOBER+2
2

ANYKEY

       XOR A
        HALT 
       IN A,(-2)
       RET 
1

DECOM modCd=modC+255/256*256

       LD HL,TSEARCH
       LD DE,#601
       CALL PRMENU
       LD C,#A
       CALL DOS
       LD A,C
       LD C,8
       CALL DOS
       CALL OUT7
       LD HL,(#5CEB)
       LD (#5CF4),HL
       LD A,(#5CEA)

DECOM0 EXA

       LD HL,modCd+256
       LD DE,modCd
      PUSH DE ;modCd
       LD BC,256
       LDIR 
       LD HL,(#5CF4)
       EXD ;HL=modCd+256
       LD BC,#105
       CALL DOS
      POP HL ;modCd

DECOM1 LD DE,TPROTR;+13

      ;LD C,L
      PUSH HL
       LD B,#D

DCOMPP0 INC DE,HL;DEC DE,HL

       LD A,(DE)
       CP (HL)
       JNZ DCOMPPQ
       DJNZ DCOMPP0
      ;PUSH HL
       LD HL,TSEARCH
       LD DE,#601
       CALL PRMENU
       LD HL,modCd+512
       EXA 
       LD BC,#4005
       CP B
       JNC $+3
       LD B,A
       LD DE,(#5CF4)
       CALL DOS
      POP HL
       LD DE,mod
       LD B,64
       LDIR 
       JP LDSNGQ

DCOMPPQ;LD L,C

      POP HL
       INC L
       JNZ DECOM1
       EXA 
       DEC A
       JNZ DECOM0
       JP DISKQ

CHN1PP chn1=$+1

       LD A,1
       LD BC,3
       DEC A
       RET Z
       LD C,8
       DEC A
       RET Z
       LD C,13
       RET 
      IFN bemol

EPbem

       LD BC,(CURY)
       CALL GETnADR,XPP2
       LD A,C
      ADD A,A,A,A,A,C,A,-2
       ADD A,L
       LD L,A
      JNC $+3
      INC H
       LD A,(HL)
       SUB 12
       JNC $-2
       ADD A,11
       LD L,A
       DB ")))
       LD H,'FNTDEC+2
       INC L
      BIT 3,(HL) ;diez
      RET Z
       DEC L
       LD D,H
       LD A,8
       CALL bemxorP
       LD A,-8
       CALL bemxorP
       INC HL
       LD DE,sprbem
       LD B,5
       CALL bemxor
       JP PRPATU

bemxorP ADD A,L

       LD E,A
       LD B,6

bemxor PUSH HL

       LD A,(DE)
       XOR (HL)
       LD (HL),A
       INC HL,DE
       DJNZ $-5
       POP HL
       RET 

sprbem DB 2,6,4,4,6

      ENDIF 
      IFN savset

suSAVE LD HL,DOSTSPP,(DOSADR),HL

       LD HL,TPTSETU,DE,BUF,BC,12
       PUSH DE
       LDIR 
       LD HL,ink1,C,5
       LDIR 
       LD A,(FRQn),(DE),A
       INC E
       LD A,(joy),(DE),A
       INC E
       LD A,(poion),(DE),A
       INC E
       LD A,(SHOLK),(DE),A
       INC E
       LD A,(playon),(DE),A

SETsec=$+1

       LD DE,#9E00
       PUSH DE
       LD HL,EDORbf
       PUSH HL
       LD BC,#105
       CALL DOS
       POP HL
       LD DE,TPTSETU,B,#C

suSAVCP LD A,(DE)

       CP (HL)
       JNZ suSAVer
       INC HL,DE
       DJNZ suSAVCP
       POP DE,HL
       LD BC,#106
       CALL DOS
       CALL PROK
       CALL OUT6
       LD HL,DOSTEST,(DOSADR),HL
       RET 

suSAVer POP HL,HL

       CALL PRERR
       JR suSAVQ
      ENDIF 

INCPATL LD A,(PATLEN)

       INC A

IPATLQ

       AND 63
       LD (PATLEN),A,C,A
       LD A,(EPAT)
       LD HL,TPATSZ
       ADD A,L
       LD L,A
       LD (HL),C
      CALL prpatl
       JP PRPATU;IPOSPATQ v3+698;PRPAT

DECPATL LD A,(PATLEN)

       DEC A
       JR IPATLQ
     RET 
1

DECOM modCd=modC+255/256*256

       LD HL,TSEARCH
       LD DE,#601
       CALL PRMENU
       LD C,#A
       CALL DOS