1200.F8S
1200 SETS UP OPERATION FROM THE HOST AT 1200 BAUD-- KEY 2

@3C5A
0000  |20 0C 57|"CONTROL TO HOST AT 1200 BAUD"
0003  |28 32 78|PROMPT
0006  |2A FF A5|
0009  |20 FD 17|
000C  |20 DD 17|
000F  |28 36 41|GO-TERMINAL
0012  |29 35 00|
~3C6E

------------------
19200.F8S
19200 SETS UP OPERATION FOR THE CONSOLE AT 19200 BAUD
KE 1
@3C30
0000  |20 0E 57|"SETUP CONSOLE FOR 19200 BAUD"
0003  |28 32 78|PROMPT
0006  |2A FF A5|
0009  |20 9D 17|
000C  |20 DD 17|
000F  |28 36 41|GO-TERM
0012  |29 35 00|JUM BAC DIREC T BROWSE
~3C44
^#V~A2ʌA2 >> >!!ʩʮʳʸʽ!':
------------------
300.F8S
300 SETS UP OPERATION FROM THE HOST AT 300 BAUD
KE 3
@3C45
0000  |20 0B 57|"CONTROL TO HOST AT 300 BAUD"
0003  |28 32 78|PROMPT
0006  |2A FF A5|
0009  |20 FD 17|
000C  |20 1D 17|
000F  |28 36 41|G-TERM
0012  |29 35 00|JUM T BROWSE
~3C59

------------------
9600.F8S
9600 SETS UP CONSOLE FOR 9600 BAUD: KEY 9
@3C1B
0000  |20 09 57|"SETUP CONSOLE FOR 9600 BAUD"
0003  |28 32 78|PROMPT
0006  |2A FF A5|SETUP UART CONTROL BYTES AT FFA5,6
0009  |20 9D 17|
000C  |20 1D 17|
000F  |28 36 41|GO-TERMINAL
0012  |29 35 00|RETURN DIRECTLY TO BROWSE
~3C2F
9	^U
F10	^V
HOME	^QR^QE
HELP	^J
LEFT	^S
UP	^E
DOWN	^X
RIGHT	^D
FA	^A^T
FB	^G
FC	^T

------------------
BACKUP.F8S
				BACKUP

BACKUP DUMPS MEMORY TO HOST IN .F8D FORMAT
RANGE IS DC TO E ADDRESS, INCLUSIVE
BAUD RATE IS SET BY R20, 03=300,12=1200 OR 96=9600

@4520
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |20 58 B4|Port for UART status
0009 A|A0 22 AF|Set all bits except 6(TRE) and 4(THRE)
000C  |1F      |Increment,will be 0 if TRE and THRE empty
000D  |94 FB   |Loop to A until UART idle
000F  |4C 25 96|Compare R20(PARAMETER) to 96
0012  |20 DD   |Set for 9600 baud,8 data bits,1 stop bit,no parity
0014  |84 03   |If 96 go to B
0016  |24 20   |Change to low baud rate range(1200/300)
0018 B|B1      |Output Console UART configuration byte
0019  |20 51 B4|Port for Console Configuration
001C  |70 B4   |
001F  |4C 25 03|Is R20 03?
0021  |20 5D   |Set baud rate mux to 300
0023  |84 03   |If 03,go to C
0025  |24 80   |Change to 1200 baud
0027 C|B1      |Output baud rate mux control byte
0028  |20 59 B4|Port fot baud rate mux control
002B  |70 B4 51|Park I/O select port;R1 := 0(for COMM)
				-- LEADING STARS --
002E  |28 4D 32|CR-LF
0031  |20 12 53|R3 := 12(for 18 '*'s)
0034 D|20 2A 57|R7 := '*'
0037  |28 4F 90|DISP-C
003A  |33      |Decrement R3
003B  |94 F8   |If not 0,go to D
003D  |28 4D 32|CR-LF
				-- ADDRESS LINE --
0040  |20 53 57|R7 := 'S'
0043  |28 4F 90|DISP-C
0046  |0E      |Q := DC, Contains B address
0047  |28 4F 33|4-HEX
004A  |28 4D 32|CR-LF
				-- PROGRAM LINES --
004D E|20 58 57|'X'
0050  |28 4F 90|DISP-C
0053  |70 54   |R4 := 0,SUM
0055  |78 53   |R3 := 8,COUNT(bytes per line)
0057 F|16 07 14|QL:= <DC>;
005A  |57      |R7 := QL/16
005B  |28 4F AC|DISP-SUM
005E  |03 57   |R7 := QL
0060  |28 4F AC|DISP-SUM
0063  |33      |Decrement COUNT
0064  |94 F2   |Loop to F until 8 bytes are written
0066  |44 57   |R7 := SUM
0068  |28 4F 84|DISP-HEX, checksum
006B  |28 4D 32|CR-LF
006E  |28 4E B0|DC-LIMIT, checks if past E 
0071  |82 DB   |Loop to E until finished
				-- FINAL STARS LINE --
0073  |20 12 53|R3 := 12
0076 G|20 2A 57|R7 := '*'
0079  |28 4F 90|DISP-C
007C  |33      |Decrement R3
007D  |94 F8   |Loop to G until zero
007F  |28 4D 32|CR-LF
0082  |20 58 B4|Wait for UART to finish
0085 H|A0 22 AF|
0088  |1F      |
0089  |94 FB   |
008B  |28 40 30|INITIATE
008E  |1E 1A   |
0090  |28 44 D0|
0093  |0C      |
~45B3
G to 43
0079  |94 91   |If not 43, go to A
007B                            1

007E H|70 C0   |Test R0,COUNT
0080
------------------
BITCOUNT.F8S
				BITCOUNT

BITCOUNT ADDS BIT VALUES FROM B TO E, INCLUSIVE REGARDLESS OF
BIT POSITION IN BYTE. FOR P = 01, ZERO BITS ARE COUNTED, FOR
P = 00, ONE BITS ARE COUNTED. USE TO COMPARE FILES AND CHECK
IF EPROMS ARE ERASED(TO ALL ONES)

@40C0
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A8|P ADDRESS
0009  |16 53 16|R3 := P
000C  |5A 16 5B|H := B
000F  |10      |DC := H
0010  |70 54 55|R4 := 0;R5 := 0,R4/5 is SUM
0013  |71 56   |R6 := 1(mask)
				-- ONE BYTE --
0015 A|16 57   |R7 := <DC>
0017  |78 52   |R2 := 8(bits/byte)
				-- ONE BIT --
0019 B|46 F7 E3|ACC := R6 and R7 ex-or R3
001C  |84 07   |if 0,go to C
001E  |45 1F 55|Increment SUM
0021  |44 19 54|
0024 C|47 12 57|Shift R7 one bit right
0027  |32      |Decrement R2
0028  |94 F0   |If not 0,go to B
				-- END PROCESSING --
002A  |28 4E B0|DC-LIMIT
002D  |82 E7   |If limit not yet,go to A
002F  |44 5A 45|H := R4/5,SUM
0032  |5B      |
0033  |70 55   |R5 := 0, flag for OUT2DEC
0035  |28 48 10|OUT2DEC
0038  |1E 1A   |
003A  |28 44 D0|
003D  |0C      |
~40FD
:
>
v!42m'M̈́͢:v:ŷ>v:ŷ6V!4>2ů2V1!
------------------
BYTE-CNT.F8S

@57B3
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A8|
0009  |16 57 16|
000C  |5A 16 5B|
000F  |10      |
0010  |70 06 07|
0013 A|47 8D   |
0015  |94 07   |
0017  |03 1F 07|
001A  |02 19 06|
001D B|28 4E B0|
0020  |82 F2   |
0022  |28 4F 33|
0025  |28 4D 32|
0028  |1E 1A   |
002A  |28 44 D0|
~57DF
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
CLR-SCRN.F8S
			CLR-SCRN

CLR-SCRN SENDS THE CODES TO CLEAR SCREEN IN VT-52 MODE


@379F
0000  |08      |
0001  |20 1B 57|'ESC'
0004  |28 4F 90|DISP-C
0007  |20 48 57|'H'
000A  |28 4F 90|DISP-C
000D  |20 1B 57|'ESC'
0010  |28 4F 90|DISP-C
0013  |20 4A 57|'J'
0016  |28 4F 90|DISP-C
0019  |0C      |
~37B8
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
COMM.F8S
				COMM

COMM MULTIPLEXES THE CONSOLE AND MODEM UARTS FOR DATA INTERCHANGE
IN VARIOUS WAYS DEPENDING ON INDIVIDUAL BITS IN R0. DATA CAN ALSO
BE STORED INTO OR FETCHED FROM MEMORY. COMM RETURNS AFTER ONE
BYTE HAS PASSED. THE CALLING PROGRAM CAN DETERMINE WHAT HAPPENED
BY OBSERVING WHICH BITS OF R1 WERE CLEARED. A BYTE CAN BE PASSED
INTO COMM IN R7 OR EXTRACTED FROM COMM IN R5. IF R1 IS NOT ZERO,
MODEM OUTPUT IS INHIBITED ,EXCEPT FOR ECHO, UNTIL A X-ON IS 
RECEIVED FROM THE MODEM, OR THE CALLING PROGRAM CLEARS R1. THE
BIT VALUES OF R0 ARE:
	BIT 0:	STORE MODEM DATA IN MEMORY
	BIT 1:	STORE KEYBOARD DATA IN MEMORY
	BIT 2:	TRANSMIT R7 DATA VIA MODEM
	BIT 3:	TRANSMIT KEYBOARD DATA VIA MODEM
	BIT 4:	DISPLAY DATA RECEIVED VIA MODEM
	BIT 5:	DISPLAY R7
	BIT 6:	DISPLAY KEYBOARD DATA
	BIT 7:	NOT USED

BITS 0-6 ARE SET BY THE CALLING PROGRAM IF DESIRED TO BE ACTIVE.
COMM CLEARS ALL EXCEPT THE ONES WHICH WERE PERFORMED ON THAT PASS.
IF A MEMORY STORE OPERATION WOULD BE INTO A LOCATION CONTAINING 
A FF, THEN NO STORE TAKES PLACE AND CARRY IS SET ON RETURN.
THE RED LED ON THE CONTROL BOX IS LIT IF R1 IS NON-ZERO

@4A90
0000  |08      |K := PC1
			-- FIND FIRST POSSIBLE ACTION --
0001 A|20 50 B4|Read modem UART data ready flag
0004  |A0 21 01|
0007  |94 61   |Go to J if there is an input from the modem
			-- LED PROCESSING --
0009 B|70 B1 E1|Clear output;test R1
000C  |84 03   |if R1 is 0,go to C
000E  |71 B1   |set bit 0 and output
0010 C|20 09 B4|LED and relay port
		-- CONTINUE FINDING FIRST POSSIBLE ACTION --
0013  |20 50 B4|Read modem data ready flag
0016  |20 24 F0|read R0 bits 2 and 5
0019  |94 2D   |If R7 is to be used,go to G
001B D|20 58 B4|Port for Console UART status
001E  |A0 21 01|
0021  |84 DF   |If no keyboard input,loop back to A
			-- KEYBOARD INPUT --
0023  |40 13   |Read R0 bit 6
0025  |91 06   |If no display of keyboard data ,go to E
0027  |A0 21 10|Read Console UART THRE flag
002A  |84 D6   |If not empty, go back to A
002C E|40 15   |Read R0 bit 3
002E  |81 0D   |If no modem output of keyboard data,go to F
0030  |70 C1   |Read R1
0032  |94 CE   |If XOFF,go to A
0034  |20 50 B4|Read modem UART THRE flag
0037  |A0 21 10|
003A  |84 C6   |If not empty,go to A
003C F|1E 1A   |Save interrupt status and disable interrupts
003E  |28 4F C4|KBD-TEXT
0041  |40 21 CA|Clear bits 0,2,4 and 5 of R0
0044  |50      |
0045  |90 57   |Go to output section at O
			-- R7 PROCESSING --
0047 G|74 F0   |Read bit 2 of R0
0049  |84 0A   |If no modem output of R7 , go to H
004B  |70 C1   |Read R1
004D  |94 CD   |If XOFF, go to D, maybe a keyboard input
004F  |A0 21 10|Read modem UART THRE flag(port 4 set in LED)
0052  |84 C8   |If not empty , go to D
0054 H|40 21 20|Read R0 bit 5
0057  |84 09   |If no display of R7 , go to I
0059  |20 58 B4|Read Console UART THRE flag
005C  |A0 21 10|
005F  |84 BB   |If not empty,go back to D
0061 I|40 21 A4|Clear R0 bits 0,1,3,4 and 6
0064  |50 47 55|R5 := R7
0067  |90 35   |Go to output section at O
				-- MODEM INPUT PROCESSING --
0069 J|40 21 10|Read bit 4 of R0
006C  |84 09   |If no display of modem input, go to K
006E  |20 58 B4|Read Console UART THRE flag
0071  |A0 21 10|
0074  |84 94   |If not empty,go back to C
0076 K|20 50 B4|Read modem UART error flags
0079  |A0 21 0E|
007C  |94 1B   |If an error, go to N
007E  |20 54 B4|Read modem input byte
0081  |A0 21 7F|Clear bit 7
0084  |25 13   |Compare to XOFF
0086  |94 04   |If not XOFF, go to L
0088  |31      |Decrement R1 to make it non-zero
0089  |90 0E   |Go to N
008B L|25 11   |Compare to XON
008D  |94 05   |If not XON, go to M
008F  |70 51   |Clear R1
0091  |90 06   |Go to N
0093 M|55 40   |Store input byte in R5
0095  |21 91 50|Clear bits 1,2,3,5 and 6 of R0
0098 N|20 52 B4|Pulse the modem data ready reset line
009B  |70 B4   |
				-- DISPLAY PROCESSING --
009D O|40 21 70|Read bits 4,5 or 6 of R0
00A0  |84 08   |If all are 0, go to P
00A2  |45 57 1E|R7 := R5;save interrupt status and disable interrupts
00A5  |1A      |
00A6  |28 4F 90|DISP-C
				-- MODEM OUTPUT PROCESSING --
00A9 P|7C F0   |Read R0 bits 2 or 3
00AB  |84 08   |If both are 0, go to Q
00AD  |45 B1   |Output data to modem
00AF  |20 56 B4|Pulse modem UART THRL line
00B2  |70 B4   |
				-- MEMORY STORE PROCESSING --
00B4 Q|73 F0   |Read R0 bits 0 or 1
00B6  |84 0E   |If both are 0, go to S
00B8  |78 E5   |Is data a backspace?
00BA  |84 03   |If so, go to R
00BC  |16 1F   |Read memory and increment content
00BE R|20 FF 8E|Decrement DC back to location read
00C1  |84 03   |If memory content is FF,full,or backspace, go to S
00C3  |45 17   |Store R5 in memory
00C5 S|0C      |Return
~4B55
 21 01|
00
------------------
COMPARE.F8S
			COMPARE

COMPARE READS THE MEMORY FROM B TO E AND DISPLAYS
DIFFERENCES WITH THE MEMORY STARTING AT T.
IF THE DIFFERENT LOCATION IS ISOLATED,IT HAS A LINE
TO ITSELF. FOR 2 OR MORE SUCCESSIVE DIFFERENCES, THE
FIRST AND LAST BYTES OF THE RANGE ARE DISPLAYED ON
ONE LINE.
FIRST THE ADDRESS IN B TO E
THEN THE CONTENT IN HEX OF B TO E
THEN THE CONTENT IN HEX AT T RANGE
THEN THE ADDRESS IN THE T RANGE
IF P=17 THEN THE DISPLAYS ARE ON THE TERMINAL
ELSE ON THE HOST AT P BAUD RATE(03=300,12=1200)


@4724
0000  |08 1E 1A|
0003  |28 44 C0|
			-- REDIRECT I/O TO HOST IF P NOT 17 --
0006  |2A FF A8|P ADDRESS 
0009  |16 56 53|R6:=P,SCREEN LENGTH;R3:=P,ROW COUNT
000C  |25 17   |
000E  |84 04   |IF P=17,GO TO A
0010  |28 36 0A|GO-HOST
			-- SET DC0 AND DC1 --
0013 A|16 06 16|Q:=B ADDRESS 
0016  |07 16 16|SKIP E      
0019  |16 5A 16|H:=T ADDRESS
001C  |5B 0F   |DC0:=Q       
001E  |2C 10 2C|EXCHANGE DCs;DC1:=H;EXCHANGE DCs
			-- RESET FLAG TO SEARCH --
0021 B|72 50   |R0:=2,FLAG. 2 IS SEARCH FOR DIFFERENCE
			-- SEE IF END OF RANGE --
0023 C|28 4E B0|DC-LIMIT
0026  |92 22   |IF END,GO TO E
			-- SEE IF DIFFERENT --
0028  |16 51 2C|R1:=<DC0>;EXCHANGE DCs
002B  |16 E1 2C|COMPARE <DC1> AND <DC0>;EXCHANGE DCs
002E  |84 35   |IF EQUAL,GO TO I
			-- SET NEW FLAG --
0030  |70 E0   |
0032  |84 F0   |IF 0,IN A RANGE OF ALL DIFFERENT,GO TO C
0034  |30      |DECREMENT R0
0035  |71 E0   |IF FLAG IS 1,NEW DIFFERENCE
0037  |94 EB   |IF 0,GO TO C,STILL IN ALL-DIFFERENT RANGE
			-- NEW DIFFERENCE --
0039  |28 4D 32|CR-LF
003C  |46 25 17|
003F  |94 04   |IF R6 NOT 17,GO TO D
			-- SEE IF BOTTOM OF SCREEN --
0041  |33      |DECREMENT R3,ROW COUNT
0042  |84 35   |IF 0,GO TO J
			-- WRITE NEW DIFFERENCE --
0044 D|28 46 F0|DISP-DCS
0047  |90 DB   |GO TO C
			-- END OF PROGRAM --
0049 E|70 E0   |IF R0 IS 0, IN A ALL-DIFFERENT RANGE
004B  |94 07   |IF NOT,GO TO F
			-- WRITE END OF RANGE --
004D  |28 46 B8|ELLIPSES
0050  |28 46 F0|DISP-DCS
0053 F|28 4D 32|CR-LF
0056 G|46 25 17|
0059  |84 04   |IF R6=17,GO TO H
005B  |28 36 41|GO-TERMINAL
005E H|1E 1A   |RETURN
0060  |28 44 D0|
0063  |0C      |
			-- NO DIFFERENCE --
0064 I|70 E0   |
0066  |94 BA   |IF R0 NOT 0,GO TO C TO SET FLAG TO 2
			-- END OF ALL-DIFFERENT RANGE --
0068  |28 46 B8|ELLIPSES
006B  |20 FF 8E|DECREMENT DC0,TO READ OUT ADDRESSES
006E  |2C      |OF LAST DIFFERENCE;EXCHANGE DCs
006F  |20 FF 8E|DECREMENT DC1
0072  |2C      |EXCHANGE DCs
0073  |28 46 F0|DISP-DCS
0076  |90 AA   |GO TO C FOR FLAG BACK TO 2
			-- BOTTOM OF SCREEN --
0078 J|20 3E 57|
007B  |28 4F 90|DISP-C ,'>'
007E  |28 4F C0|KBD-CMD
0081  |7D 57   |
0083  |28 4F 90|DISP-C ,CARRIAGE-RETURN
0086  |46 53 45|RESET ROW COUNT
0089  |25 51   |
008B  |94 B8   |IF KEY NOT 'Q',GO TO D
008D  |90 C8   |ABORT,GO TO G
~47B2

003C  |46 25 17|
003  04   |IF R6=17,GO TO H
005B  |28 36 41|GO-TERMINAL
005E H|1E 1A   |RETURN

------------------
COPY.F8S
                         COPY

COP COPIE FRO  T  INCLUSIV T T RANGE CA OVERLAP COP 
REFUSE T COP MOR THA 4 BYTES O T PU I ABOV ED00 
AFTE COPYING  I SE T TH NEX FRE ADDRES I TH DIRECTIO 
THA COPYIN WA DONE.

@3743
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A9| Address
0009  |16 5A 5C|R2 : <BU> H: <B>
000C  |16 5B 16| : <E>
000F  |06 16 07|
0012  |28 03 71|SUBTRACT( :   H; :  H)
0015  |02 50   |R : QU
0017  |25 10   |I rang hig byt  1 he (4K ?
0019  |92 09   |i ove g t A
001B  |03 51 16|R : QL;R2 : TU
001E  |52 25 ED|I  addres hig abov E ?
0021  |82 0C   |I no ove g t C
0023 A|77 57   |
0025  |28 32 78|PROMPT("COP ABORTED")
0028 B|1E 1A   |
002A  |28 44 D0|
002D  |0C      |
002E C|EC 5C 16|R2 : B ex-o TU;R : <TL>
0031  |53 42 06| : B
0034  |43 07   |
0036  |28 03 E3|ADD( :   Q), wa -B
0039  |02 EC   |Compar uppe byt wit R20
003B  |91 0F   |i    i -ve cop fro B,g t D
003D  |2A FF AB|
0040  |16 5A 16| : <T>
0043  |5B      |
0044  |28 03 E3|ADD( :   H Star  fro  to
0047  |20 FE   |se u t cop backwards
0049  |90 05   |g t E
004B D|28 03 71|SUBTRACT( :   H Fro i i H,Star i Q
004E  |70      |Se u t cop forwards
004F E|5C      |R2 : directio flag
0050  |28 02 CA|COPY-MON
0053  |2A FF AD| address
0056  |02 17 03| : Q
0059  |17      |
005A  |90 CD   |Retur vi B
~379E
 
A$).38            

0A U^5
------------------
CR-LF.F8S
				CR-LF

CR-LF SENDS A CARRIAGE-RETURN AND A LINEFEED TO THE CONSOLE

@4D32
0000  |08      |
0001  |7D 57   |
0003  |28 4F 90|DISP-C, CR
0006  |7A 57   |
0008  |28 4F 90|DISP-C, LF
000B  |0C      |
~4D3D
*> >>>>>_ 
------------------
CUR-VT52.F8S
			CUR-VT52

CUR-VT52 POSITIONS THE CURSOR AT ROW=R0 AND COLUMN=R1.HOME=1,1
R0 AND R1 ARE UNCHANGED

@37FB
0000  |08      |
0001  |20 1B 57|'ESC'
0004  |28 4F 90|DISP-C
0007  |20 59 57|'Y'
000A  |28 4F 90|DISP-C
000D  |20 1F C0|
0010  |57      |R7 := R0 + 1F
0011  |28 4F 90|DISP-C
0014  |20 1F C1|
0017  |57      |R7 := R1 + 1F
0018  |28 4F 90|DISP-C
001B  |0C      |
~3816
=R+|b͖!	Ow#lɯw#xu. E>)҉	= ){_ڣڞ_#ɑÜ     :=!
:!	:
------------------
DC-LIMIT.F8S
				DC-LIMIT

DC-LIMIT COMPARES DC WITH THE E ADDRESS(FFAB,FFAC). 
CARRY IS SET UNLESS DC IS GREATER
DC IS NOT CHANGED
DO NOT USE IF DC < 400 HEX

@4EB0
0000  |08 11   |K := PC1;H := DC
0002  |2A FF AB|E  address high byte
0005  |4A 8D   |Compare HU with EU
0007  |94 03   |If not equal,that's all we need to know, go to A
0009  |4B 8D   |Else compare HL with EL
000B A|10 0C   |Restore DC;PC := K
~4EBC
w#lɯw#xu. E>)҉	= ){_ڣڞ_#ɑÜ     :=!
:!	:
------------------
DEC-ADDR.F8S
				DEC-ADDR

DEC-ADDR DECREMENTS DC UNTIL IT POINTS TO A LOCATION
CONTAINING EITHER A 1A(^Z) OR A FF. THE B ADDRESS IS
SET TO THE NEXT HIGHER ADDRESS
DC IS SET TO B

@4D40
0000  |08      |
0001 A|20 FE 8E|Decrement DC by 2
0004  |16 25 1A|Read memory and compare to a 1A(increments DC)
0007  |84 06   |If it is, go to B
0009  |1F      |Increment data
000A  |84 03   |If data is FF, go to B
000C  |90 F4   |Go to A
000E B|11      |H := DC
000F  |2A FF A9|B := H
0012  |4A 17 4B|
0015  |17 0C   |
~4D56
"2::!Ŗ!ņ!ž2ů2<2`!>>2`>(2`~9: 2**zR~
------------------
DELAY.F8S
				DELAY

DELAY WAITS FOR R2/400 SECONDS BEFORE RETURNING
SINCE IT USES INTERRUPTS, DO NOT CALL IF OTHER INTERRUPTS
ARE ENABLED

@47E0
0000  |08      |K := PC1
0001  |20 4F BC|Sets up interrupt vector to 4F00(timer)
0004  |70 BD   |
0006  |20 2E 53|sets up timer value for 2.5 milliseconds
0009  |BF      |with overhead,and saves it in R3
000A  |73 BE 1B|Enables timer and all interrupts
000D A|70 E2   |Test R2
000F  |94 FD   |Loop via A until made 0 by TIMERINT
0011  |0C      |PC := K
~47F1
				TIMERINT

TIMERINT IS CALLED BY THE HARDWARE TIMER IN THE STATIC
MEMORY INTERFACE CHIP WHEN IT TIMES OUT. THE ENTRY POINT
OF TIMERINT MUST FIRST BE LOADED BEFORE THE TIMER IS ENABLED
THE TIMER AND THE EXTERNAL INTERRUPTS CANNOT BOTH BE 
ENABLED AT THE SAME TIME. RESET OF THE COMPUTER DOES NOT
DISABLE INTERRUPTS!
SERVICING AN INTERRUPT DISABLES ALL INTERRUPTS
IT IS PRUDENT TO AVOID USE OF R2,R3,R8 OR R9 BY ANY
PROGRAM UNLESS IT IS CERTAIN THAT NO INTERRUPTS CAN
BE RUNNING DURING ITS EXECUTION

@4F00
0000  |58 1E 32|R8 := ACC;R9 := STATUS;Decrement R2
0003  |94 06   |If R2 is not 0, go to A
0005  |70 BE 1D|Disable timer;STATUS := R9
0008  |48 1C   |ACC := R8;PC0 := PC1(Return from subroutine)
000A A|43 BF 1D|Reload timer constant from R3.Sets timer going
000D  |48 1B 1C|again;Enable interrupts;ACC := R8;PC0 := PC1
~4F0F
#(Z-bz_gy<>2zx{>_|
------------------
DISP-C.F8S
			DISP-C

DISP-HEX DISPLAYS BITS 0-3 OF R7 AS A HEX CHARACTER 
DISP-C DISPLAYS R7 AS AN ASCII CHARACTER
DISP-SUM DISPLAYS BITS 0-3 OF R7 AS A HEX CHARACTER
AND ALSO ADDS BITS 0-3 OF R7 TO R4(CHECKSUM)
THE CONTENTS OF R41 ARE DECREMENTED,ISAR PRESERVED
R7 CONTENTS ARE NOT PRESERVED,BECOMES ISAR
INTERRUPTS ARE DISABLED AND NOT RE-ENABLED

@4F84
				-- DISP-HEX --
0000  |1A      |Disable interrupts,to prevent stealing PC1
0001  |7F F7   |Mask bits 0-3 of R7
0003  |25 09   |Compare to 09
0005  |82 03   |If 00 - 09, go to A
0007  |24 07   |Else add 7
0009 A|24 30 57|Add 30 and save in R7
				-- DISP-C --
000C  |1A      |Disable interrupts
000D B|20 58 B4|Read Console UART status port
0010 C|A0 21 10|Mask Transmitter Holding Register Empty Flag
0013  |84 FC   |If THRE not empty, go to C
0015  |47 B1   |Output R7
0017  |20 5E B4|Pulse Transmitter Holding Register Load
001A  |70 B4 0A|Park port mux;R7 := ISAR
001D  |57      |
001E  |64 69   |ISAR := 41
0020  |3C 47 0B|Decrement R41;ISAR := R7
0023  |1C 00   |PC := PC1
0025  |00 00 00|
				-- DISP-SUM --
0028  |1A      |Disable interrupts
0029  |7F F7 57|Clear bits 4-7 of R7
002C  |C4 54   |R4 := R4 + R7
002E  |47 25 09|Compare R7 to 9
0031  |82 03   |If 0-9, go to D
0033  |24 07   |Add 7
0035 D|24 30 57|Add 30 and store in R7
0038  |90 D4   |Go to B
~4FBD
#(Z-bz_gy<>2zx{>_|
------------------
DISP-DCS.F8S
				DISP-DCS

DISP-DCS DISPLAYS THE ADDRESS IN DC0 - 1, THE CONTENT
OF DC0 - 1, THE CONTENT OF DC1- 1, THE ADDRESS IN DC1 - 1,
AS FOLLOWS:

AAAA CC CC AAAA

DC0 AND DC1 ARE UNCHANGED

@46F0
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |20 FF 8E|Decrement DC0
0009  |0E      |Q:=DC0-1
000A  |28 4F 33|4-HEX
000D  |28 31 A0|SPACE
0010  |16 07   |QL:=<DC0-1>,DC0 INCREMENTED
0012  |28 4F 30|2-HEX
0015  |28 31 A0|SPACE
0018  |2C      |Exchange DC0 and DC1
0019  |20 FF 8E|Decrement DC1
001C  |11      |H:=DC-1
001D  |16 07   |QL:=<DC1-1>,DC1 INCREMENTED
001F  |28 4F 30|2-HEX
0022  |28 31 A0|SPACE
0025  |4A 06   |Q:=H
0027  |4B 07   |
0029  |28 4F 33|4-HEX
002C  |2C 1E 1A|Exchange DC0 and DC1
002F  |28 44 D0|
0032  |0C      |
~4722
       
------------------
DISP-DEC.F8S
				DISP-DEC

DISP-DEC HAS TWO ENTRY POINTS, DISP-1D AND DISP-2D
DISP-1D DISPLAYS HL AS A SIGNED DECIMAL. 
DISP-2D DISPLAYS H AS A SIGNED DECIMAL
IN BOTH CASES R5 MOVES THE DECIMAL POINT LEFT FOR
NEGATIVE VALUES AND RIGHT FOR POSITIVE VALUES. IF
R5 IS 0, DISPLAY IS INTEGER
R5 AND H NOT SAVED

				-- DISP-1D --
@4800
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |70 5A EB|HU := 0;Read HL
0009  |81 21   |If positive, go to B
000B  |3A      |Decrement HU
000C  |90 0D   |Go to A
				-- DISP-2D --
0010  |08      |
0011  |1E 1A   |
0013  |28 44 C0|
0016  |70 EA   |Read HU
0018  |81 12   |Go to B if positive
				-- NEGATIVE NUMBERS --
001A A|4A 56 4B|R6,7 := H
001D  |57      |
001E  |28 49 60|NEGATE
0021  |46 5A 47|H := R6,7
0024  |5B      |
0025  |20 2D 57|
0028  |28 4F 90|DISP-C,'-'
				-- POSITIVE NUMBERS --
002B B|74 C5 55|R5 := R5 + 4, Adjust multiplier for length of integer
002E  |71 53   |R3 := 1, leading zero flag
0030  |63      |ISAR := 37
0031  |6F      |
0032  |20 D8 5D|Set up the values for decimal
0035  |20 F0 5D|-10000
0038  |20 FC 5D|-1000
003B  |20 18 5D|
003E  |20 FF 5D|-100
0041  |20 9C 5D|
0044  |20 FF 5D|-10 into R30-37
0047  |20 F6 5D|
				-- MAIN LOOP --
004A C|70 52 54|R2 := 0,Result;R4 := 0,Multiplier
004D  |E3      |Read R3
004E  |94 05   |Go to D if not 0
0050  |8F      |If ISARL is not 7, go to D
0051  |03      |
0052  |71 54   |R4 := 1
0054 D|70 E5   |Read R5,Exponent
0056  |81 18   |Go to F if positive
				-- DP AND LEADING ZEROES --
0058  |20 2E 57|
005B  |28 4F 90|DISP-C, period
005E  |70 53   |R3 := 0
0060 E|45 25 FE|Compare R5 to -2
0063  |92 0E   |If no carry, go to G(ie -1 or more)
0065  |1F 55   |Increment R5
0067  |20 30 57|
006A  |28 4F 90|DISP-C, '0'
006D  |90 F2   |Go to E 
				
006F F|35      |Decrement R5
0070  |90 04   |Go to H
				  
0072 G|20 7F 55|R5 := 7F
			-- SUBTRACT NEXT POWER OF 10 --
0075 H|4D 56 4D|R6,7 := <ISAR>, decremented
0078  |57      |
0079  |70 E4   |Read R4
007B  |84 1E   |If 0, go to K
007D  |4B 57   |
007F  |28 4F 84|DISP-HEX, HL
0082  |45 25 77|Compare R5 to 77
0085  |92 0E   |If greater, go to J
				-- TRAILING ZEROES --
0087 I|18      |Complement R5
0088  |81 0B   |Go to J if positive
008A  |35      |Decrement R5
008B  |20 30 57|
008E  |28 4F 90|DISP-C, '0'
0091  |45      |ACC := R5
0092  |90 F4   |Go to I
				-- RETURN --
0094 J|1E 1A   |
0096  |28 44 D0|
0099  |0C      |
				-- DIVIDE LOOP --
009A K|71 54 4A|R4 := 1
009D  |06 4B 07|Q := H
00A0  |28 49 70|MULT-ADD(H := H + R4 * R6,7)
00A3  |1D      |STATUS := R9
00A4  |91 06   |Go to L if negative
00A6  |42 1F 52|Increment R2
00A9  |90 F0   |Go to KU
			
00AB L|02 5A 03|H := Q
00AE  |5B      |
00AF  |70 E2   |Read R2, Result
00B1  |94 07   |Go to M if not 0
00B3  |70 E3   |Read R3
00B5  |84 05   |Go to N if 0
00B7  |90 08   |Go to O
				
00B9 M|70 53   |R3 := 0
				-- OUTPUT DIGIT --
00BB N|42 57   |
00BD  |28 4F 84|DISP-HEX, R2
				
00C0 O|8F      |Go to C if ISARL is not 7
00C1  |89      |
00C2  |70 53   |R3 := 0
00C4  |90 85   |Go to C
~48C5
                                                                              
------------------
DISP-ESC.F8S
				DISP-ESC

DISP-ESC DISPLAYS A CONTROL SEQUENCE CONSISTING OF THE ESCAPE
CHARACTER(1B HEX), THEN THE R2 + 40

@4F10
0000  |08      |K := PC1
0001  |20 1B 57|
0004  |28 4F 90|DISP-C,ESC
0007  |20 40 C2|
000A  |57      |R7 := R2 + 40
000B  |28 4F 90|DISP-C
000E  |0C      |PC := K
~4F1E
2 >> >!!ʩʮʳʸʽ!':
------------------
DISP-FP.F8S
				DISP-FP

DISP-FP DISPLAYS THE FLOATING POINT NUMBER WHOSE BINARY
MANTISSA IS IN H, AND WHOSE DECIMAL EXPONENT IS IN R5.
IF R5 IS IN THE RANGE F9 - 02 THE DISPLAY IS FIXED-POINT
FOR R5 = 0 THE DISPLAY IS THE SIGNED INTEGER OF H
ELSE IT IS FLOATING POINT WITH THREE PLACES OF DECIMALS

@49B5
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |77 C5   |Read R5 and add 7
0008  |25 09   |Compare to 9
000A  |82 1E   |If between -7 and 2,go to A
				-- FLOATING-POINT --
000C  |73 C5 5C|R20 := R5 + 3,normalise and save exponent
000F  |20 FD 55|R5 := -3
0012  |28 48 10|DISP-2D, mantissa
0015  |71 52   |
0017  |28 4F 5D|DISP-C,space
001A  |20 45 57|
001D  |28 4F 90|DISP-C,'E'
0020  |4C 5B   |HL := R20,exponent
0022  |70 55   |R5 := 0,integer exponent
0024  |28 48 00|DISP-1D,exponent
0027  |90 04   |Go to B
				-- FIXED-POINT --
0029 A|28 48 10|
002C B|1E 1A   |Return
002E  |28 44 D0|
0031  |0C      |
~49E6
> v>!Ʈw!~@w!~w!~5!ņw!~6 ɷ=é:ŷ>v:2
------------------
DISP-HEX.F8S
				DISP-HEX

DISP-HEX DISPLAYS BITS 0-3 OF R7 AS A HEX CHARACTER 
DISP-C DISPLAYS R7 AS AN ASCII CHARACTER
DISP-SUM DISPLAYS BITS 0-3 OF R7 AS A HEX CHARACTER
AND ALSO ADDS BITS 0-3 OF R7 TO R4(CHECKSUM)
THE CONTENTS OF R41 ARE DECREMENTED,ISAR PRESERVED
R7 CONTENTS ARE NOT PRESERVED,BECOMES ISAR
INTERRUPTS ARE DISABLED AND NOT RE-ENABLED

@4F84
				-- DISP-HEX --
0000  |1A      |Disable interrupts,to prevent stealing PC1
0001  |7F F7   |Mask bits 0-3 of R7
0003  |25 09   |Compare to 09
0005  |82 03   |If 00 - 09, go to A
0007  |24 07   |Else add 7
0009 A|24 30 57|Add 30 and save in R7
				-- DISP-C --
000C  |1A      |Disable interrupts
000D B|20 58 B4|Read Console UART status port
0010 C|A0 21 10|Mask Transmitter Holding Register Empty Flag
0013  |84 FC   |If THRE not empty, go to C
0015  |47 B1   |Output R7
0017  |20 5E B4|Pulse Transmitter Holding Register Load
001A  |70 B4 0A|Park port mux;R7 := ISAR
001D  |57      |
001E  |64 69   |ISAR := 41
0020  |3C 47 0B|Decrement R41;ISAR := R7
0023  |1C 00   |PC := PC1
0025  |00 00 00|
				-- DISP-SUM --
0028  |1A      |Disable interrupts
0029  |7F F7 57|Clear bits 4-7 of R7
002C  |C4 54   |R4 := R4 + R7
002E  |47 25 09|Compare R7 to 9
0031  |82 03   |If 0-9, go to D
0033  |24 07   |Add 7
0035 D|24 30 57|Add 30 and store in R7
0038  |90 D4   |Go to B
~4FBD
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
DISP-STR.F8S
				DISP-STR

DISP-STR IS A VEHICLE TO USE COMM FOR GENERAL COMMUNICATIONS
DISP-STR RETURNS WHEN THE VALUE OF R5 RETURNED BY COMM IS 1A
OR IF TRY TO STORE INTO A MEMORY LOCATION WITH A FF IN IT
OR IF A FF IS READ OUT OF MEMORY
DISP-STR IS CONFIGURED BY R20 WHICH HAS THE SAME FORMAT AS 
FOR COMM. THE MOST USEFUL CODES ARE:
	R20=60:	READ MEMORY AND KEYBOARD TO DISPLAY
	R20=18:	MODEM TO DISPLAY,KEYBOARD TO MODEM
	R20=19:	MODEM TO DISPLAY AND MEMORY,KEYBOARD TO MODEM
	R20=1C:	MEMORY AND KEYBOARD TO MODEM,MODEM TO DISPLAY

@4CA0
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |70 51   |R1 := 0,XON
0008 A|20 24 FC|Read bits 2 and 5 of R20
000B  |84 09   |If both are zero, no memory readout, go to C
				-- READ MEMORY --
000D  |16 56   |R6 := <DC>
000F  |25 FF   |Compare to FF
0011  |84 0F   |If FF, go to D
0013 B|46 57   |R7 := R6
				-- INVOKE COMM --
0015 C|4C 50   |R0 := R20
0017  |28 4A 90|COMM
001A  |82 07   |If carry, memory is full(has a FF in it), go to E
001C  |20 1A E5|Is the byte read by COMM a 1A?
001F  |94 08   |If not, go to F
				-- EXIT PROCESSING --
0021 D|8E      |Decrement DC to avoid jumping over a FF
0022 E|1E 1A   |Return
0024  |28 44 D0|
0027  |0C      |
				-- CHECK COMM STATUS --
0028 F|4C E0   |Compare R20 with R0
002A  |21 24   |for bits 2 and 5
002C  |94 E6   |If unequal, R7 was not output, go to B
002E  |90 D9   |Go to A
~4CC7
|
------------------
DISP-SUM.F8S
			DISP-SUM

DISP-HEX DISPLAYS BITS 0-3 OF R7 AS A HEX CHARACTER 
DISP-C DISPLAYS R7 AS AN ASCII CHARACTER
DISP-SUM DISPLAYS BITS 0-3 OF R7 AS A HEX CHARACTER
AND ALSO ADDS BITS 0-3 OF R7 TO R4(CHECKSUM)
THE CONTENTS OF R41 ARE DECREMENTED,ISAR PRESERVED
R7 CONTENTS ARE NOT PRESERVED,BECOMES ISAR
INTERRUPTS ARE DISABLED AND NOT RE-ENABLED

@4F84
				-- DISP-HEX --
0000  |1A      |Disable interrupts,to prevent stealing PC1
0001  |7F F7   |Mask bits 0-3 of R7
0003  |25 09   |Compare to 09
0005  |82 03   |If 00 - 09, go to A
0007  |24 07   |Else add 7
0009 A|24 30 57|Add 30 and save in R7
				-- DISP-C --
000C  |1A      |Disable interrupts
000D B|20 58 B4|Read Console UART status port
0010 C|A0 21 10|Mask Transmitter Holding Register Empty Flag
0013  |84 FC   |If THRE not empty, go to C
0015  |47 B1   |Output R7
0017  |20 5E B4|Pulse Transmitter Holding Register Load
001A  |70 B4 0A|Park port mux;R7 := ISAR
001D  |57      |
001E  |64 69   |ISAR := 41
0020  |3C 47 0B|Decrement R41;ISAR := R7
0023  |1C 00   |PC := PC1
0025  |00 00 00|
				-- DISP-SUM --
0028  |1A      |Disable interrupts
0029  |7F F7 57|Clear bits 4-7 of R7
002C  |C4 54   |R4 := R4 + R7
002E  |47 25 09|Compare R7 to 9
0031  |82 03   |If 0-9, go to D
0033  |24 07   |Add 7
0035 D|24 30 57|Add 30 and store in R7
0038  |90 D4   |Go to B
~4FBD
#(Z-bz_gy<>2zx{>_|
------------------
DISPTIME.F8S
				DISPTIME


DISPTIME DISPLAYS HOURS AND MINUTES AT THE CURSOR POSITION.
THEN DATE AS 15:30 02/28/86.
THE YEAR MUST BE INSERTED AT FFA2

@4B58 
0000  |08 1E 1A|
0003  |28 44 C0|
			-- HOURS --
0006  |63      |ISAR := 33
0007  |6B 4D 07|QL := R33, ISAR := 34
000A  |28 4F 30|2-HEX
000D  |20 3A 57|
0010  |28 4F 90|DISP-C, ':'
			-- MINUTES --
0013  |4C 07   |
0015  |28 4F 30|
0018  |28 31 A0|SPACE
			-- MONTHS --
001B  |68 4C 07|ISAR := 30
001E  |28 4F 30|
0021  |20 2F 57|
0024  |28 4F 90|DISP-C, '/'
			-- DAYS --
0027  |6A 4C 07|ISAR := 32
002A  |28 4F 30|
002D  |20 2F 57|
0030  |28 4F 90|
			-- YEAR --
0033  |2A FF A2|
0036  |16 07   |
0038  |28 4F 30|
003B  |1E 1A   |
003D  |28 44 D0|
0040  |0C      |
~4B98
   |Bits 0
------------------
DISTRIB.F8S
				DISTRIB

DISTRIB DISPLAYS THE COUNT OF EACH BYTE VALUE BETWEEN THE B AND E
ADDRESSES, INCLUSIVE. THE COUNTS ARE IN DECIMAL. THE VALUES ARE
ALSO READ OUT. IF P=00, THE VALUES ARE IN HEX. IF P=01 THE VALUES
ARE IN UNSIGNED DECIMAL. IF P=02 THEY ARE IN SIGNED DECIMAL.
OTHERWISE BYTES WHOSE ASCII VALUE IS PRINTABLE IS DISPLAYED AS A
CHARACTER, THE REST ARE HEX.
THE DISPLAY IS BEST FOR 9 TABS PER LINE(EVERY 9 COLUMNS), THEN IF
THERE ARE ENOUGH VALUES, THE DISPLAY STOPS ON THE LAST LINE AND
WAITS FOR A KEY TO BE PRESSED. A PERIOD ABORTS, ELSE CONTINUES.
IF A COUNT IS 0, THE VALUE AND COUNT ARE NOT DISPLAYED.
(ADD A CLR-SCRN AT BEGINNING)
@4BFB
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |70 50   |Clear R0, character to be matched
			-- SET PAGE SIZE --
0008 A|20 D2 51|R1:=210
			-- GET PARAMETERS --
000B B|2A FF A8|P ADDRESS 
000E  |16 55 16|R5:=P
0011  |5A 16 5B|DC:=B 
0014  |10      |
0015  |70 52 53|R2,3:=0,count of matches
			-- FIND AND COUNT MATCH FOR 1 VALUE --
0018 C|40 8D   |Compare R0 to <DC>
001A  |94 07   |If not =,GO TO D
001C  |43 1F 53|Increment count if equal
001F  |42 19 52|
0022 D|28 4E B0|DC-LIMIT
0025  |82 F2   |Go to C if still in range
			-- SEE IF COUNT WAS NON-ZERO --
0027  |70 E3   |Test R3 
0029  |94 04   |If not Zero,GO TO E
002B  |E2      |Test R2
002C  |84 5A   |If zero,GO TO K, no display of zero counts
			-- DISPLAY VALUE --
002E E|64      |Set ISARH for SAVE-REG to 40
002F  |28 4A 80|SAVE-REG
0032  |70 E5   |Test R5, display mode parameter
0034  |84 24   |If zero, hex mode,GO TO G
0036  |25 01   |Compare to 01
0038  |84 27   |If 01, unsigned decimal mode,GO TO H
003A  |25 02   |Compare to 02
003C  |84 2D   |If 02, signed decimal mode,GO TO I
			-- CHARACTER MODE --
003E  |20 7F F0|ACC:=R0 AND 7F (Clear bit 7)
0041  |25 20   |Compare to 20 hex
0043  |82 15   |If not over, hex mode,GO TO G
0045  |57      |R7:=ACC
0046  |28 4F 90|DISP-C 
0049  |90 27   |Go to J
			-- TEST FOR SCREENFULL --
004B F|70 E1   |Test R1, number of values written
004D  |94 BD   |IF NOT 0,GO TO B
004F  |28 4F C0|KBD-CMD
0052  |45 25 2E|COMPARE TO A PERIOD
0055  |94 B2   |if not a period,GO TO A
0057  |90 34   |else abort,GO TO M
			-- HEX MODE --
0059 G|40 07   |QL:=R0,value
005B  |28 4F 30|2-HEX
005E  |90 12   |Go to J
			-- UNSIGNED DECIMAL MODE --
0060 H|70 5A 55|HU:=0;R5:=0
0063  |40 5B   |HL:=R0
0065  |28 48 10|DISP-2D
0068  |90 08   |Go to J
			-- SIGNED DECIMAL MODE --
006A I|70 55   |R5:=0
006C  |40 5B   |HL:=R0
006E  |28 48 00|DISP-1D
			-- DISPLAY COUNT --
0071 J|71 52   |R2:=1
0073  |28 4F 5D|N-SPACE
0076  |64 6A   |ISAR:=42 (ONLY SAVED VALUES WANTED WERE R2,3)
0078  |70 55 4D|R5:=0;H:=R2,3
007B  |5A 4C 5B|
007E  |28 48 10|DISP-2D
0081  |79 57   |TAB
0083  |28 4F 90|DISP-C 
0086  |31      |Decrement R0, values left in screen
			-- TRY NEXT VALUE --
0087 K|40 1F 50|Increment R0, value
008A  |94 C0   |If not 0,GO TO F
008C L|1E 1A   |Return
008E  |28 44 D0|
0091  |0C      |
~4C8C
 a period,GO TO    0057  |90 34   |else ab
------------------
DIVIDE.F8S
				DIVIDE

The dividend is in R6,R7 and the divisor is in R4. Both are unsigned.
If R4 = 0, quotient is FFFF hex. Quotient is in H, remainder in R2.

@4A51
0000  |08      |Save PC1 in K
0001  |70 5A 5B| H := 0
0004  |E4      |Compare R4 to 0
0005  |84 1F   |If R4 = 0, goto D, exit, invalid divisor
0007  |18 1F 54|Negate R4
000A A|47 52 C4|Save R7 in R2, R7 := R7 + R4
000D  |57      |
000E  |82 04   |Goto B if carry
0010  |36      |Decrement R6
0011  |92 09   |Goto C if no carry
0013 B|4B 1F 5B|H := H + 1
0016  |4A 19 5A|
0019  |90 F0   |Goto A
001B C|44 12   |Acc := (80 ^ R4/2) + R2
001D  |22 80 C2|
0020  |92 0A   |Goto E if no carry
0022  |4B 1F 5B|H := H + 1
0025 D|4A 19 5A|
0028  |42 C4 52|R2 := R2 + R4, correct the remainder
002B E|0C      |
~4A7C


This program has errors and does not correspond to the PROM!
------------------
DRAW.F8S
				DRAW

Draws a diagram on the Tektronix 4006-1 per instructions in a table at DC.
It has a Text and a Graphics Mode. The flag is in R45, Text is 0.
Format for Table:
	Text Mode:	1A causes exit
			1D sends it and goes to Graphics mode
			All else is output
	Graphics Mode:	0 through EF draws a vector with this angle
			FO: Next two bytes are vector length for R31,32
			F1: Next two bytes are vector start Y for R33,34
			F2: Next two bytes are vector start X for R35,36
			F5: Output a CR (0D) and go to Text Mode
			FD: Output a ID
			FF: Output a 1F and go to Text Mode
@0500
0000  |08 1E 1A|Save K in stack
0003  |28 44 C0|
0006 A|20 1F   |GS=1D hex is Text start
0008 B|57      |R7 := character to be output to modem port
0009  |28 4D 20|XMIT-C
000C  |64      |ISAR := 45, MODE FLAG
000D  |6D      |
000E  |70 5C   |Mode := text
0010 C|64      |Test Mode
0011  |6D      |
0012  |70 CC   |
0014  |63 16   |ISAR := 35; Read next table entry
0016  |84 45   |
0018  |25 EF   |
001A  |92 0B   |
001C  |68 5C   |
001E  |28 80 80|
0021  |28 41 AB|
0024  |90 EB   |
0026 D|25 F0   |
0028  |94 08   |
002A  |69      |
002B E|16 5D 16|
002E  |5C      |
002F  |90 E0   |
0031 F|25 F1   |
0033  |94 04   |
0035  |6B      |
0036  |90 F4   |
0038 G|25 F2   |
003A  |94 04   |
003C  |6D      |
003D  |90 ED   |
003F H|25 F5   |
0041  |94 04   |
0043 I|7D      |
0044  |90 C3   |
0046 J|25 FF   |
0048  |94 03   |
004A  |90 BB   |
004C K|25 FD   |
004E  |94 15   |
0050  |20 1D 57|
0053  |28 4D 20|
0056  |64      |
0057  |6D      |
0058  |71 5C   |
005A  |90 B5   |
005C L|25 1D   |
005E  |84 E4   |
0060  |25 1A   |
0062  |94 A5   |
0064 M|1E 1A   |
0066  |28 44 D0|
0069  |0C      |
~0569

------------------
DRAWCHAR.F8S
				DRAWCHAR

DRAWCHAR READS BINARY IMAGES OF ZRT-80 CHARACTER-GENERATOR EPROMS
AND SHOWS THE SHAPE OF 16 CELLS ON THE TATUNG WITH THEIR ADDRESSES.
EACH PIXEL IS ONE CHARACTER WIDTH. CAN CONTINUE WITH THE NEXT 16
WITH A CR, GO BACK TO THE PREVIOUS 16 BY A -, OR RETURN WITH A 
PERIOD. IN THE EPROM, EACH CHARACTER OCCUPIES THE FIRST 9 BYTES
OF A 16-BYTE BLOCK STARTING ON A 0XX0 BOUNDARY. THE BYTES ARE
READ TOP TO BOTTOM, AND THE BITS IN THE BYTE ARE MSB ON THE LEFT.

@3DA0
0000  |08 1E 1A|
0003  |28 44 C0|
0006 A|28 37 9F|CLR-SCRN
0009  |2A FF A9|B
000C  |16 5A 16|DC:=<B>
000F  |5B 10   |
0011  |71 54   |R4:=1, Row number of top row of character
0013 B|71 51   |R1:=1, Column number at left of character
0015 C|70 53   |R3:=0, Index of row being written now
0017  |0E      |Save DC of top row in Q
0018 D|44 C3 50|R0:=R4 + R3, Row number being written now
001B  |28 37 FB|CUR-VT52, left pixel of row
001E  |76 52   |R2:=6, ESC-F starts graphic
0020  |28 4F 11|DISP-ESC
0023  |16 56   |R6:=<DC>
0025 E|20 20 57|R7:='Space'
0028  |70 C6   |Test R6
002A  |84 0F   |Go to G if 0,row done
002C  |81 05   |Go to F if MSB is a zero(pixel off)
002E  |20 41 C7|R7:=R7+41,'a' is solid character in graphic
0031  |57      |
0032 F|28 4F 90|DISP-C
0035  |46 13 56|Shift R6 left 1
0038  |90 EC   |Go To E for next pixel in row
003A G|77 52   |
003C  |28 4F 11|DISP-ESC, ESC-G, end graphics
003F  |71 C3 53|Increment R3, next row in char
0042  |25 0A   |
0044  |94 D3   |Go back to D for another row if < 10 rows
0046  |7A C4 50|R0:=R4+0A, Row to write address on
0049  |71 C1 51|Increment R1, starting column for address
004C  |28 37 FB|CUR-VT52
004F  |28 4F 33|4-HEX
0052  |76 8E   |DC:=DC+6, start of next char block
0054  |79 C1 51|R1:=R1+9, Column at left of next char
0057  |25 4F   |
0059  |82 BB   |Go back to C to draw another char if col < 50
005B  |7C C4 54|R4:=R4+0C, 2nd row of characters
005E  |25 0D   |
0060  |82 B2   |Go back to B for 2nd row if row < 0E
0062  |28 37 B9|KBD-CMD
0065  |2A FF A9|B(High)
0068  |0E 45   |Save DC
006A  |25 2D   |
006C  |94 08   |Go to I if not '-'
006E  |20 FF   |Decrement
0070 H|88 0F 17|FFA9:=ACC+<FFA9>
0073  |90 92   |Go back to A for next screen
0075 I|25 2E   |
0077  |84 04   |Go to J if '.'
0079  |71      |Increment
007A  |90 F5   |Go to H
007C J|28 37 9F|CLR-SCRN
007F  |1E 1A   |Return
0081  |28 44 D0|
0084  |0C      |
~3E24
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
ELLIPSES.F8S
			ELLIPSES

ELLIPSES DISPLAYS ' ... '

@46B8
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |28 31 A0|SPACE
0009  |73 52   |R2:=3,index
000B A|20 2E 57|
000E  |28 4F 90|DISP-C ,'.'
0011  |32      |Decrement R2
0012  |94 F8   |,GO TO A if not 0
0014  |28 31 A0|SPACE
0017  |1E 1A   |
0019  |28 44 D0|
001C  |0C      |
~46D4
                                                
------------------
EPROM-CP.F8S
				EPROM-CP

EPROM-CP READS EPROMS IN THE PROGRAMMING SOCKET INTO MEMORY
USE TO READ FORWARDS FOR EPROMS NOT FOR USE IN THE F8
THE PROGRAMMING SOCKET READS ADDRESSES FORWARDS IF P=00,
OR COMPLEMENTED IF P=FF.
PROM RANGE IS FROM B TO E,STORES STARTING AT T
(F8 PROMS ARE PROGRAMMED COMPLEMENTED BECAUSE THE RUN SOCKETS HAVE
COMPLEMENTED ADDRESSES APPLIED)
A NON-F8 PROM READS BACKWARDS IN A RUN SOCKET
(P is assumed to be in R20)

@45C0
0000  |08 1E 1A|
0003  |28 44 C0|PUSH
0006  |2A FF A9|B ADDRESS
0009  |16 50 16|R0,R1:=B
000C  |51 16 52|R2,R3:=E
000F  |16 53 16|H:=T
0012  |5A 16 5B|
0015  |10      |DC:=T
0016 A|40 EC B1|Invert address in R0,R1 if P=FF
0019  |75 B4   |and output to prom address register
001B  |70 B4 41|
001E  |EC B1   |
0020  |71 B4   |
0022  |20 80 B4|Read eprom
0025  |A0 17 41|and store
0028  |1F 51   |increment R0,R1
002A  |94 04   |
002C  |40 1F 50|
002F B|40 E2   |compare high bytes :  R0 and R2
0031  |94 E4   |if not equal,not finished,go to A
0033  |41 E3   |compare low bytes :  R1 and R3
0035  |94 E0   |if unequal,go to A
0037  |1E 1A   |return
0039  |28 44 D0|
003C  |0C      |
~45FC
;: ̈́͢ ҂ʂʂʂį::ʗ=×<!Ŗ:!ņ!žҾ:ŷʟâ> â:
------------------
EPROMLOC.F8S
			EPROMLOC

EPROMLOC ENTERS R5(HIGH) AND R6(LOW) ADDRESS INTO EPROM.IF R0 IS 0,
THEN COPYING IS FORWARD. IF R0 IS FF THEN THE ADDRESS IS COMPLEMENTED

@31B0
0000  |08 45 E0|
0003  |B1      |Enter high byte ex-or R0 into chip
0004  |75 B4   |
0006  |74 B4 46|
0009  |E0 B1   |Enter low byte ex-or R1 into chip
000B  |71 B4   |
000D  |70 B4 0C|
~31BF
ʽ!':
------------------
EPROMWR.F8S
			EPROMWR

EPROMWR BURNS MEMORY FROM B TO E INTO THE EPROM AT T. T=0 IS THE
FIRST EPROM ADDRESS. P=0 TO COPY FORWARDS,AND FF TO COPY BACKWARDS
AS WHEN MAKING AN EPROM FOR THE F8,WHICH HAS INVERTED ADDRESS LINES

			-- INITIALISATION -- 
@31C0
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A8|P Address
0009  |16 50 16|R0 := <P>
000C  |06 16 07|Q := <B>
000F  |16 16 16|Skip E for now
0012  |55 16 56|R5,6 := <T>
0015  |0F      |DC := Q(B)
0016  |70 51 53|Zero R1(Total errors),R3,4(Total retries)
0019  |54      |
			-- BURN ONE LINE --
001A A|70 58 0E|Zero R8(Retry count for this address)
001D  |16 5A   |HU := <DC> (Data)
001F  |7D 57   |'CR' Display overwrites unless there was a retry
0021  |28 4F 90|DISP-C
0024  |28 31 A0|SPACE
0027  |28 4F 33|4-HEX, Q has memory address
002A  |28 31 A0|SPACE
002D  |45 06 46|Q := R5,6 Chip address
0030  |07      |
0031  |28 4F 33|4-HEX
0034  |28 31 A0|SPACE
0037  |4A 07   |QL := HU Memory data
0039  |28 4F 30|2-HEX
003C  |28 31 A0|SPACE
			-- PULSE THE WRITE LINE --
003F B|7B B4   |Pulse Vpp first to avoid transient to address latch
0041  |28 31 B0|EPROM.LOC, Enter address into chip
0044  |4A 18 B1|Set data inverted into chip(Hardware)
0047  |20 64 B4|Read Vpp
004A C|A0      |
004B  |91 FE   |Loop via C until low
004D  |20 42 52|Set wait count for 600 microseconds for fall time
0050 D|32      |Decrement wait count
0051  |94 FE   |Loop via D until zero
0053  |28 31 B0|EPROMLOC,Set address into chip again to check it
0056  |20 80 B4|Read chip value
0059  |A0 07   |into QL
005B  |70 C8   |Is retry count zero ?
005D  |84 09   |If so go to E
005F  |20 2E 57|'.'
0062  |28 4F 90|DISP-C
0065  |90 07   |Go to F
0067 E|28 4F 30|2-HEX chip actual contents
006A  |28 31 A0|SPACE
006D F|03 EA   |Compare memory value to chip content
006F  |94 10   |If unequal,go to I
0071 G|46 1F 56|Increment chip address

0074  |92 04   |
0076  |45 1F 55|
0079 H|28 4E B0|DC-LIMIT,See if E address exceeded
007C  |82 9D   |If carry,not yet,go back to A
007E  |90 1A   |Go to K for wrap-up
			-- WRITE ERROR --
0080 I|44 1F 54|Increment total retries
0083  |92 04   |
0085  |43 1F 53|
0088 J|48 1F 58|Increment retry count for this location
008B  |25 3E   |Compare to retry limit(62)
008D  |82 B1   |If not exceeded,go to B for another try
008F  |41 1F 51|Increment total errors
0092  |7A 57   |'LF'
0094  |28 4F 90|DISP-C
0097  |90 D9   |Go to G to continue
			-- WRAP UP --
0099 K|28 4D 32|CR-LF
009C  |43 06 44|Q := R3,4 Total Retries
009F  |07      |
00A0  |28 4F 33|4-HEX
00A3  |28 31 A0|SPACE
00A6  |41 07   |QL := Total Errors
00A8  |28 4F 30|2-HEX
00AB  |28 4D 32|CR-LF
00AE  |1E 1A   |
00B0  |28 44 D0|
00B3  |0C FF   |
~3274
UUUUUUUUUUUUUU UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
ERASE-LN.F8S
			ERASE-LN
ERASE-LN IS AN UNSOPHISTICATED WAY TO ERASE A LINE ON THE CONSOLE

@32C8
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |7D 57   |'CR'
0008  |28 4F 90|DISP-C
000B  |20 50 52|R2 := 50(80 COLUMNS)
000E  |28 4F 5D|N-SPACE
0011  |7D 57   |'CR'
0013  |28 4F 90|DISP-C
0016  |1E 1A   |
0018  |28 44 D0|
001B  |0C      |
~32E3
000C  |06 16 07|Q := <B>
000F  |16 16 16|
------------------
EXEC-DC.F8S
				EXEC-DC

EXEC-DC RUNS THE PROGRAM GIVEN BY DC(WHICH IS B FROM BROWSE)

@3608
0000  |0E 0D   |Q := DC;PC0 := Q
~3609
*!  9"1cƯ2!Æ!  9"1cƯ2Ĵ!Æ*2>Ù>!  9"*> >>>>>_ 
------------------
EXT-INT.F8S
				EXT-INT

EXT-INT IS ENTERED AT 4F00 WHEN AN EXTERNAL INTERRUPT OCCURS.
INTERRUPTS ARE DISABLED BY THE CPU. EXT-INT SAVES ACC,W,ISAR,Q
AND DC, THEN JUMPS TO THE ADDRESS IN I(FFA3,4) UNLESS THAT IS
OVER COFF. ELSE THE ENVIRONMENT IS RESTORED AND EXT-INT RETURNS
WITH INTERRUPTS ENABLED. R22-26 ARE USED AND MUST BE DEDICATED.

@1F4B
			-- SECOND PART OF EXT-INT --
0000 A|0A      |ACC:=ISAR
0001  |62      |ISAR:=22
0002  |6A      |
0003  |90 1B   |GO TO F
			-- RHEX --
0005  |08 45   |
0007  |21 7F   |
0009  |25 39   |
000B  |92 03   |
000D  |24 07   |
000F B|24 C9 0C|
			-- N-SPACE --
0012 C|08      |
0013 D|32      |
0014  |81 02   |
0016  |0C      |
0017 E|20 20 57|
001A  |28 4F 90|
001D  |90 F5   |
			-- THIRD PART OF EXT-INT --
001F F|5D 02 5D|R22:=ISAR
0022  |03 5D 0E|R23,24:=Q
0025  |02 5D 03|R25,26:=DC
0028  |5C      |
0029  |2A FF A3|I
002C  |16 25 C0|
002F  |92 72   |GO TO O IF <FFA3> IS OVER C0XX
0031  |06 16 07|Q:=<I>
0034  |0D      |JUMP TO <I> WHERE AN INTERRUPT HANDLER MUST RESIDE

			-- FIRST PART OF EXT-INT, INT VECTOR -
0037  |58 IE   |R8:=ACC;R9:=STATUS REG.
0037  |90 C8   |GO TO A
			-- DISP-HEX --
0039  |1A      |
003A  |7F F7   |
003C  |25 09   |
003E  |82 03   |
0040  |24 07   |
0042 F|24 30 57|
  			-- DISP-C --
0045  |1A      |
0046 G|20 58 B4|
0049 H|A0 21 10|
004C  |84 FC   |
004E  |47 B1   |
0050  |20 5E B4|
0053  |70 B4 0A|
0056  |57      |
0057  |64      |
0058  |69 3C 47|
005B  |0B 1B 1C|
005E  |00 00 00|
			-- DISP-SUM --
0061  |1A      |
0062  |7F F7 57|
0065  |C4 54 47|
0068  |25 09   |
006A  |82 03   |
006C  |24 07   |
006E I|24 30 57|
0071  |90 D4   |
0073  |00 00   |
			-- KBD-CMD --
0075  |1A      |
0076  |20 BF   |
0078  |90 03   |
007A  |1A      |
007B  |77      |
007C J|55      |
007D  |20 58 B4|
0080 K|A0 21 01|
0083  |84 FC   |
0085  |A0 21 0E|
0088  |84 05   |
008A  |20 5F   |
008C  |90 15   |
008E L|20 5C B4|
0091  |A0 13 F5|
0094  |81 04   |
0096  |12      |
0097  |90 02   |
0099 M|A0      |
009A N|55      |
009B  |20 5A B4|
009E  |70 B4 1B|
00A1  |1C      |
			-- FOURTH PART OF EXT-INT --
00A2 O|62 6E   |ISAR:=26
00A4  |4E 07   |DC:=R25,26
00A6  |4E 06 0F|
00A9  |4E 07 4E|Q:=R23,24
00AC  |06 4C 0B|ISAR:=R22
00AF  |48 1D 1B|ACC:=R8;STATUS REG.:=R9;ENABLE INTERRUPTS
00B2  |1C      |RETURN TO INTERRUPTED PROGRAM
~1FFD
UUUUUUUUUUUUUUUUUUUUUUUU
------------------
EXT-LOAD.F8S
			EXT-LOAD

EXT-LOAD PUTS A .F8D FILE INTO MEMORY. THE COMMAND IS EXECUTED FROM
THE HOST. THE START ADDRESS IS IN DC AND MUST AGREE WITH THE S=XXXX
IN THE FILE.
THE PROGRAM SIGNALS EACH GOOD CHECKSUM BY DISPLAYING A PERIOD, ELSE
A '*'. THE X'S AND CR'S  ARE ALSO DISPLAYED.

@4659
0000  |08 1E 1A|
0003  |28 44 C0|
			-- INITIALIZE --
0006  |7F 56 11|R6:=0F,A flag to tag progress in the protocol;H:=DC
0009  |70 51   |R1:=0,set X-ON for COMM
		-- READ AND DISPLAY ALL EXCEPT * S X --
000B A|20 18 50|R0:=18,COMM parameter
000E  |28 4A 90|COMM
0011  |45 25 53|ACC:=R5,Compare to a 'S'
0014  |84 13   |If 'S',go to B to read the start address
0016  |25 58   |Compare to a 'X'
0018  |84 20   |if 'X',go to C to read data
001A  |25 2A   |Compare to a '*'
001C  |94 EE   |If not a '*',go back to A for more input
001E  |70 C6   |Compare R6 to 0
0020  |94 EA   |If not 0,go to A
0022  |1E 1A   |Return
0024  |28 44 D0|
0027  |0C      |
		-- READ AND COMPARE START ADDRESS --
0028 B|28 46 38|REC-BYTE,R3 IS HIGH ADDRESS
002B  |4A E3   |read HU and compare to R3
002D  |94 DD   |If unequal,go back to A
002F  |28 46 38|REC-BYTE,Low address
0032  |4B E3   |Read HL and compare to R3
0034  |94 D6   |if unequal,go to A
0036  |56      |R6:=0,flag for address match
0037  |90 D3   |Go to A
		  	-- READ DATA --
0039 C|70 52 C6|Clear checksum in R2;Check flag in R6
003C  |94 CE   |If flag not zero,go back to A
003E  |78 51   |R1:=8,no of bytes per line
0040 D|28 46 38|REC-BYTE
0043  |43 17   |Store byte at DC
0045  |70 C6 56|See if R6 still 0,no data out-of-range  --WHY RETURN TO R6?
0048  |94 C2   |Go To A on error
004A  |31      |Decrement byte count
004B  |94 F4   |Go back to D for more data if byte count not 0
004D  |7F F2 53|Clear 4 MSB of checksum and save in R3
0050  |28 46 14|REC-HEX for the 1-Byte checksum
0053  |E3 24 30|Compare to R3;Add 30
0056  |57      |and store in R7
0057  |28 4F 90|DISP-C,a '0' if checksum correct
005A  |90 B0   |Go to A.



Errors may cause this program to lock up
The first line of *'s are ignored
~46B4
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUU
------------------
FILL-MEM.F8S
			FILL-MEM

FILL-MEM PUTS A ^Z AT THE DC AND 00 IN EACH ADDRESS
AFTER UNTIL BUT NOT INCLUDING THE E ADDRESS.
A FF HEX IS STORED AT THE E ADDRESS 

@4DB6
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |20 1A 17|Store a ^Z at DC
0009 A|70 17   |Store a 0
000B  |28 4E B0|DC-LIMIT
000E  |82 FA   |Loop to A if E not exceeded
0010  |20 FF 17|Store a FF
0013  |1E 1A   |Return
0015  |28 44 D0|
0018  |0C      |
~4DCE
lɯw#xu. E>)҉	= ){_ڣڞ_#ɑÜ     :=!
:!	:
------------------
GET-FLAG.F8S
				GET-FLAG

GET-FLAG READS A TABLE POINTED TO BY DC AND INDEXED BY R7. IT RETURNS
A 4-BIT FLAG IN THE ACCUMULATOR. R7 IS UNCHANGED

@3A56
0000  |08      |
0001  |20 F0 F7|Most significant 4 bits of R7
0004  |14 8E   |DC := DC + R7/16
0006  |70 88   |<DC>
0008  |91 0D   |Go to A if negative, flag is in 4 lsb
000A  |8E      |DC := DC + <DC> Derived second relative index
000B  |7E F7 12|Bits 1-3 of R7;Divide by 2
000E  |8E      |DC := DC + R7^0E/2 Third relative index
000F  |71 F7 16|Set zero status bit from lsb of R7;<DC>
0012  |84 03   |If lsb even, go to A,flag is in 4 lsb
0014  |14 0C   |Else shift right 4,flag is in 4 msb
0016 A|21 0F 0C|Return only 4 lsb
~3A6E
				INSTRTBL

BITS 0,1 GIVE THE LENGTH IN BYTES OF THE INSTRUCTION IN R7
BIT 2 IS 1 FOR A BRANCH INSTRUCTION
BIT 3 IS ONE FOR SUBROUTINE CALLS, SET DC AND OTHER INSTRUCTIONS
WHICH SHOULD START ON A NEW LINE

81  81  0D  81  81  81  89  89  0F  8E  81  81  81  81  81  81  2A  22  22  
22  BB  1B  11  11  EE  EE  EE  EE  11  11  11  D1  
:ŖÆ´22:
>
v!42m'M̈́͢:v:ŷ>v:ŷ6V!4>2ů2V1!
------------------
GET-TIME.F8S
			GET-TIME

GET-TIME PUTS THE DATE AND TIME INTO BANK 3 IN BCD AS FOLLOWS:
30	MONTHS
31	DAY OF WEEK (1 = SUNDAY)
32	DAYS
33	HOURS
34	MINUTES
35	SECONDS
36	TENTHS OF SECONDS

@4070 
0000  |08 1E 1A|
0003  |28 44 C0|
			-- INITIALIZATION --
0006 A|68      |ISAR := 30
0007  |63      |
0008  |70 51   |R1 := 0 ,Data to be read
000A  |20 C0 52|R2 := C0 , Port code for tens of months
000D  |7D 50   |R0 := D , index
			-- READ ONE BCD VALUE --
000F B|42 B1   |Port 1 := R2
0011  |24 F0 52|R2 := R2 - 10, next code
0014  |20 32 B4|Port 4 := 32, read time
0017  |A0 21 0F|Port 0, bits 0-3 only
001A  |E1 51   |R1 := R1 OR Port 0
001C  |70 B4   |Port 4 := 0, edge-sensitive triggering
001E  |7F E1   |Is data F, illegal code
0020  |21 0F   |Bits 0-3 only
0022  |84 E3   |Start again at A if illegal code
0024  |71 F0   |
0026  |84 0B   |Go to D if R0 even, data is in LSB
0028  |7B E0   |Is R0 B?, day of week is by itself
002A  |84 06   |Go to C for day of week
			-- TENS --
002C  |41 15 51|Shift tens left 4 bits to MSB in R1
002F  |90 06   |Go to E
			-- DAY OF WEEK --
0031 C|30      |Decrement R0 to preserve odd/even
			-- UNITS --
0032 D|41 5D   |<ISAR> := R1, ISAR incremented
0034  |70 51   |Clear R1
			-- END TEST --
0036 E|30      |Decrement R0
0037  |94 D7   |Go back to B if not finished
0039  |41 15 5C|Put tenths of seconds back in LSB and store
003C  |1E 1A   |
003E  |28 44 D0|
0041  |0C      |
~40B1
                 x  x       x    x       x@        x  x      x   x< 
------------------
GO-HOST.F8S
				GO-HOST

GO-HOST WAITS UNTIL UART IS IDLE, THEN SETS HOST TO BAUD RATE IN P

@360A
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |20 58 B4|Console UART Status port
0009 A|A0 22 AF|Select only bits 6(TRE) and 4(THRE),rest are 1
000C  |1F      |increment(results in 0 if both are 1)
000D  |94 FB   |Loop back to A until 0
000F  |2A FF A8|P address
0012  |16 57   |R7 := <P>
0014  |25 96   |Compare to 96
0016  |20 DD   |DD is I/O code for Host at high baud,no parity,1
0018  |84 03   |stop bit and 8 data bits;If 96 go to B
001A  |24 20   |FD is I/O code for low baud range
001C B|B1      |Output
001D  |20 51 B4|Console UART configuration port
0020  |70 B4 47|
0023  |25 03   |Compare R7 to 03(300)
0025  |20 5D   |Code for 300 baud(low range) or 19200 Baud(High)
0027  |84 03   |Go to C if 300 baud
0029  |24 80   |Change to DD for 1200(low) or 9600(high) range
002B C|B1      |Output
002C  |20 59 B4|Port for baud select(also modem configuration)
002F  |70 B4 1E|Must always reset port selector to null value
0032  |1A      |
0033  |28 44 D0|
0036  |0C      |
~3640

Note that modem shares same baud in low range only!
------------------
GO-TERM.F8S
			GO-TERM

GO-TERM WAITS FOR THE UART TO BECOME IDLE, THEN SETS UP THE UART
AND BAUD RATE MUX ACCORDING TO THE CODES IN LOCATIONS FFA5 & FFA6

@3641
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |20 58 B4|Console UART status port
0009 A|A0 22 AF|Read bits 6(TRE) and 4(THRE) only
000C  |1F      |Increment, will be zero if both are 1
000D  |94 FB   |Loop until zero
000F  |2A FF A5|Console UART configuration byte location
0012  |16 B1   |Output console configuration byte
0014  |20 51 B4|Console configuration port
0017  |70 B4 16|<FFA6>
001A  |B1      |Output
001B  |20 59 B4|Modem UART configuration port
001E  |70 B4 1E|
0021  |1A      |
0022  |28 44 D0|
0025  |0C      |
~3666

Console configuration code:          	Modem configuration code:
Bit 0:	Parity inhibit			Parity inhibit
Bit 1:	2 stop bits			2 stop bits
Bits 2,3: Word length(5-8)		Word length(5-8)
Bit 4:	Even Parity			Even parity(if enabled)
Bit 5: Select mode			Host pin 15 is -ve
Bit 6:	   "				High baud is 19200
Bit 7:     "				Low baud is 1200

Mode code value:
0:	LAN A selected at high baud range
1:	LAN B selected at high baud range
2:	LAN A receive, LAN B transmit at high baud range
3:	Lan B receive, LAN A transmit at high baud range
4:	Console selected at high baud range
5:	Console selected at low baud range
6:	Host selected at high baud range
7:	Host selected at low baud range
x{>_|
------------------
HEX-DEC.F8S
				HEX-DEC

HEX-DEC CONVERTS A 4-HEX OR LESS HEX KEYBOARD INPUT TO DECIMAL
RESULT IS DISPLAYED WHEN AN '=' IS KEYED
RETURNS FOR ANY NON-HEX CHARACTER.

@44E0
0000  |28 4D 20|RESET
0003  |28 40 30|INIT
0006 A|70 5A 5B|H:=0
0009 B|28 4F C0|KBD-CMD
000C  |45 57   |R7:=R5
000E  |28 4F 90|DISP-C
0011  |45 25 2F|IS IT A '/'
0014  |82 22   |IF <= TO A '/',GO TO D,NOT HEX
0016  |25 3D   |COMPARE TO A '='
0018  |84 12   |IF '=',GO TO C
001A  |28 4F 50|RHEX
001D  |55 4A 15|SAVE IN R5;SHIFT H LEFT 4 BITS
0020  |5A 4B 14|AND PUT R5 IN THE 4 LSB
0023  |CA 5A 4B|
0026  |15 C5 5B|
0029  |90 DF   |GO TO B
			-- WRITE OUT DECIMAL --
002B C|70 55   |CLEAR EXPONENT(INTEGER)
002D  |28 48 10|DISP-2D
0030  |72 52   |2 SPACES
0032  |28 4F 5D|N-SPACE
0035  |90 D0   |GO TO A
			-- END --
0037 D|29 4D 00|GO TO MONITOR



!!! CONVERT TO SUBROUTINE !!!(AND DO A BETTER CHECK FOR NON-HEX)
~4519
>v>v>v>v> v>!Ʈw!~@w!~w!~5!ņw!~6 ɷ=é:ŷ>v:2
------------------
HEX-DUMP.F8S
				HEX-DUMP

HEX-DUMP SHOWS 23 LINES OF 19 HEX BYTES EACH STARTING AT B
COMMANDS ALLOW CURSOR MOVEMEMT, SHOWING ITS MEMORY ADDRESS
MEMORY LOCATIONS CAN BE MODIFIED
DISPLACEMENTS CAN BE DISPLAYED IN HEX AND ENTERED
DISPLAY CAN BE PAGED IN BLOCKS OF 16 LINES(256 BYTES)
COMMANDS:
ARROW KEYS MOVE CURSOR IN DIRECTION INDICATED WITH WRAP-AROUND
SPACE AND RETURN SAME AS RIGHT ARROW, IE ONE BYTE GREATER
BACKSPACE IS SAME AS LEFT ARROW
LINEFEED SAME AS DOWN ARROW
N PAGES UP IN MEMORY, AND P DOWN IN MEMORY
PATCH BYTE AT CURSOR WITH HEX VALUES
SET LABEL WITH L AT TARGET OF A BRANCH
ENTER DISPLACEMENT WITH / WITH CURSOR AT DISPLACEMENT BYTE
RETURN WITH PERIOD
REDRAW SCREEN WITH , TO VERIFY PATCHES.

@3817
			-- WRITE HEADING --
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |78 57   |
0008  |28 32 78|PROMPT("CURSOR=....."),ALSO CLEARS SCREEN
			-- WRITE DATA --
000B A|72 50   |R0 := 2 ,Row
000D  |71 51   |R1 := 1 , Column
000F  |28 37 FB|CUR-VT52
0012  |2A FF A9|B Address
0015  |16 06 16|Q := B;
0018  |07 0F   |DC := Q
001A  |20 17 50|R0 := 17,row count
001D B|20 10 51|R1 := 10,bytes per row
0020 C|16 07   |Q := <DC>
0022  |28 4F 30|2-HEX
0025  |31      |Decrement byte count
0026  |84 0D   |If end of line, go to E
0028  |73 F1   |Isolate 2 lsb of byte count for zero status
002A  |73      |3
002B  |84 02   |If zero,go to D
002D  |71      |normally 1
002E D|52      |R2 := 1 or 3
002F  |28 4F 5D|N-SPACE, groups columns by fours
0032  |90 ED   |Loop back to C, row not finished
0034 E|30      |Decrement row count
0035  |84 06   |If display is finished, go to F
0037  |28 4D 32|CR-LF
003A  |90 E2   |Loop back to B for new row
			-- SEE IF CURSOR IS IN VIEW --
003C F|2A FF A9|B Address
003F  |16 5A 50|R0,1 := B
0042  |16 5B 51|H := B
0045  |16 16 16|
0048  |06 16 07|Q := T
004B  |28 03 71|SUBTRACT, carry is set if T > B
004E  |92 0B   |If no carry, not in view, go to G
0050  |71 5A   |
0052  |20 70 5B|H := 0170(23 rows of 16)
0055  |28 03 71|Q := Q - 170, carry not set if in view
0058  |92 08   |if no carry, in range, go to H
			-- HOME CURSOR --
005A G|2A FF AD|T address points to byte at cursor
005D  |40 17 41|T := B
0060  |17      |
			-- DISPLAY CURSOR ADDRESS --
0061 H|71 50   |Row 1
0063  |7A 51   |Column 10
0065  |28 37 FB|CUR-VT52
0068  |2A FF AD|T address(Cursor)
006B  |16 06 16|Q := T
006E  |07      |
006F  |28 4F 33|4-HEX
			-- DISPLAY DISPLACEMENT --
0072  |71 50   |Row 1
0074  |20 2B 51|Column 43
0077  |28 37 FB|CUR-VT52
007A  |2A FF AB|E address(Label)
007D  |16 06 16|Q := E
0080  |07 16 5A|H := T(Cursor)
0083  |16 5B   |
0085  |28 03 71|SUBTRACT, Q:= Q - H, displacement
0088  |90 03   |Go to J
008A I|90 80   |Go to A(Compound jump necessary)
008C J|03 17   |FFAF := displacement lower byte
008E  |28 4F 33|4-HEX(Displacement)
			-- DISPLAY CURSOR --
0091  |2A FF A9|B Address
0094  |16 5A 16|H := B
0097  |5B 16 16|
009A  |16 06 16|Q := T
009D  |07      |
009E  |28 03 71|SUBTRACT, Q := Q - H, cursor offset from home
00A1  |90 03   |go to L
00A3 K|90 98   |go to F(Compound jump necessary)
00A5 L|02 15 50|R0 := QU * 256
00A8  |03 21 F0|4 msb of QL
00AB  |14 C0 1F|
00AE  |1F 50 03|R0 := R0 + QL/256 + 2
00B1  |21 0F 51|
00B4  |13 C1 51|R1 := 3 * QL(4 lsb)
00B7  |03 21 0C|bits 2 & 3 of QL
00BA  |12 C1 1F|
00BD  |51      |R1 := R1 + QL(4 lsb) + 1
00BE  |28 37 FB|CUR-VT52
			-- GET COMMAND --
00C1 M|72 52   |R2 := 2, Command count for patching(2 char/byte)
00C3 N|28 37 B9|KBD-CMD
			-- PAGE BACK --
00C6  |45 25 50|Compare to 'P'
00C9  |94 0D   |If not P, go to Q
00CB  |2A FF A9|BU address
00CE  |20 FF 88|BU - 1
00D1 O|2A FF A9|BU address
00D4  |17      |store decremented BU
00D5 P|90 B4   |Go to A via I
			-- PATCH --
00D7 Q|25 2F   |Compare to a '/'
00D9  |82 32   |If not greater, go to T
00DB  |25 46   |Compare to 'F'
00DD  |92 2E   |If greater, go to T
00DF  |57      |
00E0  |28 4F 90|DISP-C, show char keyed
00E3  |32      |Decrement command count
00E4  |84 08   |If 0, go to R to enter into memory
00E6  |28 4F 50|RHEX(ASCII to hex)
00E9  |15 53   |R3 := hex * 256
00EB  |90 D7   |Loop to N for next nibble
00ED R|2A FF AD|T address
00F0  |16 06 16|Q := T(cursor)
00F3  |07 0F   |DC := Q
00F5  |28 4F 50|RHEX
00F8  |C3 17   |add ms nibble and store at cursor address
			-- INCREMENT CURSOR --
00FA S|2A FF AD|T address
00FD  |16 50   |R0 := TU
00FF  |71 88 51|R1 := TL + 1
0102  |40 19   |add carry to upper byte
0104  |2A FF AD|T address
0107  |17 41 17|store back
010A  |90 98   |Go to F via K
			-- STORE DISPLACEMENT AT CURSOR --
010C T|94 11   |If not '/', go to V
010E  |2A FF AD|T Address
0111  |16 5A 16|H := T
0114  |5B 16 07|QL := displacement lower byte in FFAF
0117  |10 17   |DC := H;store
0119  |28 4F 30|4-HEX, show it
011C U|90 86   |Go to F via K
			-- CURSOR RIGHT --
011E V|25 20   |Compare to a space
0120  |84 D9   |If space, go to S
0122  |25 0D   |Compare to a CR
0124  |84 D5   |If CR ,go to S
0126  |25 C3   |Compare to a right arrow(Tatung ESC-C)
0128  |84 D1   |If right arrow, go to S
			-- REDRAW --
012A  |25 2C   |Compare to a comma
012C  |84 A8   |If comma, go to A via P then I
			-- PAGE FORWARD --
012E  |25 4E   |Compare to a 'N'
0130  |94 0C   |If not 'N', go to X
0132  |2A FF A9|BU address
0135  |16 1F   |Read and increment
0137  |90 99   |Go to O in PAGE BACK to store back
				-- CURSOR LEFT --
0139  |90 03   |Go to X
013B W|90 85   |Go to M(Compound jump)
013D X|25 08   |Compare to a backspace
013F  |84 05   |If backspace, go to Y
0141  |25 C4   |Compare to a left arrow(Tatung ESC-D)
0143  |94 16   |If not left arrow, go to [
0145 Y|2A FF AD|T address
0148  |16 06 16|Q := T
014B  |07 0F   |DC := Q
014D  |20 FF 8E|Decrement DC
0150 Z|0E      |Q := DC
0151  |2A FF AD|T address
0154  |02 17 03|store Q in T
0157  |17      |
0158  |90 C3   |Go to E via U then K
				-- SET LABEL --
015A [|25 4C   |Compare to a 'L'
015C  |94 1C   |If not 'L', go to \
015E  |2A FF AD|T address
0161  |16 06 16|Q := T
0164  |07      |
0165  |2A FF AB|E address
0168  |02 17 03|store T in E
016B  |17      |
016C  |71 50   |R0:=1,row 1
016E  |20 17 51|R1:=17, column 23
0171  |28 37 FB|CUR-VT52
0174  |28 4F 33|4-HEX, display label address
0177  |90 A4   |go to E via U then K
				-- CURSOR UP --
0179 \|25 C1   |Compare to a up-arrow(Tatung ESC-A)
017B  |94 0E   |If not up-arrow,go to ]
017D  |2A FF AD|T address
0180  |16 06 16|Q := T
0183  |07 0F   |DC := Q
0185  |20 F0 8E|DC := DC - 10
0188  |90 C7   |Go to Z to store back
				-- CURSOR DOWN --
018A ]|25 C2   |Compare to a down-arrow(Tatung ESC-B)
018C  |84 05   |If down-arrow, go to ^
018E  |25 0A   |Compare to a linefeed
0190  |94 0E   |If not linefeed, go to _
0192 ^|2A FF AD|T address
0195  |16 06 16|Q := T
0198  |07 0F   |DC := Q
019A  |20 10 8E|DC := DC + 10
019D  |90 B2   |Go to Z to store back
				-- QUIT --
019F _|25 2E   |Compare to a period
01A1  |94 99   |If not period, go to M via W
01A3  |28 37 9F|CLR-SCRN , clear the screen
01A6  |1E 1A   |
01A8  |28 44 D0|
01AB  |0C      |
~39C2
 |
------------------
INC-ADDR.F8S
			INC-ADDR
INC-ADDR INCREMENTS DC UNTIL IT POINTS TO EITHER A IA(HEX)(^Z)
OR TO A FF(HEX). THE ADDRESS OF THE NEXT LOCATION IS PUT INTO
THE B ADDRESS.

@4A38
0000  |08      |
0001 A|16 25 1A|IS <DC> '^Z' ?
0004  |84 04   |IF '^Z' GO TO B
0006  |1F      |INCREMENT DATA READ.
0007  |94 F9   |IF NOT NOW ZER0(WAS NOT FF),GO TO A
0009 B|11      |H:=DC
000A  |2A FF A9|B ADDRESS
000D  |4A 17 4B|STORE H IN B
0010  |17 0C   |AND RETURN
~4A49
 ){_ڣڞ_#ɑÜ     :=!
:!	:
------------------
INITIATE.F8S
			INITIATE  1.1

INITIATE SETS UP THE INTERRUPT CHIP FROM THE RAM
SETS UP THE UARTS FROM THE RAM

@4030
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A1|Addreess of 8259A mask word in RAM
0009  |16 50   |Transfer 8259 word to R0
000B  |2A FF A5|Address of terminal UART control byte in RAM
000E  |16 B1   |Port 1 = Terminal UART control byte
0010  |20 51 B4|Enter into UART
0013  |70 B4   |
0015  |16 B1   |Port 1 = modem UART control byte
0017  |20 59 B4|Enter into UART
001A  |70 B4   |
001C  |2A C8 00|8259A mask word address
001F  |40 17   |8259A = R0
0021  |78 52   |
0023  |28 4F 11|Display ESC-H, home cursor
0026  |7A 52   |
0028  |28 4F 11|Display ESC-J, clear cursor to end of screen
002B  |70      |Clear Port 5,allows 300 baud,host I/O
002C  |B5      |Lights Red LED,enables comparator input.
002D  |71 BE   |Enable external interrupts
002F  |52      |R2:01 
0030  |38 4F 20|TUNE,simple chime
0033  |1A      |Disable interrupts
0034  |28 44 D0|PUSH
0037  |1B      |Enable interrupts
0038  |0C      |Return
~4068
8259A init word 1:
Bit 0 = 0 for 8080 system, no init word 4
Bit 1 = 1 for single 8259A, no init word 3
Bit 2 = 1 for interval of 4 bytes between vectors
Bit 3 = 0 for edge=triggered mode
Bit 4 = 1 always
Bits 5-7 are vector address bits 5-7(2-4 are per interrupt)
8259 init word 2:
Bits 0-7 are vector address bits 8-15

Mask word has corresponding bits to inputs;0=enable

Terminal and Modem UARTs control word 5 LSB:
Bit 0 = 1 for parity inhibit
Bit 1 = 0 for 1 stop bit
Bit 2,3 = 1,1 for 8 data bits(binary 5-8 bits)
Bit 4 = 1 for even parity

Terminal UART control word 3 MSB:
Bits 7,6,5:
1,0,0 = Terminal connected, high baud range
1,0,1 = Terminal connected, low baud range
1,1,0 = Host connected, high baud range
1,1,1 = Host connected, low baud range

Modem UART control word 3 MSB:
Bit 5 is a spare discrete output
Bit 6 sets Terminal/Host UART baud rate in high range:
	0 = 9600, 1 = 19200
Bit 7 sets Modem UART baud rate always and Terminal/Host
UART if in low range:  0 = 300, 1 = 1200 baud
                 1B|
00A1  |1C      |
			-- FOURTH PART OF EXT-INT --
00A2 O|6
------------------
INT-JUMP.F8S
				INT-JUMP

INT-JUMP PRESERVES ALL THE ENVIRONMENT, FETCHES THE JUMP
VECTOR FROM THE 8259, AUGMENTED IF NECESSARY BY THE LS148
AND JUMPS TO THE ADDRESS THERE IF NOT OVER C0FF. ON RETURN
THE ENVIRONMENT IS RESTORED AND A JUMP IS MADE TO EXT-INT.
ON INPUT, THE RETURN ADDRESS IS IN PC1 AND ACC,Q,ISAR AND 
DC HAVE BEEN SAVED.

@1D50
0000  |2A FF B0|Area to save registers
0003  |70 07   |QL:=0 
0005 A|03 0B 1F|ISAR:=QL;QL incremented
0008  |07 25 40|Compare to 40,last register in hex
000B  |4C 17   |Save reg.
000D  |82 F7   |Go to A if not over 40
000F  |08 70 BE|Save PC1 in R70-77 stack;stop ext-int
0012  |28 44 C0|PUSH
0015  |2A CC 00|Address of INTA in 8259 chip
0018  |16 16 12|First is CD;Divide second by 2 to get interval of 2
001B  |07 21 0F|Save in QL;Compare 4 LSB to 0C, # of LS148
001E  |25 0C   |
0020  |16 06   |QU:=third word,upper vector
0022  |94 0B   |If not 148, go to B
0024  |20 70 B4|Read LS148
0027  |A0 14 13|Divide by 8, to give interval of 2
002A  |50 03 C0|Add to QL(Pick vector to ensure QL does not carry
002D  |07      |
002E B|0F 16   |DC:=Q;Read address of handler
0030  |25 C0   |
0032  |92 05   |Go to C if over C0FF
0034  |06 16 07|Q:=<DC>
0037  |0D      |PC0:=Q,Jump to handler
			-- RETURN FROM HANDLER --
0038 C|1A 71 BE|DISABLE INTERRUPTS,Enable ext int.
003B  |28 44 D0|POP,restores return address into K
003E  |09      |PCI:=K
003F  |2A FF B0|Reg. save area
0042 D|70 07 03|Unpack regs.
0045  |0B 1F 07|
0048  |16 5C   |
004A  |82 F7   |
004C  |29 4F ED|Jump to EXT-INT
~1D9E
 data               1                    en parity

Terminal UART controlm	m	+ m	m	k  m	
------------------
IR-READ.F8S
* 3/29/88                 IR-READ
* This decodes the signals from the SONY Wireless Commander remote control
* and sends them to the Host with an ID letter.
* The IR transmitter sends 2-4 pulse sequences for a short button press.
* The sequences are about 20 ms long and are separated by 20 ms. 
* They continue if the button is held down. The code in each sequence is
* the same except for Index and JOG/SHUTTLE. The sequence is itself 
*  composed trains of pulses. The first train is a wide sync. The rest 
* are either 1100 us (1) or 576 us (0). They are separated by 600 us.
* These trains are made up of 13 us pulses at 40 KHz. The hardware 
* stretches these to 35 us with a one-shot connected to bit 0 of decode 70.
* The one-shot in turn triggers a second one-shot of 4 ms, which is sync.
* This is connected to the parallel interrupt, giving a code of F in bits
* 4-7 of decode 70 from the end of the sync pulse train to the end of 
* the sequence.  
@9000
0000 A|28 4D 32|CR-LF
                       -- WAIT FOR SYNC PULSE --
0003 B|20 70 B4|Parallel input decode
0006  |20 FF B1|Must set output port to ones to prevent feedback
0009  |A0 18   |Read parallel, complement
000B  |91 0B   |Jump to B if sync.
000D  |20 58 B4|Read keyboard status
0010  |A0 21 01|
0013  |94 52   |Jump to L if key depressed-send last code to host
0015  |90 ED   |Loop to B until sync.
                       -- WAIT FOR CODE PULSE --
0017 C|70 50 51|Initialize code and pulse train counter
001A  |53      |
001B  |20 70 B4|Read parallel bit 0
001E  |20 FF B1|
0021 D|A0 21 01|
0024  |94 07   |Jump to E if pulse present
0026  |A0 18   |See if sync pulse has ended-end of sequence
0028  |91 F8   |Loop to D until pulse train starts
002A  |90 28   |Jump to K to display code
                -- MEASURE LENGTH OF CODE PULSE TRAIN --
002C E|20 A4 57|Initialize pulse length counter(35x24us)
002F  |40 1F 50|Increment pulse train counter
0032 F|A0 21 01|Read parallel bit zero
0035  |84 04   |Jump to G at end of pulse train 
0037  |37      |Decrement pulse length count
0038  |90 F9   |Loop to F until end of pulse train
003A G|37      |Test length
003B  |91 05   |Jump to H if short length
003D  |43 22 01|Set code LSB
0040  |53      |
0041 H|41 13 51|Shift code left one bit
0044  |43 22 00|note always a 0 in LSB due to set before shift
0047  |81 04   |
0049  |41 1F 51|
004C I|43 13 53|
004F  |90 D1   |Loop back to C for more code pulse trains
0051 J|90 AE   |Intermediate jump to A
               -- DISPLAY CODE DECODED --
0053 K|40 07   |Display puse count in 2 hex.
0055  |28 4F 30|
0058  |41 06 43|Display code in four hex
005B  |07      |
005C  |28 4F 33|
005F  |72 52   |Two spaces
0061  |28 4F 5D|
0064  |90 9E   |Jump back to B for another sequence
               -- READ KEY DEPRESSED AND SEND DATA TO HOST --
0066 L|20 5C B4|UART keyboard data port
0069  |A0 55   |
006B  |20 5A B4|Reset data ready 
006E  |70 B4 45|
0071  |25 2E   |
0073  |84 2A   |Jump to M if period
0075  |20 FD B1|Set up UART for Host at 1200 baud
0078  |20 51 B4|
007B  |20 55 B4|UART Master Reset
007E  |70 B4 45|
0081  |57      |Send keyboard character
0082  |28 4F 90|
0085  |40 07   |Send bit count as 2 hex
0087  |28 4F 30|
008A  |41 06 43|Send code as 4 hex
008D  |07      |
008E  |28 4F 33|
0091  |28 4D 32|CR-LF
0094  |28 36 41|Go-terminal
0097  |20 55 B4|UART Master Reset
009A  |70 B4   |
009C  |90 B4   |Restart at A
009E M|29 35 00|Exit to Browse
~90A0

------------------
KBD-OLD.F8S
			KBD-OLD

KBD-OLD HAS A COMMAND ENTRANCE WHICH CONVERTS LOWER-CASE
TO UPPER CASE, AND A TEXT ENTRANCE WHICH IS TRANSPARENT
DOES NOT RETURN UNTIL A CHARACTER IS ENTERED. OUTPUT IN R5
@4FC0
			-- COMMAND --
0000  |20 BF   |Command Mode flag
0002  |90 02   |Go to A
			-- TEXT --
0004  |77      |Text mode flag
0005 A|55      |Save flag in R5
0006  |20 58 B4|READ DATE READY FLAG
0009 B|A0 21 01|
000C  |84 FC   |Loop via B until ready
000E  |A0 21 0E|Read error bits
0011  |84 05   |Go to C if all zero, no error
0013  |20 5F   |Underline
0015  |90 15   |Go to E
0017 C|20 5C B4|Read character
001A  |A0 13 F5|ACC:=(CHAR*2) AND Mode Flag
001D  |81 04   |If pos,Go to D,text mode
001F  |12      |Shift back right-flag converted lower case
0020  |90 02   |Go to E
0022 D|A0      |Read Character again for text
0023 E|55      |Store output in R5
0024  |20 5A B4|Pulse Data Ready Reset
0027  |70 B4   |
0029  |1D 1C   |Restore interrupt status and return
~4FEA
 ɷ=é:ŷ>v:2
------------------
KEYBOARD.F8S
				KEYBOARD

KEYBOARD HAS TWO ENTRY POINTS: KBD-TEXT AND KBD-CMD
KBD-TEXT GETS ONE BYTE FROM THE UART TRANSPARENTLY
KBD-CMD MAKES THE FOLLOWING MODIFICATIONS:
	LOWER CASE IS CONVERTED TO UPPER CASE
	BIT 7 IS ZEROED, EXCEPT FOR ESCAPE SEQUENCES
	ESC THEN X RETURNS ONE BYTE,X WITH BIT 7 SET
	ESC THEN ESC THEN X RETURNS X TRANSPARENTLY
DATA IS RETURNED IN R5
INTERRUPTS ARE DISABLED AND NOT RE-ENABLED!

@37B9
				-- KBD-CMD --
0000  |1A      |Disable interrupts
0001  |73      |3
0002  |90 03   |Go to A
				-- KBD-CMD --
0004  |1A      |Disable interrupts
0005  |71      |1
0006 A|55      |R5 := 1 or 3, mode flag
0007 B|20 58 B4|Port for console UART status
000A C|A0 21 01|Isolate bit 1, Data Ready
000D  |84 FC   |Loop via C until ready
000F  |A0 21 0E|Read bits 1-3, UART error flags
0012  |84 05   |If no error, go to D
0014  |20 5F   |'_'
0016  |90 24   |Go to G
0018 D|20 5C B4|Port for console data
001B  |A0 35   |Input byte;decrement mode flag
001D  |84 1D   |If flag is now zero, go to G, text mode
001F  |21 7F   |Zero high bit
				-- ESCAPE --
0021  |25 1B   |Compare to a ESC
0023  |94 08   |If not ESC , go to E
0025  |20 5A B4|Port to reset UART data ready flag
0028  |70 B4   |
002A  |90 DC   |Loop back to B to get another input
				-- CASE CONVERSION --
002C E|25 60   |Compare to a '`'
002E  |82 07   |If not greater, go to F
0030  |25 7A   |Compare to a 'z'
0032  |92 03   |If greater,go to F
0034  |21 5F   |Convert lower-case alpha to upper case
0036 F|35      |Decrement mode flag again
0037  |94 03   |If still not zero, go to G
0039  |22 80   |Set high bit, was escape sequence
				-- RETURN --
003B G|55      |R5 := data
003C  |20 5A B4|Pulse data ready reset line
003F  |70 B4 1C|Return
~37FA
                
------------------
LD-HOST.F8S
				LD-HOST

LD-HOST LOADS A .F8D FORMATTED FILE FROM THE HOST INTO MEMORY AT P
BAUD RATE(03,12 OR 96). B MUST BE THE SAME AS THE SXXXX IN THE FILE
LD-HOST WRITES A X FOR EACH CORRECT CHECKSUM, OR ?
FORMAT:
	A LINE OF *S
	SXXXX  ADDRESS WHERE IT WILL BE STORED
	X AT THE START OF EACH LINE
	16 HEX CHARACTERS AFTER THE X
	LAST CHAR IN LINE IS CHECKSUM
	FILE ENDS WITH ANOTHER LINE OF STARS
	CHECKSUM EQUALS SUM OF 16 HEX CHARS, MODULO 4 BITS

@39C3
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |28 36 0A|GO-HOST
0009  |2A FF A9|B address
000C  |16 06 16|Q := B
000F  |07      |
				-- FIND FIRST ROW OF STARS --
0010 A|7F 56   |R6 := F(16 stars)
0012 B|28 4F C4|KBD-TEXT
0015  |45 25 2A|Compare with a '*'
0018  |84 07   |If '*', go to C
001A  |57      |
001B  |28 4F 90|DISP-C , display heading, if any
001E  |90 F1   |Go to A
0020 C|36      |Decrement star count
0021  |94 F0   |Loop back to B if not yet 16 stars
0023  |20 2A 57|
0026  |28 4F 90|DISP-C, write one star to confirm beginning
				-- READ AND CHECK START ADDRESS --
0029 D|28 4F C4|KBD-TEXT
002C  |45 25 53|Compare with 'S'
002F  |94 F9   |If not 'S', loop back to D
0031  |28 32 E4|SET-ADDR, read 4 hex followed by a CR
0034  |10      |DC := H, start address
0035  |28 03 71|SUBTRACT, Q := Q - H, compare with B address
0038  |84 0A   |Go to F if equal
				-- RETURN --
003A E|28 36 41|GO-TERM
003D  |1E 1A   |
003F  |28 44 D0|
0042  |0C      |
				-- CONFIRM START --
0043 F|20 53 57|
0046  |28 4F 90|DISP-C, show 'S' to confirm start ok
				-- READ DATA --
0049 G|28 4F C4|KBD-TEXT
004C  |45 25 58|Compare to 'X'
004F  |94 09   |If not 'X', Go to H
0051  |78 56   |R6 := 8(bytes)
0053  |70 50   |R0 := 0(checksum)
0055  |72 51   |R1 := 2(nibbles per byte)
0057  |90 F1   |Go to G for data
0059 H|25 2F   |Compare to a '/'
005B  |92 07   |If greater, go to I
005D  |25 2A   |Compare to a '*'
005F  |84 DA   |If equal, go to E
0061  |90 E7   |Go to G
				-- CONVERT TO BYTES AND DO CHECKSUM --
0063 I|42 15 52|Shift data left 4 bits
0066  |28 4F 50|RHEX
0069 J|C2 52 C0|Add to data
006C  |50 31   |Add to sum;decrement nibble count
006E  |94 DA   |If not 0, go to G
0070  |42 17   |Store data
0072  |72 51 36|Set nibble count to 2;decrement byte count
0075  |94 D3   |If not zero, go to G
0077  |7F F0 50|Clear most significant nibble of sum
007A  |28 4F C4|KBD-TEXT, get checksum byte
007D  |28 4F 50|RHEX
0080  |E0      |Compare to sum
0081  |94 09   |If wrong, go to K
0083  |20 58 57|
0086  |28 4F 90|DISP-C, show 'X'
0089  |90 DF   |Go to G
008B K|20 3F 57|
008E  |28 4F 90|DISP-C, show '?'
0091  |90 B7   |Go to G
~3A55
HEX CHARS, MODUL
------------------
LD-INTEL.F8S




				LD-INTEL

LD-INTEL LOADS INTO MEMORY A FILE IN INTEL HEX FORMAT
THE START ADDRESS IS THE SUM OF THE ADDRESS IN THE FILE + B
THE BAUD RATE IS P(03,12 OR 96)
ADDRESSES OF CHECKSUM ERRORS ARE STORED BEGINNING AT T
A '*' IS DISPLAYED FOR EACH GOOD CHECKSUM, ELSE A '?'
AT THE END T IS UPDATED
THE FINAL ADDRESS IS PUT INTO E
THE INTEL FORMAT IS AS FOLLOWS:
	LINES BEGIN WITH A ':'
	REST OF LINE IS HEX,TWO CHAR TO A BYTE
	FIRST BYTE IS COUNT OF DATA CHARACTERS
	NEXT TWO BYTES ARE ADDRESS OF FIRST DATA BYTE,MS FIRST
	NEXT IS A NULL BYTE
	SPECIFIED NUMBER OF DATA BYTES FOLLOW
	LAST IS CHECKSUM BYTE. SUM OF ALL BYTES,INCLUDING
	COUNT,ADDRESS,DATA AND CHECKSUM SHOULD BE 0
	LAST LINE USUALLY HAS A 0 COUNT BYTE
	REPEATED NULL BYTES ARE USUALLY OMITTED
EOF MAY BE UNAMBIGUOUSLY MARKED BY A '>'

@3667
0000  |08 1E 1A|
0003  |28 44 C0|
				-- INITIALIZATION --
0006  |28 36 0A|GO-HOST
0009  |20 7F 50|R0 := 7F, CHARACTER COUNT
000C  |51      |R1 := 7F, ADDRESS COUNT
000D  |70 53   |R3 := 0,  OUT-CHAR, a value of 0 is a flag to
000F  |2A FF AD|indicate non-valid
0012  |16 5A 16|
0015  |5B 10 2C|DC1 := T
	-- WAIT FOR INPUT AND DO OUTPUT, IF ANY ,WHILE WAITING --
0018 A|20 58 B4|
001B  |A0 21 01|Read Data Ready flag from UART
001E  |94 0E   |Go to B if ready
0020  |70 C3   |See if OUT-CHAR filled, display of OUT-CHAR is
0022  |84 F5   |synchronized with input;Go to A if invalid
0024  |B1      |Output OUT-CHAR
0025  |20 5E B4|UART output port
0028  |70 B4 53|R3 := 0
002B  |90 EC   |Go to A to await input
				-- READ INPUT --
002D B|A0 21 0E|Read UART error bits
0030  |94 07   |Go to C on error
0032  |20 5C B4|Read character
0035  |A0 21 7F|and null msb
0038 C|54      |R4 := char or code given by error bits
0039  |20 5A B4|Reset UART data ready
003C  |70 B4 44|
003F  |25 3E   |Compare char to a '>', put into file for EOF
0041  |94 1C   |If not '>', go to D
				-- END PROCESSING --
0043  |28 4D 32|CR-LF
0046  |11      |
0047  |2A FF AB|T := DC0,via H
004A  |4A 17 4B|
004D  |17 2C 11|
0050  |2C 4A 17|E := DC1,via H
0053  |4B 17   |
0055  |28 36 41|GO-TERM
0058  |1E 1A   |
005A  |28 44 D0|
005D  |0C      |
				-- FIND BEGINNING OF LINE --
005E D|25 2F   |Compare to a '/'
0060  |82 B7   |Return to A if not greater, non-hex
0062  |25 3A   |Compare to a colon
0064  |94 08   |If not, go to F
				-- BEGINNING OF LINE INITIALIZATION --
0066  |70 52   |R2 := 0, SUM
0068  |20 2A 50|R0 := 2A, CHAR-COUNT(max char per line)
006B E|90 AC   |Go to A
				-- HEX CHAR TO BYTE CONVERSION --
006D F|25 39   |Compare char to a '9'
006F  |92 03   |If > '9', go to G
0071  |24 07   |Add 7 to numbers
0073 G|24 C9 54|Convert to binary and store in R4, CHAR
0076  |30 31   |Decrement CHAR-COUNT and ADDRESS-COUNT
0078  |71 F0   |Mask ls bit of CHAR-COUNT
007A  |84 05   |Go to H if even
007C  |44 55   |R5 := R4, DATA  := CHAR
007E  |90 EC   |Go to A
0080 H|45 15 C4|Read DATA; shift left 4 bits;add CHAR
0083  |55 C2 52|Return to DATA;Add data to SUM
				-- FIND COUNT BYTE --
0086  |40 25 28|Compare CHAR-COUNT to 28(after 2 bytes)
0089  |94 0F   |If not 28, go to K
008B  |45 25 10|Compare DATA to 10(16 bytes max per line)
008E  |82 02   |Go to I if not > 10
0090  |70      |Zero excessive byte count
0091 I|13 24 08|Multiply by 2;Add 8,convert to remaining chars
0094  |50      |Store in CHAR-COUNT
0095  |76 51   |R1 := 6,ADDRESS-COUNT,finds bebinning of data
0097 J|90 D3   |Return to A
				-- LOAD ADDRESS --
0099 K|70 C1   |See if ADDRESS-COUNT is 0(address all read)
009B  |94 0E   |If not,go to M
009D  |2A FF A9|
00A0  |16 5A 16|H := B address
00A3  |5B      |
00A4  |28 03 E3|ADD,Q := Q + H,Add B to address in file
00A7  |0F      |DC := Q
00A8 L|90 EE   |Go to A
				-- COMPUTE ADDRESS --
00AA M|25 02   |Compare ADDRESS-COUNT to 2
00AC  |94 05   |If not 2,go to N
00AE  |45 07   |ADDRESS(low) := DATA
00B0  |90 F7   |Go to A
00B2 N|25 04   |Compare ADDRESS-COUNT to 4
00B4  |94 05   |If not 4, go to O
00B6  |45 06   |ADDRESS(high) := DATA
00B8  |90 EF   |Go to A
				-- FIND END OF LINE --
00BA O|70 C0   |Is CHAR-COUNT positive?
00BC  |91 EB   |If not, go to A
00BE  |94 15   |If CHAR-COUNT not zero, go to Q
00C0  |70 C2   |Is sum 0?
00C2  |94 06   |If not,error,go to J
00C4  |20 2A 53|OUT-CHAR := '*', OK
00C7  |90 E0   |Go to A
00C9 P|20 3F 53|OUT-CHAR := '?',error
00CC  |2C 02 17|Store Q at DC1, address of first byte in line 
00CF  |03 17 2C|
00D2  |90 D5   |Go to A
				-- STORE DATA BYTES --
00D4 Q|25 20   |Compare CHAR-COUNT to 20
00D6  |92 D1   |If over,null byte,go to A
00D8  |45 17   |Store DATA at DC0
00DA  |90 CD   |Go to A
~3742
                                
------------------
LOOKUP-2.F8S
				LOOKUP-2

LOOKUP-2 INITIALIZES LOOKUP TO FIND IF DC IS IN A TABLE LOCATED
AT F820. THE EOF MARKER IS 09. DC IS UNCHANGED. RESULT IS IN R2

@3A99
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |63      |
0007  |68      |ISAR := 30
0008  |77 5D   |R30 := 7
000A  |6A      |ISAR := 32
000B  |79 5D   |R32 := 9
000D  |70 5D   |R33 := 0
000F  |20 2D 5C|R34 := 2D
0012  |0E      |Q := DC
0013  |65 6D   |ISAR := 55
0014  |02 5D   |R55 := QU
0017  |03 5C   |R56 := QL
0019  |2A F8 20|DC := F820
001C  |28 3A 6F|LOOKUP
001F  |63 69   |ISAR := 31
0020  |4C 52   |R2 := R31
0023  |0F 1E 1A|DC := Q
0026  |28 44 D0|
0029  |0C      |
~3AC2
F IF NO MATCH

@3A6F
0000  |08      |
0001  |63      |
0002  |69      |ISAR = 31
0003  |70 5D   |Clear R31, I
------------------
LOOKUP.F8S
				LOOKUP

LOOKUP FINDS THE LOCATION OF A STRING IN A TABLE OF FIXED-LENGTH
RECORDS. THE FOLLOWING INPUTS ARE REQUIRED:
	DC  - HEAD OF THE TABLE (LOWEST ADDRESS)
	R30 - RECORD LENGTH - OFFSET TO BEGINNING OF FIELD
	      + 7 - NUMBER OF BYTES IN STRING
	R32 - END OF FILE MARKER, MUST BE FIRST BYTE IN RECORD
	R33 - OFFSET FROM FIRST BYTE OF RECORD TO FIRST BYTE OF FIELD
	R34 - LENGTH OF STRING CODED AS FOLLOWS:
		LENGTH: 1    2    3    4    5    6    7    8
		R34     2E   2D   2C   2B   2A   29   28   2F
	R50-57 - STRING TO FIND, LAST BYTE IS ALWAYS IN R56
THE OUTPUT IN R31 GIVES THE RECORD WITH THE FIRST MATCH(FIRST = 0)
RETURNS FF IF NO MATCH

@3A6F
0000  |08      |
0001  |63      |
0002  |69      |ISAR = 31
0003  |70 5D   |Clear R31, ISAR := 32
				-- SEE IF EOF --
0005 A|4D 8D   |Compare R32 with <DC>, ISAR := 33
0007  |20 FF 8E|Decrement DC
000A  |94 06   |If not end, go to B
000C  |69      |ISAR := 31
000D  |20 FF 5C|R31 := FF
0010  |0C      |Return
				-- GO TO FIELD --
0011 B|4D 8E 4C|DC := DC + R33, ISAR := 34; ISAR := R34
				-- SEE IF MATCH --
0014  |0B 4D 8D|Compare <ISAR> with <DC>
0017  |94 04   |If unequal,   go to D
0019  |8F FB   |If ISARL not 7 we have a partial match, go to C
001A  |0C      |Match, return
001C C|0A 21 07|Mask ISARL
001F  |18 1F   |Negate ISARL
0021  |63 68   |ISAR := 30
0022  |CD 8E   |DC := R30 - ISARL, ISAR := 31
0025  |4C 1F 5D|Increment R31, ISAR := 32
0028  |90 DC   |Go back to A for next record
~3A98
UUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
MIRROR.F8S
			MIRROR	1.1

MIRROR IS TO BE LOCATED AT 8000 TO CATCH THE PROGRAM 
WHEN THE EPROM POWER IS TURNED OFF TO CHANGE EPROMS
THE RED LIGHT WILL FLASH AND WHEN THE POWER IS AGAIN
ON THE BROWSE WILL RESUME AND A TUNE SOUND

@8000
0000  |1A 70 BE|Disable interrupts and external interrupts
0003  |A5 51   |R1 causes the LED to flash,first pass is off
0005 A|20 20 E1|Complement bit 5 of R1 each pass
0008  |51 B5   |Port 5:= R1,all other bits must stay same
000A  |70 50   |Clear Flag
000C  |2A 20 00|Check all EPROMs
000F B|11      |
0010  |20 80 EA|Stop before 8000
0013  |84 0C   |
0015  |20 FF 8D|
0018  |84 03   |Go to C if location has FF
001A  |71 50   |Set Flag if non-FF,power has returned
001C C|74 8E   |Check every 4th location to save time
001E  |90 F0   |Go to B
0020 D|71 E0   |
0022  |94 E2   |Go to A if Flag not set
0024  |20 2D 52|Beethoven's 5th
0027  |28 4F 20|TUNE
002A  |29 35 00|Go to BROWSE
~802C
Ʈw!~@w!~w!~5!ņw!~6 ɷ=é:ŷ>v:2
------------------
MULT-ADD.F8S
				MULT-ADD
MULT-ADD MULTIPLIES THE VALUE IN R6,7 BY R4 AND ADDS THE
RESULT TO H. R6,7 IS UNCHANGED,R4 BECOMES 0
R9 contains status when HL last added to.

@4970
0000  |08      |
0001  |71 C4 54|R4:=R4+1
0004 A|34      |decrement r4
0005  |84 0B   |if 0,GO TO B
0007  |4B C7 5B|HL:=HL+R7
000A  |46 19 CA|HU:=R6+Carry+HU;Save status
000D  |1E 5A   |
000F  |9A F4   |if no overflow or carry,GO TO A
0011 B|0C      |Return if R4 is 0,or high byte overflows or carries
		at any step.
~4981
_RTN_RT
------------------
MULTIPLY.F8S
			MULTIPLY

MULTIPLY MULTIPLIES THE 16-BIT QUANTITY IN R6,R7 BY THE 8-BIT
VALUE IN R4, AND ADDS THE RESULT TO H. RETURNS WITH R6,R7 ZERO.
ALSO RETURNS FOR ERROR CONDITIONS. STATUS OF LAST ADD TO H IS
SAVED IN W.

@0400
0000  |08      |
0001  |70 53   |CLEAR R3
0003 A|70 C6   |TEST R6
0005  |94 04   |IF NOT 0,GO TO B
0007  |C7      |TEST R7
0008  |84 0F   |IF 0,EXIT,GO TO C
000A B|71 F7   |TEST R7 ODD
000C  |84 0B   |IF EVEN,GO TO D
000E  |4B C4 5B|ADD R4 TO HL
0011  |43 19 CA|ADD R3 AND CARRY TO HU
0014  |1E 5A   |SAVE STATUS IN W
0016  |9A 02   |IF NO CARRY OR OVERFLOW,GO TO D
0018 C|0C      |RETURN
0019 D|47 12 57|R7:=R7/2
001C  |71 F6   |TEST LSB OF R6
001E  |84 05   |IF 0,GO TO E
0020  |20 80 C7|ADD CARRY TO R7
0023  |57      |
0024 E|46 12 56|R6:=R6/2
0027  |43 C3 53|R3:=R3*2
002A  |9A 02   |IF NO OVERFLOW OR CARRY,GO TO F
002C  |0C      |RETURN
002D F|44 C4 54|R4:=R4*2
0030  |43 19 53|ADD CARRY TO R3  
0033  |90 CF   |GO TO A
~0436
           UUUUUUUUUUUUUUUUUUUUUUUUU
------------------
N-SPACE.F8S
			N-SPACE

N-SPACE DISPLAYS R2 SPACES

@4F5D
0000  |08      |
0001 A|32      |DECREMENT R2
0002  |81 02   |GO TO B IF POSITIVE
0004  |0C      |RETURN
0005 B|20 20 57|SPACE
0008  |28 4F 90|DISP-C 
000B  |90 F5   |GO TO A
~4F69
            1C 
------------------
NEGATE.F8S
			NEGATE

NEGATE NEGATES THE 2-BYTE SIGNED VALUE IN R6,7 AND RETURNS IN SAME

@4960
0000  |08 47 18|ACC := COMPLEMENT OF R7
0003  |1F 57   |R7:=ACC+1
0005  |92 02   |IF NO CARRY,GO TO A
0007  |36      |DECREMENT R6(HIGH)
0008 A|46 18 56|R6:=COMPLEMENT OF R6
000B  |0C      |RETURN
~496B
ME	^QC^QX
~HELP	^KY
~LEFT	^A
~UP	^Z^Z^Z^Z^Z
~DOWN	^W^W^W^W^W
~RIGHT	^F
~FA	^Q
------------------
PAGE-DC.F8S
			PAGE-DC

PAGE-DC IS USED IN OLD BROWSE TO UPDATE THE PAGE REGISTER,
TRANSFER THE CONTENTS TO THE BEGINNING OF THE STRING, AND
TO PUT THE STRING START ADDRESS IN DC

@46D8
0000  |08      |
0001  |2A FF A7|Pagecount address
0004  |11 16 1F|H:=DC;Increment page count
0007  |10 17 57|DC:=H;store incremented page count
000A  |2A FF AB|E address
000D  |16 5A 16|DC:=E
0010  |5B 10 47|
0013  |17 0C   |Return
~46EC
w#xu. E>)҉	= ){_ڣڞ_#ɑÜ     :=!
:!	:
------------------
PATCH.F8S
				PATCH

PATCH INSERTS AND CHANGES CODE,WHICH IT LOOKS UP IN A RANGE.
THE HIGH END EXPANDS OR CONTRACTS ACCORDING TO THE DIFFERENCE
IN LENGTH BETWEEN THE LOOKUP AND THE REPLACEMENT STRINGS.
THE LOOKUP AND THE REPLACEMENT STRINGS MUST LIE BETWEEN 1 AND
8 BYTES. THERE CAN BE MANY SUCCESSFUL LOOKUPS IN THE RANGE.
AT EACH MATCH,THE LOOKUP ADDRESS AND CODE IS DISPLAYED IN ITS 
CONTEXT AND THE PROGRAM WAITS FOR A RESPONSE.
KEY EITHER 'R' TO REPLACE OR CR TO PASS.
THE RANGE IS BETWEEN B AND E ADDRESSES.
PATCH IS ACCESSED FROM BROWSE WITH AN 'I',WHICH IS NOT ECHOED.
IF P=00 PATCH GOES INTO HEX MODE.
	RECORDING OF THE LOOKUP STRING IS STARTED BY KEYING 'S'
	RECORDING OF THE REPLACE STRING IS STARTED BY KEYING 'R'
	PATCH RESPONDS WITH A '='.
	ENTER BYTES AS TWO HEX SEPARATED BY SINGLE SPACES.ANY
	BYTE MAY BE EXTENDED TO OVERWRITE A MISTAKE BEFORE THE 
	SPACE. THE STRING ENDS WITH A COMMA.
	THE LOOKUP AND REPLACE STRINGS CAN BE IN EITHER ORDER
	AND CAN BE REPEATED TO CORRECT A MISTAKE.
	SEARCHING STARTS WITH A CR.
IF P=50 PATCH GOES INTO TEXT MODE.
	RECORDING OF THE LOOKUP STRING IS STARTED BY KEYING 'S'
	RECORDING OF THE REPLACE STRING IS STARTED BY KEYING 'R'
	PATCH RESPONDS WITH A '='.
	ENTER BYTES AS LETTERS.
	THE STRING ENDS WITH A COMMA.
	THE LOOKUP AND REPLACE STRINGS CAN BE IN EITHER ORDER
	AND CAN BE REPEATED TO CORRECT A MISTAKE.
	SEARCHING STARTS WITH A CR.
PATCH RETURNS TO BROWSE WHEN THE E ADDRESS IS REACHED IN SEARCH.

@4310
0000  |08 1E 1A|
0003  |28 44 C0|
		-- SET UP POINTER FOR LOOKUP/REPLACE STRING --
0006 A|28 4F C0|KBD-CMD
0009  |45 57   |R7:=R5
000B  |28 4F 90|DISP-C
000E  |45 24 AD|IS IT AN 'S'?
0011  |84 0B   |IF AN 'S',,GO TO B
0013  |1F      |IS IT AN 'R'?
0014  |94 F1   |IF NEITHER,ILLEGAL,,GO TO A
0016  |52      |CLEAR R2
0017  |63      |ISARH=3,REPLACE STRING STORE AREA
0018  |2A FF 90|DC:=SAVE REPLACE STRING HERE IN HEX MODE ONLY
001B  |90 06   |,GO TO C
001D B|54      |CLEAR R4
001E  |65      |ISARH=5 LOOKUP STRING STORE AREA
001F  |2A FF 80|DC:=FF80 LOOKUP STRING SAVED HERE IN HEX MODE
0022 C|68      |ISARL:=0
0023  |20 3D 57|'='
0026  |28 4F 90|DISP-C
			-- FIND MODE --
0029 D|2C      |XDC
002A  |2A FF A8|DC:=P ADDRESS
002D  |70 8D 2C|IS P 0?;XDC
0030  |84 10   |IF 0,HEX MODE ,GO TO E
		-- ENTER TEXT MODE STRINGS --
0032  |28 4F C5|KBD-TXT
0035  |45 25 2C|IS IT A ','?
0038  |84 19   |IF ',',GO TO H :END OF STRING
003A  |25 0D   |IS IT A CR?
003C  |84 15   |IF CR,GO TO H :START LOOKUP
003E  |5C      |STORE LETTER AT ISAR
003F  |90 04   |GO TO F
		-- ENTER HEX MODE STRING --
0041 E|28 4B A0|SET-BYTE
		-- ADJUST POINTERS --
0044 F|4D 0A   |INCREMENT ISAR;READ ISAR
0046  |21 10   |MASK BIT 4
0048  |94 06   |IF A 1,REPLACE STRING,GO TO G
004A  |44 1F 54|INCREMENT R4,LOOKUP STRING BYTE COUNT
004D  |90 04   |GO TO H
004F G|42 1F 52|INCREMENT R2,REPLACE STRING BYTE COUNT
0052 H|45 57   |R7:=R5
0054  |28 4F 90|DISP-C:IF TEXT MODE,THE LETTER,IF HEX,A SPACE
		OR A COMMA OR A CR
0057  |45 25 2C|WAS IT A COMMA?
005A  |84 AB   |IF SO,GO TO A
005C  |25 0D   |WAS IT A CR?
005E  |94 CA   |IF NOT,GO TO D,STRING NOT ENDED
0060  |7A 57   |LF
0062  |28 4F 90|DISP-C
0065  |2A FF A9|B ADDRESS
0068  |16 5A 58|READ B AND SAVE IN R8,9 AND H
006B  |16 5B 59|
006E  |10      |
			-- LOOKUP --
006F I|44 53   |R3:=R4,INITIALIZE LOOKUP BYTE COUNT MATCH INDEX
0071  |65 68   |ISAR:=50,1st BYTE OF SEARCH STRING
0073  |0E      |Q:=DC,save DC for partially sucessful matches
0074 J|28 4E B0|DC-LIMIT
0077  |82 0E   |If E address not exceeded, go to K
			-- END --
0079  |2A FF A9|restore beginning of range to B address
007C  |48 17 49|from R8,9
007F  |17 1E 1A|
0082  |28 44 D0|
0085  |0C      |
			-- LOOKUP CONTINUED --
0086 K|16 EC   |Read a byte from memory and compare to lookup string
0088  |84 09   |If same,go to M
008A  |43 E4   |Compare match index(R3) to lookup byte count(R4)
008C  |84 E2   |if = at beginning of string,go to I
008E  |0F 8C   |DC:=Q+1,restore DC to next memory location
		following first match in a partial match.
			-- CASCADED JUMP BACK --
0090 L|90 DE   |Go to I
			-- LOOKUP CONTINUED --
0092 M|33      |Decrement R3,match byte count index
0093  |4D      |Increment ISAR to next byte in lookup string
0094  |94 DF   |if R3 not zero,go back to J,partial match only
			-- DISPLAY MATCH --
0096  |28 4F 33|4-HEX,Display address of first byte in matched string
0099  |74 50 57|R0:=R7:=4,???
009C  |64 6C   |ISAR:=44
009E  |0E      |Q:=DC,1st byte following matched string
009F  |44 8E 11|H:=DC + R4,last byte to be displayed
00A2  |2A FF AB|DC:=E address
00A5  |16 5D 16|Save E in R44,R45 because TABLE uses E
00A8  |5D 02 5D|Save Q in R46,47,resume lookup address
00AB  |03 5C 0F|DC:=Q,restore DC
00AE  |44 13 18|
00B1  |8E 0E   |Q:=DC-2R4-1,first byte to be displayed
00B3  |2A FF A9|DC:=B address
00B6  |02 17 03|B:=Q
00B9  |17 4A 17|
00BC  |4B 17   |E:=H
00BE  |28 4E 00|TABLE,display matched string+an equal length each side
00C1  |2A FF AB|DC:=E address
00C4  |64 6C   |ISAR:=44,save register area
00C6  |4D 17 06|restore E address
00C9  |4D 17 07|and also put in Q
00CC  |4D 5A   |restore address of next byte in lookup
00CE  |4D 5B 10|and also put into H and then into DC
			-- GET REPLACE/PASS DECISION --
00D1  |28 4F C0|KBD-CMD
00D4  |2B 2B   |
00D6  |28 4D 32|CR-LF
00D9  |45 25 52|Was it an 'R'?
00DC  |94 92   |if not,no replacement,resume search at I
00DE  |2B 57   |
00E0  |28 4F 90|DISP-C,'R',for confirmation
			-- CALCULATE REPLACE SHIFT --
00E3  |28 03 71|SUBTRACT,Q:=Q-H,number of bytes to be moved - 1
00E6  |02 50 03|R0,1:=Q
00E9  |51 44 18|
00EC  |1F 53   |R3:=-R4,to get address of first byte to be changed
00EE  |C2 56   |R6:=R2-R4,amount to be shifted
00F0  |94 13   |go to P
			-- REPLACE --
00F2 N|6E 4D 5A|ISAR:=46;DC:=R46,R47 + R3,1st byte to be changed
00F5  |4D 5B 10|
00F8  |43 8E 63|ISAR:=30,replace string
00FB  |42 53   |R3:=R2,initialize replace byte count index
00FD O|4D 17 33|replace one byte;decrement byte count index
0100  |84 8F   |if zero,end of replace,go to I via L,resume lookup
0102  |90 FA   |return to O,replacement incomplete
			-- MOVE RANGE END TO ALLOW REPLACE --
0104 P|68      |ISAR:=R40
0105  |70 5C   |R40:=0,copy forwards if R2<R4
0107  |6E      |ISAR:=46,address of first byte to be moved
0108  |91 06   |if R6 is negative,R2<R4,copy forwards,go to Q
010A  |68      |ISAR:=40
010B  |20 FE 5C|R40:=FE,copy backwards
010E  |6C      |ISAR:=R44,final byte to be moved
010F Q|4D 5A 4C|
0112  |5B 10   |DC:=address of last byte to be moved
0114  |68 46 8E|ISAR:=40;
0117  |0E      |Q:=DC+R6,address where 1st byte is to go to
0118  |28 02 CA|COPY-M
011B  |90 D6   |go to N to make replacement
~442C
l match onl   			-- DISPLAY MATCH -   0096  |28 4F 33|4-HEX,Display address of first byte in matched s
------------------
POP.F8S
				POP

POP RESTORES RETURN ADDRESS FROM REGISTER STACK
@44D0
0000  |62 69   |ISAR:=21,STACK POINTER
0002  |4C 0B   |ISAR:=R21,TOP OF STACK
0004  |4E 05 4E|K:=TOP OF STACK,STACK DECREMENTED
0007  |04 0A   |ACC:=ISAR
0009  |62 69   |ISAR:=21,STACK POINTER
000B  |5E      |STORE NEW STACK POINTER(ISAR:=20)
000C  |1D 1C   |RESTORE STATUS FROM R9(ENABLES INTERRUPTS);RETURN
~44DD
 
			-- CALLING CODE --

IE		R9:=W(STATUS BYTE)
1A		DISABLE INTERRUPTS
28 44 D0	CALL POP
0C


(ALTERNATELY,COULD END POP WITH 0C INSTEAD OF 1C, AND USE 29 44 CO
IN THE CALLING PROGRAM,NO 0C THERE)2`~9: 2**zR~
------------------
PROMPT.F8S
				PROMPT
PROMPT USES R7 AS AN INDEX TO FIND A STRING WHICH IS DISPLAYED.
THE ADDRESS OF THE STRING IS IN A TABLE AT 3080. THE STRINGS
END WITH A IA (^Z).

@3278
0000  |08      |
0001  |2A 30 80|PROMPT TABLE ADDRESS
0004  |47 8E 8E|DC := 3080 + 2 * R7
0007  |16 06 16|Q := <DC>
000A  |07 0F   |DC := Q
000C A|16 25 1A|COMPARE <DC> WITH A '^Z'
000F  |94 02   |IF NOT ^Z GO TO B
0011  |0C      |RETURN
0012 B|57      |
0013  |28 4F 90|DISP-C, CHARACTER
0016  |90 F5   |GO TO A
~328F
:!	:
------------------
PRT-PMPT.F8S
			PRT-PMPT.F8S

THIS UTILITY SENDS A LIST OF THE PROMPTS TO THE HOST AT P BAUD.
THE COLUMNS ARE: INDEX,ADDRESS OF ENTRY IN PROMPT TABLE,AND
ADDRESS OF STRING.

@3E25
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |28 36 0A|GO-HOST
0009  |70 50   |R0:=0,INDEX
000B A|40 07   |QL:=R0
000D  |28 4F 30|2-HEX
0010  |28 31 A0|SPACE
0013  |2A 30 80|PROMPT TABLE
0016  |40 8E 8E|ADD 2*INDEX
0019  |0E      |Q:=DC,ADDRESS OF ENTRY
001A  |28 4F 33|4-HEX
001D  |28 31 A0|SPACE
0020  |16 06 16|Q:=<DC>,ADDRESS OF STRING
0023  |07 0F   |DC:=Q
0025  |28 4F 33|4-HEX
0028  |28 31 A0|SPACE
002B  |02 1F   |ACC:=QU + 1
002D  |84 11   |GO TO C IF STRING APPEARS TO BE AT FFXX
002F  |40 57 1F|R7:=R4
0032  |50 16 1F|INCR. R4;ACC:=<DC> + 1
0035  |84 04   |GO TO B IF 1ST BYTE OF STRING IS FF
0037  |28 32 78|PROMPT
003A B|28 4D 32|CR-LF
003D  |90 CD   |GO TO A
003F C|28 36 41|GO-TERM
0042  |1E 1A   |
0044  |28 44 D0|
0047  |0C      |
~3E6C
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
PUSH.F8S
				PUSH

PUSH SAVES THE RETURN ADDRESS ON THE REGISTER STACK AT R70-77
@44C0
0000  |62 69   |ISAR:=21,STACK POINTER
0002  |4C 0B   |ISAR:=R21,TOP OF STACK
0004  |67 4D 00|ISARH:=7;PUSH STACK(INCREMENT ISAR);STORE
0007  |5D 01 5C|K IN STACK
000A  |0A      |ACC:=ISAR,NEW STACK TOP
000B  |62 69   |ISAR:=21,STACK POINTER
000D  |5E      |R21:=ACC,STORE STACK POINTER(ISAR:=20) 
000E  |1D 1C   |RESTORE STATUS BYTE FROM R9(ENABLES INTERRUPTS);RETURN
~44CF

		-- CALLING CODE --
08		SAVE PC1 IN K
1E		R9:=W,SAVE STATUS
1A		DISABLE INTERRUPTS
28 44 C0	CALL PUSH>2`>(2`~9: 2**zR~
------------------
RANDOM.F8S
				RANDOM

RANDOM RETURNS IN R2 A VALUE WHICH LIES BETWEEN THE VALUE
IN R1(LOWER) AND R0(UPPER-UNSIGNED),INCLUSIVE. ZERO NOT
ALLOWED.

@4D00
0000  |08 40 18|Complement upper limit
0003  |50 31 41|Negate lower limit
0006  |18 51   |
0008 A|20 38 B4|Port 4:= 38
000B  |A0 52   |R2:=port 0
000D  |70 B4 42|Zero port 4 because its needed
0010  |C0      |
0011  |82 F6   |Go to A if over R0
0013  |42 C1   |
0015  |92 F2   |Go to A if less than R1
0017  |40 18 50|Return limits
001A  |41 18 1F|
001D  |51 0C   |
~4D1E
			TEST PROGRAM

PUTS T UPPER IN R0 AND T LOWER IN R1
CLEARS 1000-107F
ADDS 1 TO ADDRESS CORRESPONDING TO VALUE RETURNED
UNTIL ONE BECOMES FF. RETURNED VALUE TREATED AS IF
SIGNED

@B000
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A 10 00|
0009 A|70 17 11|
000C  |20 11 EA|
000F  |94 F9   |
0011  |2A FF AD|
0014  |16 50 16|
0017  |51      |
0018 B|28 4D 00|
001B  |2A 10 80|
001E  |42 8E 11|
0021  |16 1F   |
0023  |25 FF 10|
0026  |17      |
0027  |94 F0   |
0029  |1E 1A   |
002B  |28 44 D0|
002E  |0C      |
~B02E
nt R2
0003  |94 06   |If R2 is not 0, go to A
0005  |70 BE 1D|Disable 
------------------
RDSOURCE.F8S
				RDSOURCE

RDSOURCE LOADS INTO MEMORY A PROGRAM IN THE HOST IN .F8S FORMAT.
THE BAUD RATE IS GIVEN BY P(03,12 OR 96)
STORING BEGINS AT B REGARDLESS OF THE @ ADDRESS IN THE FILE, BUT
THAT ADDRESS GOES INTO T. THE ACTUAL ADDRESS OF THE LAST BYTE STORED
GOES INTO E. CODE BETWEEN |'S IS STORED. EOF IS AT A '~' AFTER A CR,
OR THE CP/M EOF ^Z.
A CHAR IS WRITTEN FOR EACH BYTE STORED, ALSO A CR FOR EACH LINE.

@3C6F
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |28 36 0A|GO-HOST
0009  |70 56   |R6 := 0,FLAG
				-- READ CHARACTER --
000B A|28 37 BD|KBD-TEXT
				-- END PROCESS --
000E  |45 25 7E|R5 := CHAR;compare to '~'
0011  |94 21   |If not '~', go to C
0013  |46 25 40|Compare R^ to 40
0016  |94 F4   |If not 40 ,go to A
0018  |28 32 E4|SET-ADDR,read the end address
001B  |70 C2   |Test R2, will be non-zero if SET-ADDR successful
001D  |84 ED   |If 0, go to A
001F  |20 FF 8E|Decrement DC to restore last store address
0022  |11      |H := DC
0023  |2A FF AB|E address
0026  |4A 17 4B|Store last address in E
0029  |17      |
002A B|28 36 41|GO-TERM
002D  |1E 1A   |return
002F  |28 44 D0|
0032  |0C      |
				-- CP/M EOF --
0033 C|25 1A   |Compare CHAR to 1A ('^Z')
0035  |84 F4   |If '^Z' , go to B
				-- END OF LINE --
0037  |25 0A   |Compare CHAR to a linefeed
0039  |94 0C   |If not linefeed, go to D
003B  |46 21 F0|Clear 4 lsb of R6(FLAG)
003E  |56      |
003F  |7D 57   |
0041  |28 4F 90|DISP-C, CR
0044  |90 C6   |Go to A
				-- READ START ADDRESS IN FILE --
0046 D|25 40   |Compare CHAR to '@'
0048  |94 20   |If not '@', go to E
004A  |70 C6   |Check FLAG
004C  |94 BE   |If not 0, go to A
004E  |28 32 E4|SET-ADDR
0051  |70 C2   |Check R2, should be set non-zero by SET-ADDR
0053  |84 B7   |If 0, go to A
0055  |46 22 40|R6 := R6 or 40
0058  |56      |
0059  |2A FF A9|B address
005C  |16 06 16|Q := B
005F  |07 16 16|
0062  |4A 17 4B|store H at T, H is the value read by SET-ADDR
0065  |17 0F   |DC := Q, start address
0067  |90 A3   |Go to A
				-- READ PROGRAM DELIMITER --
0069 E|25 7C   |Compare CHAR to '|', data delimiter
006B  |94 20   |If not '|', go to I
006D  |46 25 41|Is FLAG 41?
0070  |94 06   |If not 41, go to G
0072  |22 02 56|R6 := R6 or 02
0075 F|90 95   |Go to A
				-- STORE DATA --
0077 G|25 43   |Compare FLAG to 43
0079  |94 91   |If not 43, go to A
007B  |22 04 56|R6 := R6 or 04,FLAG
007E H|70 C0   |Test R0,COUNT
0080  |94 8A   |If not 0, go to A
0082  |41 17   |Store R1,DATA
0085  |57 46   |
0086  |28 4F 90|DISP-C ,FLAG(either 'C' or 'G')
0089  |30      |Decrement R0, COUNT
008A  |90 80   |Go to A
				-- OUTPUT LINEFEED --
008C I|25 20   |Compare CHAR to a space
008E  |94 15   |If not space,go to K
0090  |46 25 40|Is FLAG 40?
0093  |94 0A   |If not 40, go to J
0095  |1F 56   |Increment FLAG
0097  |7A 57   |
0099  |28 4F 90|DISP-C,linefeed
009C  |90 D8   |Go to A via F
				-- STILL IN PROGRAM SPACE? --
009E J|25 43   |Is FLAG 43?
00A0  |94 D4   |If not 43, go to A via F
00A2  |90 DB   |Go to H
				-- CONVERT CHAR TO DATA --
00A4 K|46 25 43|Is FLAG 43?
00A7  |94 CD   |If not 43, go to A via F
00A9  |45 25 46|Compare CHAR to 'F'
00AC  |92 C8   |If greater,go to A via F,not hex
00AE  |25 2F   |Compare CHAR to '/'
00B0  |82 C4   |If not greater, go to A via F
00B2  |28 4F 50|RHEX
00B5  |57 41 15|R7 := ACC, temporary register; shift DATA(R1) 
00B8  |E7 51   |left 4 bits;Put R7 in 4 lsb and store in DATA
00BA  |70 50   |R0 := 0,COUNT,keeps track of nibble/byte
00BC  |90 B8   |Go to A via F
~3D2C
ET-ADD   0051  |70 C2   |
------------------
REC-BYTE.F8S
			REC-BYTE

REC-BYTE GETS TWO CHARACTERS FROM THE MODEM IN HEX AND
CONVERTS TO A BYTE IN BINARY IN R3. EACH 4 BITS IS
SEPARATELY ADDED TO THE CHECKSUM IN R2. IF A NIBBLE IS
OUT OF RANGE,A 26HEX IS OUTPUT(ILLEGAL F8 INSTRUCTION)
AND R6 IS DECREMENTED

@4638
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |28 46 14|REC-HEX,Get first nibble
0009  |92 08   |Go to A if out-of-range
000B  |15 53   |R3:=ACC*256,MSN
000D  |28 46 14|REC-HEX for second 4 bits
0010  |82 06   |Go to B if in range
0012 A|20 26 53|R3:=26                       Was 2B intended?
0015  |36      |Decrement R6
0016  |70      |ACC:=0
0017 B|C3 53 C2|R3:=ACC + R3;R2:=R3 + R2
001A  |52 1E 1A|Return
001D  |28 44 D0|
0020  |0C      |
~4658

This program seems logically incorrect and not neededx _ !^#V+|[ V   Č5Ô*ôĄ *  `j*o et* * *0 > v>- >  :G!ƀC
------------------
REC-HEX.F8S
			REC-HEX

REC-HEX READS A HEX CHARACTER FROM THE MODEM, CONVERTS IT TO 
4 LSB IN THE ACCUMULATOR, AND ADDS IT TO THE CHECKSUM IN R2.
THE CHARACTER IS NOT DISPLAYED. CARRY IS NOT SET IF > 0F HEX.

@4614
0000  |08      |
0001 A|20 50 B4|Read Modem Data Ready Flag
0004  |A0 21 01|Loop via A until ready
0007  |84 F9   |
0009  |20 54 B4|Read the data
000C  |A0 21 7F|Clear MSB
000F  |25 39   |Compare to a '9'
0011  |92 03   |Go to B if > '9'
0013  |24 07   |Add 7
0015 B|24 C9 55|R5:=ACC + C9
0018  |C2 52   |R2:=ACC+R2
001A  |20 52 B4|Pulse Data Ready Reset
001D  |70 B4 45|ACC:=R5
0020  |25 0F 0C|Compare to 0F;return
~4636
@*lÆ>2ů2*!l*"*"*|ʥ*~Ͷʥ#"+"Á:ŷ!4:ŷe


------------------
RESET.F8S
			RESET

RESET RESETS BOTH UARTS,INITIALIZES PORT 0 SO IT CAN
BE USED FOR INPUT AND DISABLES THE ROM TIMER AND 
EXTERNAL INTERRUPT(NON-UART I/O)
ETC

@47B4
0000  |1A      |Disable interrupts
0001  |70 B0 B6|Clear Port 0; disable ROM interrupt and Timer
0004  |20 55 B4|Reset Terminal/Host UART
0007  |20 5D B4|Reset Modem UART
000A  |20 3E B4|
000D  |7F 50   |135 usec
000F  |30 94 FE|Reset the random number generator and the speech chip
0012  |70 B4 BE|Disable the external interrupt
0015  |BI      |Stop the Monitor Clock
0016  |20 11 B4|
0019  |20 21 B4|
001C  |20 F0 B1|Stop RTC interrupts
001F  |20 30 B4|
0022  |20 3C B4|Reset the Auto-turn-on circuit
0025  |70 B4 1C|
~47DB
ed
001C C|74 8E   |Check every 4th location to save time
0
------------------
RESTORE.F8S
			RESTORE

RESTORE MOVES THE CONTENTS OF REGISTERS 0-7 OF THE ISARH SET
TO R0-R7. ISARH IS UNCHANGED,ISARL IS 0

@49F0
0000  |08      |
0001  |6F 0A 5A|ISARL:=7;HU:=ISAR
0004 A|4A 0B 4C|ISAR:=HU;ACC:=R6
0007  |60 5E 3A|ISARH:=0;RS:=ACC(ISARL DECREMENTED);DECREMENT HU
000A  |8F F9   |IF ISARL NOT 7,GO TO A
000C  |4A IF   |ISAR:=HU,ISARL:=0
000E  |0B 0C   |
~49FF
|25 
------------------
RHEX.F8S
			RHEX

RHEX CONVERTS A HEX CHARACTER IN R5 TO ITS BINARY
EQUIVALENT IN THE LS 4 BITS OF THE ACCUMULATOR.
R5 IS UNCHANGED.

@4F50
0000  |08 45   |
0002  |21 7F   |ACC:=R5 AND 7F,STRIP MSB
0004  |25 39   |Compare to a '9'
0006  |92 03   |If > 9,GO TO A
0008  |24 07   |Add 7 to numbers
000A A|24 C9   |Add C9 hex to make '0' 0;
000D  |0C      |RETURN
~4F5C
           
------------------
ROMCHECK.F8S
				ROMCHECK

ROMCHECK PUTS IN P THE EXCLUSIVE-OR OF ALL BYTES FROM B TO E
INCLUSIVE. IT IS USED TO FIND THE REQUIRED BYTE TO SET,AND
TO CHECK THE MORROW BOOT ROM. SET B TO THE BEGINNING AND E TO
0FFC. THE ANSWER SHOULD BE 0. THE PRESENT BALANCING BYTE IS IN
0FF9. IF CHANGES ARE MADE SET FF9 TO 00, RUN ROMCHECK AND THEN
SET FF9 TO P. RUN ROMCHECK AGAIN, P SHOULD BE 00.

@3F45
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A9|DC:=B
0009  |16 06 16|
000C  |07 0F   |
000E  |70 50   |R0:=0,RESULT
0010 A|16 E0 50|R0:=<DC> EX-OR R0
0013  |28 4E B0|DC-LIMIT
0016  |82 F9   |LOOP TO A UNTIL ALL BYTES READ
0018  |2A FF A8|P:=R0
001B  |40 17 1E|
001E  |1A      |
001F  |28 44 D0|
0022  |0C      |
~3F67
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
SAVE-REG.F8S
			SAVE-REG

SAVE-REG  SAVES R0,R6 IN THE SET AT ISARH. ISARH IS UNCHANGED
R0-R7 ARE UNCHANGED. ISARL=7

@4A80
0000  |08      |
0001  |6F 0A 5A|ISARL:=7;HU:=ISAR
0004 A|60 4C 5B|ISARH:=0;HL:=RS
0007  |4A 0B 4B|ISAR:=HU;RS:=HL(ISAR DECREMENTED)
000A  |5E 3A   |DECREMENT HU
000C  |8F F7   |IF ISARL NOT 7,GO TO A
000E  |0C      |RETURN
~4A8E
ʳʸʽ!':
------------------
SAY-BCD.F8S
				SAY-BCD
				SAY-HEX

THESE TWO SAY THE HEX VALUES IN THE TWO NIBBLES OF R7
THE ONLY DIFFERENCE IS THAT SAY BCD DOES NOT SAY THE
LEADING ZEROES FOR 00-09
THE TEENS AND TEN,TWENTY, ETC ARE SPOKEN FOR BOTH.

@4232
0000  |08 1E 1A|SAY-BCD
0003  |28 44 C0|
0006  |47 25 09|ACC:=R7
0009  |82 2E   |GO TO C IF 0-9
000B  |90 0C   |GO TO A
000D  |08 1E 1A|SAY-HEX
0010  |28 44 C0|
0013  |47 25 09|ACC:=R7
0016  |82 2B   |GO TO E IF 00-09
0018 A|25 99   |
001A  |92 27   |GO TO E IF A0-FF
001C  |21 0F   |ACC:=ACC^0F,LSN
001E  |25 09   |
0020  |92 21   |GO TO E IF XA-XF
			-- (1-9)(1-9) --
0022  |47 25 19|ACC:=R7
0025  |82 12   |GO TO C IF 10-19
0027  |14 24 20|R2:=ACC/16+20
002A  |52      |Adjusts the MS nibble for index for 20,30..90
002B  |28 6D B0|SAY-WORD(22-29)
002E  |7F F7   |ACC:=R7^0F,LSN
0030  |84 0B   |Go to D for 20,30.. no second word
			-- SECOND WORD --
0032 B|25 09   |
0034  |82 03   |Go to C for X0-X9
0036  |24 57   |ACC:+ACC+57,Adjusts index for A-F(61-66)
			-- 0-9,10-19 & second word --
0038 C|52      |R2:=ACC
0039  |28 6D B0|SAY-WORD
003C D|1E 1A   |
003E  |28 44 D0|
0041  |0C      |
			-- TWO-WORD NUMBERS --
0042 E|47 51 14|ACC,R1:=R7/16(R1 to save after SILENCE)
0045  |25 09   |
0047  |82 03   |Go to F if 0X-9X
0049  |24 57   |R2:=ACC+57,Adjust for AX-FX
004B F|52      |
004C  |28 6D B0|SAY-WORD
004F  |20 20 57|R7:=20,0.4 SEC
0052  |28 41 6B|SILENCE
0055  |7F F1   |ACC:=R1^0F,LS nibble
0057  |90 DA   |Go to B
~428A
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
SAY-TIME.F8S
				SAY-TIME

SAY-TIME SAYS "The Time is" then Hours and Minutes

@4200
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |73 52   |
0008  |28 6D B0|SAY-WORD("THE")
000B  |7B 52   |
000D  |28 6D B0|SAY-WORD("TIME")
0010  |7C 52   |
0012  |28 6D B0|SAY-WORD("IS")
0015  |28 40 70|GET-TIME
0018  |63      |ISAR:=33
0019  |6B 4C 57|R7:=R33,HOURS
001C  |28 42 32|SAY-BCD
001F  |20 20 57|R7:=20
0022  |28 41 6B|SILENCE(.4SEC)
0025  |63      |
0026  |6C 4C 57|R7:=R34,MINUTES
0029  |28 42 3F|SAY-HEX
002C  |1E 1A   |
002E  |28 44 D0|
0031  |0C      |
~4231
 32
002A  |28 4F 30|
002D  |20 2F 57|
0030  |28 4F 90|
			-- YEAR --
------------------
SAY-WORD.F8S
				SAY-WORD

SAY-WORD TAKES R2 AS AN INDEX TO SPEAK 1 OF 256 WORDS, WHOSE
SOUNDS ARE REPRESENTED BY CODES WHICH ARE PUT INTO THE CHIP
TO CAUSE IT TO UTTER SOUND ELEMENTS CALLED ALLOPHONES WHICH
LAST 50-420 MILLISECONDS. THESE CODES OCCUPY A STRING IN A
TABLE.THERE ARE ONLY 64 ALLOPHONES,SO THE CODES ARE 6 BITS.
EACH ENTRY IS TERMINATED BY A CODE WITH ITS MOST SIGNIFICANT
BIT SET. THERE IS A SILENCE OF 100 MILLISECONDS AFTER THE
END OF THE WORD BEFORE SAY-WORD RETURNS. R2 IS AN INDEX INTO
A SECOND TABLE WHOSE 2-BYTE ENTRIES POINT TO THE HEADS OF THE
STRINGS OF CODES IN THE FIRST TABLE. H AND R35-37 ARE USED.

@442D
0000  |08 0A   |K:=PC1;ACC:=ISAR
0002  |63      |ISAR:=35
0003  |6D 5D 11|R35:=ACC;H:=DC
0006  |4A 5D 4B|R36,37:=H
0009  |5C      |
000A  |2A 8E 00|DC:=HEAD OF TABLE OF POINTERS
000D  |42 8E 8E|DC:=DC+2*R2
0010  |16 5A 16|H:=<DC>,<DC+1>
0013  |5B 10   |DC:=H,HEAD OF CODE STRING
0015 A|16 52   |R2:=<DC>,CODE
0017 B|B1      |PORT 1:=CODE
0018  |20 36 B4|PORT 4:=36,ALLOPHONE LOAD STROBE(ALD)
001B  |70 B4   |RETURN LOAD PULSE
001D  |20 F0 B1|PUT FO INTO PORT 1 BECAUSE 32 IS USED BY THE CLOCK
0020  |20 32 B4|PORT 4 := 32,CHIP STATUS
0023 C|A0 21 20|BIT 5 OF PORT 0 IS LOAD REQUEST (LRQ)
0026  |94 FC   |LOOP VIA C UNTIL CHIP IS READY FOR ANOTHER CODE
0028  |70 B4 C2|RETURN PORT STATUS;GET CODE BACK
002B  |81 E9   |GO TO A FOR ANOTHER CODE IF MSB NOT SET
002D  |25 83   |
002F  |84 06   |GO TO D IF CODE IS 83(100 ms SILENCE)
0031  |20 83 52|R2:=83
0034  |90 E2   |GO TO B
0036 D|20 32 B4|GET CHIP STATUS
0039 E|A0 21 10|BIT 4 IS STANDBY
003C  |84 FC   |LOOP UNTIL IDLE
003E  |4E 5B 4E|H:=R37,36
0041  |5A 10 4C|DC:=H
0044  |0B 0C   |ISAR:=R35;PC0:=K
~4472
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
SET-ADDR.F8S
				SET-ADDR

SET-ADDR PUTS A 2-BYTE VALUE FROM THE KEYBOARD INTO H. MORE
THAN 4 CHARACTERS CAN BE ENTERED, THE LAST 4 ARE USED. IT
ENDS WHEN A NON-HEX CHARACTER IS ENTERED, WHICH GOES INTO R5
R2 RETURNS A NON-ZERO VALUE IF A HEX CODE WAS ENTERED

@32E4
0000  |08      |
0001  |70 5A 5B|Clear H
0004  |52      |Clear R2
0005 A|28 37 B9|KBD-CMD
0008  |45 25 2F|Compare to a 2F ('/')
000B  |82 21   |If not greater, go to C
000D  |25 46   |Compare to a 'F'
000F  |92 1D   |If greater, go to C
0011  |32 57   |Decrement R2
0013  |28 4F 90|DISP-C, character
0016  |45 25 39|Compare to a '9'
0019  |92 03   |If greater, go to B
001B  |24 07   |Add 7
001D B|24 C9 55|Subtract offset in ASCII code;store in R5
0020  |4A 15 5A|Shift HU left 4
0023  |4B 14 CA|Put the two middle nibbles of H into the ACC
0026  |5A 4B 15|and save in HU;put HL into ACC and shift left 4
0029  |C5 5B   |Add new hex and put into HL
002B  |90 D9   |Go to A
002D C|0C      |Return
~3311
6 ɷ=é:ŷ>v:2
------------------
SET-B.F8S
				SET-B

SET-B ENTERS THE BEGIN ADDRESS INTO B (FFA9,FFAA)
IF NO HEX IS ENTERED, 0400 IS STORED
IF AN R IS ENTERED, FFBO IS ENTERED
@3312
0000  |72 57   |
0002  |28 32 78|PROMPT("BEGIN ADDRESS =")
0005  |28 32 E4|SET-ADDR
0008  |70 C2   |Check R2 to see if any address was entered
000A  |94 05   |If so ,go to A
000C  |74 5A   |set H to 0400 for the default case
000E  |70 5B   |
0010 A|45 25 52|See if a R was entered
0013  |94 07   |If not ,go to B
0015  |20 FF 5A|Set H to FFB0
0018  |20 B0 5B|
001B B|2A FF A9|B address
001E  |4A 17 4B|Store H at B
0021  |17      |
0022  |28 32 C8|ERASE-LN
0025  |29 35 09|Jump to BROWSE
~3339
|Add 7
001D B|24 C9 55|Subtract offset in ASCII code;store in R5
0020  |4A 15 5A|Shift HU left 4
0023  |4B 
------------------
SET-BYTE.F8S
			SET-BYTE

SET-BYTE GETS 2 HEX CHARACTERS FROM THE KEYBOARD AND CONVERTS 
TO A BYTE INTO RS AND <DC>. DC INCREMENTED. ISAR UNCHANGED.
SET-BYTE CONTINUES TO PUT CHARACTERS INTO THE BYTE UNTIL ONE
IS LESS THAN '0'.THIS CHARACTER IS NOT ECHOED AND IS RETURNED
IN R5. THUS CAN CORRECT BY CONTINUING. R1 used

@4BA0
0000  |08 0A 51|Save PC1 and ISAR
0003  |1E 1A   |
0005  |28 44 C0|
0008  |41 0B   |Restore ISAR
000A A|28 4F C0|KBD-CMD
000D  |45 57   |R7:=R5
000F  |25 2F   |Compare to a '/'
0011  |82 0E   |If less than '0',GO TO B
0013  |28 4F 90|DISP-C 
0016  |28 4F 50|RHEX - converts to a nibble
0019  |57 4C 15|Save in R7;Shift RS left 4 bits
001C  |E7 5C   |Add new nibble;return to RS
001E  |90 EB   |Go to A
0020 B|4C 17 1E|Store new byte in <DC>
0023  |1A      |Return
0024  |28 44 D0|
0027  |41 0B 0C|Restore ISAR
~4BC9
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
SET-E.F8S
				SET-E

SET-E ENTERS THE END ADDRESS INTO E (FFAB,FFAC)
IF NO HEX IS ENTERED,0800 IS STORED
IF R IS ENTERED,FFFF IS STORED

@3392
0000  |73 57   |
0002  |28 32 78|PROMPT("END ADDRESS = ")
0005  |28 32 E4|SET-ADDR
0008  |70 C2   |CHECK R2 TO SEE IF NO HEX WAS ENTERED
000A  |94 05   |IF NO HEX,GO TO A
000C  |78 5A   |Set H to 0800
000E  |70 5B   |
0010 A|45 25 52|Was a 'R' entered?
0013  |94 07   |If not,go to B
0015  |20 FF 5A|set H to FFFF
0018  |20 FF 5B|
001B B|2A FF AB|E address
001E  |4A 17 4B|Store H
0021  |17      |
0022  |28 32 C8|ERASE-LN
0025  |29 35 09|Jump to BROWSE
~33B9
: 2**zR~
------------------
SET-M.F8S
				SET-M

SET-M ALLOWS INSPECTING AND PATCHING MEMORY LOCATIONS
IT STARTS WITH THE T ADDRESS.
A CR ADVANCES TO THE NEXT ADDRESS
A UP-ARROW GOES TO PRECEDING ADDRESS
A PERIOD RETURNS
ELSE, A HEX SEQUENCE PATCHES THE LOCATION. MORE THAN 2
CHARACTERS MAY BE ENTERED BEFORE THE CR; THE LAST 2 WILL
BE ENTERED

@3597
0000 A|76 57   |
0002  |28 32 78|PROMPT("MEMORY = ")
0005  |2A FF AD|T address
0008  |16 06 16|Q := T
000B  |07 0F   |DC := Q
000D  |60 6A   |ISAR := 2
000E  |16 5C   |R2 := <T>
0011  |0F      |DC := Q(T address)
0012  |28 4B A0|SET-BYTE
0015  |45 25 2E|Was a period entered?
0018  |94 04   |If not go to B
001A  |29 35 06|Jump to BROWSE
001D B|25 1B   |Compare to ESC
001F  |94 0C   |If not, go to C
0021  |28 37 B9|KBD-CMD
0024  |45 25 41|Compare to 'A'
0027  |94 04   |If not 'A', go to C
0029  |20 FE 8E|Decrement DC
002C C|28 4D 32|CR-LF
002F  |20 16 52|22 spaces
0032  |28 4F 5D|N-SPACE
0035  |20 54 57|R7 := 'T'
0038  |70 55 11|R5 := 0;H := DC
003B  |2A FF AD|DC := T
003E  |4A 17 4B|Store DC at T address
0041  |17      |
0042  |2A FF AD|T address
0045  |28 4B CC|X=, Displays T = then the address in T 
0048  |71 55   |R5 := 1, 1 byte for X=
004A  |20 4D 57|R7 := 'M'
004D  |10      |DC := H
004E  |28 4B CC|X=, Displaye M = then the value of the location pointed
0051  |73 52   |to by T;R2 := 3(spaces)
0053  |28 4F 5D|N-SPACE
0056  |90 A9   |Go to A
~35EE
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
SET-PARM.F8S
				SET-PARM

SET-PARM ENTERS THE PARAMETER VALUE FROM BROWSE COMMAND LINE

@35EF
0000  |75 57   |
0002  |28 32 78|PROMPT("PARAMETER = ")
0005  |2A FF A8|P Address
0008  |28 4B A0|SET-BYTE
000B  |28 32 C8|ERASE-LN
000E  |29 35 09|Jump back to BROWSE
~35FF
#^#V~A2ʌA2 >> >!!ʩʮʳʸʽ!':
------------------
SET-T.F8S
				SET-T

SET-T ENTERS THE TO ADDRESS INTO T(FFAD,FFAE)
IF NO HEX IS ENTERED,0400 IS STORED
IF AN 'R' IS ENTERED,FFA5 IS STORED

@33BB
0000  |74 57   |
0002  |28 32 78|PROMPT("TO ADDRESS = ")
0005  |28 32 E4|SET-ADDR
0008  |70 C2   |See if hex value entered
000A  |94 05   |If so, go to A
000C  |74 5A   |Default value is 0400
000E  |70 5B   |
0010 A|45 25 52|Was an 'R' entered?
0013  |94 07   |If not ,go to B
0015  |20 FF 5A|H := FFA5
0018  |20 A5 5B|
001B B|2A FF AD|T address
001E  |4A 17 4B|Store H
0021  |17      |
0022  |28 32 C8|ERASE-LN
0025  |29 35 09|Jump to BROWSE
~33E2
~33B9
: 2**zR~
------------------
SET-TIME.F8S
			SET-TIME

SET-TIME SETS AND INITIALIZES THE REAL-TIME CLOCK
IT STARTS RUNNING WHEN CR IS KEYED

@4100
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |70 B1   |Set up clock for Time Mode
0008  |20 30 B4|
000B  |70 B4   |
000D  |20 F0 B1|Stop clock interrupts
0010  |20 30 B4|
0013  |70 B4   |
0015 A|28 4D 32|CR-LF
0018  |7F 57   |"Format: MMDDHHmm >"
001A  |28 32 78|PROMPT
001D  |20 C0 52|R2 := CO, code for tens of months(Bits 4-7)
0020 B|28 4F C0|KBD-CMD
0023  |45 57   |
0025  |28 4F 90|DISP-C
0028  |45 25 2F|If less than '0'...
002B  |82 E9   |
002D  |25 39   |Or more than '9'
002F  |92 E5   |Go to A
0031  |24 D0 E2|Bits 0-3 are the data to be written...
0034  |B1      |Port 1 := (R5-30) OR R2
0035  |20 30 B4|Write into chip
0038  |70 B4   |
003A C|42 24 F0|R2 := R2 - 10
003D  |52 25 A0|
0040  |84 F9   |Go back to C if A0(Not writing day)
0042  |25 30   |
0044  |92 DB   |Go back for more if over 30
0046  |20 E0 B1|Stop Clock,resets seconds
0049  |20 30 B4|
004C  |70 B4   |
004E  |28 4F C0|KBD-CMD, for CR to restart clock
0051  |20 E1 B1|at next minute
0054  |20 30 B4|
0057  |70 B4   |
0059  |28 40 70|GET-TIME
005C  |28 31 A0|SPACE
005F  |28 4B 58|DISPTIME
0062  |28 4D 32|CR-LF
0065  |1E 1A   |
0067  |28 44 D0|
006A  |0C      |
~416A
v!4>v!5*& :O͎}< GMJ:O c:#(Z-bz_gy<>2zx{>_|
------------------
SETUP.F8S
			SETUP  1.1

SETUP IS JUMPED TO FROM A COLD START BY THE AUTO-START PROM
IT SETS UP THE RAM TABLES IN THE FFAX BLOCK, SOUNDS A CHIME
THEN JUMPS TO BROWSE

@4000
0000  |1A      |Disable interrupts
0001  |2A FF A1|Address of interrupt chip mask word,see INITIATE
0004  |20 B8 17|Enables power,break,monitor clock and priority
0007  |20 86 17|Year:=1986
000A  |20 FF 17|Interrupt handler vector
000D  |20 FF 17|
0010  |20 9D 17|Terminal/Host control byte = 9D 
			for High range/Terminal
0013  |20 DD 17|Modem control byte = DD for 19200/1200 baud
0016  |2A CA 00|Address of first interrupt initialization word
0019  |20 16 17|No 4th word,Single chip,edge-triggered,interval=4
001C  |2A C8 00|Address of second init. word
001F  |20 00 17|
0022  |20 4F BC|External interupt vector=4F80(Timer=4F00)
0025  |70 BD   |
0027  |29 35 00|Go To BROWSE
~4029
>- >  :G!ƀC
------------------
SOURCE.F8S
				SOURCE

SOURCE READS A PROGRAM FROM B TO E AND SENDS IT OUT IN HEX
SURROUNDED BY VERTICAL BAR SYMBOLS AS BELOW. THE FIRST
SYMBOL ON A LINE IS ALWAYS THE FIRST BYTE OF A F8
INSTRUCTION. IF P=17 THEN THE OUTPUT IS ON THE CONSOLE,
ELSE TO THE HOST AT P BAUD(03=300,12=1200,96=9600)

@3AE3
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |2A FF A8|
0009  |16 25 17|
000C  |84 06   |
000E  |28 36 0A|
0011  |20 3C   |
0013 A|56 16 06|
0016  |16 07 16|
0019  |16      |
001A  |20 F8 17|
001D  |20 20 17|
0020  |28 4D 32|
0023  |20 40 57|
0026  |28 4F 90|
0029  |28 4F 33|
002C  |28 4D 32|
002F  |0F      |
0030 B|16 57 2C|
0033  |2A 3A C3|
0036  |28 3A 56|
0039  |57 2C   |
003B  |73 F7   |
003D  |24 FF 8E|
0040  |0E      |
0041  |74 F7   |
0043  |84 24   |
0045  |0F      |
0046  |20 FF 8E|
0049  |16 8E   |
004B  |20 FF 8E|
004E  |2C      |
004F  |2A FF AD|
0052  |16 5A 16|
0055  |5B 10 2C|
0058  |11 2C 4A|
005B  |17 4B 17|
005E  |11      |
005F  |79 17   |
0061  |2A FF AD|
0064  |4A 17 4B|
0067  |17      |
0068 C|0F      |
0069  |28 4E B0|
006C  |82 C3   |
006E  |2A FF A9|
0071  |16 5A 50|
0074  |16 5B 51|
0077  |10      |
0078  |20 41 53|
007B D|46 55   |
007D E|73 54 40|
0080  |5A 41 5B|
0083  |0E      |
0084  |28 03 71|
0087  |28 4F 33|
008A  |28 31 A0|
008D  |28 3A 99|
0090  |20 20 57|
0093  |42 1F   |
0095  |84 05   |
0097  |43 57 1F|
009A  |53      |
009B F|28 4F 90|
009E  |28 36 00|
00A1 G|16 57 2C|
00A4  |2A 3A C3|
00A7  |28 3A 56|
00AA  |52 2C   |
00AC  |78 F2   |
00AE  |84 29   |
00B0  |73 E4   |
00B2  |84 25   |
00B4 H|20 FF 8E|
00B7 I|70 C4   |
00B9  |84 09   |
00BB  |73 52   |
00BD  |28 4F 5D|
00C0  |34      |
00C1  |90 F5   |
00C3 J|28 36 00|
00C6  |28 4D 32|
00C9  |28 4E B0|
00CC  |92 4D   |
00CE  |35      |
00CF  |94 AD   |
00D1  |46 25 17|
00D4  |84 32   |
00D6 K|90 A4   |
00D8 L|73 F2 18|
00DB  |1F C4   |
00DD  |92 D6   |
00DF M|47 07   |
00E1  |73 E4   |
00E3  |84 04   |
00E5  |28 31 A0|
00E8 N|28 4F 30|
00EB  |34 32   |
00ED  |73 F2   |
00EF  |84 05   |
00F1  |16 57   |
00F3  |90 EB   |
00F5 O|74 F2   |
00F7  |94 BF   |
00F9  |28 4E B0|
00FC  |92 BA   |
00FE  |28 3A 99|
0101  |42 1F   |
0103  |94 B3   |
0105  |90 9B   |
0107 P|20 3E 57|
010A  |28 4F 90|
010D  |28 37 B9|
0110  |7D 57   |
0112  |28 4F 90|
0115  |45 25 51|
0118  |94 BD   |
011A Q|20 7E 57|
011D  |28 4F 90|
0120  |20 FF 8E|
0123  |0E      |
0124  |28 4F 33|
0127  |28 4D 32|
012A  |46 25 17|
012D  |84 04   |
012F  |28 36 41|
0132 R|1E 1A   |
0134  |28 44 D0|
0137  |0C      |
~3C1A
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
SPACE.F8S
				SPACE

SPACE DISPLAYS A SPACE

@31A0
0000  |08      |
0001  |20 20 57|R7 := 'SPACE'
0004  |28 4F 90|DISP-C
0007  |0C      |
~31A7
1cƯ2!Æ!  9"1cƯ2Ĵ!Æ*2>Ù>!  9"*> >>>>>_ 
------------------
SQRT.F8S
				SQRT

SQRT outputs in R5 the square root of Q. It rounds up when the 
quotient fraction is 3/4. Q is unchanged.


@4A00
0000  |08 1E 1A|
0003  |28 44 C0|Save K
0006  |20 FF 55|Use FF as initial guess
0009  |02 25 FD|Compare QU to FD hex
000C  |92 25   |If greater, answer is FF, goto B
000E A|02 56 03|R6,R7 := Q (Dividend)
0011  |57 45 54|R4 := R5, (Divisor)
0014  |28 4A 51|Divide, result is in H = Q/R5
0017  |71 54   |R4 := 1
0019  |70 56 45|R6,R7 := R5
001C  |57      |
001D  |28 49 70|Mult-add: result is in H = Q/R5 + R5
0020  |70 55 EA|R5 := 0; Compare HU to 0
0023  |84 04   |If zero, goto B 
0025  |20 80 55|R5 := 80 hex
0028 B|4B 12 C5|R5 := R5 + HL/2
002B  |55 18 C7|Complement and add old value in R7
002E  |25 FD   |Compare to FD hex
0030  |82 DD   |If FE or FF, goto A
0032 C|1E 1A   |Return
0034  |28 44 D0|
0037  |0C      |
~4A37

------------------
STOR-STR.F8S
			STOR-STR

STO-STR USES COMM TO STORE THE INPUT IN R5 AT <DC> UNTIL
R5 HAS A ^Z IN IT. STOR-STR THEN WRITES THE ^Z FOLLOWED BY
A FE HEX BEFORE RETURNING. COMM REQUIRES A CONTROL PARAMETER 
IN R20, WHICH IS NORMALLY 42 HEX.
THE E ADDRESS HAS THE ADDRESS WITH THE FE SAVED IN IT.
CLEAR THE MEMORY AREA FIRST, AS COMM REFUSES TO PASS A FF HEX,
AND ST0R-STR ABORTS.

@4CD8
0000  |08 1E 1A|
0003  |28 44 C0|
0006 A|68 4C 50|ISARL:=0;R0:=RS
0009  |28 4A 90|COMM
000C  |11      |H:=DC
000D  |82 09   |If carry,COMM has detected a FF hex,GO TO B
000F  |45 25 1A|Is R5 a ^Z?
0012  |94 F3   |If not ^Z,GO TO A
0014  |20 FE 17|Store a FE
0017 B|2A FF AB|Store H,containing the FE at E address
001A  |4A 17 4B|
001D  |17 1E 1A|and return
0020  |28 44 D0|
0023  |0C      |
~4CFB
^#V+|[ V   Č5Ô*ôĄ *  `j*o et* * *0 > v>- >  :G!ƀC
------------------
TAB.F8S
                            TAB

TAB sends a tab character(09 hex) to the console .


@4C8D
0000  |08      |Save PC1 in K
0001  |20 58 B4|Interrogate UART Status port
0004 A|A0 21 10|Loop until THRE is 1
0007  |84 FC   |
0009  |79 B1   |Put tab into port 1
000B  |20 5E B4|Pulse THRL
000E  |70 B4   |Park port 4
0010  |0C      |Return
~4C9D

------------------
TABLE.F8S
			TABLE

TABLE DISPLAYS THE CONTENT OF MEMORY FROM B TO E
IN VARIOUS FORMATS DEPENDING ON P AS FOLLOWS:
(N=1,2 OR 3 CHARACTERS)

 P     BYTES 	COLUMNS		FORMAT    
	PER
       ENTRY
	
 0	1	19	2-HEX	
 1	1	15	UNSIGNED DECIMAL, 8-BIT
 2 	1	13	SIGNED DECIMAL, 8-BIT
 4 	2	9	SIGNED DECIMAL, 16-BIT
N0	N + 1	9	N CHAR, '=' THEN 2 HEX
N1	N + 1	7	N CHAR, '=' THEN UNSIGNED DECIMAL(8)
N2	N + 1	6	N CHAR, '=' THEN SIGNED DECIMAL(8)
N4	N + 2	4	N CHAR, '=' THEN SIGNED DECIMAL(16)
 9	3	3	24-BIT FLOAT IN SCIENTIFIC NOTATION
N9	N + 3	3	N CHAR, '=' THEN FLOAT
>3F 	1	77	CHAR

@4E00
0000  |08 1E 1A|
0003  |28 44 C0|
			-- CALCULATE FIELD SPACING --
0006  |64      |ISAR:=40
0007  |68      |
0008  |2A FF A8|P ADDRESS 
000B  |16 51   |R1:=P
000D  |21 0F   |Mask 4 LSB of P
000F  |24 04 5C|Add 4,R40:=ACC
0012  |20 C0 F1|Mask 2 MSB of P
0015  |94 0B   |If not 0,GO TO A
0017  |20 38 F1|Mask bits 3,4 & 5 of P
001A  |84 08   |If 0,GO TO B
001C  |4C 13 5C|R40:=R40*2
001F  |90 03   |Go to B
0021 A|71 5C   |R40:=1
			-- INITIALIZE --
0023 B|16 5A 16|DC:=B
0026  |5B 10   |
			-- NEW PAGE --
0028 C|20 17 50|R0:=17 HEX(24 LINES)
			-- NEW LINE __
002B D|28 4D 32|CR-LF
002E  |64      |ISAR:=41
002F  |69      |
0030  |20 4F 5D|R41:=4F(80 cols)(R41 is decremented by DISP-C )
0033  |5C      |R42:=4F, used by TABULATE to mark field beginning
			-- ONE ENTRY --
0034 E|20 C0 F1|Mask 2 MSB of P
0037  |94 2D   |If not 0,P is >3F, GO TO J
0039  |20 30 F1|Mask bits 4 & 5
003C  |14 55   |R5:=ACC/16("N")
003E  |84 0F   |If zero,GO TO G,no leading characters
			-- LEADING CHARACTERS --
0040 F|16 57   |R7:=<DC>
0042  |28 4F 90|DISP-C 
0045  |35      |Decrement R5
0046  |94 F9   |If not yet 0,GO TO F, more leading characters
0048  |20 3D 57|R7:='='
004B  |28 4F 90|DISP-C 
			-- STORE VALUE --
004E G|70 5A   |HU:=0  (<10)
0050  |7C F1   |Mask bits 2 & 3 of P
0052  |84 03   |If 0,Go to H   (<4)
0054  |16 5A   |HU:=<DC>
0056 H|16 5B 07|HL,QL:=<DC>    (<10)
0059  |78 F1   |Mask bit 3 of P
005B  |84 03   |If 0,GO TO I   (<8)
005D  |16 55   |R5:=<DC>, exponent
005F I|7F F1   |Mask 4 LSB of P
0061  |84 46   |If 0,GO TO R,Hex mode
0063  |90 2D   |Go To O,Decimal mode
			-- CHARACTER MODE --
0065 J|16 25 0A|READ MEMORY AND COMPARE TO A LF
0068  |94 02   |If not LF,GO TO K
006A  |30      |Decrement R0 (lines remaining)
006B K|57      |R7:=<DC>
006C  |28 4F 90|DISP-C 
			-- SPACE OUT TO NEXT COLUMN --
006F L|28 4E C0|TABULATE
0072  |28 4E B0|DC-LIMIT
0075  |82 07   |Go to N if not finished
			-- RETURN --
0077 M|1E 1A   |
0079  |28 44 D0|
007C  |0C      |
			-- SEE IF END OF LINE --
007D N|64      |ISAR:=41(CHARACTERS REMAINING ON LINE)
007E  |69 4E 18|ACC:=NOT R41
0081  |CC      |Add R40 (Field width)
0082  |92 B1   |If no carry,GO TO E for another entry            
0084  |30      |Decrement no of lines remaining
0085  |81 A5   |If not at bottom,return to D for another line
			-- QUERY OPERATOR --
0087  |28 4F C0|KBD-CMD
008A  |45 25 2E|IS entry a period?
008D  |84 E9   |If period,return,GO TO M
008F  |90 98   |Go to C for a new page
			-- FIND DECIMAL VALUE DISPLAY MODE --
0091 O|72 F1   |MASK BIT 1 OF P  (1-F)
0093  |94 0A   |IF NOT 0,GO TO P (2,3,6,7,A,B)
0095  |78 F1   |MASK BIT 3 OF P  (4,5,8,9,C,D)
0097  |94 0B   |IF NOT 0,GO TO Q
		-- ONE BYTE UNSIGNED OR TWO BYTES SIGNED --
0099  |28 48 10|DISP-2D
009C  |90 D2   |Go to L
			-- ONE BYTE SIGNED --
009E P|28 48 00|DISP-1D  (2,3)
00A1  |90 CD   |Go to L
			-- FLOAT --
00A3 Q|28 49 B5|DISP-FP   (8,9,C,D)
00A6  |90 C8   |Go to L
			-- 2 HEX --
00A8 R|28 4F 30|2-HEX   (00)
00AB  |90 C3   |Go to L
~4EAC
0082  |92 B1   |If no carry,GO TO E 
------------------
TABULATE.F8S
			TABULATE

TABULATE ADDS SPACES IN THE RIGHT QUANTITY TO MOVE THE 
CURSOR TO A FIXED COLUMN POSITION. THE TAB WIDTH IS
STORED IN R40. BEFORE A LINE IS WRITTEN, THE COLUMN 
COUNT IS STORED IN R42 AND R41. DISP-C DECREMENTS
R41 SO THAT TABULATE CAN CALCULATE HOW MANY SPACES ARE
NEEDED TO GET TO THE NEXT COLUMN POSITION.
TABULATE UPDATES R42 FOR THE NEXT CALL.

@4EC0
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |64 6A   |ISAR:=42
0008  |4E 18 1F|ACC:=-R42
000B  |CE CC   |ACC:=R40 + R41 - R42
000D  |6A 5C   |R42:=R40 + R41 - R42,number of spaces 
000F A|3C      |Decrement R42
0010  |91 09   |If negative,done,GO TO B
0012  |20 20 57|Space
0015  |28 4F 90|DISP-C 
0018  |90 F6   |Go to A
001A B|69 4D 5C|R42:=R41,update column position
001D  |1E 1A   |return
001F  |28 44 D0|
0022  |0C      |
~4EE2
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
TEKPOINT.F8S
			TEK-POINT 

TEK-POINT sends the codes to position the beam on the TEKTRONIX 4006-1.  
The input for Y is in H and the input for X is in Q. The output is via 
the modem port and consists of 1-4 bytes, depending on which bytes
are different from the previous point, whose values are stored in R53-55.
The order is YU,YL,XU,XL. Each byte contains 5 bits out of the 10-bit input
values. Each has an offset as follows: 20,60,20,40 hex. XL is always sent,
and is not saved. YL is sent if changed, and also if XU is to be sent. Bit
rate not to exceed 2400 without delays between invocations.
H and Q are unchanged. R6 and R7 are used.

@41AB
0000  |08 1E 1A|Save K                                                    
0003  |28 44 C0|                                                          
0006  |66      |ISAR := 53                                                
0007  |6B 4A 15|R7 := (8 * HU) + (HL / 32) + 20  (YU)                     
000A  |57 4B 14|(The 3 upper bits of HL and the 2 lower bits of HU + 20)  
000D  |C7 12   |                                                          
000F  |22 20 57|                                                          
0012  |EC 47 5D|Compare with R53 and store into R53; ISAR := 54           
0015  |84 04   |If 0, do not send YU, goto A                              
0017  |28 4D 20|XMIT-C YU                                                 
001A A|4B 21 1F|R7 := (HL ^ IF) + 60 (YL)                                 
001D  |22 60 57|(The 5 lower bits of HL + 60)                             
0020  |EC 56 47|Compare to R54; store ex-or in R6(non-zero if different)  
0023  |5D      |Store YL in R54; ISAR := 55                               
0024  |84 04   |If same, do not send, goto B                              
0026  |28 4D 20|XMIT-C YL                                                 
0029 B|02 15 57|R7 := (8 * QU) + (QL / 32) + 20 (XU)                      
002C  |03 14 C7|(The 3 upper bits of QL and the 2 lower bits of QU + 20)  
002F  |12 22 20|                                                          
0032  |57      |                                                          
0033  |E 4 5E|Compare to R55; store XU in R55; ISAR := 54               
0036  |84 0F   |If same, do not send XU, goto D                           
0038  |70 C6 4D|Compare R6 to zero; Acc := R54 (YL); ISAR := 55           
003B  |94 05   |If R6 is non-zero, YL was sent already, goto C            
003D  |57      |R7 := R54 (YL)                                            
003E  |28 4D 20|XMIT-C YL                                                 
0041 C|4C 57   |R7 := R55 (XU)                                            
0043  |28 4D 20|XMIT-C XU                                                 
0046 D|03 21 1F|                                                          
0049  |22 40 57|R7 := (QL ^ IF) + 40 (XL)                                 
004C  |28 4D 20|XMIT-C XL                                                 
004F  |1E 1A   |Return                                                    
0051  |28 44 D0|
0054  |0C      |
~41FF


------------------
TESTAUTO.F8S
                         TES AUTO

TEST TH INTERRUP AN TURN-O PROPERTIE O TH AUTO
TURN-O TIMER

@B000
0000  |1A       Locatio reache a turn-o fro 2000
0001  |28 47 B4|RESET
0004  |28 90 30|Initiate the UART
0001  |20 4F BC|Externa interrup vector=4F00
0004  |70 BD   |
0006  |2A FF A3|Interup handle vecto fo EXT-IN  A200
0009  |20 A2 17|
000C  |70 17   |
000E  |2A CA 00|
0011  |20 16 17|Firs 825 init wor  16
0014  |2A C8 00|
0017  |20 A2 17|Secon 825 init wor  A2
001A  |20 BC 17|825 mask:=BC(0, an  enabled)
001D  |20 3C B4|Rese th AUTO-TURNO timer
0020  |70 B4   |
0028  |71 51   |R1:=01
002B  |20 11 50|R0:=<EL>
002D  |28 4D 00|RANDOM
0032  |2A FF AB|E
0033  |42 17 53|E:=R2;R3:=R2,timeout value in 30 sec units
0035  |16 06   |DC:=B
0038  |16 07 0F|
003A  |28 40 70|GET-TIME
003D  |63      |ISAR:=63,HOURS
003E  |6B 4D   |
0041  |17 4D 17|STORE MOURS,MINS,SEC,TENTHS SEC.
0044  |4D 17 4C|
0047  |17      |
0048  |70 17 17|Add 3 nulls
004B  |17 43 17|STORE R3,the timer value in 30 sec units,in hex
004E  |0E      |B:=DC
004F  |2A FF A9|
0052  |02 17 03|
0055  |17      |
0056  |77 50   |R0:=07,the timer command corresponding to the MSB
0058 A|70 E3   |
005A  |91 06   |Go to C if R3 is negative
			-- POSITIVE,NO TIMER COMMAND --
005C  |13 53   |R3:=R3*2
005E B|30      |DECREMENT R0
005F  |90 F8   |Go to A
			-- NEGATIVE,STORE COMMAND IN TIMER --
0051 C|13 53   |R3:=R3*2
0063  |84 0A   |GO TO D IF R3 IS NOW 0
0065  |40 B1   |PORT 1:= R0
0067  |20 3A B4|ENTER COMMAND
006A  |70 B4   |
006C  |90 F1   |GO TO B
			-- LAST COMMAND HAS BIT 3 SET --
006E D|78 E0 B1|PORT 1:=R0+8,ENABLES TIMER INTERRUPT
0071  |20 3A B4|ENTER COMMAND
0074  |70 B4   |
			-- WRITE 140 HEX AT 1000 --
0076  |72 50   |See HEX-DUMP
0078  |71 51   |
007A  |28 37 FB|
007D  |2A 10 00|
0080  |20 17 50|
0083 E|20 10 51|
0086 F|16 07   |
0088  |28 4F 30|
008B  |31      |
008C  |84 0D   |
008E  |73 F1   |
0090  |73      |
0091  |84 02   |
0093  |71      |
0094 G|52      |
0095  |28 4F 5D|
0098  |90 ED   |
009A H|30      |
009B  |84 06   |
009D  |28 4D 32|
00A0  |90 E2   |
	              -- ENABLE INTERRUPTS --
00A2 I|71 BE 1B|
00A5 J|78 52   |Home cursor and clear top line
00A7  |28 4F 11|
00AA  |7B 52   |
00AC  |28 4F 11|
00AF  |28 40 70|GET-TIME
00B2  |28 4B 58|DISP-TIME
00B5  |28 31 A0|SPACE
00B8  |63      |
00B9  |6D 4D 07|
00BC  |28 4F 30|2-HEX,Seconds
00BF  |4C 07   |
00C1  |20 2E 57|DISP-C,period
00C4  |28 4F 90|
00C7  |28 4F 30|2-HEX,Tenths of seconds
00CA  |20 64 51|Delay of 0.1 sec
00CD K|20 6F 50|
00D0 L|30      |
00D1  |94 FE   |
00D3  |31      |
00D4  |94 F8   |
00D6  |90 CE   |Go to J
~B0D7

				-- INITIALISE UART --

@9030
0000  |08      |
0001  |2A FF A5|
0004  |16 B1   |
0006  |20 51 B4|
0009  |70 B4 16|
000C  |B1      |
000D  |20 59 B4|
0010  |70 B4   |
0012  |70 B5   |Turn on red LED
0014  |0C      |
~9044
				-- INTERRUPT HANDLER --
@A200
0000  |66      |Save registers 0,1,2,7 and ports 1,4
0001  |68 40 5D|in R60-65
0004  |41 5D 42|
0007  |5D 47 5D|
000A  |A1 5D A4|
000D  |5D      |
000E  |2A CE 00|Read out 8259 and store 2nd byte in R66
0011  |16 16 5D|
0014  |25 1C 16|
0017  |84 59   |Go to E if invalid code(1C)
0019  |20 70 B4|
001C  |A0 5E   |Store 74148 code in R67,isar = 66
001E  |70 B4   |
		-- STORE INTERRUPT ID AND TIME IN BUFFER --
0020  |2A FF A9|
0023  |16 06 16|
0026  |07 0F   |DC:=<B>
0028  |70 17 4D|Store the 2 codes in buffer
002B  |17 4C 17|after a null
002E  |70 17   |Add a null
0030  |28 40 70|GET-TIME
0033  |63      |
0034  |6B 4D 17|Store hours,mins,sec,tenths of sec in buffer
0037  |4D 17 4D|
003A  |17 4C 17|
003D  |0E      |
003E  |2A FF A9|B:=DC
0041  |02 17 03|
0044  |17      |
			-- DISPLAY BUFFER CONTENTS --
0045  |72 50   |See HEX-DUMP
0047  |71 51   |
0049  |28 37 FB|
004C  |2A 10 00|
004F  |20 17 50|
0052 A|20 10 51|
0055 B|16 07   |
0057  |28 4F 30|
005A  |31      |
005B  |84 0D   |
005D  |73 F1   |
005F  |73      |
0060  |84 02   |
0062  |71      |
0063 C|52      |
0064  |28 4F 5D|
0067  |90 ED   |
0069 D|30      |
006A  |84 06   |
006C  |28 4D 32|
006F  |90 E2   |
		-- SET UP AUTO TIMER TO TURN OFF THEN ON --
0071 E|66      |
0072  |6E 4D   |
0074  |25 18   |
0076  |94 32   |Go to I if not in 74148
0078  |4C 21 F0|
007B  |25 20   |
007D  |94 2B   |Go to J if not auto-timer interrupt
007F  |20 3C B4|Reset auto timer,loading it does not reset it
0082  |70 B4   |
0084  |2A FF A8|Load timer with content of P,value used for
0087  |16 52   |the interrupt
0089  |77 50   |Command if MSB of R2 is 1
008B F|70 E2   |
008D  |91 06   |Go to H if MSB is 0
008F  |13 52   |Shift R2 left 1 bit
0091 G|30      |Decrement R0
0092  |90 F8   |Go to F
0094 H|13 52   |Shift R2 left 1 bit
0096  |84 0B   |Go to I if 0
0098  |78 E0 B1|Load R0 command with bit 3 set
009B  |20 3A B4|
009E  |70 B4   |
00A0  |90 F0   |Go to G
00A2 I|40 B1   |Last 1 bit has command with bit 3 cleared
00A4  |20 3A B4|Load command
00A7  |70 B4   |
00A9 J|2A CA 00|Store End-of-interrupt in 8259
00AC  |20 20 17|
00AF  |66      |
00B0  |68 4D 50|Restore saved registers and ports
00B3  |4D 51 4D|
00B6  |52 4D 57|
00B9  |4D B1 4C|
00BC  |B4      |
00BD  |29 4F ED|Go to EXT-INT
~A2BF
an interrupt code 1 of 00 is power down
An interrupt code 1 of 18 is the 74148 chip
An interrupt code 2 of 2x is the auto timer
An interrupt code 2 of Fx is no 74148 interrupt

START TIME     INT DELAY     INT CODE      INT TIME
22 44 15 06   00 00 00 AC   00 18 26 00   00 10 13 06 int in 86 min

08 37 50 00   00 00 00 0D   00 18 24 00   08 44 19 04 6.5 min
00 00 F4 00   08 44 20 00   08 50 52 07   00 00 00 10 8 min
00 18 2F 00   08 58 52 01   00 00 FF 00   08 58 52 07
09 06 55 03   00 00 00 02   00 18 27 00   09 07 54 08 1 min
00 00 F7 00   09 07 55 05   09 08 55 05   00 00 00 0D 6.5 min
00 18 29 00   09 15 24 09   00 00 F9 00   09 15 25 06
09 21 58 02   00 00 00 02   00 18 26 00   09 22 57 07 1 min
00 00 F6 00   09 22 58 04   09 24 01 01   00 00 00 03 1.5 min
00 18 25 00   09 25 30 06   00 00 F5 00   09 25 31 03
09 27 03 09   00 00 00 02   00 18 24 00   09 28 03 05 1 min
00 00 F4 00   09 28 04 01   09 29 03 09   00 00 00 0E ?? 3 sec

09 29 06 08   00 00 00 0D   00 18 22 00   09 35 36 03 6.5 min
00 00 F2 00   09 35 36 09   09 42 09 05   00 00 00 0D 6.5 min
00 18 29 00   09 48 39 00   00 00 F9 00   09 48 39 06
09 55 12 02   00 00 00 0D   00 18 27 00   10 01 41 07 6.5 min
00 00 F7 00   10 01 42 03   10 08 14 09   00 00 00 10 8 min
00 18 2B 00   10 16 14 04   00 00 FB 00   10 16 15 00
10 24 17 06   00 00 00 10   00 18 2E 00   10 32 17 00 8 min
00 00 FE 00   10 32 17 07   10 40 20 03   00 00 00 02 1 min
00 18 27 00   10 41 19 08   00 00 F7 00   10 41 20 04
10 42 23 01   00 00 00 10   00 18 24 00   10 50 22 05 8 min
00 00 F4 00   10 50 23 02   00 00 00 00   00 00 00 00
(expanded delay range in loc. B02B)
11 12 14 03   00 00 00 10   00 18 26 00   11 20 13 07 8 min
00 A2 F6 00   11 20 14 03   11 28 16 09   00 00 00 88 bad ID,68 min
00 18 23 00   12 36 15 03   00 00 F3 00   12 36 16 00
13 44 17 06   00 00 00 88

COMMAND:1     2    4    8   10   20   40   80  HEX
DELAY   0.5   1    2    4    8   16   32   64  MINS

DELAY TO INTERRUPT IS SUM OF COMMANDS ISSUED AFTER RESET
INTERRUPT OR POWER TURN-ON SIGNAL LASTS 30 SECONDS
RESET(Port 4:= 3C) does 3 things:
 - Resets the counter
 - Clears all commands from the comparator
 - Sets the Bit 3 mode F/F to 0 state:
       Interrupt disabled
       Turn-off enabled(non-operative until command)                                                                                                                         
------------------
TESTDTOA.F8S

@8800
0000  |08      |
0001 A|20 58 B4|
0004  |20 FF 53|
0007  |71 54 A0|
000A  |21 20   |
000C  |94 02   |
000E  |0C      |
000F B|20 D8 50|
0012 C|78 E0 50|
0015  |71 51   |
0017 D|70 52   |
0019 E|32 42 E3|
001C  |B1      |
001D  |73 B4   |
001F  |70 B4 41|
0022  |E4 C0 B1|
0025  |77 B4   |
0027  |70 B4 E2|
002A  |94 EE   |
002C  |31      |
002D  |81 E9   |
002F  |70 53 54|
0032  |78 F0   |
0034  |84 DD   |
0036  |90 CA   |
~8837
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
------------------
TIMEDATE.F8S
				TIMEDATE

TIMEDATE SHOWS TIME AND DATE AT THE CURSOR POSITION:
12:32 08/31/86

@45FD
0000  |08 1E 1A|
0003  |28 44 C0|PUSH
0006  |28 40 70|GET-TIME
0009  |28 4B 58|DISPTIME
000C  |28 4D 32|CR-LF
000F  |1E 1A   |
0011  |28 44 D0|POP
0014  |0C      |
~4611
 1E 1A|
0003  |28 44 C0|
0006  |28 40 70|
0009  |28 4B 58|
000C  |28 4D 32|
000F  |1E 1A   |
0011  |28 
------------------
TIMERINT.F8S

@4F00
0000  |58 1E 32|
0003  |94 06   |
0005  |70 BE 1D|
0008  |48 1C   |
000A A|43 BF 1D|
000D  |48 1B 1C|
~4F0F
C  
------------------
TUNE.F8S
			TUNE

TUNE PLAYS THE TUNE IN R2 AS FOLLOWS:

00	Descending octave chime
01	Simple chime
07	Westminster chime
02	Toreador
03	William Tell
04	Hallelujah chorus
05	Star-Spangled Banner
06	Yankee Doodle
0A	Hell's Bells
0B	Jingle Bells
0C	La Vie En Rose
0D	Star Wars
0E	Beethoven's 9th
1A	John Brown's body
1B	Clementine
1C	God Save The Queen
1D	Colonel Bogey
1E	Marseillaise
2A	America,America
2B	Deutschland leid
2C	Wedding march
2D	Beethoven's 5th
2E	Augustine
3A	O Sole Mio
3B	Santa Lucia
3C	The end
3D	Blue Danube
3E	Brahms' Lullaby

@4F20
0000  |08 42 B1|Port 1 = R2
0003  |20 34 B4|Port 4 = 34
0006 A|A0 21 40|Bit 6 of port 0 is 1 while tune plays
0009  |94 FC   |Loop to A until stopped
000B  |0C      |Return
~4F2B


------------------
UNKNOWN.F8S
@6300
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |63      |
0007  |68 4C 55|
000A  |70 57   |
000C A|45 25 1D|
000F  |82 0A   |
0011  |20 E2 C5|
0014  |55 47 1F|
0017  |57      |
0018  |90 F3   |
001A B|2A 81 60|
001D  |47 8E   |
001F  |64 16 5C|
0022  |71 FC   |
0024  |84 07   |
0026  |45 18 1F|
0029  |24 1E 55|
002C C|70 C5   |
002E  |84 2A   |
0030  |C5 C5   |
0032  |2A 31 43|
0035  |8E      |
0036  |64      |
0037  |6B 16 5D|
003A  |16 5C   |
003C  |21 0F 51|
003F  |16 52   |
0041  |28 4D 57|
0044  |64      |
0045  |69 46 5D|
0048  |47 5D 4C|
004B  |14 51 4D|
004E  |15 52 4C|
0051  |14 C2 52|
0054  |28 4D 57|
0057  |90 0D   |
0059 D|70 56 57|
005C  |63      |
005D  |69 4C   |
005F  |64 5D   |
0061  |63 4C   |
0063  |64 5C   |
0065 E|64      |
0066  |68      |
0067  |72 FD   |
0069  |84 04   |
006B  |28 49 60|
006E F|46 5A 47|
0071  |5B      |
0072  |6A 4E 57|
0075  |4E 56   |
0077  |78 FC   |
0079  |84 04   |
007B  |28 49 60|
007E G|74 FC   |
0080  |84 0B   |
0082  |10 46 5A|
0085  |47 5B 0E|
0088  |02 56 03|
008B  |57      |
008C H|63      |
008D  |6E 47 CE|
0090  |07 46 19|
0093  |CE 06 4B|
0096  |CE 5B 4A|
0099  |19 CC 5A|
009C  |1E 1A   |
009E  |28 44 D0|
00A1  |0C      |
~63A1
UUUUU
------------------
VECTOR.F8S
				VECTOR

This calculates the co-ordinates of the end point of a vector, using the
co-ordinates of the start and the angle. The co-ordinates are 10-bit 
unsigned values and the angle is 0-239 in 1.5 degree increments counter-
clockwise from right horizontal. It uses two tables: SIN-COS has sin and
cos in 1.5 deg. increments from 1.5 to 45. VECTFLAG has logic for the trig
calculations. 
            INPUT: Angle  : R30
                   Length : R31,R32
                   Start Y: R33,R34
                   START X: R35,R36
            OUTPUT:      Y: H
                         X: Q
All inputs are unchanged.

@6300
0000  |08 1E 1A|Save K in stack                                           
0003  |28 44 C0|                                                          
0006  |63      |ISAR := 30                                                
0007  |68 4C 55|R5 := R30
000A  |70 57   |R7 := 0, 45 deg increments in angle(30 increments)        

                        -- NORMALIZE ANGLE TO 0-45 DEG --                         

000C A|45 25 1D|Compare angle to 29                                       
000F  |82 0A   |If carry, less than 30, goto B                            
0011  |20 E2 C5|R5 := R5 - 30                                             
0014  |55 47 1F|                                                          
0017  |57      |Increment R7                                              
0018  |90 F3   |Goto A                                                    

                        -- LOOKUP FLAG TABLE --                                   

001A B|2A 31 A8|DC := VECTFLAG table bottom        
001D  |47 8E   |DC := DC + R7;                     
001F  |64 16 5C|R40 := [DC], flags                                        
0022  |71 FC   |Test Bit 0 of flags                                       
0024  |84 07   |If 0, Goto C                                              
0026  |45 18 1F|Must read SIN-COS table backwards:                        
0029  |24 1E 55|R5 := 30 - R5                                             


                     - TRIG TABLE LOOKUP AND MULTIPLY BY LENGTH --            

002C C|70 C5   |Test R5                                                                          
002E  |84 2A   |Goto D if 0, bypass trig. calculation                                                                  
0030  |C5 C5   |3*R5: Each table entry is 3 bytes(SIN,COS)          
0032  |2A 31 43|DC := SIN-COS table bottom - 3 (First entry is for 1)     
0035  |8E      |DC := DC + 3*R5                                           
0036  |64      |ISAR := 43                                                
0037  |6B 16 5D|R43,44 := SIN (left justified)                            
003A  |16 5C   |
                		-- COS --                                 

003C  |21 0F 51|R1 := Bits 0-3 of middle byte, COS high nibble            
003F  |16 52   |R2 := Third byte, rest of COS                             
0041  |28 4D 57|MULT-12: R6,7 := R31,32 * R1,2 / 4096                                                                               
0044  |64      |ISAR := 41                                                
0045  |69 46 5D|R41,42 := R6,7, save Length*COS                           

                		-- SIN --                                 

0048  |47 5D 4C|ISAR := 43                                                
004B  |14 51 4D|R1 := R43/16 (Saved SIN value)                            
004E  |15 52 4C|R2 := R43*16 + R44/16                                     
0051  |14 C2 52|                                                          
0054  |28 4D 57|MULT-12: R6,7 := R31,32 * R1,2 / 4096                     
0057  |90 0D   |Goto E                                                    

                	-- 0,90,180,270 deg. --                           

0059 D|70 56 57|SIN = 0 (Angle is normalized to 0 for all these)          
005C  |63      |SIN is in R6,7                                            
005D  |69 4C   |COS = Length, goes into R41,42                            
005F  |64 5D   |
0061  |63 4C   |
0063  |64 5C   |

                	-- CONDITIONAL SIN NEGATION --                    

0065 E|64      |ISAR := 40, Flag byte                                     
0066  |68      |                                                          
0067  |72 FD   |Test flag bit 1                                           
0069  |84 04   |Goto F if 0                                               
006B  |28 49 60|NEGATE R6,7                                               
006E F|46 5A 47|H := R6,7 
0071  |5B      |
0072  |6A 4E 57|ISAR := 42; R6,7 := R41,42                                                
0075  |4E 56   |ISAR := 40

               	-- CONDITIONAL COS NEGATION --                    

0077  |78 FC   |Test flag bit 3, (ISAR := 36)                
0079  |84 04   |If 0, goto G                                 
007B  |28 49 60|NEGATE R6,7                                                                                            

					-- CONDITIONAL SWAP OF SIN AND COS REGISTERS

007E G|74 FC   |Test bit 2 of R40, flags
0080  |84 0B   |Goto H if zero
0082  |10 46 5A|DC := H; H := R6,7             
0085  |47 5B 0E|Q := DC         
0088  |02 56 03|R6,7 := Q             
008B  |57      |                                                          

					-- ADD START CO-ORDINATES --

008C H|63      |ISAR := 36
008D  |6E 47 CE|Q := R6,7 + R35,36
0090  |07 46 19|
0093  |CE 06 4B|
0096  |CE 5B 4A|H := H + R33,34
009C  |1E 1A   |                                                          
009E  |28 44 D0|Return                                                    
00A1  |0C      
~63A1          


                                                                          
------------------
VERT-BAR.F8S
				VERT-BAR

VERT-BAR DISPLAYS A '|'

@3600
0000  |08      |
0001  |20 7C 57|R7 := '|'
0004  |28 4F 90|DISP-C
0007  |0C      |
~3607
1cƯ2!Æ!  9"1cƯ2Ĵ!Æ*2>Ù>!  9"*> >>>>>_ 
------------------
X-EQUALS.F8S
			X=EQUALS

X-EQUALS WRITES THE CONTENTS OF R7, THEN '=', THEN <DC>
AS 4 HEX IF R5 =0, ELSE 2 HEX, THEN TWO SPACES
Q and R2 used

@4BCC
0000  |08 1E 1A|
0003  |28 44 C0|
0006  |28 4F 90|DISP-C (R7)
0009  |20 3D 57|
000C  |28 4F 90|DISP-C ('=')
000F  |45 13   |ACC:=R5*2
0011  |94 03   |GO TO A IF NOT 0
0013  |16 06   |QU:=<DC>
0015 A|16 07   |QL:=<DC>
0017  |45 13   |Test R5 again
0019  |94 06   |Go To B if not 0
001B  |28 4F 33|4-HEX
001E  |90 04   |Go to C
0020 B|28 4F 30|2-HEX
0023 C|72 52   |R2:=2
0025  |28 4F 5D|N-SPACE
0028  |1E 1A   |
002A  |28 44 D0|
002D  |0C      |
~4BF9
: 2**zR~
------------------
XMIT-C.F8S
				XMIT-C

This sends the character in R7 via the modem at existing baud rate.
It returns with R7 unchanged after loading the character into the UART.


@4D20
0000  |08      |Save PC1 in K
0001  |20 50 B4|Modem UART status port
0004 A|A0 21 10|Read THRE, bit 4,
0007  |84 FC   |until a one
0009  |47 B1   |Load character into port 1
000B  |20 56 B4|Pulse THRL
000E  |70 B4   |park port 4
0010  |0C      |Return
~4D31

------------------
