Advanced Projects by Aacini

Versión en español

My name is Antonio Pérez Ayala, aka Aacini (Eng.), and I am a computer geek. Here are a few quick facts about me. Mathematics and technology have always fascinated me, and I have always loved electronic gadgets and devices. From an early age I was attracted to the power of technology. For example, I have pioneered the use of electric vehicles in my country (México) since many years ago: two small electric scooters before 1980, two Segway HT i167 electric vehicles that I bought from Amazon USA in 2002 (the first production), and lately two electric automobiles and a motorcycle.

This page is about software I have written. I have uploaded some Windows applications on this site that I developed as personal projects. You may download and use these applications for free. I would like to share a little of my history and my reasons for creating this site before I present these programs to you.

The biographical information that follows highlights my successful track record with innovation as it relates to electronic devices and computers programming. This is the only page with personal data in this site, so if this story seems boring to you, just skip to the bottom of the page and browse the software projects.

Contents

  1. In the beginning - things that I saw in my first years
  2. My electronic calculators and other calculating devices
  3. My first job at CECAFI: IBM-1130 assembly language and a lot of new things
  4. My second job at the SDDNP: Burroughs B6700's Algol and WFL tricks
  5. The family business and our computers: Cromemco Z-2H and an IBM-PC clone
  6. My projects for MS-DOS - better Batch files, graphics and new programming languages
  7. My projects for Windows - HTML, JavaScript and more graphics
  8. The software projects

In the beginning

I was born in Mexico City in 1955, meaning, when I was a child, not one of the multiple devices or gadgets commonly used today, had even been invented! The only technology in our house was a large console table with a 78 RPM record player that belonged to my father and a few Enrico Caruso and Édith Piaf records. We also had a black and white TV. Those days the only way to get a gadget in México was to go to another country, buy it and bring it to home. Unfortunately our family did not have the means to do that. About once a year, relatives might give us a small gift they purchased in the U.S., and that's how I got hooked on technology. I remember a "Remote Control Set" comprised of a remote control, a brown plastic box with a small whistle, and a receiver that was connected to a wall socket that turned the appliance connected to it, on and off, when you push the "control" so it whistles. Many years later we bought a color TV set that included a remote control with three buttons: on/off and channel up and down. It had a small speaker in the front, which was supposed to work via high-frequency sounds. When I was old enough, I started to read specialized magazines, like "Mecánica Popular" (Popular Mechanics), that sporadically included an article about novelty devices (like the Heathkit H8, microcomputer sold as a kit for assembly), but with no chance to order one from México at that point.

On my fourteenth birthday I received a new portable AM/FM radio and turntable combo that worked with batteries. At the time I had a small collection of rock and pop music from mid and late 60's, several 45 RPM SP vinyl records and a few 33 1/3 RPM LP's. This turntable allowed me to take my music with me and play it anywhere, although it was a nuisance to carry on all those records and the bulky turntable. Some time later I bought a second-hand audio casette player/recorder. I vividly remember how this device provided me with three important features: play just a selection of the best songs from my collection, record many songs on a single audio cassette with 60 or 90 minutes of capacity (much smaller than a vinyl record), and listen to music even when I was on the move! The 120 minutes cassette tapes were prone to jam into the player, so I did not use them.

When portable Compact-Disk (CD) players were released, some years later, they were much more convenient, because they were smaller than a cassette player and a CD was more robust than a cassette, but then you had to buy all of the music on CD's (and store the vinyl records in the attic). The development of standard methods for audio compression (like the MP3 file format, widely used to compress music) and the release of MP3 compatible portable CD players provided advantages similar to that of the cassette players, and much more: I could record on a single CD almost eleven hours of music in MP3 format at the standard 128 kbps encoding, and later, when recordable DVD disks were released, almost 7 times as much! I recorded on a single DVD a lot of 60's and 70's pop and rock music, including the 226 songs from the 15 original Beatles' disks (including "Past Masters" volumes one and two), all the best (most) songs of Queen, Bee Gees, Grand Funk, Carpenters (I loved Karen! :-), Chicago, Abba, Rolling Stones, Creedence, etc. I also recorded most of the songs of Spanish artists like Mecano, José José, Mocedades, Alaska, Roberto Carlos, etc, in addition to many individual songs selected from other lesser known artists. This collection adds up to 1,285 songs that requires 4.37 GB, so it perfectly fits in a 4.70 GB DVD recordable disk. I recorded most of this music from original CD's I bought or from my old vinly records processed with the first version of hardware and software that converts they into .mp3 files. A small part of my collection was taken from my friends' disks that I borrow to convert the songs I wanted.

Some time later I discovered hard-disk based portable MP3 players. At that time I already had a computer with internet connection (via a slow telephone modem), so it was much easier to search the web at this time. I found only two devices of this type for sale: a very expensive one (I don't remember its name) and the Archos Jukebox 6000 with a 6 GB hard disk that I could order on-line from the U.S. It was delivered to my home just ten weeks later! My "ability" to purchase my first Jukebox on-line from México City reflected the development of communication and international commerce during that time.

This brief story about how music playing devices evolved during the first 45 years of my life parallels the development of technology or devices in general during the same period. I have been eyewitness to the emergence and evolution of practically every computer technology and electronic device currently in use, such as electronic calculators, Pascal programming language and structured technologies, Hewlett-Packard calculators, UNIX OS and C programming language, brick cell phones, the IBM-PC, the internet, the iPod, Java and a long list of others. I could fill several volumes with just my personal experiences on this matter. However, I will limit myself to write here on calculators, computers and the programs I have written.
Top

My electronic calculators

In my last year of high school, (circa 1974) I used a small abacus (that I bought as a child's toy) to perform arithmetic operations faster than my classmates (I still keep it!). Those days, use of the slide-rule wasn't taught until one was in university. The year I entered college was the last time the slide-rule was taught at that level. I remember how the teacher used this huge slide-rule, around 7 feet long, (like this one) hung over the blackboard in the classroom.

When I was eighteen, my father bought a Brother PRO-CAL 408 calculator (1971). It was one of the first hand-held, battery powered calculators. I still have it in very good condition. As years went by, I bought several calculators and gadgets, particularly novelty devices that had different designs or features. For example, I have a Casio fx-190, "Scientific calculator & Electronic Scale" that allows one to directly take measurements via a LCD scale, and a Nesa Novus "Regla de cálculo electrónica" (electronic slide-rule), the first (the only one?) hand-held calculator made in México that featured a 3-level stack RPN logic. This calculator is very rare nowadays. It appears to be a Spanish version of the NSC Novus 4510 "Mathematician" calculator (1976).

I have also a Texas Instruments TI-59 programmable calculator (1977) with its PC-100A printer; a Commodore 64 home computer (1982); a PSION Organiser II XP model (1986), handheld "calculator" (first PDA, really) that featured OPL, a Basic-like programming language; an Atari Portfolio (1989), first Palmtop PC with MS-DOS 2.11 in ROM, and several other devices. In 1975, when I entered college, I had a Sears Electronic Slide Rule scientific calculator with attractive white keys on a black body that could be stored in a handy hard case. I remember how I carefully copied a series of the scientific formulae used in my classes on cards that fit inside the calculator's case.

In my first year at college I discovered Hewlett-Packard calculators. One of my teachers, that later became my friend, had one of the first HP-35's, and another person there bought a HP-55 later. One day, one of my classmates showed me a brand-new HP-21 he had purchased in the U.S. just after that model was released (he went to the U.S. on the weekend just to buy the calculator). Some time later, I got my first HP calculator: a brand new HP-25. I remember how the programming capabilities of such a calculator helped me to complete my next Numerical Methods exam quicker than that of my classmates. The teacher was very impressed with the small calculator.

My brother Enrique, two years older than I am, bought a HP-29C when it was released. Some months later, one of my aunts gave my brother and me a marvelous gift: a new HP-67 calculator. Around 1980, when a small computer was needed for my father's business, I evaluated the HP-9830A "desktop calculator" with several peripheral devices, but in the end, we did not buy it. As time went on I bought several HP scientific calculator models, and I still have many of them. When the HP Prime was released I considered buying one, but decided I would not really use it. However, in March 2014 I bought a Swiss Micros DM-15, a HP-15C clone in a small size that is pretty cool!

I was recently caught by the "vintage calculators collector fever" and acquired several old calculating devices of different types: from sorobans (japanese abacus) and slide-rules, to mechanical calculators of diverse construction and materials (including the two Curta models), to first electronic calculators (including a working HP 9810A), to some very special items like a new in-the-box HP Xpander I bought from and old HP employee. I will upload images of my calculators collection in this site soon.
Top

My first job

I was fortunate to live in Mexico City, where UNAM is located. La Universidad Nacional Autónoma de México (National Autonomous University of Mexico) is the largest and most important university in Latin America. There, people have the opportunity to access the most recent research and technological developments in the country, in several areas.

In 1975, before I attended college, I learned FORTRAN programming language at home reading Daniel D. McCracken's FORTRAN book that belonged to my big brother Enrique (the book had a black cover with red letters, probably was a Spanish translation). My brother took me to CECAFI: Centro de Cálculo - Facultad de Ingeniería (Calculus center - School of Engineering) at UNAM, and disguised me as a student so I could use its IBM-1130 computer. He showed me how to buy a deck of 100 blank cards for 10 Mexican pesos (equivalent to $0.80 USD at that time) and an orange pre-punched "JOB" card for 3 pesos more. Then, he lead me to the key punch room and showed me how to use an IBM 029 Card Punch machine like the one showed at right side (that had uppercase letters only) to create the job deck. After that, I placed the orange JOB card on top the deck, put it on the computer services desk and came back around half to one hour later to pick up the results listing and the deck with the JOB card cut in half. My first program calculated a table of cubic roots for numbers from 1 to 1200 that was printed with 7 decimal digits on a 5 column wide page. My first attempt, on May 7th of 1975, had no errors (I still have the result listing).

After entering to the school of engineering (Facultad de Ingeniería) I began going to CECAFI, frequently, to give advice on computer topics to other students. Some time after that, I was hired as academic faculty. I spent much of my time researching new technologies. I learned PL/I, Basic and Pascal programming languages in different sized computers, although I never could learn COBOL. All these activities were much to the detriment of my "assigned tasks" at CECAFI and academic studies in other areas, but my boss quickly accepted this reality and reassigned part of my duties to match my interests. I taught numerous courses about most of the commonly used programming languages of that time, excepting COBOL and RPG. I have a lifelong interest in teaching computer topics in the simplest way to people with no experience and to develop systems or methods to facilitate their understanding. When I left CECAFI I continued giving classes at the Continuing Education Division, Faculty of Engineering, located at Palacio de Minería, where I had the opportunity of teach classes related to my personal projects.

I learned IBM-1130 assembly language and Operating System functions on my own by reading the extensive technical documentation that CECAFI had, and used that information to write programs that create the creative things that could not be done in standard programming languages. For example, when a run-time error happened in a FORTRAN program, the computer stopped operation and showed an error code in the panel lights, so the computer operator had to look for the JOB card of the offending program and write on it, by hand, the error code (for example: "F003"), then press a key to continue operation. Frequently, the novice students had no idea of what that scrawl on the JOB card meant. I wrote an auxiliary subprogram in assembly language that allowed FORTRAN programs to print in the result listing any run-time error that can occur with a detailed description.

I wrote a program that reviewed the contents of the entire disk and printed the sectors that contained text messages, and a second program that allowed one to modify any sector in the disk. These two programs were similar in structure and just differed in details, so I wrote both programs in a single deck of punched cards placing two instructions in different colored cards (to easily identify them). IBM-1130 assembly instructions were written from column 21 on and ignored anything after the first space, so I put a second instruction on the other side of the card from column 60 backwards. This way, I just needed to place all colored cards front-ways or backwards in order to select the desired program (a friend of mine called "palindromic" such instructions, but this term is wrong: they are really "Semordnilaps"). I used these programs to translate FORTRAN compiler messages to Spanish modifying the messages on disk with new text not longer than the original one.


@@@@@
 @  @@
 @  @@   @@    @@ @@   @@ @@    @@   @@ @
 @@@@      @    @@ @    @@ @   @  @   @@ @
 @  @@   @@@    @  @    @  @   @@@    @
 @  @@  @  @    @  @    @  @   @      @
@@@@@    @@ @  @ @ @@  @ @ @@   @@@  @ @

@@@@  @@@@  @@@@  @@@@  @@@@  @@@@  @@@@
@  @  @  @  @  @  @  @  @  @  @  @  @  @
@  @  @  @  @  @  @  @  @  @  @  @  @  @
@  @@@@  @@@@  @@@@  @@@@  @@@@  @@@@  @@@

I created basic ASCII art using punched cards with one hole for each black "pixel". Each column in a card had 12 zones, so up to 12 holes could be used in each column via a special "multi-punch" key of the Card Punch machine. This way, complex designs could be assembled placing several 80-column cards together. An assembler program read the multi-punched cards (that could not be correctly read by any other programming language) and printed the "pixels" in Z-fold continuous paper: one and a half cards were used to print 80+40=120 characters, and the 12 rows produced 12 printed lines. I used this method to print the informative banners stuck on CECAFI's walls, and from that day they were italic or gothic letters decorated with flowers and diverse designs (I used cross-stitch booklets as patterns for the fonts and designs).

As an educational experience, I wrote a very short program in assembly language and translated it to binary machine code using the equivalence tables of the programmer's manual. Then, I loaded the binary program into computer's memory via the same method used by old programmers many years ago, using the toggle switches that the IBM-1130 still had as a reminiscence of older machines. To begin, I turned the computer mode dial at right side of the panel lights to LOAD position (instead of the usual RUN). After that, I carefully copied a 16-bits binary value from the zeros and ones written in paper to the toggle switches in the console and pressed a button to load the given value, and then I repeated this step with all the 16-bits values that comprised the program. Finally, I turned the dial to SI (Single Instruction), pressed a button on the console to execute one instruction at a time and reviewed the result on the panel lights. What an experience that was!

I developed a method to install two different compilers onto the same disk: the original IBM COBOL and a non-IBM product called FORTRAN-EMU, developed by Eastern Michigan University. Before I developed that method, FORTRAN-IV (EMU) and COBOL programs could not be processed at same time and required a disk change, but such a change required that the disk motor be turned off and then waiting until the disk stopped. Then one had to change the "pizza-like" disk cartridge, turn the motor on again and wait until the disk reached its operational RPM's. For this reason it was not convenient to repeat such procedure quite often.

The computer operator had to wait until a large number of the other language programs accumulated in order to change the disk and process them. This means that the students that wrote COBOL programs, that was the minority, had to wait too much time to get their results sometimes. You may read a detailed description of this problem and how I solved it on this page. As far as I know, CECAFI's computer was the only IBM-1130 at that time that resolved this issue.

When a Radio Shack TRS-80 microcomputer arrived to CECAFI, I learned Z-80 assembly language and TRSDOS service functions. The TRS-80 assembler was distributed in a cassette that was used in a standard cassette player. The computer also had two floppy disk units, but the protection scheme don't allows to copy a program from cassette to diskette. I wrote a program in assembly language to copy an application distributed in cassette into an executable file on diskette with the main purpose of copying the assembler itself, but also to copy any other application, such as games. The development of such a program required several tests and in each one the assembler cassette was played two times: one to assemble the program and another one to read the assembler itself (in order to copy it). I vividly remember the fear of the tape jammed into the cassette player each time I pressed the "Play" button, and the relief I felt when the assembler was finally successfully copied to disk.

Also at that time, CECAFI received a copy of Regular Expression Compiler (REC), a programming language based on Lisp developed in México by Harold V. McIntosh around 1966 that did not use GOTO, so it was precursor of Structured Programming technologies. I installed REC on the IBM-1130 and used it extensively. The REC programming language influenced several projects I developed many years later.

Around 1977, CECAFI received the APL\1130 programming language, a single-user interactive interpreter designed with an unusual syntax that required non-standard characters, so this language could only be used in devices that could show the APL character set. The IBM-1130 console printer used an IBM Selectric mechanism that allowed one to change the type element, and the APL\1130 package included the corresponding "typeball" element. I remember how the APL keyboard stickers with 3 symbols each (that required two different shift keys: "up" and "right") were stuck to the keys and how I changed the "typeball" when I wanted to use APL (at same time I suspended the computer services to the students of the whole Faculty!).

The APL language has a structure different than the rest of standard programming languages and performs complicated operations over multi-dimensional arrays with just a few operators. I remember quite vividly how the deep use of APL expanded the mind in very unusual ways! I think I was one of the first people that used APL outside of the U.S., and I am sure I was the first one to teach APL at UNAM, and hence in México.

In 1986, I was hired as APL programmer for a private organization and developed financial and business systems with an IBM System/360 computer terminal for more than a year. I also gave private classes on APL programming language to an IBM de México staff when the IBM 5120 Computer System, with both Basic and APL languages, was introduced in México.

Top

My second job

In 1982, I left CECAFI and joined to a 4 people team in charge of design and developing new systems written in Algol 60 programming language that would run in a Burroughs B6700 mainframe computer. La Coordinación de la Administración Escolar (CAE) was the UNAM entity responsible for distributing the new "first-entry" students to the different schools in the UNAM system, and our team (SDDNP: Subdirección de Diseño y Desarrollo de Nuevos Proyectos - Subdirectorate of Design and Development of New Projects) had the objective to update old students distribution systems written in COBOL and develop several new smaller ones. I used a less known feature of B6700's WFL (job control language) in an unusual way that allowed our team to bypass the computer job queue and compile/run our programs immediately (please, don't ask for it! ;-). When I got a listing of Algol compiler errors obtained from the compiler itself, I realized that there were some undocumented errors related to "complex numbers" data type. After several trial and error tests I discovered that the compiler could manage complex numbers indeed, so I wrote the "Use of complex numbers in Burroughs Algol" user's guide, that had a small distribution at the CAE (for many years after that I didn't knew about any official Burroughs Algol documentation on complex numbers).

In less than a year, our team at the SDDNP developed several mid-size systems and two entirely new student distribution systems: pre-university school and college levels. These systems were used for the first time for the UNAM "first-entry" processes of 1983-1984 academic year. Around 40,000 records in pre-university level and more than 32,000 already in college were processed that year, and the new systems solved most of the problems the old systems had. At that time, it was customary to hire supplementary staff in all UNAM's pre-university level schools when the distribution results were published in order to address the numerous complaints from new students, but that year such staff was practically idle (that was the last time they were hired). On February 28th, 1984, I received a personal congratulations letter from Raúl Béjar Navarro, then UNAM's general secretary, because of the "highly satisfactory results" obtained from previous distribution systems. I still have that letter, like a treasure!

A short time after that, I had to resign from the SDDNP in order to attend to the family business founded by my father. Then, on the 19th and 20th of September in 1985, the catostrophic earthquakes struck Mexico City. On September 22, the original SDDNP members were called by an executive at CAE in order to aid them in the development of an emergency system designed to coordinate and align humanitarian aid from Cruz Roja Mexicana (Red Cross), with the specific needs of the people affected by the earthquake, including determining what additional resources needed to acquired via donation. Almost a year had passed since the last time my SDDNP teammates and me had worked together (by the way, my former boss at the SDDNP told me that he lost his HP-35 calculator in the earthquake). After a brief recalibration period, lasting around half an hour, our team clicked worked together just like old times, and we designed and developed a fully working system in Algol, in less than a week. The system (nicknamed "Celestina") was donated to Cruz Roja Mexicana (signed by CAE) and got the job done!
Top

The family business

Many years before I was born, my father founded a small metal-mechanics business that slowly grew as the years went on. The business was a typical family-run organization, so my father's four male sons worked at the factory as soon as they were old enough. In 1968, when my brother Enrique was fourteen and I was twelve, we were playing, not unlike other kids our age, and we built a small toy car, but our car was different than the inventions of other kids. It had rubber wheels with ball bearings, a steering wheel and rear brakes because we built it using equipment and materials from the factory. My father liked the small car, so he improved it and began its production and sales as a toy for children, registering it as "Carro deslizador Avalancha™". I continued to help with manual labor in my father's factory until entering the University when I transitioned to more administrative tasks.

In early 1981, I proposed to my father that he use a computer for the administrative tasks of the family business. I evaluated the HP-9830A "desktop calculator", but finally we bought a Cromemco Z-2H microcomputer system with two 5 1/4" floppy disk units, an 11 MB hard disk, two terminals, a high-quality printer and a lot of software or separated manuals for the equivalent of more than $20,000 USD (remember that prices in México are higher than in U.S.). The Cromemco had a Z-80 CPU running Cromix (the first Unix-like operating system for microcomputers) with extraordinary efficiency. I used Cromemco Structured Basic to develop the business administrative applications, but I also mastered Z-80 assembly, C programming language and UNIX OS services of that machine.

Each Cromemco 3102 terminal had a processor that allowed for a display of an input form on the screen to enter and validate data independently of the central unit. I wrote an application in assembly language that performed these steps: display an input form in the terminal, activated it, put the terminal off-line and waited for the user to press Send key; then, checked the data received from the terminal and automatically requested a re-send if it was incomplete. This program allowed a large number of input data processes running at same time with no data loss. I sold a few copies of that application. One of my customers had a large Cromemco system with eight terminals that worked all day long inputting data; what a performance obtained from a single Z-80 CPU! I still have all of my Cromemco's manuals in like-new condition. The C compiler package included a copy of the first edition of The C Programming Language, which is another one of my treasures.

Around two years after we bought the Cromemco, the IBM-PC was released in México followed by cheaper PC-clones, so I finally afford to buy a computer for myself (more about this point later). Not too long after I bought my PC we made the decision to replace the family business Cromemco by a Columbia PC-compatible desktop computer (sold under "Printaform" brand in México) with an IOmega Bernoulli Box 10 MB removable cartridges x 2 unit and a fast dot-matrix printer. I chose Ashton-Tate's dBASE-IV database application and Nantucket's Clipper compiler to develop the administrative systems, and Ashton Tate's FrameWork III as integrated application suite (that is, to "write letters" ;-). I still have all these application packages in very good condition. I also have one of the original Columbia Super Pack software box in like-new condition.

At that same time (1984) I decided to resign from my job at the SDDNP in order to work full time in the development of the new administrative systems for the IBM-PC and process all business data by myself. I was hired by my father. This decision was influenced by a project my father requested that was developed by a management services firm that supposedly would convert the family business into a professionally managed business, but such a change would require that my father delegate his numerous responsibilities and he struggled to accept this. After a few years of large productions of Avalanchas, competition from similar cars and the decrease in sales of this type of product (including bicycles) resulted in the family business's decline year by year. At the beginning of 2004, my father closed his family business and the "Avalancha" trademark was appropriated by other companies, used in their clone cars.
Top

My projects for MS-DOS

As I said before, by 1982 the IBM-PC had started its distribution in México, but it was expensive. Some time after that, a few "PC-compatible" clones of other brands were released at much more affordable prices, so I finally could buy a computer of my own: a Columbia Data Products VP "lugabble" computer (sold under "Printaform" brand in México) with MS-DOS 2.11, a 9" monochrome screen, two 5 1/4" floppy disk units and a keyboard that was placed inside a lid and secured to the computer body, converting it in a big (and heavy!) cage. I still keep this computer in working condition! I also bought Borland's Turbo-Pascal 3.0, Turbo-Assembler 1.0 and Turbo-C 1.5 that I later updated to Turbo-C++ "second edition". I still have all of them!. I got used to using Turbo-Pascal as a program text editor because of its small size, and continued using it this way for many years afterwards.

I studied how to write Intel 8086 assembly programs in the Turbo-Assembler manuals. I also read the description of CPU instructions in The 8086 Book, and BIOS and DOS service functions with the excellent documentation provided with the Columbia. I also read novelty techniques published in specialized magazines (like Dr. Dobbs Journal). I started to write small auxiliary .COM executable programs written in assembly language performed tasks that the standard MS-DOS commands could not achieve, like store command output in a variable, arithmetic operations, move the cursor, display text in color, etc.

These programs increased the capabilities of MS-DOS .BAT Batch files, so I grouped them in a package called PI-BATCH (from Batch++ or "Post-Incremented Batch"). I also defined an advanced version of Batch language that included the standard constructs of structured programming; an "incremented" structured Batch program was converted into a standard .BAT file via a translator program (written in Batch) using a method similar to RatFor preprocessor (that translated a structured version of Fortran into a standard Fortran 66 program). In 1986, I gave the first class, open to the public, on an "Introduction to PC MS-DOS assembly language" in México at the Palacio de Minería. Several of the people present at that class were professors at the School of Engineering. I continued giving that class (and later a second, advanced part) for several years.

CLOCK.COM was a Terminate and Stay Resident program I wrote inspired by Borland Sidekick (that I also bought) that showed real-time/timer/stopwatch features in an additional screen line, the number 26, that I achieved by reprogramming the controller chip of the video card (CGA or MDA). MKLINK.COM was a program that allowed one to copy a file in several directories of a disk without duplicating the data of the file. This feature was particularly useful in the FAT32 disks of portable MP3 players, because a song file could appear in several folders (as if they were playlists) using just one physical copy of the data area of the file. I achieved this by directly modifying the directory area of the disk, entirely bypassing the DOS disk-management functions. Of course, the DOS internal functions had complaints about this management: the CHKDSK.COM MS-DOS standard program identified the additional links created by MKLINK.COM as "disk errors", but everything worked correctly as long as you knew what you are doing.

SYMPLE (SYMbolic Programming LanguagE) was an educational tool based on Regular Expression Compiler (REC) that I designed as an intermediate step between a stack-based (HP) handheld calculator and a high-level structured programming language, like Pascal, but in this case the control structures were assembled in a much simpler way. I developed a complete SYMPLE interpreter in Turbo-Pascal with a fully interactive environment, including a very fast multi-page help system that made good use of the several video pages provided by the video controller card. I used this program to give a few classes on SYMPLE programming language. The students received the interpreter for free. In December, 1986, I presented "El lenguaje de programación SYMPLE" (The SYMPLE programming language), a paper at the Second International Conference "Las Computadoras en Instituciones de Educación" sponsored by the UNAM.

I took the Borland Graphics Interface (BGI) library from Turbo-C and modified it in a way that it could be used in a Clipper compiled program. The Clipper compiler was also written in C, but it was created using the Microsoft C compiler that did not have graphics support at that time. I added a set of "high-level" graphics routines (like Bar, Pie, etc) and grouped them all in "Grapper.lib: Graphics Library for Clipper Compiler" package that allowed a Clipper program to display a series of standard graphics in the screen in a very simple way. I sold some copies of this package. A Clipper+Grapper program was used to draw earthquake related graphics at CENAPRED, a government entity in charge of keeping Mexico's earthquake data (a project developed by my friend, Salvador Medina Morán). By the way, the original Borland's BGI circular-shaped graphics functions (circle, ellipse, arc, etc.) had a bug when the line was drawn in certain conditions, so I wrote my own replacement functions that used DrawPoly BGI function instead. I used sine/cosine tables multiplied by an integer factor in an assembly language routine that calculated the vertices of the polygons used to create circular shapes in a very efficient way. This routine drew perfect circular graphics at the 640x480 maximum resolution of the VGA video card. In 1991, I presented a paper on the Grapper library at the Seventh International Conference in the UNAM.

After that, I modified the structure of Grapper library and converted it to a Terminate and Stay Resident (TSR) program that followed the MS-DOS standards for this type of programs. I included a dispatcher routine for all BGI functions and hooked it to INT 2FH (the DOS Multiplex service). It worked as a standalone graphics engine that could be used by any standard DOS .COM program. I used this scheme to develop a series of high-level graphics DOS commands (the "Batch-Graph package") that could be used directly at the command-prompt or via Batch files. I remember quite vividly the first time I typed "LINE AT 10 10 TO 50 50" and pressed Enter, and a line appeared in the screen over the listing of a previous DIR command! All Batch-Graph graphics commands also allowed a mouse-driven interactive drawing when a MOUSE parameter was given instead of screen coordinates. Besides, the graphics TSR engine intercepted the DOS video output functions in a way that the number of "text lines" used for command entry was limited to a few lines at the bottom of the screen, so the graphics were preserved in the upper part. I gave several courses on Batch-Graph package that used the graphics as an attractive introduction to Batch file programming. The students received a copy of the package for free. In 1992, I applied to present a paper on "The Batch-Graph package" at the Eighth International Conference in the UNAM, but it was not accepted.

The Batch-Graph's LINE command also allowed one to draw a line segment via its vector components (magnitude and angle). These values were also stored in the TSR, so they could be used as base in a posterior LINE command that would increase/decrease the size or angle of the previous line segment. This trick allowed a simple emulation of "Turtle Graphics" feature of Logo programming language, thus any Logo drawing program could be translated into a graphics Batch file in a very simple way. I wrote several Batch files to draw recursive curves, like Hilberth, Dragon, etc., that worked perfectly (the "C" curve, shown at right side, is my favorite). However, the Batch file processing speed at that time was too slow to draw more sophisticated recursive graphics. For example, a "C" curve with a high recursive level tooks too much time to complete.

I saw the first contact with recursive curves and fractal graphics in the 1990 book Advanced fractal programming in C that I still have. I developed a very efficient Mandelbrot Set drawing program in Turbo-C with assembly language sections in the parts that performed the most complex calculations. The program used a special floodfill-type routine that avoided the processing of black areas that were the most time-consuming parts of the drawing. The graphic was shown at the 640x480 maximum resolution of the VGA video card, so such image could be stored in a PCX image file format via a standard screen dump utility. A friend of mine had one of the first dot-matrix color printers with two ribbon cartridges (black and tri-color) that could print a 8 1/2" x 11" page at 1920x2560 resolution, that is, four times the VGA screen resolution. I wrote a program in Turbo-C that read four .PCX files and sent to the printer the data required to print the images joined together as a four-times wider one. This program allowed me to print a Mandelbrot Set at the full resolution of the printer. To do that, I divided the whole graphic in 16 sections, drew each section on the screen and saved them to 16 .PCX files, and then joined and printed these files on one page that had 4 times more detail (resolution) than a direct screen-to-printer dump.

I used this method to create a large poster of the Mandelbrot Set comprised of 4 strips of Z-fold continuous paper with 4 pages each, that required the generation of 256 individual screen-sized images. I remember the time it tooks me to generate the more than the 256 images (because in the center of the Mandelbrot Set I added an inverse version of itself, so the poster looks more interesting) and combine the files in sets of 4 in order to print the 4 strips with 4 pages each, to finally carefully cut and paste the paper strips together in a wooden base.

In November, 1992, I presented this poster at the Eighth International Conference in the UNAM as an example of the results that could be obtained from my fractal drawing method. At the conference I had a computer where I showed sections of the Mandelbrot Set at any given coordinates. I remember that at first, the people thought that my program just displayed pre-generated images because of how fast a new Mandelbrot Set section appeared on the screen. The photo at right side was taken at that conference. My friend Salvador Medina Morán, is behind me.

When Windows 3.1 was available in México I did not like the high amount of resources it required nor the slowness of the applications compared to DOS, although I admitted that it certainly was simpler to use by certain people. Anyways, I didn't want to install it. Then, I bought the Fractal Ecstasy program on CD that incorrectly did NOT specify that it required Windows! I installed Windows 3.1 on my computer (using a set of almost thirty 3 1/2" diskettes!) just to use this CD. I ended up using Windows applications after that anyways. Windows 95 was worst because it prohibited many of the tricks I used in my DOS .COM programs. I needed to really study the new way of writing Windows console programs that ultimately I would use just in my personal projects, so I opted to delay that task for later. I continued writing DOS-based .COM "almost-normal" programs (with just a few tricks), that Windows continued executing correctly.

When I found out about Brainfuck programming language, I liked its simplicity that allowed one to completely learn it in a couple minutes, but I did not like the nuisance it presented just to write a small program. However, I realized that I could make good use of Brainfuck's simplicity in order to present programming concepts in a simpler way. I developed a Brainfuck compiler in assembly language and added subroutines to it, both predefined and user defined ones, and several features common to modern structured languages, like scope, modules, libraries, etc. I called "BrainSub" this project (Brainfuck with Subroutines). This language is both an educational tool that may be used to present advanced programming concepts in a simpler way, and an optimizing compiler that generates efficient native x86/DOS .COM format executable code. I also wrote a set of BrainSub libraries that allow one to manage PC resources, like keyboard, screen, timer, sound, etc., and extensive documentation that is by itself an introductory course on computers and programming. I wrote a long article about BrainSub and posted it in Wikipedia in July 2007, just to be quickly deleted because it was "original research". Someone moved the article to esolangs site, where I reviewed it day by day looking for opinions or comments. After one year of this daily review with just a couple minor comments, I couldn't stand the situation and deleted the article. BrainSub programming language has not been used by anyone but me.

Then, life forced me to deal with a series of family matters that required my full attention, so I had to suspend the development of my own projects (and of any computer project for that matter) for a certain period of time...
Top

My projects for Windows

Several years later, my situation changed and I reassumed the development of my personal projects, although with less time to spend on them. I reviewed the status of personal computers at that time and found many changes in Batch file features, several new programming languages and 64-bits Windows versions that didn't support the old MS-DOS 16-bits .COM format anymore, so I finally had to learn how to write Windows console applications in assembly language. After that, I updated some of my old MS-DOS auxiliary Batch programs, developed new applications in 32-bits assembly and JScript programming languages and started to write a user's manual with a compilation of all these Batch file facilities. I called this project "Modern Batch File Programming" and it is the one in which I had spent most of my spare time until some years ago.

Some time ago I wanted to create a web page in one of the easy, "auto-guided" sites in order to publish my projects, but I did not like the method used to create the web pages nor the results obtained. I started to study HTML in order to write the web pages from scratch by myself and tried to write an HTML Quick Reference Guide for easier reference, but I ended developing a Batch file instead that aids in the translation of a text file with BBCode-like segments into a fully working HTML file. The results were so good that I added several features to the translator program, including the animation of images via JavaScript code and other advanced features. All the web pages that comprise this site were created using that program, called TextToHTML.bat.

I have always tried to spread the teaching and use of assembly language. In my first assembly language class at DECFI-UNAM I used novelty educational methods in order to facilitate the learning of such inherent complex language to the students. A pleasant memory I have is the congratulations that two students, that also were my teachers in the Faculty, offered me when the course ends. As support for this idea, I wrote a very basic Intel 80286 assembler written in Batch, so the numerous Batch-file programmers community could take a simple contact with this programming language.

I continued the development of original methods and techniques intended for the Modern Batch File Programming world. I wrote several JScript and assembly language programs that provided new or faster features, but I also devised new methods to use existent features that provided new capabilities to Batch files. These new methods vary from very simple tricks, like Reading a hidden password via a FINDSTR bug, or Move cursor to any position using just ECHO command, or an interesting %variable% expansion that perform the same job of a simple FOR command, or a method to process files in parallel way making good use of the several CPU modules in the computer; to animated games in color like Tetris or VIBORAS.bat (a multi-player version of Snake game); up to complete support techniques that allows for the development of very different Batch file applications. Three of the most interesting ones are briefly described next.

1- Draw graphics in the "text-mode" screen at pixel-resolution, that is, true standard graphics. This is achieved defining a Raster (bitmap) font of 1x1 pixels size that is selected in the cmd.exe window, and increasing the number of columns and lines in the text window accordingly. For example, the Mandelbrot Set shown at right side was drawn by a Batch file using the 1x1 pixels size font in a text window with a total size of 912 columns x 684 lines (selected via MODE CON standard command). The "pixels" (characters) were shown with my ColorShow.exe program (the modern Windows version of my old assembly language program that show text in color). After the graphic was drawn a PAUSE command is executed, so the bottom line have the standard "Press any key to continue . . ." message, but displayed with 1-pixel size letters (click on the image to enlarge it).

2- In the 1x1 pixels size font is possible to show text using the same method of the OS internal routines: read a font definition file and use it to show the individual pixels that forms each character. At left side is the output of a program that use such a method to show text in different sizes and colors, and at right side is the output that show text from several different font definition files.

3- A method to combine Batch code, JScript code and HTA (HTML) code (tri-hybrid script) to create separate windows that show graphics via the "canvas" tag of the HTML5 specification, under control of the Batch code. Two examples of the use of this technique are Batch-BGI graphics library for Batch files, and "Turtle Graphics" in Batch files. An example of the output that may be produced by the second application is shown at left side. Note that each one of the graphic windows in this example were created via two lines of Batch code: one to create the window (like call :newWindow "Five Rose") and another line, usually long, to show the graphic (like for /L %%i in (1,1,1800) do call :pd & call :fd 10 & call :rt %%i+0.1 & call :pu).

One of the projects I always had pursued is to create a programming language that be simple enough to be understand by people with no programming experience, and at same time be useful enough to create real applications with it. I think I finally designed a language that fulfills these requirements. RPN:PRGM is a programming language based on (ancient) HP calculators, so it is simple enough for most people that have a basic mathematic knowledge. On the other hand, RPN:PRGM compiler generates very efficient code suitable for an ample range of small and mid-size applications. An additional benefit is that the language could be taken as an introduction to x86 Intel assembly language programming. This is the project I currently are immersed in, so you are invited to review it.
Top

The software projects

This is the list of the projects I have uploaded at this site. Please, note that this is work in progress. I will add new projects or individual sections or programs as soon as I complete each of them. You may Follow Me on Twitter in order to receive news about future additions to this site. Feel free to use any information or program on this site to your benefit. Doing that will crown the more than 35 years I spent developing all these personal projects (but you should read the legal advice first).


Antonio Pérez Ayala