software/playzxm: added `Makefile`

This commit is contained in:
Ivan Tatarinov 2021-06-13 14:05:31 +03:00
parent f609ab195a
commit f268ce3244
4 changed files with 402 additions and 267 deletions

View File

@ -34,7 +34,8 @@ SUBDIRS=\
joyconf\
keymap\
loadpzx\
playrmov
playrmov\
playzxm
.PHONY: all
all: build

5
software/playzxm/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: 2021 Ivan Tatarinov <ivan-tat@ya.ru>
#
# SPDX-License-Identifier: CC0-1.0
build

84
software/playzxm/Makefile Normal file
View File

@ -0,0 +1,84 @@
# SPDX-FileCopyrightText: 2021 Ivan Tatarinov <ivan-tat@ya.ru>
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
# Supported environments:
# * GNU on Linux, FreeBSD etc.
# * GNU on Windows NT (using MinGW/MSYS/Cygwin/WSL)
#
# Build:
# make [<TARGET> ...]
# Install / Uninstall:
# make [prefix=<PREFIX>] install | uninstall
# Clean:
# make clean | distclean
#
# where:
# <TARGET> is one of values for `BINS' variable prefixed with "build/"
# (see target `all' below).
# <PREFIX> is a prefix directory to install files into.
include ../../sdk/common.mk
srcdir = .
# Use uppercase for FAT filesystem
prefix ?= .
exec_prefix ?= $(prefix)
bindir ?= $(exec_prefix)/BIN
INSTALL ?= install
INSTALL_PROGRAM ?= $(INSTALL)
RM = rm -f
INCLUDEDIR = ../../sdk/include
AS = sjasmplus
ifeq ($(USE_SJASMPLUS_VERSION),sjasmplus)
AFLAGS = --nobanner
else ifeq ($(USE_SJASMPLUS_VERSION),z00m128)
AFLAGS = --nologo
else
AFLAGS =
endif
AFLAGS += -I$(INCLUDEDIR)
BINS=\
PLAYZXM
.PHONY: all
all: $(foreach t,$(BINS),build/$(t))
build\
$(DESTDIR)$(bindir):
mkdir -p $@
build/PLAYZXM: $(srcdir)/playzxm.asm\
$(INCLUDEDIR)/zxuno.def\
$(INCLUDEDIR)/esxdos.def\
$(INCLUDEDIR)/regs.mac\
$(INCLUDEDIR)/filezxm.def\
| build
$(AS) $(AFLAGS) --raw=$@ $<
# $1 = target
# No need in execution mode for FAT filesystem
define install_bin_rule =
$$(DESTDIR)$$(bindir)/$1: build/$1 | $$(DESTDIR)$$(bindir)
$$(INSTALL_PROGRAM) -m 644 $$< $$@
endef
$(foreach t,$(BINS),$(eval $(call install_bin_rule,$(t))))
.PHONY: install
install: $(foreach t,$(BINS),$(DESTDIR)$(bindir)/$(t))
.PHONY: uninstall
uninstall:
$(RM) $(foreach t,$(BINS),$(DESTDIR)$(bindir)/$(t))
.PHONY: clean
clean:
rm -f $(foreach t,$(BINS),build/$(t))
.PHONY: distclean
distclean:
rm -rf build

View File

@ -1,266 +1,311 @@
; API de ESXDOS.
include "esxdos.inc"
include "errors.inc"
; playzxm - a command for ESXDOS 0.8.5 that allows to play videos in ZXM
; format in Black&White and Color.
;
; Copyright (C) 2016-2021 Antonio Villena
; Contributors:
; 2021 Ivan Tatarinov <ivan-tat@ya.ru>
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, version 3.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
;
; SPDX-FileCopyrightText: Copyright (C) 2016-2021 Antonio Villena
;
; SPDX-FileContributor: 2021 Ivan Tatarinov <ivan-tat@ya.ru>
;
; SPDX-License-Identifier: GPL-3.0-only
; PLAYZXM : un comando para ESXDOS 0.8.5 que permite reproducir videos en formato
; ZXM en blanco y negro y color.
; Compatible compilers:
; SJAsmPlus, <https://github.com/sjasmplus/sjasmplus/>
; Video: cabecera + secuencia lineal de frames.
; Cabecera (256 bytes):
; Offset Contenido
; 0 'Z'
; 1 'X'
; 2 'M'
; 16-17 Numero de frames que tiene el video (no usado en esta rutina)
; 18 Numero de sectores (de 512 bytes) que ocupa cada frame: 12 para BW, 14 para color
; Resto de posiciones: reservado
define PROGRAM "playzxm"
define VERSION "0.1"
define DESCRIPTION "Plays a video file encoded in", 13, "ZXM (colour/BW) format."
define COPYRIGHT 127, " 2016-2021 Antonio Villena"
define LICENSE "License: GNU GPL 3.0"
; Cada frame: en blanco y negro, 6144 bytes en formato pantalla de Spectrum. Un pixel a 1 se muestra en negro. A 0, en blanco.
; en color, 256 bytes de relleno + 6912 bytes en formato pantalla de Spectrum
; NOTA: el relleno es simplemente para que cada frame ocupe un número entero de sectores. El relleno se pone a 0
; o a lo que se quiera, ya que no se hace nada con él.
include "zxuno.def"
include "esxdos.def"
include "regs.mac"
include "filezxm.def"
BORDERCLR: equ 23624
PAPERCOLOR: equ 23693
BANKM: equ $7ffd
STACK_TOP: equ $3dea ; Value suggested by Miguel Ângelo to
; put the stack in the command area
ScreenAddr: equ $4000
FileBuffer: equ $8000
;Para ensamblar con PASMO como archivo binario (no TAP)
org $2000 ; entry point of ESXDOS program
BORDERCLR equ 23624
PAPERCOLOR equ 23693
BANKM equ 7ffdh
PILA equ 3deah ;valor sugerido por Miguel Ângelo para poner la pila en el área de comando
;-----------------------------------------------------------------------------
; Subroutine
; In: HL = pointer to the command line arguments string (ASCIIZ)
org 2000h ;comienzo de la ejecución de los comandos ESXDOS.
Main:
ld a,h
or l
jr nz, Init ; If no filename specified, show usage
; jr ShowUsage ; No need, it follows
Main proc
ld a,h
or l
jr z,PrintUso ;si no se ha especificado nombre de fichero, imprimir uso
call RecogerNFile
;-----------------------------------------------------------------------------
; Subroutine
di
ld (BackupSP),sp
ld sp,PILA
ei
call PlayFichero
push af
call Cls
pop af
ld sp,(BackupSP)
ret
ShowUsage: ld hl, aUsage
; jr Print ; No need, it follows
PrintUso ld hl,Uso
BucPrintMsg ld a,(hl)
or a
ret z
rst 10h
inc hl
jr BucPrintMsg
endp
;-----------------------------------------------------------------------------
; Subroutine
; In: HL = pointer to an ASCIIZ string
Print: ld a, (hl)
or a
ret z
rst $10
inc hl
jr Print
RecogerNFile proc ;HL apunta a los argumentos (nombre del fichero)
ld de,BufferNFich
CheckCaracter ld a,(hl)
or a
jr z,FinRecoger
cp " "
jr z,FinRecoger
cp ":"
jr z,FinRecoger
cp 13
jr z,FinRecoger
ldi
jr CheckCaracter
FinRecoger xor a
ld (de),a
inc de ;DE queda apuntando al buffer este que se necesita en OPEN, no sé pa qué.
ret
endp
;-----------------------------------------------------------------------------
; Subroutine
; In: HL = pointer to the command line arguments string (ASCIIZ)
Init:
ld de, FileName
; call GetFileName ; inline
PlayFichero proc
xor a
rst 08h
db M_GETSETDRV ;A = unidad actual
ld b,FA_READ ;B = modo de apertura
ld hl,BufferNFich ;HL = Puntero al nombre del fichero (ASCIIZ)
rst 08h
db F_OPEN
ret c ;Volver si hay error
ld (FHandle),a
;-----------------------------------------------------------------------------
; Subroutine
; In: HL = pointer to the command line arguments (filename)
; DE = pointer to the output ASCIIZ string (filename)
; Out: DE = pointer to terminating 0 character of output string
call SetupVideoMemory
call ReadHeader
jr c,FinPlay
.GetFileName: ld a, (hl)
or a
jr z, .End
cp " "
jr z, .End
cp ":"
jr z, .End
cp 13
jr z, .End
ldi
jr .GetFileName
.End: xor a
ld (de),a
; ret ; skipped
BucPlayVideo ld hl,(StartScreen)
ld bc,(LFrame)
ld a,(FHandle)
rst 08h
db F_READ
jr c,FinPlay ;si error, fin de lectura
ld a,b
or c
jr z,FinPlay ;si no hay más que leer, fin de lectura
; continue Init()
inc de ; DE remains pointing to the buffer that is
; needed in OPEN, I don't know what for
di
ld (BackupSP), sp
ld sp, STACK_TOP
ei
call SwitchScreens
ld bc,7ffeh
in a,(c) ;Detectar si se ha pulsado SPACE
and 1
jr z,FinPlay
call PlayFile
push af
call Cls
pop af
ld sp, (BackupSP)
ret
jr BucPlayVideo
;-----------------------------------------------------------------------------
; Subroutine
FinPlay ld a,(FHandle)
rst 08h
db F_CLOSE
PlayFile: ld_a 0
esxdos M_GETSETDRV ; A = current drive
ld b, FA_READ ; B = file open mode
ld hl, FileName ; HL = pointer to file name (ASCIIZ)
esxdos F_OPEN
ret c ; Return on error
ld (FileHandle), a
call RestoreVideoMemory
call SetupVideoMemory
or a ;Volver sin errores a ESXDOS
ret
endp
call ReadHeader
jr c, .Stop ; Stop on error
.Loop: ld hl, (StartScreen)
ld bc, (FrameLength)
ld a, (FileHandle)
esxdos F_READ
jr c, .Stop ; Stop on error
ld a, b
or c
jr z, .Stop ; Stop on end of data
ReadHeader proc
ld a,(FHandle)
ld bc,256
ld hl,32768
rst 08h
db F_READ
ret c
call SwitchScreens
ld bc, $7ffe
in a, (c) ; Detect if SPACE pressed
and %00000001
jr nz, .Loop
ld hl,32768
ld a,'Z'
cpi
jr nz,NoZXM
ld a,'X'
cpi
jr nz,NoZXM
ld a,'M'
cpi
jr nz,NoZXM
.Stop: ld a, (FileHandle)
esxdos F_CLOSE
ld hl,32768+18
ld a,(hl)
add a,a
ld b,a
ld c,0
ld (LFrame),bc
call RestoreVideoMemory
ld bc,49152 ;Principio buffer pantalla para BW
ld (StartScreen),bc
ld a,(hl)
cp 12 ;B/W ?
jr z,ZXMOk
or a ; Return to ESXDOS without errors (CY=0)
ret
ld bc,49152-256 ;Principio buffer pantalla para color
ld (StartScreen),bc
;-----------------------------------------------------------------------------
; Subroutine
ZXMOk or a
ret
ReadHeader: ld a, (FileHandle)
ld bc, file_zxm_header_t
ld hl, FileBuffer
esxdos F_READ
ret c ; Return on error
NoZXM scf
ret
endp
ld hl, FileBuffer + file_zxm_header_t.a_magic
ld a, 'Z'
cpi
jr nz, BadFormat
ld a, 'X'
cpi
jr nz, BadFormat
ld a, 'M'
cpi
jr nz, BadFormat
assume_hl FileBuffer + file_zxm_header_t.a_reserved_0
chg_hl FileBuffer + file_zxm_header_t.b_sectors_per_frame
ld a, (hl)
add a, a ; BC = b_sectors_per_frame * 512
ld b, a ;
undef_b ;
ld_c 0 ;
ld (FrameLength), bc
SetupVideoMemory proc
di
ld bc,BANKM
ld a,00010111b ;banco 7, pantalla normal, ROM 3
ld (Banco),a
out (c),a
chg_bc $c000 ; Screen buffer for BW
ld (StartScreen), bc
ld a, (hl) ; A = b_sectors_per_frame
cp 12 ; B/W ?
jr z, ReadOK
ld hl,0c000h + 6144
ld de,04000h + 6144
ld bc,768
SetAttr ld a,64+56
ld (hl),a
ld (de),a
inc hl
inc de
dec bc
ld a,b
or c
jr nz,SetAttr
chg_bc $c000 - 256 ; Screen buffer for color
ld (StartScreen), bc
xor a
ld bc,0fc3bh
out (c),a
inc b
in a,(c)
ld (BackupConfig),a
or 20h
out (c),a
ReadOK: or a ; Success
ret
xor a
out (254),a
BadFormat: scf ; Error
ret
ei
ret
endp
;-----------------------------------------------------------------------------
; Subroutine
SetupVideoMemory:
di
ld_bc BANKM
ld_a %00010111 ; Bank 7, normal display, ROM 3
ld (Bank), a
out (c), a
RestoreVideoMemory proc
di
xor a
ld bc,0fc3bh
out (c),a
inc b
ld a,(BackupConfig)
out (c),a
ld hl, $c000 + 6144
ld de, ScreenAddr + 6144
chg_bc 768
.Loop: ld a, 64+56
ld (hl), a
ld (de), a
inc hl
inc de
dec bc
ld a, b
or c
jr nz, .Loop
assume_a 0
assume_bc 0
ld bc,BANKM
ld a,00010000b ;banco 0, pantalla normal, ROM 3
out (c),a
ei
ret
endp
chg_bc zxuno_port
chg_a 0
out (c), a
chg_bc zxuno_data
in a, (c)
undef_a
ld (BackupConfig), a
or %00100000
out (c), a
chg_a 0
out (254), a
SwitchScreens proc
halt
ld a,(Banco)
xor 00001010b ;conmutamos de la pantalla normal a la shadow y de la 7 a la 5
ld (Banco),a
ld bc,BANKM
out (c),a
ret
endp
ei
ret
;-----------------------------------------------------------------------------
; Subroutine
Cls proc
ld a,(BORDERCLR)
sra a
sra a
sra a
and 7
out (254),a
ld hl,16384
ld de,16385
ld bc,6143
ld (hl),l
ldir
inc hl
inc de
ld bc,767
ld a,(PAPERCOLOR)
ld (hl),a
ldir
ret
endp
RestoreVideoMemory:
di
ld_bc zxuno_port
ld_a 0
out (c), a
chg_bc zxuno_data
ld a, (BackupConfig)
undef_a
out (c), a
chg_bc BANKM
chg_a %00010000 ; Bank 0, normal display, ROM 3
out (c), a
ei
ret
;-----------------------------------------------------------------------------
; Subroutine
; 01234567890123456789012345678901
Uso db " playzxm moviefile.zxm",13,13
db "Plays a video file encoded in",13
db "ZXM (colour/BW) format.",13,0
SwitchScreens:
halt
ld a, (Bank)
xor %00001010 ; Switch from the normal screen to the
ld (Bank), a ; shadow screen and from 7 to 5
ld_bc BANKM
out (c), a
ret
FHandle db 0
Banco db 0
BackupSP dw 0
BackupConfig db 0
StartScreen dw 0
LFrame dw 0
;-----------------------------------------------------------------------------
; Subroutine
BufferNFich equ $ ;resto de la RAM para el nombre del fichero
Cls: ld a,(BORDERCLR)
.3 sra a
and %00000111
out (254), a
ld hl, ScreenAddr ; L = 0
ld de, ScreenAddr+1
ld bc, 6144-1
ld (hl), l
ldir
assume_bc 0
inc hl
inc de
chg_bc 768-1
ld a, (PAPERCOLOR)
ld (hl), a
ldir
ret
; 01234567890123456789012345678901
aUsage: db PROGRAM, " version ", VERSION, 13
db DESCRIPTION, 13
db COPYRIGHT, 13
db LICENSE, 13
db 13
db "Usage:", 13
db " .", PROGRAM, " moviefile.zxm", 13, 0
FileHandle: db 0
Bank: db 0
BackupSP: dw 0
BackupConfig: db 0
StartScreen: dw 0
FrameLength: dw 0
FileName: ; Rest of RAM for filename