;z80 ;zx-spectrum ;assembler ;Исходник плеера для видеофайлов. ;Поддержка форматов вплоть до версии 7. ;(C) Vitamin/CAIG/2001 9.22.04 ;Пример вызова: ; LD HL,DRIVER ;установка драйвера. Допустимые значения ; CALL SETDRIVER ;PENT128,PENT512,SCORP256,PROFI,ATM ; CALL PLAY ;воспроизведение ; JR C,BREAK ;был нажат пробел ; ... ;не был ; ;BREAK ... ; CONT EQU 254 ;служебные константы COMAND EQU 255 BMODE EQU 0 ;биты режимов DMODE EQU 1 EXTPCK EQU 2 EXCMODE EQU 3 EXCFIN EQU 4 EX_ENDSTR EQU -1 ;"короткие" команды EX_NEWFRM EQU %00011111 EX_KEYFRM EQU %00111111 VIDEO EQU 49152 ;адрес распложения видео FIRST1 EQU 16384 ;адрес экрана FSTATR EQU 22528 MAXSCR EQU 'FIRST1+#18 SPEDE EQU 4 ;задержка между кадрами MACRO IDE INC E CALL Z,R_DE ENDM ; ORG START START PLAY LD (STAKP+1),SP LD IX,PLFLG XOR A LD (CURPAG),A LD (IX),A CALL PAGE LD DE,VIDEO NEWKAD EXX LD HL,FSTATR SET EXCFIN,(IX) EXX LD HL,FIRST1 LD C,0 PLCYC BIT EXTPCK,(IX) JP NZ,EXTP_STRM LD A,(DE) IDE CP COMAND JR NZ,NOCOM EX_COMM LD A,(DE) IDE DEC A JP Z,WAIT DEC A RET Z DEC A JR NZ,NCHS LD A,(DE) LD (WAIT+1),A IDE JR PLCYC NCHS DEC A JP Z,SCRENE DEC A JR NZ,LGRP LD A,(DE) IDE LD C,A C_GROUP LD B,8 PTS1 LD A,(DE) LD (HL),A IDE INC H DJNZ PTS1 INC L JR Z,M7 LD A,H SUB 8 LD H,A M7 DEC C JR NZ,C_GROUP JR PLCYC LGRP DEC A JP NZ,LNOGR LD A,(DE) IDE LD C,A ;QUANTITY CALL DEP_ZN_ JR PLCYC LNOGR DEC A JP Z,LSCRENE DEC A JR NZ,NOBMOD SET BMODE,(IX) JR PLCYC NOBMOD LD A,(DE) IDE RRA JR NC,NODPK SET DMODE,(IX) NODPK RRA JR NC,PLCYC SET EXTPCK,(IX) RRA JP NC,PLCYC SET EXCMODE,(IX) JP PLCYC NOCOM CP CONT JR NZ,NOCNT ADD A,L LD L,A JP NC,PLCYC LD A,H ADD A,8 LD H,A JP PLCYC NOCNT ADD A,L LD L,A JR NC,M8 LD A,H ADD A,8 LD H,A M8 BIT BMODE,(IX) JR Z,OLDZZ LD C,1 CALL DEP_ZN_ JP PLCYC OLDZZ LD B,#08 PUTES LD A,(DE) LD (HL),A IDE INC H DJNZ PUTES INC L JP Z,PLCYC LD A,H SUB 8 LD H,A JP PLCYC WAIT LD A,SPEDE W_LOOP HALT DEC A JR NZ,W_LOOP ESCR LD A,127 IN A,(254) RRA JP C,NEWKAD STAKP LD SP,0 SCF RET ;-------EXTPACK STREAM PROCESSING ------- EXTP_STRM LD A,(DE) IDE CP -1 RET Z CP EX_NEWFRM JR Z,WAIT CP EX_KEYFRM JR Z,EX_KEYF JR NZ,EX_CDEPC EX_KEYF ;... JP LSCRENE ;------------------ EX_CDEPC LD C,A ;MASK1 LD B,8 EX_DPCK RR C JR C,EX_OFFS PUSH BC LD A,(DE) IDE LD C,A XOR A LD B,A ;OLDB EX AF,AF' EX_DBPC RR C JR NC,EX_NOB1 LD A,(DE) IDE LD B,A EX_NOB1 EX AF,AF' XOR B LD (HL),A EX AF,AF' INC H LD A,H AND 7 JR NZ,EX_DBPC INC L JR Z,EX_NOSH LD A,H SUB 8 LD H,A EX_NOSH POP BC EX_CONC DJNZ EX_DPCK CALL EX_CMODE JP EXTP_STRM EX_OFFS LD A,(DE) IDE AND A JR Z,EX_FCOLR ADD A,L LD L,A JR NC,EX_CONC LD A,H ADD A,8 LD H,A JR EX_CONC EX_FCOLR CALL EX_CMODE JR NZ,EX_FCOLR JP EXTP_STRM EX_CMODE BIT EXCMODE,(IX) RET Z BIT EXCFIN,(IX) RET Z LD A,(DE) IDE LD C,A ;MASK LD B,8 ;DATA EX_CDPC RR C JR C,EX_COFS LD A,(DE) AND 63 EXX LD (HL),A INC HL EXX LD A,(DE) IDE RLA JR NC,EX_CNS RES EXCFIN,(IX) AND 128 RET EX_CNS DJNZ EX_CDPC LD A,-1 AND A RET EX_COFS LD A,(DE) IDE EXX ADD A,L LD L,A ADC A,H SUB L LD H,A EXX JR EX_CNS SCRENE LD HL,FIRST1 LD A,(DE) LD C,A IDE PCK_CYC LD A,(DE) CP C JR Z,REPT LD B,8 PGR LD A,(DE) LD (HL),A INC H IDE DJNZ PGR INC L JR Z,M5 LD A,H SUB 8 LD H,A M5 LD A,H CP MAXSCR JR C,PCK_CYC JR NEWK REPT IDE LD A,C EX AF,AF' LD A,(DE) LD C,A IDE LD B,8 PUSH HL COZN LD A,(DE) LD (HL),A IDE INC H DJNZ COZN INC L JR Z,NDP1 LD A,H SUB 8 LD H,A NDP1 DEC C JR NZ,CONDP POP BC JR ISEND CONDP EX DE,HL ;HL-ADRESS DE-SCREEN+1 EX (SP),HL ;HL-SCREEN DE-SCREEN+1 EX DE,HL ;DE-SCREEN HL-SCREEN+1 DEPCYC LD B,8 PUSH DE COZN1 LD A,(DE) LD (HL),A INC H INC D DJNZ COZN1 INC L JR Z,NDP2 LD A,H SUB 8 LD H,A NDP2 POP DE LD A,H CP MAXSCR JR C,CONPKC POP DE JR NEWK CONPKC DEC C JR NZ,DEPCYC POP DE ISEND EX AF,AF' LD C,A LD A,H CP MAXSCR JR C,PCK_CYC NEWK LD A,(WAIT+1) SUB 2 JP C,ESCR JP Z,ESCR JP W_LOOP LSCRENE LD HL,FIRST1 EXX LD HL,FSTATR ;ADR EXX LPCK_CYC LD A,(DE) IDE INC A JR Z,NEWK DEC A JR NZ,LREPT LD A,(DE) IDE LD C,A BIT EXCMODE,(IX) JR Z,NOCO1 DEPSCC PUSH BC LD C,1 CALL DEP_ZN CALL DEPCOL POP BC DEC C JR NZ,DEPSCC JP LPCK_CYC NOCO1 CALL DEP_ZN JR LPCK_CYC LREPT LD A,(DE) LD C,A IDE PUSH HL PUSH BC LD C,1 CALL DEP_ZN CALL DEP_COL_ POP BC DEC C JR NZ,CONPA POP AF JR LPCK_CYC CONPA EX DE,HL ;HL-ADRESS DE-SCREEN+1 EX (SP),HL ;HL-SCREEN DE-SCREEN+1 EX DE,HL ;DE-SCREEN HL-SCREEN+1 LDEPCYC LD B,8 PUSH DE LCOZN1 LD A,(DE) LD (HL),A INC H INC D DJNZ LCOZN1 INC L JR Z,LNDP2 LD A,H SUB 8 LD H,A LNDP2 POP DE BIT EXCMODE,(IX) JR Z,LCONPKC LD A,L AND 31 JR NZ,LCONPKC EX DE,HL ;ZZZZ EX (SP),HL EX DE,HL CALL DEPCLA EX DE,HL EX (SP),HL EX DE,HL LCONPKC DEC C JR NZ,LDEPCYC LISEND POP DE JR LPCK_CYC DEP_COL_ BIT EXCMODE,(IX) RET Z DEPCOL LD A,L AND 31 RET NZ DEPCLA EXX LD E,0 EXX DPCC1 LD A,(DE) IDE EXX LD C,A LD B,8 DPCC RR C JR NC,OLDCOL EXX LD A,(DE) IDE EXX LD E,A OLDCOL LD (HL),E INC HL DJNZ DPCC LD A,L EXX AND 31 JR NZ,DPCC1 RET INCHL INC H LD A,H AND 7 RET NZ INC L RET Z LD A,H SUB 8 LD H,A RET INCDE1 INC D LD A,D AND 7 RET NZ INC E RET Z LD A,D SUB 8 LD D,A RET R_DE INC D RET NZ SWPAG LD D,192 PUSH AF LD A,(CURPAG) INC A LD (CURPAG),A CALL PAGE POP AF RET DEP_ZN_ DPMODE LD A,0 AND #AE ;XOR (HL) LD (XORHL),A DEP_ZN MAKALL PUSH BC LD A,(DE) IDE LD B,A ;MASK XOR A LD C,A ;PREWDAT LD (OLBYT+1),A MAKGR RR B JR NC,OLBYT LD A,(DE) IDE LD (OLBYT+1),A OLBYT LD A,0 XOR C LD C,A XORHL NOP LD (HL),A INC H LD A,H AND 7 JR NZ,MAKGR INC L JR Z,M7_ LD A,H SUB 8 LD H,A M7_ POP BC DEC C JR NZ,MAKALL XOR A LD (XORHL),A RET PLFLG DB 0 CURPAG DB 0 SETDRIVER ;HL-DRIVER LD (PP1+1),HL RET PAGE PUSH BC ;переключатель страниц LD (CURPAG),A CP 2 JR C,PP1 CP 4 JR C,PP2 INC A PP2 INC A PP1 JP PENT128 PENT512 LD C,A AND 24 RLA RLA RLA LD B,A LD A,C AND 7 OR B JR PENT128+2 PENT128 AND 7 OR 16 OUTR LD BC,32765 OUT (C),A POP BC RET SCORP256 LD (S1+1),A AND 8 RLA LD BC,#1FFD S2 OUT (C),A S1 LD A,0 AND 7 OR 16 LD B,#7F JR OUTR+3 PROFI LD (S1+1),A AND 56 RRCA RRCA RRCA LD BC,#DFFD JR S2 ATM LD (S1+1),A AND 24 RRCA RRCA RRCA LD BC,#FDFD JR S2 DISPLAY "SIZE:",$-START