; TI990/12 LOAD ROMs disassembly
;
;General background :
; These ROMs contain the handler for the LOAD/RESTART interrupt.  This interrupt is called at
; start-up (instead of RESET, which is used for "warm reset", I think), so that the boot loader in
; ROMs can be executed.
;
; This interrupt can also be triggered by the programmer panel, and there is code to handle the
; panel functions.
;
;Description :
; We have one single 8kb ROM set (2 4k*8 ROMs).
;
; First 4kb contain TI990/12 machine code.  They are paged in four 1kb pages.
; All these pages are always located at >FC00.
;
; Last 4kb make no sense.
;
; Page 0 includes programmer panel handling and boot strap code, and a small bit of auto-test code.
; Pages 1-3 include remaining auto-test code.
;
; These ROMs are a source of information on the boot process and TI990/12 hardware.
;
; If you want a starting point, you can have a look at the LOAD vector located at >FFFC (page 0).
; The LOAD routine starts at >FC44 (page 0).
;
; The ROMs are obviously an instance of the "universal ROM loader" as described in the
; Model 990 Universal ROM Loader User's Guide.
; You should read the Universal ROM Loader User's Guide before reading the disassembly.
;
; The ROM basically do the following :
; * handle programmer panel functions if applicable
; * perform extensive self-test
; * look for a MDU, and boot from it if present
; * if programmer panel disabled, boot from the first tape/disk unit it finds (using a MT3200/WD900
;  controller or equivalent)
; * if programmer panel enabled, boot from the unit designated in RO/R1/R2 (either ASR tape,
;  FD800 single-sided disk, or tape/disk based on a MT3200/WD900 controller or equivalent)
;
;Conventions used :
; TMS9900 assembly conventions should have been respected.  Particularily :
; * bit are numbered from MSB to LSB (unlike almost every other CPU)
; * format for TI990/12-specific instructions was mostly guessed, therefore it is unlikely to be
; very accurate.  Specifically, operand order is probably wrong.
;
; Raphael Nabet, 2000/04/24
;
; revision history :
; 2000/04/24 : explicited MT3200 tape unit support
; 2000/02/23 : fixed a few comments, clarified a few things with MDU support, found out what LCS does
; 2000/02/20 : initial release




; Notes on TI990/12 CPU
;
; TI990/12 should be backward compatible with TI990/10 & TMS9900.  It includes the memory mapping
; feature, which is optionnal on TI990/10.  Additionnally, it has many extra features and opcodes.
; Some of them are implemented in the tms99000 family.  Many are not.
;
;Overview :
;
; * Multiple-byte / Extended (i.e. 32-bit) integers support
; * Multiple-byte ("string") move and compare operations
; * Floating-point real support (single-precision & double-precision)
; * Decimal ascii to/from binary conversion
; * "Writable Control Storage (WCS) - In the model 990/12 Computer, an area set aside that contains
;   microcode that is executable by the user tasks via a an XOP instruction within the user program."
;   (Source : Model 990 Computer DX10 Operating System Concept and Facilities Manual Volume 1 A-12,
;   page 77)
; * Stack operations (I have no idea how they work - no SP register AFAIK)
; * Possibility to declare some memory areas as read-only, data or program, etc.
; * ...
;
; This makes more than 140 instruction types (vs. 69 on TMS9900, and 84 on TMS99105).
; Wow, THIS is a CISC processor :-) .
;
;
;Data types :
;
; Single-precision & double-precision real.
;
; Guessed format :
; 1 bit : sign S
; 7 bits : exponent E (binary, bias >40, power of 16)
; 7/3 bytes : fractional part of mantissa M (binary) (integer part = 0)
; so the number is S * 16^(E - >40) * 0.M
;
; The only difference between single-precision and double-precision appears to be the size of
; mantissa (24 bits vs. 56 bits).
;
; Of course, IEEE double lacks 2 bits to be able to represent TI990/12 double.  Quite unpractical
; for those who want to emulate TI990/12 :-( .
;
;Instruction formats :
;
; "String" and "multiple arithmetic" instructions include a 4-bit immediate.
; It appears to be a byte count.
; They use a register, too.  I don't know what it is used for, exactly.  It is always set to >FFFF
; as input.  It is used once as output, and tells how many bytes CS found to be similar.  I guess
; it is incremented each time a byte is handled.  Since it is always set to >FFFF before each
; string instruction, maybe it changes the operation mode, or provides a byte count.
;
; There are only few instances of field instructions and stack instructions, so I cannot say anything
; for sure.  You can search for MVSK, IOF, XV if you like.
;







; ROM page 0.
; LOAD vector, programmer panel handling.

; error handler when the switch from ROM page 0 to page 1 fails (code at >FC40->FC42)
FC00: 02E0 0080           LWPI >0080
FC04: 0206 0200           LI   R6,>0200

; return point when the self test was unsuccessful
FC08: 020C 1FE0           LI   R12,>1FE0
FC0C: 1F0E                TB   >000E
FC0E: 1601                JNE  >FC12
FC10: 1D0A                SBO  >000A
FC12: 1D0B                SBO  >000B
FC14: 3206                LDCR R6,8             ; display progress code
FC16: 3220 008D           LDCR @>008D,8
FC1A: 10FF                JMP  >FC1A            ; stop

; return point when the self test was successful
FC1C: 1068                JMP  >FCEE


; entry point for self-test
FC1E: 0360                RSET                  ; reset peripherals
FC20: 020C 1FE0           LI   R12,>1FE0
FC24: 1D0B                SBO  >000B
FC26: 04C6                CLR  R6
FC28: 3206                LDCR R6,8             ; clear panel
FC2A: 3220 008D           LDCR @>008D,8
FC2E: 02E0 0080           LWPI >0080
FC32: 002D                EMD                   ; Execute Micro-Diagnostics : microcode test
FC34: 020C 1FB4           LI   R12,>1FB4        ; Page switch
FC38: 0204 0100           LI   R4,>0100
FC3C: 0205 FC00           LI   R5,>FC00
FC40: 30C4                LDCR R4,3             ; switch to page #1
FC42: 0455                B    *R5              ; jump to self test code at >FC00


; LOAD vector entry point
FC44: 020C 1FE0           LI   R12,>1FE0        ; programmer panel CRU base
FC48: 0221 6700           AI   R1,>6700         ; look for magical value (>9900)
FC4C: 1602                JNE  >FC52            ; continue with normal vector if not found
FC4E: 1D0A                SBO  >000A            ; switch "Run" light on
FC50: 0450                B    *R0              ; branch to routine if found

FC52: 0209 00A0           LI   R9,>00A0         ; R9 points to free area in RAM ?
FC56: 0700                SETO R0               ; R0 < 0 : use TILINE unit (tape, FD1000, hard disk) by default
FC58: 0201 F800           LI   R1,>F800         ; TILINE address for default disk unit
FC5C: 0202 0800           LI   R2,>0800         ; if programmer panel enabled, boot from drive unit 0 by default
FC60: 1F0B                TB   >000B
FC62: 13DD                JEQ  >FC1E            ; if programmer panel disabled, jump to self-test

FC64: C10E                MOV  R14,R4           ; load old PC to display it

; programmer panel scan : we have 4 rows of 8 switches
; 16 switches allow to toggle the display in R4.
; the 16 other switches allow to access programmer panel functions.
;
; register conventions here :
; R4 = data register
; R7 = memory address register
; R13 = WP
; R14 = PC
; R15 = ST

; keyscan loop start
FC66: 3204                LDCR R4,8             ; display data register MSB
FC68: 3220 0089           LDCR @>0089,8         ; display data register LSB

FC6C: 0205 FCD0           LI   R5,>FCD0
FC70: 0695                BL   *R5              ; read current 8 switches from programmer panel to R3 MSB
FC72: 16FE                JNE  >FC70            ; wait for all switches to be released
FC74: 0695                BL   *R5
FC76: 16FC                JNE  >FC70            ; test again to fix switch bounce problems
FC78: 0695                BL   *R5
FC7A: 16FA                JNE  >FC70            ; again
FC7C: 04C3                CLR  R3
FC7E: 1D08                SBO  >0008            ; "Increment scan" bit -> select another row of switches
FC80: 0695                BL   *R5
FC82: 13FD                JEQ  >FC7E            ; if no switch pressed, scan next row
FC84: 0695                BL   *R5
FC86: 13FB                JEQ  >FC7E            ; fixes switch bounce problems
FC88: 0695                BL   *R5
FC8A: 13F9                JEQ  >FC7E            ; again

FC8C: 1F09                TB   >0009            ; scan count bit 0 -> is current switch row number odd or even ?
FC8E: 1601                JNE  >FC92
FC90: 06C3                SWPB R3               ; if odd, we read last 8 switches in 16 switches, so we rotate 8 bits
FC92: 1F08                TB   >0008            ; scan count bit 1 -> is this command switches or data switches ?
FC94: 1302                JEQ  >FC9A            ; command switches -> jump to interpret command
FC96: 2903                XOR  R3,R4            ; data switches -> toggle the data on display as requested
FC98: 10E6                JMP  >FC66            ; update display and go back to scan routine

FC9A: 04C5                CLR  R5
FC9C: 05C5                INCT R5
FC9E: 0A13                SLA  R3,1
FCA0: 17FD                JNC  >FC9C            ; count first bit set to 1 in R3, i.e. first switch pressed
FCA2: 04A5 FCA6           X    @>FCA6(R5)       ; execute command as needed
FCA6: 10DF                JMP  >FC66            ; jump to display value if the X instruction did not jump

; Programmer panel instruction table.
; All jump offsets must be relative to FCA6 since this is the value of PC when the instruction
; is executed.
FCA8: 1013                JMP  *+>FCCC->FCA6    ; "Halt/SIE" switch
FCAA: 1011                JMP  *+>FCC8->FCA6    ; "Run" switch
FCAC: 0360                RSET                  ; "Reset" switch
FCAE: 10BC                JMP  *+>FC1E->FCA6    ; "Load" switch
FCB0: C10D                MOV  R13,R4           ; "Display WP" switch
FCB2: C10E                MOV  R14,R4           ; "Display PC" switch
FCB4: C10F                MOV  R15,R4           ; "Display ST" switch
FCB6: C107                MOV  R7,R4            ; "Display MA" switch
FCB8: C344                MOV  R4,R13           ; "Enter WP" switch
FCBA: C384                MOV  R4,R14           ; "Enter PC" switch
FCBC: C3C4                MOV  R4,R15           ; "Enter ST" switch
FCBE: C1C4                MOV  R4,R7            ; "Enter MA" switch
FCC0: C117                MOV  *R7,R4           ; "MDD" switch ("Memory Data Display")
FCC2: 05C7                INCT R7               ; "MAI" switch ("Memory Address Increment")
FCC4: C5C4                MOV  R4,*R7           ; "MDE" switch ("Memory Data Enter")
FCC6: 04C4                CLR  R4               ; "CLR" switch

; Code for run switch
FCC8: 1D0A                SBO  >000A            ; switch "Run" light on
FCCA: 0380                RTWP

; code for "Halt/SIE" switch
FCCC: 1D0E                SBO  >000E            ; set "Single Instruction Execute"
FCCE: 0380                RTWP                  ; Restart trap will occur after 2 instructions
; The second instruction executed will be an instruction from the program we interrupted.
; Pressing the HALT/SIE switch repetitively, you will trace the current program.


; this routine read a row of 8 switches from the programmer panel
FCD0: 1D0D                SBO  >000D            ; start panel timer
FCD2: 1F0A                TB   >000A            ; wait for timer active bit to be set
FCD4: 16FE                JNE  >FCD2
FCD6: 3603                STCR R3,8             ; retrieve value
FCD8: 045B                B    *R11


; Real boot routine, called after the CPU self-test
;
; We can load from several devices : MDU (Maintenance Diagnostics Unit, with a tape reader),
; ASR (a data terminal with optionnal tape reader), a single-sided disk (dumb controller on CRU bus),
; a tape unit with MT3200 controller, a double-sided floppy disk or a hard disk with WD900 controller
; (intelligent controllers on TI-LINE memory bus).
;
; tape units (MDU, ASR and MT3200) use some object code encoded with alphanumeric and hexadecimal
; characters.
; Single-sided floppy uses a simple boot routine to fetch a binary start-up program.
; The routine for double-sided floppies and hard-disk is somewhat more complex.


; offset table for jumps in object code interpreter, used on >FD6C (offsets relative to >FD6C)
FCDA: 302C 2A04           BYTE >FD9C->FD6C, >FD98->FD6C, >FD96->FD6C, >FD70->FD6C
FCDE: 0404 041A           BYTE >FD70->FD6C, >FD70->FD6C, >FD70->FD6C, >FD86->FD6C
FCE2: E60C 0A12           BYTE >FD52->FD6C, >FD78->FD6C, >FD76->FD6C, >FD7E->FD6C
FCE2: 1022 1E00           BYTE >FD7C->FD6C, >FD8E->FD6C, >FD8A->FD6C, >00
FCEA: 0404 30E6           BYTE >FD70->FD6C, >FD70->FD6C, >FD9C->FD6C, >FD52->FD6C


; actual boot routine
FCEE: 0360                RSET                  ; RESET external peripherals
FCF0: 0203 FEBE           LI   R3,>FEBE         ; address of the start-up routine we jump to - defaults to error routine
FCF4: 0205 F7FE           LI   R5,>F7FE         ; last word before system memory space
FCF8: C381                MOV  R1,R14           ; if programmer panel enabled, TILINE peripheral to boot from
FCFA: C3C2                MOV  R2,R15           ; if programmer panel enabled, unit to load from

; simple memory test >F7FE -> >0000
FCFC: C555                MOV  *R5,*R5          ; try to read and write current word
FCFE: 0645                DECT R5
FD00: 18FD                JOC  >FCFC            ; loop until we wrap around to >FFFE

; now real boot
FD02: 020C 1FE0           LI   R12,>1FE0
FD06: 1D0A                SBO  >000A            ; switch "Run" light on
FD08: 1F0E                TB   >000E            ; this bit must tell a MDU is present
FD0A: 1302                JEQ  >FD10            ; jump if not present
FD0C: 04C0                CLR  R0
FD0E: 101D                JMP  >FD4A            ; boot from the MDU ?

FD10: C000                MOV  R0,R0            ; read boot device type (defaults to -1)
FD12: 114E                JLT  >FDB0            ; boot from TILINE tape or disk device (FD1000, hard disk...)
FD14: 154C                JGT  >FDAE            ; boot from FD800 single-sided floppy disk
; if (R0 == 0), boot from ASR terminal
FD16: 04CC                CLR  R12              ; device address >000 : 733 ASR
FD18: 1D09                SBO  >0009            ; set-up device
FD1A: 1D0A                SBO  >000A
FD1C: 3220 FEB4           LDCR @>FEB4,8         ; effectively writes >11

; entry point to boot from TILINE tape unit (MT3200 controller or equivalent)
FD20: 04CD                CLR  R13
FD22: C000                MOV  R0,R0
FD24: 1312                JEQ  >FD4A            ; skip if booting from ASR
FD26: C183                MOV  R3,R6            ; save R3, R5
FD28: C285                MOV  R5,R10
FD2A: 04C0                CLR  R0               ; meaningless
FD2C: 04C1                CLR  R1               ; meaningless
FD2E: 04C2                CLR  R2               ; read offset = 0 (read record from the beginning)
FD30: 0203 0050           LI   R3,>0050         ; char count = >0050 (max record lenght = 80 chars)
                                                ; It seems we cannot have more than 80 bytes of code !
FD34: 04C4                CLR  R4               ; load at address 0
FD36: 0205 0400           LI   R5,>0400         ; >4 : read binary forward command
FD3A: E14F                SOC  R15,R5           ; set unit ID
FD3C: 06A0 FF7E           BL   @>FF7E           ; execute command on tape unit
FD40: D920 FE99 0050      MOVB @>FE99,@>0050(R4)    ; append carriage return after the data we read (@>FE99 = >0D)
FD46: C0C6                MOV  R6,R3            ; restore R3, R5
FD48: C14A                MOV  R10,R5

; entry point to boot from MDU
FD4A: 020B FEBC           LI   R11,>FEBC        ; pointer to read routine
FD4E: 04C7                CLR  R7               ; clear checksum
FD50: 058D                INC  R13

; object code interpreter
;
; ASR, MDU and MT3200 tapes use object code, as described in the Model 990 Computer Programming Card.
;
; We receive characters from the boot device.  These are interpreted as commands or as hexadecimal
; immediate operands.  Note that we actually only use hexadecimal characters, and 'G','H',':'.
;
; Commands with 16-bit immediate (encoded in hexadecimal) :
; * '1' : Absolute Entry Address : boot routine address = IMM
; * '2' : Relocatable Entry Address : boot routine address = offset + IMM
; * '7' : Checksum : stops the machine if (sum of all data received since start of record) + IMM != 0
; * '9' : Absolute Load Address : memory address pointer = IMM
; * 'A' : Relocatable Load Address : memory address pointer = offset + IMM
; * 'B' : Absolute Data : * (memory address pointer ++) = IMM
; * 'C' : Relocatable Data : * (memory address pointer ++) = offset + IMM
; * 'D' : Load Bias Or Offset : offset = IMM
; * 'E' : (no reference) : stop the machine
;
; Control commands (parameter-less) :
; * ':' : (no reference) : branch to boot routine address
; * 'F' : End Of Record : wait for next card to be inserted (does not really work)
;
; Unsupported commands with 16-bit immediate (encoded in hexadecimal) :
; * '8' : Ignore Checksum Value : does nothing
; * 'J' : (no reference)
; Unsupported commands with 16-bit immediate (encoded in hexadecimal) and 6-char symbol name :
; * '3', '4', '5', '6', 'G', 'H' (symbol-related commands)
; Unsupported commands with 16-bit immediate (encoded in hexadecimal) and 8-char program name :
; * '0' : Program Start
; * 'I' : (no reference)
;
FD52: 069B                BL   *R11             ; read command number in R10 from tape (range 0-19)
FD54: D0AA FCDA           MOVB @>FCDA(R10),R2   ; read offset to routine in table
FD58: 1327                JEQ  >FDA8            ; handle 'F' command separately because it is parameter-less
FD5A: 0882                SRA  R2,8             ; convert to signed 16-bit offset
FD5C: C207                MOV  R7,R8            ; save checksum
FD5E: 0201 0004           LI   R1,>0004         ; 4*4 = 16 bits to read
FD62: 069B                BL   *R11             ; read hex digit (4 bits)
FD64: 0A46                SLA  R6,4             ; shift digits we have already read
FD66: A18A                A    R10,R6           ; and insert new digit in R6
FD68: 0601                DEC  R1
FD6A: 16FB                JNE  >FD62            ; loop until we have read a 16-bit hex value
FD6C: 0462 FD6C           B    @>FD6C(R2)       ; jump to routine

; entry point for '3', '4', '5', '6','G','H'
; read 6 additional characters and ignore them
FD70: 0201 0006           LI   R1,>0006         ; read 6 chars
FD74: 1015                JMP  >FDA0

; entry point for 'A'
; add offset to R6, set address pointer
FD76: A189                A    R9,R6            ; add offset to R6 (R9 set by 'D' command, defaults to >00A0)
; entry point for '9'
; set address pointer
FD78: C146                MOV  R6,R5
FD7A: 10EB                JMP  >FD52            ; next command

; entry point for 'C'
; add offset to R6, write two bytes
FD7C: A189                A    R9,R6
; entry point for 'B'
; write two bytes
FD7E: DD46                MOVB R6,*R5+
FD80: 06C6                SWPB R6
FD82: DD46                MOVB R6,*R5+
FD84: 10E6                JMP  >FD52

; entry point for '7'
; check checksum
FD86: A206                A    R6,R8
FD88: 13E4                JEQ  >FD52            ; continue on if value matches checksum
; entry point for 'E'
; boot failure
FD8A: 046B 0002           B    @>0002(R11)      ; jump to >FEBE (stop machine and blink fail LED)

; entry point for 'D'
; set bias/offset
FD8E: C246                MOV  R6,R9            ; set bias/offset value
FD90: 0249 FFFE           ANDI R9,>FFFE         ; convert to word address
FD94: 10DE                JMP  >FD52

; entry point for '2'
; add offset to R6, set boot routine address
FD96: A189                A    R9,R6
; entry point for '1'
; set boot routine address
FD98: C0C6                MOV  R6,R3            ; set boot routine address
FD9A: 10DB                JMP  >FD52

; entry point for '0','I'
; read 8 additionnal characters and ignore them
FD9C: 0201 0008           LI   R1,>0008         ; read 8 chars
FDA0: 069B                BL   *R11
FDA2: 0601                DEC  R1
FDA4: 16FD                JNE  >FDA0
FDA6: 10D5                JMP  >FD52

; entry point for 'F' command (parameter-less)
; wait for next record
FDA8: 069B                BL   *R11
FDAA: 16FE                JNE  >FDA8            ; wait for next record
FDAC: 10BA                JMP  >FD22


; branch point to routine at >FE18
FDAE: 1034                JMP  >FE18


; Boot from a tape/disk unit using MD900/MT3200 controller or equivalent on the TILINE bus
;
; When programmer panel is available, the routine expect the unit mask to be in R15.
;
; When programmer panel is unavailable, the routine scans tape units 0-3, then disk units 0-3.
; It generally boots on the first unit which is ready ; however, when possible, it does not boot from
; a writable disk.  The resulting priority order is : tape #0, ..., tape #3,
; disk #0 (write-protected), ..., disk #3 (write-protected),
; disk #0 (writable), ..., disk #3 (writable).  When no unit is ready, it keeps scanning
; all units continuously, so that the user can insert a boot disk/tape after start-up.
;
; R1 = >F800 (?)
; R2 = >0800 (?)

FDB0: 04CD                CLR  R13
FDB2: 1F0B                TB   >000B            ; programmer panel...
FDB4: 1306                JEQ  >FDC2            ; if disabled, try each unit until we find a bootable one

FDB6: C10F                MOV  R15,R4           ; current unit mask : 1 (and only 1) bit must be set
FDB8: 0A44                SLA  R4,4
FDBA: 13B2                JEQ  >FD20            ; routine for tape unit
FDBC: 102C                JMP  >FE16            ; routine for disk unit


; we end here when no tape or writable disk could be found.
; R13 may contain the ID of some write-protected disk.
FDBE: C3CD                MOV  R13,R15          ; restore unit ID from R13
FDC0: 162A                JNE  >FE16            ; jump to boot routine if non-zero
                                                ; else, we start over, until someone insert a disk/tape

; Find a bootable tape/disk on the TILINE bus
FDC2: 020C 1FC0           LI   R12,>1FC0        ; Error interrupt register CRU base
FDC6: 020F 0001           LI   R15,>0001
FDCA: 020E F880           LI   R14,>F880        ; TILINE base address for MT3200 tape controller

FDCE: 1E0F                SBZ  >000F            ; clear TIMEOUT (i.e. unimplemented memory)
FDD0: 0B1F                SRC  R15,1            ; try next unit (try >8000 first, then >4000, etc)
FDD2: 808F                C    R15,R2           ; compare with >0800 (support for up to 4 tape units)
FDD4: 1B03                JH   >FDDC            ; jump if greater than >0800

FDD6: C381                MOV  R1,R14           ; else use WD900 disk unit at base address >F800
FDD8: D3CF                MOVB R15,R15          ; if R15 MSByte is NULL, we are done
FDDA: 13F1                JEQ  >FDBE            ; jump to boot from writable disk, or retry

FDDC: C21E                MOV  *R14,R8          ; load disc status
FDDE: 1F0F                TB   >000F            ; test RAM TIMEOUT
FDE0: 13F6                JEQ  >FDCE            ; try next unit if no controller found on bus

FDE2: C22E 000E           MOV  @>000E(R14),R8   ; load controller status
FDE6: 1101                JLT  >FDEA            ; wait for IDLE status bit to be cleared
FDE8: 10FC                JMP  >FDE2

FDEA: 04DE                CLR  *R14             ; clear disc status
FDEC: CB8F 000C           MOV  R15,@>000C(R14)  ; select unit
FDF0: 808F                C    R15,R2
FDF2: 1204                JLE  >FDFC            ; skip 2 instructions if using disk unit
FDF4: EB82 000C           SOC  R2,@>000C(R14)   ; bits 4-7 = >8 : read transport status command
FDF8: 04EE 000E           CLR  @>000E(R14)      ; clear controller status

FDFC: 0206 5E00           LI   R6,>5E00
FE00: 0606                DEC  R6
FE02: 16FE                JNE  >FE00            ; wait for about 10 or 20ms

FE04: C21E                MOV  *R14,R8          ; read disk or tape transport status
FE06: 11E3                JLT  >FDCE            ; try next unit if off-line status bit set (no unit or no tape/disk)
FE08: 808F                C    R15,R2
FE0A: 1B8A                JH   >FD20            ; if this is a tape unit, jump to object code interpreter
FE0C: C34D                MOV  R13,R13
FE0E: 1601                JNE  >FE12
FE10: C34F                MOV  R15,R13          ; save R15 in R13 if it is the first bootable unit found
FE12: 0A38                SLA  R8,3
FE14: 17DC                JNC  >FDCE            ; try next unit if the disk is not write-protected (?)
FE16: 1061                JMP  >FEDA            ; jump to disk boot routine if the disk is write-protected (?)


; Complete boot routine to boot from a single-sided diskette
; Boots from FD800 unit at CRU address >80->A0 (i.e. >40->50)
FE18: 020C 00A0           LI   R12,>00A0        ; CRU base address for command register ?
FE1C: 0702                SETO R2               ; R2 = >FFFF
FE1E: 04C3                CLR  R3
FE20: 3408                STCR R8,16            ; read 16 bits
FE22: 1502                JGT  >FE28
FE24: 0A68                SLA  R8,6             ; if negative, test CRU bit >A5
FE26: 1814                JOC  >FE50            ; if bit set, start over

FE28: 1F0A                TB   >000A
FE2A: 13FE                JEQ  >FE28            ; wait for something
FE2C: 3002                LDCR R2,16            ; write all 1s
FE2E: 0208 E000           LI   R8,>E000
FE32: E203                SOC  R3,R8
FE34: 1F0A                TB   >000A
FE36: 13FE                JEQ  >FE34            ; wait again
FE38: 3008                LDCR R8,16            ; write track number ???
FE3A: 1F0F                TB   >000F
FE3C: 16FE                JNE  >FE3A
FE3E: 3408                STCR R8,16            ; read 16 bits
FE40: 0248 1BFC           ANDI R8,>1BFC
FE44: 1306                JEQ  >FE52            ; start boot
FE46: 0223 0400           AI   R3,>0400
FE4A: 0283 1000           CI   R3,>1000
FE4E: 1AEE                JL   >FE2C
FE50: 10E3                JMP  >FE18            ; start over


FE52: 020C 0080           LI   R12,>0080        ; CRU base address for data register ?
FE56: C289                MOV  R9,R10           ; R9 points to free area in RAM ?

FE58: 0201 0080           LI   R1,>0080         ; 256 bytes (= 128 words) in a data cluster ?

FE5C: 1F11                TB   >0011            ; data present bit (?)
FE5E: 1306                JEQ  >FE6C
FE60: 1F1A                TB   >001A            ; device error bit (?)
FE62: 13FC                JEQ  >FE5C
FE64: 020C 00A0           LI   R12,>00A0
FE68: 3403                STCR R3,16
FE6A: 102A                JMP  >FEC0            ; stop the machine in error

FE6C: 343A                STCR *R10+,16         ; read 16 bits
FE6E: 1E0F                SBZ  >000F
FE70: 0641                DECT R1
FE72: 15F4                JGT  >FE5C            ; loop until read 256 bytes

FE74: 064A                DECT R10              ; point to last word
FE76: 809A                C    *R10,R2          ; compare last word with >FFFF mark
FE78: 16EF                JNE  >FE58            ; if different, keep 254 previous bytes and append another sector (?)

FE7A: 0360                RSET                  ; else, jump to boot routine
FE7C: 0200 FEC8           LI   R0,>FEC8
FE80: CE43                MOV  R3,*R9+          ; write device number
FE82: 0459                B    *R9              ; execute boot routine at offset 2


; read routine
; Read ASCII character from 733 ASR located at >000, a MDU unit located at >FF0, or a MT3200 tape unit
; on TILINE bus, and translate it to one hexadecimal number.
FE84: C000                MOV  R0,R0            ; test device type flag
FE86: 1105                JLT  >FE92            ; jump if MT3200

FE88: 1F0C                TB   >000C
FE8A: 16FE                JNE  >FE88            ; wait...

FE8C: 1E0C                SBZ  >000C
FE8E: 35CA                STCR R10,7            ; read 7 bits
FE90: 1001                JMP  >FE94


FE92: D2B4                MOVB *R4+,R10         ; read byte from memory (MT3200 is DMA driven)

FE94: 098A                SRL  R10,8            ; move MSB to LSB
FE96: 028A 000D           CI   R10,>000D        ; carriage return ? (appended at end of MT3200 record)
FE9A: 130F                JEQ  >FEBA            ; if so return
FE9C: 028A 005A           CI   R10,>005A        ; greater than 'Z' ?
FEA0: 15F1                JGT  >FE84            ; if so, ignore current char and read next char
FEA2: 028A 0020           CI   R10,>0020        ; control character (lower than ' ') ?
FEA6: 11EE                JLT  >FE84            ; if so, ignore current char and read next char
FEA8: A1CA                A    R10,R7           ; update checksum
FEAA: 022A FFD0           AI   R10,>FFD0        ; substract >30 (numeric character -> numeric value)
FEAE: 028A 000A           CI   R10,>000A
FEB2: 1307                JEQ  >FEC2            ; jump to handler if it is ':'
FEB4: 1102                JLT  >FEBA            ; if greater, it must be 'A'-'F'
FEB6: 022A FFF9           AI   R10,>FFF9        ; convert to hex value
FEBA: 069B                BL   *R11             ; trick : return to the caller AND restore R11 to be >FEBC

; read routine entry point
FEBC: 10E3                JMP  >FE84

; entry point for bad ':' (called when no '1' command has been executed before ':')
FEBE: C0CD                MOV  R13,R3
FEC0: 1057                JMP  >FF70

; handler for ':' command
FEC2: C000                MOV  R0,R0            ; test boot device type flag
FEC4: 1608                JNE  >FED6

FEC6: 1E0B                SBZ  >000B            ; clean-up ?
FEC8: 1E0C                SBZ  >000C
FECA: 0581                INC  R1
FECC: 16FE                JNE  >FECA
FECE: 1F0C                TB   >000C
FED0: 13F8                JEQ  >FEC2
FED2: 1E09                SBZ  >0009
FED4: 1E0D                SBZ  >000D

FED6: 0360                RSET                  ; reset all peripherals
FED8: 0453                B    *R3              ; jump to boot routine


; boot from a disk unit attached to a WD900 disk controller (or equivalent) whose address is in R14
FEDA: C14F                MOV  R15,R5           ; unit ID
FEDC: 020C FF7E           LI   R12,>FF7E
FEE0: 020D 0005           LI   R13,>0005        ; retry count ?

FEE4: 0200 0700           LI   R0,>0700         ; restore command
FEE8: 04C1                CLR  R1
FEEA: 069C                BL   *R12

FEEC: 04C0                CLR  R0               ; store register command
FEEE: 0203 0006           LI   R3,>0006         ; command returns 6 bytes
FEF2: 0204 0200           LI   R4,>0200         ; free area in RAM
FEF6: 069C                BL   *R12
FEF8: C2A4 0004           MOV  @>0004(R4),R10
FEFC: 09BA                SRL  R10,11           ; keep number of track per cylinder (i.e. number of heads)

FEFE: 0200 0400           LI   R0,>0400         ; read unformatted
FF02: 04C2                CLR  R2               ; cylinder 0
FF04: 069C                BL   *R12             ; read track/cylinder address, # of sectors per record, and sector lenght

FF06: C004                MOV  R4,R0            ; >0200 : read data (?)
FF08: D064 0002           MOVB @>0002(R4),R1    ; set the "sectors per records" field
FF0C: C0E4 0004           MOV  @>0004(R4),R3    ; count = sector lenght
FF10: 0A13                SLA  R3,1             ; word count -> byte count
FF12: 069C                BL   *R12             ; read record #0
FF14: C3E4 000E           MOV  @>000E(R4),R15   ; alternate boot program track address
FF18: 890F 0024           C    R15,@>0024(R4)   ; compare with normal program track address
FF1C: 130C                JEQ  >FF36

FF1E: C924 0024 000E      MOV  @>0024(R4),@>000E(R4)    ; replace alternate boot program, with normal one
                                                ; so alternate program will be loaded only once
FF24: 0200 0300           LI   R0,>0300         ; write data
FF28: 069C                BL   *R12             ; write record #0
FF2A: C924 001C 0018      MOV  @>001C(R4),@>0018(R4)    ; use alternate load point
FF30: C924 001E 001A      MOV  @>001E(R4),@>001A(R4)    ; and alternate length

FF36: 0200 0400           LI   R0,>0400         ; read unformatted
FF3A: 0203 0006           LI   R3,>0006         ; command returns 6 bytes
FF3E: 06A0 FF72           BL   @>FF72           ; compute cylinder/head address from track address in R15
FF42: 069C                BL   *R12

FF44: C064 0002           MOV  @>0002(R4),R1    ; set format & sector according to value read from controller
FF48: C004                MOV  R4,R0            ; >0200 : read data
FF4A: 06A0 FF72           BL   @>FF72
FF4E: C3E4 0018           MOV  @>0018(R4),R15   ; program load point
FF52: C0E4 001A           MOV  @>001A(R4),R3    ; program length
FF56: 130A                JEQ  >FF6C            ; fail if null
FF58: 0204 00A0           LI   R4,>00A0         ; free area in RAM ?
FF5C: 069C                BL   *R12             ; read boot program

FF5E: 0200 ABC0           LI   R0,>ABC0         ; magical value ?
FF62: C04E                MOV  R14,R1           ; boot device address
FF64: 04C2                CLR  R2
FF66: D085                MOVB R5,R2            ; unit ID
FF68: 0360                RSET                  ; Reset for things to be cleaner
FF6A: 045F                B    *R15             ; jump to boot program

; exit point when boot program lenght is NULL
FF6C: 0203 D001           LI   R3,>D001         ; load error code

FF70: 102E                JMP  >FFCE            ; stop machine and blink the Fail LED

; compute cylinder & head address from "flat" track address
; input :
; R10 = number of heads
; R15 = track address
; returns :
; R2 = cylinder address
; R0 |= head address
FF72: C24F                MOV  R15,R9
FF74: 04C8                CLR  R8
FF76: 3E0A                DIV  R10,R8           ; compute R15/R10
FF78: C088                MOV  R8,R2            ; R2 = quotient : cylinder address
FF7A: E009                SOC  R9,R0            ; R0 MSB = remainder : head address
FF7C: 045B                B    *R11


; execute some command on a WD900/WT3200 controller
; R0 -> W1 : command and surface register (WD900)
; R1 -> W2 : format and sector (MSByte : sectors per record ; LSByte : sector number) (WD900)
; R2 -> W3 : cylinder address (cylinder number) (WD900) / read offset (WT3200)
; R3 -> W4 : count (length to read/write)
; R4 -> W5 : address (destination/source address to read/write from, 16 LSBits)
; R5 -> W6 : WD900 : select and address (unit selection, 1 bit per unit, in LOW nibble of MSByte, and
;           4 MSBits of address in low nibble of LSByte) 
;            WT3200 : command and transport select (unit selection, 1 bit per unit, in HIGH nibble
;           of MSByte, command in high nibble of LSByte, and 4 MSBits of address in low nibble of
;           LSByte)
;
; R14 = controller address
;
; cf 990 Handbook, 5-23, page 188, and WD900/MT3200 general description, chapter 3
;
FF7E: C1CE                MOV  R14,R7           ; TILINE device address
FF80: C227 000E           MOV  @>000E(R7),R8
FF84: 1101                JLT  >FF88
FF86: 10FB                JMP  >FF7E            ; wait for IDLE status bit to be cleared

; write device registers
FF88: 04F7                CLR  *R7+             ; disc status
FF8A: CDC0                MOV  R0,*R7+
FF8C: CDC1                MOV  R1,*R7+
FF8E: CDC2                MOV  R2,*R7+
FF90: CDC3                MOV  R3,*R7+
FF92: CDC4                MOV  R4,*R7+
FF94: CDC5                MOV  R5,*R7+
FF96: 04D7                CLR  *R7              ; controller status

FF98: C217                MOV  *R7,R8
FF9A: 1101                JLT  >FF9E
FF9C: 10FD                JMP  >FF98            ; wait for IDLE controller status bit to be cleared

FF9E: C1C5                MOV  R5,R7
FFA0: 09C7                SRL  R7,12            ; 4 MSBits select unit on WT3200, and are unused on WD900
FFA2: 1603                JNE  >FFAA            ; skip if we are using a tape unit

FFA4: C1DE                MOV  *R14,R7          ; disk status
FFA6: 0A27                SLA  R7,2
FFA8: 18FD                JOC  >FFA4            ; wait for NR (Not Ready) status bit to be cleared

FFAA: 0248 01FF           ANDI R8,>01FF         ; test all individual error bits
FFAE: 1602                JNE  >FFB4            ; jump on error

FFB0: 0700                SETO R0
FFB2: 045B                B    *R11             ; normal return

; error handler :
FFB4: C1DE                MOV  *R14,R7          ; read disk status
FFB6: 11E3                JLT  >FF7E            ; wait for OL (off-line) status bit to be set
FFB8: C1C5                MOV  R5,R7
FFBA: 09C7                SRL  R7,12
FFBC: 1602                JNE  >FFC2            ; skip if we are using a tape unit

FFBE: 060D                DEC  R13
FFC0: 1691                JNE  >FEE4            ; do a few retries before fail ?

FFC2: 0288 0001           CI   R8,>0001         ; check unit error / tape error in controller status
FFC6: 1602                JNE  >FFCC            ; means an error condition is set in disk status / tape transport status
FFC8: 04C8                CLR  R8
FFCA: D21E                MOVB *R14,R8          ; read error code in disk status / tape transport status register

FFCC: C0C8                MOV  R8,R3


; error stop
; we jump to this routine when boot fails
; display R3 for diagnostics purpose, and blink the fail LED.
FFCE: 020C 1FE0           LI   R12,>1FE0
FFD2: 3203                LDCR R3,8
FFD4: 3220 0087           LDCR @>0087,8
FFD8: 1D0B                SBO  >000B
FFDA: 05C1                INCT R1
FFDC: 15FD                JGT  >FFD8
FFDE: 1E0B                SBZ  >000B
FFE0: 10FC                JMP  >FFDA


; spare room
FFE2: 0000                DATA >0000
FFE4: 0000                DATA >0000
FFE6: 0000                DATA >0000
FFE8: 0000                DATA >0000
FFEA: 0000                DATA >0000
FFEC: 0000                DATA >0000
FFEE: 0000                DATA >0000
FFF0: 0000                DATA >0000
FFF2: 0000                DATA >0000
FFF4: 0000                DATA >0000


; pointers to routines
FFF6: FCF4                DATA >FCF4            ; boot loader
FFF8: FCEE                DATA >FCEE            ; ditto
FFFA: FD4A                DATA >FD4A            ; boot loader for MDU (?)

; LOAD vector
FFFC: 0080 FC44           DATA >0080,>FC44










; ROM page 1.

FC00: 020C FE68           LI   R12,>FE68
FC04: 00AC                LCS  R12              ; Load writable Control Store
                                                ; loads microcode to define some XOPs.
FC06: 020C 1FE0           LI   R12,>1FE0
FC0A: 0206 0100           LI   R6,>0100         ; display progress code on programmer panel
FC0E: 3206                LDCR R6,8
FC10: 3220 008D           LDCR @>008D,8

FC14: 0206 0400           LI   R6,>0400
FC18: 0286 0400           CI   R6,>0400
FC1C: 1638                JNE  >FC8E            ; exit on error
FC1E: 0546                INV  R6
FC20: 0286 0400           CI   R6,>0400
FC24: 1334                JEQ  >FC8E            ; exit on error
FC26: 0546                INV  R6
FC28: 02E0 0100           LWPI >0100
FC2C: 02C3                STST R3
FC2E: 0420 FC36           BLWP @>FC36           ; jump

FC32: 0460 FFE0           B    @>FFE0           ; error exit : we should not reach this line

; BLWP vector
FC36: 0120 FC3A           DATA >0120,FC3A

; BLWP routine entry point
FC3A: 02C5                STST R5               ; copy current ST
FC3C: 83C5                C    R5,R15           ; saved ST
FC3E: 1627                JNE  >FC8E            ; should equate
FC40: 028D 0100           CI   R13,>0100        ; old WP
FC44: 1624                JNE  >FC8E
FC46: 028E FC32           CI   R14,>FC32        ; old PC
FC4A: 1621                JNE  >FC8E
FC4C: 020E FC56           LI   R14,>FC56        ; set return PC to >FC56
FC50: 0380                RTWP                  ; return

FC52: 0460 FFE0           B    @>FFE0           ; error exit : we should not reach this line

FC56: 02C4                STST R4               ; restored ST
FC58: 8804 0106           C    R4,@>0106        ; should equate ST before call
FC5C: 1618                JNE  >FC8E

FC5E: 0208 4BF2           LI   R8,>4BF2
FC62: 3A20 FEBA           MPY  @>FEBA,R8        ; times >E819
FC66: 0288 44DA           CI   R8,>44DA         ; test MSWord
FC6A: 1611                JNE  >FC8E
FC6C: 0289 BAA2           CI   R9,>BAA2         ; test LSWord
FC70: 160E                JNE  >FC8E

FC72: 0202 0064           LI   R2,>0064
FC76: 0206 05F5           LI   R6,>05F5
FC7A: 0207 E0FF           LI   R7,>E0FF
FC7E: 3DA2 FE58           DIV  @>FE58(R2),R6    ; divide R6:R7 by @>FEBC = >15CB
FC82: 0286 4604           CI   R6,>4604         ; test quotient
FC86: 1603                JNE  >FC8E
FC88: 0287 07D3           CI   R7,>07D3         ; test remainder
FC8C: 1302                JEQ  >FC92            ; jump if OK

; error exit point
FC8E: 0460 FFE0           B    @>FFE0

FC92: 020A FCDC           LI   R10,>FCDC
FC96: C1A0 FEBE           MOV  @>FEBE,R6        ; -> R6 = >FFFF
FC9A: 04C7                CLR  R7
FC9C: 049A                X    *R10             ; executes a MOVB R6,R7
FC9E: 0287 FF00           CI   R7,>FF00
FCA2: 166A                JNE  >FD78
FCA4: C2A0 FCD6           MOV  @>FCD6,R10       ; >0A59 : SLA R9,5
FCA8: C260 FEBA           MOV  @>FEBA,R9        ; -> R9 = >E819
FCAC: 048A                X    R10              ; executes a SLA R9,5
FCAE: 0289 0320           CI   R9,>0320
FCB2: 1662                JNE  >FD78
FCB4: C220 FEBA           MOV  @>FEBA,R8        ; -> R8 = >E819
FCB8: 04A0 FCD8           X    @>FCD8           ; executes a SRC R8,3
FCBC: 0288 3D03           CI   R8,>3D03
FCC0: 165B                JNE  >FD78
FCC2: 0205 0032           LI   R5,>0032
FCC6: C120 FEBA           MOV  @>FEBA,R4        ; -> R4 = >E819
FCCA: 04A5 FCA8           X    @>FCA8(R5)       ; executes "INV  R4" at @>FCDA
FCCE: 0284 17E6           CI   R4,>17E6
FCD2: 1652                JNE  >FD78
FCD4: 1004                JMP  >FCDE

; instruction table
FCD6: 0A59                SLA  R9,5
FCD8: 0B38                SRC  R8,3
FCDA: 0544                INV  R4
FCDC: D1C6                MOVB R6,R7

; test, next part
FCDE: 0205 0135           LI   R5,>0135
FCE2: C560 FEB8           MOV  @>FEB8,*R5       ; moves >1234 at address @>0134 (address LSBit ignored)
FCE6: 0206 0015           LI   R6,>0015
FCEA: 0203 FEAA           LI   R3,>FEAA         ; empty (i.e. all-0s) map file
FCEE: 0323                LMF  R3,0             ; load as memory map
FCF0: 020C 1FA0           LI   R12,>1FA0
FCF4: 1D03                SBO  >0003            ; change RAM set-up ?
FCF6: 07A0 FEA6           LDS  @>FEA6           ; this temporary memory map -> >120 offset on next source address
FCFA: C816 017E           MOV  *R6,@>017E       ; i.e. we actually read @>0009A * 2 = @>000134
FCFE: 8820 017E FEB8      C    @>017E,@>FEB8
FD04: 16C4                JNE  >FC8E
FD06: 07E0 FEA6           LDD  @>FEA6           ; same story with destination
FD0A: C5A0 FEBA           MOV  @>FEBA,*R6
FD0E: 8560 FEBA           C    @>FEBA,*R5
FD12: 16BD                JNE  >FC8E
FD14: C820 FEBE 017A      MOV  @>FEBE,@>017A    ; @>017A = >FFFF
FD1A: 0706                SETO R6
FD1C: 0066 5820 FEB8 0176 MOVS R6,@>FEB8,@>0176,5   ; move 5 bytes
FD24: 0706                SETO R6
FD26: 0046 5820 FEB8 0176 CS   R6,@>FEB8,@>0176,5
FD2E: 1624                JNE  >FD78
FD30: 9820 017B FEBE      CB   @>017B,@>FEBE    ; check we did not write an extra byte
FD36: 1620                JNE  >FD78

FD38: 04C0                CLR  R0
FD3A: C820 FEB8 0176      MOV  @>FEB8,@>0176
FD40: 0E00 0020 0176      IOF  R0,@>0176 (?)    ; Invert Order of Field
FD46: 8820 0176 FEB6      C    @>0176,@>FEB6
FD4C: 1615                JNE  >FD78
FD4E: 8820 FEB8 FEB8      C    @>FEB8,@>FEB8    ; should set Equal bit
FD54: 02C3                STST R3
FD56: 0202 2000           LI   R2,>2000
FD5A: 20C2                COC  R2,R3            ; (R2 & R3) == R2 ?
FD5C: 160D                JNE  >FD78
FD5E: 0202 C000           LI   R2,>C000
FD62: 24C2                CZC  R2,R3            ; (R2 & ~R3) == R2 ?
FD64: 1609                JNE  >FD78
FD66: 8820 FEBE FEAA      C    @>FEBE,@>FEAA
FD6C: 02C7                STST R7
FD6E: 0247 E000           ANDI R7,>E000
FD72: 0287 8000           CI   R7,>8000         ; H == 1, G & E == 0
FD76: 1302                JEQ  >FD7C            ; jump if OK

; error exit point
FD78: 0460 FFE0           B    @>FFE0

FD7C: 0023 2820 FE92 0176 BDC  @>FE92,@>0176,2  ; Binary to Decimal ascii conversion
FD84: 8820 0176 FE94      C    @>0176,@>FE94    ; test first 2 chars
FD8A: 16F6                JNE  >FD78
FD8C: 8820 0178 FE96      C    @>0178,@>FE96    ; test last 2 chars
FD92: 16F2                JNE  >FD78
FD94: 0706                SETO R6
FD96: 0046 4820 0176 FE94 CS   R6,@>0176,@>FE94,4   ; compare string
FD9E: 16EC                JNE  >FD78
FDA0: 05A0 0178           INC  @>0178           ; alter last char
FDA4: 0706                SETO R6
FDA6: 0046 4820 0176 FE94 CS   R6,@>0176,@>FE94,4   ; compare string
FDAE: 13E4                JEQ  >FD78            ; should be different
FDB0: 0286 0003           CI   R6,>0003         ; first different char is third char (?)
FDB4: 16E1                JNE  >FD78
FDB6: 0024 2820 FE94 0176 DBC  @>FE94,@>0176,2  ; Decimal ascii to Binary conversion
FDBE: 8820 FE92 0176      C    @>FE92,@>0176
FDC4: 16D9                JNE  >FD78
FDC6: 0CA0 FE98           CIR  @>FE98           ; Convert Integer to Real
FDCA: 0706                SETO R6
FDCC: 0046 4800 FE9E      CS   R6,R0,@>FE9E,4
FDD2: 16D2                JNE  >FD78
FDD4: 0CE0 FE9A           SR   @>FE9A
FDD8: 0C00                CRI
FDDA: 0280 0BB8           CI   R0,>0BB8
FDDE: 16CC                JNE  >FD78
FDE0: 0C2A 30A0 FEBA      XV   10,@>FEBA,R2,3   ; extract 10 bits from bit 3 in @>FEBA, store result in R2 (?)
FDE6: 0282 0103           CI   R2,>0103
FDEA: 16C6                JNE  >FD78
FDEC: C820 FEBA 0176      MOV  @>FEBA,@>0176
FDF2: C820 FEBC 0178      MOV  @>FEBC,@>0178    ; load >E81915CB
FDF8: 001C 3160 0176      SRAM @>0176,5,3       ; shift 3 bytes at @>0176 with 5 bits
FDFE: 17BC                JNC  >FD78
FE00: 0706                SETO R6
FE02: 0046 4820 FEA2 0176 CS   R6,@>FEA2,@>0176,4   ; >FF40C8CB
FE0A: 16B6                JNE  >FD78
FE0C: 0205 C7CB           LI   R5,>C7CB
FE10: 9805 FEA4           CB   R5,@>FEA4
FE14: 13B1                JEQ  >FD78
FE16: 0207 C8AB           LI   R7,>C8AB
FE1A: 9807 FEA4           CB   R7,@>FEA4
FE1E: 16AC                JNE  >FD78
FE20: 02A5                STWP R5
FE22: 0285 0100           CI   R5,>0100
FE26: 16A8                JNE  >FD78
FE28: C0E0 FEBC           MOV  @>FEBC,R3        ; >15CB
FE2C: 0200 AC0F           LI   R0,>AC0F         ; - >53F1
FE30: 01C3                MPYS R3
FE32: 0706                SETO R6
FE34: 0046 4800 FE6E      CS   R6,R0,@>FE6E,4   ; >F8DAAAE5 = - >0725551B
FE3A: 169E                JNE  >FD78
FE3C: 0709                SETO R9
FE3E: 0069 8020 FE72      MOVS R9,@>FE72,R0,8   ; >4226000000000000
FE44: 0F60 FE82           DD   @>FE82           ; Divide Double-precision >C234000000000000
FE48: 0706                SETO R6
FE4A: 0046 8800 FE7A      CS   R6,R0,@>FE7A,8   ; >C0BB13B13B13B13B
FE50: 1693                JNE  >FD78
FE52: 0706                SETO R6
FE54: 0066 8020 FE8E      MOVS R6,@>FE8E,R0,8
FE5A: 0C05                CDE                   ; convert double to extended (i.e. 32-bit) int
FE5C: 070A                SETO R10
FE5E: 004A 4800 FE8A      CS   R10,R0,@>FE8A,4  ; >FFA63E0D
FE64: 1689                JNE  >FD78
FE66: 102C                JMP  >FEC0

; various tables
; table used by LCS.  Too short to be complete microcoded instructions I guess, so these must be
; pointers.
FE68: 0020                DATA >0020
FE6A: 0BE0                DATA >0BE0
FE6C: 0100                DATA >0100

FE6E: F8DA AAE5           DATA >F8DA,>AAE5      ; signed 4-byte int
; 64-bit floats
FE72: 4226 0000 0000 0000 DATA >4226,>0000,>0000,>0000
FE7A: C0BB 13B1 3B13 B13B DATA >C0BB,>13B1,>3B13,>B13B
FE82: C234 0000 0000 0000 DATA >C234,>0000,>0000,>0000
FE8A: FFA6 3E0D           DATA >FFA6,>3E0D
FE8E: C659                DATA >C659
FE90: C1F3                DATA >C1F3
FE92: 03CF                DATA >03CF            ; 975
FE94: 3937 352B           BYTE '9','7','5','+'
FE98: 2710                DATA >2710
FE9A: 441B                DATA >441B
FE9C: 5800                DATA >5800
FE9E: 4427 1000           DATA >4427,>1000      ; single-precision real
FEA2: FF40 C8CB           DATA >FF40,>C8CB

; simple memory map : adds a 9*32 = >120 offset to every address
FEA6: 0000                DATA >0000
FEA8: 0009                DATA >0009

; empty memory map
FEAA: 0000                DATA >0000
FEAC: 0000                DATA >0000
FEAE: 0000                DATA >0000
FEB0: 0000                DATA >0000
FEB2: 0000                DATA >0000
FEB4: 0000                DATA >0000

FEB6: 2C48                DATA >2C48            ; >1234 reversed

FEB8: 1234                DATA >1234
FEBA: E819                DATA >E819
FEBC: 15CB                DATA >15CB
FEBE: FFFF                DATA >FFFF

FEC0: 001D 2060 008C      SLAM @>008C,1,2       ; update progress code in R6, Workspace >0080

FEC6: 0700                SETO R0
FEC8: 0202 FEFF           LI   R2,>FEFF
FECC: 0204 EFFF           LI   R4,>EFFF
FED0: 04C6                CLR  R6
FED2: 04C7                CLR  R7
FED4: 04C8                CLR  R8
FED6: 04C9                CLR  R9
FED8: 04CA                CLR  R10
FEDA: 02CC                STST R12
FEDC: 026C 0010           ORI  R12,>0010        ; enable writable control store to use custom XOP
FEE0: 008C                LST  R12
FEE2: 020C 1FA0           LI   R12,>1FA0
FEE6: 1E03                SBZ  >0003

; map test loop start
FEE8: C067 FFA8           MOV  @>FFA8(R7),R1    ; first table
FEEC: C0E7 FFB0           MOV  @>FFB0(R7),R3    ; second table
FEF0: C167 FFB8           MOV  @>FFB8(R7),R5    ; third table
FEF4: 02E0 0120           LWPI >0120
FEF8: 020B 0100           LI   R11,>0100
FEFC: 032B                LMF  R11,0            ; previous R0-R5 -> map file
FEFE: 02E0 0100           LWPI >0100

FF02: C226 FFC0           MOV  @>FFC0(R6),R8    ; load address we want to test from table
FF06: C249                MOV  R9,R9
FF08: C28A                MOV  R10,R10
FF0A: 2C40                XOP  R0,1             ; this instruction must be defined by LCS.
; result : 16 LSBs of address in R9, 4 MSBs of address in 4 MSBs of R10 (all reversed and inverted)
; 4 next bits of R10 seem to be an index in the map table (????)
FF0C: 100A                JMP  >FF22


; loop test (we increment, and either loop or exit)
FF0E: 05C7                INCT R7               ; try another map file
FF10: 0287 0008           CI   R7,>0008
FF14: 11E9                JLT  >FEE8

FF16: 05C6                INCT R6               ; try another address to test mapping
FF18: 04C7                CLR  R7
FF1A: 0286 001E           CI   R6,>001E
FF1E: 11E4                JLT  >FEE8

FF20: 1062                JMP  >FFE6            ; exit OK to next test on next ROM page


; map test loop (continued)
FF22: C30A                MOV  R10,R12
FF24: 04C0                CLR  R0
FF26: 0E00 000C           IOF  R0,R12
FF2A: 054C                INV  R12
FF2C: 024C 000F           ANDI R12,>000F        ; R12 = address 4 MSB
FF30: 0E00 0009           IOF  R0,R9
FF34: 0549                INV  R9               ; R9 = address 16 LSB
FF36: 0540                INV  R0
FF38: 098A                SRL  R10,8
FF3A: 024A 000F           ANDI R10,>000F

FF3E: 0288 0100           CI   R8,>0100         ; does B2 apply ?
FF42: 150F                JGT  >FF62
; case R8 < >0100
FF44: 028A 0006           CI   R10,>0006        ; -> a >9 reversed and inverted ???
FF48: 162D                JNE  >FFA4            ; error...
FF4A: C2C1                MOV  R1,R11
FF4C: 09CB                SRL  R11,12
FF4E: 830B                C    R11,R12          ; compare 4 MSBs of address
FF50: 1629                JNE  >FFA4
FF52: C2C1                MOV  R1,R11
FF54: 0A4B                SLA  R11,4
FF56: C308                MOV  R8,R12
FF58: 091C                SRL  R12,1
FF5A: A2CC                A    R12,R11
FF5C: 824B                C    R11,R9           ; compare 16 LSBs of address
FF5E: 1622                JNE  >FFA4
FF60: 10D6                JMP  >FF0E            ; loop

FF62: 0288 1000           CI   R8,>1000         ; does B3 apply ?
FF66: 150F                JGT  >FF86

FF68: 028A 000A           CI   R10,>000A        ; -> a >A reversed and inverted ???
FF6C: 161B                JNE  >FFA4
FF6E: C2C3                MOV  R3,R11
FF70: 09CB                SRL  R11,12
FF72: 830B                C    R11,R12
FF74: 1617                JNE  >FFA4
FF76: C2C3                MOV  R3,R11
FF78: 0A4B                SLA  R11,4
FF7A: C308                MOV  R8,R12
FF7C: 091C                SRL  R12,1
FF7E: A2CC                A    R12,R11
FF80: 824B                C    R11,R9
FF82: 1610                JNE  >FFA4
FF84: 10C4                JMP  >FF0E            ; loop

; no Bn bias register apply
FF86: 028A 000C           CI   R10,>000C        ; -> a >C reversed and inverted ???
FF8A: 160C                JNE  >FFA4
FF8C: C2C5                MOV  R5,R11
FF8E: 09CB                SRL  R11,12
FF90: 830B                C    R11,R12
FF92: 1608                JNE  >FFA4
FF94: C2C5                MOV  R5,R11
FF96: 0A4B                SLA  R11,4
FF98: C308                MOV  R8,R12
FF9A: 091C                SRL  R12,1
FF9C: A2CC                A    R12,R11
FF9E: 824B                C    R11,R9
FFA0: 1601                JNE  >FFA4
FFA2: 10B5                JMP  >FF0E

; error exit  point
FFA4: 0460 FFE0           B    @>FFE0

; map file table start
; L1, L2 & L3 are a fixed >FFFF, FEFF, EFFF (-> addresses >0000, >0100, >1000)
; B1
FFA8: 1111                DATA >1111
FFAA: 2222                DATA >2222
FFAC: 4444                DATA >4444
FFAE: 8888                DATA >8888
; B2
FFB0: 1109                DATA >1109
FFB2: 221A                DATA >221A
FFB4: 443C                DATA >443C
FFB6: 8880                DATA >8880
; B3
FFB8: 1091                DATA >1091
FFBA: 21A2                DATA >21A2
FFBC: 43C4                DATA >43C4
FFBE: 8808                DATA >8808

; table with addresses we want to test
FFC0: 000E                DATA >000E
FFC2: 0016                DATA >0016
FFC4: 001A                DATA >001A
FFC6: 001C                DATA >001C
FFC8: 001E                DATA >001E
FFCA: 010E                DATA >010E
FFCC: 0116                DATA >0116
FFCE: 011A                DATA >011A
FFD0: 011C                DATA >011C
FFD2: 011E                DATA >011E
FFD4: 100E                DATA >100E
FFD6: 1016                DATA >1016
FFD8: 101A                DATA >101A
FFDA: 101C                DATA >101C
FFDC: 101E                DATA >101E

FFDE: 0300                DATA >0300

; error exit (cross-page jump)
FFE0: 0205 FFE6           LI   R5,>FFE6
FFE4: 1002                JMP  >FFEA

; normal exit (cross-page jump)
FFE6: 0205 FC00           LI   R5,>FC00

FFEA: 0204 0200           LI   R4,>0200
FFEE: 020C 1FB4           LI   R12,>1FB4
FFF2: 30C4                LDCR R4,3             ; switch to page 2 ?
FFF4: 0455                B    *R5

FFF6: FFFF                DATA >FFFF
FFF8: FFFF                DATA >FFFF
FFFA: FFFF                DATA >FFFF
FFFC: FFFF                DATA >FFFF
FFFE: FFFF                DATA >FFFF










; ROM page 2.

FC00: 0206 0400           LI   R6,>0400
FC04: C806 008C           MOV  R6,@>008C
FC08: 0201 1234           LI   R1,>1234
FC0C: C801 0176           MOV  R1,@>0176
FC10: 0201 E819           LI   R1,>E819
FC14: C801 0178           MOV  R1,@>0178
FC18: 002A 4820 FC56 0176 SM   @>FC56,@>0176,4
FC20: 0706                SETO R6
FC22: 0046 4820 FC5A 0176 CS   R6,@>FC5A,@>0176,4
FC2A: 1613                JNE  >FC52
FC2C: 0208 ABCD           LI   R8,>ABCD
FC30: 0209 EF59           LI   R9,>EF59
FC34: 0028 3220 FC56      ANDM @>FC56,R8,3
FC3A: 0027 3220 FC5A      ORM  @>FC5A,R8,3
FC40: 0026 3220 FC5E      XORM @>FC5E,R8,3
FC46: 0288 1215           CI   R8,>1215
FC4A: 1603                JNE  >FC52
FC4C: 0289 0359           CI   R9,>0359
FC50: 130A                JEQ  >FC66
FC52: 0460 FFE6           B    @>FFE6

FC56: 4816 5800           DATA >4816,>5800
FC5A: 5A4B 4019           DATA >5A4B,>4019
FC5E: 485A 4B40           DATA >485A,>4B40
FC62: 1900                DATA >1900
FC64: 0000                DATA >0000

; memory test
FC66: 001D 20A0 008C      SLAM @>008C,2,2       ; update progress code

FC6C: 04C5                CLR  R5
FC6E: 04C6                CLR  R6
FC70: 02A4                STWP R4
FC72: C044                MOV  R4,R1
FC74: 0221 000A           AI   R1,>000A         ; R1 points to R5
FC78: 0202 FCEE           LI   R2,>FCEE
FC7C: 020C 1FA0           LI   R12,>1FA0
FC80: 04C3                CLR  R3
FC82: 0322                LMF  R2,0             ; map file loaded is empty, I think
FC84: 1D03                SBO  >0003

; test loop
FC86: 0286 0000           CI   R6,>0000
FC8A: 161E                JNE  >FCC8
FC8C: 0283 F800           CI   R3,>F800
FC90: 141F                JHE  >FCD0            ; cannot test >F800->FFFF (always maps to TILINE and ROM)
FC92: 8103                C    R3,R4
FC94: 1602                JNE  >FC9A
FC96: 0223 0020           AI   R3,>0020         ; do not overwrite our workspace...

FC9A: 0791                LDS  *R1
FC9C: C013                MOV  *R3,R0           ; save * (R6:R3)
FC9E: 07D1                LDD  *R1
FCA0: C4E0 FCF2           MOV  @>FCF2,*R3       ; write >AAAA to * (R6:R3)
FCA4: 0791                LDS  *R1
FCA6: 8813 FCF2           C    *R3,@>FCF2
FCAA: 1616                JNE  >FCD8            ; exit in error if different
FCAC: 0791                LDS  *R1
FCAE: 0553                INV  *R3
FCB0: 0791                LDS  *R1
FCB2: 8813 FCF4           C    *R3,@>FCF4       ; compare with >5555 = ~ >AAAA
FCB6: 1610                JNE  >FCD8
FCB8: 07D1                LDD  *R1
FCBA: CCC0                MOV  R0,*R3+          ; restore * (R6:R3), and increment R3
FCBC: 0283 0000           CI   R3,>0000
FCC0: 16E2                JNE  >FC86            ; loop if R3 has not wrapped around to 0
FCC2: 0226 0800           AI   R6,>0800         ; else fix bias (B1) for LDS/LDD to point to next 64kb
FCC6: 10DF                JMP  >FC86            ; and loop

FCC8: 0286 1000           CI   R6,>1000         ; jump here if R6 != 0
FCCC: 11E6                JLT  >FC9A            ; continue if not testing address over >020000 (>10000)
FCCE: 1013                JMP  >FCF6            ; else exit

FCD0: 0226 0800           AI   R6,>0800         ; skip system area (TPCS and ROM)
FCD4: 04C3                CLR  R3               ; and jump to >010000 (>08000)
FCD6: 10E1                JMP  >FC9A

; error exit :
FCD8: 07D1                LDD  *R1
FCDA: C4C0                MOV  R0,*R3           ; try to restore memory data
FCDC: C803 0094           MOV  R3,@>0094        ; save current address
FCE0: 09B6                SRL  R6,11
FCE2: C806 0090           MOV  R6,@>0090        ; save address MSBits.
FCE6: 0A33                SLA  R3,3
FCE8: 1306                JEQ  >FCF6            ; if we are on a 8 kbyte boundary, we must have only
                                                ; reached end of memory, so we jump to normal exit
FCEA: 0460 FFE6           B    @>FFE6           ; exit in error to next page

; empty map file
FCEE: 0000 0000           DATA >0000,>0000      ; L1 = ~ >FFFF, B1 = >0000
FCF2: AAAA 5555           DATA >AAAA,>5555      ; L2 = ~ >5555, B2 = >5555

; Memory test exit point
; Error interrupt test
; The CPU triggers a level-2 interrupt on some error conditions : unimplemented memory,
; illegal instructions, overflow...
FCF6: 001D 2060 008C      SLAM 2,@>008C,1       ; update progress code

FCFC: 020C 1FC0           LI   R12,>1FC0
FD00: 04C1                CLR  R1
FD02: 3001                LDCR R1,16

; save current interrupt vectors to >0180
FD04: 0202 0180           LI   R2,>0180
FD08: CCB1                MOV  *R1+,*R2+
FD0A: 0281 0040           CI   R1,>0040
FD0E: 11FC                JLT  >FD08

; set all int vectors to default spurious int handler
FD10: 04C1                CLR  R1
FD12: 0202 0100           LI   R2,>0100
FD16: 0203 FFE2           LI   R3,>FFE2
FD1A: CC42                MOV  R2,*R1+
FD1C: CC43                MOV  R3,*R1+
FD1E: 0281 0040           CI   R1,>0040
FD22: 11FB                JLT  >FD1A

; test timeout error
FD24: 0201 FD38           LI   R1,>FD38
FD28: C801 000A           MOV  R1,@>000A        ; set int 2 routine
FD2C: 0300 0002           LIMI >0002            ; allow int 2 (machine error)
FD30: C060 FBFE           MOV  @>FBFE,R1        ; no memory there -> timeout error
FD34: 0460 FFE2           B    @>FFE2           ; error exit

; int 2 routine
FD38: 0200 8000           LI   R0,>8000         ; bit 0 = timeout bit
FD3C: 06A0 FFC8           BL   @>FFC8           ; clear
; test priviledge violation error
FD40: 0201 FD5C           LI   R1,>FD5C
FD44: C801 000A           MOV  R1,@>000A
FD48: 0300 0002           LIMI >0002            ; allow int 2
FD4C: 02C1                STST R1
FD4E: 0261 0100           ORI  R1,>0100         ; set ST_PR bit
FD52: 0081                LST  R1               ; -> switch to user mode
FD54: 0300 0002           LIMI >0002            ; should trigger a priviledge violation error
FD58: 0460 FFE2           B    @>FFE2

; int 2 routine
FD5C: 0200 4000           LI   R0,>4000         ; bit 1 = priviledge violation
FD60: 06A0 FFC8           BL   @>FFC8
; test illegal opcode error
FD64: 0201 FD76           LI   R1,>FD76
FD68: C801 000A           MOV  R1,@>000A
FD6C: 0300 0002           LIMI >0002            ; allow int 2
FD70: 0000                DATA >0000            ; illegal instruction
FD72: 0460 FFE2           B    @>FFE2           ; exit in error

; int 2 routine
FD76: 0200 2000           LI   R0,>2000         ; bit 2 = illegal instruction
FD7A: 06A0 FFC8           BL   @>FFC8
; test memory parity error
FD7E: 0201 FD9A           LI   R1,>FD9A
FD82: C801 000A           MOV  R1,@>000A
FD86: 020C 1FA0           LI   R12,>1FA0
FD8A: 1D09                SBO  >0009            ; enable parity checking ?
FD8C: 0300 0002           LIMI >0002
FD90: C060 FC00           MOV  @>FC00,R1        ; obviously triggers a parity error - why ?
FD94: 1E09                SBZ  >0009
FD96: 0460 FFE2           B    @>FFE2

FD9A: 1E09                SBZ  >0009
FD9C: 0200 1000           LI   R0,>1000         ; bit 3 = Memory parity error
FDA0: 06A0 FFC8           BL   @>FFC8
; test address beyond map error
FDA4: 0201 FDE4           LI   R1,>FDE4
FDA8: C801 000A           MOV  R1,@>000A
FDAC: 0202 0000           LI   R2,>0000
FDB0: 0542                INV  R2               ; L1 = ~ >0000
FDB2: 04C3                CLR  R3               ; B1 = 0
FDB4: 0204 EFFE           LI   R4,>EFFE
FDB8: 0544                INV  R4               ; L2 = ~ >EFFE
FDBA: 04C5                CLR  R5               ; B2 = 0
FDBC: 0206 0000           LI   R6,>0000
FDC0: 0546                INV  R6               ; L3 = ~ >0000 (-> will be ignored)
FDC2: 04C7                CLR  R7               ; B3 = 0
FDC4: 02A1                STWP R1
FDC6: 0221 0004           AI   R1,>0004         ; points to R2
FDCA: 0321                LMF  R1,0             ; load map file
FDCC: 020C 1FA0           LI   R12,>1FA0
FDD0: 1D03                SBO  >0003
FDD2: 0300 0000           LIMI >0000
FDD6: C060 F020           MOV  @>F020,R1        ; address not defined in memory map
FDDA: 1E03                SBZ  >0003
FDDC: 0300 0002           LIMI >0002
FDE0: 0460 FFE2           B    @>FFE2

FDE4: 1E03                SBZ  >0003
FDE6: 0200 8800           LI   R0,>8800         ; bits 0 and 4 = timeout & Address beyond map bits
FDEA: 06A0 FFC8           BL   @>FFC8
; test memory protection
FDEE: 0201 FE30           LI   R1,>FE30
FDF2: C801 000A           MOV  R1,@>000A
FDF6: 0702                SETO R2               ; L1 = ~ >0000
FDF8: 04C3                CLR  R3               ; B1 = 0
FDFA: 0204 FEE2           LI   R4,>FEE2         ; L2 = ~ (>0100 | >1D) (5 LSBits ignored for address
                                                ; - must tell the memory is execution protected)
                                                ; B2 in R5 should still be 0, but maybe we don't care
FDFE: 04C6                CLR  R6               ; L3 = ~ >FFFF
FE00: 04C7                CLR  R7               ; B3 = 0
FE02: 02A1                STWP R1
FE04: 0221 0004           AI   R1,>0004
FE08: 0321                LMF  R1,0             ; load map file
FE0A: 020C 1FA0           LI   R12,>1FA0
FE0E: 1D03                SBO  >0003
FE10: 0200 1000           LI   R0,>1000         ; NOP instruction
FE14: 02C1                STST R1
FE16: 0261 0040           ORI  R1,>0040         ; memory management bit
FE1A: 0081                LST  R1
FE1C: 0300 0002           LIMI >0002
FE20: 04A0 0100           X    @>0100           ; actually executes NOP in R0, I think
FE24: 1E03                SBZ  >0003
FE26: 0241 FFB1           ANDI R1,>FFB1         ; clear memory management bit
FE2A: 0081                LST  R1
FE2C: 0460 FFE2           B    @>FFE2

FE30: 1E03                SBZ  >0003
FE32: 0241 FFB1           ANDI R1,>FFB1
FE36: 0081                LST  R1
FE38: 0200 0200           LI   R0,>0200         ; bit 6 : execution in execute-protected memory
FE3C: 06A0 FFC8           BL   @>FFC8
FE40: 0201 FE82           LI   R1,>FE82
FE44: C801 000A           MOV  R1,@>000A
FE48: 0702                SETO R2               ; L1 = ~ >0000
FE4A: 04C3                CLR  R3
FE4C: 0204 FEE1           LI   R4,>FEE1         ; L2 = ~ (>0100 | >1E) (must tell memory is write-protected)
FE50: 04C5                CLR  R5
FE52: 04C6                CLR  R6
FE54: 04C7                CLR  R7
FE56: 02A1                STWP R1
FE58: 0221 0004           AI   R1,>0004
FE5C: 0321                LMF  R1,0
FE5E: 020C 1FA0           LI   R12,>1FA0
FE62: 1D03                SBO  >0003
FE64: 02C1                STST R1
FE66: 0261 0040           ORI  R1,>0040         ; memory management bit
FE6A: 0081                LST  R1
FE6C: 0300 0002           LIMI >0002
FE70: C820 00E0 0100      MOV  @>00E0,@>0100
FE76: 1E03                SBZ  >0003
FE78: 0241 FFB1           ANDI R1,>FFB1
FE7C: 0081                LST  R1
FE7E: 0460 FFE2           B    @>FFE2

FE82: 1E03                SBZ  >0003
FE84: 0241 FFB1           ANDI R1,>FFB1
FE88: 0081                LST  R1
FE8A: 0200 0100           LI   R0,>0100         ; bit 7 : write in write-protected memory
FE8E: 06A0 FFC8           BL   @>FFC8
FE92: 0201 FEB2           LI   R1,>FEB2
FE96: C801 000A           MOV  R1,@>000A
FE9A: 0703                SETO R3
FE9C: 0300 0002           LIMI >0002
FEA0: 00D3 6820 FEAC 0100 MVSK R3,@>FEAC,@>0100,6   ; move string from stack - whatever it does
                                                    ; distinct from POPS - POP String from stack
FEA8: 0460 FFE2           B    @>FFE2

; MAYBE the data that follow is a stack descriptor.
; Anyway, we need something like this, since I can't see any place where we set up a SP and
; stack bounds.  Maybe these are hard-coded, but why should MVSK take 2 operands, then ?
FEAC: 0102                DATA >0102                ; current stack pointer ?
FEAE: 0100                DATA >0100                ; stack bottom ? (or stack growth limit ?)
FEB0: 0104                DATA >0104                ; stack growth limit ? (or stack bottom ?)


FEB2: 0200 0080           LI   R0,>0080         ; bit 8 : stack overflow
FEB6: 06A0 FFC8           BL   @>FFC8
FEBA: 0201 FF2A           LI   R1,>FF2A
FEBE: C801 000A           MOV  R1,@>000A
FEC2: 04C1                CLR  R1
FEC4: 0202 FCEE           LI   R2,>FCEE         ; points on empty map file
FEC8: 0322                LMF  R2,0             ; load both map files
FECA: 0332                LMF  R2,1

; test loop entry point
FECC: 0281 000E           CI   R1,>000E         ; index from >0*2 to >7*2
FED0: 1542                JGT  >FF56            ; exit loop if greater
FED2: C0E1 FF36           MOV  @>FF36(R1),R3    ; read breakpoint generator operation mode ?
FED6: 020C 1FAA           LI   R12,>1FAA
FEDA: 30C3                LDCR R3,3
FEDC: 0203 0101           LI   R3,>0101         ; breakpoint address, I guess - LSBit meaning unknown
FEE0: 020C 1F80           LI   R12,>1F80
FEE4: 3003                LDCR R3,16
FEE6: 02C2                STST R2
FEE8: 0281 0008           CI   R1,>0008
FEEC: 1103                JLT  >FEF4

FEEE: 0262 0080           ORI  R2,>0080         ; -> use map file 1
FEF2: 1002                JMP  >FEF8

FEF4: 0242 FF7F           ANDI R2,>FF7F         ; -> use map file 0

FEF8: 0082                LST  R2               ; write in ST
FEFA: 0300 0002           LIMI >0002
FEFE: C0A1 FF46           MOV  @>FF46(R1),R2    ; load test routine address
FF02: 020C 1FA0           LI   R12,>1FA0
FF06: 1D03                SBO  >0003
FF08: 0452                B    *R2              ; jump

FF0A: C820 0100 0104      MOV  @>0100,@>0104    ; read from >0100
FF10: 0460 FFE2           B    @>FFE2

FF14: 0200 1000           LI   R0,>1000         ; NOP
FF18: 04A0 0100           X    @>0100           ; execute at >0100
FF1C: 0460 FFE2           B    @>FFE2

FF20: C820 0104 0100      MOV  @>0104,@>0100    ; write to >0100
FF26: 0460 FFE2           B    @>FFE2


FF2A: 0200 0040           LI   R0,>0040         ; breakpoint address encountered ?
FF2E: 06A0 FFC8           BL   @>FFC8
FF32: 05C1                INCT R1
FF34: 10CB                JMP  >FECC

; table 1 for test loop : breakpoint mode ?
FF36: 0000                DATA >0000            ; break on read, map file 0 ?
FF38: 0400                DATA >0400            ; break on execute ?
FF3A: 0200                DATA >0200            ; break on write ?
FF3C: 0600                DATA >0600            ; ???
FF3E: 0100                DATA >0100            ; same as above with map file 1 ?
FF40: 0500                DATA >0500
FF42: 0300                DATA >0300
FF42: 0700                DATA >0700
; table 2 for test loop : test code
FF46: FF0A                DATA >FF0A            ; read
FF48: FF14                DATA >FF14            ; execute
FF4A: FF20                DATA >FF20            ; write
FF4C: FF0A                DATA >FF0A            ; read
FF4E: FF0A                DATA >FF0A
FF50: FF14                DATA >FF14
FF52: FF20                DATA >FF20
FF54: FF0A                DATA >FF0A


FF56: 020C 1FA0           LI   R12,>1FA0
FF5A: 1E03                SBZ  >0003
; clock test
FF5C: 0201 FF7E           LI   R1,>FF7E
FF60: C801 000A           MOV  R1,@>000A
FF64: 020C 1FA0           LI   R12,>1FA0
FF68: 0300 0002           LIMI >0002
FF6C: 0202 1C00           LI   R2,>1C00
FF70: 1D01                SBO  >0001            ; enable clock ?
FF72: 0602                DEC  R2               ; wait for clock to trigger
FF74: C082                MOV  R2,R2            ; this loop should execute in about 12ms
FF76: 15FD                JGT  >FF72            ; more than 1500000  instructions per second - not so bad
FF78: 1E01                SBZ  >0001
FF7A: 0460 FFE2           B    @>FFE2


FF7E: 1E01                SBZ  >0001
FF80: 0200 0020           LI   R0,>0020         ; 12ms test clock
FF84: 06A0 FFC8           BL   @>FFC8
; arithmetic overflow interrupt test
FF88: 0201 FFA8           LI   R1,>FFA8
FF8C: C801 000A           MOV  R1,@>000A
FF90: 0201 7FFF           LI   R1,>7FFF
FF94: C081                MOV  R1,R2
FF96: 0300 0002           LIMI >0002
FF9A: 02C3                STST R3
FF9C: 0263 0020           ORI  R3,>0020         ; arithmetic overflow enable
FFA0: 0083                LST  R3
FFA2: A081                A    R1,R2            ; >7FFF + >7FFF = >FFFE, and overflow bit is set
FFA4: 0460 FFE2           B    @>FFE2


FFA8: 0243 F7D1           ANDI R3,>F7D1
FFAC: 0083                LST  R3
FFAE: 0200 0010           LI   R0,>0010         ; arithmetic overflow bit
FFB2: 06A0 FFC8           BL   @>FFC8
FFB6: 101A                JMP  >FFEC            ; exit OK to next page

FFB8: 04C1                CLR  R1
FFBA: 0202 0180           LI   R2,>0180
FFBE: CC72                MOV  *R2+,*R1+
FFC0: 0281 0040           CI   R1,>0040
FFC4: 11FC                JLT  >FFBE
FFC6: 045B                B    *R11

; This routine checks that R0 matches the error interrupt register.
FFC8: 020C 1FC0           LI   R12,>1FC0
FFCC: 3401                STCR R1,16            ; read error interrupt register
FFCE: 0241 FFFE           ANDI R1,>FFFE         ; clear system type indicator ?
FFD2: 04C3                CLR  R3
FFD4: 3003                LDCR R3,16            ; clear error interrupt register
FFD6: C0C0                MOV  R0,R3
FFD8: 0027 20C1           ORM  R1,R3,2
FFDC: 80C0                C    R0,R3            ; are there extra error bits ?
FFDE: 1601                JNE  >FFE2            ; if so, exit in error
FFE0: 045B                B    *R11

; spurious interrupt handler, and error exit handler for the error interrupt test
; restore vectors, then jump to next page in error
FFE2: 06A0 FFB8           BL   @>FFB8

; jump to next page in error
FFE6: 0205 FE20           LI   R5,>FE20
FFEA: 1002                JMP  >FFF0
; jump to next page OK
FFEC: 0205 FC00           LI   R5,>FC00

FFF0: 0204 0300           LI   R4,>0300
FFF4: 020C 1FB4           LI   R12,>1FB4
FFF8: 30C4                LDCR R4,3             ; jump to page 3 ?
FFFA: 0455                B    *R5

FFFC: FFFF                DATA >FFFF
FFFE: FFFF                DATA >FFFF










; ROM page 3.
; Self-test routine (end)

; First an interrupt test
FC00: 001D 2060 008C      SLAM @>008C,1,2       ; update progress code in R6, Workspace >0080
FC06: 0300 0000           LIMI >0000            ; disable all interrupts

FC0A: 0201 0104           LI   R1,>0104         ; clear RAM from >0104 to >0180
FC0E: 04F1                CLR  *R1+
FC10: 0281 017F           CI   R1,>017F
FC14: 1AFC                JL   >FC0E

FC16: 0200 0154           LI   R0,>0154
FC1A: C800 0152           MOV  R0,@>0152        ; set-up pointer used by our test interrupt vector

FC1E: 04C2                CLR  R2               ; set up vectors for all masked interrupt
FC20: C4A2 FD82           MOV  @>FD82(R2),*R2   ; with contents of a table at offset >FD82
FC24: 05C2                INCT R2               ; why on earth don't they use MOV  @>FD82(R2),*R2+ ???
FC26: 0282 0040           CI   R2,>0040
FC2A: 1AFA                JL   >FC20

FC2C: 020C 1FA0           LI   R12,>1FA0
FC30: 1D08                SBO  >0008

FC32: 020C 1F80           LI   R12,>1F80
FC36: 1D0F                SBO  >000F            ; so level-15 interrupt is pending
FC38: 1D08                SBO  >0008            ; and level-8
FC3A: 1D03                SBO  >0003            ; and level-3

FC3C: C020 0154           MOV  @>0154,R0        ; should still be 0, since interrupts are disabled
FC40: 1637                JNE  >FCB0

FC42: 0300 000F           LIMI >000F            ; enable all interrupts
; At this point, the 3 pending interrupts should execute in the order of their priority, and
; append their ID at the location pointed by @>0152 - initially >0154, so we should have :
;0154: 0003 0008 000F

FC46: C020 0154           MOV  @>0154,R0        ; test 1st word
FC4A: 0280 0003           CI   R0,>0003
FC4E: 1630                JNE  >FCB0            ; jump on error
FC50: C020 0156           MOV  @>0156,R0        ; test 2nd word
FC54: 0280 0008           CI   R0,>0008
FC58: 162B                JNE  >FCB0
FC5A: C020 0158           MOV  @>0158,R0        ; test 3rd word
FC5E: 0280 000F           CI   R0,>000F
FC62: 1626                JNE  >FCB0

FC64: 020C 1F80           LI   R12,>1F80
FC68: 05A0 0150           INC  @>0150           ; set flag to ask level-3 routine to trigger level 3 and >F

FC6C: 1D08                SBO  >0008            ; trigger level 8 again
FC6E: C020 015A           MOV  @>015A,R0        ; test word
FC72: 0280 0008           CI   R0,>0008
FC76: 161C                JNE  >FCB0

FC78: C020 015C           MOV  @>015C,R0        ; level 3 should follow
FC7C: 0280 0003           CI   R0,>0003
FC80: 1617                JNE  >FCB0
FC82: C020 015E           MOV  @>015E,R0        ; then level >F
FC86: 0280 000F           CI   R0,>000F
FC8A: 1612                JNE  >FCB0

FC8C: 04C1                CLR  R1

FC8E: 05C1                INCT R1
FC90: 0281 0014           CI   R1,>0014         ; 10 iterations
FC94: 1B08                JH   >FCA6
FC96: 04C2                CLR  R2
FC98: 020C 1F80           LI   R12,>1F80
FC9C: 04A1 FDC0           X    @>FDC0(R1)       ; trigger interrupt
FCA0: 8042                C    R2,R1            ; the interrupt routine should set R2 to the same value as R1
FCA2: 1606                JNE  >FCB0
FCA4: 10F4                JMP  >FC8E            ; loop

FCA6: C020 0160           MOV  @>0160,R0        ; check we did not have spurious level 3,8 or >F interrupt
FCAA: 1602                JNE  >FCB0
FCAC: 0460 FDF2           B    @>FDF2           ; everything is fine

FCB0: 0460 FDEA           B    @>FDEA

; level-4 interrupt routine
FCB4: 0202 0002           LI   R2,>0002         ; set flag
FCB8: 101A                JMP  >FCEE
; level-5 interrupt routine
FCBA: 0202 0004           LI   R2,>0004
FCBE: 1017                JMP  >FCEE
; level-6 interrupt routine
FCC0: 0202 0014           LI   R2,>0014
FCC4: 1014                JMP  >FCEE
; level-7 interrupt routine
FCC6: 0202 0010           LI   R2,>0010
FCCA: 1011                JMP  >FCEE
; level-9 interrupt routine
FCCC: 0202 0006           LI   R2,>0006
FCD0: 100E                JMP  >FCEE
; level-10 interrupt routine
FCD2: 0202 000A           LI   R2,>000A
FCD6: 100B                JMP  >FCEE
; level-11 interrupt routine
FCD8: 0202 000C           LI   R2,>000C
FCDC: 1008                JMP  >FCEE
; level-12 interrupt routine
FCDE: 0202 0012           LI   R2,>0012
FCE2: 1005                JMP  >FCEE
; level-13 interrupt routine
FCE4: 0202 0008           LI   R2,>0008
FCE8: 1002                JMP  >FCEE
; level-14 interrupt routine
FCEA: 0202 000E           LI   R2,>000E
FCEE: 04A1 FDD4           X    @>FDD4(R1)       ; disable interrupt
FCF2: 0380                RTWP

; level-3 interrupt routine
FCF4: 02C0                STST R0
FCF6: 0240 000F           ANDI R0,>000F
FCFA: 0280 0002           CI   R0,>0002         ; value expected on a TMS9900
FCFE: 1675                JNE  >FDEA
FD00: C0E0 0152           MOV  @>0152,R3        ; load pointer
FD04: 0200 0003           LI   R0,>0003
FD08: C4C0                MOV  R0,*R3           ; append identifier
FD0A: 05E0 0152           INCT @>0152           ; increment pointer
FD0E: 020C 1F80           LI   R12,>1F80
FD12: 1E03                SBZ  >0003            ; clear interrupt
FD14: 0380                RTWP

; level-8 interrupt routine - cf level 3
FD16: 02C0                STST R0
FD18: 0240 000F           ANDI R0,>000F
FD1C: 0280 0007           CI   R0,>0007
FD20: 1664                JNE  >FDEA
FD22: C0E0 0152           MOV  @>0152,R3
FD26: 0200 0008           LI   R0,>0008
FD2A: C4C0                MOV  R0,*R3
FD2C: 05E0 0152           INCT @>0152
FD30: 020C 1F80           LI   R12,>1F80
FD34: C060 0150           MOV  @>0150,R1
FD38: 1302                JEQ  >FD3E
FD3A: 1D0F                SBO  >000F
FD3C: 1D03                SBO  >0003
FD3E: 1E08                SBZ  >0008
FD40: 0380                RTWP

; level-15 interrupt routine - cf level 3
FD42: 02C0                STST R0
FD44: 0240 000F           ANDI R0,>000F
FD48: 0280 000E           CI   R0,>000E
FD4C: 164E                JNE  >FDEA
FD4E: C0E0 0152           MOV  @>0152,R3
FD52: 0200 000F           LI   R0,>000F
FD56: C4C0                MOV  R0,*R3
FD58: 05E0 0152           INCT @>0152
FD5C: 020C 1F80           LI   R12,>1F80
FD60: 1E0F                SBZ  >000F
FD62: 0380                RTWP

; level 0,1,2 interrupt routine
FD64: 0460 FDEA           B    @>FDEA

; restore interrupt vector table with the table saved at >0180
FD68: 04C1                CLR  R1
FD6A: 0202 0180           LI   R2,>0180
FD6E: CC72                MOV  *R2+,*R1+
FD70: 0281 0040           CI   R1,>0040
FD74: 11FC                JLT  >FD6E

FD76: 02E0 0100           LWPI >0100
FD7A: 020C 18A0           LI   R12,>18A0
FD7E: 1E08                SBZ  >0008
FD80: 045B                B    *R11

; table with the interrupt vectors used by the test
FD82: 0100 FD64           DATA >0100,>FD64      ; level-0 masked interrupt
FD86: 0100 FD64           DATA >0100,>FD64
FD8A: 0100 FD64           DATA >0100,>FD64
FD8E: 0120 FCF4           DATA >0120,>FCF4
FD92: 0100 FCB4           DATA >0100,>FCB4
FD96: 0100 FCBA           DATA >0100,>FCBA
FD9A: 0100 FCC0           DATA >0100,>FCC0
FD9E: 0100 FCC6           DATA >0100,>FCC6
FDA2: 0128 FD16           DATA >0128,>FD16
FDA6: 0100 FCCC           DATA >0100,>FCCC
FDAA: 0100 FCD2           DATA >0100,>FCD2
FDAE: 0100 FCD8           DATA >0100,>FCD8
FDB2: 0100 FCDE           DATA >0100,>FCDE
FDB6: 0100 FCE4           DATA >0100,>FCE4
FDBA: 0100 FCEA           DATA >0100,>FCEA
FDBE: 0130 FD42           DATA >0130,>FD42      ; level-15 masked interrupt

; instruction table to enable interrupts
FDC2: 1D04                SBO  >0004
FDC4: 1D05                SBO  >0005
FDC6: 1D09                SBO  >0009
FDC8: 1D0D                SBO  >000D
FDCA: 1D0A                SBO  >000A
FDCC: 1D0B                SBO  >000B
FDCE: 1D0E                SBO  >000E
FDD0: 1D07                SBO  >0007
FDD2: 1D0C                SBO  >000C
FDD4: 1D06                SBO  >0006
; instruction table to disable interrupts
FDD6: 1E04                SBZ  >0004
FDD8: 1E05                SBZ  >0005
FDDA: 1E09                SBZ  >0009
FDDC: 1E0D                SBZ  >000D
FDDE: 1E0A                SBZ  >000A
FDE0: 1E0B                SBZ  >000B
FDE2: 1E0E                SBZ  >000E
FDE4: 1E07                SBZ  >0007
FDE6: 1E0C                SBZ  >000C
FDE8: 1E06                SBZ  >0006

; routine used by start-up code, and level 0,1,2 interrupt vectors
FDEA: 06A0 FD68           BL   @>FD68
FDEE: 0460 FE20           B    @>FE20


FDF2: 06A0 FD68           BL   @>FD68
FDF6: 0206 0400           LI   R6,>0400
FDFA: C806 008C           MOV  R6,@>008C
FDFE: 0706                SETO R6
FE00: 0066 4020 FE14      MOVS R6,@>FE14,R0,4
FE06: 0C07                CED                   ; Convert Extended integer to Double precision real
FE08: 0706                SETO R6
FE0A: 0046 8800 FE18      CS   R6,R0,@>FE18,8   ; test result
FE10: 1607                JNE  >FE20
FE12: 1009                JMP  >FE26

; 32 bit integer
FE14: 5A4B 4019           DATA >5A4B,>4019
; double precision real :
FE18: 485A 4B40 1900 0000 DATA >485A,>4B40,>1900,>0000

; error exit routine : handles a cross-page jump, yes sir
FE20: 0205 FC08           LI   R5,>FC08         ; error return address
FE24: 1002                JMP  >FE2A

; normal exit : same idea
FE26: 0205 FC1C           LI   R5,>FC1C         ; successful return address

FE2A: 0204 0000           LI   R4,>0000
FE2E: C804 0088           MOV  R4,@>0088        ; move current R4 to future R4
FE32: C805 008A           MOV  R5,@>008A        ; same story
FE36: 02CC                STST R12
FE38: 026C 0010           ORI  R12,>0010        ; set "writable control store" bit in ST to use custom XOP
FE3C: 008C                LST  R12
FE3E: 2D40                XOP  R0,5             ; this instruction must be defined by LCS
FE40: 02E0 0080           LWPI >0080            ; change WP
FE44: 04CC                CLR  R12
FE46: 008C                LST  R12              ; clear ST
FE48: 020C 1FB4           LI   R12,>1FB4
FE4C: 30C4                LDCR R4,3             ; switch to page #0 ?
FE4E: 0455                B    *R5


; The ROM is padded with 1s
; We have a lot of free space.  Quite a change from TI990/4 ROMs.
FE50: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FE60: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FE70: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FE80: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FE90: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FEA0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FEB0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FEC0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FED0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FEE0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FEF0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF00: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF10: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF20: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF30: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF40: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF50: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF60: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF70: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF80: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FF90: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FFA0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FFB0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FFC0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FFD0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FFE0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF
FFF0: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF   DATA >FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF,>FFFF









; The second half of this ROM makes strictly no sense as 990/12 machine code.
; Weird, weird...  Maybe it is a microcode ROM, or a data ROM of some sort ?
;
; The data should obviously be grouped by 4 words.  Consecutive sequences are often really close,
; too.
;

0000: 10F8
0002: 2F1D
0004: 0701
0006: 282E

0008: 1CF8
000A: 2F1D
000C: 0701
000E: 2809

0010: 10F8
0012: 2F1D
0014: 970F
0016: 2806

0018: 10F8
001A: 2F1D
001C: 970F
001E: 2807

0020: 10F8
0022: 2F1D
0024: 970F
0026: 2808

0028: 1CF8
002A: 2F1D
002C: 0701
002E: 281F

0030: 1CF8
0032: 2F1D
0034: 0701
0036: 282C

0038: 1CF8
003A: 2F1D
003C: 0701
003E: 282C

0040: 1CF8
0042: 2F1D
0044: 0701
0046: 282C

0048: 1029
004A: AC1E
004C: 970E
004E: 841F

0050: 1C29
0052: AF1D
0054: 0700
0056: 840F

0058: FC80
005A: 2F11
005C: 0500
005E: 84A6

0060: 1CF8
0062: 2E1D
0064: 2F00
0066: 840F

0068: 1C69
006A: EC1D
006C: 07B0
006E: 841F

0070: 48F8
0072: 2A1D
0074: 0400
0076: 840F

0078: 178F
007A: B71D
007C: 0710
007E: 840F

0080: 1CEF
0082: 0E1D
0084: 080E
0086: A910

0088: 1CF8
008A: 2C1D
008C: 07A0
008E: 840B

0090: 1CF8
0092: 2C1D
0094: 07F0
0096: 8400

0098: 1CF8
009A: 2C1D
009C: 0770
009E: 8401

00A0: 1CF8
00A2: 2F1C
00A4: 4700
00A6: 840F

00A8: 1CF8
00AA: 2F1D
00AC: 0701
00AE: 160F

00B0: 1CF8
00B2: 2C1E
00B4: 0700
00B6: 841F

00B8: FC40
00BA: 2F11
00BC: 0700
00BE: 84C8

00C0: 1C8F
00C2: AF9D
00C4: 0500
00C6: 840F

00C8: 0CF8
00CA: 2A9D
00CC: 2A00
00CE: A819

00D0: FC80
00D2: 2F11
00D4: 0500
00D6: 84A6

00D8: 0CF8
00DA: 2A1D
00DC: 2F00
00DE: 840F

00E0: 1748
00E2: AF1D
00E4: 0700
00E6: 840F

00E8: 4AF8
00E8: 2E1D
00EC: 0740
00EE: 840F

00F0: 49F8
00F2: 2D1D
00F4: 0741
00F6: 282C

00F8: FC01
00FA: 6F1D
00FC: 0700
00FE: 8480

0100: 107B
0102: 2F1D
0104: 0400
0106: 840F

0108: 1CF8
010A: 2C1E
010C: 0700
010E: 840B

0110: F380
0112: 2F11
0114: 6710
0116: 84E0

0118: 1CF8
011A: 2C1D
011C: 07B0
011E: 84F1

0120: 1388
0122: AF1D
0124: 0770
0126: 840F

0128: 1388
012A: 8F0D
012C: 17AE
012E: 09C0

0130: 10F8
0132: 2F1D
0134: 0700
0136: 840F

0138: 1588
013A: AF0D
013C: 17AE
013E: 840F

0140: 1E88
0142: AF9D
0144: 0070
0146: 840F

0148: 1688
014A: BF9D
014C: 9071
014E: E82A

0150: 1388
0152: 9F1D
0154: 8F10
0156: A924

0158: 1CF8
015A: 2F1D
015C: 6F01
015E: AC23

0160: 1C97
0162: 8F0D
0164: 0400
0166: 840F

0168: 1CF8
016A: 379C
016C: 0201
016E: 2001

0170: 1E8F
0172: AF1E
0174: 4711
0176: 082F

0178: 1D88
017A: AF19
017C: 0710
017E: 0843

0180: 1CF8
0182: 2F1D
0184: B70E
0186: 0856

0188: 1CF8
018A: 2F1D
018C: BF0F
018E: 2984

0190: 1CF8
0192: 2F1D
0194: B70E
0196: 0864

0198: 1CF8
019A: 2F1D
019C: BF0E
019E: 0873

01A0: 10F8
01A2: 2F1D
01A4: B70E
01A6: 0900

01A8: 10F8
01AA: 2F1D
01AC: BF0E
01AE: 09C1

01B0: 10F8
01B2: 2F1D
01B4: BF0E
01B6: 09EB

01B8: 1CF8
01BA: 2F1D
01BC: BF0E
01BE: 08C0

01C0: 1CF8
01C2: 2F1D
01C4: BF0E
01C6: 087C

01C8: 10F8
01CA: 2F1D
01CC: BF0E
01CE: 088C

01D0: 1009
01D2: EF05
01D4: BF0E
01D6: 9F02

01D8: 1E48
01DA: AF1D
01DC: 0700
01DE: 094A

01E0: 1F88
01E2: CF0D
01E4: 4F9E
01E6: 0976

01E8: 1D88
01EA: AF1F
01EC: 170E
01EE: 0974

01F0: 0629
01F2: E91D
01F4: 570F
01F6: E93F

01F8: FC61
01FA: EA1D
01FC: 07A0
01FE: 844F

0200: 1CF8
0202: 2C9D
0204: 00A0
0206: 8405

0208: 20EE
020A: AA9D
020C: 2801
020E: E842

0210: 1CF8
0212: 2F9C
0214: 4200
0216: 640F

0218: 1C09
021A: CF1D
021C: C700
021E: 0974

0220: FC81
0222: EF1D
0224: 0500
0226: 8429

0228: 1CDC
022A: AF0D
022C: 2FA0
022E: 094A

0230: 2CD6
0232: AF1D
0234: 0790
0236: 0947

0238: 2CD2
023A: AF1D
023C: 4D0E
023E: 0976

0240: 1009
0242: EC1D
0244: 179E
0246: 84F0

0248: 0EF8
024A: 2D1D
024C: 8F41
024E: C94D

0250: 1CED
0252: 2D1D
0254: 0780
0256: 084F

0258: 1CF8
025A: 2D1D
025C: 0780
025E: 084D

0260: 1C09
0262: EF1D
0264: 0781
0266: 284F

0268: 4C29
026A: EF1D
026C: 0700
026E: 0852

0270: 1EF8
0272: 2F1D
0274: 0700
0276: 6A4D

0278: 0CF8
027A: 291D
027C: 507E
027E: 840F

0280: 1C29
0282: FF1D
0284: 570E
0286: 0852

0288: 16F8
028A: 2F1D
028C: 0700
028E: 6A4F

0290: FC81
0292: EF1D
0294: 05F0
0296: 8429

0298: 0CEE
029A: 2A1D
029C: 2500
029E: 840F

02A0: 1CE5
02A2: AE1D
02A4: 2F00
02A6: 840F

02A8: 1CF8
02AA: 2F1D
02AC: 0700
02AE: 62FF

02B0: 1009
02B2: AF1D
02B4: 07A0
02B6: 0974

02B8: 1B08
02BA: AF0D
02BC: CF10
02BE: 094A

02C0: 11F8
02C2: 2D1D
02C4: 4D1E
02C6: 0976

02C8: 1CF8
02CA: 2F1D
02CC: 0700
02CE: 0947

02D0: 1CF8
02D2: 2F1D
02D4: 0700
02D6: 094F

02D8: 0029
02DA: A91D
02DC: 570E
02DE: 0947

02E0: 40EE
02E2: 2C1D
02E4: 0FBE
02E6: 8412

02E8: 10EE
02EA: 2E1D
02EC: 0F0E
02EE: A85D

02F0: 10EE
02F2: 2E1D
02F4: 0FDE
02F6: 840F

02F8: 10EE
02FA: 2E1D
02FC: 0F0E
02FE: A95F

0300: 1798
0302: 0E1D
0304: 0700
0306: 840F

0308: 2680
030A: 0F1D
030C: 0700
030E: A2FF

0310: 1B10
0312: 2F1D
0314: 0710
0316: A2FF

0318: 1C89
031A: EF1C
031C: 0700
031E: 6758

0320: 1009
0322: AF1D
0324: CF00
0326: 0974

0328: 1108
032A: AC0D
032C: 17AE
032E: 840F

0330: FC21
0332: CD1D
0334: 4D0E
0336: 8420

0338: 8C85
033A: 2F1D
033C: E7FE
033E: 086B

0340: 2E27
0342: 2F1D
0344: 9700
0346: A867

0348: 1E1B
034A: 2F1D
034C: 0700
034E: 840F

0350: 14F8
0352: 2F1D
0354: 0700
0356: 6766

0358: FC41
035A: EF1D
035C: 0700
035E: 841F

0360: 0C83
0362: 2F1D
0364: 0400
0366: 9F0E

0368: 0CA7
036A: EC1E
036C: 0700
036E: 8410

0370: 1C48
0372: AF05
0374: 0700
0376: A271

0378: 1C8E
037A: AF11
037C: 0700
037E: 840F

0380: 1CF8
0382: 2F1D
0384: 0700
0386: 62FF

0388: 1C8E
038A: AF11
038C: 0700
038E: 840F

0390: 1C50
0392: 2F0D
0394: 0701
0396: 62FF

0398: 1009
039A: EF1D
039C: 4D0E
039E: 0974

03A0: FC61
03A2: EF1D
03A4: C400
03A6: 8480

03A8: 1CF8
03AA: 301D
03AC: 07F0
03AE: 840F

03B0: 1CF8
03B2: 2C1D
03B4: 4D0E
03B6: 8480

03B8: 0001
03BA: EF1D
03BC: 0040
03BE: 840F

03C0: 0CCD
03C2: 6A1D
03C4: E77E
03C6: 840F

03C8: 1CF8
03CA: 3F1D
03CC: 0701
03CE: A2FF

03D0: 4083
03D2: 0F1D
03D4: 0700
03D6: 840F

03D8: 1CF8
03DA: 2F1D
03DC: 0700
03DE: 62FF

03E0: FC81
03E2: EF1D
03E4: CD00
03E6: 843F

03E8: FC01
03EA: EA1D
03EC: 2F00
03EE: 840F

03F0: 1C29
03F2: EF1D
03F4: 0700
03F6: 0889

03F8: 1CE5
03FA: AE1D
03FC: 0700
03FE: 0888

0400: F081
0402: EF1D
0404: 0710
0406: 8437

0408: F1F8
040A: 2A1D
040C: 0710
040E: 840C

0410: 10ED
0412: 4D1D
0414: 0700
0416: 08F0

0418: 1C29
041A: EF1D
041C: 0700
041E: 0889

0420: 1CE5
0422: AE1D
0424: 0700
0426: 0888

0428: F080
042A: 2F1D
042C: 0710
042E: 8402

0430: 1188
0432: 2F1D
0434: 0710
0436: 840F

0438: 1CF8
043A: 2F1D
043C: 0700
043E: 6282

0440: 1CF8
0442: 2D1D
0444: 0700
0446: 62FF

0448: FC41
044A: EF1D
044C: 07A0
044E: 8437

0450: 1CF8
0452: 2C9D
0454: 02A0
0456: 840B

0458: 1CEE
045A: 2E9D
045C: 2200
045E: 688B

0460: 1089
0462: EF1D
0464: CF10
0466: 840F

0468: 1C88
046A: AF0D
046C: 07A0
046E: 9F02

0470: 1288
0472: 8F0D
0474: 17AE
0476: 840F

0478: 1609
047A: AF1D
047C: 9710
047E: A88F

0480: 17DF
0482: 0F0D
0484: 0710
0486: 0974

0488: F681
048A: 6F1D
048C: 0710
048E: 84AA

0490: 1189
0492: EF1D
0494: 0710
0496: 0976

0498: 10F8
049A: 2F1D
049C: 0700
049E: 08BC

04A0: 10F8
04A2: 2F1D
04A4: 0700
04A6: 08BC

04A8: F681
04AA: 6F1D
04AC: 0710
04AE: 84AA

04B0: F181
04B2: 6F1D
04B4: 0710
04B6: 8455

04B8: F180
04BA: 2F15
04BC: 0710
04BE: 8450

04C0: 1CF8
04C2: 2F1D
04C4: 0700
04C6: 0976

04C8: 1089
04CA: CF1E
04CC: 0700
04CE: 08BC

04D0: F680
04D2: 2F11
04D4: 0710
04D6: 8455

04D8: F181
04DA: 6F1D
04DC: 0710
04DE: 84AA

04E0: F180
04E2: 2F15
04E4: 0710
04E6: 84A0

04E8: 1CF8
04EA: 2F1D
04EC: 0700
04EE: 0976

04F0: 10F8
04F2: 2F1D
04F4: 0700
04F6: 08BC

04F8: F7E0
04FA: 2F1D
04FC: 0700
04FE: 8401

0500: 1788
0502: 2F1D
0504: 0710
0506: A295

0508: 17DB
050A: 8F0D
050C: 0710
050E: 08BE

0510: 1108
0512: AF36
0514: 0700
0516: 08B8

0518: 1CE5
051A: AE1D
051C: 0700
051E: 08B7

0520: 1CF8
0522: 2F1D
0524: 0700
0526: 08B8

0528: 1CF8
052A: 2F1D
052C: 0700
052E: 08B5

0530: FC01
0532: 6E1D
0534: 0700
0536: 840A

0538: 1CE5
053A: AD1D
053C: 0700
053E: 08B7

0540: 1C08
0542: EF19
0544: 0700
0546: 08B8

0548: 1CE5
054A: AE1D
054C: 0700
054E: 08B7

0550: 1CF8
0552: 2F1D
0554: 0700
0556: 08B8

0558: 1CF8
055A: 2F1D
055C: 0700
055E: 08B5

0560: FC01
0562: 6E1D
0564: 0700
0566: 8405

0568: 1CE5
056A: AD1D
056C: 0700
056E: 08B7

0570: F7E0
0572: 2F1D
0574: 0700
0576: 8400

0578: 1788
057A: 2F1D
057C: 6710
057E: A2A2

0580: 1CF8
0582: 2F1D
0584: 0700
0586: 08B8

0588: FCE5
058A: 2E1D
058C: 0700
058E: 8455

0590: 1CF8
0592: 2F1D
0594: 0700
0596: A2FF

0598: 1CF8
059A: 2F1D
059C: 0700
059E: 08BE

05A0: 1CF8
05A2: 2F1D
05A4: 6F01
05A6: 6CB0

05A8: FC01
05AA: EF1D
05AC: 0700
05AE: 840F

05B0: 1CAA
05B2: 6F1D
05B4: 0700
05B6: 640F

05B8: 1CF8
05BA: 2D1D
05BC: 0700
05BE: 62FF

05C0: 1CF8
05C2: 2F1D
05C4: 0700
05C6: 08BE

05C8: FC41
05CA: EA1D
05CC: 07A0
05CE: 845F

05D0: 1C8F
05D2: AF9D
05D4: 0500
05D6: 840F

05D8: 1CEE
05DA: 2E9D
05DC: 2200
05DE: 68BB

05E0: 16F8
05E2: 2F1D
05E4: 0600
05E6: 840F

05E8: 1CF8
05EA: 2F1D
05EC: 2F0E
05EE: 640F

05F0: FC81
05F2: EF1D
05F4: 0500
05F6: 845F

05F8: 1CF8
05FA: 2F1D
05FC: 2F00
05FE: 640F

0600: F181
0602: EF1D
0604: CF10
0606: 847F

0608: F281
060A: EF1D
060C: 0710
060E: 8459

0610: F381
0612: EF1D
0614: 0710
0616: 8455

0618: F481
061A: EF1D
061C: 0710
061E: 8453

0620: F581
0622: EF1D
0624: 0710
0626: 8451

0628: F681
062A: EF1D
062C: 0710
062E: 844D

0630: F781
0632: EF1D
0634: 0710
0636: 8433

0638: FC81
063A: 6F1E
063C: 6F00
063E: 8440

0640: 1CF8
0642: 2F19
0644: 0700
0646: 9F02

0648: 12F8
064A: 2F1D
064C: 0700
064E: 08F1

0650: 13F8
0652: 2F1D
0654: 0700
0656: 08F0

0658: 1388
065A: AF1E
065C: 0700
065E: 840F

0660: F000
0662: 6F11
0664: 0710
0666: 8455

0668: 14F8
066A: 2F1D
066C: 0700
066E: 08F0

0670: 15F8
0672: 2F1D
0674: 0700
0676: 08F0

0678: 16F8
067A: 2F1D
067C: 0700
067E: 08F1

0680: 1C89
0682: AF1D
0684: 0400
0686: 840F

0688: 1CF8
068A: 371D
068C: 0700
068E: 08E7

0690: 10F8
0692: 2F1D
0694: 0600
0696: 840F

0698: 1CF8
069A: 371D
069C: 0700
069E: 08E5

06A0: 15F8
06A2: 2F1D
06A4: 0700
06A6: 08F1

06A8: 10F8
06AA: 2F1D
06AC: 0600
06AE: 840F

06B0: 1C89
06B2: F71F
06B4: 0700
06B6: 08E5

06B8: 14F8
06BA: 2F1D
06BC: 0700
06BE: 08F1

06C0: 10F8
06C2: 2F1D
06C4: 0600
06C6: 840F

06C8: 1CF8
06CA: 371D
06CC: 0700
06CE: 08E5

06D0: 15F8
06D2: 2F1D
06D4: 0700
06D6: 08F0

06D8: 10F8
06DA: 2F1D
06DC: 0600
06DE: 840F

06E0: 1CF8
06E2: 3F1D
06E4: 0700
06E6: 08E5

06E8: 1C9D
06EA: 4F1D
06EC: 0700
06EE: 840F

06F0: 1CF8
06F2: 2F1D
06F4: 0700
06F6: A2E0

06F8: 1088
06FA: CF1D
06FC: 0711
06FE: 28CD

0700: 1CF8
0702: 2F1D
0704: 0700
0706: 6CE1

0708: FC81
070A: 6F1E
070C: 6700
070E: 84C0

0710: 1CF8
0712: 2F19
0714: 0700
0716: 9F02

0718: 13F8
071A: 2F1D
071C: 0700
071E: 08F1

0720: 1CF8
0722: 2F1D
0724: 0701
0726: 28CB

0728: 1C29
072A: AF1D
072C: 0700
072E: 08EE

0730: 1C2D
0732: 4F1D
0734: 0700
0736: 08B7

0738: 17F8
073A: 2F1D
073C: 0600
073E: 08F0

0740: 1C29
0742: EF1D
0744: 0700
0746: 08EE

0748: 1C2D
074A: CF1D
074C: 0700
074E: 08B7

0750: 1028
0752: AC1D
0754: 07A0
0756: 840F

0758: FC41
075A: EF1D
075C: 0700
075E: 847F

0760: 1C8F
0762: AF9D
0764: 0500
0766: 840F

0768: 1CEE
076A: AE9D
076C: 2A00
076E: 68ED

0770: 17F8
0772: 2F1D
0774: 0700
0776: 840F

0778: 1CEE
077A: 2F1D
077C: 2700
077E: 640F

0780: 1C89
0782: EF1D
0784: 2F00
0786: 640F

0788: 1C89
078A: AF1D
078C: 2F00
078E: 640F

0790: 1C89
0792: AF1D
0794: 07A0
0796: 840F

0798: FC41
079A: EF1D
079C: 0500
079E: 843F

07A0: 1C57
07A2: 2F0D
07A4: 2D00
07A6: 68F4

07A8: 1CF8
07AA: 2F1D
07AC: 0701
07AE: 28FF

07B0: 1CF8
07B2: 2F1D
07B4: 0701
07B6: 28FF

07B8: 1CF8
07BA: 2F1D
07BC: 0701
07BE: 28FF

07C0: 1CF8
07C2: 2F1D
07C4: 0701
07C6: 28FF

07C8: 1CF8
07CA: 2F1D
07CC: 0701
07CE: 28FF

07D0: 1CF8
07D2: 2F1D
07D4: 0701
07D6: 28FF

07D8: 1CF8
07DA: 2F1D
07DC: 0701
07DE: 28FF

07E0: 1CF8
07E2: 2F1D
07E4: 0701
07E6: 28FF

07E8: 1CF8
07EA: 2F1D
07EC: 0701
07EE: 28FF

07F0: 1CF8
07F2: 2F1D
07F4: 0701
07F6: 28FF

07F8: 1CF8
07FA: 2F1D
07FC: 0700
07FE: E4FF

0800: 1B08
0802: 8F0D
0804: CF10
0806: 0974

0808: 1B88
080A: AF15
080C: 0710
080E: 08F2

0810: 1B88
0812: AC1D
0814: 07F0
0816: 8408

0818: 0BB4
081A: 2F1D
081C: 0711
081E: 7804

0820: 1C89
0822: AF1D
0824: 07A0
0826: 094A

0828: 1CF8
082A: 2F1D
082C: 0700
082E: 0947

0830: 10F8
0832: 2F1D
0834: 0700
0836: 0976

0838: 10F8
083A: 2F1D
083C: 0700
083E: 097A

0840: 10F8
0842: 2F1D
0844: 0700
0846: 097E

08A8: 10F8
084A: 2F1D
084C: 0700
084E: 0981

0850: 1CF8
0852: 2F1D
0854: 0700
0856: 0947

0858: FBA4
085A: EF1D
085C: 0700
085E: 84FF

0860: 1B91
0862: 2F1D
0864: 0711
0866: A21C

0868: 1C90
086A: 2F0D
086C: 0710
086E: 093E

0870: 1C88
0872: AC1D
0874: 07F0
0876: 8450

0878: 0CF8
087A: 2A1D
087C: 0791
087E: A21A

0880: 1C91
0882: 2F1D
0884: 0710
0886: 091D

0888: 1A89
088A: EF1D
088C: 0710
088E: 840F

0890: 1A08
0892: AF1D
0894: 0700
0896: 094F

0898: 1A08
089A: AF1D
089C: 0700
089E: 092A

08A0: 1CF8
08A2: 2F1D
08A4: 0700
08A6: 095F

08A8: 10F8
08AA: 2F1D
08AC: 0700
08AE: 096B

08B0: 1CF8
08B2: 2F1D
08B4: 0700
08B6: 094C

08B8: 1CF8
08BA: 2F1D
08BC: 8F00
08BE: A912

08C0: 1CF8
08C2: 2F1D
08C4: 0700
08C6: 0942

08C8: 10F8
08CA: 2F1D
08CC: 0701
08CE: 290E

08D0: 1CF8
08D2: 2F1D
08D4: 0700
08D6: 0934

08D8: 10F8
08DA: 2F1D
08DC: 0701
08DE: 290B

08E0: 1B89
08E2: EF1D
08E4: 0721
08E6: 2902

08E8: 10F8
08EA: 2F1D
08EC: 0700
08EE: 0947

08F0: 1B28
08F2: AF25
08F4: 0700
08F6: 840F

08F8: 1B91
08FA: 2F25
08FC: 0700
08FE: A222

0900: 10F8
0902: 2F1D
0904: 0700
0906: 0976

0908: 1CF8
090A: 2F1D
090C: 0701
090E: 2947

0910: 1C95
0912: 4F0D
0914: 0700
0916: A225

0918: 10F8
091A: 2F1D
091C: 0700
091E: 097A

0920: 1CF8
0922: 2F1D
0924: 0701
0926: 2947

0928: 1C95
092A: 6F0D
092C: 0700
092E: A228

0930: 10F8
0932: 2F1D
0934: 0700
0936: 097E

0938: 1CF8
093A: 2F1D
093C: 0701
093E: 2947

0940: 10F8
0942: 2F1D
0944: 0700
0946: 0981

0948: 1CF8
094A: 2F1D
094C: 0701
094E: 2947

0950: 1B28
0952: AC25
0954: DFF0
0956: 8480

0958: 1C8D
095A: 2F1D
095C: 0700
095E: A22F

0960: 1C89
0962: EF05
0964: 0700
0966: 9F02

0968: 1CF8
096A: 2D1D
096C: 0400
096E: 840F

0970: 1CF8
0972: 2F1D
0974: 2F0E
0976: 640F

0978: 1C95
097A: 4F0D
097C: 0700
097E: A232

0980: 0C81
0982: 6F05
0984: 0700
0986: 9F02

0988: 1CF8
098A: 2D1D
098C: 0401
098E: 292E

0990: 1CF8
0992: 2D1D
0994: 4C01
0996: A22E

0998: 1CF8
099A: 2F1D
099C: DF0F
099E: 2931

09A0: 10F8
09A2: 2F1D
09A4: 0700
09A6: 840F

09A8: 1228
09AA: AF1D
09AC: 0700
09AE: 840F

09B0: 10F8
09B2: 2E1D
09B4: 0710
09B6: 840F

09B8: 1428
09BA: AF1D
09BC: 0700
09BE: 840F

09C0: 12F8
09C2: 2E1D
09C4: 0710
09C6: 840F

09C8: 1491
09CA: 6C1E
09CC: 0700
09CE: 8411

09D0: 1491
09D2: 6F1D
09D4: 0701
09D6: A23D

09D8: 1490
09DA: 2F1D
09DC: 0710
09DE: 613C

09E0: 1489
09E2: AF1D
09E4: 0710
09E6: 640F

09E8: 1488
09EA: AF39
09EC: 0710
09EE: 640F

09F0: 11F8
09F2: 2C1E
09F4: 17AE
09F6: 8411

09F8: 1E28
09FA: AF39
09FC: 0710
09FE: 840F

0A00: 1EF8
0A02: 2F1D
0A04: 0700
0A06: 840F

0A08: 2625
0A0A: 2F1D
0A0C: 9710
0A0E: 6840

0A10: 1188
0A12: AF0D
0A14: 17AE
0A16: 840F

0A18: 1C28
0A1A: AF1D
0A1C: 0700
0A1E: 840F

0A20: 1CEE
0A22: 8F1D
0A24: 0700
0A26: 840F

0A28: 1EF8
0A2A: 2E1D
0A2C: 0710
0A2E: 840F

0A30: 1EF8
0A32: 2F1D
0A34: 9700
0A36: 6843

0A38: 1088
0A3A: AF0D
0A3C: 17AE
0A3E: 840F

0A40: 1E88
0A42: EF1D
0A44: 0710
0A46: 840F

0A48: 16F8
0A4A: 2F1D
0A4C: 9700
0A4E: 6848

0A50: 10F8
0A52: 2C1D
0A54: 17AE
0A56: 8405

0A58: 1689
0A5A: EF1D
0A5C: 9710
0A5E: 684B

0A60: 1A91
0A62: 6C1E
0A64: 0700
0A66: 840A

0A68: 1A90
0A6A: 2F1D
0A6C: 0711
0A6E: 624E

0A70: FA80
0A72: 2F11
0A74: 0710
0A76: 64A1

0A78: 1C2B
0A7A: AC1E
0A7C: 0780
0A7E: 84E0

0A80: 1C48
0A82: AC29
0A84: 07A0
0A86: 8404

0A88: 1CAB
0A8A: CF1D
0A8C: 0700
0A8E: 840F

0A90: 1EE6
0A92: AF1D
0A94: 0700
0A96: 840F

0A98: 1EF8
0A9A: 2F1D
0A9C: 0700
0A9E: A059

0AA0: 1EE6
0AA2: AF1D
0AA4: 0700
0AA6: 840F

0AA8: 1EF8
0AAA: 2F1D
0AAC: 0700
0AAE: A059

0AB0: 1EE6
0AB2: AF1D
0AB4: 0700
0AB6: 840F

0AB8: 1EF8
0ABA: 2F1D
0ABC: 0700
0ABE: A059

0AC0: 10F8
0AC2: 2F1D
0AC4: 6700
0AC6: 640F

0AC8: 1F29
0ACA: EE1D
0ACC: 6FD0
0ACE: 840F

0AD0: FCA1
0AD4: 4F1D
0AD4: 0700
0AD6: 8401

0AD8: 1CEF
0ADA: AF1D
0ADC: 9701
0ADE: E85C

0AE0: 1018
0AE2: 2F1D
0AE4: 0700
0AE6: 840F

0AE8: 16F8
0AEA: 2D1D
0AEC: 0710
0AEE: 840F

0AF0: 17F8
0AF2: 2E1D
0AF4: 0710
0AF6: 640F

0AF8: FC61
0AFA: CF1D
0AFC: 0500
0AFE: 8460

0B00: 1C89
0B02: EF1D
0B04: 28A0
0B06: 840F

0B08: 1CF8
0B0A: 2F9D
0B0C: 2800
0B0E: 840F

0B10: 1CEE
0B12: 2E9D
0B14: 2001
0B16: E863

0B18: FC61
0B1A: CE1D
0B1C: 07D0
0B1E: 8460

0B20: 1C89
0B22: EF1D
0B24: 00A0
0B26: 840F

0B28: 1CF8
0B2A: 2F9D
0B2C: 2800
0B2E: 840F

0B30: 1CEE
0B32: 2E9D
0B34: 2001
0B36: E867

0B38: 1091
0B3A: 4F0D
0B3C: 07A0
0B3E: 840F

0B40: 1CEF
0B42: AF1D
0B44: 9701
0B46: E869

0B48: 18F8
0B4A: 2D1D
0B4C: 0710
0B4E: 840F

0B50: 19F8
0B52: 2E1D
0B54: 0710
0B56: 640F

0B58: 1928
0B5A: AC1D
0B5C: 07D0
0B5E: 8480

0B60: 1CAE
0B62: EE1D
0B64: 07D1
0B66: AC73

0B68: 1728
0B6A: AF1D
0B6C: 0700
0B6E: A2FE

0B70: 1CCA
0B72: 2C1E
0B74: 0700
0B76: 84F0

0B78: 2CA4
0B7A: EF11
0B7C: 0700
0B7E: 840F

0B80: 1628
0B82: AF1D
0B84: 0700
0B86: A2FE

0B88: 28E0
0B8A: 2F1D
0B8C: 0700
0B8E: 840F

0B90: 1CF8
0B92: 2F1D
0B94: 0700
0B96: 62FE

0B98: 1728
0B9A: AF1D
0B9C: 0701
0B9E: 62FE

0BA0: FC81
0BA2: EF1D
0BA4: 0500
0BA6: 8459

0BA8: 1CF8
0BAA: 2D1D
0BAC: 2F00
0BAE: 640F

0BB0: 1C89
0BB2: EF1C
0BB4: E70E
0BB6: 840F

0BB8: 1FF8
0BBA: 2C1F
0BBC: 17AE
0BBE: 8406

0BC0: 1EF8
0BC2: 2F1D
0BC4: EF0E
0BC6: 840F

0BC8: 14F8
0BCA: 2F1D
0BCC: 0600
0BCE: 6878

0BD0: 1CF8
0BD2: 2C1C
0BD4: 0700
0BD6: 8410

0BD8: 1FF8
0BDA: 2C1F
0BDC: 17AE
0BDE: 8406

0BE0: 1EF8
0BE2: 2F1D
0BE4: EF0E
0BE6: 840F

0BE8: 14F8
0BEA: 2F1D
0BEC: 0600
0BEE: 687C

0BF0: 1FF8
0BF2: 2C1F
0BF4: 17AE
0BF6: 8406

0BF8: 1EF8
0BFA: 2F1D
0BFC: F70E
0BFE: 840F

0C00: 14F8
0C02: 2F1D
0C04: 0600
0C06: 687F

0C08: 1FF8
0C0A: 2C1F
0C0C: 17AE
0C0E: 8406

0C10: 1EF8
0C12: 2F1D
0C14: FF0E
0C16: 840F

0C18: 14F8
0C1A: 2F1D
0C1C: 0600
0C1E: 6882

0C20: 1C89
0C22: EF1D
0C24: C780
0C26: 840F

0C28: 46F8
0C2A: 2F1D
0C2C: 0700
0C2E: AA85

0C30: 10F8
0C32: 2C1E
0C34: 0710
0C36: 8408

0C38: FC80
0C3A: 2F11
0C3C: 97FE
0C3E: 8411

0C40: F1EC
0C42: 4F1D
0C44: 0710
0C46: 8480

0C48: 1CF8
0C4A: 2C1E
0C4C: 0700
0C4E: 8420

0C50: 0008
0C52: AF11
0C54: 0740
0C56: 840F

0C58: 0109
0C5A: ED1D
0C5C: 0740
0C5E: 840F

0C60: 0F89
0C62: AF1D
0C64: 0740
0C66: 840F

0C68: 0989
0C6A: AF1D
0C6C: 0740
0C6E: 840F

0C70: 10F8
0C72: 291F
0C74: 7F00
0C76: 29BD

0C78: 10F8
0C7A: 291D
0C7C: 0700
0C7E: 840F

0C80: 10F8
0C82: 291D
0C84: 0700
0C86: 29BD

0C88: 1089
0C8A: AF1D
0C8C: 07A0
0C8E: 29BB

0C90: 13F8
0C92: 2D1D
0C94: 170E
0C96: 29BF

0C98: 1C88
0C9A: 8F0D
0C9C: 0780
0C9E: 29BF

0CA0: 1089
0CA2: AF1D
0CA4: 07A0
0CA6: 29BB

0CA8: 13F8
0CAA: 2D1D
0CAC: 170E
0CAE: 29BF

0CB0: 1089
0CB2: AF1D
0CB4: 07A0
0CB6: 29BB

0CB8: 13F8
0CBA: 2D1D
0CBC: 170E
0CBE: 29BF

0CC0: 10F8
0CC2: 2F1D
0CC4: 0700
0CC6: 840F

0CC8: 4981
0CCA: 6F1D
0CCC: 0700
0CCE: 840F

0CD0: 4F81
0CD2: 6F1D
0CD4: 0701
0CD6: A2B1

0CD8: 10F8
0CDA: 291D
0CDC: 0701
0CDE: A2A8

0CE0: 4080
0CE2: 2F1F
0CE4: 0740
0CE6: BA90

0CE8: 1CF8
0CEA: 2F1D
0CEC: 7700
0CEE: AD90

0CF0: 4120
0CF2: 2F1D
0CF4: 0740
0CF6: 840F

0CF8: 00F8
0CFA: 2E1D
0CFC: 0740
0CFE: A78E

0D00: 1CF8
0D02: 2C1E
0D04: 0700
0D06: 8410

0D08: 0088
0D0A: AF11
0D0C: 0740
0D0E: 840F

0D10: F0EC
0D12: 4F1D
0D14: 0710
0D16: 8480

0D18: 1CF8
0D1A: 2C1E
0D1C: 0700
0D1E: 8404

0D20: 0188
0D22: AF11
0D24: 0740
0D26: 840F

0D28: 02F8
0D2A: 2C1D
0D2C: 0740
0D2E: 8410

0D30: 1CF8
0D32: 2F0D
0D34: 0700
0D36: 9F02

0D38: 0FF8
0D3A: 2F1D
0D3C: 0741
0D3E: 298E

0D40: 4180
0D42: 2F05
0D44: 0700
0D46: 9F02

0D48: 40F8
0D4A: 2A1D
0D4C: 0700
0D4E: A790

0D50: 4080
0D52: 2F1D
0D54: 0740
0D56: 840F

0D58: 4281
0D5A: 2F1D
0D5C: 0740
0D5E: 840F

0D60: 1CF8
0D62: 2F1D
0D64: 0700
0D66: A2A6

0D68: 09F8
0D6A: 2F1D
0D6C: 0740
0D6E: 840F

0D70: 10F8
0D72: 2C1D
0D74: 0710
0D76: 8408

0D78: 1CF8
0D7A: 2C1E
0D7C: 0700
0D7E: 8402

0D80: 0088
0D82: AF11
0D84: 0741
0D86: 298E

0D88: 4080
0D8A: 2F1E
0D8C: 0740
0D8E: 840F

0D90: FCE0
0D92: 2F11
0D94: 0700
0D96: 840C

0D98: 1CF8
0D9A: 2F1D
0D9C: 0700
0D9E: A28E

0DA0: 10F8
0DA2: 2C1E
0DA4: 0700
0DA6: 8408

0DA8: 1388
0DAA: 2F11
0DAC: 177E
0DAE: 29C0

0DB0: 10F8
0DB2: 2F1D
0DB4: 0701
0DB6: 09B7

0DB8: 1CF8
0DBA: 2F1D
0DBC: 0701
0DBE: 09B8

0DC0: 17E0
0DC2: AD1D
0DC4: 0701
0DC6: 09B9

0DC8: 1CF8
0DCA: 2F1D
0DCC: 0700
0DCE: A2FE

0DD0: 1C88
0DD2: 2F1D
0DD4: 0701
0DD6: 2832

0DD8: 1328
0DDA: AC1D
0DDC: 07A0
0DDE: 840A

0DE0: 0CF0
0DE2: 6D1D
0DE4: 9700
0DE6: 68BC

0DE8: 1CF8
0DEA: 2F1C
0DEC: 4700
0DEE: 840F

0DF0: 13F8
0DF2: 2F1D
0DF4: 170E
0DF6: 840F

0DF8: 1EF8
0DFA: 2C1D
0DFC: EF11
0DFE: 120F

0E00: 0EF8
0E02: 2C1D
0E04: EF11
0E06: 140F

0E08: 1549
0E0A: EC1D
0E0C: CF10
0E0E: 8403

0E10: 1389
0E12: 6F1D
0E14: 0710
0E16: 840F

0E18: 1CF8
0E1A: 2C1E
0E1C: 0700
0E1E: 84FE

0E20: F280
0E22: 2F11
0E24: 0710
0E26: 84FF

0E28: 1C68
0E2A: AC0D
0E2C: 07B0
0E2E: 8420

0E30: 1C8F
0E32: AF1D
0E34: 0500
0E36: 840F

0E38: 1CF8
0E3A: 2F1D
0E3C: 2700
0E3E: 840F

0E40: 1CEF
0E42: 0F1D
0E44: 080E
0E46: A9C8

0E48: 17F8
0E4A: 2E1D
0E4C: 0710
0E4E: 840F

0E50: 13E0
0E52: AD1D
0E54: 0700
0E56: 840F

0E58: 1708
0E5A: AF1D
0E5C: 0700
0E5E: A2FE

0E60: 12E0
0E62: AD1D
0E64: 0700
0E66: 840F

0E68: 1308
0E6A: AF1D
0E6C: 0700
0E6E: A2FE

0E70: 1228
0E72: AF1D
0E74: 0700
0E76: 840F

0E78: 1CEF
0E7A: 8F1D
0E7C: 0700
0E7E: 840F

0E80: 13F8
0E82: 2D1D
0E84: 0710
0E86: 840F

0E88: 12F8
0E8A: 2E1D
0E8C: 0710
0E8E: 840F

0E90: FC47
0E92: 2F1D
0E94: 0700
0E96: 8420

0E98: 1597
0E9A: 4F15
0E9C: 0700
0E9E: 840F

0EA0: 1CF8
0EA2: 2F1D
0EA4: 0700
0EA6: A2C5

0EA8: F781
0EAA: 6F1D
0EAC: 0710
0EAE: 8420

0EB0: 1C49
0EB2: CC1E
0EB4: 0700
0EB6: 84A0

0EB8: FC61
0EBA: 6F1D
0EBC: 0700
0EBE: 8406

0EC0: 1C29
0EC2: 6C1D
0EC4: 07A0
0EC6: 8400

0EC8: 1C8F
0ECA: AF1D
0ECC: 0500
0ECE: 840F

0ED0: 1CF8
0ED2: 2E1D
0ED4: 2700
0ED6: 840F

0ED8: 1CEE
0EDA: 2E1D
0EDC: 080E
0EDE: A8DB

0EE0: 1C17
0EE2: 2F11
0EE4: 0700
0EE6: 840F

0EE8: 1CED
0EEA: 6F1D
0EEC: 0700
0EEE: 840F

0EF0: 1CE5
0EF2: AE1D
0EF4: 0700
0EF6: 840F

0EF8: 1C0F
0EFA: AF1D
0EFC: 0700
0EFE: A2FE

0F00: 1CED
0F02: 8F1D
0F04: 0700
0F06: 840F

0F08: 17E0
0F0A: AD15
0F0C: 0700
0F0E: 840F

0F10: 1C59
0F12: 6F1D
0F14: 0700
0F16: A2D7

0F18: 1629
0F1A: EC1D
0F1C: 0710
0F1E: 8480

0F20: 1608
0F22: EC15
0F24: 07A0
0F26: 8400

0F28: FC61
0F2A: 6F1D
0F2C: 0700
0F2E: 8406

0F30: FC41
0F32: EF1D
0F34: 0500
0F36: 8401

0F38: 1CF8
0F3A: 2F1D
0F3C: 2F00
0F3E: 840F

0F40: 1CEE
0F42: 2E1D
0F44: 080E
0F46: A8E8

0F48: 1CE5
0F4A: AE1D
0F4C: 0700
0F4E: AEFE

0F50: 1CF8
0F52: 2F1D
0F54: 0700
0F56: 62FE

0F58: F001
0F5A: EF1D
0F5C: CF00
0F5E: 845F

0F60: FC41
0F62: EA1D
0F64: 0710
0F66: 841F

0F68: 1BF8
0F6A: 2C1D
0F6C: 0710
0F6E: 8404

0F70: FA81
0F72: EF1D
0F74: 0710
0F76: 8456

0F78: 1C29
0F7A: 6C1D
0F7C: 07A0
0F7E: 8400

0F80: 1C8F
0F82: AF1D
0F84: 0500
0F86: 840F

0F88: 1BF8
0F8A: 2E1D
0F8C: 2F00
0F8E: 840F

0F90: 1BEE
0F92: 2E1D
0F94: 0E0E
0F96: A8F2

0F98: 1CE5
0F9A: AE1D
0F9C: 0700
0F9E: 840F

0FA0: 1AE0
0FA2: AD1D
0FA4: 0700
0FA6: A2FE

0FA8: 1C0B
0FAA: 8F9D
0FAC: 0700
0FAE: A2EF

0FB0: 1C29
0FB2: EF1D
0FB4: 07A0
0FB6: 840F

0FB8: 1BF8
0FBA: 2E1D
0FBC: 2600
0FBE: 840F

0FC0: 1BEE
0FC2: 2E1D
0FC4: 0E0F
0FC6: E8F9

0FC8: FC01
0FCA: EF1D
0FCC: 0700
0FCE: 84B0

0FD0: 1CE5
0FD2: AE1D
0FD4: 0700
0FD6: 840F

0FD8: 1CF8
0FDA: 2F1D
0FDC: 0700
0FDE: 62FE

0FE0: 1CF8
0FE2: 2F1D
0FE4: 0701
0FE6: 29FE

0FE8: 1CF8
0FEA: 2F1D
0FEC: 0701
0FEE: 29FE

0FF0: 1CF8
0FF2: 2F1D
0FF4: 0700
0FF6: E4FE

0FF8: AAAA
0FFA: 5555
0FFC: 00AA
0FFE: E3C8

