From c08e22bbb226696a64764be9b466a02a3ab0d93f Mon Sep 17 00:00:00 2001 From: hachti Date: Wed, 9 Feb 2005 16:58:45 +0000 Subject: [PATCH 1/1] Initial revision --- bin/asm | 43 ++++ bin/frtn | 50 +++++ docs/HOWTO | 150 +++++++++++++ docs/manual/Makefile | 8 + docs/manual/assembler.tex | 77 +++++++ docs/manual/body.tex | 7 + docs/manual/compiler.tex | 6 + docs/manual/main.tex | 17 ++ lib/fortran/original/flib1 | Bin 0 -> 28410 bytes lib/fortran/original/flib2 | Bin 0 -> 25457 bytes lib/fortran/original/flib3 | Bin 0 -> 12462 bytes lib/fortran/original/fort.lib | Bin 0 -> 69438 bytes lib/fortran/src/f$w1.asm | 80 +++++++ lib/fortran/src/f$w4.asm | 79 +++++++ lib/fortran/src/fpatch.asm | 173 +++++++++++++++ lib/fortran/src/pchar.asm | 31 +++ lib/fortran/src/pchar_lp.asm | 27 +++ lib/fortran/src/uc.asm | 20 ++ lib/iolib/original/I$AB | Bin 0 -> 845 bytes lib/iolib/original/I$AI | Bin 0 -> 1039 bytes lib/iolib/original/O$AB | Bin 0 -> 693 bytes lib/iolib/original/O$AH | Bin 0 -> 731 bytes lib/iolib/original/O$AI | Bin 0 -> 855 bytes lib/iolib/src/i$pa.asm | 236 ++++++++++++++++++++ lib/iolib/src/o$al.asm | 223 +++++++++++++++++++ lib/iolib/src/o$la.asm | 338 +++++++++++++++++++++++++++++ lib/iolib/src/o$pb.asm | 178 +++++++++++++++ lib/iolib/src/o$pl.asm | 204 +++++++++++++++++ programs/first-steps/src/hui1.f | 31 +++ programs/first-steps/src/hui2.f | 42 ++++ programs/first-steps/src/muz.f | 14 ++ programs/first-steps/src/print.f | 9 + programs/first-steps/src/spiel.asm | 73 +++++++ programs/mandelbrot/Makefile | 19 ++ programs/mandelbrot/src/apfel.f | 170 +++++++++++++++ programs/mandelbrot/src/apfel1.f | 142 ++++++++++++ programs/mandelbrot/src/apfel2.f | 248 +++++++++++++++++++++ programs/tools/src/asr-test.asm | 96 ++++++++ programs/tools/src/cleanup.asm | 46 ++++ slst/frtn.slst | Bin 0 -> 26499 bytes slst/super2.txt | 5 + snippets/endseq | Bin 0 -> 16 bytes sys/dap.sys | Bin 0 -> 288543 bytes sys/frtn.sys | Bin 0 -> 290527 bytes sys/super2.sys | Bin 0 -> 284382 bytes 45 files changed, 2842 insertions(+) create mode 100755 bin/asm create mode 100755 bin/frtn create mode 100644 docs/HOWTO create mode 100644 docs/manual/Makefile create mode 100644 docs/manual/assembler.tex create mode 100644 docs/manual/body.tex create mode 100644 docs/manual/compiler.tex create mode 100644 docs/manual/main.tex create mode 100644 lib/fortran/original/flib1 create mode 100644 lib/fortran/original/flib2 create mode 100644 lib/fortran/original/flib3 create mode 100644 lib/fortran/original/fort.lib create mode 100644 lib/fortran/src/f$w1.asm create mode 100644 lib/fortran/src/f$w4.asm create mode 100644 lib/fortran/src/fpatch.asm create mode 100644 lib/fortran/src/pchar.asm create mode 100644 lib/fortran/src/pchar_lp.asm create mode 100644 lib/fortran/src/uc.asm create mode 100644 lib/iolib/original/I$AB create mode 100644 lib/iolib/original/I$AI create mode 100644 lib/iolib/original/O$AB create mode 100644 lib/iolib/original/O$AH create mode 100644 lib/iolib/original/O$AI create mode 100644 lib/iolib/src/i$pa.asm create mode 100644 lib/iolib/src/o$al.asm create mode 100644 lib/iolib/src/o$la.asm create mode 100644 lib/iolib/src/o$pb.asm create mode 100644 lib/iolib/src/o$pl.asm create mode 100644 programs/first-steps/src/hui1.f create mode 100644 programs/first-steps/src/hui2.f create mode 100644 programs/first-steps/src/muz.f create mode 100644 programs/first-steps/src/print.f create mode 100644 programs/first-steps/src/spiel.asm create mode 100644 programs/mandelbrot/Makefile create mode 100644 programs/mandelbrot/src/apfel.f create mode 100644 programs/mandelbrot/src/apfel1.f create mode 100644 programs/mandelbrot/src/apfel2.f create mode 100644 programs/tools/src/asr-test.asm create mode 100644 programs/tools/src/cleanup.asm create mode 100644 slst/frtn.slst create mode 100644 slst/super2.txt create mode 100644 snippets/endseq create mode 100644 sys/dap.sys create mode 100644 sys/frtn.sys create mode 100644 sys/super2.sys diff --git a/bin/asm b/bin/asm new file mode 100755 index 0000000..883225d --- /dev/null +++ b/bin/asm @@ -0,0 +1,43 @@ +#!/bin/bash +# Assembler wrapper for simh h316 + +if [ ! $1 ] ; then + echo "Argument fehlt!" + exit 2 +fi + +name=`basename $1 .asm` +listfile=$name.lst + +cat $1 | tab | paron > $name.par +rm -f $name.lst +rm -f $name.obj + +echo "rest $H316/sys/dap.sys" > $name.go +echo "d a 120420" >> $name.go +echo "at ptr $name.par" >> $name.go +echo "at ptp $name.obj" >> $name.go +echo "at tty3 $listfile" >> $name.go +echo "set tty3 uascii" >> $name.go +echo "set tty3 start" >> $name.go +echo "go" >> $name.go +echo "d ptr pos 0" >> $name.go +echo "go" >> $name.go +echo "quit" >> $name.go +h316 $name.go > /dev/null + +rm -f $name.par +rm -f $name.go + +if cat $name.lst | grep "NO ERRORS IN ABOVE ASSEMBLY">/dev/null 2>&1; then + if [ ! $2 ]; then + rm $name.lst + fi + echo "DAP-16 assembly successfull :-)" + exit 0 +fi +cat $name.lst +echo -e "\nDAP-16 assembly FAILED!" +rm -f $name.obj +exit 77 + diff --git a/bin/frtn b/bin/frtn new file mode 100755 index 0000000..c1d14b7 --- /dev/null +++ b/bin/frtn @@ -0,0 +1,50 @@ +#!/bin/bash +# FORTRAN IV compiler wrapper for simh h316 + +if [ ! $1 ] ; then + echo "Argument fehlt!" + exit 2 +fi + +name=`basename $1 .f` +listfile=$name.lst + +cat $1 | tab | paron > $name.par +rm -f $name.lst +rm -f $name.obj + +echo "rest $H316/sys/frtn.sys" > $name.go + +echo "r" >> $name.go + +echo "at ptr $name.par" >> $name.go +echo "at ptp $name.obj" >> $name.go +echo "at tty3 $listfile" >> $name.go +echo "set tty3 uascii" >> $name.go +echo "set tty3 start" >> $name.go + +echo "d a 311" >> $name.go +echo "d p 1000" >> $name.go + +echo "go" >> $name.go +echo "quit" >> $name.go +h316 $name.go > /dev/null + +rm -f $name.par +rm -f $name.go + +if cat $name.lst | egrep "[*]{36,40}">/dev/null 2>&1; then + cat $name.lst + echo -e "\n\nFORTRAN IV compilation FAILED!" + rm -f $name.obj + exit 77 +fi + +if [ ! $2 ]; then + rm $name.lst +fi +echo "FORTRAN IV compilation successfull." +exit 0 + + + diff --git a/docs/HOWTO b/docs/HOWTO new file mode 100644 index 0000000..933aef3 --- /dev/null +++ b/docs/HOWTO @@ -0,0 +1,150 @@ +How to build the mandelbrot-demo program + +1. Needed + + - source files (found in mandelbrot-demo.tar.gz): + apfel.f + pchar.asm + + - compiler, assembler, loader, punch program (found in tape-images.new.tar.gz): + SLST-FRTN.img + SLST-LDR-APM.img + OBJECT-PAL-AP.img + SLST-DAP-16.img + + - fortran library, 3 files (found in tape-images.new.tar.gz): + LIBRARY-FORT_LIB_1.img + LIBRARY-FOR_LIB_2S.img + LIBRARY-FORT_LIB_3.img + + +1. Prepare source files. + - You have to change the source files to line termination (MS-DOS style) + - Then you have to set the 8th bit on all data - yes, you can't it read anymore... + There are also some tricks with an & in the emulator... + + - Remove my header from the SLST files. In library files no problem. + + - If you use the Emulator: go to step 2. + - If you use the original machine: punch out the source tapes :-) + +2. Build pchar routine + PCHAR is a little assembler routine allowing simplest unformatted io. + + - Boot SLST-DAP-16.img + - MSTCLR + - A reg: Set bits: + -1 Two-pass assembly + -3 Input from high-speed paper tape + -11 NO object output + -12 Listing on teletype + - P reg: '1000 + + + Real machine: + + - Mount the source tape into the high speed reader, turn on ASR + - press START and wait..... + - Assembly should stop at the end of text on the tape. Tape should not + run out. + - Reposition tape to the beginning. + - Press start again. + - After completion the assembler says "AC". With or without errors!! + + Now you have a listing. Let's build the object file: + + - Mount the source tape into the high speed reader, turn on ASR punch + - A-reg bits 1-3-7-16 (no listing, object to asr, no listing) + - P-REG 1000 + - Reposition tape to the beginning. + - Press start again. + - After completion the assembler says "AC". With or without errors!! + + Now you have the pchar object. Need it later. + + Emulator: + - Same register settings as on real machine. + - Press START, emulator will ask for "ptr" file. + - enter "pchar.par" or whatever you have chosen for the converted file. + - The assembler will stop. + - Press START again. + - Will say EOF and ask for more paper. give source file again. + - Should print listing and say "AC" + + Make the object: + - A-reg 1-3-8-16, P-reg '1000 + - Same procedure but answer the questions "ptp" with your new + object's filename, "pchar.obj" for example. + - Notice: look closely if you're asked for PTP or PTR. If you enter your + source file name at PTP it will be erased instantly!! + - Leave emulator program. Important to really close. + + Now you have the pchar object. Need it later. + + NOTICE: Sometimes the emulator asks for a file + and does not echo your keystrokes. + BUT IT WORKS!!!! + + +3. Build mail object file + - That's easier than using the two-pass assembler....! + - Boot SLST-FRTN.img + - MSTRCLR + - A-reg settings: + -'000310: Listing on ASR, suppress verbosity by setting sense switch 2 + -'000302: Object output to ASR + - Operation: + -Start at '1000 like with the assembler. But only one pass. + -Will type "end of job".... + - Now you should have two different object tapes or files. + - Leave emulator!!!! + +4. Putting all together + - Boot SLST-LDR-APM.img + - MSTRCLR + - Change contents of memory address '15000 to '17777 or '37777 + - MSTRCLR + - A-reg '17000, P-reg '16000 + - OBJECT-PAL-AP.img needed. Mount tape now if using real hardware + - Press START TWICE + - if using emulator, enter "OBJECT-PAL-AP.img" at the PTR prompt + - LDR-APM now loads PAL-AP. Should say LC when ready. If it says CK you + have a checksum error on the tape. If tape runs out you have a problem + + Now load apfel.obj: + - MSTRCLR + - P-reg '16000 A-reg '1000 + - now the usual sequence "tape and start" for real machine, and "start and tape" + for emulator. using apfel.obj + - Will say MR. Means that you have unresolved symbols. + - If you like to you can set P-reg to '16002' and start. You'll get a memory map. + + - Go on loading with pchar.obj. Loading continues if START is pressed + - Now process the library files the same way. The order is important. 1,2,3 + - If you have managed this you will get LC (loading complete). + + Now the application is ready to run. But wait! Don't you want to generate a + self loading system tape (SLST) with PAL-AP? Sure! So you can always restore the + actual state without doing all the patching stuff. + + - Punch on ASR on. + - P-reg '17000', A-reg set only bit 1. + - Press START. Computer will halt. + - Enter '100 to A-reg and press START. Will halt again. + - Enter '6700 to A-reg and press START. Will begin to punch + self loading tape. (or ask for file etc... ASRPTP) + + Now you have the SLST and can easily load the program by booting the tape. + +5. Start the program + - When the program is loaded start the computer at '1000. That's all. + - When program is ready PA will be printed and CP halts. If you press START + it will start a new run. + +6. Good luck. I hope I have described enough... + + + + + + diff --git a/docs/manual/Makefile b/docs/manual/Makefile new file mode 100644 index 0000000..c137ac3 --- /dev/null +++ b/docs/manual/Makefile @@ -0,0 +1,8 @@ +all: *.tex + latex main.tex && dvips -omain.ps main.dvi + +clean: + rm -f *.toc *.ps *.pdf *.dvi *.aux *.log + + +.PHONY: clean diff --git a/docs/manual/assembler.tex b/docs/manual/assembler.tex new file mode 100644 index 0000000..427440e --- /dev/null +++ b/docs/manual/assembler.tex @@ -0,0 +1,77 @@ +\chapter{DAP-16 Assembler} + +\section{Quelltextformat} +Das meiste Kopfzerbrechen, das mir die Benutzung des Assemblers beschert hat, rührte +daher, daß ich das Quelltextformat nicht komplett begriffen hatte.\\ +Deswegen möchte ich hier die beiden zulässigen Formate genau beschreiben. +\subsection{Festformat} + +Alles stammt von der Lochkarte ab. Das ist ein immer wieder wichtiger Merksatz.\\ +Im Festformat besteht jede Zeile aus exakt 72 (?) Zeichen, gefolgt von einem \verb:: +(ASCII 10) Zeichen. +Ein dem \verb:: vorangestelltes \verb:: wird geduldet, ist aber unnötig. +Dabei gilt die folgende Zeileneinteilung:\\ +\begin{center} +\begin{tabular}{r|p{4em}|p{0.1cm}|l|l|l|l } + Position: & 1-4 & & 6-10 & & 12-30 & 30-72 \\ \hline + Aufgabe: & Marke & & Befehl & & Argumente & Kommentar \\ +\end{tabular} +\end{center} +\vspace{1em} +Beispiel: +\begin{verbatim} +STRT LDA OP1 DIES IST EINE ASSEMBLERZEILE +\end{verbatim} + +\subsection{Tabulatorformat} +Das Tabulatorformat wurde eingeführt, um bei Benutzung von Lochstreifen nicht immer jede Zeile +komplett vollschreiben bzw. mit Leerzeichen auffüllen zu müssen. Als Tabulatorzeichen wird der +Backslash (\verb:\:) benutzt. Mit dem Backslash kann man zum nächsten Feld springen, sich also +die Leerzeichen und die Zählerei sparen. Allerdings sieht eine auf dem ASR geschriebene Codezeile +im Tabulatorformat nicht sehr übersichtlich aus.\\ +Hier das Beispiel von oben im Tabulatorformat: +\begin{verbatim} +STRT\LDA\OP1\DIES IST EINE ASSEMBLERZEILE +\end{verbatim} +Wenn Felder leer bleiben sollen, z.B. das Markenfeld am Anfang, muß trotzdem der entsprechende +Backslash eingefügt werden: +\begin{verbatim} +\ICA\\ZEILE OHNE MARKE UND OPERAND +\end{verbatim} + +\subsection{Quelltexte aus dem PC} +Wenn man DAP-16-Quelltext auf dem PC schreibt, bietet es sich an, echte \verb::-Zeichen zu +benutzen und diese dann kurz vor der Benutzung automatisiert in Backslashes umzuwandeln.\\ +Wichtig ist auch, daß der Assembler (der FORTRAN IV Compiler auch!) +alle Eingangsdaten als 7 bit ASCII plus gesetztem achtem Bit erwartet. +Andere Zeichen werden ignoriert!!\\ +Dafür braucht man ein kleines Filterprogramm. + +\section{Assemblieren} +\begin{enumerate} +\item Assembler in den Kernspeicher laden. +\item A-Register mit Einstellungen füllen. +\item Quelltext in Lochstreifenleser einlegen. +\item \verb:START: am Computer drücken, warten. +\item nach dem ersten Durchlauf Band wieder einlegen, wieder \verb:START: drücken. +\end{enumerate} +\vspace{0.5cm} +Einstellungen für's A-Register: +\begin{verbatim} +Bit 1: Immer setzen für 2-pass-Assemblierung + +Auswahl der Quelle für den Quelltext: +Bit 2: Teletype +Bit 3: Lochstreifenleser + +Auswahl des Ziels für Objektdaten: +Bit 7: Teletype +Bit 8: Locher +Bit 11: Keinen Objektcode ausgeben + +Auswahl des Ziels für das Listing: +Bit 12: Teletype +Bit 13: Locher +Bit 15: Zeilendrucker +Bit 16: Kein Listing +\end{verbatim} diff --git a/docs/manual/body.tex b/docs/manual/body.tex new file mode 100644 index 0000000..383ec3e --- /dev/null +++ b/docs/manual/body.tex @@ -0,0 +1,7 @@ +\input{assembler} +\input{compiler} + + + + + diff --git a/docs/manual/compiler.tex b/docs/manual/compiler.tex new file mode 100644 index 0000000..eedfa8a --- /dev/null +++ b/docs/manual/compiler.tex @@ -0,0 +1,6 @@ +\chapter{FORTRAN IV Compiler} +\section{Kompilieren} +\subsection{Einstellungen im A-Register} +\begin{verbatim} + +\end{verbatim} \ No newline at end of file diff --git a/docs/manual/main.tex b/docs/manual/main.tex new file mode 100644 index 0000000..50ef49f --- /dev/null +++ b/docs/manual/main.tex @@ -0,0 +1,17 @@ +\documentclass[twoside]{book} +\usepackage{a4wide} +\usepackage[latin1]{inputenc} +\usepackage[german]{babel} +\usepackage{graphics} + +\begin{document} +\sffamily + +\author{Philipp Hachtmann} +\title{H316 - Kurzanleitung\\{\large - vorl\"aufige Ausgabe -}} +\maketitle +\tableofcontents +\renewcommand{\labelenumi}{\arabic{enumi}. } + +\input{body} +\end{document} diff --git a/lib/fortran/original/flib1 b/lib/fortran/original/flib1 new file mode 100644 index 0000000000000000000000000000000000000000..d7df936c0b563f0d7bf06374314d32045b365b92 GIT binary patch literal 28410 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 literal 0 HcmV?d00001 diff --git a/lib/fortran/original/flib3 b/lib/fortran/original/flib3 new file mode 100644 index 0000000000000000000000000000000000000000..da809d8c541454e64337b2abe2dec1af07e927f9 GIT binary patch literal 12462 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 literal 0 HcmV?d00001 diff --git a/lib/fortran/original/fort.lib b/lib/fortran/original/fort.lib new file mode 100644 index 0000000000000000000000000000000000000000..87229cda2734be3a4d46f41b5abe44c2d81b62e1 GIT binary patch literal 69438 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 literal 0 HcmV?d00001 diff --git a/lib/fortran/src/f$w1.asm b/lib/fortran/src/f$w1.asm new file mode 100644 index 0000000..a94def7 --- /dev/null +++ b/lib/fortran/src/f$w1.asm @@ -0,0 +1,80 @@ +* (F$W1) HACHTI-NACHBAU REV.A +* +* +* +* +* PROGRAM TITLE: F$W1 +* OUTPUT BCD ON ASR +* +* +* +* USE +* +* CALLING SEQUENCE +* +* CALL F$W1 +* DAC N WHERE N IS THE LOCATION OF THE FORMAT +* DESCRIPTOR LIST +* + SUBR F$W1,FW1 + REL +FW1 DAC ** + CALL F$IO +FW1A DAC ** + LDA* FW1A + STA FW1H + LDA* FW1H +* + LRL 8 + CAS ='261 + JMP FW1B + JMP FW1C + CAS *+1 + OCT 260 + JMP FW1D + CAS ='255 + JMP FW1B + JMP FW1F + CAS ='253 + JMP FW1B + JMP FW1F +FW1B JST FW1J + JMP FW1G +FW1C JST FW1J + CAS =-60 + JMP FW1C + JMP FW1F + JMP FW1C +FW1D JST FW1J +FW1E JST FW1J +FW1F LDA* FW1H + ANA ='377 + ERA ='120000 + STA* FW1H +FW1G CALL O$AC + CALL O$AP +FW1H *** ** + IRS FW1A + JMP* FW1A +FW1J DAC ** + CALL O$AF + IRS CNTR + JMP* FW1J + LDA =-17 + STA CNTR +* +FW1K CALL O$AF + IRS CNTR + JMP FW1K + LDA =-60 + STA CNTR + JMP* FW1J +CNTR OCT -60 +FW1L LDA ='377 + LLL 8 + STA* FW1H + JMP FW1G+1 + END + + + diff --git a/lib/fortran/src/f$w4.asm b/lib/fortran/src/f$w4.asm new file mode 100644 index 0000000..4d1f05e --- /dev/null +++ b/lib/fortran/src/f$w4.asm @@ -0,0 +1,79 @@ +* (F$W4) REBUILD 1 +* +* +* +* PROGRAM TITLE: F$W4 +* OUTPUT BCD ON LINE PRINTER +* +* +* +* USE +* +* CALLING SEQUENCE +* +* CALL F$W4 +* DAC N WHERE N IS THE LOCATION OF THE FORMAT +* DESCRIPTOR LIST +* + SUBR F$W4,FW4 +* +* +* + REL +FW4 DAC ** + CALL F$IO +FW4A DAC ** + LDA* FW4A + STA FW4H + LDA* FW4H +* + LRL 8 + CAS ='261 + JMP FW4B + JMP FW4C + CAS *+1 + OCT 260 + JMP FW4D + CAS ='255 + JMP FW4B + JMP FW4F + CAS ='253 + JMP FW4B + JMP FW4F +FW4B JST FW4J + JMP FW4G +FW4C JST FW4J + CAS =-60 + JMP FW4C + JMP FW4F + JMP FW4C +FW4D JST FW4J +FW4E JST FW4J +FW4F LDA* FW4H + ANA ='377 + ERA ='120000 + STA* FW4H +FW4G CALL O$LC CARRIAGE RETURN ONLY + CALL O$LP OUTPUT ONE LINE OF INFORMATION +FW4H *** ** + IRS FW4A + JMP* FW4A +FW4J DAC ** + CALL O$PF LF ONLY + IRS CNTR + JMP* FW4J + LDA =-17 + STA CNTR +* +FW4K CALL O$PF LF ONLY + IRS CNTR + JMP FW4K + LDA =-60 + STA CNTR + JMP* FW4J +CNTR OCT -60 +FW4L LDA ='377 + LLL 8 + STA* FW4H + JMP FW4G+1 + END diff --git a/lib/fortran/src/fpatch.asm b/lib/fortran/src/fpatch.asm new file mode 100644 index 0000000..4254847 --- /dev/null +++ b/lib/fortran/src/fpatch.asm @@ -0,0 +1,173 @@ +* (FPATCH) REV.B (6.2.2005) +* +* +* COMPUTER: H316 +* +* PROGRAM CATEGORY: I/O LIBRARY +* +* PROGRAM TITLE: FPATCH +* FORTRAN COMPILER PATCH +* +* +* AUTHOR +* +* PHILIPP HACHTMANN +* +* REVISIONS +* REV. B (6.2.2005) ADDED CORRECT DATA POOL ENTRY MANIPULATION +* +* PURPOSE +* +* THIS PATCH IS TO ENABLE THE FORTRAN IV COMPILER TO USE THE +* O$LA AND O$LH SUBROUTINES +* +* +* RESTRICTIONS +* +* DEPENDS ON HACHTI'S HARDWARE AND FORTRAN IV COMPILER TAPE +* +* +* STORAGE +* +* 50 (OCTAL) +* 40 (DECIMAL) +* +* +* USE +* +* THE LIBRARY ROUTINES ARE FOR GENERAL PURPOSE. +* TO APPLY THE PATCH: +* - BOOT FRTN SYSTEM TAPE +* - LOAD O$LA AT LOCATION '20000 +* - LOAD FPATCH SOMEWHERE ABOVE +* - RUN FROM FIRST LOCATION OF FPATCH +* +******************************************************************************** + SUBR FPATCH,PTCH ONLY FOR NAMING PURPOSES +******************************************************************************** +* +IOSB EQU '15036 IOS' BASE ADDRESS +IOSS EQU '36 INNER SECTOR OFFSET +PT1 EQU '611 FIRST FREELY USABLE ADDRESS IN IOS' SPACE +PT2 EQU '612 SECOND FREELY USABLE ADDRESS IN IOS' SPACE +PTE EQU '610 ADDRESS WHICH MUST BE FILLED WITH "V?" +PTS EQU '635 MESSAGE SIZE OF "DEVICE?" ERROR MESSAGE +JH EQU '173 ADDRESS OF CALL O$LH INSTRUCTION IN IOS +JL EQU '252 ADDRESS OF CALL O$LA INSTRUCTIIN IN IOS +DUM EQU '16612 DUMY OBJECT'S BASE ADDRESS +DPO EQU '16 ADDRESS OF ORIGINAL DUMY'S OWN BASE POINTER +* +JSTI EQU '121000 JST* INSTRUCTION +* + REL LET'S BEGIN RELATIVE + SUBR ENDPAL,FNS END OF THE IMPORTANT PART + REL RELATIVE MODE +ND1 *** ** + *** ** + *** ** + *** ** +ND2 *** ** +* +* + ABS ABSOLUTE MODE + ORG '21000 +PTCH NOP + LDX IOS ADDRESSES WILL BE RELATIVE TO IOS' BEGINNING + LDA OLHA O$LH ADDRESS (OK) + STA PT1,1 STORE TO POINTER LOCATION (OK) + LDA OLLA O$LA ADDRESS (OK) + STA PT2,1 STORE TO POINTER LOCATION (OK) + LDA VQ LOAD "V?" (OK) + STA PTE,1 REPAIR "DEV?" MSG (OK) + LDA ='-4 + STA PTS,1 NEW MESSAGE SIZE (OK) +* + LDA JMP1 NEUER SPRUNG + STA JH,1 + LDA JMP2 + STA JL,1 +************** +* + LDA ND2P ADDRESS OF NEW "DUMMY ROUTINE" + STA* DP STORE TO VARIABLE IN ORIGINAL DUMMY ROUTINE + LDA ND1P1 + STA '100 + AOA + STA '101 + AOA + STA '102 + AOA + STA '103 + AOA + STA '104 + AOA + STA '105 + AOA + STA '106 + AOA + STA '107 + AOA + STA '110 + AOA + STA '111 + AOA + STA '112 +* +********** +* READY + LDA OK LOAD OK + ICA + OCP '104 + OTA 4 + JMP *-1 + ICA + OTA 4 + JMP *-1 + LDA CRLF + ICA + OTA 4 + JMP *-1 + ICA + OTA 4 + JMP *-1 + HLT + JMP *-1 +* +********** +* +* KONSTANTEN +VQ BCI 1,V? +CRLF OCT 6412 +OK BCI 1,OK +OLLA XAC O$LA +OLHA XAC O$LH +* +IOS DAC IOSB IOS BASE ADDRESS +DP DAC DUM+'52 "DP" VARIABLE ADDRESS +ND1P DAC ND1,1 NEW DUMMY ROUTINE'S BASE ADDRESS + INDEX BIT +ND2P DAC ND2 NEW DUMMY ROUTINE'S START ADDRESS +* +DUMB DAC DUM ORIGNAL DUMMY'S START ADDRESS +* POINTER USW +JMP1 DAC JSTI+PT1+IOSS +JMP2 DAC JSTI+PT2+IOSS +* +******************************************************************************* +* +* +* ORG '100 +* DAC NDUM-4,1 +* DAC NDUM-3,1 +* DAC NDUM-2,1 +* DAC NDUM-1,1 +* DAC NDUM,1 +* DAC NDUM+1,1 +* DAC NDUM+2,1 +* DAC NDUM+3,1 +* DAC NDUM+4,1 +* DAC NDUM+5,1 +* DAC NDUM+6,1 +* +* PUH..... +* + END diff --git a/lib/fortran/src/pchar.asm b/lib/fortran/src/pchar.asm new file mode 100644 index 0000000..1c2f160 --- /dev/null +++ b/lib/fortran/src/pchar.asm @@ -0,0 +1,31 @@ +* PRINT CHAR +* +* +****** USAGE +* +* JST PCHAR +* DAC Arg1 +* +* +* + SUBR PCHAR,P + REL +* +* +P DAC ** + LDA* P ERSTE ARG-ADRESSE + STA TMP1 POINTER + LDA* TMP1 IN +**** OCP '104 ASR START + SKS 4 WAIT FOR ASR33 + JMP *-1 TO BECOME READY + CAL CLEAR UPPER BITS + OTA 4 OUTPUT CHAR + JMP *-1 SECURITY + IRS P RETURN ADDRESS + JMP* P +******* +TMP1 DEC 0 +TMP2 DEC 0 +******* + END diff --git a/lib/fortran/src/pchar_lp.asm b/lib/fortran/src/pchar_lp.asm new file mode 100644 index 0000000..5bb3e5b --- /dev/null +++ b/lib/fortran/src/pchar_lp.asm @@ -0,0 +1,27 @@ +* PRINT CHAR - ON LINEPRINTER :-) +* +* +****** USAGE +* +* JST PCHAR +* DAC Arg1 +* +* +* + SUBR PCHAR,P + REL +* +* +P DAC ** + LDA* P ERSTE ARG-ADRESSE + STA TMP1 POINTER + LDA* TMP1 IN + OTA 0 OUTPUT CHAR + JMP *-1 SECURITY + IRS P RETURN ADDRESS + JMP* P +******* +TMP1 DEC 0 +TMP2 DEC 0 +******* + END diff --git a/lib/fortran/src/uc.asm b/lib/fortran/src/uc.asm new file mode 100644 index 0000000..a2704dd --- /dev/null +++ b/lib/fortran/src/uc.asm @@ -0,0 +1,20 @@ +* UPPER CHAR +* UC(INTEGER) RETURN THE ARGUMENT'S FIRST 8 BIT IN LOWER 8 BIT +* +* USAGE: +* JST UC +* DAC ARG1 +* +* RESULT WILL BE IN A-REG +* +* +******* + REL + SUBR UC +UC DAC ** + LDA* UC + IRS UC RETURN ADDRESS + ICL + JMP* UC +******* + END diff --git a/lib/iolib/original/I$AB b/lib/iolib/original/I$AB new file mode 100644 index 0000000000000000000000000000000000000000..0c37ab98d4ac3b0792080594838ba249aa7d141d GIT binary patch literal 845 zcmYjPi)!335FD+HA6T(OxU>h(r`lMFkK;<5_GtP7hxki_J1d8~2rREwv!l_h9>8&c zJ04siy~HhW$Cv{z57+??*lU;pLBY&%b<*qw?EdB(;#Wd&8VvCUwsIw44L`@k+>C#& zR5^B9_KAuD`eCE8OoJkTj0}cUy^HAQGLmYKuqyc!(Y1(~Oq6C2ZPkddB;bZyd252; zn%N}o33jdigAxji9-6nATUb%=;cp+)jgsE? zG8my@s^vqJ(@&p#>7QIj4(c6} zK_7uhdad@9zSL^a^EspEL2jlq;bo9IVLb1lmRV-J+Pd=ImXDwrDM@=7_!_Kd!@Rbz zA;!;4b{ebQc0Cw~UyQ3D<(1i?p6JwKLn$d7M{ zfGT0$aQAjyEx22@)hlrc4K>s+3l|j|$r`)3Kq?|oG_RLpDe$G>Y6J15-sdm>0W=tH A;{X5v literal 0 HcmV?d00001 diff --git a/lib/iolib/original/I$AI b/lib/iolib/original/I$AI new file mode 100644 index 0000000000000000000000000000000000000000..04d03f4d9c565843c6fee26d65e4ea12a0e5fc33 GIT binary patch literal 1039 zcmZ`&U2oek3_MYSKVZo+hI%XJZ2P0p?4-d~AZ}5hFGU?R|FqpvNt34ua6-vP>h4Hy zz;%HCv-4%0WXgd#2fuRA^3@p9RJ!la8{7aMxCKK8behgH?(X&UQYVceBg~W${P|J= z*7>6*wS(}y)e{4o{4E2Yid@f{$rYZMeZ}e?aa&yP3b@g_m%B2<)U5xHC{;rmPYBCI z1ZC9mZo|9%V+FH6Um3^JP?UoVR)Y$^ho~}nvS4y+(uxBEH&3W7g@l=yk#)kulOx^E zz(1)g#1IVAR5{)4rE_+6SdZu=JnYcj5nS-ZWiOn*QjB*fM$F%`qRjUlofXfFJu?zB z%7H*3up|X5XD+;%#VjV9S`n2fHX5v87#9`&l+FgG+ohs-_0SLlPX!Gtd$twM$&2ca zyu#K5H%$hwsM5LIJD6&+p%wK-3{A8XEq%{?4I62CmtG)rY7_z=9i5U%T&uy^j%F~F z+TuhrPytLDM%LJYjQ!`xkx^JqR&cmrHng^$QExVvhMO(=Eq9c|@%u~+AEzu?F>A{* z=(MYxx?;X(!|771&0N^JsKK6GBlQL)9qDAaW6UW^y2l8EY+PxkIF799rOs z&rd#~{(B|%ivIPwThK43oeDW<7T1r%74e4t?YcXnKjxi&LF$vPiYjGf5LrMhgTSjr oCpsJuk6JeI$vv+*4jQ8^r%PR8zv>r65+t8LT>euW*9y=705+kBx&QzG literal 0 HcmV?d00001 diff --git a/lib/iolib/original/O$AB b/lib/iolib/original/O$AB new file mode 100644 index 0000000000000000000000000000000000000000..5220c0cae74ceb407a3e1fc160ac09b06e1f5f0f GIT binary patch literal 693 zcmZ`%%WA_g5F9v?hU0wy4sLI2))Z6Le?YU&O((ifoaBy=aRM=SNlOu>P!|HofO%9SfW{BL zRn_Pb4jL0!XTav9?=W&`%JUOpu8##NhlQILbl+ybZ{`L4Rmg(m59q@(E5s`mJob0O z6^G_H8C~B&HRhSO+Ki$j6?24Oro6NytIK_HV^4$q;UI=J_}YV1kjNq{67=-^A!EYT^hJhi9=ljGj76AS$h!=7 zZeJrm%MHpu7nUN*(J5BsGATg^D9s|`p|wJigQ?0O=-e}Sat)C~m~82Q%(<*z_Q*SW zVhUIpih@%VyOihG&sA-j5s&Fd^P%_IE4XY(z#rJ1Z@Wm}tIf#1{eb2e3q|>oNQk;f z?ytQK&^0U3_yioTCv)bMz=q&F%2}^&hCpUd-rNPJ(3l*=!u8WD?3|YwjS&nN5QNu* zjQ88BS142bmP##+T~65T*kh~{czgd9Tme>Nena~0=i;5oAusW%_lUM zg!fgLR!Qd~)F`fh#I$DwtBc25oB{!ugVF-6lrzS+wL}knl8+@r<&we2i35xcA5s(- zY=>GR3T6^SgfuCCZB%B2jg8|Yz}(#&XGNS!-@~jznELMjjH!4?exG4jh$uwu6T+9v zm<(&E&4?9t$R-RKX(1wv!k0(@k%=zEc5oCr(+@rGtlhinT{c~WwaIomUnr2=c72Z$lUcli6svB0EOpcnHR&O+PMV5Lw zipGezFXq}}F8Ts~iMae3xKPBgbg-e7j(uX;e9g|i6I6?8N0u(E0fkoEKup<^>bMgY zW+AyZTT7Vp=luz6SukTo3KDMEiNCaSEir-S>Tpi#0yDWzoG{)Rxnjwm?S1p)nZeaM zH2#-4vD^Rc`@zEZQuWvBBuF0GeFAvb0Mg=0qANffipYqT4vr~uMd1i&c)F-q*Y`*M VSIl1dHZPw;`2hG?5S!}~kKeHjchmp? literal 0 HcmV?d00001 diff --git a/lib/iolib/src/i$pa.asm b/lib/iolib/src/i$pa.asm new file mode 100644 index 0000000..a5e3033 --- /dev/null +++ b/lib/iolib/src/i$pa.asm @@ -0,0 +1,236 @@ +* (I$PA) +* +* +* COMPUTER: H316 +* +* PROGRAM CATEGORY: I/O LIBRARY +* +* PROGRAM TITLE: I$PA (I$PI) +* +* +* REVISIONS: +* 0.1 (2005-02.04) +* +* AUTHOR +* +* PHILIPP HACHTMANN +* +* +* PURPOSE +* +* TO READ ASCII SOURCE TEXT FROM HIGH SPEED PAPTER TAPE READER +* +* +* RESTRICTIONS +* +* NOT ALL FUNCTIONALITY MAY BE COMPLETELY RECOVERED BECAUSE +* OF MISSING INFORMATION. +* +* STORAGE +* +* 176 (OCTAL) +* 126 (DECIMAL) +* +* +* USE +* +* I$PA - READ LINE OF SOURCE CODE USING TAB CHARACTERS +* CALL I$PA +* DAC (BUFFER ADDRESS) +* +* I$PI - CONFIGURE O$PA +* CALL O$PI +* DEC (NUMBER OF WORDS IN DATA BUFFER) +* DEC (NUMBER OF TABS IN FOLLOWING TABLE, IF ANY) +* DEC TAB (1) +* DEC TAB (2) +* . . +* . . +* . . +* DEC TAB (N) +* +* +******************************************************************************** +* +* EXPORTED LABELS + SUBR I$PA + SUBR I$PI +* +* +* + REL RELOCATEABLE MODE +* +* +* SETUP READ ROUTINE +* +I$PI DAC ** SETUP READ ROUTINE + LDA* I$PI WORD COUNT PARAMETER + LGL 1 LEFT SHIFT 1 + STA LIM BUFFER LIMIT +* + IRS I$PI TALLY RETURN ADDRESS + LDA* I$PI TAB COUNT PARAMETER + STA NTAB TAB COUNT +* + LDA I$PI RETURN ADDRESS + AOA TALLY BY 1 + STA TABL TAB TABLE LINK +* + ADD NTAB TAB COUNT + STA I$PI RETURN ADDRESS + JMP* I$PI EXIT +* +* +* READ ROUTINE +* +I$PA DAC ** READ ROUTINE + STX SIR SAVED INDEX REGISTER + LDA* I$PA BUFFER ADDRESS PARAMETER + LGL 1 LEFT SHIFT 1 + STA BUFL BUFFER LINK +* +RSTR LDA =1 POSITION 1 + STA CP CHARACTER POSITION +* +STSP LDA ='240 SPACE + JST NSRT INSERT IN CHARACTER POSITION + JMP STSP LOOP AGAIN +* + LDA =1 POSITION 1 +SCP STA CP CHARACTER POSITION +* +* INPUT AND TEST FOR SPECIAL CODES +READ NOP +RES LDX =-4 INDEX REGISTER = -4 + JST INPT READ ONE CHARACTER +* + CAS ='337 LEFT ARROW? + SKP NO, SKIP + JMP DLT YES, DELETE LINE +* +ISIT CAS IGNT+4,1 IGNORE TABLE + SKP NO, SKIP + JMP RES YES, IGNORE IT +* + IRS 0 TALLY INDEX REGISTER + JMP ISIT LOOP AGAIN +* + CAS ='215 CARRIAGE RETURN? + SKP NO, SKIP + JMP EXIT YES, END-OF-RECORD +* + CAS ='334 BACKSLASH? + SKP NO, SKIP + JMP TAB YES, TAB +* + CAS ='203 END-OF-TEXT? + SKP NO, SKP + JMP EXIT+1 YES, ETX +* +* NO ACTION CHARACTER +NAC JST NSRT INSERT IN CHARACTER POSITION + JMP READ BUFFER NOT FULL, LOOP AGAIN + JMP READ BUFFER NOW FULL, LOOP AGAIN +* +* TAB ROUTINE +TAB CRA CLEAR A-REGISTER + SUB NTAB TAB COUNT + SNZ NZ, SKIP + JMP NOTB Z, NO TABS +* + STA 0 INDEX REGISTER + LDA TABL TAB TABLE LINK + STA TABI TABLE POINTER +* +ITAB LDA* TABI TABLE POINTER + IRS TABI TALLY TABLE POINTER + CAS CP CHARACTER POSITION + JMP SCP GR, SET NEW CHARACTER POSITION + NOP EQ, LOOP AGAIN + IRS 0 LE, TALLY INDEX REGISTER + JMP ITAB LOOP AGAIN +* +NOTB LDA ='240 SPACE + JMP NAC RETURN TO INSERT CHARACTER +* +* INSERT IN CHARACTER POSITION +NSRT DAC ** INSERT IN CHARACTER POSITION + LRR 8 RIGHT ROTATE BOTH 8 + LDA CP CHARACTER POSITION + CAS LIM BUFFER LIMIT + JMP DNA GR, DO NOT ACCEPT + NOP EQ, ACCEPT AND PACK +* LE, ACCEPT AND PACK + SUB =1 SUBSTRACT 1 + ADD BUFL BUFFER LINK + LGR 1 RIGHT SHIFT 1 + STA TABI TABLE POINTER +* + LDA* TABI TABLE POINTER + SSC C SET, SKIP + IAB C RESET, INTERCHANGE A AND B + LGR 8 SHIFT RIGHT 8 + LLR 8 LEFT ROTATE BOTH 8 + STA* TABI TABLE POINTER + IRS CP TALLY CHARACTER POSITION + JMP* NSRT EXIT +* +DNA IRS NSRT TALLY RETURN ADDRESS + JMP* NSRT EXIT +* +* LEFT-ARROW ROUTINE +DLT JST INPT READ ONE CHARACTER + ERA ='215 CARRIAGE RETURN + SZE Z, SKIP + JMP DLT NZ, LOOP AGAIN +* + JMP RSTR RESTART +* +* RETURN TO CALLING PROGRAM +EXIT IRS I$PA TALLY RETURN ADDRESS + IRS I$PA TALLY RETURN ADDRESS +* + LDX SIR SAVED INDEX REGISTER + JMP* I$PA EXIT +* +* CHARACTER INPUT ROUTINE +INPT DAC ** + OCP 1 START READER + INA '1001 READ ONE CHARACTER + JMP *-1 WAIT FOR FINISH + OCP '101 TURN OFF READER +* + ANA ='177 BITS 10-16 + ERA ='200 TOGGLE BIT 9 + JMP* INPT RETURN +* +* +* VARIABLES AND CONSTANTS +* +SIR BSZ 1 STORED INDEX REGISTER +BUFL BSZ 1 BUFFER LINK +CP BSZ 1 CHARACTER POSITION +TABI BSZ 1 TABLE POINTER +* +* CHANGEABLE PARAMETERS +LIM DEC 80 BUFFER LIMIT (DEFAULT IS 80) +NTAB DEC 4 TAB COUNT (DEFAULT IS 4) +TABL DAC TABS TAB TABLE LINK (DEFAULT IS TABS) +* +* DAP-16 TAB SETTINGS +TABS DEC 6 OPERATION FIELD + DEC 12 VARIABLE FIELD + DEC 30 COMMENTS FIELD + DEC 73 IDENTIFICATION FIELD +* +* IGNORABLE CHARACTERS +IGNT OCT 200 BLANK TAPE + OCT 212 LINE FEED + OCT 223 X-OFF + OCT 377 RUB-OUT +* +* LITERALS + FIN +* +* + END END OF I$PA 4.2.2005 diff --git a/lib/iolib/src/o$al.asm b/lib/iolib/src/o$al.asm new file mode 100644 index 0000000..625a9e3 --- /dev/null +++ b/lib/iolib/src/o$al.asm @@ -0,0 +1,223 @@ +* (O$AL) - TYPING ROUTINES +* +* +* PROGRAM TITLE: O$AL (O$AL,O$AE,O$AH,O$AC,O$AF) +* ASR TYPING ROUTINES +* +* REVISIONS: +* 1.0 (5.2.2005) +* +* AUTHOR +* +* PHILIPP HACHTMANN +* +* +* PURPOSE +* +* ASR OUTPUT ROUTINES FOR LISTING +* +* +* RESTRICTIONS +* +* THESE ARE NOT THE ORIGINAL +* +* +* STORAGE +* +* 310 (OCTAL) +* 200 (DECIMAL) +* +* +* +********************************************************************** + SUBR O$AL,OSAL TYPE A COMPLETE LINE WITH CR/LF, HEADING ETC. + SUBR O$AH,OSAH INITIALISE HEADING + SUBR O$LL,OSAL TYPE A COMPLETE LINE WITH CR/LF, HEADING ETC. + SUBR O$HH,OSAH INITIALISE HEADING + SUBR O$AP,T1 TYPE A LINE, NO CR + SUBR O$AC,T20 RETURN THE CARRIAGE + SUBR O$AF,T30 ADVANCE TO NEXT LINE + SUBR O$AE,FF EJECT PAGE +* + SUBR O$A1,HDS EMPTY LINES BETWEEN TOP OF PAGE AND HEADING + SUBR O$A2,SPC EMPTY LINES BETWEEN HEADING AND MAIN TEXT + SUBR O$A3,PGS PURE TEXT LINES PER PAGE + SUBR O$A4,WIDH PURE TEXT LINES PER PAGE + SUBR O$A5,SFF SKIPS TO SIMULATE FORM FEED +********************************************************************** + REL RELOCATABLE MODE +********************************************* +* CONFIGURATION +HDS DEC 1 EMPTY LINES BEFORE HEADING +SPC DEC 2 EMPTY LINES BETWEEN HEADING AND TEXT +PGS DEC 50 DATA LINES PER PAGE (WITHOUT HEADING ETC.) +WIDH DEC 36 (2-CHAR) WORDS PER LINE +SFF DEC 4 SKIPS TO SIMULATE FORM FEED +* +* +OSAL DAC ** + STX XR + LDA* OSAL BUFFER ADDRESS + STA BUF1 STORE FOR LATER USE + LDA LINE LINE COUNTER + SZE STILL LINES LEFT? + JMP PGOK NO NEW PAGE + JST FF + JST NP NEW PAGE REQUIRED +PGOK IRS LINE BUMP COUNTER + NOP + JST T1 PRINT THE LINE +BUF1 DAC ** ADDRESS OF LINE BUFFER + JST T20 CARRIAGE RETURN + JST T30 LINE FEED + IRS OSAL MAKE RETURN ADDRESS + LDX XR + JMP* OSAL RETURN +* +* +OSAH DAC ** INIT HEADING + STX XR + LDA* OSAH + STA P1 POINTER TO SOURCE + LDA HBUP + STA P2 POINTER TO TARGET + LDA WIDH LINE LENGTH + TCA COMPLEMENT + STA CNT +HL1 LDA* P1 + STA* P2 + IRS P1 + IRS P2 + IRS CNT READY? + JMP HL1 NO + JST NP INIT PAGE + IRS OSAH ADJUST ADDRESS + LDX XR + JMP* OSAH RETURN +******************************************************************************** +* +NP DAC ** PREPARE NEW PAGE + LDA PGS LOAD LINES PER PAGE + TCA NEGATE + STA LINE STORE PAGE COUNTER + LDA HDS + SNZ + JMP NHDS NO SPACE BEFORE HEADING + TCA + STA CNT +S1 JST T30 + IRS CNT + JMP S1 +NHDS JST T1 TYPE HBUF +HBUP DAC HBUF ADDRESS OF HEADER BUFFER + JST T20 CARRIAGE RETURN + LDA SPC NUMBER OF SPACES BEFORE TEXT + TCA NEGATE + STA CNT TO COUNTER +SP1 JST T30 LINE FEED + IRS CNT DEC COUNTER, SKIP IF READY + JMP SP1 NOT READY + JMP* NP +* +******************************************************************************** +* +**** FORM FEED ROUTINE +FF DAC ** + LDA SFF + TCA + STA CNT + LDA =10 +FF1 OTA 4 SEND LINE FEED + JMP *-1 WAIT + IRS CNT + JMP FF1 + JMP* FF RETURN +* +* +XR DEC 0 SAVED X REGISTER +CNT DEC 0 +HBUF BCI 20, + BCI 20, + BCI 20, +P1 DEC 0 POINTER 1 +P2 DEC 0 POINTER 2 +LINE DEC -40 NEG LINES LEFT ON PAGE +* +* +******************************************************************************** +* +*** AB HIER ABGESCHRIEBENER CODE! +T1 DAC ** + STX XR + LDA* T1 + ADD WIDH + ADD ='40000 + STA T6 + IRS T1 + LDA WIDH + TCA + STA 0 +T3 LDA* T6 + CAS ='120240 + JMP *+2 +* + JMP T8 +T4 JST T14 + IRS 0 + JMP T3 + LDX XR + JMP* T1 +T6 *** ** +* +T8 LDA 0 + STA T12 +T10 IRS 0 + JMP *+2 + JMP* T1 + LDA* T6 + CAS ='120240 + JMP *+2 + JMP T10 + LDA T12 + STA 0 + LDA ='120240 + JMP T4 +T12 *** ** +* +T14 DAC ** + NOP + NOP + NOP + LRL 8 + OTA 4 + JMP *-1 + LLL 8 + OTA 4 + JMP *-1 + JMP* T14 +* +* +******************************************************************************** +* +T20 DAC ** + LDA =13 + OTA 4 + JMP *-1 + OTA 4 + JMP *-1 + JMP* T20 +* +******************************************************************************** +* +T30 DAC ** + LDA =10 + OTA 4 + JMP *-1 + JMP* T30 +* +* + FIN WRITE OUT LITERALS +* +* PUH..... + END (O$AL) + diff --git a/lib/iolib/src/o$la.asm b/lib/iolib/src/o$la.asm new file mode 100644 index 0000000..29da760 --- /dev/null +++ b/lib/iolib/src/o$la.asm @@ -0,0 +1,338 @@ +* (O$LA) +* +* +* PROGRAM TITLE: O$LA (O$LA,O$LE,O$LH,O$LC,O$LF) +* LINE PRINTER ROUTINES +* +* REVISIONS: +* 1.0 (2005-02.04) +* +* AUTHOR +* +* PHILIPP HACHTMANN +* +* +* PURPOSE +* +* THESE ARE THE LIBRARY ROUTINES FOR HACHTI'S LINE PRINTER INTERFACE +* +* +* RESTRICTIONS +* +* DEPENDS ON HACHTI'S HARDWARE AND FORTRAN IV COMPILER TAPE +* +* +* STORAGE +* +* 420 (OCTAL) +* 271 (DECIMAL) +* +* +* USE +* +* CALL O$LA +* DAC (BUFFER ADDRESS) +* NORMAL +* +* THIS PRINTS ONE LINE OF LISING TEXT +* (60 2-CHAR WORDS MAX) TO THE LINE PRINTER. +* +* +* CALL O$LH +* DAC (HEADING ADDRESS) +* NORMAL RETURN +* +* SETUP THE LISTING HEADER +* RESETS THE PAGE COUNTER AND SPACES TO THE BEGINNING OF +* THE NEXT PAGE. +* +* +* CALL O$LP +* DAC (BUFFER ADDRESS) +* NORMAL RETURN +* +* PRINT TEXT FROM BUFFER. NO CR OR LF IS OUTPUT. +* +* CALL O$LC +* NORMAL RETURN +* +* PRODUCE A CARRIAGE RETURN ON THE LINE PRINTER. +* +* +* CALL O$LF +* NORMAL RETURN +* +* SEND A LINE FEED COMMAND TO THE PRINTER. +* +* +* CALL O$LE +* NORMAL RETURN +* +* EJECT CURRENT PAGE +* SPACES TO THE BEGINNING OF THE NEXT PAGE BY SENDING +* A FF CHARACTER TO THE PRINTER. +* +******************************************************************************** +* + SUBR O$LA TYPE A COMPLETE LINE WITH CR/LF, HEADING ETC. + SUBR O$LH INITIALISE HEADING + SUBR O$LP,T1 TYPE A LINE, NO CR + SUBR O$LC,T20 RETURN THE CARRIAGE + SUBR O$LF,T30 ADVANCE TO NEXT LINE + SUBR O$LE,FF EJECT PAGE +* + SUBR O$LSK1,SKP1 EMPTY LINES BETWEEN TOP OF PAGE AND HEADING + SUBR O$LSK2,SKP2 EMPTY LINES BETWEEN HEADING AND MAIN TEXT + SUBR O$LLPP,LPP PURE TEXT LINES PER PAGE + SUBR O$LRS,RS DISTANCE FROM PAGE NUMBERING TO RIGHT MARGIN +* +******************************************************************************** +* + REL RELOCATEABLE MODE +* +* CONFIGURATION +SKP1 DEC 1 EMPTY LINES BEFORE HEADING +SKP2 DEC 3 EMPTY LINES BETWEEN HEADING AND TEXT +LPP DEC 60 DATA LINES PER PAGE (WITHOUT HEADING ETC.) +LNW DEC 60 LINE LENGTH IN 2-CHAR WORDS +RS DEC 1 RIGHT DISTANCE FOR PAGE NUMBERING (2-CHAR WORDS) +* +* +O$LA DAC ** + LDA* O$LA BUFFER ADDRESS + STA LBUF STORE + LDA LINE LEFT LINE COUNTER + SZE LINES LEFT ON PAGE? + JMP PGOK YES, JUMP AWAY + JST FF CALL FORM FEED ROUTINE +PGOK LDA LPP LINES PER PAGE + TCA + CAS LINES ARE WE ON THE FIRST LINE? + JMP *+2 NO, WE ARE NOT. + JST NP MAKE HEADER, SPACING ETC. + NOP + IRS LINE BUMP COUNTER + NOP WE DON'T CONTROL THAT HERE ANYMORE + JST T1 PRINT THE LINE +LBUF DAC ** ADDRESS OF LINE BUFFER + JST T20 CARRIAGE RETURN + JST T30 LINE FEED + IRS O$LA MAKE RETURN ADDRESS + JMP* O$LA RETURN +* +* +O$LH DAC ** INIT HEADING + LDA* O$LH + STA P1 POINTER TO SOURCE + LDA HBUP + STA P2 POINTER TO TARGET + LDA LNW LINE LENGTH + TCA + STA CNT +HL1 LDA* P1 + STA* P2 + IRS P1 + IRS P2 + IRS CNT READY? + JMP HL1 NO + LDA LPP LINES PER PAGE + TCA RENEW + STA LINE THE LINE COUNTER + IRS O$LH ADJUST ADDRESS + CRA + STA LN1 CLEAR PAGE NUMBERING + STA LN2 CLEAR PAGE NUMBERING + STA LN3 CLEAR PAGE NUMBERING + JMP* O$LH RETURN +* +* +* +NP DAC ** PREPARE NEW PAGE + LDA SKP1 SPACES BEFORE HEADING + SNZ SPACING REQUIRED? + JMP NHDS NO SPACE BEFORE HEADING + TCA + STA CNT +S1 JST T30 LINE FEED + IRS CNT + JMP S1 +NHDS JST LNNR PREPARE LINE NUMBERING + JST T1 TYPE HBUF +HBUP DAC HBUF ADDRESS OF HEADER BUFFER + JST T20 CARRIAGE RETURN + JST T30 LINE FEED + LDA SKP2 NUMBER OF SPACES BEFORE TEXT + SNZ SPACING REQUIRED? + JMP NSPC NO, IT'S NOT. + TCA NEGATE + STA CNT TO COUNTER +SP1 JST T30 LINE FEED + IRS CNT DEC COUNTER, SKIP IF READY + JMP SP1 NOT READY +NSPC JMP* NP RETURN +* +* FORM FEED +FF DAC ** + LDA LPP REFILL + TCA THE + STA LINE LINE COUNTER +* + LDA =12 FORM FEED + OTA 0 SEND FORMFEED + JMP *-1 WAIT + JMP* FF RETURN +* +* +* VARIABLES +XR DEC 0 THE CALLER'S X REGISTER +CNT DEC 0 +HBP DAC HBUF +HBUF BCI 20, + BCI 20, + BCI 20, +P1 DEC 0 POINTER 1 +P2 DEC 0 POINTER 2 +LINE DEC -40 NEG LINES LEFT ON PAGE +PGS BCI 5, PAGE XXX +PGSP DAC PGS POINTER TO PGS +* +* +************************************************************ +* +* OUTPUT LINE +T1 DAC ** + STX XR SAVE CALLER'S INDEX REGISTER + LDA* T1 + ADD LNW LINE WIDTH + ADD ='40000 SET TAG + STA T6 + IRS T1 + LDA LNW LINE WIDTH + TCA NEGATE + STA 0 +T3 LDA* T6 + CAS ='120240 + JMP *+2 +* + JMP T8 +T4 JST T14 + IRS 0 + JMP T3 + LDX XR RESTORE CALLER'S INDEX REGISTER + JMP* T1 +T6 *** ** +* +* +T8 LDA 0 + STA T12 +T10 IRS 0 + JMP *+2 + JMP* T1 + LDA* T6 + CAS ='120240 + JMP *+2 + JMP T10 + LDA T12 + STA 0 + LDA ='120240 + JMP T4 +T12 *** ** +* +* +T14 DAC ** + ICA + OTA 0 + JMP *-1 + ICA + OTA 0 + JMP *-1 + JMP* T14 +**** +* +* CARRIAGE RETURN +T20 DAC ** + LDA =13 CR CHARACTER + OTA 0 OUTPUT + JMP *-1 + JMP* T20 RETURN +* +* LINE FEED +T30 DAC ** + LDA =10 LF CHARACTER + OTA 0 OUTPUT + JMP *-1 RETURN + JMP* T30 +* +* PRINT LINE NUMBER TO BUFFER +LNNR DAC ** INCREMENT LINE NUMBER, PUT TO BUFFER + JST LNR INCREMENT DIGIT +LN1 DEC 0 LEAST SIGNIFICAND DIGIT + JMP RDY NO CARRY, COUNTING READY + JST LNR INCREMENT DIGIT +LN2 DEC 0 SECOND DIGIT + JMP RDY NO CARRY, COUNTING READY + JST LNR INCREMENT DIGIT +LN3 DEC 0 THIRT DIGIT + NOP NO CARRY, FINE +RDY NOP OVERFLOW, BUT WHAT SHOULD WE DO? +* +* + LDA LN3 LEFTMOST VALUE (100) + JST MDG CONVERT + LRR 8 SHIFT DOWN + LDA =32 SPACE + LLR 8 SHIFT BACK + STA PGS+3 STORE +* + LDA LN1 RIGHTMOST DIGIT (1) + ADD =48 ZERO CHARACTER + LRR 8 SHIFT AWAY + LDA LN2 MIDDLE VALUE (10) + JST MDG CONVERT + LLR 8 SHIFT UP AGAIN + STA PGS+4 STORE INTO POSITION +* +* + LDA HBP HEADER BUFFER ADDRESS + ADD LNW PAGE WIDTH + SUB RS RIGHT SPACING + ADD ='40000 SET INDEX BIT + STA P1 TO POINTER + LDA PGSP PAGE NUMBER BUFFER ADDRESS + ADD =5 ADD PAGE NUMBERING LENGTH + ADD ='40000 SET INDEX BIT + STA P2 TO POINTER + LDA =-5 + STA 0 +PP1 LDA* P2 + STA* P1 + IRS 0 + JMP PP1 + JMP* LNNR RETURN +* +* +MDG DAC ** MAKE DIGIT FROM A + SZE + JMP NZ NO ZERO + LDA =32 IS ZERO->SPACE + JMP* MDG RETURN +NZ ADD =48 THE ZERO CHARACTER + JMP* MDG +* +* +LNR DAC ** DIGIT SERVICE + IRS* LNR INCREMENT DIGIT + LDA* LNR LOAD NEW VALUE OF DIGIT + SUB =10 TEST IF OVERFLOW + SZE OVERFLOW? + JMP NOFL NO, TAKE FIRST RETURN + STA* LNR YES, CLEAR DIGIT (A WAS ZERO) + IRS LNR TALLY RETURN ADDRESS +NOFL IRS LNR TALLY RETURN ADDRESS + JMP* LNR +* + FIN WRITE OUT LITERALS +* +* PUH..... +* + END diff --git a/lib/iolib/src/o$pb.asm b/lib/iolib/src/o$pb.asm new file mode 100644 index 0000000..9331ed5 --- /dev/null +++ b/lib/iolib/src/o$pb.asm @@ -0,0 +1,178 @@ +* (O$PB) - COPY OF O$AB +* +* +* COMPUTER: H316 +* +* PROGRAM CATEGORY: I/O LIBRARY +* +* PROGRAM TITLE: O$PB (O$PS,O$PLDR) +* TO PUNCH BINARY TAPE ON THE HIGH SPEED PUNCH +* +* REVISIONS: +* 1.0 (2005-02.04) +* +* AUTHOR +* +* PHILIPP HACHTMANN +* +* +* +* STORAGE +* +* 150 (OCTAL) +* 104 (DECIMAL) +* +* +* USE +* +* CALL O$PB PTP BINARY PUNCH ROUTINE +* DAC DATA DATA ADDRESS +* NORMAL RETURN +* +* CALL O$PS END OF MESSAGE ROUTINE +* +* CALL O$PLDR PUNCH BLANK LEADER +* +* +* CALL O$AB - +* +* THIS ROUTINE IS USED TO PUNCH BINARY PAPER TAPE, THE ADDRESS +* OF THE BINARY WORD COUNT APPEARS IN THE VARIABLE FIELD (DATA) +* FOLLOWING THE CALL PSEUDO-OP. THE BINARY INFORMATION TO BE +* PUNCHED MUST START AT DATA+1. +* THE NORMAL RETURN IS TAKEN WHEN THE NUMBER OF WORDS SPECIFIED +* BY THE WORD COUNT HAS BEEN PUNCHED. +* +* CALL O$AS - +* +* EOM (203 OCT), X-OFF (223 OCT), AND RUBOUT (377 OCT) CHARACTERS +* ARE PUNCHED WHEN THIS ROUTINE IS USED. +* RETURN IS TO THE CALLING PROGRAMM +* +* CALL O$PLDR - +* +* PUNCH BLANK LEADER. NORMAL RETURN. +* +* +* METHOD +* +* BINARY INFORMATION IS PUNCHED AS IST APPEARS IN THE BUFFER (DATA+1). +* EACH RECORD ON PAPER TAP EWILL HAVE THE FOLLOWING FORMAT: +* START OF MESSAGE, BINARY INFORMATION, X-OFF, TWO LEADER CHARS. +* +* +* +******************************************************************************** +* +* + SUBR O$PB + SUBR O$PS + SUBR O$PLDR,PLDR + REL +O$PB PZE ** PTP PUNCH ENTRY + STX XR SAVE INDEX REGISTER FROM CALLING PROGRAMM + OCP 2 ACTIVATE PAPER TAPE PUNCH +* + LDA* O$PB WORD COUNT ADDRESS +BIN5 STA TMP + LDA* TMP + TCA TWOS COMPLEMENT BINARY WORD COUNT + STA 0 + LDA* O$PB BINARY DATA ADDRESS + ADD* TMP DATA ADDRESS+WORD COUNT + ADD ='40001 + STA DATA DATA ADDRESS + WORD COUNT, 1 + JST STP + LDA ='201 BEGINNING OF MESSAGE + JST BCD8 +BIN6 LDA* DATA BINARY WORD TO BE PUNCHED + LRL 16 B-REG: BINARY WORD TO BE PUNCHED + JST PNCH GO PUNCH BINARY WORD + IRS 0 + JMP BIN6 CONTINUE PUNCHING BINARY CHARACTERS + JMP RETN LEAVE ROUTINE +PNCH PZE ** CONVERT AND PUNCH BINARY CHARACTERS + LLL 4 + JST CHAR PUNCH BINARY WORD (1-4) + JST CHAR PUNCH BINARY WORD (5-10) + JST CHAR PUNCH BINARY WORD (11-16) + JMP* PNCH RETURN FOR ADDITIONAL WORDS +CHAR PZE ** + LGL 11 + CAS WRU + JMP *+2 + LDA WRUX + CAS LF + JMP *+2 + LDA LFX + CAS XON + JMP *+2 + LDA XONX + CAS XOFF + JMP *+2 + LDA XOFX + SRC + ERA FOUR + ALR 5 +OUT JST BCD8 + LLL 6 + JMP* CHAR +WRU OCT 024000 +WRUX OCT 160003 +LF OCT 050000 +LFX OCT 164003 +XON OCT 104000 +XONX OCT 170003 +XOFF OCT 114000 +XOFX OCT 174003 +FOUR OCT 000004 +BCD8 PZE ** ASCII PUNCH ROUTINE + OTA 2 + JMP *-1 + JMP* BCD8 +RETN LDA ='223 X-OFF + JST BCD8 + LDA ='377 RUBOUT CHARACTER + JST BCD8 LEADER CHAR. + IRS O$PB INCREMENT FOR NORMAL RETURN + LDA XR RESTORE INDEX FOR CALLING PROGRAMM + STA 0 + JMP* O$PB +* +O$PS PZE ** PUNCH END OF MESSAGE ENTRY + JST STP + LDA ='203 PUNCH END OF MESSAGE + JST BCD8 + LDA ='223 PUNCH X-OFF + JST BCD8 + LDA ='377 RUBOUT CHARACTER + JST BCD8 LEADER CHAR. + JMP* O$PS RETURN TO CALLING PROGRAMM +* +STP DAC ** + LDA ='222 + JST BCD8 + LDA ='377 + JST BCD8 + JMP* STP +DATA PZE 0 +XR PZE 0 +TMP PZE 0 + FIN +* +LDRC DEC 150 LENGTH OF LEADER +PLDR DAC ** PUNCH LEADER ENTRY + STX XR SAVE X REGISTER + LDA LDRC LENGTH OF LEADER + TCA TWOS COMPLEMENT OF LEADER + STA 0 + OCP 2 + CRA +LD1 OTA 2 PUNCH! + JMP *-1 + IRS 0 + JMP LD1 + LDX XR RESTORE X REGISTER + JMP* PLDR RETURN +* + END O$PB diff --git a/lib/iolib/src/o$pl.asm b/lib/iolib/src/o$pl.asm new file mode 100644 index 0000000..535184d --- /dev/null +++ b/lib/iolib/src/o$pl.asm @@ -0,0 +1,204 @@ +* (O$PL) +* +* +* COMPUTER: H316 +* +* PROGRAM CATEGORY: I/O LIBRARY +* +* PROGRAM TITLE: O$PL (O$PH) +* PAPER TAPE LISTING ROUTINES +* +* REVISIONS: +* 1.0 (2005-02.04) +* +* AUTHOR +* +* PHILIPP HACHTMANN +* +* +* PURPOSE +* +* PUT LISTINGS ONTO PAPER TAPE. USAGE LIKE O$LA AND O$LH +* +* +* +* STORAGE +* +* 266 (OCTAL) +* 182 (DECIMAL) +* +* +* USE +* +* THE LIBRARY ROUTINES ARE FOR GENERAL PURPOSE. +* +********************************************************************** + SUBR O$PL TYPE A COMPLETE LINE WITH CR/LF, HEADING ETC. + SUBR O$PH INITIALISE HEADING + SUBR O$PP,T1 TYPE A LINE, NO CR + SUBR O$PC,T20 RETURN THE CARRIAGE + SUBR O$PF,T30 ADVANCE TO NEXT LINE + SUBR O$PE,SNP PUNCH FORM FEED +* + SUBR O$P1,HDS EMPTY LINES BETWEEN TOP OF PAGE AND HEADING + SUBR O$P2,SPC EMPTY LINES BETWEEN HEADING AND MAIN TEXT + SUBR O$P3,PGS PURE TEXT LINES PER PAGE +********************************************************************** + REL RELOCATABLE +********************************************* +* CONFIGURATION +HDS DEC 1 EMPTY LINES BEFORE HEADING +SPC DEC 5 EMPTY LINES BETWEEN HEADING AND TEXT +PGS DEC 50 DATA LINES PER PAGE (WITHOUT HEADING ETC.) +* +* +O$PL DAC ** + LDA* O$PL BUFFER ADDRESS + STA BUF1 STORE FOR LATER USE + OCP 2 ACTIVATE PUNCH + IRS LINE COUNT DOWN LEFT LINES ON PAGE + JMP PGOK NO NEW PAGE + LDA =12 FORM FEED + OTA 2 SEND FORMFEED + JMP *-1 WAIT + JST NP NEW PAGE REQUIRED +PGOK JST T1 PRINT THE LINE +BUF1 DAC ** ADDRESS OF LINE BUFFER + JST T20 CARRIAGE RETURN + JST T30 LINE FEED + IRS O$PL MAKE RETURN ADDRESS + JMP* O$PL RETURN +* +* +O$PH DAC ** INIT HEADING + LDA* O$PH + STA P1 POINTER TO SOURCE + LDA HBUP + STA P2 POINTER TO TARGET + LDA =-60 LINE LENGTH + STA CNT +HL1 LDA* P1 + STA* P2 + IRS P1 + IRS P2 + IRS CNT READY? + JMP HL1 NO + JST NP INIT PAGE + IRS O$PH ADJUST ADDRESS + JMP* O$PH RETURN +**********************************************++ +* +NP DAC ** PREPARE NEW PAGE + LDA PGS LOAD LINES PER PAGE + TCA NEGATE + STA LINE STORE PAGE COUNTER + LDA HDS + SNZ + JMP NHDS NO SPACE BEFORE HEADING + TCA + STA CNT +S1 JST T30 + IRS CNT + JMP S1 +NHDS JST T1 TYPE HBUF +HBUP DAC HBUF ADDRESS OF HEADER BUFFER + JST T20 CARRIAGE RETURN + LDA SPC NUMBER OF SPACES BEFORE TEXT + TCA NEGATE + STA CNT TO COUNTER +SP1 JST T30 LINE FEED + IRS CNT DEC COUNTER, SKIP IF READY + JMP SP1 NOT READY + JMP* NP +* +***********************************++ +* +**** FORM FEED ROUTINE +SNP LDA =-1 + STA LINE + OCP 2 ACTIVATE PUNCH + LDA =12 FORM FEED + OTA 2 SEND FORMFEED + JMP *-1 WAIT + JMP* SNP RETURN +******** +* +* +CNT DEC 0 +HBUF BCI 20, + BCI 20, + BCI 20, +P1 DEC 0 POINTER 1 +P2 DEC 0 POINTER 2 +LINE DEC -40 NEG LINES LEFT ON PAGE +* +* +************************************************************ +* +*** AB HIER ABGESCHRIEBENER CODE! +T1 DAC ** + LDA* T1 + ADD T5 + STA T6 + IRS T1 + LDA =-60 + STA 0 +T3 LDA* T6 + CAS ='120240 + JMP *+2 +* + JMP T8 +T4 JST T14 + IRS 0 + JMP T3 + JMP* T1 +T5 DAC 60,1 +T6 *** ** +* +T8 LDA 0 + STA T12 +T10 IRS 0 + JMP *+2 + JMP* T1 + LDA* T6 + CAS ='120240 + JMP *+2 + JMP T10 + LDA T12 + STA 0 + LDA ='120240 + JMP T4 +T12 *** ** +* +T14 DAC ** + OCP 2 ACTIVATE PUNCH + NOP + NOP + LRL 8 + OTA 2 + JMP *-1 + LLL 8 + OTA 2 + JMP *-1 + JMP* T14 +* +* +************************************************* +* +T20 DAC ** + LDA ='6400 CR+NULL + JST T14 + JMP* T20 +* +******************************************************************************* +* +T30 DAC ** + LDA ='5000 LF+NULL + JST T14 + JMP* T30 +* + FIN WRITE OUT LITERALS +* +* PUH..... +* + END diff --git a/programs/first-steps/src/hui1.f b/programs/first-steps/src/hui1.f new file mode 100644 index 0000000..966889a --- /dev/null +++ b/programs/first-steps/src/hui1.f @@ -0,0 +1,31 @@ +CHACHTI GOES FORTAN - AND BACK :-) +C + DIMENSION NAME(10) +100 WRITE (1,10) + WRITE (1,20) +300 READ (1,30) NAME + IF (NAME(1).EQ.(2H )) GO TO 1000 + IF (NAME(1).EQ.(2HXX)) GO TO 9999 + WRITE (1,40) NAME + WRITE (1,50) + DO 200 K=1,5 + WRITE (1,60) K +200 CONTINUE +C +10 FORMAT (35HHACHTI'S "HELLO-WORLD", 28.NOV.2004 ) +20 FORMAT (21HWIE HEISST DU? NAME: ) +30 FORMAT (10A2) +40 FORMAT (18HNICE TO MEET YOU, ,10A2, 1H!) +50 FORMAT (44HNOW I WILL LET YOU ALONE. HAVE SOME FUN :-) ) +60 FORMAT (I3,2H: ,10A2,17HIST EIN GUTER :-)) +70 FORMAT (24HOH! DEN NAMEN BITTE! -->) +C + GOTO 100 +1000 WRITE (1, 70) + GOTO 300 +9999 WRITE(1,80) +80 FORMAT (8HGOODBYE.) +10000 GOTO 10000 + STOP + END +$0 diff --git a/programs/first-steps/src/hui2.f b/programs/first-steps/src/hui2.f new file mode 100644 index 0000000..c12276c --- /dev/null +++ b/programs/first-steps/src/hui2.f @@ -0,0 +1,42 @@ +CHACHTI GOES FORTAN - AND BACK :-) +C + DIMENSION NAME(10) +C ******************************* +100 WRITE (1,10) +10 FORMAT (36HHACHTI'S "HELLO-WORLD", 28.NOV.2004 ) +C ******************************* + WRITE (1,20) +20 FORMAT (21HWIE HEISST DU? NAME: ) +C ******************************* +300 READ (1,30) NAME +30 FORMAT (10A2) +C ******************************* + IF (NAME(1).EQ.(2H )) GO TO 1000 + IF (NAME(1).EQ.(2HXX)) GO TO 9999 +C ******************************* + WRITE (1,40) NAME +40 FORMAT (18HNICE TO MEET YOU, ,10A2, 1H!) +C ******************************* + WRITE (1,50) +50 FORMAT (44HNOW I WILL LET YOU ALONE. HAVE SOME FUN :-) ) +C ******************************* + DO 200 K=1,5 + WRITE (1,60) K,NAME +60 FORMAT (I3,2H: ,10A2,17HIST EIN GUTER :-)) +200 CONTINUE +C ******************************* + GOTO 100 +C +C ON EMPTY INPUT +1000 WRITE (1, 70) +70 FORMAT (24HOH! DEN NAMEN BITTE! -->) + GOTO 300 +C +C "XX" INPUT +9999 WRITE(1,80) +80 FORMAT (8HGOODBYE.) +10000 GOTO 10000 + STOP +C *********** ENDE ************** + END +$0 diff --git a/programs/first-steps/src/muz.f b/programs/first-steps/src/muz.f new file mode 100644 index 0000000..3935cc3 --- /dev/null +++ b/programs/first-steps/src/muz.f @@ -0,0 +1,14 @@ +C PHILIPP'S MUNZ-PROGRAMM, KEIN WEITERER ZWECK. EINE VERSION VOM 6.2.2005 +C +C +CCCCCC DA SAG ICH NUR: LASS KRACHEN! + 33 WRITE(1,10) + WRITE(2,20) + WRITE(4,30) + 10 FORMAT(54HHALLO WELT! DAS SOLLTE AUF DEM ASR RAUSGEKOMMEN SEIN! ) + 20 FORMAT(54HHALLO WELT! DAS SOLLTE AUF DEM PTP RAUSGEKOMMEN SEIN! ) + 30 FORMAT(54HHALLO WELT! DAS SOLLTE AUF DEM LPT RAUSGEKOMMEN SEIN! ) + PAUSE + GOTO 33 +$0 + \ No newline at end of file diff --git a/programs/first-steps/src/print.f b/programs/first-steps/src/print.f new file mode 100644 index 0000000..1f99bcf --- /dev/null +++ b/programs/first-steps/src/print.f @@ -0,0 +1,9 @@ +CFORTRAN PROGRAM +C SUBROUTINE MAIN() + WRITE (4,33) +33 FORMAT(43HDIES IST DIE ERSTE ZEILE AUF DEM DRUCKER. ) + PAUSE 3 + WRITE (4,34) +34 FORMAT(43HDIES IST DIE ZWEITE ZEILE AUF DEM DRUCKER. ) + END +$0 diff --git a/programs/first-steps/src/spiel.asm b/programs/first-steps/src/spiel.asm new file mode 100644 index 0000000..1e6e582 --- /dev/null +++ b/programs/first-steps/src/spiel.asm @@ -0,0 +1,73 @@ +**** +*HACHTI'S AKTUELLES PROGRAMM.SAGT HALLO AUF DEM TELETYPE UND IST +*AUCH SONST GANZ TOLL +* +*STARTE BEI '1000: + ORG '1000 +* +*LOAD MODUS, DER ASSEMBLER VERBIETET SICH JEDE INTELLIGENZ +*BEI DER ADRESSIERUNG + LOAD +* +*ERSTMAL WEGSPRINGEN + JMP MAIN +* +*GELABER WAR SCHON IMMER MEINE STAERKE :-) +MOTD BCI 21,HEY, HIER IST HACHTI'S ERSTES PROGRAM :-) + DEC 13,10,13,10 + BCI 9,DAS REICHT ERSTMAL + DEC 13,10 +EMO DEC 0 +SP DAC MOTD +EP DAC EMO +* +* +****************************************************************** +* AUSGABEROUTINE * +****************************************************************** +PRT DAC ** +* +*ASR ANSTELLEN: + OCP '0104 +* +*INDEX AKTIVIEREN: + LDA* SP + STA 0 +* +*SPIEL BEGINNT: +RND LDA 0 + SUB EP + SNZ +* SKIP WENN SP=EP >> FERTIG + JMP* PRT +* +* + LDA* 0 +* + ICA + OTA '0004 + JMP *-1 +* + ICA + OTA '0004 + JMP *-1 +* + IRS 0 + NOP + JMP RND +***************************************************** +***************************************************** +* MAIN ROUTINE +* +MAIN JST PRT + IAB + AOA + IAB + SR1 + JMP *-1 + JMP MAIN + END +***************************************************** + + + \ No newline at end of file diff --git a/programs/mandelbrot/Makefile b/programs/mandelbrot/Makefile new file mode 100644 index 0000000..a495be2 --- /dev/null +++ b/programs/mandelbrot/Makefile @@ -0,0 +1,19 @@ +# Makefile für Apfelmännchenprogramm + +ASM=$(H316)/bin/asm +FRTN=$(H316)/bin/frtn + +build/apfel2.obj : src/apfel2.f + $(FRTN) src/apfel2.f && mv apfel2.obj build + +clean : + @rm -f *.obj build/* *.lst *.go *.par + +.PHONY: default clean + + +%.obj:%.f + $(FRTN) $^ + +%.obj:%.asm + $(ASM) $^ \ No newline at end of file diff --git a/programs/mandelbrot/src/apfel.f b/programs/mandelbrot/src/apfel.f new file mode 100644 index 0000000..2ecffd3 --- /dev/null +++ b/programs/mandelbrot/src/apfel.f @@ -0,0 +1,170 @@ +C APFELMAENNCHEN-PROGRAMM, 30.NOV.2004 PHILIPP HACHTMANN +C +C SENSE-SWITCH 1: WENN GESETZT, KONFIGURATION +C SENSE-SWITCH 2: WENN GESETZT, KEINE AUSGABE +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + COMPLEX C,Z,CTMP +C + REAL + + XIN1,XIN2,YIN1,YIN2,LOWX,LOWY,HIGHX,HIGHY, + + XSTEP,YSTEP,MAXVAL,TEMP, + + X,Y +C + INTEGER + + MAXI,COUNT,WIDTH, + + CR,LF,POSI,NEGA, I, N +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C KONSTANTE WERTE +C +C (32=LEERZEICHEN, 88=X) + DATA + + CR/13/, + + LF/10/, + + POSI/79/, + + NEGA/32/, + + WIDTH/70/, + + MAXI/60/, + + MAXVAL/2.0/, + + XIN1/-1.45/,XIN2/0.45/, + + YIN1/-1.00/,YIN2/1.00/ +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTMELDUNG + 100 WRITE(1,10) + 10 FORMAT(39HMANDELBROT-DEMO, 01.DEC.2004 HACHTI :-) ) +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C EINGABEN ANNEHMEN +C + N=1 + CALL SSWTCH(N,I) + IF(I.EQ.1) GO TO 150 +C + WRITE(1,11) + READ (1,16) XIN1 + WRITE(1,12) + READ (1,16) XIN2 + WRITE(1,13) + READ (1,16) YIN1 + WRITE(1,14) + READ (1,16) YIN2 + WRITE(1,15) + READ (1,17) MAXI + +C + 11 FORMAT(9H X FROM: ) + 12 FORMAT(9H TO: ) + 13 FORMAT(9H Y FROM: ) + 14 FORMAT(9H TO: ) + 15 FORMAT(9H MAXIT: ) + 16 FORMAT(F12.0) + 17 FORMAT(I6) +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTWERTE ENDGUELTIG FESTLEGEN +C +C EVENTUELL STARTWERTE TAUSCHEN +C +CCCCCC WENN XIN2 GROESSER IST OK, ANSONSTEN TAUSCHEN + 150 I F(XIN2.GT.XIN1) GO TO 200 + TEMP = XIN1 + XIN1 = XIN2 + XIN2 = TEMP +C +CCCCCC WENN YIN2 GROESSER IST OK, ANSONSTEN TAUSCHEN + 200 IF(YIN2.GT.YIN1) GO TO 201 + TEMP = YIN1 + YIN1 = YIN2 + YIN2 = TEMP +C +CCCCCC WERTE UEBERNEHMEN + 201 LOWX = XIN1 + HIGHX = XIN2 + LOWY = YIN1 + HIGHY = YIN2 +C +CCCCCC SCHRITTWEITEN AUSRECHNEN + XSTEP = (HIGHX-LOWX)/FLOAT(WIDTH) + YSTEP = 2.0 * XSTEP +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTWERTE AUSGEBEN +C + N=2 + CALL SSWTCH(N,I) + IF(I.EQ.1) GO TO 299 + WRITE (1,20) + 20 FORMAT (9HSETTINGS:) + WRITE (1,30) LOWX, HIGHX + 30 FORMAT (12HX-WERTE VON ,1F8.5,5H BIS ,1F8.5) + WRITE (1,40) LOWY, HIGHY + 40 FORMAT (12HY-WERTE VON ,F8.5,5H BIS ,F8.5) + WRITE (1,50) MAXI, MAXVAL, XSTEP, YSTEP, WIDTH + 50 FORMAT ( 4HMAX:,I3, + + 8H MAXVAL:,F8.5, + + 7H XSTEP:,F8.5, + + 7H YSTEP:,F8.5, + + 7H WIDTH:,I2) +CCCCCC ZEILENVORSCHUB + WRITE (1,55) + 55 FORMAT (1H0) +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C EIGENTLICHE BERECHNUNG +C +CCCCCC EINSTIEG IN BERECHNUNG + 299 X=LOWX + Y=HIGHY +C +CCCCCC EINSTIEG IN DEN AKTUELLEN PUNKT + 300 C=CMPLX(X,Y) + COUNT=0 + Z=(0.0,0.0) +C +CCCCCC HIER DER ITERIERTE TEIL + 400 CTMP=Z*Z + Z=CTMP+C + IF ((CABS(Z)).GE.MAXVAL) GO TO 410 + COUNT=COUNT+1 + IF (COUNT.GE.MAXI) GO TO 420 + GO TO 400 +C +CCCCCC PUNKT DURCHGEFALLEN + 410 CALL PCHAR(NEGA) + GO TO 500 +C +CCCCCC PUNKT HAT MAXI ERREICHT + 420 CALL PCHAR(POSI) +C +C +CCCCCC NEUEN PUNKT MACHEN + 500 X = X + XSTEP +CCCCCC ZEILE NOCH NICHT VOLL? + IF (X.LT.HIGHX) GO TO 300 +CCCCCC X AN ANFANG SETZTEN, CR+LF DRUCKEN + X = LOWX + CALL PCHAR(CR) + CALL PCHAR(LF) +CCCCCC Y WEITERRUECKEN - NEGATIV WEIL WIR VON OBEN KOMMEN + Y=Y-YSTEP + IF (Y.GT.LOWY) GO TO 300 +C +CCCCCC HIER IST DAS BILD FERTIG. + WRITE(1, 60) + 60 FORMAT (6HFERTIG) +C +CCCCCC KURZE PAUSE, DANN NEUSTART + PAUSE 7 + GO TO 100 + END +$0 diff --git a/programs/mandelbrot/src/apfel1.f b/programs/mandelbrot/src/apfel1.f new file mode 100644 index 0000000..7dd8499 --- /dev/null +++ b/programs/mandelbrot/src/apfel1.f @@ -0,0 +1,142 @@ +C APFELMAENNCHEN-PROGRAMM, 30.NOV.2004 PHILIPP HACHTMANN +C +C + COMPLEX C,Z,CTMP +C + REAL + + XIN1,XIN2,YIN1,YIN2,LOWX,LOWY,HIGHX,HIGHY, + + XSTEP,YSTEP,MAXVAL,TEMP, + + X,Y +C + INTEGER + + MAXI,COUNT,WIDTH, + + CR,LF,POSI,NEGA +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C KONSTANTE WERTE +C +C (32=LEERZEICHEN, 88=X) +C + CR=13 + LF=10 + POSI=88 + NEGA=46 +C +CCCCCC SEITENBREITE: + WIDTH=70 +C +CCCCCC MAXIMALE ITERATIONSTIEFE + MAXI=100 +C +CCCCCC AUSSTIEGSWERT + MAXVAL=2.0 +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C BILDDATEN +C + XIN1 = -1.50 + XIN2 = 0.50 +C + YIN1 = -1.00 + YIN2 = 1.00 +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTMELDUNG + 100 WRITE(1,10) + 10 FORMAT(40HMANDELBROT 30.NOV.2004 PHILIPP HACHTMANN ) +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTWERTE ENDGUELTIG FESTLEGEN +C +C EVENTUELL STARTWERTE TAUSCHEN +C +CCCCCC WENN XIN2 GROESSER IST OK, ANSONSTEN TAUSCHEN + 150 I F(XIN2.GT.XIN1) GO TO 200 + TEMP = XIN1 + XIN1 = XIN2 + XIN2 = TEMP +C +CCCCCC WENN YIN2 GROESSER IST OK, ANSONSTEN TAUSCHEN + 200 IF(YIN2.GT.YIN1) GO TO 201 + TEMP = YIN1 + YIN1 = YIN2 + YIN2 = TEMP +C +CCCCCC WERTE UEBERNEHMEN + 201 LOWX = XIN1 + HIGHX = XIN2 + LOWY = YIN1 + HIGHY = YIN2 +C +CCCCCC SCHRITTWEITEN AUSRECHNEN + XSTEP = (HIGHX-LOWX)/FLOAT(WIDTH) + YSTEP = 2.0 * XSTEP +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTWERTE AUSGEBEN +C + WRITE (1,20) + 20 FORMAT (9HSETTINGS:) + WRITE (1,30) LOWX, HIGHX + 30 FORMAT (12HX-WERTE VON ,1F8.5,5H BIS ,1F8.5) + WRITE (1,40) LOWY, HIGHY + 40 FORMAT (12HY-WERTE VON ,F8.5,5H BIS ,F8.5) + WRITE (1,50) MAXI, MAXVAL, XSTEP, YSTEP, WIDTH + 50 FORMAT ( 4HMAX:,I3, + + 8H MAXVAL:,F8.5, + + 7H XSTEP:,F8.5, + + 7H YSTEP:,F8.5, + + 7H WIDTH:,I2) +C + PAUSE 1 +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C EIGENTLICHE BERECHNUNG +C +CCCCCC EINSTIEG IN BERECHNUNG + X=LOWX + Y=HIGHY +C +CCCCCC EINSTIEG IN DEN AKTUELLEN PUNKT + 300 C=CMPLX(X,Y) + COUNT=0 + Z=(0.0,0.0) +C +CCCCCC HIER DER ITERIERTE TEIL + 400 CTMP=Z*Z + Z=CTMP+C + IF ((CABS(Z)).GE.MAXVAL) GO TO 410 + COUNT=COUNT+1 + IF (COUNT.GE.MAXI) GO TO 420 + GO TO 400 +C +CCCCCC PUNKT DURCHGEFALLEN + 410 CALL PCHAR(NEGA) + GO TO 500 +C +CCCCCC PUNKT HAT MAXI ERREICHT + 420 CALL PCHAR(POSI) +C +C +CCCCCC NEUEN PUNKT MACHEN + 500 X = X + XSTEP +CCCCCC ZEILE NOCH NICHT VOLL? + IF (X.LT.HIGHX) GO TO 300 +CCCCCC X AN ANFANG SETZTEN, CR+LF DRUCKEN + X = LOWX + CALL PCHAR(CR) + CALL PCHAR(LF) +CCCCCC Y WEITERRUECKEN - NEGATIV WEIL WIR VON OBEN KOMMEN + Y=Y-YSTEP + IF (Y.GT.LOWY) GO TO 300 +C +CCCCCC HIER IST DAS BILD FERTIG. + WRITE(1, 60) + 60 FORMAT (6HFERTIG) +C +CCCCCC KURZE PAUSE, DANN NEUSTART + PAUSE 7 + GO TO 100 + END +$0 diff --git a/programs/mandelbrot/src/apfel2.f b/programs/mandelbrot/src/apfel2.f new file mode 100644 index 0000000..48f1ba4 --- /dev/null +++ b/programs/mandelbrot/src/apfel2.f @@ -0,0 +1,248 @@ +C APFELMAENNCHEN-PROGRAMM, 29.DEC.2004 PHILIPP HACHTMANN +C +C SENSE-SWITCH 1: WENN GESETZT, KONFIGURATION +C SENSE-SWITCH 2: WENN GESETZT, KEINE AUSGABE DER EINSTELLUNGEN +C SENSE-SWITCH 3: WENN GESETZT, STARTWERTE WIEDERHERSTELLEN +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C COMMON BLOCK DEKLARATIONEN +C + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT +C + REAL LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP + COMMON /PARAM1/LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C STARTMELDUNG + 100 WRITE (1,10) + WRITE (1,11) + 10 FORMAT (45HMANDELBROT-DEMO NO.2, 29.DEC.2004 HACHTI :-) ) + 11 FORMAT (26HSEE HTTP://H316.HACHTI.DE ) +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C KONFIGURATION +CCCCCC RUECKSETZEN AUF DEFAULTWERTE? + CALL SSWTCH(3,I) + IF (I.EQ.1) CALL RST +C +C +CCCCCC BEIM ERSTEN START ODER WENN VERLANGT + IF(INIT.EQ.0) CALL STVAL +C +C +CCCCCC EINGABEN VERARBEITEN? + CALL SSWTCH(1,I) + IF (I.EQ.1) CALL GETCFG +C +C +CCCCCC AUSGABE? + CALL SSWTCH(2,I) + IF(I.EQ.2) CALL OUTCFG +C + WRITE (1,55) + 55 FORMAT (1H0) +C + CALL CALC +C + WRITE(1, 60) + 60 FORMAT (6HFERTIG) +C +CCCCCC KURZE PAUSE, DANN NEUSTART + PAUSE 7 + GO TO 100 + END +C +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C EIGENTLICHE BERECHNUNG + SUBROUTINE CALC +C + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + REAL LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP + COMMON /PARAM1/LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP +C + COMPLEX C,Z + REAL X,Y + INTEGER COUNT +C +CCCCCC EINSTIEG IN BERECHNUNG + 299 X=LOWX + Y=HIGHY +C +CCCCCC EINSTIEG IN DEN AKTUELLEN PUNKT + 300 C=CMPLX(X,Y) + COUNT=0 + Z=(0.0,0.0) +C +CCCCCC HIER DER ITERIERTE TEIL +C + 400 Z=Z*Z+C +C + IF ((CABS(Z)).GE.MAXVAL) GO TO 410 + COUNT=COUNT+1 + IF (COUNT.GE.MAXI) GO TO 420 + GO TO 400 +C +CCCCCC PUNKT DURCHGEFALLEN + 410 CALL PCHAR(NEGA) + GO TO 500 +C +CCCCCC PUNKT HAT MAXI ERREICHT + 420 CALL PCHAR(POSI) +C +CCCCCC NEUEN PUNKT MACHEN + 500 X = X + XSTEP +CCCCCC ZEILE NOCH NICHT VOLL? + IF (X.LT.HIGHX) GO TO 300 +CCCCCC X AN ANFANG SETZTEN, CR+LF DRUCKEN + X = LOWX + CALL PCHAR(CR) + CALL PCHAR(LF) +CCCCCC Y WEITERRUECKEN - NEGATIV WEIL WIR VON OBEN KOMMEN + Y=Y-YSTEP + IF (Y.GT.LOWY) GO TO 300 +C +CCCCCC HIER IST DAS BILD FERTIG. + RETURN + END +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +CCCCCC STARTWERTE AUSFUELLEN + SUBROUTINE STVAL +C + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + REAL LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP + COMMON /PARAM1/LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP +C + CR = 13 + LF = 10 + POSI = 79 + NEGA = 32 + WIDTH = 70 + MAXI = 60 + MAXVAL = 2.0 + LOWX =-1.45 + HIGHX = 0.45 + LOWY =-1.00 + HIGHY = 1.00 + INIT = 1 +C +CCCCCC SCHRITTWEITEN AUSRECHNEN + XSTEP = (HIGHX-LOWX)/FLOAT(WIDTH) + YSTEP = 2.0 * XSTEP +C + WRITE (1,1500) + 1500 FORMAT (19HSTARTWERTE GESETZT.) + RETURN + END +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +CCCCCC EINSTELLUNGEN EINLESEN + SUBROUTINE GETCFG +C + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + REAL LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP + COMMON /PARAM1/LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP +C + REAL XIN1,XIN2,YIN1,YIN2 +C + WRITE(1,11) + READ (1,16) XIN1 + WRITE(1,12) + READ (1,16) XIN2 + WRITE(1,13) + READ (1,16) YIN1 + WRITE(1,14) + READ (1,16) YIN2 + WRITE(1,15) + READ (1,17) MAXI +C + 11 FORMAT(14H X FROM : ) + 12 FORMAT(14H TO : ) + 13 FORMAT(14H Y FROM : ) + 14 FORMAT(14H TO : ) + 15 FORMAT(14H MAXIT (I3): ) + 16 FORMAT(F12.0) + 17 FORMAT(I3) +C +CCCCCC EVENTUELL STARTWERTE TAUSCHEN: +CCCCCC WENN XIN2 GROESSER IST OK, ANSONSTEN TAUSCHEN + 150 I F(XIN2.GT.XIN1) GO TO 200 + TEMP = XIN1 + XIN1 = XIN2 + XIN2 = TEMP +C +CCCCCC WENN YIN2 GROESSER IST OK, ANSONSTEN TAUSCHEN + 200 IF(YIN2.GT.YIN1) GO TO 201 + TEMP = YIN1 + YIN1 = YIN2 + YIN2 = TEMP +C +CCCCCC WERTE UEBERNEHMEN + 201 LOWX = XIN1 + HIGHX = XIN2 + LOWY = YIN1 + HIGHY = YIN2 +C +CCCCCC SCHRITTWEITEN AUSRECHNEN + XSTEP = (HIGHX-LOWX)/FLOAT(WIDTH) + YSTEP = 2.0 * XSTEP +C + RETURN + END +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +CCCCCC EINSTELLUNGEN AUSGEBEN + SUBROUTINE OUTCFG +C + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + REAL LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP + COMMON /PARAM1/LOWX,LOWY,HIGHX,HIGHY,MAXVAL,XSTEP,YSTEP +C + WRITE (1,20) + 20 FORMAT (9HSETTINGS:) + WRITE (1,30) LOWX, HIGHX + 30 FORMAT (12HX-WERTE VON ,1F8.5,5H BIS ,1F8.5) + WRITE (1,40) LOWY, HIGHY + 40 FORMAT (12HY-WERTE VON ,F8.5,5H BIS ,F8.5) + WRITE (1,50) MAXI, MAXVAL, XSTEP, YSTEP, WIDTH + 50 FORMAT ( 4HMAX:,I3, + + 8H MAXVAL:,F8.5, + + 7H XSTEP:,F8.5, + + 7H YSTEP:,F8.5, + + 7H WIDTH:,I2) + RETURN + END +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +CCCCCC RUECKSETZEN + SUBROUTINE RST +C + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT +C + WRITE(1,245) + 245 FORMAT(24HRUECKSETZUNG GEWUENSCHT ) + INIT=0 + RETURN + END +C +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C KONSTANTE WERTE + BLOCK DATA + INTEGER MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + COMMON /PARAM2/MAXI,WIDTH,CR,LF,POSI,NEGA,INIT + DATA INIT/0/ + END +CCCCCCCCCCCCCCCCCCCCCCCC +$0 diff --git a/programs/tools/src/asr-test.asm b/programs/tools/src/asr-test.asm new file mode 100644 index 0000000..763b8d5 --- /dev/null +++ b/programs/tools/src/asr-test.asm @@ -0,0 +1,96 @@ +* ASR-TESTPROGRAMM +* +* +* +* +*STARTE BEI '1000: + ORG '1000 + LOAD +* +*ERSTMAL WEGSPRINGEN + JMP MAIN +* +MOTD BCI 10,ASR-TEST 2004-11-16 + DEC 13,10 +EMO DEC 0 +SP DAC MOTD +EP DAC EMO +VAR DEC 0 +* +* +****************************************************************** +* AUSGABEROUTINE * +****************************************************************** +PRT DAC ** +* +*ASR ANSTELLEN: + OCP '0104 + SKS '104 + JMP *-1 +* +*INDEX AKTIVIEREN: + LDA* SP + STA 0 +* +*SPIEL BEGINNT: +RND LDA 0 + SUB EP + SNZ +* SKIP WENN SP=EP >> FERTIG + JMP* PRT +* +* + LDA* 0 +* + ICA + OTA '0004 + JMP *-1 +* + ICA + OTA '0004 + JMP *-1 +* + IRS 0 + NOP + JMP RND +***************************************************** +*PAUSE +CYC DEC 0 +CNT DEC ** +PAUS DAC ** + LDA CYC + STA CNT +CYST NOP + NOP + NOP + NOP + NOP + NOP + NOP + IRS CNT + JMP CYST + JMP* PAUS +***************************************************** +*TTY1 +TTY1 DAC ** + OTA 4 + JMP *-1 + JMP* TTY1 +***************************************************** +* MAIN ROUTINE +* +MAIN SR1 +MAIN2 JST PRT + SR2 + JST PAUS + SR3 + JST TTY1 + SR4 + HLT + IAB + AOA + IAB + JMP MAIN + END +***************************************************** +. \ No newline at end of file diff --git a/programs/tools/src/cleanup.asm b/programs/tools/src/cleanup.asm new file mode 100644 index 0000000..f80c16f --- /dev/null +++ b/programs/tools/src/cleanup.asm @@ -0,0 +1,46 @@ +* CLEANUP +* +* CLEANS UP CORE LOCATIONS '00020-'30777. +* + ORG '31000 +STRT LDA ='20 START ADDRESS + STA PTR +LOOP CRA + STA* PTR + IRS PTR + JMP GO1 NO OVERFLOW + HLT OVERFLOW OCCURED +GO1 LDA PTR + SUB ='31000 + SZE SKIP IF READY + JMP LOOP RESTART +RDY OCP '104 ASR START + JST CRLF + JST OK + HLT + JMP STRT RESTART :-) +******* +OK DAC ** + LDA ='117 CHARACTER O + JST PRNT + LDA ='113 NOW K + JST PRNT + JMP* OK +******* +CRLF DAC ** + LDA =13 LOAD CR + JST PRNT + LDA =10 LOAD LF + JST PRNT + JMP* CRLF +****** +PRNT DAC ** + SKS 4 WAIT FOR ASR33 + JMP *-1 TO BECOME READY + OTA 4 OUTPUT CHAR + NOP SECURITY + JMP* PRNT BACK +***** +PTR DEC 0 THE POSITION +***** + END diff --git a/slst/frtn.slst b/slst/frtn.slst new file mode 100644 index 0000000000000000000000000000000000000000..d528b8836dd17276b40d2e64d1b340743d1fe5b9 GIT binary patch literal 26499 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 A7XSbN literal 0 HcmV?d00001 diff --git a/slst/super2.txt b/slst/super2.txt new file mode 100644 index 0000000..279d521 --- /dev/null +++ b/slst/super2.txt @@ -0,0 +1,5 @@ +Super 2 tape: +31000-31777 Start 31000 : cleanup.obj +32000-32777 Start 32000 : PRNTZ +33000-36777 Start 36000 : LDR-APM +37000-37777 Start 37000 : PAL-AP diff --git a/snippets/endseq b/snippets/endseq new file mode 100644 index 0000000000000000000000000000000000000000..e233bef4ca75dbff44c40beec080a7344531a548 GIT binary patch literal 16 RcmZQz0D<6a7EQu-1 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 AH2?qr literal 0 HcmV?d00001 diff --git a/sys/frtn.sys b/sys/frtn.sys new file mode 100644 index 0000000000000000000000000000000000000000..719f59a0b12009889185350d65f47e8e1888a7a2 GIT binary patch literal 290527 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 zGo~mfvpqj+X<`zM>T5myEQAn1009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmdVB71fpQl+zBAriNxF zcf!?Erj{l4*6T{mOzve!;)?PrciLI-CQl0|;O_31#1H(0ZwO6GUa+dV Qyy9z9%6qTr6v^%WA9xM{;{X5v literal 0 HcmV?d00001 -- 2.32.0