pdd.sh - Client TPDD implémenté dans bash

(TPDD client implemented in bash)

Created at: 2021-07-31 19:32:49
Language: Shell
License: GPL-3.0

pdd.sh

Un client TPDD implémenté en pure* bash.

C'est du pur bash à l'exception de ce qui suit :

  • stty
    est nécessaire une fois au démarrage pour configurer le port série.
  • mkfifo
    est utilisé une fois au démarrage
    _sleep()
    sans
    /usr/bin/sleep
    .

C'est ça. Il n'y a pas d'autres commandes ou dépendances externes, pas même de fourches enfants (pas de backticks ou de pipes).

Systèmes d'exploitation pris en charge

N'importe quel Linux, macos/osx, bsd, n'importe quelle architecture.

D'autres Unix comme SCO, Solaris, etc. devraient fonctionner avec seulement des ajustements mineurs (noms de périphériques tty, arguments de ligne de commande stty).

Windows est un problème mais peut fonctionner avec effort.
Ne fonctionne pas dans WSL2 .
Peut-être que cette solution de contournement com2tcp fonctionne. Non testé.
Devrait fonctionner dans WSL1 . Non testé.

Ou peut-être que cela fonctionne enfin dans WSL2 maintenant.
Cette page décrit comment le faire fonctionner en créant un noyau personnalisé, mais indique également que cela n'est plus nécessaire pour le matériel courant. Non testé.

Encore une autre option est que les gens ont signalé que cela fonctionne tant que vous accédez d'abord au port com à partir de Windows, en utilisant n'importe quoi, IE mastic, ouvrez simplement le port une fois en utilisant n'importe quelle application, puis fermez l'application et c'est tout. Non testé.

Installation

git clone git@github.com:bkw777/pdd.sh.git
cd pdd.sh
sudo make install

Usage

pdd [tty_device] [command [args...]] [;commands...]

Sans arguments, il s'exécutera en mode de commande interactif.
Vous obtenez une

TPDD($mode)>
invite où vous pouvez entrer des commandes.
"help" n'en fait toujours pas partie ;) Désolé.

tty_device sera automatiquement détecté dans la plupart des cas.
À défaut, vous obtiendrez une liste à sélectionner.
Ou vous pouvez en spécifier un comme premier argument sur la ligne de commande.

Accès aux fichiers TPDD1/TPDD2

commande arguments la description
statut Signaler l'état du lecteur/disque (de base)
D | condition Signaler l'état du lecteur/disque (plus informatif)
b | banque <0-1> (TPDD2 uniquement) Sélectionner la banque 0 ou 1
affecte list/load/save/del/copy/ren/read_smt
ls | liste | directeur Liste du répertoire
rm | del nom de fichier Supprimer un fichier
cp | copie nom_fichier_src nom_fichier_destination Copier un fichier (sur disque à sur disque)
mv | Ren nom_fichier_src nom_fichier_destination Renommer un fichier
charger nom_fichier_disque [nom_fichier_local] Lire un fichier du disque
enregistrer nom_fichier_local [nom_fichier_disque] Écrire un fichier sur le disque
format Formater le disque avec le format de système de fichiers "operation-mode"

Accès au secteur TPDD1

commande arguments La description
F | ff | fdc_format [0-6] Formatez le disque avec des secteurs logiques de taille <size_code> et sans système de fichiers en "mode de fonctionnement".
codes de taille : 0=64 1=80 2=128 3=256 4=512 5=1024 6=1280 octets par secteur logique. (par défaut 1280 si non spécifié)
R | rl | read_logical [0-79] [1-20] [nom de fichier] Lire un secteur logique à l'adresse : physical(0-79) logical(1-20). Enregistrer sous le nom de fichier s'il est donné, sinon affichage à l'écran.
par défaut physique 0 logique 1
Un | ri | read_id [0-79] [nom de fichier]
Lire le secteur physique par défaut des données d'ID de secteur 0
B | wi | id_écriture [0-79] <ignoré> 12_hex_pairs... Écrivez les données d'identification de secteur de 12 octets.
W | wl | écriture_logique <0-79> <1-20> paires_hexadécimales... Ecrire un secteur logique à l'adresse : physical(0-79) logical(1-20).
rp | read_physical [0-79] [nom de fichier] Lire tous les secteurs logiques d'un secteur physique secteur
physique par défaut 0
écrire dans le nom de fichier sinon s'afficher à l'écran

Accès au secteur TPDD2

commande arguments La description
cache_secteur <piste# 0-79> <secteur# 0-1> <mode 0|2> Copiez un secteur de données entre le cache de secteur du lecteur et le disque.
mode 0 = charger du disque vers le cache
mode 2 = vider le cache vers le disque
read_cache <mode 0|1> <décalage 0-252> <longueur 0-252> Lire <length> octets à <offset> à partir du cache de secteur du lecteur.
mode 0 = données de secteur normales
mode 1 = métadonnées
cache_écriture <mode 0|1> <décalage 0-252> <données...> Écrivez <data...> à <offset> dans le cache du secteur du lecteur.
mode 0 = données de secteur normales
mode 1 = métadonnées

Général/Autre

commande arguments La description
1 | pdd1 Sélectionnez le mode TPDD1
2 | pdd2 Sélectionnez le mode TPDD2
jj | dump_disk [nom de fichier] Lire un disque entier et écrire sur le nom du fichier ou l'afficher à l'écran
rd | restore_disk <nom de fichier> Restaurer un disque à partir du nom de fichier
read_smt Lire la table de gestion de l'espace
(pour TPDD2, lit le SMT de la banque actuellement sélectionnée)
send_loader <nom de fichier> Envoyez un programme BASIC à un "Modèle T".
Utilisez pour installer un client TPDD.
Voir https://github.com/bkw777/dlplus/tree/master/clients
q | quitter | au revoir | sortir Commander une pizza
bauds | la rapidité [9600|19200] Vitesse du port série. La valeur par défaut est 19200.
TPDD1 et TPDD2 fonctionnent à 19200.
FB-100/FDD-19/Purple Computing fonctionnent à 9600
déboguer [#] Debug/Verbose level - Basculer entre 0 et 1, ou définir le niveau spécifié
0 = mode débogage désactivé
1 = mode débogage activé
>1 = plus verbeux
9 = chaque tpdd_read() ou tpdd_write() crée un fichier journal avec une copie des données
pdd1_boot [100|200] Émulez un modèle 100 ou 200 en exécutant la procédure d'amorçage TPDD1.
WIP : le BASIC collecté est bon, le binaire collecté ne l'est pas
pdd2_boot [100|200] Émulez un modèle 100 ou 200 en exécutant la procédure d'amorçage TPDD2.
WIP : le BASIC collecté est bon, le binaire collecté ne l'est pas

Plusieurs commandes peuvent être données à la fois, séparées par ' ; ' pour former une séquence préchargée.

Il existe également un tas de commandes brutes/de débogage de bas niveau qui ne sont pas présentées ici. Voir do_cmd() dans le script.

De plus, certains comportements peuvent être modifiés en définissant des variables d'environnement.

variable évaluer effet
Bauds 9600|19200 Identique à la commande baud ci-dessus
DÉBOGUER # identique à la commande de débogage ci-dessus
FLOPPY_COMPAT vrai|faux (la valeur par défaut est true) Remplir et décompresser automatiquement les noms de fichiers entre la forme naturelle et la forme 6.2 avec espacement rembourré nécessaire pour être compatible avec "Floppy" & "Flopy2". La désactivation vous permet de voir les noms de fichiers réels sur le disque
"A     .BA               "
et vous permet d'utiliser l'intégralité du champ de nom de fichier de 24 octets comme vous le souhaitez.
TPDD_MODEL 1|2 (la valeur par défaut est 1) Supposons que le lecteur TPDD connecté est un TPDD1 ou TPDD2 par défaut

Enfin, le nom par lequel le script est appelé est un autre moyen de choisir entre la compatibilité TPDD1 et TPDD2.

make install
installe le script en tant que
/usr/local/bin/pdd
, et installe également 2 liens symboliques nommés
pdd1
et
pdd2
.
Courir
pdd1 some_command
équivaut à courir
pdd "1;some_command"

Courir
pdd2 some_command
équivaut à courir
pdd "2;some_command"

Exemples

Les mêmes commandes peuvent être données soit sur la ligne de commande, soit à l'invite interactive.
Exemple, pour lister le répertoire, où la commande est :

ls
, peut être utilisé de l'une des manières suivantes :
pdd ls
ou
TPDD(opr)> ls

Copier un fichier du disque

pdd load DOSNEC.CO

Copiez un fichier du disque et enregistrez-le sous un autre nom local

pdd load DOSNEC.CO ts-dos_4.1_nec.co

Copier un fichier sur le disque

pdd save ts-dos_4.1_nec.co DOSNEC.CO

Listes de commandes avec ";"
Supprimer le fichier, répertorier le répertoire En mode interactif :

TPDD(opr)> rm DOSNEC.CO ;ls

En mode non interactif, mettez la liste entre guillemets à cause du " ; "
pdd "rm DOSNEC.CO ;ls"

Copiez un fichier dans la banque 1 d'un disque TPDD2, listez le répertoire de la banque 1
pdd2 "bank 1 ;save ts-dos_4.1_nec.co DOSNEC.CO ;ls"

État du lecteur/disque

$ pdd1 condition
Disk Inserted, Writable

Mode verbeux/débogage

DEBUG=1 pdd ...
ou
TPDD(opr)> debug 1

Enregistrez le trafic brut du port série :
faites en sorte que chaque appel à tpdd_read() ou tpdd_write() crée également un fichier local avec une copie de tout ce qui a été réellement lu ou écrit sur le port série.

DEBUG=9 pdd ...
ou
TPDD(opr)> debug 9

Découvrez la taille du secteur logique d'un disque TPDD1 La
plupart des disques sont formatés avec 20 secteurs logiques de 64 octets par secteur physique, car c'est ce que fait la fonction de formatage du mode de fonctionnement dans le micrologiciel, mais il existe des exceptions. Le disque utilitaire TPDD1 ressemble à un disque normal, mais il est en fait formaté avec 1 secteur logique de 1280 octets par secteur physique. Vous devez le savoir pour utiliser certaines commandes du mode FDC.
La taille du secteur logique avec lequel un disque est formaté peut être vue en exécutant les commandes read_physical, read_logical ou read_id sur n'importe quel secteur.
Le plus rapide est d'exécuter soit

ri
ou
rl
sans arguments :
pdd1 ri
ou
pdd1 rl

Lisez les données d'identification de secteur pour les 80 secteurs physiques (TPDD1)
(en utilisant l'extension du shell bash pour faire quelque chose que le programme ne fournit pas lui-même)

pdd1 ri\ {0..79}\;

Videz un disque TPDD1 entier dans le fichier mydisk.p1h
Suggestion : utilisez *.p1h comme nom de fichier pour les disques TPDD1 au format de vidage hexadécimal

pdd1 dump_disk mydisk.p1h

Videz un disque TPDD2 entier dans le fichier mydisk.p2h
Suggestion : utilisez *.p2h comme nom de fichier pour les disques TPDD2 au format de vidage hexadécimal

pdd2 dump_disk mydisk.p2h

Restaurez un disque TPDD1 entier à partir de mydisk.p1h
(recréez le disque utilitaire TPDD1)

pdd1 restore_disk TPDD1_26-3808_Utility_Disk.p1h

(et voici une belle étiquette)

Restaurez un disque TPDD2 entier à partir de mydisk.p2h
(recréez le disque utilitaire TPDD2)

pdd2 restore_disk TPDD2_26-3814_Utility_Disk.p2h

(et voici une belle étiquette)

Autres fonctions

Envoyer un programme de chargement BASIC à un "Modèle T"
Cette fonction n'est pas utilisée avec un lecteur TPDD mais avec un ordinateur "Modèle T" comme un TRS-80 Modèle 100, généralement pour installer un client TPDD comme TS-DOS, TEENY, ou DSKMGR.

pdd send_loader TS-DOS.100

Vous pouvez trouver une collection de chargeurs de clients TPDD sur https://github.com/bkw777/dlplus/tree/master/clients

Références

http://tandy.wiki/TPDD
https://archive.org/details/TandyPortableDiskDriveSoftwareManual26-3808s/ ( copie locale )
http://www.bitchin100.com/wiki/index.php?title=Base_Protocol
http:// www.bitchin100.com/wiki/index.php?title=Desklink/TS-DOS_Directory_Access
http://www.bitchin100.com/wiki/index.php?title=TPDD-2_Sector_Access_Protocol
https://www.ordersomewherechaos.com/ rosso/fetish/m102/web100/docs/pdd2-sector-0.html
https://www.ordersomewherechaos.com/rosso/fetish/m102/web100/docs/pdd-sector-access.html
https://trs80stuff. net/tpdd/tpdd2_boot_disk_backup_log_hex.txt