| View source | |
| # 2025-07-19 - OCC BasLinux, Slackware 4.0, And Flip-Card | |
| I am a fan of using a Linux live system as a runtime and Slackware | |
| as a development environment for it. Slack15 Puppy Linux can | |
| install Slackware 15.0 packages. Slacko Puppy Linux can install | |
| Slackware 14.2 packages. | |
| What i am writing about today is BasLinux, a live system that runs | |
| Linux from a 1.44 MB floppy. A second 1.44 MB floppy gives X11. | |
| It runs Linux kernel 2.2, busybox, and it is based on Slackware 4.0. | |
| This means that you can build programs in Slackware 4.0 and run them | |
| on BasLinux. This also means that BasLinux is limited to | |
| "period hardware". | |
| I appreciate the little conveniences in Alpine Linux. For example | |
| the `losetup -P` option scans a loopback device for partitions, | |
| eliminating the need for kpartx from multipath-tools. | |
| # Install Qemu | |
| iris:~# apk add qemu-system-i386 qemu-ui-sdl | |
| # Install Slackware 4.0 On Development VM | |
| Download the Slackware 4.0 ISO images plus any desired patches. | |
| In my opinion Slackware 4.0 has aged well compared to other | |
| distributions of its era. | |
| Slackware 4.0 ISO images | |
| Slackware 4.0 mirror (FTP) | |
| Slackware 4.0 mirror (gopher) | |
| Make a Qemu startup script. 16 MB RAM should be plenty. | |
| iris:~$ mkdir -p Qemu/slack40 | |
| iris:~$ cd Qemu/slack40 | |
| iris:~/Qemu/slack40$ truncate -s 500M slack40.raw | |
| iris:~/Qemu/slack40$ cd | |
| iris:~$ cat >qemu-slack40.sh <<'__EOF__' | |
| #!/bin/sh | |
| DISK="/home/ben/Qemu/slack40/slack40.raw" | |
| BASE="Slackware Linux 4.0 (Walnut Creek) (June 1999)" | |
| CDROM="/home/ben/Downloads/${BASE} (Disc 1).iso" | |
| MACH="pc-i440fx-9.2,dump-guest-core=off,mem-merge=off,usb=off" | |
| SAND="on,obsolete=deny,elevateprivileges=deny,spawn=deny" | |
| SAND="${SAND},resourcecontrol=deny" | |
| qemu-system-i386 \ | |
| -accel kvm \ | |
| -machine "$MACH" \ | |
| -overcommit mem-lock=off \ | |
| -no-user-config \ | |
| -sandbox "$SAND" \ | |
| -msg timestamp=on \ | |
| -cpu max \ | |
| -m 16M \ | |
| -global i8042.kbd-throttle=on \ | |
| -device VGA \ | |
| -hda "$DISK" \ | |
| -cdrom "$CDROM" \ | |
| -display sdl,gl=off,grab-mod=rctrl \ | |
| -rtc base=localtime | |
| __EOF__ | |
| iris:~$ chmod a+rx qemu-slack40.sh | |
| iris:~$ ./qemu-slack40.sh | |
| This will boot the Slackware 4.0 install media. | |
| At the boot: prompt, press Enter. | |
| At slackware login:, type: root | |
| Press Enter | |
| Partition the disk. | |
| # fdisk /dev/hda | |
| ... | |
| Command (m for help): o | |
| ... | |
| Command (m for help): n | |
| Command action | |
| e extended | |
| p primary partition (1-4) | |
| p | |
| Partition number (1-4): 1 | |
| First cylinder (1-1015, default 1): 1 | |
| Last cylinder or +size ... (1-1015, default 1015): 1015 | |
| Command (m for help): a | |
| Partition number (1-4): 1 | |
| Command (m for help): w | |
| Calling ioctl() to re-read partition table. | |
| hda: hda1 | |
| hda: hda1 | |
| Syncing disks. | |
| WARNING: If you have created or modified any DOS 6.x | |
| partitions, please see the fdisk manual page for additional | |
| information. | |
| Start the Slackware installer. | |
| # setup | |
| Select TARGET and press Enter | |
| Please select a partition from the following list to use for your | |
| root (/) Linux partition. | |
| Select /dev/hda1 and press Enter | |
| Select Format and press Enter | |
| Select 4096 1 inode per 4096 bytes. (default) and press Enter | |
| Wait for it to format the filesystem. | |
| At DONE ADDING LINUX PARTITIONS TO /etc/fstab, Press Enter to EXIT | |
| At CONTINUE?, select Yes and press Enter | |
| At SOURCE MEDIA SELECTION: | |
| Select 1 Install from a Slackware CD-ROM | |
| Press Enter | |
| At CHOOSE INSTALLATION TYPE, select slakware and press Enter | |
| At CONTINUE?, select Yes and press Enter | |
| At PACKAGE SERIES SELECTION: | |
| Use arrow keys and space | |
| Clear box next to E GNU Emacs | |
| Clear box next to F FAQ lists, HOWTO documentation | |
| Clear box next to T TeX typesetting software | |
| Clear box next to XAP X Applications | |
| Clear box next to XV XView (OpenLook Window Manager, apps) | |
| Clear box next to Y Games (that do not require X) | |
| Select OK and press Enter | |
| At CONTINUE?, select Yes and press Enter | |
| At SELECT PROMPTING MODE, select full and press Enter | |
| Wait for slackware installer to complete | |
| At MAKE BOOTDISK, select continue and press Enter | |
| At MODEM CONFIGURATION, select no modem and press Enter | |
| At SCREEN FONT CONFIGURATION, select No and press Enter | |
| At INSTALL LILO, select simple and press Enter | |
| At SELECT LILO DESTINATION, select MBR and press Enter | |
| At CONFIGURE NETWORK?, select No and press Enter | |
| At MOUSE CONFIGURATION, select ps2 and press Enter | |
| At GPM CONFIGURATION select No and press Enter | |
| At SENDMAIL Configuration, select Cancel and press Enter | |
| At TIMEZONE Configuration, select US/Pacific and press Enter | |
| At set a root password? select Yes and press Enter | |
| At New password: enter root password and press Enter | |
| At Re-enter new password: enter root password again and press Enter | |
| At Press [enter] to continue: press Enter | |
| At SETUP COMPLETE, Press Enter | |
| At Slackware Linux Setup, select EXIT and press Enter | |
| Shut down Slackware 4.0 | |
| # umount /mnt | |
| # shutdown -h now | |
| INIT: Switching to runlevel: 0 | |
| INIT: Sending processes the TERM signal | |
| Terminated | |
| INIT: Sending processes the KILL signal | |
| INIT: no more processes left in this runlevel | |
| Close the qemu window | |
| Then start qemu and verify that Slackware 4.0 boots. | |
| iris:~$ ./qemu-slack40.sh | |
| The default LILO configuration waits 20 minutes at the boot menu. | |
| LILO | |
| Welcome to the LILO Boot Loader! | |
| Please enter the name of the partition you would like to boot | |
| at the prompt below. The choices are: | |
| Linux - Linux (ext2fs partition) | |
| boot: | |
| Press Enter to continue past the LILO boot: menu. | |
| Welcome to Linux 2.2.6. | |
| darkstar login: root | |
| Password: | |
| ... | |
| Fix long LILO timeout | |
| darkstar:~# cp /etc/lilo.conf /etc/lilo.bak | |
| darkstar:~# sed -e 's/1200/3/' </etc/lilo.bak >/etc/lilo.conf | |
| darkstar:~# lilo | |
| Added Linux * | |
| Create an account, let's call it hermes. | |
| darkstar:~# groupadd -g 1000 hermes | |
| darkstar:~# useradd -u 1000 -g 1000 -d /home/hermes -m hermes | |
| darkstar:~# passwd hermes | |
| While we're at it, check out the disk usage. | |
| darkstar:~# df | |
| Filesystem 1024-blocks Used Available Capacity Mounted on | |
| /dev/hda1 495210 310386 159266 66% / | |
| Not bad, full install takes 310 MB. :) Now shut down. | |
| darkstar:~# shutdown -h now | |
| ... | |
| Power down. | |
| Close the qemu window. | |
| Let's look at the disk usage on the host system. | |
| iris:~$ ls -l Qemu/slack40/slack40.raw | |
| -rw-r--r-- 1 ben ben 524288000 ... | |
| iris:~$ du -sk Qemu/slack40/slack40.raw | |
| 328136 Qemu/slack40/slack40.raw | |
| This shows that slack40.raw is a 500 MB disk image and it takes | |
| 328 MB of space on the host system. | |
| # Jack In To Sneakernet | |
| Look ma, no network stack! It is possible to network BasLinux | |
| through qemu, but out of nostalgia i want to use sneakernet. | |
| Create scripts to mount and unmount the Slackware 4.0 disk image. | |
| This will allow copying files between the host system and the | |
| Slackware 4.0 guest. | |
| iris:~$ cat >mount-slack40.sh <<'__EOF__' | |
| #!/bin/sh | |
| disk="/home/ben/Qemu/slack40/slack40.raw" | |
| log="/mnt/fuse/slack40.log" | |
| dir="/mnt/slack40" | |
| part="1" | |
| # truncate log | |
| cat /dev/null >"$log" | |
| # set up loop device for disk image | |
| loop=$(losetup -f) | |
| losetup -P -f "$disk" | |
| loopdev="${loop}p${part}" | |
| # mount it | |
| sleep 1 | |
| mount "$loopdev" "$dir" | |
| __EOF__ | |
| iris:~$ chmod a+rx mount-slack40.sh | |
| iris:~$ cat >unmount-slack40.sh <<'__EOF__' | |
| #!/bin/sh | |
| disk="/home/ben/Qemu/slack40/slack40.raw" | |
| dir="/mnt/slack40" | |
| # unmount the filesystem | |
| umount "$dir" | |
| # find loop device | |
| loop=$(losetup -a | grep "$disk\$" | cut -d : -f 1) | |
| # detach loop device | |
| losetup -d "$loop" | |
| __EOF__ | |
| iris:~$ chmod a+rx unmount-slack40.sh | |
| # Install BasLinux 3.5 | |
| While BasLinux can boot a system to an X11 desktop using two | |
| floppies, it is not convenient to do so in Qemu. Fortunately, | |
| BasLinux also provides a pre-configured Qemu disk image. | |
| Download the BasLinux disk image. | |
| BasLinux 3.5 Qemu disk image | |
| BasLinux 3.5 other files | |
| "Install" BasLinux disk image. | |
| iris:~$ mkdir -p Qemu/baslinux | |
| iris:~$ cd Qemu/baslinux | |
| iris:~/Qemu/baslinux$ unzip ~/Downloads/bl3-5qem.zip | |
| Archive: /home/ben/Downloads/bl3-5qem.zip | |
| inflating: BL3-5qemu.img | |
| iris:~/Qemu/baslinux$ cd | |
| Make a Qemu startup script. 8 MB RAM should be plenty for X11. | |
| With starting X11, 4 MB RAM would be plenty. | |
| iris:~$ cat >qemu-baslinux.sh <<'__EOF__' | |
| #!/bin/sh | |
| DISK="/home/ben/Qemu/baslinux/BL3-5qemu.img" | |
| SLACK="/home/ben/Qemu/slack40/slack40.raw" | |
| KERNEL="/home/ben/Qemu/baslinux/zimage" | |
| MACH="pc-i440fx-9.2,dump-guest-core=off,mem-merge=off,usb=off" | |
| SAND="on,obsolete=deny,elevateprivileges=deny,spawn=deny" | |
| SAND="${SAND},resourcecontrol=deny" | |
| qemu-system-i386 \ | |
| -accel kvm \ | |
| -machine "$MACH" \ | |
| -overcommit mem-lock=off \ | |
| -no-user-config \ | |
| -sandbox "$SAND" \ | |
| -msg timestamp=on \ | |
| -cpu max \ | |
| -m 8M \ | |
| -global i8042.kbd-throttle=on \ | |
| -device VGA \ | |
| -hda "$DISK" \ | |
| -hdb "$SLACK" \ | |
| -display sdl,gl=off,grab-mod=rctrl \ | |
| -rtc base=localtime | |
| __EOF__ | |
| iris:~$ chmod a+rx qemu-baslinux.sh | |
| iris:~$ ./qemu-baslinux.sh | |
| This will boot BasLinux to the following screen. | |
| BasLinux boot screenshot | |
| Press Enter to go to a shell prompt. | |
| Configure easy access to Slackware 4.0 filesystem. | |
| /<#>echo "/dev/hdb1 /mnt ext2 noauto 0 0" >>/etc/fstab | |
| Configure X11. | |
| /<#>Xsetup | |
| ... | |
| Which screen resolution do you want? | |
| (A) 640x480 (standard VGA) | |
| (B) 640x480x15 (more colors) | |
| (C) 800x600x15 (Super VGA) | |
| C | |
| Which port is your mouse on? | |
| (P) PS/2 mouse (little round plug) | |
| ... | |
| P | |
| How many buttons does your mouse have? | |
| (2) two buttons | |
| (3) three buttons | |
| 3 | |
| Change the default font for rxvt. | |
| ~<#>cp .Xdefaults Xdefaults.bak | |
| ~<#>sed -e 's/9x15/fixed/' <Xdefaults.bak >.Xdefaults | |
| Shut down BasLinux. | |
| /<#>poweroff | |
| The system is halted. Press Reset or turn off power. | |
| Power down. | |
| Close the qemu window. | |
| # Compile Toolset And Copy Into BasLinux | |
| BasLinux doesn't have awk, dialog, nor ed. Let's fix that. | |
| First download some source code. | |
| iris:~$ BASE=https://invisible-island.net/archives | |
| iris:~$ NAME=dialog-1.3-20250116.tgz | |
| iris:~$ curl -o $NAME $BASE/dialog/$NAME | |
| iris:~$ NAME=mawk-1.3.4-20250131.tgz | |
| iris:~$ curl -o $NAME $BASE/mawk/$NAME | |
| iris:~$ BASE=gopher://tilde.pink/9/~bencollver/files/dos/editor | |
| iris:~$ NAME=ed1d.zip | |
| iris:~$ curl -o $NAME $BASE/ed/$NAME | |
| dialog 1.3 (20250116) source code | |
| mawk 1.3.4 (20250131) source code | |
| Beattie ed source code | |
| Now copy the sources into the Slackware 4.0 VM. | |
| iris:~$ su - | |
| Password: | |
| iris:~# /home/ben/mount-slack40.sh | |
| iris:~# cd /home/ben | |
| iris:/home/ben# cp dialog-1.3-20250116.tgz ed1d.zip \ | |
| mawk-1.3.4-20250131.tgz /mnt/slack40/home/hermes/ | |
| iris:/home/ben# ./unmount-slack40.sh | |
| iris:/home/ben# exit | |
| Boot Slackware 4.0 to build the tools. | |
| iris:~$ ./qemu-slack40.sh | |
| Login as root for some local fixes to the headers. | |
| Welcome to Linux 2.2.6 | |
| darkstar login: root | |
| Password: | |
| Linux 2.2.6. | |
| No mail. | |
| darkstar:~# cp /usr/include/wchar.h /usr/include/wchar.bak | |
| darkstar:~# sed \ | |
| -e 's/^\(typedef unsigned \)int \(wint_t;\)$/\1\2/' \ | |
| </usr/include/wchar.bak \ | |
| >/usr/include/wchar.h | |
| darkstar:~# cp /usr/include/ncurses.h /usr/include/ncurses.bak | |
| darkstar:~# sed \ | |
| -e 's/^typedef long int wint_t;$/typedef unsigned wint_t;/' \ | |
| </usr/include/ncurses.bak \ | |
| >/usr/include/ncuirses.h | |
| darkstar:~# exit | |
| logout | |
| Login as hermes. | |
| Welcome to Linux 2.2.6 | |
| darkstar login: hermes | |
| Password: | |
| Linux 2.2.6 | |
| No mail. | |
| Prepare destination directories for toolset. | |
| darkstar:~$ mkdir -p baslinux/bin | |
| darkstar:~$ mkdir -p baslinux/man | |
| Do a static build of the dialog command. | |
| darkstar:~$ tar zxf dialog-1.3-20250116.tgz | |
| darkstar:~$ cd dialog-1.3-20250116 | |
| darkstar:~/dialog-1.3-20250116$ LDFLAGS=-static ./configure | |
| ... | |
| darkstar:~/dialog-1.3-20250116$ make | |
| ... | |
| darkstar:~/dialog-1.3-20250116$ cp dialog ~/baslinux/bin/ | |
| darkstar:~/dialog-1.3-20250116$ GROFF_NO_SGR=1 TERM=dumb groff \ | |
| -Tascii -man dialog.1 | col -b | tr -d '\r' >dialog.txt | |
| darkstar:~/dialog-1.3-20250116$ gzip -c <dialog.txt >dialog.gz | |
| darkstar:~/dialog-1.3-20250116$ cp dialog.gz ~/baslinux/man/ | |
| darkstar:~/dialog-1.3-20250116$ cd | |
| darkstar:~$ strip baslinux/bin/dialog | |
| Do a static build of Beattie ed. | |
| darkstar:~$ unzip ed1d.zip | |
| ... | |
| darkstar:~$ cd ed1d/src | |
| darkstar:~/ed1d/src$ sed -e 's/i586-pc-msdosdjgpp-//' \ | |
| -e 's/ed32\.exe/ed/' <Makefile.dj >Makefile | |
| darkstar:~/ed1d/src$ cp ed.c ed.bak | |
| darkstar:~/ed1d/src$ echo '#define _PROTOTYPE(a, b) a b' >ed.c | |
| darkstar:~/ed1d/src$ cat ed.bak >>ed.c | |
| darkstar:~/ed1d/src$ make LDFLAGS=-static | |
| ... | |
| darkstar:~/ed1d/src$ cp ed ~/baslinux/bin/ed | |
| darkstar:~/ed1d/src$ cd .. | |
| darkstar:~/ed1d$ tr -d '\r' <doc/ed.txt | gzip -c >ed.gz | |
| darkstar:~/ed1d$ cp ed.gz ~/baslinux/man/ed.gz | |
| darkstar:~/ed1d$ cd | |
| darkstar:~$ strip baslinux/bin/ed | |
| Do a static build of mawk. | |
| darkstar:~$ tar zxf mawk-1.3.4-20250131.tgz | |
| darkstar:~$ cd mawk-1.3.4-20250131 | |
| darkstar:~/mawk-1.3.4-20250131$ LDFLAGS=-static ./configure | |
| darkstar:~/mawk-1.3.4-20250131$ make | |
| darkstar:~/mawk-1.3.4-20250131$ cp mawk ~/baslinux/bin/ | |
| darkstar:~/mawk-1.3.4-20250131$ gzip -c <man/mawk.txt >mawk.gz | |
| darkstar:~/mawk-1.3.4-20250131$ cp mawk.gz ~/baslinux/man/ | |
| darkstar:~/mawk-1.3.4-20250131$ cd | |
| darkstar:~$ strip baslinux/bin/mawk | |
| Shut down Slackware 4.0 virtual machine. | |
| darkstar:~$ su - | |
| Password: | |
| darkstar:~# shutdown -h now | |
| ... | |
| Power down. | |
| Close the Slackware 4.0 qemu window. | |
| Boot the BasLinux virtual machine. | |
| iris:~$ ./qemu-baslinux.sh | |
| At "Please press Enter to activate this console." press Enter | |
| Now copy the freshly compiled toolset into the BasLinux VM. | |
| /<#>cd root | |
| ~<#>mount /mnt | |
| ~<#>cp /mnt/home/hermes/baslinux/bin/* /usr/bin/ | |
| ~<#>cp /mnt/home/hermes/baslinux/man/* /usr/man/ | |
| ~<#>ln -s /usr/bin/mawk /usr/bin/awk | |
| ~<#>umount /mnt | |
| ~<#>startx | |
| ~<#>poweroff | |
| # Flip-Card, Unix Style | |
| Earlier this week i wrote about porting the Flip-Card demo | |
| application from TRS-80 BASIC to FreeBASIC. For comparison, now i | |
| will port this demo application to a Unix shell script using awk and | |
| the dialog command. I intend for the data files to be compatible | |
| with the original BASIC code, so FLIP.DAT can be copied as is. | |
| FLIP.BAS for FreeBASIC and QBASIC.EXE | |
| I wrote the initial script using busybox awk on Alpine Linux. | |
| Then i adapted it to run in mawk on BasLinux. The main problem i | |
| ran into was that BasLinux lacks the `mktemp` command. I wrote a | |
| small shell script function to replace `mktemp` on BasLinux. | |
| For whatever reason, it has color output on the console and | |
| monochrome on rxvt. | |
| flip.sh main menu screenshot | |
| flip.sh edit card screenshot | |
| flip.sh main menu screenshot (X11) | |
| flip.sh edit card screenshot (X11) | |
| Here are links for the script and a sample data file. | |
| flip.sh | |
| FLIP.DAT | |
| tags: occ2025,retrocomputing | |
| # Tags | |
| occ2025 | |
| retrocomputing |