(click for English)
hawk.ro / stories / Snoopy, HC-91 & Robotron

Snoopy, HC-91 & Robotron

Imprimanta

Unul din obiectele interesante din colectia mea este o veche imprimanta matriciala RDG-ista, Robotron K 6313. Imi place ca are un adaptor care permite utilizarea unui ribon pe rola (ca la masina de scris) in locul unui cartus dedicat. Asta inseamna ca se poate folosi cam orice ribon (cata vreme are latimea potrivita) cu doar putin efort. Mai mult, pe una din role chiar este incarcat un astfel de ribon si este inca utilizabil (dupa ani si ani).

robusta si aratoasa

Interfata de comunicatie poate fi inlocuita si are optiuni pentru comunicatie paralela, seriala (V24), seriala (bucla de curent) si altele. Singura interfata pe care o am este cea seriala V24 dar cu un conector atipic, iar manualul prezinta doar conectorul standard DB-25. Spre surprinderea mea, exista un site, www.robotrontechnik.de dedicat produselor firmei Robotron pe care am gasit toate informatiile necesare. Multumiri pasionatilor! Odata construit adaptorul, imprimanta functioneaza fara nicio problema.

Si partenerul ei

In afara de BASIC, acest HC ruleaza si CP/M

Desi imprimanta poate functiona foarte bine cu un computer contemporan, parca nu se potriveste. Imi amintesc ca in copilarie am vazut o imprimanta similara folosita impreuna cu un HC-90 (asemanator cu HC-91 din colectia mea) si cred ca le-ar sta bine impreuna. Venind din lumi si epoci similare, au o istorie comuna. De fapt, manualul pentru Interfata 1 de la HC mentioneaza acest model de imprimanta (incluzand chiar si o schema de conectare pentru acel adaptor atipic!) Desigur, in ciuda conectorului DB-9, pinii IF-1 sunt si ei atipici. Descrierea din manual este la randu-i putin "pe dos":

Descrierea originala din manualul IF-1
1	- CTS (iesire)
2	- DTR (intrare)
3	- RxD (iesire)
4	- TxD (intrare)
5	- N/C
6-9	- GND

Descrierea mea bazata pe manualul IF-1
1	- RTS (iesire)
2	- DSR (intrare)
3	- TxD (iesire)
4	- RxD (intrare)
5	- N/C
6-9	- GND
Conectorul serial de la IF-1 pt. HC-91 (DB-9 mama). Pinul de transmisie este marcat RxD, iar receptia TxD.
La fel si la semnalele de control.

Inca niste lipituri si am un cablu cu trei conectori, tata DB-9 pentru HC, alt conector tata DB-9 cu pinii standard de computer, cu liniile de control RTS/CTS (pentru interfatare cu un PC contemporan) si inca un conector DB-25 tata, folosind liniile de control DSR/DTR, pentru imprimanta.1 Desigur cablul este gandit sa fie utilizat cu un conector "in aer" (adica poate fi conectat fie intre HC si PC, sau intre HC si imprimanta)

Ce sa tiparesc?

Amintirile mele din copilarie includ si un editor - Tasword - ce cred ca era folosit la Palatul Pionierilor/Copiilor pentru a tipari diverse materiale pentru cercul de informatica. Primul impuls a fost sa folosesc Tasword pentru a crea si a tipari un simplu document. Desi oarecum tentant, nu mi s-a parut chiar cea mai buna abordare, nu vreau sa reduc computerul la un simplu procesor de text. Trebuie sa genereze ceva. Si raspunsul a fost... SNOOPY!

Programul care genereaza calendarul cu Snoopy (SNPCAL2) este scris in FORTRAN deci trebuie ori sa il rescriu, ori sa gasesc o modalitate de a-l rula pe HC. Am reusit sa gasesc 3 compilatoare cu documentatie:

Primul dintre acestea a fost oarecum neasteptat dar de vreme ce exista si compilator de C pentru Spectrum, poate nu trebuia sa ma mir. Din pacate SNPCAL se bazeaza prea mult pe operatii de intrare/iesire, pentru un compilator fara optiune de lucru cu discul. Raman doar cele 2 optiuni sub CP/M.

Nevada FORTRAN

De fapt am inceput cu F80, dar dupa tot felul de probleme am incercat si Nevada FORTRAN, cu care am avut mai mult succes. Dupa niste mesaje de eroare la compilare "label not found" si "improperly nested DO", am realizat ca trebuie configurat pentru a folosi tabele mai mari pentru simboluri si etichete (rulat CONFIG.COM si am ales 100 in loc de 50 cat era implicit). In plus, imi place ca are o functie LOPEN care converteste (la scriere) codurile de imprimanta din ASA in ASCII.3

Inca o problema, cu imaginile: fiecare linie este deplasata cu un caracter la dreapta. Cum primul caracter din rand are o insemnatate speciala (caracter de control ASA), efectul este destul de vizibil. Cercetand mai in amanunt subrutina SNPPIC am gasit cauza: in varianta originala ar trebui ca la primul caracter programul sa treaca peste o bucla DO fara sa o execute pentru ca valoarea de sfarsit este mai mare decat cea de inceput a buclei. Totusi, Nevada FORTRAN executa orice bucla DO cel putin o data. Pagina 37 din manual specifica:

Irrespective of the relation of the initial and ending values, the DO will always be executed once.
Indiferent de relatia intre valorile de inceput si de sfarsit, DO va fi executata intotdeauna o data
Manualul Nevada FORTRAN, sublinierea in original
Odata modificat SNPPIC, totul pare sa functioneze, dar extrem de lent. Dupa ce am renuntat la fisierul de iesire (trimitand direct la imprimanta) viteza de executie a crescut putin, de la insuportabil la destul de lent. Prin destul de lent inteleg ca in general imprimanta astepta dupa calculator in loc sa fie invers.

O diversiune

Multumit ca aveam ceva functional, am vrut mai mult. In arhiva ibiblio unde a fost gasita varianta "originala" de SNPCAL, mai este un program care genereaza imagine si calendar cu Snoopy, numit PICKET si care pare sa se potriveasca mai bine cu prezentarea mea, daca reusesc sa il fac sa ruleze. Din pacate PICKET foloseste instructiunea EQUIVALENCE iar Nevada nu o implementeaza. Asta m-a determinat sa ma intorc la F80.

O scena POV-Ray cu FORTRAN si Snoopy care m-a inspirat
(de la https://web.archive.org/web/20060116042558/http://www.travelnotes.de/rays/fortran/fortran.htm
via virtuallyfun.com)

Microsoft F80

Primele probleme cu F80 si SNPCAL au fost ca instructiunea DIMENSION nu se poate intinde pe mai multe linii iar CALL OPEN necesita ca numele si extensia fisierului sa fie alipite, fara punct si cu spatii adaugate pentru a avea exact 11 caractere:

C     Varianta care nu functioneaza cu Microsoft F80:
      CALL OPEN(6,'SNPCAL.DAT',0)
 
C     Numele trebuie sa arate asa:
      CALL OPEN(6,'SNPCAL  DAT',0)
De asemenea numerele de unitate logica -LUN- (6 din exemplul de mai sus) trebuie sa fie cuprinse intre 6 si 10.

Manualul mentioneaza ca LUN-urile 1,3,4,5 sunt preasignate la consola iar LUN 2 este preasignat la imprimanta. Nu imi este clar daca se pot reasigna dar pentru acest program ajung 2. De fapt scrierea in fisier nu este posibila in acest caz pentru ca pare sa fie limitata la inregistrari de 128 de octeti (spre deosebire de imprimanta si consola unde se pot trimite inregistrari de pana la 132 octeti). A si apropos, DO nu poate folosi valori din matrici, deci a trebuit introdusa o variabila temporara.

Incercand PICKET am constatat ca F80 implementeaza instructiunea EQUIVALENCE, desi e pretentios cu privire la pozitionarea acesteia. De asemenea ENCODE nu poate scrie decat la inceputul unei matrici (rezolvat cu o matrice temporara). Problema principala insa, era ca datele din fisier nu pareau a fi citite corect. Ar trebui sa mentionez ca atat PICKET cat si SNPCAL folosesc anumite artificii, in sensul ca citesc caractere ASCII in matrici multidimensionale de tip REAL si INTEGER. Dupa mai multe experimente am determinat ca majoritatea problemelor pot fi solutionate modificand instructiunile FORMAT care specifica formatul datelor citite din fisier. Cred ca functiile de intrare/iesire ale F80 folosesc doar caracterul CR pentru a separa inregistrarile din fisiere si in acest caz caracterul LF care urmeaza (CP/M foloseste CR+LF pentru separat randurile in fisiere text) este citit in matrice. Adaugand "1X," la inceputul fiecarui FORMAT folosit la citire am rezolvat problema.

Au mai fost cateva probleme minore legate de randurile de 136 de caractere folosite de PICKET (atat F80 cat si imprimanta sunt limitate la 132), limitarea F80 pentru 2 nivele de paranteze la instructiunea FORMAT si alte maruntisuri. De asemenea am mai rafinat putin fonturile, am modificat calendarul sa inceapa cu ziua de Luni, am adaugat optiuni pentru a alege limba si dispozitivul de iesire (TTY/LST) la rulare. Versiunile modificare ale programelor sunt disponibile putin mai jos.

De asemenea, F80 converteste automat caracterele de control ASA in ASCII (cel putin cand iesirea este la imprimanta sau consola). Odata PICKET functional, avand mai multa experienta, am reusit sa adaptez si SNPCAL la F80. Iar cand l-am compilat cu F80 s-a dovedit mult mai rapid decat varianta cu Nevada (destul de rapid incat computerul sa astepte dupa imprimanta si nu invers!).

Inspirat de scena POV-Ray de mai sus

Fisiere

Nota: Imaginile de disketa sunt atat in format raw (.DSK) cat si IMD. Imaginile disketelor pot fi scrise folosind CPMIMG de George Chirtoaca (fisierele .dsk) sau IMD de Dave Dunfield (fiserele .imd). Pentru a boota disketele pe HC se foloseste comanda BASIC PRINT USR 14446 dupa RESET.


1 Conectarea DTR dinspre calculator spre imprimanta s-a dovedit a fi o greseala: Daca intrarea DTR a imprimantei este JOS (tensiune negativa), imprimanta nu tipareste nimic. Este necesar ca aceasta intrare sa fie libera sau SUS.

2 SNPCAL este un program scris pe la sfarsitul anilor '60 pentru calculatoare IBM si adaptat pe la sfarsitul anilor '80 pentru PDP-11. Oare o fi ajuns si pe la noi pe CORAL?

3 Caracterele de control ASA reprezinta anumite caractere care, daca apar pe prima pozitie intr-o linie, modifica modul in care imprimanta transporta hartia (vertical) si permit trecerea la pagina urmatoare, suprascrierea unui rand s.a.m.d. Mai multe informatii (in engleza) la wikipedia.


Publicat in 2020-06-14 de Mihai Gaitos - contacthawk.ro