diff --git a/.gitattributes b/.gitattributes index dfe0770..fc82f82 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,7 @@ # Auto detect text files and perform LF normalization * text=auto + +# These are all binary - .asm and .hex files must have 0x1A EOF marker at the end. +*.asm binary +*.bin binary +*.hex binary diff --git a/README.md b/README.md index 7ecfa47..c1675ea 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,163 @@ -# SCP-8086-Monitor - Collection of Seattle Computer Products 8086 Monitor ROM +# SCP 8086 Monitor + All known and available revisions of the Seattle Computer Products 8086 Monitor ROM. This monitor was written by Tim Paterson, for the SCP 8086 CPU Support Card, and was later turned into the 86-DOS/MS-DOS/PC-DOS DEBUG utility. Version 1.9 is required for booting MS-DOS 2.0 from hard drive. + +## Download + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersionRevisionSource CodeCromemco 4FDCCromemco 16FDCNorthStar SDSCP Disk MasterTarbell DDTarbell SD
1.41980-02-18 + +[ASM](./files/MON_1.4_1980-02-18.ASM) + +[BIN](./files/MON_1.4_1980-02-18_CROMEMCO4FDC.BIN)/[HEX](./files/MON_1.4_1980-02-18_CROMEMCO4FDC.HEX)N/A + +[BIN](./files/MON_1.4_1980-02-18_NORTHSTAR.BIN)/[HEX](./files/MON_1.4_1980-02-18_NORTHSTAR.HEX)N/A + +[BIN](./files/MON_1.4_1980-02-18_TARBELL.BIN)/[HEX](./files/MON_1.4_1980-02-18_TARBELL.HEX)
1.51980-04-24 + +[ASM](./files/MON_1.5_1980-04-24.ASM) + +[BIN](./files/MON_1.5_1980-04-24_CROMEMCO4FDC.BIN)/[HEX](./files/MON_1.5_1980-04-24_CROMEMCO4FDC.HEX) + +[BIN](./files/MON_1.5_1980-04-24_NORTHSTAR.BIN)/[HEX](./files/MON_1.5_1980-04-24_NORTHSTAR.HEX) + +[BIN](./files/MON_1.5_1980-04-24_TARBELL.BIN)/[HEX](./files/MON_1.5_1980-04-24_TARBELL.HEX)
1981-05-26 + +[ASM](./files/MON_1.5_1981-05-26.ASM) + +[BIN](./files/MON_1.5_1981-05-26_CROMEMCO4FDC.BIN)/[HEX](./files/MON_1.5_1981-05-26_CROMEMCO4FDC.HEX) + +[BIN](./files/MON_1.5_1981-05-26_NORTHSTAR.BIN)/[HEX](./files/MON_1.5_1981-05-26_NORTHSTAR.HEX) + +[BIN](./files/MON_1.5_1981-05-26_TARBELL.BIN)/[HEX](./files/MON_1.5_1981-05-26_TARBELL.HEX)
1982-03-19 + +[ASM](./files/MON_1.5_1982-03-19.ASM) + +[BIN](./files/MON_1.5_1982-03-19_CROMEMCO4FDC.BIN)/[HEX](./files/MON_1.5_1982-03-19_CROMEMCO4FDC.HEX) + +[BIN](./files/MON_1.5_1982-03-19_CROMEMCO16FDC.BIN)/[HEX](./files/MON_1.5_1982-03-19_CROMEMCO16FDC.HEX) + +[BIN](./files/MON_1.5_1982-03-19_NORTHSTAR.BIN)/[HEX](./files/MON_1.5_1982-03-19_NORTHSTAR.HEX) + +[BIN](./files/MON_1.5_1982-03-19_SCPDISKMASTER.BIN)/[HEX](./files/MON_1.5_1982-03-19_SCPDISKMASTER.HEX) + +[BIN](./files/MON_1.5_1982-03-19_TARBELLDD.BIN)/[HEX](./files/MON_1.5_1982-03-19_TARBELLDD.HEX) + +[BIN](./files/MON_1.5_1982-03-19_TARBELLSD.BIN)/[HEX](./files/MON_1.5_1982-03-19_TARBELLSD.HEX)
1982-06-10 + +[ASM](./files/MON_1.5_1982-06-10.ASM) + +[BIN](./files/MON_1.5_1982-06-10_CROMEMCO4FDC.BIN)/[HEX](./files/MON_1.5_1982-06-10_CROMEMCO4FDC.HEX) + +[BIN](./files/MON_1.5_1982-06-10_CROMEMCO16FDC.BIN)/[HEX](./files/MON_1.5_1982-06-10_CROMEMCO16FDC.HEX) + +[BIN](./files/MON_1.5_1982-06-10_NORTHSTAR.BIN)/[HEX](./files/MON_1.5_1982-06-10_NORTHSTAR.HEX) + +[BIN](./files/MON_1.5_1982-06-10_SCPDISKMASTER.BIN)/[HEX](./files/MON_1.5_1982-06-10_SCPDISKMASTER.HEX) + +[BIN](./files/MON_1.5_1982-06-10_TARBELLDD.BIN)/[HEX](./files/MON_1.5_1982-06-10_TARBELLDD.HEX) + +[BIN](./files/MON_1.5_1982-06-10_TARBELLSD.BIN)/[HEX](./files/MON_1.5_1982-06-10_TARBELLSD.HEX)
1.61982-??-?? + +[ASM](./files/MON_1.6_1982_XX-XX.ASM)\*N/A + +[BIN](./files/MON_1.6_1982_XX-XX_SCPDISKMASTER.BIN)\*/[HEX](./files/MON_1.6_1982_XX-XX_SCPDISKMASTER.HEX)\* + +[BIN](./files/MON_1.6_1982_XX-XX_TARBELLDD.BIN)/[HEX](./files/MON_1.6_1982_XX-XX_TARBELLDD.HEX)N/A
1.91983-08-04 + +[ASM](./files/MON_1.9_1983_08_04.ASM) + +[BIN](./files/MON_1.9_1983_08_04_SCPDISKMASTER.BIN)/[HEX](./files/MON_1.9_1983_08_04_SCPDISKMASTER.HEX) + +[BIN](./files/MON_1.9_1983_08_04_TARBELLDD.BIN)/[HEX](./files/MON_1.9_1983_08_04_TARBELLDD.HEX)
+ +*Reconstructed based on existing binary. diff --git a/SCP 8086 Monitor Collection.html b/SCP 8086 Monitor Collection.html new file mode 100644 index 0000000..5e6e113 --- /dev/null +++ b/SCP 8086 Monitor Collection.html @@ -0,0 +1,627 @@ + + + + + + SCP 8086 Monitor Collection + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ + Version + + +

+
+

+ + Revision + + +

+
+

+ + Source Code + + +

+
+

+ + Cromemco 4FDC + + +

+
+

+ + Cromemco 16FDC + + +

+
+

+ + NorthStar SD + + +

+
+

+ + SCP Disk Master + + +

+
+

+ + Tarbell DD + + +

+
+

+ + Tarbell SD + + +

+
+

+ + 1.4 + + +

+
+

+ + 1980-02-18 + + +

+
+

+ + ASM + + +

+
+

+ + BIN/HEX + + +

+
+

+ + N/A + + +

+
+

+ + BIN/HEX + + +

+
+

+ + N/A + + +

+
+

+ + BIN/HEX + + +

+
+

+ + 1.5 + + +

+
+

+ + 1980-04-24 + + +

+
+

+ + ASM + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + 1981-05-26 + + +

+
+

+ + ASM + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + 1982-03-19 + + +

+
+

+ + ASM + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + 1982-06-10 + + +

+
+

+ + ASM + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+ + 1.6 + + +

+
+

+ + 1982-??-?? + + +

+
+

+ + ASM* + + +

+
+

+ + N/A + + +

+
+

+ + BIN*/HEX* + + +

+
+

+ + BIN/HEX + + +

+
+

+ + N/A + + +

+
+

+ + 1.9 + + +

+
+

+ + 1983-08-04 + + +

+
+

+ + ASM + + +

+
+

+ + BIN/HEX + + +

+
+

+ + BIN/HEX + + +

+
+

+   +

+

*Reconstructed based on existing binary.

+
+ + \ No newline at end of file diff --git a/files/MON_1.4_1980-02-18.ASM b/files/MON_1.4_1980-02-18.ASM new file mode 100644 index 0000000..8d1d1c1 --- /dev/null +++ b/files/MON_1.4_1980-02-18.ASM @@ -0,0 +1,1592 @@ +; Seattle Computer Products 8086 Monitor version 1.4 2/18/80 +; by Tim Paterson +; This software is not copyrighted. + + +;To select a disk boot, set one of the following equates +;to 1, the rest to 0. + +CROMEMCO4FDC: EQU 1 ;1 for 4FDC, 0 for others +NORTHSTARSD: EQU 0 ;North Star single density? +TARBELL: EQU 0 ;Tarbell (single or double)? +OTHER: EQU 0 ;User-defined disk + +PUTBASE:EQU 100H +LOAD: EQU 200H + ORG 7F0H + PUT PUTBASE+7F0H + JMP 0,0FF80H ;Power-on jump to monitor + +;Baud Rate Table. The 9513 divides 2MHz by these values. +;They are for 9600, 1200, 300, 150, 110 baud + +BAUD: DW 13,104,416,832,1144 + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU BPMAX+BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 800H ;-0FF800H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 + +;Start of Monitor code + + ORG 0 + PUT PUTBASE + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV DI,AXSAVE + MOV CX,14 + REP + STOW ;Set register images to zero + OR B,[FSAVE+1],2 ;Enable interrupts + MOV CL,4 + MOV AL,40H + MOV DI,DSSAVE + REP + STOW ;Set segment reg. images to 40H + MOV B [SPSAVE+1],0CH ;Set user stack to 400H+0C00H + MOV SP,STACK +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + MOV AL,0F3H + OUT BASE+4 ;Low byte of Master Mode + MOV AX,584H ;Output 84H to BASE+4 + OUTW BASE+4 ;and 05H to BASE+5 +;Master Mode now set to 84F3H: +; Scaler set to BCD division +; Enable data pointer increment +; 8-bit data bus +; FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +; Both alarm comparators disabled +; Time-of-day enabled +;Counter 5 selected + +;Initialize loop. Ports BASE through BASE+7 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+8 ;Check against limit + JNZ INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 9513 is +;providing 19.2k baud X 16 to the 8251A which is set for +;16X clock and one stop bit. + + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Intial baud rate (19.2k) was wrong, so run auto-baud routine + +INITBAUD: + MOV SI,BAUD +;First set up 9513 for slower baud rates (<=9600). +;Counter 5 mode register has already been selected. + MOV AX,0E823H ;Output 23H to BASE+4 + OUTW BASE+4 ;and 0E8H to BASE+5 +;23H to BASE+4 sets lower half of Counter 5 mode register. +;Reload from Load, count down repetively in binary, +;toggle output. +;0E8H to BASE+5 disables data pointer sequencing + + MOV AL,0DH + OUT BASE+5 ;Select Counter 5 load reg. +INITB: + SEG CS + LODW ;Get divisor + OUT BASE+4 ;Output low byte + MOV AL,AH + OUT BASE+4 ;Output high byte + CALL CHECKB ;Check if baud rate correct + JP INITB ;Try next rate if not +CHECKB: + CALL IN ;First byte could be messed up + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JZ MONITOR ;Don't return if correct + RET ;Didn't get it yet + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JP COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JP GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JP OUT + +;Cancel input line + +KILL: + CALL CRLF + JP COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCAB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JP OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JP OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JP RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JP BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JP ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JP COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODB ;Bring first byte into AL +DOSCAN: + SCAB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JP SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JP GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JP STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JP GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JP GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JP NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCAW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCAW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JP GETFLG +DISPREGLINE: + SEG CS + LODW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JP FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JP STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP SS + PUSH DS + POP ES + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. This +;wouldn't be necessary if Automatic End of Interrupt mode +;worked like it was supposed to! + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, with Automatic End of Interrupt (which doesn't +;work in slaves), 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,0BH,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for Counter 5 mode register with auto increment. Thus +;mode is set to 0B63H, which is no gating, count source is +;F1 (4 MHz), reload from load or hold, count down repetitively +;in binary, with output toggle. Load register is set to +;0007H, and Hold register is set to 0006H. Thus we +;alternately divide by 7 and 6, which is divided by 2 by +;the output toggle, thus providing a square wave of +;4 MHz/13 = 307.7 kHz, which divided by 16 in the 8251A +;provides 19,230 baud (0.16% high). + DB 6 + DB 63H,0BH,7,0,6,0 +;Port BASE+5 - 9513 Control. Load and arm counter 5, +;enabling baud rate generation. Then select counter +;5 mode register, in case baud rate wasn't right. + DB 2 + DB 70H,5 +;Port BASE+6 - 8251A Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.4",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES: DM 8,32,8 + +;Disk boot. + +BOOT: + PUSH DI + +;************************************************ + +;Boot for Cromemco 4FDC disk controller with either +;large or small disks. Loads track 0, sector 1 into LOAD. + + IF CROMEMCO4FDC + MOV AL,1 + OUT 2 ;Reset 4FDC serial I/O + MOV AL,84H + OUT 0 ;and set for 300 baud + MOV AL,7FH + OUT 4 + MOV DL,21H +RETRY: + MOV AL,0D0H + OUTB 30H +READY: + INB 30H + ROR AL + JC READY + XOR DL,10H + MOV AL,DL + OUTB 34H + MOV DI,LOAD + MOV AL,12 + OUTB 30H +HOME: + INB 34H + ROR AL + JNC HOME + INB 30H + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB 32H + MOV CX,80H + MOV AL,DL + OR AL,80H + OUTB 34H + MOV AL,8CH + OUTB 30H +READ: + INB 34H + ROR AL + JC DONE + INB 33H + STOB + LOOP READ +WSTAT: + INB 34H + ROR AL + JNC WSTAT +DONE: + INB 30H + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + +;Boot for North Star disk, single density. +;Loads track 0, sector 0 into address LOAD + + IF NORTHSTARSD + +;Disk command equates + +SEL: EQU 1 +STP1: EQU 9 +STP2: EQU 8 +NOP: EQU 10H +SEC: EQU 14H +STPOUT: EQU 1CH +RD: EQU 40H +BST: EQU 20H + + PUSH DS + MOV AX,0FEB8H + MOV DS,AX + MOV AL,[SEL] + MOV CX,20 +MOTOR: + CALL SECTOR + LOOP MOTOR +CHKTRK: + TEST B,[STPOUT],1 + JNZ ONTRACK + MOV AL,[STP1] + AAM + MOV AL,[STP2] + CALL SECTOR + CALL SECTOR + JP CHKTRK +SECTOR: + MOV AL,[SEC] +SECLP: + MOV AL,[BST+NOP] + TEST AL,80H + JZ SECLP + RET +ONTRACK: + MOV DI,LOAD + MOV CX,280 + MOV BX,RD+NOP +GETSEC: + CALL SECTOR + AND AL,0FH + JNZ GETSEC +GETSYNC: + TEST B,[NOP],4 + LOOPZ GETSYNC + JZ ONTRACK + MOV CX,100H + XOR DL,DL + AAD +READ: + MOV AL,[BX] + STOB ;Uses ES + XOR DL,AL + ROL DL + AAD + LOOP READ + MOV AL,[BX] + CMP AL,DL + JNZ ONTRACK + POP DS + ENDIF + +;************************************************ + +;Boot for Tarbell disk controllers. Load track 0, +;sector 1 into LOAD. + + IF TARBELL + +DISK: EQU 78H + +RETRY: + MOV AL,0D0H + OUTB DISK +READY: + INB DISK + ROR AL + JC READY + MOV DI,LOAD + MOV AL,0EH ;Home command @ 10ms/track + OUTB DISK + INB DISK+4 + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV CX,80H + MOV AL,8CH + OUTB DISK +READ: + INB DISK+4 + ROL AL + JNC DONE + INB DISK+3 + STOB + LOOP READ +WSTAT: + INB DISK+4 + ROL AL + JC WSTAT +DONE: + INB DISK + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + + IF OTHER + +;User may insert customized disk boot here. All +;registers are available, stack pointer is valid +;and interrupts are enabled. Stack should be at +;same level on fall-through to code below. Last +;address available is 07DF hex. + + ORG 7E0H ;Simulate boot of maximum length + + ENDIF +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO + \ No newline at end of file diff --git a/files/MON_1.4_1980-02-18_CROMEMCO4FDC.BIN b/files/MON_1.4_1980-02-18_CROMEMCO4FDC.BIN new file mode 100644 index 0000000..b07d39e Binary files /dev/null and b/files/MON_1.4_1980-02-18_CROMEMCO4FDC.BIN differ diff --git a/files/MON_1.4_1980-02-18_CROMEMCO4FDC.HEX b/files/MON_1.4_1980-02-18_CROMEMCO4FDC.HEX new file mode 100644 index 0000000..3d2db19 --- /dev/null +++ b/files/MON_1.4_1980-02-18_CROMEMCO4FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD754A5387CB57F3A6A8 +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE334EBDFE82FFE33D28AE6E860 +:1A03F200140072738AD04749E80B00721DE368E8ADFE0AD0EBF08A052C300E +:1A040C00720E3C0AF573092C073C0A72033C10F5C3E8FCFDE8E5FF720BB9CA +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E171E07BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E340D8A08 +:1A086A005E204572726F720D8A08208857B001E602B084E600B07FE604B2D0 +:1A08840021B0D0E630E430D0C872FA80F2108AC2E634BF0002B00CE630E42C +:1A089E0034D0C873FAE430249875DCB001E632B980008AC20C80E634B08CB6 +:1A08B800E630E434D0C8720BE433AAE2F5E434D0C873FAE430249C75B4C76A +:0F08D20006B2010000C706B40100025FE989FE0B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.4_1980-02-18_NORTHSTAR.BIN b/files/MON_1.4_1980-02-18_NORTHSTAR.BIN new file mode 100644 index 0000000..2bcf306 Binary files /dev/null and b/files/MON_1.4_1980-02-18_NORTHSTAR.BIN differ diff --git a/files/MON_1.4_1980-02-18_NORTHSTAR.HEX b/files/MON_1.4_1980-02-18_NORTHSTAR.HEX new file mode 100644 index 0000000..cbfd4b3 --- /dev/null +++ b/files/MON_1.4_1980-02-18_NORTHSTAR.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD754A5387CB57F3A6A8 +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE334EBDFE82FFE33D28AE6E860 +:1A03F200140072738AD04749E80B00721DE368E8ADFE0AD0EBF08A052C300E +:1A040C00720E3C0AF573092C073C0A72033C10F5C3E8FCFDE8E5FF720BB9CA +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E171E07BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E340D8A08 +:1A086A005E204572726F720D8A082088571EB8B8FE8ED8A00100B91400E806 +:1A0884001900E2FBF6061C0001751BA00900D40AA00800E80500E80200EBCA +:1A089E00E9A01400A03000A88074F9C3BF0002B91801BB5000E8E9FF240FDA +:1A08B80075F9F606100004E1F974E7B9000132D2D50A8A07AA32D0D0C2D532 +:1A08D2000AE2F58A073AC275CF1FC706B2010000C706B40100025FE97EFE73 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.4_1980-02-18_TARBELL.BIN b/files/MON_1.4_1980-02-18_TARBELL.BIN new file mode 100644 index 0000000..21f9d6a Binary files /dev/null and b/files/MON_1.4_1980-02-18_TARBELL.BIN differ diff --git a/files/MON_1.4_1980-02-18_TARBELL.HEX b/files/MON_1.4_1980-02-18_TARBELL.HEX new file mode 100644 index 0000000..6e88a59 --- /dev/null +++ b/files/MON_1.4_1980-02-18_TARBELL.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD754A5387CB57F3A6A8 +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE334EBDFE82FFE33D28AE6E860 +:1A03F200140072738AD04749E80B00721DE368E8ADFE0AD0EBF08A052C300E +:1A040C00720E3C0AF573092C073C0A72033C10F5C3E8FCFDE8E5FF720BB9CA +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E171E07BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E340D8A08 +:1A086A005E204572726F720D8A08208857B0D0E678E478D0C872FABF00024F +:1A088400B00EE678E47CE478249875E7B001E67AB98000B08CE678E47CD056 +:1A089E00C0730BE47BAAE2F5E47CD0C072FAE478249C75C5C706B2010000F0 +:0A08B800C706B40100025FE9A8FEC4 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1980-04-24.ASM b/files/MON_1.5_1980-04-24.ASM new file mode 100644 index 0000000..652a891 --- /dev/null +++ b/files/MON_1.5_1980-04-24.ASM @@ -0,0 +1,1608 @@ +; Seattle Computer Products 8086 Monitor version 1.5 4/24/80 +; by Tim Paterson +; This software is not copyrighted. + + +;To select a disk boot, set one of the following equates +;to 1, the rest to 0. + +CROMEMCO4FDC: EQU 1 ;1 for 4FDC, 0 for others +NORTHSTARSD: EQU 0 ;North Star single density? +TARBELL: EQU 0 ;Tarbell (single or double)? +OTHER: EQU 0 ;User-defined disk + +PUTBASE:EQU 100H +LOAD: EQU 200H + ORG 7F0H + PUT PUTBASE+7F0H + JMP 0,0FF80H ;Power-on jump to monitor + +;Baud Rate Table. The 9513 divides 2MHz by these values. +;They are for 9600, 1200, 300, 150, 110 baud + +BAUD: DW 13,104,416,832,1144 + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU BPMAX+BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 800H ;-0FF800H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 + +;Start of Monitor code + + ORG 0 + PUT PUTBASE + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV DI,AXSAVE + MOV CX,14 + REP + STOW ;Set register images to zero + OR B,[FSAVE+1],2 ;Enable interrupts + MOV CL,4 + MOV AL,40H + MOV DI,DSSAVE + REP + STOW ;Set segment reg. images to 40H + MOV B [SPSAVE+1],0CH ;Set user stack to 400H+0C00H + MOV SP,STACK +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + MOV AL,0F3H + OUT BASE+4 ;Low byte of Master Mode + MOV AX,584H ;Output 84H to BASE+4 + OUTW BASE+4 ;and 05H to BASE+5 +;Master Mode now set to 84F3H: +; Scaler set to BCD division +; Enable data pointer increment +; 8-bit data bus +; FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +; Both alarm comparators disabled +; Time-of-day enabled +;Counter 5 selected + +;Initialize loop. Ports BASE through BASE+7 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+8 ;Check against limit + JNZ INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 9513 is +;providing 19.2k baud X 16 to the 8251A which is set for +;16X clock and one stop bit. + + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Intial baud rate (19.2k) was wrong, so run auto-baud routine + +INITBAUD: + MOV SI,BAUD +;First set up 9513 for slower baud rates (<=9600). +;Counter 5 mode register has already been selected. + MOV AX,0E823H ;Output 23H to BASE+4 + OUTW BASE+4 ;and 0E8H to BASE+5 +;23H to BASE+4 sets lower half of Counter 5 mode register. +;Reload from Load, count down repetively in binary, +;toggle output. +;0E8H to BASE+5 disables data pointer sequencing + + MOV AL,0DH + OUT BASE+5 ;Select Counter 5 load reg. +INITB: + SEG CS + LODW ;Get divisor + OUT BASE+4 ;Output low byte + MOV AL,AH + OUT BASE+4 ;Output high byte + CALL CHECKB ;Check if baud rate correct + JP INITB ;Try next rate if not +CHECKB: + CALL IN ;First byte could be messed up + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JZ MONITOR ;Don't return if correct + RET ;Didn't get it yet + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JP COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JP GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JP OUT + +;Cancel input line + +KILL: + CALL CRLF + JP COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCAB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JP OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JP OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JP RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JP BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JP ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JP COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODB ;Bring first byte into AL +DOSCAN: + SCAB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JP SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JP GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JP STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JP GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JP GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JP NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCAW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCAW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JP GETFLG +DISPREGLINE: + SEG CS + LODW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JP FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JP STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP ES + PUSH DS + POP SS + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. This +;wouldn't be necessary if Automatic End of Interrupt mode +;worked like it was supposed to! + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, with Automatic End of Interrupt (which doesn't +;work in slaves), 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,0BH,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for Counter 5 mode register with auto increment. Thus +;mode is set to 0B63H, which is no gating, count source is +;F1 (4 MHz), reload from load or hold, count down repetitively +;in binary, with output toggle. Load register is set to +;0007H, and Hold register is set to 0006H. Thus we +;alternately divide by 7 and 6, which is divided by 2 by +;the output toggle, thus providing a square wave of +;4 MHz/13 = 307.7 kHz, which divided by 16 in the 8251A +;provides 19,230 baud (0.16% high). + DB 6 + DB 63H,0BH,7,0,6,0 +;Port BASE+5 - 9513 Control. Load and arm counter 5, +;enabling baud rate generation. Then select counter +;5 mode register, in case baud rate wasn't right. + DB 2 + DB 70H,5 +;Port BASE+6 - 8251A Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.5",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES: DM 8,32,8 + +;Disk boot. Select one of the following routines by +;setting the equates at the start of this program. + +BOOT: + PUSH DI + +;************************************************ + +;Boot for Cromemco 4FDC disk controller with either +;large or small disks. Loads track 0, sector 1 into LOAD. + + IF CROMEMCO4FDC + +DISK: EQU 30H + + MOV AL,1 + OUT 2 ;Reset 4FDC serial I/O + MOV AL,84H + OUT 0 ;and set for 300 baud + MOV AL,7FH + OUT 4 + MOV DL,21H +RETRY: + MOV AL,0D0H + OUTB DISK +READY: + INB DISK + ROR AL + JC READY + XOR DL,10H + MOV AL,DL + OUTB DISK+4 + MOV DI,LOAD + MOV AL,12 + OUTB DISK +HOME: + INB DISK+4 + ROR AL + JNC HOME + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV CX,80H + MOV AL,DL + OR AL,80H + OUTB DISK+4 + MOV AL,8CH + OUTB DISK +READ: + INB DISK+4 + ROR AL + JC DONE + INB DISK+3 + STOB + LOOP READ +WSTAT: + INB DISK+4 + ROR AL + JNC WSTAT +DONE: + INB DISK + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + +;Boot for North Star disk, single density. +;Loads track 0, sector 0 into address LOAD + + IF NORTHSTARSD + +;Disk command equates + +SEL: EQU 1 +STP1: EQU 9 +STP2: EQU 8 +NOP: EQU 10H +SEC: EQU 14H +STPOUT: EQU 1CH +RD: EQU 40H +BST: EQU 20H + + PUSH DS + MOV AX,0FEB8H + MOV DS,AX + MOV AL,[SEL] + MOV CX,20 +MOTOR: + CALL SECTOR + LOOP MOTOR +CHKTRK: + TEST B,[STPOUT],1 + JNZ ONTRACK + MOV AL,[STP1] + AAM + MOV AL,[STP2] + CALL SECTOR + CALL SECTOR + JP CHKTRK +SECTOR: + MOV AL,[SEC] +SECLP: + MOV AL,[BST+NOP] + TEST AL,80H + JZ SECLP + RET +ONTRACK: + MOV DI,LOAD + MOV CX,280 + MOV BX,RD+NOP +GETSEC: + CALL SECTOR + AND AL,0FH + JNZ GETSEC +GETSYNC: + TEST B,[NOP],4 + LOOPZ GETSYNC + JZ ONTRACK + MOV CX,100H + XOR DL,DL + AAD +READ: + MOV AL,[BX] + STOB ;Uses ES + XOR DL,AL + ROL DL + AAD + LOOP READ + MOV AL,[BX] + CMP AL,DL + JNZ ONTRACK + POP DS + ENDIF + +;************************************************ + +;Boot for Tarbell disk controllers. Load track 0, +;sector 1 into LOAD. + + IF TARBELL + +DISK: EQU 78H + + JP RETRY +DCOM: + OUTB DISK + MOV AL,50 +HOLD: + DEC AL + JNZ HOLD + RET + +RETRY: + MOV AL,0D0H + CALL DCOM +READY: + INB DISK + ROR AL + JC READY + MOV DI,LOAD + MOV AL,0EH ;Home command @ 10ms/track + CALL DCOM + INB DISK+4 + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV CX,80H + MOV AL,8CH + CALL DCOM +READ: + INB DISK+4 + ROL AL + JNC DONE + INB DISK+3 + STOB + LOOP READ +WSTAT: + INB DISK+4 + ROL AL + JC WSTAT +DONE: + INB DISK + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + + IF OTHER + +;User may insert customized disk boot here. All +;registers are available, stack pointer is valid +;and interrupts are enabled. Stqck should be at +;same level on fall-through to code below. Last +;address available is 07DF hex. + + ORG 7E0H ;Simulate boot of maximum length + + ENDIF + +;*************************************************** + +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO + \ No newline at end of file diff --git a/files/MON_1.5_1980-04-24_CROMEMCO4FDC.BIN b/files/MON_1.5_1980-04-24_CROMEMCO4FDC.BIN new file mode 100644 index 0000000..c7e1d5f Binary files /dev/null and b/files/MON_1.5_1980-04-24_CROMEMCO4FDC.BIN differ diff --git a/files/MON_1.5_1980-04-24_CROMEMCO4FDC.HEX b/files/MON_1.5_1980-04-24_CROMEMCO4FDC.HEX new file mode 100644 index 0000000..4db5498 --- /dev/null +++ b/files/MON_1.5_1980-04-24_CROMEMCO4FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857B001E602B084E600B07FE604B2D0 +:1A08840021B0D0E630E430D0C872FA80F2108AC2E634BF0002B00CE630E42C +:1A089E0034D0C873FAE430249875DCB001E632B980008AC20C80E634B08CB6 +:1A08B800E630E434D0C8720BE433AAE2F5E434D0C873FAE430249C75B4C76A +:0F08D20006B2010000C706B40100025FE989FE0B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1980-04-24_NORTHSTAR.BIN b/files/MON_1.5_1980-04-24_NORTHSTAR.BIN new file mode 100644 index 0000000..b1f1119 Binary files /dev/null and b/files/MON_1.5_1980-04-24_NORTHSTAR.BIN differ diff --git a/files/MON_1.5_1980-04-24_NORTHSTAR.HEX b/files/MON_1.5_1980-04-24_NORTHSTAR.HEX new file mode 100644 index 0000000..2ec2de9 --- /dev/null +++ b/files/MON_1.5_1980-04-24_NORTHSTAR.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A082088571EB8B8FE8ED8A00100B91400E806 +:1A0884001900E2FBF6061C0001751BA00900D40AA00800E80500E80200EBCA +:1A089E00E9A01400A03000A88074F9C3BF0002B91801BB5000E8E9FF240FDA +:1A08B80075F9F606100004E1F974E7B9000132D2D50A8A07AA32D0D0C2D532 +:1A08D2000AE2F58A073AC275CF1FC706B2010000C706B40100025FE97EFE73 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1980-04-24_TARBELL.BIN b/files/MON_1.5_1980-04-24_TARBELL.BIN new file mode 100644 index 0000000..dc6aa77 Binary files /dev/null and b/files/MON_1.5_1980-04-24_TARBELL.BIN differ diff --git a/files/MON_1.5_1980-04-24_TARBELL.HEX b/files/MON_1.5_1980-04-24_TARBELL.HEX new file mode 100644 index 0000000..5b0f401 --- /dev/null +++ b/files/MON_1.5_1980-04-24_TARBELL.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857EB09E678B032FEC875FCC3B0D0A0 +:1A088400E8F2FFE478D0C872FABF0002B00EE8E4FFE47CE478249875E5B055 +:1A089E0001E67AB98000B08CE8D0FFE47CD0C0730BE47BAAE2F5E47CD0C075 +:1808B80072FAE478249C75C2C706B2010000C706B40100025FE99AFE85 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1981-05-26.ASM b/files/MON_1.5_1981-05-26.ASM new file mode 100644 index 0000000..39c5e83 --- /dev/null +++ b/files/MON_1.5_1981-05-26.ASM @@ -0,0 +1,1608 @@ +; Seattle Computer Products 8086 Monitor version 1.5 4/24/80 +; by Tim Paterson +; This software is not copyrighted. + + +;To select a disk boot, set one of the following equates +;to 1, the rest to 0. + +CROMEMCO4FDC: EQU 1 ;1 for 4FDC, 0 for others +NORTHSTARSD: EQU 0 ;North Star single density? +TARBELL: EQU 0 ;Tarbell (single or double)? +OTHER: EQU 0 ;User-defined disk + +PUTBASE:EQU 100H +LOAD: EQU 200H + ORG 7F0H + PUT PUTBASE+7F0H + JMP 0,0FF80H ;Power-on jump to monitor + +;Baud Rate Table. The 9513 divides 2MHz by these values. +;They are for 9600, 1200, 300, 150, 110 baud + +BAUD: DW 13,104,416,832,1144 + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU BPMAX+BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 800H ;-0FF800H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 + +;Start of Monitor code + + ORG 0 + PUT PUTBASE + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV DI,AXSAVE + MOV CX,14 + REP + STOW ;Set register images to zero + OR B,[FSAVE+1],2 ;Enable interrupts + MOV CL,4 + MOV AL,40H + MOV DI,DSSAVE + REP + STOW ;Set segment reg. images to 40H + MOV B [SPSAVE+1],0CH ;Set user stack to 400H+0C00H + MOV SP,STACK +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + MOV AL,0F3H + OUT BASE+4 ;Low byte of Master Mode + MOV AX,584H ;Output 84H to BASE+4 + OUTW BASE+4 ;and 05H to BASE+5 +;Master Mode now set to 84F3H: +; Scaler set to BCD division +; Enable data pointer increment +; 8-bit data bus +; FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +; Both alarm comparators disabled +; Time-of-day enabled +;Counter 5 selected + +;Initialize loop. Ports BASE through BASE+7 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+8 ;Check against limit + JNZ INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 9513 is +;providing 19.2k baud X 16 to the 8251A which is set for +;16X clock and one stop bit. + + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Intial baud rate (19.2k) was wrong, so run auto-baud routine + +INITBAUD: + MOV SI,BAUD +;First set up 9513 for slower baud rates (<=9600). +;Counter 5 mode register has already been selected. + MOV AX,0E823H ;Output 23H to BASE+4 + OUTW BASE+4 ;and 0E8H to BASE+5 +;23H to BASE+4 sets lower half of Counter 5 mode register. +;Reload from Load, count down repetively in binary, +;toggle output. +;0E8H to BASE+5 disables data pointer sequencing + + MOV AL,0DH + OUT BASE+5 ;Select Counter 5 load reg. +INITB: + SEG CS + LODW ;Get divisor + OUT BASE+4 ;Output low byte + MOV AL,AH + OUT BASE+4 ;Output high byte + CALL CHECKB ;Check if baud rate correct + JP INITB ;Try next rate if not +CHECKB: + CALL IN ;First byte could be messed up + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JZ MONITOR ;Don't return if correct + RET ;Didn't get it yet + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JP COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JP GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JP OUT + +;Cancel input line + +KILL: + CALL CRLF + JP COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCAB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JP OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JP OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JP RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JP BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JP ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JP COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODB ;Bring first byte into AL +DOSCAN: + SCAB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JP SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JP GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JP STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JP GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JP GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JP NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCAW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCAW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JP GETFLG +DISPREGLINE: + SEG CS + LODW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JP FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JP STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP ES + PUSH DS + POP SS + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. This +;wouldn't be necessary if Automatic End of Interrupt mode +;worked like it was supposed to! + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, with Automatic End of Interrupt (which doesn't +;work in slaves), 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,0BH,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for Counter 5 mode register with auto increment. Thus +;mode is set to 0B63H, which is no gating, count source is +;F1 (4 MHz), reload from load or hold, count down repetitively +;in binary, with output toggle. Load register is set to +;0007H, and Hold register is set to 0006H. Thus we +;alternately divide by 7 and 6, which is divided by 2 by +;the output toggle, thus providing a square wave of +;4 MHz/13 = 307.7 kHz, which divided by 16 in the 8251A +;provides 19,230 baud (0.16% high). + DB 6 + DB 63H,0BH,7,0,6,0 +;Port BASE+5 - 9513 Control. Load and arm counter 5, +;enabling baud rate generation. Then select counter +;5 mode register, in case baud rate wasn't right. + DB 2 + DB 70H,5 +;Port BASE+6 - 8251A Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.5",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES: DM 8,32,8 + +;Disk boot. Select one of the following routines by +;setting the equates at the start of this program. + +BOOT: + PUSH DI + +;************************************************ + +;Boot for Cromemco 4FDC disk controller with either +;large or small disks. Loads track 0, sector 1 into LOAD. + + IF CROMEMCO4FDC + +DISK: EQU 30H + + MOV AL,1 + OUT 2 ;Reset 4FDC serial I/O + MOV AL,84H + OUT 0 ;and set for 300 baud + MOV AL,7FH + OUT 4 + MOV DL,21H +RETRY: + MOV AL,0D0H + OUTB DISK +READY: + INB DISK + ROR AL + JC READY + XOR DL,10H + MOV AL,DL + OUTB DISK+4 + MOV DI,LOAD + MOV AL,12 + OUTB DISK +HOME: + INB DISK+4 + ROR AL + JNC HOME + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV CX,80H + MOV AL,DL + OR AL,80H + OUTB DISK+4 + MOV AL,8CH + OUTB DISK +READ: + INB DISK+4 + ROR AL + JC DONE + INB DISK+3 + STOB + LOOP READ +WSTAT: + INB DISK+4 + ROR AL + JNC WSTAT +DONE: + INB DISK + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + +;Boot for North Star disk, single density. +;Loads track 0, sector 0 into address LOAD +;Bug in North Star boot fixed 5-26-81. + + IF NORTHSTARSD + +;Disk command equates + +SEL: EQU 1 +STP1: EQU 9 +STP2: EQU 8 +NOP: EQU 10H +SEC: EQU 14H +STPOUT: EQU 1CH +RD: EQU 40H +BST: EQU 20H + + PUSH DS + MOV AX,0FEB8H + MOV DS,AX + MOV AL,[SEL] + MOV CX,20 +MOTOR: + CALL SECTOR + LOOP MOTOR +CHKTRK: + TEST B,[STPOUT],1 + JNZ ONTRACK + MOV AL,[STP1] + AAM + MOV AL,[STP2] + CALL SECTOR + CALL SECTOR + JP CHKTRK +SECTOR: + MOV AL,[SEC] ; Reset sector flag. +SECLP: + TEST B,[NOP],80H ; Wait for sector flag. + JZ SECLP + RET +ONTRACK: + MOV DI,LOAD + MOV CX,280 + MOV BX,RD+NOP +GETSEC: + CALL SECTOR + TEST B,[BST+NOP],0FH ; Test for sector zero. + JNZ GETSEC +GETSYNC: + TEST B,[NOP],4 + LOOPZ GETSYNC + JZ ONTRACK + MOV CX,100H + XOR DL,DL + AAD +READ: + MOV AL,[BX] + STOB ;Uses ES + XOR DL,AL + ROL DL + AAD + LOOP READ + MOV AL,[BX] + CMP AL,DL + JNZ ONTRACK + POP DS + ENDIF + +;************************************************ + +;Boot for Tarbell disk controllers. Load track 0, +;sector 1 into LOAD. + + IF TARBELL + +DISK: EQU 78H + + JP RETRY +DCOM: + OUTB DISK + MOV AL,50 +HOLD: + DEC AL + JNZ HOLD + RET + +RETRY: + MOV AL,0D0H + CALL DCOM +READY: + INB DISK + ROR AL + JC READY + MOV DI,LOAD + MOV AL,0EH ;Home command @ 10ms/track + CALL DCOM + INB DISK+4 + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV CX,80H + MOV AL,8CH + CALL DCOM +READ: + INB DISK+4 + ROL AL + JNC DONE + INB DISK+3 + STOB + LOOP READ +WSTAT: + INB DISK+4 + ROL AL + JC WSTAT +DONE: + INB DISK + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + + IF OTHER + +;User may insert customized disk boot here. All +;registers are available, stack pointer is valid +;and interrupts are enabled. Stack should be at +;same level on fall-through to code below. Last +;address available is 07DF hex. + + ORG 7E0H ;Simulate boot of maximum length + + ENDIF + +;*************************************************** + +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO + \ No newline at end of file diff --git a/files/MON_1.5_1981-05-26_CROMEMCO4FDC.BIN b/files/MON_1.5_1981-05-26_CROMEMCO4FDC.BIN new file mode 100644 index 0000000..c7e1d5f Binary files /dev/null and b/files/MON_1.5_1981-05-26_CROMEMCO4FDC.BIN differ diff --git a/files/MON_1.5_1981-05-26_CROMEMCO4FDC.HEX b/files/MON_1.5_1981-05-26_CROMEMCO4FDC.HEX new file mode 100644 index 0000000..4db5498 --- /dev/null +++ b/files/MON_1.5_1981-05-26_CROMEMCO4FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857B001E602B084E600B07FE604B2D0 +:1A08840021B0D0E630E430D0C872FA80F2108AC2E634BF0002B00CE630E42C +:1A089E0034D0C873FAE430249875DCB001E632B980008AC20C80E634B08CB6 +:1A08B800E630E434D0C8720BE433AAE2F5E434D0C873FAE430249C75B4C76A +:0F08D20006B2010000C706B40100025FE989FE0B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1981-05-26_NORTHSTAR.BIN b/files/MON_1.5_1981-05-26_NORTHSTAR.BIN new file mode 100644 index 0000000..0bfd580 Binary files /dev/null and b/files/MON_1.5_1981-05-26_NORTHSTAR.BIN differ diff --git a/files/MON_1.5_1981-05-26_NORTHSTAR.HEX b/files/MON_1.5_1981-05-26_NORTHSTAR.HEX new file mode 100644 index 0000000..3ab2e74 --- /dev/null +++ b/files/MON_1.5_1981-05-26_NORTHSTAR.HEX @@ -0,0 +1,82 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A082088571EB8B8FE8ED8A00100B91400E806 +:1A0884001900E2FBF6061C0001751BA00900D40AA00800E80500E80200EBCA +:1A089E00E9A01400F60610008074F9C3BF0002B91801BB5000E8E9FFF6067D +:1A08B80030000F75F6F606100004E1F974E4B9000132D2D50A8A07AA32D060 +:1A08D200D0C2D50AE2F58A073AC275CC1FC706B2010000C706B40100025F74 +:0308EC00E97BFEA7 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1981-05-26_TARBELL.BIN b/files/MON_1.5_1981-05-26_TARBELL.BIN new file mode 100644 index 0000000..dc6aa77 Binary files /dev/null and b/files/MON_1.5_1981-05-26_TARBELL.BIN differ diff --git a/files/MON_1.5_1981-05-26_TARBELL.HEX b/files/MON_1.5_1981-05-26_TARBELL.HEX new file mode 100644 index 0000000..5b0f401 --- /dev/null +++ b/files/MON_1.5_1981-05-26_TARBELL.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857EB09E678B032FEC875FCC3B0D0A0 +:1A088400E8F2FFE478D0C872FABF0002B00EE8E4FFE47CE478249875E5B055 +:1A089E0001E67AB98000B08CE8D0FFE47CD0C0730BE47BAAE2F5E47CD0C075 +:1808B80072FAE478249C75C2C706B2010000C706B40100025FE99AFE85 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19.ASM b/files/MON_1.5_1982-03-19.ASM new file mode 100644 index 0000000..67b633c --- /dev/null +++ b/files/MON_1.5_1982-03-19.ASM @@ -0,0 +1,1663 @@ +; Seattle Computer Products 8086 Monitor version 1.5 3-19-82. +; by Tim Paterson +; This software is not copyrighted. + + +; To select a disk boot, set one of the following equates +; to 1, the rest to 0. + +SCP: EQU 1 ;1 for SCP, 0 for others. +CROMEMCO4FDC: EQU 0 ;Cromemco 4FDC? +CROMEMCO16FDC: EQU 0 ;Cromemco 16FDC? +NORTHSTARSD: EQU 0 ;North Star single density? +TARBELLSD: EQU 0 ;Tarbell SD controller or DD controller SD only +TARBELLDD: EQU 0 ;Tarbell DD controller SD or DD? +OTHER: EQU 0 ;User-defined disk + +PUTBASE:EQU 100H +LOAD: EQU 200H + ORG 7F0H + PUT PUTBASE+7F0H + JMP 0,0FF80H ;Power-on jump to monitor + +;Baud Rate Table. The 9513 divides 2MHz by these values. +;They are for 9600, 1200, 300, 150, 110 baud + +BAUD: DW 13,104,416,832,1144 + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU BPMAX+BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 800H ;-0FF800H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 + +;Start of Monitor code + + ORG 0 + PUT PUTBASE + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV DI,AXSAVE + MOV CX,14 + REP + STOW ;Set register images to zero + OR B,[FSAVE+1],2 ;Enable interrupts + MOV CL,4 + MOV AL,40H + MOV DI,DSSAVE + REP + STOW ;Set segment reg. images to 40H + MOV B [SPSAVE+1],0CH ;Set user stack to 400H+0C00H + MOV SP,STACK +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + MOV AL,0F3H + OUT BASE+4 ;Low byte of Master Mode + MOV AX,584H ;Output 84H to BASE+4 + OUTW BASE+4 ;and 05H to BASE+5 +;Master Mode now set to 84F3H: +; Scaler set to BCD division +; Enable data pointer increment +; 8-bit data bus +; FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +; Both alarm comparators disabled +; Time-of-day enabled +;Counter 5 selected + +;Initialize loop. Ports BASE through BASE+7 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+8 ;Check against limit + JNZ INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 9513 is +;providing 19.2k baud X 16 to the 8251A which is set for +;16X clock and one stop bit. + + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Intial baud rate (19.2k) was wrong, so run auto-baud routine + +INITBAUD: + MOV SI,BAUD +;First set up 9513 for slower baud rates (<=9600). +;Counter 5 mode register has already been selected. + MOV AX,0E823H ;Output 23H to BASE+4 + OUTW BASE+4 ;and 0E8H to BASE+5 +;23H to BASE+4 sets lower half of Counter 5 mode register. +;Reload from Load, count down repetively in binary, +;toggle output. +;0E8H to BASE+5 disables data pointer sequencing + + MOV AL,0DH + OUT BASE+5 ;Select Counter 5 load reg. +INITB: + SEG CS + LODW ;Get divisor + OUT BASE+4 ;Output low byte + MOV AL,AH + OUT BASE+4 ;Output high byte + CALL CHECKB ;Check if baud rate correct + JP INITB ;Try next rate if not +CHECKB: + CALL IN ;First byte could be messed up + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JZ MONITOR ;Don't return if correct + RET ;Didn't get it yet + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JP COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JP GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JP OUT + +;Cancel input line + +KILL: + CALL CRLF + JP COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCAB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JP OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JP OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JP RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JP BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JP ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JP COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODB ;Bring first byte into AL +DOSCAN: + SCAB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JP SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JP GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JP STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JP GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JP GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JP NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCAW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCAW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JP GETFLG +DISPREGLINE: + SEG CS + LODW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JP FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JP STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP ES + PUSH DS + POP SS + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. This +;wouldn't be necessary if Automatic End of Interrupt mode +;worked like it was supposed to! + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, with Automatic End of Interrupt (which doesn't +;work in slaves), 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,0BH,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for Counter 5 mode register with auto increment. Thus +;mode is set to 0B63H, which is no gating, count source is +;F1 (4 MHz), reload from load or hold, count down repetitively +;in binary, with output toggle. Load register is set to +;0007H, and Hold register is set to 0006H. Thus we +;alternately divide by 7 and 6, which is divided by 2 by +;the output toggle, thus providing a square wave of +;4 MHz/13 = 307.7 kHz, which divided by 16 in the 8251A +;provides 19,230 baud (0.16% high). + DB 6 + DB 63H,0BH,7,0,6,0 +;Port BASE+5 - 9513 Control. Load and arm counter 5, +;enabling baud rate generation. Then select counter +;5 mode register, in case baud rate wasn't right. + DB 2 + DB 70H,5 +;Port BASE+6 - 8251A Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.5",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES: DM 8,32,8 + +;Disk boot. Select one of the following routines by +;setting the equates at the start of this program. + +BOOT: + PUSH DI +; +;************************************************ +; +; Boot for SCP, Cromemco 4FDC, or 16FDC disk controller with either +; large or small disks. Loads track 0, sector 1 into LOAD. +; + IF SCP+CROMEMCO4FDC+CROMEMCO16FDC + + IF SCP +DISK: EQU 0E0H + INB BASE+15 ; Get sense switch data. + MOV CL,3 ; Shift bit 1 over to bit 4 so it + ROL AL,CL ; can be used for large/small bit. + AND AL,10H ; Keep only the large/small bit. + MOV DH,AL ; Put drive select byte in DH. + ENDIF + + IF CROMEMCO4FDC+CROMEMCO16FDC +DISK: EQU 30H + MOV AL,1 + OUT 2 ;Reset 4FDC serial I/O + MOV AL,84H + OUT 0 ;and set for 300 baud + MOV AL,7FH + OUT 4 + MOV DH,21H ; Drive-select byte. + ENDIF + + IF CROMEMCO16FDC + MOV AL,30H ; Turn on disk motors and + OUT DISK+4 ; wait one second. + MOV CX,43716 +MOTORDELAY: + AAM ; 83 clocks. + AAM ; 83 clocks. + LOOP MOTORDELAY ; 17 clocks. + ENDIF + +RETRY: + MOV AL,0D0H ; Force-interrupt command. + OUTB DISK + AAM ; Give force-interrupt time. + AAM + AAM + AAM + + IF SCP + XOR DH,08H ; If SCP, flip density bit. + ENDIF + + IF CROMEMCO16FDC+CROMEMCO4FDC + XOR DH,10H ; If Cromemco, flip disk size bit. + ENDIF + + MOV AL,DH + + IF SCP + OR AL,80H ; Turn on RESTORE for PerSci's. + ENDIF + + OUTB DISK+4 + MOV DI,LOAD + MOV AL,0FH ; Restore command. + OUTB DISK +HOME: + INB DISK+4 ; Wait for INTRQ. + ROR AL + JNC HOME + + IF SCP + MOV AL,DH ; Turn RESTORE off. + OUTB DISK+4 + ENDIF + + INB DISK ; Read status. + AND AL,98H + JNZ RETRY ; Retry if bad. + MOV AL,1 ; Ask for sector 1. + OUTB DISK+2 + + IF CROMEMCO4FDC+CROMEMCO16FDC + MOV AL,DH + OR AL,80H ; Turn on auto-wait. + OUTB DISK+4 + ENDIF + + MOV DL,DISK+3 ; Disk controller data port. + MOV AL,8CH ; Read command. + OUTB DISK + JMPS READ +READLOOP: + INB DX ; Read data from disk controller chip. + STOB ; Put data in memory. +READ: + + IF SCP + INB DISK+5 ; Wait for DQR or INTRQ. + ENDIF + + IF CROMEMCO4FDC+CROMEMCO16FDC + INB DISK+4 + ENDIF + + ROR AL ; Check for INTRQ. + JNC READLOOP ; Jump if not. + INB DISK ; Get status. + AND AL,9CH + JNZ RETRY ; Jump if error. + ENDIF + +;*************************************************** + +;Boot for North Star disk, single density. +;Loads track 0, sector 0 into address LOAD + + IF NORTHSTARSD + +;Disk command equates + +SEL: EQU 1 +STP1: EQU 9 +STP2: EQU 8 +NOP: EQU 10H +SEC: EQU 14H +STPOUT: EQU 1CH +RD: EQU 40H +BST: EQU 20H + + PUSH DS + MOV AX,0FEB8H + MOV DS,AX + MOV AL,[SEL] + MOV CX,20 +MOTOR: + CALL SECTOR + LOOP MOTOR +CHKTRK: + TEST B,[STPOUT],1 + JNZ ONTRACK + MOV AL,[STP1] + AAM + MOV AL,[STP2] + CALL SECTOR + CALL SECTOR + JP CHKTRK +SECTOR: + MOV AL,[SEC] ; Reset sector flag. +SECLP: + TEST B,[NOP],80H ; Wait for sector flag. + JZ SECLP + RET +ONTRACK: + MOV DI,LOAD + MOV CX,280 + MOV BX,RD+NOP +GETSEC: + CALL SECTOR + TEST B,[BST+NOP],0FH ; Test for sector zero. + JNZ GETSEC +GETSYNC: + TEST B,[NOP],4 + LOOPZ GETSYNC + JZ ONTRACK + MOV CX,100H + XOR DL,DL + AAD +READ: + MOV AL,[BX] + STOB ;Uses ES + XOR DL,AL + ROL DL + AAD + LOOP READ + MOV AL,[BX] + CMP AL,DL + JNZ ONTRACK + POP DS + ENDIF +; +; ******************************************************************** +; +; Boot for Tarbell disk controllers. Load track 0, sector 1 into LOAD. +; + IF TARBELLSD+TARBELLDD +DISK: EQU 78H + + IF TARBELLDD + SUB AH,AH ; Initial drive-select byte = 0. + ENDIF + + JP RETRY +DCOM: + OUTB DISK + MOV AL,50 +HOLD: + DEC AL + JNZ HOLD + RET + +RETRY: + MOV AL,0D0H + CALL DCOM +READY: + INB DISK + ROR AL + JC READY + + IF TARBELLDD + XOR AH,08H ; Try other density. + MOV AL,AH + OUTB DISK+4 + ENDIF + + MOV DI,LOAD + MOV AL,0EH ; Home command @ 10ms/track + CALL DCOM + INB DISK+4 + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV DX,DISK+3 ; Disk controller data port. + MOV AL,8CH + CALL DCOM + JMPS READ +READLOOP: + INB DX ; Read data from disk controller chip. + STOB ; Put in memory. +READ: + INB DISK+4 ; Wait for DRQ or INTRQ. + ROL AL ; Check for INTRQ. + JC READLOOP ; Jump if not. + INB DISK ; Read status. + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + + IF OTHER + +;User may insert customized disk boot here. All +;registers are available, stack pointer is valid +;and interrupts are enabled. Stack should be at +;same level on fall-through to code below. Last +;address available is 07DF hex. + + ORG 7E0H ;Simulate boot of maximum length + + ENDIF + +;*************************************************** + +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19_CROMEMCO16FDC.BIN b/files/MON_1.5_1982-03-19_CROMEMCO16FDC.BIN new file mode 100644 index 0000000..fbd1291 Binary files /dev/null and b/files/MON_1.5_1982-03-19_CROMEMCO16FDC.BIN differ diff --git a/files/MON_1.5_1982-03-19_CROMEMCO16FDC.HEX b/files/MON_1.5_1982-03-19_CROMEMCO16FDC.HEX new file mode 100644 index 0000000..14ceaca --- /dev/null +++ b/files/MON_1.5_1982-03-19_CROMEMCO16FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857B001E602B084E600B07FE604B6CC +:1A08840021B030E634B9C4AAD40AD40AE2FAB0D0E630D40AD40AD40AD40A72 +:1A089E0080F6108AC6E634BF0002B00FE630E434D0C873FAE430249875DA7E +:1A08B800B001E6328AC60C80E634B233B08CE630EB02ECAAE434D0C873F892 +:1608D200E430249C75BAC706B2010000C706B40100025FE982FE41 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19_CROMEMCO4FDC.BIN b/files/MON_1.5_1982-03-19_CROMEMCO4FDC.BIN new file mode 100644 index 0000000..931b54c Binary files /dev/null and b/files/MON_1.5_1982-03-19_CROMEMCO4FDC.BIN differ diff --git a/files/MON_1.5_1982-03-19_CROMEMCO4FDC.HEX b/files/MON_1.5_1982-03-19_CROMEMCO4FDC.HEX new file mode 100644 index 0000000..cf8248b --- /dev/null +++ b/files/MON_1.5_1982-03-19_CROMEMCO4FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857B001E602B084E600B07FE604B6CC +:1A08840021B0D0E630D40AD40AD40AD40A80F6108AC6E634BF0002B00FE6D5 +:1A089E0030E434D0C873FAE430249875DAB001E6328AC60C80E634B233B080 +:1A08B8008CE630EB02ECAAE434D0C873F8E430249C75BAC706B2010000C79C +:0908D20006B40100025FE98FFE8B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19_NORTHSTAR.BIN b/files/MON_1.5_1982-03-19_NORTHSTAR.BIN new file mode 100644 index 0000000..0bfd580 Binary files /dev/null and b/files/MON_1.5_1982-03-19_NORTHSTAR.BIN differ diff --git a/files/MON_1.5_1982-03-19_NORTHSTAR.HEX b/files/MON_1.5_1982-03-19_NORTHSTAR.HEX new file mode 100644 index 0000000..3ab2e74 --- /dev/null +++ b/files/MON_1.5_1982-03-19_NORTHSTAR.HEX @@ -0,0 +1,82 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A082088571EB8B8FE8ED8A00100B91400E806 +:1A0884001900E2FBF6061C0001751BA00900D40AA00800E80500E80200EBCA +:1A089E00E9A01400F60610008074F9C3BF0002B91801BB5000E8E9FFF6067D +:1A08B80030000F75F6F606100004E1F974E4B9000132D2D50A8A07AA32D060 +:1A08D200D0C2D50AE2F58A073AC275CC1FC706B2010000C706B40100025F74 +:0308EC00E97BFEA7 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19_SCPDISKMASTER.BIN b/files/MON_1.5_1982-03-19_SCPDISKMASTER.BIN new file mode 100644 index 0000000..965a07d Binary files /dev/null and b/files/MON_1.5_1982-03-19_SCPDISKMASTER.BIN differ diff --git a/files/MON_1.5_1982-03-19_SCPDISKMASTER.HEX b/files/MON_1.5_1982-03-19_SCPDISKMASTER.HEX new file mode 100644 index 0000000..077a84e --- /dev/null +++ b/files/MON_1.5_1982-03-19_SCPDISKMASTER.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857E4FFB103D2C024108AF0B0D0E611 +:1A088400E0D40AD40AD40AD40A80F6088AC60C80E6E4BF0002B00FE6E0E4B4 +:1A089E00E4D0C873FA8AC6E6E4E4E0249875D4B001E6E2B2E3B08CE6E0EB79 +:1A08B80002ECAAE4E5D0C873F8E4E0249C75BAC706B2010000C706B401000D +:0508D200025FE993FE46 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19_TARBELLDD.BIN b/files/MON_1.5_1982-03-19_TARBELLDD.BIN new file mode 100644 index 0000000..e99d40c Binary files /dev/null and b/files/MON_1.5_1982-03-19_TARBELLDD.BIN differ diff --git a/files/MON_1.5_1982-03-19_TARBELLDD.HEX b/files/MON_1.5_1982-03-19_TARBELLDD.HEX new file mode 100644 index 0000000..d854ed7 --- /dev/null +++ b/files/MON_1.5_1982-03-19_TARBELLDD.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A082088572AE4EB09E678B032FEC875FCC312 +:1A088400B0D0E8F2FFE478D0C872FA80F4088AC4E67CBF0002B00EE8DDFF32 +:1A089E00E47CE478249875DEB001E67ABA7B00B08CE8C9FFEB02ECAAE47C60 +:1A08B800D0C072F8E478249C75C2C706B2010000C706B40100025FE998FEF7 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-03-19_TARBELLSD.BIN b/files/MON_1.5_1982-03-19_TARBELLSD.BIN new file mode 100644 index 0000000..4259a63 Binary files /dev/null and b/files/MON_1.5_1982-03-19_TARBELLSD.BIN differ diff --git a/files/MON_1.5_1982-03-19_TARBELLSD.HEX b/files/MON_1.5_1982-03-19_TARBELLSD.HEX new file mode 100644 index 0000000..0038878 --- /dev/null +++ b/files/MON_1.5_1982-03-19_TARBELLSD.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857EB09E678B032FEC875FCC3B0D0A0 +:1A088400E8F2FFE478D0C872FABF0002B00EE8E4FFE47CE478249875E5B055 +:1A089E0001E67ABA7B00B08CE8D0FFEB02ECAAE47CD0C072F8E478249C7549 +:1108B800C9C706B2010000C706B40100025FE9A1FE7B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10.ASM b/files/MON_1.5_1982-06-10.ASM new file mode 100644 index 0000000..1cd710f --- /dev/null +++ b/files/MON_1.5_1982-06-10.ASM @@ -0,0 +1,1676 @@ +; Seattle Computer Products 8086 Monitor version 1.5 6-10-82. +; by Tim Paterson +; This software is not copyrighted. + + +; To select a disk boot, set one of the following equates +; to 1, the rest to 0. + +SCP: EQU 1 ;1 for SCP, 0 for others. +CROMEMCO4FDC: EQU 0 ;Cromemco 4FDC? +CROMEMCO16FDC: EQU 0 ;Cromemco 16FDC? +NORTHSTARSD: EQU 0 ;North Star single density? +TARBELLSD: EQU 0 ;Tarbell SD controller or DD controller SD only +TARBELLDD: EQU 0 ;Tarbell DD controller SD or DD? +OTHER: EQU 0 ;User-defined disk + +PUTBASE:EQU 100H +LOAD: EQU 200H + ORG 7F0H + PUT PUTBASE+7F0H + JMP 0,0FF80H ;Power-on jump to monitor + +;Baud Rate Table. The 9513 divides 2MHz by these values. +;They are for 9600, 1200, 300, 150, 110 baud + +BAUD: DW 13,104,416,832,1144 + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU BPMAX+BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 800H ;-0FF800H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 + +;Start of Monitor code + + ORG 0 + PUT PUTBASE + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV DI,AXSAVE + MOV CX,14 + REP + STOW ;Set register images to zero + OR B,[FSAVE+1],2 ;Enable interrupts + MOV CL,4 + MOV AL,40H + MOV DI,DSSAVE + REP + STOW ;Set segment reg. images to 40H + MOV B [SPSAVE+1],0CH ;Set user stack to 400H+0C00H + MOV SP,STACK +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + MOV AL,0F3H + OUT BASE+4 ;Low byte of Master Mode + MOV AX,584H ;Output 84H to BASE+4 + OUTW BASE+4 ;and 05H to BASE+5 +;Master Mode now set to 84F3H: +; Scaler set to BCD division +; Enable data pointer increment +; 8-bit data bus +; FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +; Both alarm comparators disabled +; Time-of-day enabled +;Counter 5 selected + +;Initialize loop. Ports BASE through BASE+7 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+8 ;Check against limit + JNZ INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 9513 is +;providing 19.2k baud X 16 to the 8251A which is set for +;16X clock and one stop bit. + + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Intial baud rate (19.2k) was wrong, so run auto-baud routine + +INITBAUD: + MOV SI,BAUD +;First set up 9513 for slower baud rates (<=9600). +;Counter 5 mode register has already been selected. + MOV AX,0E823H ;Output 23H to BASE+4 + OUTW BASE+4 ;and 0E8H to BASE+5 +;23H to BASE+4 sets lower half of Counter 5 mode register. +;Reload from Load, count down repetively in binary, +;toggle output. +;0E8H to BASE+5 disables data pointer sequencing + + MOV AL,0DH + OUT BASE+5 ;Select Counter 5 load reg. +INITB: + SEG CS + LODW ;Get divisor + OUT BASE+4 ;Output low byte + MOV AL,AH + OUT BASE+4 ;Output high byte + CALL CHECKB ;Check if baud rate correct + JP INITB ;Try next rate if not +CHECKB: + CALL IN ;First byte could be messed up + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JZ MONITOR ;Don't return if correct + RET ;Didn't get it yet + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JP COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JP GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JP OUT + +;Cancel input line + +KILL: + CALL CRLF + JP COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCAB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JP OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JP OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JP RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JP BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JP ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JP COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODB ;Bring first byte into AL +DOSCAN: + SCAB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JP SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JP GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JP STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JP GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JP GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JP NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCAW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCAW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JP GETFLG +DISPREGLINE: + SEG CS + LODW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JP FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JP STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP ES + PUSH DS + POP SS + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. This +;wouldn't be necessary if Automatic End of Interrupt mode +;worked like it was supposed to! + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, with Automatic End of Interrupt (which doesn't +;work in slaves), 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,0BH,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for Counter 5 mode register with auto increment. Thus +;mode is set to 0B63H, which is no gating, count source is +;F1 (4 MHz), reload from load or hold, count down repetitively +;in binary, with output toggle. Load register is set to +;0007H, and Hold register is set to 0006H. Thus we +;alternately divide by 7 and 6, which is divided by 2 by +;the output toggle, thus providing a square wave of +;4 MHz/13 = 307.7 kHz, which divided by 16 in the 8251A +;provides 19,230 baud (0.16% high). + DB 6 + DB 63H,0BH,7,0,6,0 +;Port BASE+5 - 9513 Control. Load and arm counter 5, +;enabling baud rate generation. Then select counter +;5 mode register, in case baud rate wasn't right. + DB 2 + DB 70H,5 +;Port BASE+6 - 8251A Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.5",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES: DM 8,32,8 + +;Disk boot. Select one of the following routines by +;setting the equates at the start of this program. + +BOOT: + PUSH DI +; +;************************************************ +; +; Boot for SCP, Cromemco 4FDC, or 16FDC disk controller with either +; large or small disks. Loads track 0, sector 1 into LOAD. +; + IF SCP+CROMEMCO4FDC+CROMEMCO16FDC + + IF SCP +DISK: EQU 0E0H + ENDIF + + IF CROMEMCO4FDC+CROMEMCO16FDC +DISK: EQU 30H + MOV AL,0FFH ; Select side 0. + OUTB 4 + ENDIF + + IF SCP+CROMEMCO16FDC + INB BASE+15 ; Get sense switch data. + MOV CL,3 ; Shift bit 1 over to bit 4 so it + ROL AL,CL ; can be used for large/small bit. + AND AL,10H ; Keep only the large/small bit. + ENDIF + + IF CROMEMCO16FDC + OR AL,21H ; Add the rest of the drive-select bits. + ENDIF + + IF SCP+CROMEMCO16FDC + MOV BH,AL ; Put drive select byte in BH. + ENDIF + + IF CROMEMCO4FDC + MOV BH,21H ; Drive-select byte. + ENDIF + + IF CROMEMCO16FDC + MOV AL,30H ; Turn on disk motors and + OUT DISK+4 ; wait one second. + MOV CX,43716 +MOTORDELAY: + AAM ; 83 clocks. + AAM ; 83 clocks. + LOOP MOTORDELAY ; 17 clocks. + ENDIF + +RETRY: + MOV AL,0D0H ; Force-interrupt command. + OUTB DISK + MOV CX,5 +DELAY: + AAM ; Give force-interrupt time. + LOOP DELAY + + IF SCP + XOR BH,08H ; If SCP, flip density bit. + ENDIF + + IF CROMEMCO16FDC + XOR BH,40H ; If 16FDC, flip density bit. + ENDIF + + IF CROMEMCO4FDC + XOR BH,10H ; If 4FDC, flip disk size bit. + ENDIF + + MOV AL,BH + + IF SCP + OR AL,80H ; Turn on RESTORE for PerSci's. + ENDIF + + OUTB DISK+4 + MOV DI,LOAD + MOV AL,0FH ; Restore command. + OUTB DISK +HOME: + INB DISK+4 ; Wait for INTRQ. + ROR AL + JNC HOME + + IF SCP + MOV AL,BH ; Turn RESTORE off. + OUTB DISK+4 + ENDIF + + INB DISK ; Read status. + AND AL,98H + JNZ RETRY ; Retry if bad. + MOV AL,1 ; Ask for sector 1. + OUTB DISK+2 + + IF CROMEMCO4FDC+CROMEMCO16FDC + MOV AL,BH + OR AL,80H ; Turn on auto-wait. + OUTB DISK+4 + ENDIF + + MOV DX,DISK+3 ; Disk controller data port. + MOV AL,8CH ; Read command. + OUTB DISK + JMPS READ +READLOOP: + STOB ; Put data in memory. +READ: + + IF SCP + INB DISK+5 ; Wait for DQR or INTRQ. + ENDIF + + IF CROMEMCO4FDC+CROMEMCO16FDC + INB DISK+4 + ENDIF + + ROR AL ; Check for INTRQ. + INB DX ; Read data from disk controller chip. + JNC READLOOP ; Jump if not. + INB DISK ; Get status. + AND AL,9CH + JNZ RETRY ; Jump if error. + ENDIF +; +;*************************************************** +; +; Boot for North Star disk, single density. +; Loads track 0, sector 0 into address LOAD +; + IF NORTHSTARSD +; +; Disk command equates +; +SEL: EQU 1 +STP1: EQU 9 +STP2: EQU 8 +NOP: EQU 10H +SEC: EQU 14H +STPOUT: EQU 1CH +RD: EQU 40H +BST: EQU 20H + + PUSH DS + MOV AX,0FEB8H + MOV DS,AX + MOV AL,[SEL] + MOV CX,20 +MOTOR: + CALL SECTOR + LOOP MOTOR +CHKTRK: + TEST B,[STPOUT],1 + JNZ ONTRACK + MOV AL,[STP1] + AAM + MOV AL,[STP2] + CALL SECTOR + CALL SECTOR + JP CHKTRK +SECTOR: + MOV AL,[SEC] ; Reset sector flag. +SECLP: + TEST B,[NOP],80H ; Wait for sector flag. + JZ SECLP + RET +ONTRACK: + MOV DI,LOAD + MOV CX,280 + MOV BX,RD+NOP +GETSEC: + CALL SECTOR + TEST B,[BST+NOP],0FH ; Test for sector zero. + JNZ GETSEC +GETSYNC: + TEST B,[NOP],4 + LOOPZ GETSYNC + JZ ONTRACK + MOV CX,100H + XOR DL,DL + AAD +READ: + MOV AL,[BX] + STOB ;Uses ES + XOR DL,AL + ROL DL + AAD + LOOP READ + MOV AL,[BX] + CMP AL,DL + JNZ ONTRACK + POP DS + ENDIF +; +; ******************************************************************** +; +; Boot for Tarbell disk controllers. Load track 0, sector 1 into LOAD. +; + IF TARBELLSD+TARBELLDD +DISK: EQU 78H + + IF TARBELLDD + SUB AH,AH ; Initial drive-select byte = 0. + ENDIF + + JP RETRY +DCOM: + OUTB DISK + MOV AL,50 +HOLD: + DEC AL + JNZ HOLD + RET + +RETRY: + MOV AL,0D0H + CALL DCOM +READY: + INB DISK + ROR AL + JC READY + + IF TARBELLDD + XOR AH,08H ; Try other density. + MOV AL,AH + OUTB DISK+4 + ENDIF + + MOV DI,LOAD + MOV AL,0EH ; Home command @ 10ms/track + CALL DCOM + INB DISK+4 + INB DISK + AND AL,98H + JNZ RETRY + MOV AL,1 + OUTB DISK+2 + MOV DX,DISK+3 ; Disk controller data port. + MOV AL,8CH + CALL DCOM + JMPS READ +READLOOP: + STOB ; Put in memory. +READ: + INB DISK+4 ; Wait for DRQ or INTRQ. + ROL AL ; Check for INTRQ. + INB DX ; Read data from disk controller chip. + JC READLOOP ; Jump if not. + INB DISK ; Read status. + AND AL,9CH + JNZ RETRY + ENDIF + +;*************************************************** + + IF OTHER + +;User may insert customized disk boot here. All +;registers are available, stack pointer is valid +;and interrupts are enabled. Stack should be at +;same level on fall-through to code below. Last +;address available is 07DF hex. + + ORG 7E0H ;Simulate boot of maximum length + + ENDIF + +;*************************************************** + +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10_CROMEMCO16FDC.BIN b/files/MON_1.5_1982-06-10_CROMEMCO16FDC.BIN new file mode 100644 index 0000000..42b0f25 Binary files /dev/null and b/files/MON_1.5_1982-06-10_CROMEMCO16FDC.BIN differ diff --git a/files/MON_1.5_1982-06-10_CROMEMCO16FDC.HEX b/files/MON_1.5_1982-06-10_CROMEMCO16FDC.HEX new file mode 100644 index 0000000..2e624ed --- /dev/null +++ b/files/MON_1.5_1982-06-10_CROMEMCO16FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857B0FFE604E4FFB103D2C024100C4C +:1A088400218AF8B030E634B9C4AAD40AD40AE2FAB0D0E630B90500D40AE2EA +:1A089E00FC80F7408AC7E634BF0002B00FE630E434D0C873FAE4302498752A +:1A08B800DBB001E6328AC70C80E634BA3300B08CE630EB01AAE434D0C8EC1A +:1808D20073F8E430249C75BAC706B2010000C706B40100025FE980FED6 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10_CROMEMCO4FDC.BIN b/files/MON_1.5_1982-06-10_CROMEMCO4FDC.BIN new file mode 100644 index 0000000..362e3d2 Binary files /dev/null and b/files/MON_1.5_1982-06-10_CROMEMCO4FDC.BIN differ diff --git a/files/MON_1.5_1982-06-10_CROMEMCO4FDC.HEX b/files/MON_1.5_1982-06-10_CROMEMCO4FDC.HEX new file mode 100644 index 0000000..70eb04b --- /dev/null +++ b/files/MON_1.5_1982-06-10_CROMEMCO4FDC.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857B0FFE604B721B0D0E630B9050089 +:1A088400D40AE2FC80F7108AC7E634BF0002B00FE630E434D0C873FAE430E5 +:1A089E00249875DBB001E6328AC70C80E634BA3300B08CE630EB01AAE43487 +:1A08B800D0C8EC73F8E430249C75BAC706B2010000C706B40100025FE99751 +:0108D200FE27 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10_NORTHSTAR.BIN b/files/MON_1.5_1982-06-10_NORTHSTAR.BIN new file mode 100644 index 0000000..0bfd580 Binary files /dev/null and b/files/MON_1.5_1982-06-10_NORTHSTAR.BIN differ diff --git a/files/MON_1.5_1982-06-10_NORTHSTAR.HEX b/files/MON_1.5_1982-06-10_NORTHSTAR.HEX new file mode 100644 index 0000000..3ab2e74 --- /dev/null +++ b/files/MON_1.5_1982-06-10_NORTHSTAR.HEX @@ -0,0 +1,82 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A082088571EB8B8FE8ED8A00100B91400E806 +:1A0884001900E2FBF6061C0001751BA00900D40AA00800E80500E80200EBCA +:1A089E00E9A01400F60610008074F9C3BF0002B91801BB5000E8E9FFF6067D +:1A08B80030000F75F6F606100004E1F974E4B9000132D2D50A8A07AA32D060 +:1A08D200D0C2D50AE2F58A073AC275CC1FC706B2010000C706B40100025F74 +:0308EC00E97BFEA7 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10_SCPDISKMASTER.BIN b/files/MON_1.5_1982-06-10_SCPDISKMASTER.BIN new file mode 100644 index 0000000..69fad0d Binary files /dev/null and b/files/MON_1.5_1982-06-10_SCPDISKMASTER.BIN differ diff --git a/files/MON_1.5_1982-06-10_SCPDISKMASTER.HEX b/files/MON_1.5_1982-06-10_SCPDISKMASTER.HEX new file mode 100644 index 0000000..4220606 --- /dev/null +++ b/files/MON_1.5_1982-06-10_SCPDISKMASTER.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857E4FFB103D2C024108AF8B0D0E609 +:1A088400E0B90500D40AE2FC80F7088AC70C80E6E4BF0002B00FE6E0E4E4CC +:1A089E00D0C873FA8AC7E6E4E4E0249875D5B001E6E2BAE300B08CE6E0EB53 +:1A08B80001AAE4E5D0C8EC73F8E4E0249C75BAC706B2010000C706B401000E +:0508D200025FE993FE46 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10_TARBELLDD.BIN b/files/MON_1.5_1982-06-10_TARBELLDD.BIN new file mode 100644 index 0000000..e21c223 Binary files /dev/null and b/files/MON_1.5_1982-06-10_TARBELLDD.BIN differ diff --git a/files/MON_1.5_1982-06-10_TARBELLDD.HEX b/files/MON_1.5_1982-06-10_TARBELLDD.HEX new file mode 100644 index 0000000..c6f5365 --- /dev/null +++ b/files/MON_1.5_1982-06-10_TARBELLDD.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A082088572AE4EB09E678B032FEC875FCC312 +:1A088400B0D0E8F2FFE478D0C872FA80F4088AC4E67CBF0002B00EE8DDFF32 +:1A089E00E47CE478249875DEB001E67ABA7B00B08CE8C9FFEB01AAE47CD07D +:1A08B800C0EC72F8E478249C75C2C706B2010000C706B40100025FE998FEDB +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.5_1982-06-10_TARBELLSD.BIN b/files/MON_1.5_1982-06-10_TARBELLSD.BIN new file mode 100644 index 0000000..692c90f Binary files /dev/null and b/files/MON_1.5_1982-06-10_TARBELLSD.BIN differ diff --git a/files/MON_1.5_1982-06-10_TARBELLSD.HEX b/files/MON_1.5_1982-06-10_TARBELLSD.HEX new file mode 100644 index 0000000..a2ff4be --- /dev/null +++ b/files/MON_1.5_1982-06-10_TARBELLSD.HEX @@ -0,0 +1,80 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BF9C01B90E00F3AB800EB70102B104B04036 +:1A011A00BFAC01F3ABC606A5010CBC9C01B017E6F5B0F3E6F4B88405E7F4AF +:1A013400BE3307BAF0002EAC8AC8E3052EACEEE2FB4280FAF875EFE819003D +:1A014E00BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4E80200EBF3E81A +:1A0168009800E895003C0D7401C3BF1801C6050DE4FFA8017403E9F506BE92 +:1A0182005107E88B00FC33C08ED88EC0BC9C01C7066400BB068C0E6600B0FA +:1A019C003EE8C800E81E00E87F0074DF8A052C4272103C13730C47D0E098BF +:1A01B600932EFF977D01EBC9E9A802BF180133C9E839003C20721B3C7F7406 +:1A01D0000EE894003C407425AA4183F95076E7E3E54F49E82900EBDE3C08E4 +:1A01EA0074F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE431 +:1A020400F7A80274F9E4F6247FFBC3BE73072EACE85100D0E073F7C3E80681 +:1A021E0000823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E878F2 +:1A0238000003D6EB098CC2B400E86D0003D782D400E812008AC6E802008A9A +:1A025200C28AE051B104D2E859E802008AC4240F04902714402750E4F7245D +:1A026C000174FA58E6F6C3B020EBF1E8F9FFE2FBC3760768030D02880397CD +:1A028600026A0668034C066803680368036A0268035906680368032F04BAF5 +:1A02A000026A058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D151 +:1A02BA00E2D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8014 +:1A02D40000E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B5D +:1A02EE0047B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB89A +:1A0308005247E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF26 +:1A0322005A4974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EB0F +:1A033C00DA518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC24D6 +:1A0356007F3C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508B3F +:1A037000F2B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37212 +:1A038A00074903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BFC +:1A03A400D9BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5134 +:1A03BE005052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A62E +:1A03D8008BCB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E8E6 +:1A03F200140072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C3094 +:1A040C0072883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9D6 +:1A0426000200E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A40 +:1A04400005473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FFDD +:1A045A0073FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE6AF7 +:1A04740007E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFF4B +:1A048E00E812FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A77 +:1A04A80005E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E07219 +:1A04C2000CE8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C53 +:1A04DC000D742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68A5E +:1A04F600F5E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBC4 +:1A051000FFE9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D13D +:1A052A00FF4F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FEAE +:1A05440020746DBFD706920E07B90E00F2AF753C0BC975064F4F2E8B45FE57 +:1A055E00E807FD8AC4E802FDE80AFD1E078D9DC3FA8B17E8D8FCE87DFCB0F8 +:1A0578003AE8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84215 +:1A05920052E99600BED706BB9C01B90800E86500E84FFCB90500E85C00E860 +:1A05AC00C5FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EC8 +:1A05C600FC33DB8B16B6018BF7AD3C0D746682FC0D7466BFF306B920000E63 +:1A05E00007F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510E2 +:1A05FA00750233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE89A +:1A06140052FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839F8 +:1A062E00FC8AC4E834FCBE6B07E93BFE8916B601C3B84246EBE5BEF306B965 +:1A06480010008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E8A4 +:1A06620004FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8928 +:1A067C00160201E8E0FDC70600010000800EB70101C7060C00D1058C0E0E1A +:1A06960000C7060400D8058C0E0600FAC7066400D8058C0E6600BC9C015843 +:1A06B0005B595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B40172 +:1A06CA008E1EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E4F5 +:1A06E4008ED4BCB001061E5756554C4C52515350161F8B26A4018E16B00149 +:1A06FE008F06B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C0135 +:1A071800C7066400BB06B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE044F +:1A073200018B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFA25 +:1A074C00B90400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC70 +:1A076600925AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43F5 +:1A078000434683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0493 +:1A079A00018B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C70628 +:1A07B40002010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C037466 +:1A07CE000258CFE820FAE9B0F9415842584358445853504250534944494448 +:1A07E800534553535343534950504300000000000000004F56444E454900DF +:1A080200004E475A5200004143000050450000435900000000000000004E98 +:1A081C0056555044490000504C4E5A00004E410000504F00004E4301190419 +:1A08360010020FFD01190418010BFD06630B070006000270050004B777CE53 +:1A085000370D0A0A5343502038303836204D6F6E69746F7220312E350D8A07 +:1A086A005E204572726F720D8A08208857EB09E678B032FEC875FCC3B0D0A0 +:1A088400E8F2FFE478D0C872FABF0002B00EE8E4FFE47CE478249875E5B055 +:1A089E0001E67ABA7B00B08CE8D0FFEB01AAE47CD0C0EC72F8E478249C754A +:1108B800C9C706B2010000C706B40100025FE9A1FE7B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.6_1982_XX-XX.ASM b/files/MON_1.6_1982_XX-XX.ASM new file mode 100644 index 0000000..49de14a --- /dev/null +++ b/files/MON_1.6_1982_XX-XX.ASM @@ -0,0 +1,1499 @@ +; Seattle Computer Products 8086 Monitor version 1.6 ?-??-82 +; for SCP Model 300F CPU Support Card +; by Tim Paterson +; Copyright 1982 by Seattle Computer Products, Inc. + +; To select a disk boot, set one of the following equates +; to 1, the rest to 0. + +SCP: EQU 1 ;1 for SCP, 0 for others. +TARBELLDD: EQU 0 ;Tarbell DD controller SD or DD + +PUTBASE:EQU 100H +LOAD: EQU 200H ;Track 0, sector 1 read in here +BOOTADDR:EQU 80H ;Boot is block moved to this RAM address + + ORG 7F0H + PUT PUTBASE+7F0H + JMP 0,0FF80H ;Power-on jump to monitor + +;Baud Rate Table. The 9513 divides 2MHz by these values. +;They are for 9600, 1200, 300, 150, 110 baud + +BAUD: DW 13,104,416,832,1144 + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU 2*BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 800H ;-0FF800H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 +REGSIZ EQU $-AXSAVE + +;Start of Monitor code + + ORG 0 + PUT PUTBASE + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV DI,AXSAVE + MOV CX,REGSIZ/2-1 + REP + STOW + MOV AH,2 + STOW ;Enable user interrupts + MOV B,[SPSAVE+1],16 ;Set user SP to 1000H +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + MOV AL,0F3H + OUT BASE+4 ;Low byte of Master Mode + MOV AX,584H ;Output 84H to BASE+4 + OUTW BASE+4 ;and 05H to BASE+5 +;Master Mode now set to 84F3H: +; Scaler set to BCD division +; Enable data pointer increment +; 8-bit data bus +; FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +; Both alarm comparators disabled +; Time-of-day enabled +;Counter 5 selected + +;Initialize loop. Ports BASE through BASE+7 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+8 ;Check against limit + JNZ INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 8251A is set for +;16X clock and two stop bits. + + IN BASE+15 ;Read sense switches + AND AL,18H ;Mask to baud rate selection bits + JZ AUTOBAUD ;If none selected, do auto baud rate + CMP AL,8 ;19.2K baud selected? + JZ MONITOR ;If so, we're all set + CALL INITBAUD + IN BASE+15 ;Read switches again + TEST AL,8 ;Check if auto baud selected now + JZ MONITOR ;If so, go to monitor + MOV AX,416 ;Go for 300 baud + OUTB BASE+4 ;Output low byte + MOV AL,AH ;Output high byte + OUTB BASE+4 + JP MONITOR + +AUTOBAUD: + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Intial baud rate (19.2k) was wrong, so run auto-baud routine + CALL INITBAUD +CHECKLOOP: + CALL CHECKB ;Check if baud rate correct + CALL INITB ;Try next rate if not + JP CHECKLOOP + +INITBAUD: + MOV SI,BAUD +;First set up 9513 for slower baud rates (<=9600). +;Counter 5 mode register has already been selected. + MOV AX,0E823H ;Output 23H to BASE+4 + OUTW BASE+4 ;and 0E8H to BASE+5 +;23H to BASE+4 sets lower half of Counter 5 mode register. +;Reload from Load, count down repetively in binary, +;toggle output. +;0E8H to BASE+5 disables data pointer sequencing + + MOV AL,0DH + OUT BASE+5 ;Select Counter 5 load reg. +INITB: + SEG CS + LODW ;Get divisor + OUT BASE+4 ;Output low byte + MOV AL,AH + OUT BASE+4 ;Output high byte + RET +CHECKB: + CALL IN ;First byte could be messed up + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JNZ RET ;Didn't get it yet + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JP COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JP GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JP OUT + +;Cancel input line + +KILL: + CALL CRLF + JP COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCAB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JP OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JP OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JP RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JP BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JP ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JP COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODB ;Bring first byte into AL +DOSCAN: + SCAB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JP SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JP GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JP STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JP GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JP GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JP NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCAW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCAW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JP GETFLG +DISPREGLINE: + SEG CS + LODW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JP FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JP STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP ES + PUSH DS + POP SS + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. This +;wouldn't be necessary if Automatic End of Interrupt mode +;worked like it was supposed to! + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, with Automatic End of Interrupt (which doesn't +;work in slaves), 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,0BH,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for Counter 5 mode register with auto increment. Thus +;mode is set to 0B63H, which is no gating, count source is +;F1 (4 MHz), reload from load or hold, count down repetitively +;in binary, with output toggle. Load register is set to +;0007H, and Hold register is set to 0006H. Thus we +;alternately divide by 7 and 6, which is divided by 2 by +;the output toggle, thus providing a square wave of +;4 MHz/13 = 307.7 kHz, which divided by 16 in the 8251A +;provides 19,230 baud (0.16% high). + DB 6 + DB 63H,0BH,7,0,6,0 +;Port BASE+5 - 9513 Control. Load and arm counter 5, +;enabling baud rate generation. Then select counter +;5 mode register, in case baud rate wasn't right. + DB 2 + DB 70H,5 +;Port BASE+6 - 8251A Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.6",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES: DM 8,32,8 + +BOOT: + PUSH DI + +;Block move the boot code to RAM. +;If the RAM is 16-bit, then we'll be able to boot double-density +;at 4MHz CPU clock (great for 8087 work). + + MOV SI,BOOTPROG + MOV DI,BOOTADDR + MOV CX,BOOTLEN + SEG CS + REP + MOVW + JMP BOOTADDR+SEGDIF + +BOOTPROG: + + IF SCP +DISK: EQU 0E0H +WAITP: EQU DISK+5 + ENDIF + + IF TARBELLDD +DISK: EQU 78H +WAITP: EQU DISK+4 + ENDIF + + ORG BOOTADDR + + IF SCP + INB BASE+15 ; Get sense switch data. + MOV CL,3 ; Shift bit 1 over to bit 4 so it + ROL AL,CL ; can be used for large/small bit. + AND AL,10H ; Keep only the large/small bit. + MOV BH,AL ; Put drive select byte in BH. + ENDIF + + IF TARBELLDD + XOR BH,BH + ENDIF + + MOV AL,0D0H ; Force-interrupt command. + OUTB DISK + MOV CX,5 +DELAY: + AAM ; Give force-interrupt time. + LOOP DELAY +RETRY: + XOR BH,08H ; Flip density bit. + MOV AL,BH + OUTB DISK+4 ; Select drive type & density + MOV AL,08H ; Restore command. + OUTB DISK + INB WAITP ; Wait for INTRQ. + MOV DI,LOAD + MOV AL,1 ; Ask for sector 1. + OUTB DISK+2 + MOV DX,DISK+3 ; Disk controller data port. + MOV AL,8CH ; Read command. + OUTB DISK + JMPS READ +READLOOP: + STOB ; Put data in memory. +READ: + INB WAITP ; Wait for DRQ or INTRQ. + + IF SCP + RCR AL ; Check for INTRQ. + INB DX ; Read data from disk controller chip. + JNC READLOOP ; Jump if no INTRQ + ENDIF + + IF TARBELLDD + RCL AL ; Check for INTRQ. + INB DX ; Read data from disk controller chip. + JC READLOOP ; Jump if no INTRQ + ENDIF + + INB DISK ; Get status. + AND AL,9CH + JNZ RETRY ; Jump if error. +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO-SEGDIF + +BOOTLEN EQU ($-BOOTADDR+1)/2 + \ No newline at end of file diff --git a/files/MON_1.6_1982_XX-XX_SCPDISKMASTER.BIN b/files/MON_1.6_1982_XX-XX_SCPDISKMASTER.BIN new file mode 100644 index 0000000..7a5f415 Binary files /dev/null and b/files/MON_1.6_1982_XX-XX_SCPDISKMASTER.BIN differ diff --git a/files/MON_1.6_1982_XX-XX_SCPDISKMASTER.HEX b/files/MON_1.6_1982_XX-XX_SCPDISKMASTER.HEX new file mode 100644 index 0000000..718c1cd --- /dev/null +++ b/files/MON_1.6_1982_XX-XX_SCPDISKMASTER.HEX @@ -0,0 +1,82 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BC9C01BF9C01B90D00F3ABB402ABC606A5F9 +:1A011A000110B017E6F5B0F3E6F4B88405E7F4BE4C07BAF0002EAC8AC8E3B5 +:1A013400052EACEEE2FB4280FAF875EFE4FF241874183C087441E81F00E460 +:1A014E00FFA8087438B8A001E6F48AC4E6F4EB2DE82000E80800E81A00E8E7 +:1A0168000E00EBF8BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4C3E814 +:1A0182009700E894003C0D75F5BF1801C6050DE4FFA8017403E9F506BE6ADE +:1A019C0007E88B00FC33C08ED88EC0BC9C01C7066400D4068C0E6600B03EDA +:1A01B600E8C800E81E00E87F0074DF8A052C4272103C13730C47D0E0989350 +:1A01D0002EFF979601EBC9E9A802BF180133C9E839003C20721B3C7F740E58 +:1A01EA00E894003C407425AA4183F95076E7E3E54F49E82900EBDE3C087464 +:1A020400F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE4F793 +:1A021E00A80274F9E4F6247FFBC3BE8C072EACE85100D0E073F7C3E8060045 +:1A023800823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E87800D8 +:1A02520003D6EB098CC2B400E86D0003D782D400E812008AC6E802008AC2BE +:1A026C008AE051B104D2E859E802008AC4240F04902714402750E4F7240104 +:1A02860074FA58E6F6C3B020EBF1E8F9FFE2FBC38F0781032602A103B00235 +:1A02A000830681036506810381038103830281037206810381034804D30296 +:1A02BA0083058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D1E23E +:1A02D400D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8000DC +:1A02EE00E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B47FC +:1A030800B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB85274 +:1A03220047E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF5A04 +:1A033C004974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EBDA75 +:1A035600518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC247F17 +:1A0370003C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508BF2B2 +:1A038A00B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37207E3 +:1A03A4004903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BD910 +:1A03BE00BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5150A3 +:1A03D80052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A68BD9 +:1A03F200CB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E81443 +:1A040C000072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C30721B +:1A042600883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9022C +:1A04400000E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A0523 +:1A045A00473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FF7355 +:1A047400FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE830730 +:1A048E00E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFFE850 +:1A04A80012FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A0540 +:1A04C200E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E0720CF8 +:1A04DC00E8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C0D38 +:1A04F600742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68AF55C +:1A051000E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBFF9F +:1A052A00E9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D1FF23 +:1A0544004F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FE2073 +:1A055E00746DBFF006920E07B90E00F2AF753C0BC975064F4F2E8B45FEE85C +:1A05780007FD8AC4E802FDE80AFD1E078D9DAAFA8B17E8D8FCE87DFCB03AA5 +:1A059200E8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84252E3 +:1A05AC00E99600BEF006BB9C01B90800E86500E84FFCB90500E85C00E8C5BA +:1A05C600FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EFC77 +:1A05E00033DB8B16B6018BF7AD3C0D746682FC0D7466BF0C07B920000E0724 +:1A05FA00F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510755A +:1A0614000233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE852A2 +:1A062E00FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839FC34 +:1A0648008AC4E834FCBE8407E93BFE8916B601C3B84246EBE5BE0C07B91004 +:1A066200008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E80496 +:1A067C00FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8916FC +:1A0696000201E8E0FDC70600010000800EB70101C7060C00EA058C0E0E00FD +:1A06B000C7060400F1058C0E0600FAC7066400F1058C0E6600BC9C01585B9C +:1A06CA00595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B4018E25 +:1A06E4001EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E48EDB +:1A06FE00D4BCB001061E5756554C4C52515350161F8B26A4018E16B0018F2E +:1A07180006B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C01C7E2 +:1A073200066400D406B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE0401E2 +:1A074C008B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFAB953 +:1A0766000400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC927D +:1A0780005AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43432A +:1A079A004683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0401BB +:1A07B4008B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C706020D +:1A07CE00010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C0374024C +:1A07E80058CFE820FAE9B0F9415842584358445853504250534944494453DD +:1A0802004553535343534950504300000000000000004F56444E4549000017 +:1A081C004E475A5200004143000050450000435900000000000000004E5628 +:1A083600555044490000504C4E5A00004E410000504F00004E430119041045 +:1A085000020FFD01190418010BFD06630B070006000270050004B777CE3712 +:1A086A000D0A0A5343502038303836204D6F6E69746F7220312E360D8A5EC5 +:1A088400204572726F720D8A08208857BE9F07BF8000B928002EF3A5E9E17E +:1A089E0000E4FFB103D2C024108AF8B0D0E6E0B90500D40AE2FC80F7088A98 +:1A08B800C7E6E4B008E6E0E4E5BF0002B001E6E2BAE300B08CE6E0EB01AADF +:1A08D200E4E5D0D8EC73F8E4E0249C75D5C706B2010000C706B40100025F13 +:0308EC00E9B3FD70 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.6_1982_XX-XX_TARBELLDD.BIN b/files/MON_1.6_1982_XX-XX_TARBELLDD.BIN new file mode 100644 index 0000000..97f2caa Binary files /dev/null and b/files/MON_1.6_1982_XX-XX_TARBELLDD.BIN differ diff --git a/files/MON_1.6_1982_XX-XX_TARBELLDD.HEX b/files/MON_1.6_1982_XX-XX_TARBELLDD.HEX new file mode 100644 index 0000000..c492c1d --- /dev/null +++ b/files/MON_1.6_1982_XX-XX_TARBELLDD.HEX @@ -0,0 +1,81 @@ +:0F08F000EA000080FF0D006800A00140037804BB +:1A010000FC33C08ED08ED88EC0BC9C01BF9C01B90D00F3ABB402ABC606A5F9 +:1A011A000110B017E6F5B0F3E6F4B88405E7F4BE4C07BAF0002EAC8AC8E3B5 +:1A013400052EACEEE2FB4280FAF875EFE4FF241874183C087441E81F00E460 +:1A014E00FFA8087438B8A001E6F48AC4E6F4EB2DE82000E80800E81A00E8E7 +:1A0168000E00EBF8BEF507B823E8E7F4B00DE6F52EADE6F48AC4E6F4C3E814 +:1A0182009700E894003C0D75F5BF1801C6050DE4FFA8017403E9F506BE6ADE +:1A019C0007E88B00FC33C08ED88EC0BC9C01C7066400D4068C0E6600B03EDA +:1A01B600E8C800E81E00E87F0074DF8A052C4272103C13730C47D0E0989350 +:1A01D0002EFF979601EBC9E9A802BF180133C9E839003C20721B3C7F740E58 +:1A01EA00E894003C407425AA4183F95076E7E3E54F49E82900EBDE3C087464 +:1A020400F33C0D75D6AABF1801B00DE86F00B00AEB6BE8F4FFEB85FAE4F793 +:1A021E00A80274F9E4F6247FFBC3BE8C072EACE85100D0E073F7C3E8060045 +:1A023800823D2C750A47B02051B1FFF3AE4F59823D0DC38CDAB400E87800D8 +:1A02520003D6EB098CC2B400E86D0003D782D400E812008AC6E802008AC2BE +:1A026C008AE051B104D2E859E802008AC4240F04902714402750E4F7240104 +:1A02860074FA58E6F6C3B020EBF1E8F9FFE2FBC38F0781032602A103B00235 +:1A02A000830681036506810381038103830281037206810381034804D30296 +:1A02BA0083058AC2240FE807008AD08AC632F6C3D1E2D0D4D1E2D0D4D1E23E +:1A02D400D0D4D1E2D0D4C3B90500E822015052E84FFF823D4C741CBA8000DC +:1A02EE00E83001721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B47FC +:1A030800B90400E8F5008BCA5A588BDA81E30F00E30403D9739E749CB85274 +:1A03220047E91F03E8B2FF50E84E011F8BF2E818FF56E855FFACE831FF5A04 +:1A033C004974178BC6A80F740C52A80775EAB02DE832FFEBE6E80200EBDA75 +:1A035600518BC68BF22BC28BD8D1E003C3B933002BC8E825FF8BCBAC247F17 +:1A0370003C7F74043C207302B02EE804FFE2EE59E98AFEE855FF51508BF2B2 +:1A038A00B90500E87300E8E800E826FF8BFA5B8EDB8EC0593BFE1BC37207E3 +:1A03A4004903F103F9FD41A449F3A4C3E828FF515052E8B4005F07593BD910 +:1A03BE00BE1801E30273E62BCB87D957F3A45E8BCB061FEBD8E805FF5150A3 +:1A03D80052E891004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A68BD9 +:1A03F200CB5F5B75084FE85BFE47E80EFEE3AEEBDFE82FFE33D28AE6E81443 +:1A040C000072738AD04749E80B007297E368E8ADFE0AD0EBF08A052C30721B +:1A042600883C0AF573832C073C0A72033C10F5C3E8FCFDE8E5FF720BB9022C +:1A04400000E8BFFF881743F8C38A053C2774063C227402F9C38AE0478A0523 +:1A045A00473C0D74233AC475053A2575E047880743EBEBBB1801E8C3FF7355 +:1A047400FB81EB18017407E8C0FD7502C34F81EF17018BCFE805FEBE830730 +:1A048E00E89AFDE90CFDE8D6FF5F07BE18018BCBF3A4C3B90500E85CFFE850 +:1A04A80012FE82EC0880C6805052E889FD75DD5F07E89AFDE8CDFD268A0540 +:1A04C200E8A7FDB02EE8B7FDB90200BA0000E848FD8AE0E84BFF86E0720CF8 +:1A04DC00E8A2FD8AF28AD4E2EBE833FD3C0874193C7F74153C2D744D3C0D38 +:1A04F600742F3C207431B007E880FDE3E2EBCB82F90274C6FEC18AD68AF55C +:1A051000E815FDEBBB82F902740B51B104D2E6590AD626881547C3E8EBFF9F +:1A052A00E9E0FCE8E5FF4141E85BFD8BC724077584E8CFFCE978FFE8D1FF23 +:1A0544004F4FEBF3E8EAFC74628A15478A3582FE0D747647E820FF82FE2073 +:1A055E00746DBFF006920E07B90E00F2AF753C0BC975064F4F2E8B45FEE85C +:1A05780007FD8AC4E802FDE80AFD1E078D9DAAFA8B17E8D8FCE87DFCB03AA5 +:1A059200E8ECFCE842FCE8A3FC740BB90400E863FEE8D5FE8917C3B84252E3 +:1A05AC00E99600BEF006BB9C01B90800E86500E84FFCB90500E85C00E8C5BA +:1A05C600FCE89300E940FC82FA4675D7E88800B02DE8A7FCE8FDFBE85EFC77 +:1A05E00033DB8B16B6018BF7AD3C0D746682FC0D7466BF0C07B920000E0724 +:1A05FA00F2AF755A8AE980E10FB80100D3C085C375330BD80BD0F6C510755A +:1A0614000233D08BFE1E07E817FCEBC62EADE85CFC8AC4E857FCB03DE852A2 +:1A062E00FC8B174343E82FFCE853FCE850FCE2E2C3B84446E80E00E839FC34 +:1A0648008AC4E834FCBE8407E93BFE8916B601C3B84246EBE5BE0C07B91004 +:1A066200008B16B6012EADD1E272042E8B441E0BC0740BE809FC8AC4E80496 +:1A067C00FCE80CFCE2E5C3E8AFFBE898FDBA01007206B90400E86FFD8916FC +:1A0696000201E8E0FDC70600010000800EB70101C7060C00EA058C0E0E00FD +:1A06B000C7060400F1058C0E0600FAC7066400F1058C0E6600BC9C01585B9C +:1A06CA00595A5D5D5E5F0707178B26A401FF36B601FF36B201FF36B4018E25 +:1A06E4001EAC01CFEBB187ECFF4E0087EC2E8926A4092E8C16B00933E48EDB +:1A06FE00D4BCB001061E5756554C4C52515350161F8B26A4018E16B0018F2E +:1A07180006B4018F06B2015880E4FEA3B6018926A4011E071E17BC9C01C7E2 +:1A073200066400D406B020E6F2FBFCE8CDFAE86CFEFF0E0201759FBE0401E2 +:1A074C008B0E0001E3108B5414AD50E862FB8EC08BFA58AAE2F0E93BFAB953 +:1A0766000400E898FCECE8FDFAE99BFAB90400E88BFC52B90200E884FC927D +:1A0780005AEEC3BB180133F6E8AAFA7419B90500E870FC89178867ED43432A +:1A079A004683FE0B75E8B84250E99FFE89360001E8CEFC8BCEE31ABE0401BB +:1A07B4008B5414ADE801FB8ED88BFA8A05C605CC061F8844FEE2E9C706020D +:1A07CE00010100E9D2FE50B020E6F2E4F6247F3C137503E837FA3C0374024C +:1A07E80058CFE820FAE9B0F9415842584358445853504250534944494453DD +:1A0802004553535343534950504300000000000000004F56444E4549000017 +:1A081C004E475A5200004143000050450000435900000000000000004E5628 +:1A083600555044490000504C4E5A00004E410000504F00004E430119041045 +:1A085000020FFD01190418010BFD06630B070006000270050004B777CE3712 +:1A086A000D0A0A5343502038303836204D6F6E69746F7220312E360D8A5EC5 +:1A088400204572726F720D8A08208857BE9F07BF8000B924002EF3A5E9E182 +:1A089E000032FFB0D0E678B90500D40AE2FC80F7088AC7E67CB008E678E48B +:1A08B8007CBF0002B001E67ABA7B00B08CE678EB01AAE47CD0D0EC72F8E439 +:1508D20078249C75D5C706B2010000C706B40100025FE9BBFD8B +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.9_1983_08_04.ASM b/files/MON_1.9_1983_08_04.ASM new file mode 100644 index 0000000..92dd358 --- /dev/null +++ b/files/MON_1.9_1983_08_04.ASM @@ -0,0 +1,1649 @@ +; Seattle Computer Products 8086 Monitor version 1.9 4-02-83 +; for SCP Model 301A CPU Support Card +; by Tim Paterson +; Copyright 1982,83 by Seattle Computer Products, Inc. +; Revised 8-04-83 by Craig Derouen + +; Rev 1.9 : Allow hard disk boot if sense switch # 3 is set. Also +; : allow lowercase letters for command to be accepted. + + +; To select a disk boot, set one of the following equates +; to 1, the rest to 0. + +SCP: EQU 1 ;SCP DISK MASTER +TARBELLDD: EQU 0 ;Tarbell DD controller + +PUTBASE:EQU 100H +LOAD: EQU 200H ;Track 0, sector 1 read in here +BOOTADDR EQU 80H ;Boot is block moved to this RAM address + + ORG 0FF0H + PUT PUTBASE+$ + JMP 0,0FF00H ;Power-on jump to monitor + +;Baud Rate Table. +;Entries for 9600, 4800, 2400, 1200, 300, 150, 110 baud + +BAUD: DB 0EH,0CH,0AH,07H,05H,04H,02H + + ORG 100H ;RAM area base address + +;System Equates + +BASE: EQU 0F0H ;CPU Support base port address +STAT: EQU BASE+7 ;UART status port +DATA: EQU BASE+6 ;UART data port +DAV: EQU 2 ;UART data available bit +TBMT: EQU 1 ;UART transmitter ready bit +BUFLEN: EQU 80 ;Maximum length of line input buffer +BPMAX: EQU 10 ;Maximum number of breakpoints +BPLEN: EQU 2*BPMAX ;Length of breakpoint table +REGTABLEN:EQU 14 ;Number of registers +SEGDIF: EQU 1000H ;-0FF000H (ROM address) +PROMPT: EQU ">" +CAN: EQU "@" + +;RAM area. + +BRKCNT: DS 2 ;Number of breakpoints +TCOUNT: DS 2 ;Number of steps to trace +BPTAB: DS BPLEN ;Breakpoint table +LINEBUF:DS BUFLEN+1 ;Line input buffer + ALIGN + DS 50 ;Working stack area +STACK: + +;Register save area + +AXSAVE: DS 2 +BXSAVE: DS 2 +CXSAVE: DS 2 +DXSAVE: DS 2 +SPSAVE: DS 2 +BPSAVE: DS 2 +SISAVE: DS 2 +DISAVE: DS 2 +DSSAVE: DS 2 +ESSAVE: DS 2 +RSTACK: ;Stack set here so registers can be saved by pushing +SSSAVE: DS 2 +CSSAVE: DS 2 +IPSAVE: DS 2 +FSAVE: DS 2 +REGSIZ EQU $-AXSAVE + +;Start of Monitor code + + ORG 0 + PUT PUTBASE+$ + +;One-time initialization + + UP + XOR AX,AX + MOV SS,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV DI,AXSAVE + MOV CX,REGSIZ/2-1 + REP + STOSW + MOV AH,2 + STOSW ;Enable user interrupts + MOV B,[SPSAVE+1],16 ;Set user SP to 1000H +;Prepare 9513 + MOV AL,17H + OUT BASE+5 ;Select Master Mode register + +;Initialize loop. Ports BASE through BASE+11 are initialized +;from table. Each table entry has number of bytes followed by +;data. + + MOV SI,INITTABLE ;Initialization table + MOV DX,BASE ;DX has (variable) port no. +INITPORT: + SEG CS + LODSB ;Get byte count + MOV CL,AL + JCXZ NEXTPORT ;No init. for some ports +INITBYTE: + SEG CS + LODSB ;Get init. data + OUT DX ;Send to port + LOOP INITBYTE ;As many bytes as required +NEXTPORT: + INC DX ;Prepare for next port + CMP DL,BASE+11 ;Check against limit + JBE INITPORT + +;Initialization complete except for determining baud rate. +;Both 8259As are ready to accept interrupts, the 8251A is set for +;16X clock and two stop bits. + + IN BASE+15 ;Read sense switches + AND AL,18H ;Mask to baud rate selection bits + JZ AUTOBAUD ;If none selected, do auto baud rate + CMP AL,8 ;19.2K baud selected? + JZ MONITOR ;If so, we're all set + TEST AL,8 ;300 or 9600 selected? + MOV AL,0EH ;Ready to select 9600 baud + JZ NEWBAUD ;9600 baud if bit 3 is zero + MOV AL,5 ;Go for 300 baud +NEWBAUD: + OUT BASE+10 + JMPS MONITOR + +AUTOBAUD: + CALL CHECKB ;Check for correct baud rate +;CHECKB does not return if baud rate is correct + +;Initial baud rate (19.2k) was wrong, so run auto-baud routine + MOV SI,BAUD +CHECKLOOP: + CALL NEXTB ;Check if baud rate correct + JMPS CHECKLOOP ;Try next rate if not + +NEXTB: + SEG CS + LODSB ;Get new baud rate + OUT BASE+10 ;Send to baud rate generator +CHECKB: + CALL CHECKB2 +CHECKB2: + CALL IN ;Get carriage return + CMP AL,13 ;Correct? + JZ MONITOR ;Don't return if correct + RET + +;Initialization complete, including baud rate. + +MONITOR: +; Do auto boot if sense switch 0 is on. + MOV DI,LINEBUF + MOV B,[DI],13 ;No breakpoints after boot + IN BASE+0FH ;Sense switch port + TEST AL,1 + JZ DOMON + JMP BOOT +DOMON: + MOV SI,HEADER + CALL PRINTMES +COMMAND: +;Re-establish initial conditions + UP + XOR AX,AX + MOV DS,AX + MOV ES,AX + MOV SP,STACK + MOV [64H],INT ;Set UART interrupt vector + MOV [66H],CS + MOV AL,PROMPT + CALL OUT + CALL INBUF ;Get command line +;From now and throughout command line processing, DI points +;to next character in command line to be processed. + CALL SCANB ;Scan off leading blanks + JZ COMMAND ;Null command? + MOV AL,[DI] ;AL=first non-blank character + AND AL,0DFH ;Convert lower case +;Prepare command letter for table lookup + SUB AL,"B" ;Low end range check + JC ERR1 + CMP AL,"T"+1-"B" ;Upper end range check + JNC ERR1 + INC DI + SHL AL ;Times two + CBW ;Now a 16-bit quantity + XCHG BX,AX ;In BX we can address with it + SEG CS + CALL [BX+COMTAB] ;Execute command + JMPS COMMAND ;Get next command +ERR1: JMP ERROR + +;Get input line + +INBUF: + MOV DI,LINEBUF ;Next empty buffer location + XOR CX,CX ;Character count +GETCH: + CALL IN ;Get input character + CMP AL,20H ;Check for control characters + JC CONTROL + CMP AL,7FH ;RUBOUT is a backspace + JZ BACKSP + CALL OUT ;Echo character + CMP AL,CAN ;Cancel line? + JZ KILL + STOSB ;Put in input buffer + INC CX ;Bump character count + CMP CX,BUFLEN ;Buffer full? + JBE GETCH ;Drop in to backspace if full +BACKSP: + JCXZ GETCH ;Can't backspace over nothing + DEC DI ;Drop pointer + DEC CX ;and character count + CALL BACKUP ;Send physical backspace + JMPS GETCH ;Get next char. +CONTROL: + CMP AL,8 ;Check for backspace + JZ BACKSP + CMP AL,13 ;Check for carriage return + JNZ GETCH ;Ignore all other control char. + STOSB ;Put the car. ret. in buffer + MOV DI,LINEBUF ;Set up DI for command processing + +;Output CR/LF sequence + +CRLF: + MOV AL,13 + CALL OUT + MOV AL,10 + JMPS OUT + +;Cancel input line + +KILL: + CALL CRLF + JMPS COMMAND + +;Character input routine + +IN: + DI ;Poll, don't interrupt + INB STAT + TEST AL,DAV + JZ IN ;Loop until ready + INB DATA + AND AL,7FH ;Only 7 bits + EI ;Interrupts OK now + RET + +;Physical backspace - blank, backspace, blank + +BACKUP: + MOV SI,BACMES + +;Print ASCII message. Last char has bit 7 set + +PRINTMES: + SEG CS + LODSB ;Get char to print + CALL OUT + SHL AL ;High bit set? + JNC PRINTMES + RET + +;Scan for parameters of a command + +SCANP: + CALL SCANB ;Get first non-blank + CMP B,[DI],"," ;One comma between params OK + JNE EOLCHK ;If not comma, we found param + INC DI ;Skip over comma + +;Scan command line for next non-blank character + +SCANB: + MOV AL," " + PUSH CX ;Don't disturb CX + MOV CL,-1 ;but scan as many as necessary + REPE + SCASB + DEC DI ;Back up to first non-blank + POP CX +EOLCHK: + CMP B,[DI],13 + RET + +;Print the 5-digit hex address of SI and DS + +OUTSI: + MOV DX,DS ;Put DS where we can work with it + MOV AH,0 ;Will become high bits of DS + CALL SHIFT4 ;Shift DS four bits + ADD DX,SI ;Compute absolute address + JMPS OUTADD ;Finish below + +;Print 5-digit hex address of DI and ES +;Same as OUTSI above + +OUTDI: + MOV DX,ES + MOV AH,0 + CALL SHIFT4 + ADD DX,DI +;Finish OUTSI here too +OUTADD: + ADC AH,0 ;Add in carry to high bits + CALL HIDIG ;Output hex value in AH + +;Print out 16-bit value in DX in hex + +OUT16: + MOV AL,DH ;High-order byte first + CALL HEX + MOV AL,DL ;Then low-order byte + +;Output byte in AL as two hex digits + +HEX: + MOV AH,AL ;Save for second digit +;Shift high digit into low 4 bits + PUSH CX + MOV CL,4 + SHR AL,CL + POP CX + + CALL DIGIT ;Output first digit +HIDIG: + MOV AL,AH ;Now do digit saved in AH +DIGIT: + AND AL,0FH ;Mask to 4 bits +;Trick 6-byte hex conversion works on 8086 too. + ADD AL,90H + DAA + ADC AL,40H + DAA + +;Console output of character in AL + +OUT: + PUSH AX ;Character to output on stack +OUT1: + INB STAT + AND AL,TBMT + JZ OUT1 ;Wait until ready + POP AX + OUTB DATA + RET + +;Output one space + +BLANK: + MOV AL," " + JMPS OUT + +;Output the number of blanks in CX + +TAB: + CALL BLANK + LOOP TAB + RET + +;Command Table. Command letter indexes into table to get +;address of command. PERR prints error for no such command. + +COMTAB: + DW BOOT ;B + DW PERR ;C + DW DUMP ;D + DW ENTER ;E + DW FILL ;F + DW GO ;G + DW PERR ;H + DW INPUT ;I + DW PERR ;J + DW PERR ;K + DW PERR ;L + DW MOVE ;M + DW PERR ;N + DW OUTPUT ;O + DW PERR ;P + DW PERR ;Q + DW REG ;R + DW SEARCH ;S + DW TRACE ;T + +;Given 20-bit address in AH:DX, breaks it down to a segment +;number in AX and a displacement in DX. Displacement is +;always zero except for least significant 4 bits. + +GETSEG: + MOV AL,DL + AND AL,0FH ;AL has least significant 4 bits + CALL SHIFT4 ;4-bit left shift of AH:DX + MOV DL,AL ;Restore lowest 4 bits + MOV AL,DH ;Low byte of segment number + XOR DH,DH ;Zero high byte of displacement + RET + +;Shift AH:DX left 4 bits + +SHIFT4: + SHL DX + RCL AH ;1 + SHL DX + RCL AH ;2 + SHL DX + RCL AH ;3 + SHL DX + RCL AH ;4 +RET2: RET + +;RANGE - Looks for parameters defining an address range. +;The first parameter is a hex number of 5 or less digits +;which specifies the starting address. The second parameter +;may specify the ending address, or it may be preceded by +;"L" and specify a length (4 digits max), or it may be +;omitted and a length of 128 bytes is assumed. Returns with +;segment no. in AX and displacement (0-F) in DX. + +RANGE: + MOV CX,5 ;5 digits max + CALL GETHEX ;Get hex number + PUSH AX ;Save high 4 bits + PUSH DX ;Save low 16 bits + CALL SCANP ;Get to next parameter + CMP B,[DI],"L" ;Length indicator? + JE GETLEN + CMP B,[DI],"l" + JE GETLEN + MOV DX,128 ;Default length + CALL HEXIN ;Second parameter present? + JC RNGRET ;If not, use default + MOV CX,5 ;5 hex digits + CALL GETHEX ;Get ending address + MOV CX,DX ;Low 16 bits of ending addr. + POP DX ;Low 16 bits of starting addr. + POP BX ;BH=hi 4 bits of start addr. + SUB CX,DX ;Compute range + SBB AH,BH ;Finish 20-bit subtract + JNZ RNGERR ;Range must be less than 64K + XCHG AX,BX ;AH=starting, BH=ending hi 4 bits + INC CX ;Range must include ending location + JMPS RNGCHK ;Finish range testing and return +GETLEN: + INC DI ;Skip over "L" to length + MOV CX,4 ;Length may have 4 digits + CALL GETHEX ;Get the range +RNGRET: + MOV CX,DX ;Length + POP DX ;Low 16 bits of starting addr. + POP AX ;AH=hi 4 bits of starting addr. + +;RNGCHK verifies that the range lies entirely within one segment. +;CX=0 means count=10000H. Range is within one segment only if +;adding the low 4 bits of the starting address to the count is +;<=10000H, because segments can start only on 16-byte boundaries. + +RNGCHK: + MOV BX,DX ;Low 16 bits of start addr. + AND BX,0FH ;Low 4 bits of starting addr. + JCXZ MAXRNG ;If count=10000H then BX must be 0 + ADD BX,CX ;Must be <=10000H + JNC GETSEG ;OK if strictly < +MAXRNG: +;If here because of JCXZ MAXRNG, we are testing if low 4 bits +;(in BX) are zero. If we dropped straight in, we are testing +;for BX+CX=10000H (=0). Either way, zero flag set means +;withing range. + JZ GETSEG +RNGERR: + MOV AX,4700H+"R" ;RG ERROR + JMP ERR + +;Dump an area of memory in both hex and ASCII + +DUMP: + CALL RANGE ;Get range to dump + PUSH AX ;Save segment + CALL GETEOL ;Check for errors + POP DS ;Set segment + MOV SI,DX ;SI has displacement in segment +ROW: + CALL OUTSI ;Print address at start of line + PUSH SI ;Save address for ASCII dump +BYTE: + CALL BLANK ;Space between bytes +BYTE1: + LODSB ;Get byte to dump + CALL HEX ;and display it + POP DX ;DX has start addr. for ASCII dump + DEC CX ;Drop loop count + JZ ASCII ;If through do ASCII dump + MOV AX,SI + TEST AL,0FH ;On 16-byte boundary? + JZ ENDROW + PUSH DX ;Didn't need ASCII addr. yet + TEST AL,7 ;On 8-byte boundary? + JNZ BYTE + MOV AL,"-" ;Mark every 8 bytes + CALL OUT + JMPS BYTE1 +ENDROW: + CALL ASCII ;Show it in ASCII + JMPS ROW ;Loop until count is zero +ASCII: + PUSH CX ;Save byte count + MOV AX,SI ;Current dump address + MOV SI,DX ;ASCII dump address + SUB AX,DX ;AX=length of ASCII dump +;Compute tab length. ASCII dump always appears on right side +;screen regardless of how many bytes were dumped. Figure 3 +;characters for each byte dumped and subtract from 51, which +;allows a minimum of 3 blanks after the last byte dumped. + MOV BX,AX + SHL AX ;Length times 2 + ADD AX,BX ;Length times 3 + MOV CX,51 + SUB CX,AX ;Amount to tab in CX + CALL TAB + MOV CX,BX ;ASCII dump length back in CX +ASCDMP: + LODSB ;Get ASCII byte to dump + AND AL,7FH ;ASCII uses 7 bits + CMP AL,7FH ;Don't try to print RUBOUT + JZ NOPRT + CMP AL," " ;Check for control characters + JNC PRIN +NOPRT: + MOV AL,"." ;If unprintable character +PRIN: + CALL OUT ;Print ASCII character + LOOP ASCDMP ;CX times + POP CX ;Restore overall dump length + JMP CRLF ;Print CR/LF and return + +;Block move one area of memory to another. Overlapping moves +;are performed correctly, i.e., so that a source byte is not +;overwritten until after it has been moved. + +MOVE: + CALL RANGE ;Get range of source area + PUSH CX ;Save length + PUSH AX ;Save segment + MOV SI,DX ;Set source displacement + MOV CX,5 ;Allow 5 digits + CALL GETHEX ;in destination address + CALL GETEOL ;Check for errors + CALL GETSEG ;Convert dest. to seg/disp + MOV DI,DX ;Set dest. displacement + POP BX ;Source segment + MOV DS,BX + MOV ES,AX ;Destination segment + POP CX ;Length + CMP DI,SI ;Check direction of move + SBB AX,BX ;Extend the CMP to 32 bits + JB COPYLIST ;Move forward into lower mem. +;Otherwise, move backward. Figure end of source and destination +;areas and flip direction flag. + DEC CX + ADD SI,CX ;End of source area + ADD DI,CX ;End of destination area + DOWN ;Reverse direction + INC CX +COPYLIST: + MOVSB ;Do at least 1 - Range is 1-10000H not 0-FFFFH + DEC CX + REP + MOVSB ;Block move + RET + +;Fill an area of memory with a list values. If the list +;is bigger than the area, don't use the whole list. If the +;list is smaller, repeat it as many times as necessary. + +FILL: + CALL RANGE ;Get range to fill + PUSH CX ;Save length + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get list of values to fill with + POP DI ;Displacement in segment + POP ES ;Segment + POP CX ;Length + CMP BX,CX ;BX is length of fill list + MOV SI,LINEBUF ;List is in line buffer + JCXZ BIGRNG + JAE COPYLIST ;If list is big, copy part of it +BIGRNG: + SUB CX,BX ;How much bigger is area than list? + XCHG CX,BX ;CX=length of list + PUSH DI ;Save starting addr. of area + REP + MOVSB ;Move list into area + POP SI +;The list has been copied into the beginning of the +;specified area of memory. SI is the first address +;of that area, DI is the end of the copy of the list +;plus one, which is where the list will begin to repeat. +;All we need to do now is copy [SI] to [DI] until the +;end of the memory area is reached. This will cause the +;list to repeat as many times as necessary. + MOV CX,BX ;Length of area minus list + PUSH ES ;Different index register + POP DS ;requires different segment reg. + JMPS COPYLIST ;Do the block move + +;Search a specified area of memory for given list of bytes. +;Print address of first byte of each match. + +SEARCH: + CALL RANGE ;Get area to be searched + PUSH CX ;Save count + PUSH AX ;Save segment number + PUSH DX ;Save displacement + CALL LIST ;Get search list + DEC BX ;No. of bytes in list-1 + POP DI ;Displacement within segment + POP ES ;Segment + POP CX ;Length to be searched + SUB CX,BX ; minus length of list +SCAN: + MOV SI,LINEBUF ;List kept in line buffer + LODSB ;Bring first byte into AL +DOSCAN: + SCASB ;Search for first byte + LOOPNE DOSCAN ;Do at least once by using LOOP + JNZ RET ;Exit if not found + PUSH BX ;Length of list minus 1 + XCHG BX,CX + PUSH DI ;Will resume search here + REPE + CMPSB ;Compare rest of string + MOV CX,BX ;Area length back in CX + POP DI ;Next search location + POP BX ;Restore list length + JNZ TEST ;Continue search if no match + DEC DI ;Match address + CALL OUTDI ;Print it + INC DI ;Restore search address + CALL CRLF +TEST: + JCXZ RET + JMPS SCAN ;Look for next occurrence + +;Get the next parameter, which must be a hex number. +;CX is maximum number of digits the number may have. + +GETHEX: + CALL SCANP ;Scan to next parameter +GETHEX1: + XOR DX,DX ;Initialize the number + MOV AH,DH + CALL HEXIN ;Get a hex digit + JC ERROR ;Must be one valid digit + MOV DL,AL ;First 4 bits in position +GETLP: + INC DI ;Next char in buffer + DEC CX ;Digit count + CALL HEXIN ;Get another hex digit? + JC RET ;All done if no more digits + JCXZ ERROR ;Too many digits? + CALL SHIFT4 ;Multiply by 16 + OR DL,AL ;and combine new digit + JMPS GETLP ;Get more digits + +;Check if next character in the input buffer is a hex digit +;and convert it to binary if it is. Carry set if not. + +HEXIN: + MOV AL,[DI] + CMP AL,'A' + JB HEXCHK + AND AL,0DFH ;Convert lower case + +;Check if AL has a hex digit and convert it to binary if it +;is. Carry set if not. + +HEXCHK: + SUB AL,"0" ;Kill ASCII numeric bias + JC RET + CMP AL,10 + CMC + JNC RET ;OK if 0-9 + AND AL,0DFH ;Convert lower case + SUB AL,7 ;Kill A-F bias + CMP AL,10 + JC RET + CMP AL,16 + CMC +RET: RET + +;Process one parameter when a list of bytes is +;required. Carry set if parameter bad. Called by LIST + +LISTITEM: + CALL SCANP ;Scan to parameter + CALL HEXIN ;Is it in hex? + JC STRINGCHK ;If not, could be a string + MOV CX,2 ;Only 2 hex digits for bytes + CALL GETHEX ;Get the byte value + MOV [BX],DL ;Add to list + INC BX +GRET: CLC ;Parameter was OK + RET +STRINGCHK: + MOV AL,[DI] ;Get first character of param + CMP AL,"'" ;String? + JZ STRING + CMP AL,'"' ;Either quote is all right + JZ STRING + STC ;Not string, not hex - bad + RET +STRING: + MOV AH,AL ;Save for closing quote + INC DI +STRNGLP: + MOV AL,[DI] ;Next char of string + INC DI + CMP AL,13 ;Check for end of line + JZ ERROR ;Must find a close quote + CMP AL,AH ;Check for close quote + JNZ STOSTRG ;Add new character to list + CMP AH,[DI] ;Two quotes in a row? + JNZ GRET ;If not, we're done + INC DI ;Yes - skip second one +STOSTRG: + MOV [BX],AL ;Put new char in list + INC BX + JMPS STRNGLP ;Get more characters + +;Get a byte list for ENTER, FILL or SEARCH. Accepts any number +;of 2-digit hex values or character strings in either single +;(') or double (") quotes. + +LIST: + MOV BX,LINEBUF ;Put byte list in the line buffer +LISTLP: + CALL LISTITEM ;Process a parameter + JNC LISTLP ;If OK, try for more + SUB BX,LINEBUF ;BX now has no. of bytes in list + JZ ERROR ;List must not be empty + +;Make sure there is nothing more on the line except for +;blanks and carriage return. If there is, it is an +;unrecognized parameter and an error. + +GETEOL: + CALL SCANB ;Skip blanks + JNZ ERROR ;Better be a RETURN + RET + +;Command error. DI has been incremented beyond the +;command letter so it must decremented for the +;error pointer to work. + +PERR: + DEC DI + +;Syntax error. DI points to character in the input buffer +;which caused error. By subtracting from start of buffer, +;we will know how far to tab over to appear directly below +;it on the terminal. Then print "^ Error". + +ERROR: + SUB DI,LINEBUF-1 ;How many char processed so far? + MOV CX,DI ;Parameter for TAB in CX + CALL TAB ;Directly below bad char + MOV SI,SYNERR ;Error message + +;Print error message and abort to command level + +PRINT: + CALL PRINTMES + JMP COMMAND + +;Short form of ENTER command. A list of values from the +;command line are put into memory without using normal +;ENTER mode. + +GETLIST: + CALL LIST ;Get the bytes to enter + POP DI ;Displacement within segment + POP ES ;Segment to enter into + MOV SI,LINEBUF ;List of bytes is in line buffer + MOV CX,BX ;Count of bytes + REP + MOVSB ;Enter that byte list + RET + +;Enter values into memory at a specified address. If the +;line contains nothing but the address we go into "enter +;mode", where the address and its current value are printed +;and the user may change it if desired. To change, type in +;new value in hex. Backspace works to correct errors. If +;an illegal hex digit or too many digits are typed, the +;bell is sounded but it is otherwise ignored. To go to the +;next byte (with or without change), hit space bar. To +;back up to a previous address, type "-". On +;every 8-byte boundary a new line is started and the address +;is printed. To terminate command, type carriage return. +; Alternatively, the list of bytes to be entered may be +;included on the original command line immediately following +;the address. This is in regular LIST format so any number +;of hex values or strings in quotes may be entered. + +ENTER: + MOV CX,5 ;5 digits in address + CALL GETHEX ;Get ENTER address + CALL GETSEG ;Convert to seg/disp format +;Adjust segment and displacement so we are in the middle +;of the segment instead of the very bottom. This allows +;backing up a long way. + SUB AH,8 ;Adjust segment 32K down + ADD DH,80H ; and displacement 32K up + PUSH AX ;Save for later + PUSH DX + CALL SCANB ;Any more parameters? + JNZ GETLIST ;If not end-of-line get list + POP DI ;Displacement of ENTER + POP ES ;Segment +GETROW: + CALL OUTDI ;Print address of entry + CALL BLANK ;Leave a space +GETBYTE: + SEG ES + MOV AL,[DI] ;Get current value + CALL HEX ;And display it + MOV AL,"." + CALL OUT ;Prompt for new value + MOV CX,2 ;Max of 2 digits in new value + MOV DX,0 ;Intial new value +GETDIG: + CALL IN ;Get digit from user + MOV AH,AL ;Save + CALL HEXCHK ;Hex digit? + XCHG AH,AL ;Need original for echo + JC NOHEX ;If not, try special command + CALL OUT ;Echo to console + MOV DH,DL ;Rotate new value + MOV DL,AH ;And include new digit + LOOP GETDIG ;At most 2 digits +;We have two digits, so all we will accept now is a command. +WAIT: + CALL IN ;Get command character +NOHEX: + CMP AL,8 ;Backspace + JZ BS + CMP AL,7FH ;RUBOUT + JZ BS + CMP AL,"-" ;Back up to previous address + JZ PREV + CMP AL,13 ;All done with command? + JZ EOL + CMP AL," " ;Go to next address + JZ NEXT +;If we got here, character was invalid. Sound bell. + MOV AL,7 + CALL OUT + JCXZ WAIT ;CX=0 means no more digits + JMPS GETDIG ;Don't have 2 digits yet +BS: + CMP CL,2 ;CX=2 means nothing typed yet + JZ GETDIG ;Can't back up over nothing + INC CL ;Accept one more character + MOV DL,DH ;Rotate out last digit + MOV DH,CH ;Zero this digit + CALL BACKUP ;Physical backspace + JMPS GETDIG ;Get more digits + +;If new value has been entered, convert it to binary and +;put into memory. Always bump pointer to next location + +STORE: + CMP CL,2 ;CX=2 means nothing typed yet + JZ NOSTO ;So no new value to store +;Rotate DH left 4 bits to combine with DL and make a byte value + PUSH CX + MOV CL,4 + SHL DH,CL + POP CX + OR DL,DH ;Hex is now converted to binary + SEG ES + MOV [DI],DL ;Store new value +NOSTO: + INC DI ;Prepare for next location + RET +EOL: + CALL STORE ;Enter the new value + JMP CRLF ;CR/LF and terminate +NEXT: + CALL STORE ;Enter new value + INC CX ;Leave a space plus two for + INC CX ; each digit not entered + CALL TAB + MOV AX,DI ;Next memory address + AND AL,7 ;Check for 8-byte boundary + JNZ GETBYTE ;Take 8 per line +NEWROW: + CALL CRLF ;Terminate line + JMP GETROW ;Print address on new line +PREV: + CALL STORE ;Enter the new value +;DI has been bumped to next byte. Drop it 2 to go to previous addr + DEC DI + DEC DI + JMPS NEWROW ;Terminate line after backing up + +;Perform register dump if no parameters or set register if a +;register designation is a parameter. + +REG: + CALL SCANP + JZ DISPREG + MOV DL,[DI] + INC DI + MOV DH,[DI] + CMP DH,13 + JZ FLAG + INC DI + CALL GETEOL + CMP DH," " + JZ FLAG + MOV DI,REGTAB + XCHG AX,DX + PUSH CS + POP ES + MOV CX,REGTABLEN + REPNZ + SCASW + JNZ BADREG + OR CX,CX + JNZ NOTPC + DEC DI + DEC DI + SEG CS + MOV AX,[DI-2] +NOTPC: + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK + PUSH DS + POP ES + LEA BX,[DI+REGDIF-2] + MOV DX,[BX] + CALL OUT16 + CALL CRLF + MOV AL,":" + CALL OUT + CALL INBUF + CALL SCANB + JZ RET3 + MOV CX,4 + CALL GETHEX1 + CALL GETEOL + MOV [BX],DX +RET3: RET +BADREG: + MOV AX,5200H+"B" ;BR ERROR + JMP ERR +DISPREG: + MOV SI,REGTAB + MOV BX,AXSAVE + MOV CX,8 + CALL DISPREGLINE + CALL CRLF + MOV CX,5 + CALL DISPREGLINE + CALL BLANK + CALL DISPFLAGS + JMP CRLF +FLAG: + CMP DL,"F" + JNZ BADREG + CALL DISPFLAGS + MOV AL,"-" + CALL OUT + CALL INBUF + CALL SCANB + XOR BX,BX + MOV DX,[FSAVE] +GETFLG: + MOV SI,DI + LODSW + CMP AL,13 + JZ SAVCHG + CMP AH,13 + JZ FLGERR + MOV DI,FLAGTAB + MOV CX,32 + PUSH CS + POP ES + REPNE + SCASW + JNZ FLGERR + MOV CH,CL + AND CL,0FH + MOV AX,1 + ROL AX,CL + TEST AX,BX + JNZ REPFLG + OR BX,AX + OR DX,AX + TEST CH,16 + JNZ NEXFLG + XOR DX,AX +NEXFLG: + MOV DI,SI + PUSH DS + POP ES + CALL SCANP + JMPS GETFLG +DISPREGLINE: + SEG CS + LODSW + CALL OUT + MOV AL,AH + CALL OUT + MOV AL,"=" + CALL OUT + MOV DX,[BX] + INC BX + INC BX + CALL OUT16 + CALL BLANK + CALL BLANK + LOOP DISPREGLINE + RET +REPFLG: + MOV AX,4600H+"D" ;DF ERROR +FERR: + CALL SAVCHG +ERR: + CALL OUT + MOV AL,AH + CALL OUT + MOV SI,ERRMES + JMP PRINT +SAVCHG: + MOV [FSAVE],DX + RET +FLGERR: + MOV AX,4600H+"B" ;BF ERROR + JMPS FERR +DISPFLAGS: + MOV SI,FLAGTAB + MOV CX,16 + MOV DX,[FSAVE] +DFLAGS: + SEG CS + LODSW + SHL DX + JC FLAGSET + SEG CS + MOV AX,[SI+30] +FLAGSET: + OR AX,AX + JZ NEXTFLG + CALL OUT + MOV AL,AH + CALL OUT + CALL BLANK +NEXTFLG: + LOOP DFLAGS + RET + +;Trace 1 instruction or the number of instruction specified +;by the parameter using 8086 trace mode. Registers are all +;set according to values in save area + +TRACE: + CALL SCANP + CALL HEXIN + MOV DX,1 + JC STOCNT + MOV CX,4 + CALL GETHEX +STOCNT: + MOV [TCOUNT],DX + CALL GETEOL +STEP: + MOV [BRKCNT],0 + OR B,[FSAVE+1],1 +EXIT: + MOV [12],BREAKFIX + MOV [14],CS + MOV [4],REENTER + MOV [6],CS + DI + MOV [64H],REENTER + MOV [66H],CS + MOV SP,STACK + POP AX + POP BX + POP CX + POP DX + POP BP + POP BP + POP SI + POP DI + POP ES + POP ES + POP SS + MOV SP,[SPSAVE] + PUSH [FSAVE] + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET +STEP1: JMPS STEP + +;Re-entry point from breakpoint. Need to decrement instruction +;pointer so it points to location where breakpoint actually +;occured. + +BREAKFIX: + XCHG SP,BP + DEC [BP] + XCHG SP,BP + +;Re-entry point from trace mode or interrupt during +;execution. All registers are saved so they can be +;displayed or modified. + +REENTER: + SEG CS + MOV [SPSAVE+SEGDIF],SP + SEG CS + MOV [SSSAVE+SEGDIF],SS + XOR SP,SP + MOV SS,SP + MOV SP,RSTACK + PUSH ES + PUSH DS + PUSH DI + PUSH SI + PUSH BP + DEC SP + DEC SP + PUSH DX + PUSH CX + PUSH BX + PUSH AX + PUSH SS + POP DS + MOV SP,[SPSAVE] + MOV SS,[SSSAVE] + POP [IPSAVE] + POP [CSSAVE] + POP AX + AND AH,0FEH + MOV [FSAVE],AX + MOV [SPSAVE],SP + PUSH DS + POP ES + PUSH DS + POP SS + MOV SP,STACK + MOV [64H],INT + MOV AL,20H + OUT BASE+2 + EI + UP + CALL CRLF + CALL DISPREG + DEC [TCOUNT] + JNZ STEP1 +ENDGO: + MOV SI,BPTAB + MOV CX,[BRKCNT] + JCXZ COMJMP +CLEARBP: + MOV DX,[SI+BPLEN] + LODSW + PUSH AX + CALL GETSEG + MOV ES,AX + MOV DI,DX + POP AX + STOSB + LOOP CLEARBP +COMJMP: JMP COMMAND + +;Input from the specified port and display result + +INPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number in DX + INB DX ;Variable port input + CALL HEX ;And display + JMP CRLF + +;Output a value to specified port. + +OUTPUT: + MOV CX,4 ;Port may have 4 digits + CALL GETHEX ;Get port number + PUSH DX ;Save while we get data + MOV CX,2 ;Byte output only + CALL GETHEX ;Get data to output + XCHG AX,DX ;Output data in AL + POP DX ;Port in DX + OUTB DX ;Variable port output + RET + +;Jump to program, setting up registers according to the +;save area. Up to 10 breakpoint addresses may be specified. + +GO: + MOV BX,LINEBUF + XOR SI,SI +GO1: + CALL SCANP + JZ EXEC + MOV CX,5 + CALL GETHEX + MOV [BX],DX + MOV [BX-BPLEN+1],AH + INC BX + INC BX + INC SI + CMP SI,BPMAX+1 + JNZ GO1 + MOV AX,5000H+"B" ;BP ERROR + JMP ERR +EXEC: + MOV [BRKCNT],SI + CALL GETEOL + MOV CX,SI + JCXZ NOBP + MOV SI,BPTAB +SETBP: + MOV DX,[SI+BPLEN] + LODSW + CALL GETSEG + MOV DS,AX + MOV DI,DX + MOV AL,[DI] + MOV B,[DI],0CCH + PUSH ES + POP DS + MOV [SI-2],AL + LOOP SETBP +NOBP: + MOV [TCOUNT],1 + JMP EXIT + +;Console input interrupt handler. Used to interrupt commands +;or programs under execution (if they have interrupts +;enabled). Control-S causes a loop which waits for any other +;character to be typed. Control-C causes abort to command +;mode. All other characters are ignored. + +INT: + PUSH AX ;Don't destroy accumulator +;Output End-of-Interrupt commands to slave 8259A. + MOV AL,20H + OUT BASE+2 + IN DATA ;Get interrupting character + AND AL,7FH ;ASCII has only 7 bits + CMP AL,"S"-"@" ;Check for Control-S + JNZ NOSTOP + CALL IN ;Wait for continue character +NOSTOP: + CMP AL,"C"-"@" ;Check for Control-C + JZ BREAK +;Just ignore interrupt - restore AX and return + POP AX + IRET +BREAK: + MOV AL,'^' + CALL OUT + MOV AL,'C' + CALL OUT + CALL CRLF + JMP COMMAND +REGTAB: + DB "AXBXCXDXSPBPSIDIDSESSSCSIPPC" +REGDIF: EQU AXSAVE-REGTAB + +;Flags are ordered to correspond with the bits of the flag +;register, most significant bit first, zero if bit is not +;a flag. First 16 entries are for bit set, second 16 for +;bit reset. + +FLAGTAB: + DW 0 + DW 0 + DW 0 + DW 0 + DB "OV" + DB "DN" + DB "EI" + DW 0 + DB "NG" + DB "ZR" + DW 0 + DB "AC" + DW 0 + DB "PE" + DW 0 + DB "CY" + DW 0 + DW 0 + DW 0 + DW 0 + DB "NV" + DB "UP" + DB "DI" + DW 0 + DB "PL" + DB "NZ" + DW 0 + DB "NA" + DW 0 + DB "PO" + DW 0 + DB "NC" + +;Initialization table. First byte of each entry is no. +;of bytes to output to the corresponding port. That +;many initialization bytes follow. + +INITTABLE: +;Port BASE+0 - Master 8259A. Intialization Command Word (ICW) +;One sets level-triggered mode, multiple 8259As, require +;ICW4. + DB 1 + DB 19H +;Port BASE+1 - Master 8259A. ICW2 sets vector base to 10H +;ICW3 sets a slave on interrupt input 1; ICW4 sets buffered +;mode, as a master, with Automatic End of Interrupt, 8086 +;vector; Operation Command Word (OCW) One sets interrupt +;mask to enable line 1 (slave 8259A) only. + DB 4 + DB 10H,2,0FH,0FDH +;Port BASE+2 - Slave 8259A. ICW1 sets level-triggered mode, +;multiple 8259As, require ICW4. + DB 1 + DB 19H +;Port BASE+3 - Slave 8259A. ICW2 sets vector base to 18H +;ICW3 sets slave address as 1; ICW4 sets buffered mode, +;as slave, 8086 vector; OCW1 sets interrupt mask +;to enable line 1 (serial receive) only. + DB 4 + DB 18H,1,09H,0FDH +;Port Base+4 - 9513 Data. 9513 has previously been set +;up for master mode register. Master Mode now set to 84F3H: +;Scaler set to BCD division, enable data pointer increment, +;8-bit data bus, FOUT=100Hz, dividing F5 by 4 (F5=4MHz/10000) +;Both alarm comparators disabled, time-of-day enabled + DB 2 + DW 84F3H +;Port BASE+5 - 9513 Control. Do nothing. + DB 0 +;Port BASE+6 - 8251A #1 Data. No initialization to this port. + DB 0 +;Port BASE+7 - 8251A #1 Control. Since it is not possible to +;know whether the 8251A next expects a Mode Instruction or +;a Command Instruction, a dummy byte is sent which could +;safely be interpreted as either but guarantees it is now +;expecting a Command. The command sent is Internal Reset +;which causes it to start expecting a mode. The mode sent +;is for 2 stop bits, no parity, 8 data bits, 16X clock. +;This is followed by the command to error reset, enable +;transmitter and receiver, set RTS and DTR to +12V. + DB 4 + DB 0B7H,77H,0CEH,37H +;Port BASE+8 - 8251A #2 Data. No init. + DB 0 +;Port BASE+9 - 8251A #2 Control. Same as above, except one stop bit + DB 4 + DB 0B7H,77H,4EH,37H +;Port BASE+10 - Baud rate 1. Set to 19200 baud + DB 1 + DB 0FH +;Posr BASE+11 - Baud rate 2. Set to 9600 baud + DB 1 + DB 0EH + +HEADER: DM 13,10,10,"SCP 8086 Monitor 1.9",13,10 +SYNERR: DB '^' +ERRMES: DM " Error",13,10 +BACMES DM 8,32,8 + +BOOT: + PUSH DI + INB BASE+15 ; Get sense switch data. + TEST AL,4 ; Test floppy/hard boot + JZ FLOPPY + JMP HARD ; Try hard disk boot +FLOPPY: + +;Block move the boot code to RAM. +;If the RAM is 16-bit, then we'll be able to boot double-density +;at 4MHz CPU clock (great for 8087 work). + + MOV SI,BOOTPROG + MOV DI,BOOTADDR + MOV CX,BOOTLEN + SEG CS + REP + MOVSW + JMP BOOTADDR+SEGDIF + +; Hard disk boot code + +RESETHDC EQU 54H +STARTHDC EQU 55H +TIMEOUT EQU 17 +HDRVS EQU 3 ; Drive select byte in data structure +STATH EQU 12 ; Status byte in data structure +OPCD EQU 11 ; Opcode byte + +HARD: + +; Try hard disk boot. If drive is not ready after 1 minute display message +; and jump to floppy boot. + + CLI ; Disable keyboard interrupt + MOV SI,WAITMSG + CALL PRINTMES + MOV SI,50H + PUSH DS + PUSH CS + POP DS ; Make DS here + +; Set HDCMA data structure just below boot sector code. Keep address fixed so +; the boot sector code can use it too. + + MOV AX,1E0H + SEG ES + MOV [SI],AX + SEG ES + MOV B,[SI+2],0 ; Extended address is 0 + +; Move the prefixed HDCMA data structure. Structure initially set up for load +; constants operation. + + MOV SI,DATASTRUCT + MOV DI,1E0H + MOV CX,16 + REP + MOVSB ; Move it + OUTB RESETHDC ; Reset the HDC + +; Delay controller commands after reset. + + XOR CX,CX + LOOP $ + +; Test status, if not ready, try again for 1 minute. + + POP DS ; Restore DS to 0 + MOV SI,1E0H + MOV DL,2 ; 2 * 741 msec. + MOV [SI+OPCD],5 ; Sense status +HARDTIME: + XOR CX,CX +TRY: + CALL HARDCOM ; Execute command + TEST AL,4 ; Drive ready status + LOOPNZ TRY + JZ RESTORE ; Drive is ready ! + DEC DL + JNZ HARDTIME + +; Hard disk is not ready after retries. Display message then go to floppy +; disk boot. + +HDERROR: + STI ; Re-enable keyboard interrupt + MOV SI,NOHARD + CALL PRINTMES ; 'Hard disk error. Insert boot disk in A' + JMP FLOPPY ; Floppy disk boot + +; Restore HDC to outer track. Read 1st sector to 0:200H + +RESTORE: + MOV SI,READYMSG + CALL PRINTMES + MOV SI,1E0H + MOV [SI+OPCD],4 ; Load constants command + CALL HARDCOM + JNZ HDERROR + MOV B,[SI+OPCD],0 ; Read opcode + MOV B,[SI],10H ; Step out + MOV W,[SI+1],-1 ; Restore to track 0 + MOV W,[SI+HDRVS+1],200H ; Set DMA address to 200H + MOV W,[SI+HDRVS+4],0 ; Read 1st cylinder + MOV W,[SI+HDRVS+6],100H ; Read head # 0, sector # 1 + MOV CX,3 ; Try count +READHARD: + CALL HARDCOM ; Do it + MOV B,[SI],0 ; Step in + MOV W,[SI+1],0 ; No step + LOOPNZ READHARD + JNZ HDERROR ; Couldn't read, display error. + +; We have successfully read the boot sector. Jump to it at location 0:200H + + POP DI + +; Test sense switch. If auto-boot is set,don't return to monitor + + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + INB BASE+15 ; Get sense switch data. + TEST AL,1 ; Test auto-boot + JNZ AUTOBOOT + JMP GO +AUTOBOOT: + PUSH [CSSAVE] + PUSH [IPSAVE] + MOV DS,[DSSAVE] + IRET + + +; Hardisk I/O command routine + +HARDCOM: + MOV BL,TIMEOUT + PUSH CX + XOR CX,CX + MOV B,[SI+STATH],0 ; Clear status + OUTB STARTHDC +HWAIT: + MOV AL,[SI+STATH] ; Status byte + OR AL,AL + LOOPZ HWAIT ; Try for 2 seconds + JNZ HRET + DEC BL + JNZ HWAIT +HRET: + POP CX + CMP AL,-1 + RET + +; HDCMA data structure for load constants operation. Moved to 2nd page +; in memory for HDC to execute. + +DATASTRUCT: + +HDIR DB 0 ; Step in +HSTEP DW 0 ; Amount to step +HDRIVE DB 0DCH ; Drive/head select +DMAAD DW 0 ; DMA address +DMAHI DB 0 +ARG1: +HCYL DB 0,1EH ; 3 msec step delay time +HHEAD DB 0 ; No head settle time +HSECT DB 7 ; Sector = 1024 bytes +OPCODE DB 4 ; Load constants command +HSTAT DB 0 ; Return status +LINK DW 1E0H + DB 0 ; Link extended address + +NOHARD DB 'Hard disk error. Insert boot disk in A:',13 + DB 8AH ; End of message code +WAITMSG DB 13,10,'Reading hard disk, please wait.',13,8AH +READYMSG DB 'Hard disk is ready',13,8AH + +BOOTPROG: + + IF SCP +DISK: EQU 0E0H +WAITP: EQU DISK+5 + ENDIF + + IF TARBELLDD +DISK: EQU 78H +WAITP: EQU DISK+4 + ENDIF + + ORG BOOTADDR + + IF SCP + INB BASE+15 ; Get sense switch data. + MOV CL,3 ; Shift bit 1 over to bit 4 so it + ROL AL,CL ; can be used for large/small bit. + AND AL,10H ; Keep only the large/small bit. + MOV BH,AL ; Put drive select byte in BH. + ENDIF + + IF TARBELLDD + XOR BH,BH + ENDIF + + MOV AL,0D0H ; Force-interrupt command. + OUTB DISK + MOV CX,5 +DELAY: + AAM ; Give force-interrupt time. + LOOP DELAY +RETRY: + XOR BH,08H ; Flip density bit. + MOV AL,BH + OUTB DISK+4 ; Select drive type & density + MOV AL,08H ; Restore command. + OUTB DISK + INB WAITP ; Wait for INTRQ. + MOV DI,LOAD + MOV AL,1 ; Ask for sector 1. + OUTB DISK+2 + MOV DX,DISK+3 ; Disk controller data port. + MOV AL,8CH ; Read command. + OUTB DISK + JMPS READ +READLOOP: + STOSB ; Put data in memory. +READ: + INB WAITP ; Wait for DRQ or INTRQ. + + IF SCP + RCR AL ; Check for INTRQ. + INB DX ; Read data from disk controller chip. + JNC READLOOP ; Jump if no INTRQ + ENDIF + + IF TARBELLDD + RCL AL ; Check for INTRQ. + INB DX ; Read data from disk controller chip. + JC READLOOP ; Jump if no INTRQ + ENDIF + + INB DISK ; Get status. + AND AL,9CH + JNZ RETRY ; Jump if error. +;Successful read + MOV [CSSAVE],0 + MOV [IPSAVE],LOAD + POP DI + JMP GO-SEGDIF + +BOOTLEN EQU ($-BOOTADDR+1)/2 + \ No newline at end of file diff --git a/files/MON_1.9_1983_08_04_SCPDISKMASTER.BIN b/files/MON_1.9_1983_08_04_SCPDISKMASTER.BIN new file mode 100644 index 0000000..7f3d7f9 Binary files /dev/null and b/files/MON_1.9_1983_08_04_SCPDISKMASTER.BIN differ diff --git a/files/MON_1.9_1983_08_04_SCPDISKMASTER.HEX b/files/MON_1.9_1983_08_04_SCPDISKMASTER.HEX new file mode 100644 index 0000000..6a3f2a7 --- /dev/null +++ b/files/MON_1.9_1983_08_04_SCPDISKMASTER.HEX @@ -0,0 +1,94 @@ +:0C10F000EA000000FF0E0C0A07050402D5 +:1A010000FC33C08ED08ED88EC0BC9C01BF9C01B90D00F3ABB402ABC606A5F9 +:1A011A000110B017E6F5BE4107BAF0002EAC8AC8E3052EACEEE2FB4280FAF3 +:1A013400FB76EFE4FF241874103C087426A808B00E7402B005E6FAEB1AE86A +:1A014E000C00BEF50FE80200EBFB2EACE6FAE80000E897003C0D7401C3BF98 +:1A0168001801C6050DE4FFA8017403E91207BE6307E88D00FC33C08ED88E07 +:1A018200C0BC9C01C7066400BF068C0E6600B03EE8CA00E82000E8810074CF +:1A019C00DF8A0524DF2C4272103C13730C47D0E098932EFF977401EBC7E924 +:1A01B600B502BF180133C9E839003C20721B3C7F740EE894003C407425AA22 +:1A01D0004183F95076E7E3E54F49E82900EBDE3C0874F33C0D75D6AABF18B1 +:1A01EA0001B00DE86F00B00AEB6BE8F4FFEB83FAE4F7A80274F9E4F6247F24 +:1A020400FBC3BE85072EACE85100D0E073F7C3E80600823D2C750A47B02079 +:1A021E0051B1FFF3AE4F59823D0DC38CDAB400E8780003D6EB098CC2B400A4 +:1A023800E86D0003D782D400E812008AC6E802008AC28AE051B104D2E85924 +:1A025200E802008AC4240F04902714402750E4F7240174FA58E6F6C3B0206C +:1A026C00EBF1E8F9FFE2FBC388076C0309028C0393026E066C0350066C0347 +:1A0286006C036C0366026C035D066C036C033304B6026E058AC2240FE80798 +:1A02A000008AD08AC632F6C3D1E2D0D4D1E2D0D4D1E2D0D4D1E2D0D4C3B9D7 +:1A02BA000500E827015052E84FFF823D4C7421823D6C741CBA8000E830018F +:1A02D400721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B47B9040072 +:1A02EE00E8F5008BCA5A588BDA81E30F00E30403D973997497B85247E927FF +:1A03080003E8ADFF50E856011F8BF2E813FF56E850FFACE82CFF5A497417A5 +:1A0322008BC6A80F740C52A80775EAB02DE82DFFEBE6E80200EBDA518BC6C6 +:1A033C008BF22BC28BD8D1E003C3B933002BC8E820FF8BCBAC247F3C7F74A9 +:1A035600043C207302B02EE8FFFEE2EE59E985FEE850FF51508BF2B905004D +:1A037000E87300E8F000E821FF8BFA5B8EDB8EC0593BFE1BC372074903F17B +:1A038A0003F9FD41A449F3A4C3E823FF515052E8BC005F07593BD9BE18018D +:1A03A400E30273E62BCB87D957F3A45E8BCB061FEBD8E800FF515052E899C6 +:1A03BE00004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A68BCB5F5B39 +:1A03D80075084FE856FE47E809FEE3AEEBDFE82AFE33D28AE6E81400727B04 +:1A03F2008AD04749E80B007297E370E8A8FE0AD0EBF08A053C41720224DFF2 +:1A040C002C3072823C0AF5730B24DF2C073C0A72033C10F5C3E8EFFDE8DD3F +:1A042600FF720BB90200E8B7FF881743F8C38A053C2774063C227402F9C34E +:1A0440008AE0478A05473C0D74233AC475053A2575E047880743EBEBBB184D +:1A045A0001E8C3FF73FB81EB18017407E8B3FD7502C34F81EF17018BCFE884 +:1A047400F8FDBE7C07E88DFDE9FDFCE8D6FF5F07BE18018BCBF3A4C3B9057C +:1A048E0000E854FFE805FE82EC0880C6805052E87CFD75DD5F07E88DFDE8DD +:1A04A800C0FD268A05E89AFDB02EE8AAFDB90200BA0000E83BFD8AE0E849AC +:1A04C200FF86E0720CE895FD8AF28AD4E2EBE826FD3C0874193C7F74153CC0 +:1A04DC002D744D3C0D742F3C207431B007E873FDE3E2EBCB82F90274C6FEEC +:1A04F600C18AD68AF5E808FDEBBB82F902740B51B104D2E6590AD626881503 +:1A05100047C3E8EBFFE9D3FCE8E5FF4141E84EFD8BC724077584E8C2FCE9B7 +:1A052A0078FFE8D1FF4F4FEBF3E8DDFC74628A15478A3582FE0D747647E82A +:1A05440020FF82FE20746DBFE506920E07B90E00F2AF753C0BC975064F4FA6 +:1A055E002E8B45FEE8FAFC8AC4E8F5FCE8FDFC1E078D9DB5FA8B17E8CBFC52 +:1A057800E870FCB03AE8DFFCE835FCE896FC740BB90400E85BFEE8D5FE8914 +:1A05920017C3B84252E99600BEE506BB9C01B90800E86500E842FCB90500B7 +:1A05AC00E85C00E8B8FCE89300E933FC82FA4675D7E88800B02DE89AFCE801 +:1A05C600F0FBE851FC33DB8B16B6018BF7AD3C0D746682FC0D7466BF010717 +:1A05E000B920000E07F2AF755A8AE980E10FB80100D3C085C375330BD80B96 +:1A05FA00D0F6C510750233D08BFE1E07E80AFCEBC62EADE84FFC8AC4E84AF7 +:1A061400FCB03DE845FC8B174343E822FCE846FCE843FCE2E2C3B84446E88A +:1A062E000E00E82CFC8AC4E827FCBE7D07E93BFE8916B601C3B84246EBE5AE +:1A064800BE0107B910008B16B6012EADD1E272042E8B441E0BC0740BE8FC64 +:1A066200FB8AC4E8F7FBE8FFFBE2E5C3E8A2FBE890FDBA01007206B9040005 +:1A067C00E867FD89160201E8E0FDC70600010000800EB70101C7060C00D5EE +:1A069600058C0E0E00C7060400DC058C0E0600FAC7066400DC058C0E66003F +:1A06B000BC9C01585B595A5D5D5E5F0707178B26A401FF36B601FF36B201AB +:1A06CA00FF36B4018E1EAC01CFEBB187ECFF4E0087EC2E8926A4112E8C16D3 +:1A06E400B01133E48ED4BCB001061E5756554C4C52515350161F8B26A401C6 +:1A06FE008E16B0018F06B4018F06B2015880E4FEA3B6018926A4011E071E50 +:1A07180017BC9C01C7066400BF06B020E6F2FBFCE8C0FAE86CFEFF0E0201BE +:1A073200759FBE04018B0E0001E3108B5414AD50E855FB8EC08BFA58AAE26A +:1A074C00F0E92CFAB90400E890FCECE8F0FAE98EFAB90400E883FC52B90203 +:1A07660000E87CFC925AEEC3BB180133F6E89DFA7419B90500E868FC8917C9 +:1A0780008867ED43434683FE0B75E8B84250E99FFE89360001E8CEFC8BCE33 +:1A079A00E31ABE04018B5414ADE8F4FA8ED88BFA8A05C605CC061F8844FE0F +:1A07B400E2E9C70602010100E9D2FE50B020E6F2E4F6247F3C137503E82A88 +:1A07CE00FA3C03740258CFB05EE885FAB043E880FAE809FAE997F941584232 +:1A07E800584358445853504250534944494453455353534353495050430073 +:1A080200000000000000004F56444E454900004E475A520000414300005002 +:1A081C00450000435900000000000000004E56555044490000504C4E5A00C7 +:1A083600004E410000504F00004E4301190410020FFD011904180109FD026E +:1A085000F384000004B777CE370004B7774E37010F010E0D0A0A53435020E3 +:1A086A0038303836204D6F6E69746F7220312E390D8A5E204572726F720DB2 +:1A0884008A08208857E4FFA8047403E90F00BEDD08BF8000B928002EF3A542 +:1A089E00E9DF08FABEA608E861F9BE50001E0E1FB8E00126890426C64402F1 +:1A08B80000BE6D08BFE001B91000F3A4E65433C9E2FE1FBEE001B202C74460 +:1A08D2000B050033C9E87700A804E0F9740EFECA75F1FBBE7D08E81EF9E946 +:1A08EC00A4FFBEC908E815F9BEE001C7440B0400E8520075E3C6440B00C6A4 +:1A0906000410C74401FFFFC744040002C744070000C744090001B90300E8DD +:1A0920002F00C60400C744010000E0F375B65FC706B2010000C706B4010059 +:1A093A0002E4FFA8017503E92AFEFF36B201FF36B4018E1EAC01CFB311517D +:1A09540033C9C6440C00E6558A440C0AC0E1F97504FECB75F3593CFFC300BD +:1A096E000000DC000000001E00070400E0010048617264206469736B2065BA +:1A09880072726F722E20496E7365727420626F6F74206469736B20696E2017 +:1A09A200413A0D8A0D0A52656164696E672068617264206469736B2C207012 +:1A09BC006C6561736520776169742E0D8A48617264206469736B2069732017 +:1A09D60072656164790D8AE4FFB103D2C024108AF8B0D0E6E0B90500D40A9A +:1A09F000E2FC80F7088AC7E6E4B008E6E0E4E5BF0002B001E6E2BAE300B0A7 +:1A0A0A008CE6E0EB01AAE4E5D0D8EC73F8E4E0249C75D5C706B2010000C70D +:090A240006B40100025FE99EF531 +:0000000000 + \ No newline at end of file diff --git a/files/MON_1.9_1983_08_04_TARBELLDD.BIN b/files/MON_1.9_1983_08_04_TARBELLDD.BIN new file mode 100644 index 0000000..71dc3f2 Binary files /dev/null and b/files/MON_1.9_1983_08_04_TARBELLDD.BIN differ diff --git a/files/MON_1.9_1983_08_04_TARBELLDD.HEX b/files/MON_1.9_1983_08_04_TARBELLDD.HEX new file mode 100644 index 0000000..9e259b0 --- /dev/null +++ b/files/MON_1.9_1983_08_04_TARBELLDD.HEX @@ -0,0 +1,94 @@ +:0C10F000EA000000FF0E0C0A07050402D5 +:1A010000FC33C08ED08ED88EC0BC9C01BF9C01B90D00F3ABB402ABC606A5F9 +:1A011A000110B017E6F5BE4107BAF0002EAC8AC8E3052EACEEE2FB4280FAF3 +:1A013400FB76EFE4FF241874103C087426A808B00E7402B005E6FAEB1AE86A +:1A014E000C00BEF50FE80200EBFB2EACE6FAE80000E897003C0D7401C3BF98 +:1A0168001801C6050DE4FFA8017403E91207BE6307E88D00FC33C08ED88E07 +:1A018200C0BC9C01C7066400BF068C0E6600B03EE8CA00E82000E8810074CF +:1A019C00DF8A0524DF2C4272103C13730C47D0E098932EFF977401EBC7E924 +:1A01B600B502BF180133C9E839003C20721B3C7F740EE894003C407425AA22 +:1A01D0004183F95076E7E3E54F49E82900EBDE3C0874F33C0D75D6AABF18B1 +:1A01EA0001B00DE86F00B00AEB6BE8F4FFEB83FAE4F7A80274F9E4F6247F24 +:1A020400FBC3BE85072EACE85100D0E073F7C3E80600823D2C750A47B02079 +:1A021E0051B1FFF3AE4F59823D0DC38CDAB400E8780003D6EB098CC2B400A4 +:1A023800E86D0003D782D400E812008AC6E802008AC28AE051B104D2E85924 +:1A025200E802008AC4240F04902714402750E4F7240174FA58E6F6C3B0206C +:1A026C00EBF1E8F9FFE2FBC388076C0309028C0393026E066C0350066C0347 +:1A0286006C036C0366026C035D066C036C033304B6026E058AC2240FE80798 +:1A02A000008AD08AC632F6C3D1E2D0D4D1E2D0D4D1E2D0D4D1E2D0D4C3B9D7 +:1A02BA000500E827015052E84FFF823D4C7421823D6C741CBA8000E830018F +:1A02D400721BB90500E80A018BCA5A5B2BCA1AE7751D9341EB0B47B9040072 +:1A02EE00E8F5008BCA5A588BDA81E30F00E30403D973997497B85247E927FF +:1A03080003E8ADFF50E856011F8BF2E813FF56E850FFACE82CFF5A497417A5 +:1A0322008BC6A80F740C52A80775EAB02DE82DFFEBE6E80200EBDA518BC6C6 +:1A033C008BF22BC28BD8D1E003C3B933002BC8E820FF8BCBAC247F3C7F74A9 +:1A035600043C207302B02EE8FFFEE2EE59E985FEE850FF51508BF2B905004D +:1A037000E87300E8F000E821FF8BFA5B8EDB8EC0593BFE1BC372074903F17B +:1A038A0003F9FD41A449F3A4C3E823FF515052E8BC005F07593BD9BE18018D +:1A03A400E30273E62BCB87D957F3A45E8BCB061FEBD8E800FF515052E899C6 +:1A03BE00004B5F07592BCBBE1801ACAEE0FD75C45387CB57F3A68BCB5F5B39 +:1A03D80075084FE856FE47E809FEE3AEEBDFE82AFE33D28AE6E81400727B04 +:1A03F2008AD04749E80B007297E370E8A8FE0AD0EBF08A053C41720224DFF2 +:1A040C002C3072823C0AF5730B24DF2C073C0A72033C10F5C3E8EFFDE8DD3F +:1A042600FF720BB90200E8B7FF881743F8C38A053C2774063C227402F9C34E +:1A0440008AE0478A05473C0D74233AC475053A2575E047880743EBEBBB184D +:1A045A0001E8C3FF73FB81EB18017407E8B3FD7502C34F81EF17018BCFE884 +:1A047400F8FDBE7C07E88DFDE9FDFCE8D6FF5F07BE18018BCBF3A4C3B9057C +:1A048E0000E854FFE805FE82EC0880C6805052E87CFD75DD5F07E88DFDE8DD +:1A04A800C0FD268A05E89AFDB02EE8AAFDB90200BA0000E83BFD8AE0E849AC +:1A04C200FF86E0720CE895FD8AF28AD4E2EBE826FD3C0874193C7F74153CC0 +:1A04DC002D744D3C0D742F3C207431B007E873FDE3E2EBCB82F90274C6FEEC +:1A04F600C18AD68AF5E808FDEBBB82F902740B51B104D2E6590AD626881503 +:1A05100047C3E8EBFFE9D3FCE8E5FF4141E84EFD8BC724077584E8C2FCE9B7 +:1A052A0078FFE8D1FF4F4FEBF3E8DDFC74628A15478A3582FE0D747647E82A +:1A05440020FF82FE20746DBFE506920E07B90E00F2AF753C0BC975064F4FA6 +:1A055E002E8B45FEE8FAFC8AC4E8F5FCE8FDFC1E078D9DB5FA8B17E8CBFC52 +:1A057800E870FCB03AE8DFFCE835FCE896FC740BB90400E85BFEE8D5FE8914 +:1A05920017C3B84252E99600BEE506BB9C01B90800E86500E842FCB90500B7 +:1A05AC00E85C00E8B8FCE89300E933FC82FA4675D7E88800B02DE89AFCE801 +:1A05C600F0FBE851FC33DB8B16B6018BF7AD3C0D746682FC0D7466BF010717 +:1A05E000B920000E07F2AF755A8AE980E10FB80100D3C085C375330BD80B96 +:1A05FA00D0F6C510750233D08BFE1E07E80AFCEBC62EADE84FFC8AC4E84AF7 +:1A061400FCB03DE845FC8B174343E822FCE846FCE843FCE2E2C3B84446E88A +:1A062E000E00E82CFC8AC4E827FCBE7D07E93BFE8916B601C3B84246EBE5AE +:1A064800BE0107B910008B16B6012EADD1E272042E8B441E0BC0740BE8FC64 +:1A066200FB8AC4E8F7FBE8FFFBE2E5C3E8A2FBE890FDBA01007206B9040005 +:1A067C00E867FD89160201E8E0FDC70600010000800EB70101C7060C00D5EE +:1A069600058C0E0E00C7060400DC058C0E0600FAC7066400DC058C0E66003F +:1A06B000BC9C01585B595A5D5D5E5F0707178B26A401FF36B601FF36B201AB +:1A06CA00FF36B4018E1EAC01CFEBB187ECFF4E0087EC2E8926A4112E8C16D3 +:1A06E400B01133E48ED4BCB001061E5756554C4C52515350161F8B26A401C6 +:1A06FE008E16B0018F06B4018F06B2015880E4FEA3B6018926A4011E071E50 +:1A07180017BC9C01C7066400BF06B020E6F2FBFCE8C0FAE86CFEFF0E0201BE +:1A073200759FBE04018B0E0001E3108B5414AD50E855FB8EC08BFA58AAE26A +:1A074C00F0E92CFAB90400E890FCECE8F0FAE98EFAB90400E883FC52B90203 +:1A07660000E87CFC925AEEC3BB180133F6E89DFA7419B90500E868FC8917C9 +:1A0780008867ED43434683FE0B75E8B84250E99FFE89360001E8CEFC8BCE33 +:1A079A00E31ABE04018B5414ADE8F4FA8ED88BFA8A05C605CC061F8844FE0F +:1A07B400E2E9C70602010100E9D2FE50B020E6F2E4F6247F3C137503E82A88 +:1A07CE00FA3C03740258CFB05EE885FAB043E880FAE809FAE997F941584232 +:1A07E800584358445853504250534944494453455353534353495050430073 +:1A080200000000000000004F56444E454900004E475A520000414300005002 +:1A081C00450000435900000000000000004E56555044490000504C4E5A00C7 +:1A083600004E410000504F00004E4301190410020FFD011904180109FD026E +:1A085000F384000004B777CE370004B7774E37010F010E0D0A0A53435020E3 +:1A086A0038303836204D6F6E69746F7220312E390D8A5E204572726F720DB2 +:1A0884008A08208857E4FFA8047403E90F00BEDD08BF8000B924002EF3A546 +:1A089E00E9DF08FABEA608E861F9BE50001E0E1FB8E00126890426C64402F1 +:1A08B80000BE6D08BFE001B91000F3A4E65433C9E2FE1FBEE001B202C74460 +:1A08D2000B050033C9E87700A804E0F9740EFECA75F1FBBE7D08E81EF9E946 +:1A08EC00A4FFBEC908E815F9BEE001C7440B0400E8520075E3C6440B00C6A4 +:1A0906000410C74401FFFFC744040002C744070000C744090001B90300E8DD +:1A0920002F00C60400C744010000E0F375B65FC706B2010000C706B4010059 +:1A093A0002E4FFA8017503E92AFEFF36B201FF36B4018E1EAC01CFB311517D +:1A09540033C9C6440C00E6558A440C0AC0E1F97504FECB75F3593CFFC300BD +:1A096E000000DC000000001E00070400E0010048617264206469736B2065BA +:1A09880072726F722E20496E7365727420626F6F74206469736B20696E2017 +:1A09A200413A0D8A0D0A52656164696E672068617264206469736B2C207012 +:1A09BC006C6561736520776169742E0D8A48617264206469736B2069732017 +:1A09D60072656164790D8A32FFB0D0E678B90500D40AE2FC80F7088AC7E61C +:1A09F0007CB008E678E47CBF0002B001E67ABA7B00B08CE678EB01AAE47C64 +:1A0A0A00D0D0EC72F8E478249C75D5C706B2010000C706B40100025FE9A684 +:010A2400F5DC +:0000000000 + \ No newline at end of file