diff --git a/SYMBOL/DCMCP.esp_m b/SYMBOL/DCMCP.esp_m index e02c30a..dc188e3 100644 --- a/SYMBOL/DCMCP.esp_m +++ b/SYMBOL/DCMCP.esp_m @@ -17403,3 +17403,117 @@ M[OPTN INX 5]~M[OPTN INX 2].[6:42]; M[OPTN INX 2]~M[OPTN INX 6]~0; 20511550 $ SET OMIT = PACKETS 20511729 EXYT: 20511800 END SECURITYMAINT; 20511810 +COMMENT THE PRT CELL "SHEET" GIVES DISK ADDRESS OF 1ST SHEET ENTRY 20512000 + *** ENTRIES IN THE SHEET ARE AS FOLLOWS: 20512400 + S[ 0] = 1ST NAME (7 CHRS) 20512800 + .[ 2:1 ] = "CANDE" JOB (TSS ONLY) 20513200 + S[ 1] = 2ND NAME (7 CHRS) 20513600 + S[ 2].[ 1: 2] = 0 NORMAL 20514000 + 2 JOB HAS BEEN XS-ED (FORCED RUN) 20514400 + 3 JOB HAS BEEN ES-ED (FORCED RUN AND DS) 20514800 + S[ 3].[ 4:1 ] = SUPPRESS BOJ/EOJ MESSAGES FOR SYSTEM JOBS 20515200 + S[ 2].[ 5:3 ] = 0 NORMAL, 1 LIBMAIN, 3 LDCNTRL, 5 PRNPBT 20515400 + S[ 2].[ 8:10] = 0 GO JOB (FROM COMPILE & GO) 20515600 + = 1 COMPILER (FOR COMPILE & GO) 20516000 + = 2 EXECUTE JOB 20516400 + = 3 COMPILER (FOR SYNTAX CHECK)(SET TO 2 LATER) 20516800 + = 4 COMPILER (FOR COMPILE TO LIBRARY) 20517200 + = 5 RUN JOB 20517600 + S[ 2].[18:15] = SKELETONS DISK ADDRESS (IF S[2].[8:10] = 1,2,4 20518000 + S[ 2].[33:15] = PRIORITY, SAME AS S[18] 20518400 + S[ 3].[ 1:1 ] = SET BY SELECTRUN WHEN "SCHEDULED" MESSAGE 20518800 + IS SENT (IF SCHEDULED) 20519200 + S[ 3].[ 2: 1] = 1 RESTART JOB 20519600 + S[ 3].[ 8:10] = SCHEDULE-ID FOR THIS JOB 20520000 + S[ 5] = STARTING TIME FOR LOG 20520400 + S[ 6] = LOCATION OF LAST PART OF LOG 20520800 + S[ 7] = CORE ADDRESS OF SEGMENT ZERO (WHEN THE 20521200 + SHEET IS PASSED TO SELECTRUN AS A PARAMETER) 20521600 + S[13] = DISK ADDRESS OF LABEL EQUATION ENTRIES 20522000 + APPLICABLE TO THIS EXECUTION ONLY (SEE BELOW) 20522400 + S[14] = ACTUAL MFID OF JOB (TSS ONLY). THIS MAY BE 20522800 + BE DIFFERENT FROM S[0] FOR SOME JOBS 20523200 + WHICH ARE STARTED BY CANDE. 20523600 + S[15] = DISK ADDRESS OF LABEL EQUATION ENTRIES 20524000 + PRESENTED WHEN PROGRAM WAS COMPILED AND 20524400 + APPLICABLE TO ALL EXECUTIONS 20524800 + S[16] = ESTIMATED PROCESSOR TIME 20525200 + S[17] = ESTIMATED I/O TIME 20525600 + S[18] = PRIORITY 20526000 + S[19] = COMMON VALUE 20526400 + S[20] = ESTIMATED CORE REQUIREMENTS 20526800 + S[20].[ 2:1 ] = "CAN-T EXPAND" BIT (TSS) 20527200 + .[33:15] = ESTIMATED CORE REQUIREMENT 20527600 + S[21] = STACK SIZE 20528000 + S[22] = SAVE FACTOR FOR OBJECT FILE (COMPILATIONS) 20528400 + S[23].[2:6] = UNITNO OF CARD/PSEUDO READER IN CONTROLCARD. 20528800 + S[23].[9:9] = REMOTE STATION ADDRESS, ELSE 0 20529200 + S[23].[24:24] = TIME JOB PUT IN SHEET(FOR TS MSG) 20529600 + S[24] = USER CODE 20530000 + S[25] = DISK ADDRESS OF FILE HEADER FOR THE JOB 20530400 + S[26] = LOGLINE (TSS) 20530800 + S[27] = FID FOR COMPILES,TAPE NAME FOR LIBMAIN. 20531200 + S[29] = DISK ADDRESS OF NEXT SHEET ENTRY (=0 IF LAST) 20531600 + *** ENTRIES FOR LABEL EQAT. ARE AS FOLLOWS: 20532000 + F[0] = MULTI-FILE ID (7 CHRS) 20532400 + F[1] = FILE ID (7 CHRS) 20532800 + F[2].[0:18] = REEL NO (3 CHRS) 20533200 + F[2].[18:30] = CREATION DATE (5 CHRS) 20533600 + F[3].[0:6] = CYCLE (1 CHR) 20534000 + F[3].[15:8] = NUM COPIES OF PBD OR PUD FILE 20534400 + F[3].[23:1] = 1, IF "FREEF" PDB PACKET FILE 20534800 + F[3].[42:1] = 1 FOR FORMS REQUIRED 20535200 + F[3].[43:5] = 0 FOR CP (FILE TYPES ) 20535600 + 1 FOR LP 20536000 + 2 FOR MT 20536400 + 3 FOR SPECIFIC UNIT 20536800 + 4 FOR LP (MAY BACKUP) 20537200 + 5 FOR SPECIFIC (UNLABELED) 20537600 + 6 FOR LP (MUST BACKUP) 20538000 + 7 FOR PT 20538400 + 8 FOR PT (UNLABELED) 20538800 + 9 FOR MT (UNLABELED) 20539200 + 10 FOR DISK 20539600 + F[4].[0:6] = NO OF CHARS IN INTERNAL NAME 20540000 + F[4].[6:42] = INTERNAL NAME (MAY CONTINUE TO F[11]) 20540400 + F[12].[15:1] = "SENSITIVE" BIT 20540800 + F[12].[16:2] = DISK SPEED 20541200 + F[12].[18:5] = EU NUMBER + 1 20541600 + F[14]- F[25] SAME AS ABOVE FOR NEXT FILE (F[14]=14 IF NO NEXT)20542000 + F[29] = DISK ADRS.OF NXT.LBL.EQUAT.ENTRY(=0 IF NONE) 20542400 + **** ALSO SEE PROCEDURE "SELECTRUN1" (SEQ.NO.20055600) FOR 20542800 + **** FURTHER INFORMATION ON LABEL EQUATION AND THE FILE 20543200 + **** PARAMETER BLOCK. 20543600 + 20544000 + **** CONTENTS OF THE JAR: 20544400 + JAR[0].[ 1:1 ] = COMPILE JOB 20544800 + .[ 2:1 ] = "CANDE" JOB (TSS ONLY) 20545200 + .[ 6:42] = MFID OF THE JOB 20545600 + JAR[1].[ 1:1 ] = JOB IS BEING DS-ED 20546000 + .[ 2:1 ] = JOB IS BEING ES-ED 20546400 + .[ 6:42] = FID OF THE JOB 20546800 + JAR[2].[ 1:1 ] = COBOL JOB 20547200 + .[ 2:1 ] = DECLARED SOFTWARD INTERRUPTS 20547600 + .[ 3:1 ] = JOB HAS MAINTENANCE LOG ENTRY 20548000 + .[ 4:1 ] = NOT USED 20548400 + .[ 5:1 ] = DECLARED SOFTWARE INTERRUPTS 20548800 + .[ 6:1 ] = INVOKED OR INVOKING IPC PROG.FILE 20549200 + .[ 7:1 ] = INVOKED IPC PROGRAM FILE 20549600 + .[ 6:10] = SAME AS S[2].[8:10] ABOVE 20550000 + .[18:15] = DISK ADDRESS FOR THE SKELETON SHEET (COMPILATIONS20550400 + .[33:15] = PRIORITY 20550800 + JAR[3] = PROCESS TIME LIMIT 20551200 + JAR[4] = IO TIME LIMIT 20551600 + JAR[5].[ 1:23] = STARTING DATE (OCTAL) 20552000 + .[24:24] = STARTING TIME (OCTAL) 20552400 + JAR[6].[ 1:1 ] = JOB IS SD-ED 20552800 + .[ 2:4 ] = PSEUDO-READER NUMBER 20553200 + .[18:15] = SIZE OF LOG INFORMATION (BATCH) 20553600 + .[33:15] = DISK ADDRESS OF FIRST RECORD FOR THE LOG 20554000 + JAR[7] = IDLETIME ENTRY (BATCH) 20554400 + JAR[7] = MFID OF JOB (TSS ONLY). THIS MAY BE DIFFERENT 20554800 + FROM JAR[0] FOR SOME JOBS STARTED BY CANDE. 20555200 + JAR[8] = LENGTH OF CODE FILE ROW 20555600 + JAR[9].[ 1:1 ] = REEL CHANGE IN PROGRESS DUE TO "RC" MESSAGE 20556000 + .[ 2:1 ] = SUPPRESS PRINTING OF BOJ/EOJ MESSAGES 20556400 + .[ 3:1 ] = JOB HAS BEEN "STOPPED" (WORKSET ON BATCH) 20556410 diff --git a/emulator/B5500IOUnit.js b/emulator/B5500IOUnit.js index 53d9861..118a594 100644 --- a/emulator/B5500IOUnit.js +++ b/emulator/B5500IOUnit.js @@ -79,6 +79,16 @@ B5500IOUnit.BICtoANSI = [ // Index by 6-bit BIC to get 8-bit ANSI "Q", "R", "$", "*", "-", ")", ";", "{", // 28-2F, @50-57 " ", "/", "S", "T", "U", "V", "W", "X", // 30-37, @60-67 "Y", "Z", ",", "%", "!", "=", "]", "\""]; // 38-3F, @70-77 + +B5500IOUnit.BICtoBCLANSI = [ // Index by 6-bit BIC to get 8-bit BCL-as-ANSI code + "#", "1", "2", "3", "4", "5", "6", "7", // 00-07, @00-07 + "8", "9", "@", "?", "0", ":", ">", "}", // 08-1F, @10-17 + ",", "/", "S", "T", "U", "V", "W", "X", // 10-17, @20-27 + "Y", "Z", "%", "!", " ", "=", "]", "\"", // 18-1F, @30-37 + "$", "J", "K", "L", "M", "N", "O", "P", // 20-27, @40-47 + "Q", "R", "*", "-", "|", ")", ";", "{", // 28-2F, @50-57 + "+", "A", "B", "C", "D", "E", "F", "G", // 30-37, @60-67 + "H", "I", "[", "&", ".", "(", "<", "~"]; // 38-3F, @70-77 B5500IOUnit.ANSItoBIC = [ // Index by 8-bit ANSI to get 6-bit BIC (upcased, invalid=>"?") 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 00-0F @@ -97,6 +107,24 @@ B5500IOUnit.ANSItoBIC = [ // Index by 8-bit ANSI to get 6-bit BIC 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // D0-DF 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // E0-EF 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C]; // F0-FF + +B5500IOUnit.BCLANSItoBIC = [ // Index by 8-bit BCL-as-ANSI to get 6-bit BIC (upcased, invalid=>"?") + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 00-0F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 10-1F + 0x1C,0x1B,0x1F,0x00,0x20,0x1A,0x3B,0x0C,0x3D,0x2D,0x2A,0x30,0x10,0x2B,0x3C,0x11, // 20-2F + 0x0C,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0D,0x2E,0x3E,0x1D,0x0E,0x0B, // 30-3F + 0x0A,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x21,0x22,0x23,0x24,0x25,0x26, // 40-4F + 0x27,0x28,0x29,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x3A,0x0C,0x1E,0x0C,0x0C, // 50-5F + 0x0C,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x21,0x22,0x23,0x24,0x25,0x26, // 60-6F + 0x27,0x28,0x29,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x2F,0x2C,0x0F,0x3F,0x0C, // 70-7F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 80-8F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 90-9F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // A0-AF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // B0-BF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // C0-CF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // D0-DF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // E0-EF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C]; // F0-FF /**************************************/ B5500IOUnit.prototype.clear = function() { @@ -187,8 +215,10 @@ B5500IOUnit.prototype.fetch = function(addr) { this.cycleCount += B5500IOUnit.memCycles; if (acc.MAED) { + this.D26F = 1; // set memory address error return 1; } else if (acc.MPED) { + this.D29F = 1; // set memory parity error on data transfer return 1; } else { return 0; // no error @@ -207,6 +237,7 @@ B5500IOUnit.prototype.store = function(addr) { this.cycleCount += B5500IOUnit.memCycles; if (acc.MAED) { + this.D26F = 1; // set memory address error return 1; } else { return 0; // no error @@ -216,9 +247,8 @@ B5500IOUnit.prototype.store = function(addr) { /**************************************/ B5500IOUnit.prototype.fetchBuffer = function(mode, words) { /* Fetches words from memory starting at this.Daddress and coverts the - BIC characters to ANSI in this.buffer. "mode": 0=alpha, 1=binary; - "words": maximum number of words to transfer. In alpha mode, the transfer - can be terminated by a group-mark code in memory. At exit, updates this.Daddress + BIC characters to ANSI or BCLANSI in this.buffer. "mode": 0=BCLANSI, 1=ANSI; + "words": maximum number of words to transfer. At exit, updates this.Daddress with the final transfer address+1. If this.D23F, updates this.wordCount with any remaining count. Returns the number of characters fetched into the buffer */ @@ -229,6 +259,7 @@ B5500IOUnit.prototype.fetchBuffer = function(mode, words) { var done = false; // loop control var overflow = false; // memory address overflowed max var s; // character shift counter + var table = (mode ? B5500IOUnit.BICtoANSI : B5500IOUnit.BICtoBCLANSI); var w; // local copy of this.W do { // loop through the words @@ -237,26 +268,70 @@ B5500IOUnit.prototype.fetchBuffer = function(mode, words) { } else { words--; if (overflow) { - this.AOFF = 1; // for display onlly + this.AOFF = 1; // for display only this.D26F = 1; // address overflow: set invalid address error done = true; - } else if (this.fetch(addr)) { // fetch the next word from memory - if (this.accessor.MAED) { - this.D26F = 1; // set invalid address error - } - if (this.accessor.MPED) { - this.D29F = 1; // set memory parity error - } - } else { // fill the buffer with this word's characters - w = this.W; + } else if (!this.fetch(addr)) { // fetch the next word from memory + w = this.W; // fill the buffer with this word's characters for (s=0; s<8; s++) { c = (w - (w %= 0x40000000000))/0x40000000000; - if (mode || c != 0x1F) { // if binary mode or not a group-mark - buf[count++] = B5500IOUnit.BICtoANSI[c]; - w *= 64; // shift word left 6 bits - } else { - done = true; // group-mark detected in alpha mode + buf[count++] = table[c]; + w *= 64; // shift word left 6 bits + } // for s + } + if (addr < 0x7FFF) { + addr++; + } else { + overflow = true; + } + } + } while (!done); + + this.Daddress = addr; + if (this.D23F) { + this.DwordCount = words % 0x1FF; + } + return count; +}; + +/**************************************/ +B5500IOUnit.prototype.fetchBufferWithGM = function(mode, words) { + /* Fetches words from memory starting at this.Daddress and coverts the + BIC characters to ANSI or BCLANSI in this.buffer. "mode": 0=BCLANSI, 1=ANSI; + "words": maximum number of words to transfer. The transfer can be terminated + by a group-mark code in memory. At exit, updates this.Daddress with the + final transfer address+1. If this.D23F, updates this.wordCount + with any remaining count. + Returns the number of characters fetched into the buffer */ + var addr = this.Daddress; // local copy of memory address + var buf = this.buffer; // local pointer to buffer + var c; // current character code + var count = 0; // number of characters fetched + var done = false; // loop control + var overflow = false; // memory address overflowed max + var s; // character shift counter + var table = (mode ? B5500IOUnit.BICtoANSI : B5500IOUnit.BICtoBCLANSI); + var w; // local copy of this.W + + do { // loop through the words + if (words <= 0) { + done = true; + } else { + words--; + if (overflow) { + this.AOFF = 1; // for display only + this.D26F = 1; // address overflow: set invalid address error + done = true; + } else if (!this.fetch(addr)) { // fetch the next word from memory + w = this.W; // fill the buffer with this word's characters + for (s=0; s<8; s++) { + c = (w - (w %= 0x40000000000))/0x40000000000; + if (c == 0x1F) { + done = true; // group-mark detected break; + } else { + buf[count++] = table[c]; + w *= 64; // shift word left 6 bits } } // for s } @@ -277,13 +352,11 @@ B5500IOUnit.prototype.fetchBuffer = function(mode, words) { /**************************************/ B5500IOUnit.prototype.storeBuffer = function(chars, offset, mode, words) { - /* Converts characters in this.buffer from ANSI to BIC, assembles them into - words, and stores the words into memory starting at this.Daddress. - BIC characters to ANSI in this.buffer. "chars": the number of characters to - stort, starting at "offset" in the buffer; "mode": 0=alpha, 1=binary; - "words": maximum number of words to transfer. In alpha mode, the final character - stored from the buffer is followed by a group-mark, assuming the word count is - not exhausted. At exit, updates this.Daddress with the final transfer address+1. + /* Converts characters in this.buffer from ANSI or BCLANSI to BIC, assembles + them into words, and stores the words into memory starting at this.Daddress. + "chars": the number of characters to store, starting at "offset" in the buffer; + "mode": 0=BCLANSI, 1=ANSI; "words": maximum number of words to transfer. + At exit, updates this.Daddress with the final transfer address+1. If this.D23F, updates this.wordCount with any remaining count. Returns the number of characters stored into memory from the buffer */ var addr = this.Daddress; // local copy of memory address @@ -293,33 +366,107 @@ B5500IOUnit.prototype.storeBuffer = function(chars, offset, mode, words) { var done = (words > 0); // loop control var overflow = false; // memory address overflowed max var power = 0x40000000000; // factor for character shifting into a word - var s = 8; // character shift counter + var s = 0; // character shift counter + var table = (mode ? B5500IOUnit.BICtoANSI : B5500IOUnit.BICtoBCLANSI); var w = 0; // local copy of this.W - while (!done) { // loop through the words + while (!done) { // loop through the words if (count >= chars) { done = true; } else { - c = B5500IOUnit.ANSItoBIC[buf[offset+(count++)]]; + c = table[buf[offset+(count++)]]; w += c*power; power /= 64; - if (--s <= 0) { + if (++s > 7) { this.W = w; if (overflow) { + this.AOFF = 1; // for display only this.D26F = 1; // address overflow: set invalid address error done = true; - } else if (this.store(addr)) { // store the word in memory - if (this.accessor.MAED) { - this.D26F = 1; // set invalid address error - } + } else { + this.store(addr); // store the word in memory } if (addr < 0x7FFF) { addr++; } else { overflow = true; } - s = 8; - w = 0; + w = s = 0; + power = 0x40000000000; + if (--words <= 0) { + done = true; + } + } + } + } // while !done + + if (s > 0 && words > 0) { // partial word left to be stored + this.W = w; + if (overflow) { + this.AOFF = 1; // for display only + this.D26F = 1; // address overflow: set invalid address error + done = true; + } else { + this.store(addr); // store the word in memory + } + words--; + if (addr < 0x7FFF) { + addr++; + } + } + + this.Daddress = addr; + if (this.D23F) { + this.DwordCount = words % 0x1FF; + } + return count; +}; + +/**************************************/ +B5500IOUnit.prototype.storeBufferWithGM = function(chars, offset, mode, words) { + /* Converts characters in this.buffer from ANSI to BIC, assembles them into + words, and stores the words into memory starting at this.Daddress. + "chars": the number of characters to store, starting at "offset" in the buffer; + "mode": 0=BCLANSI, 1=ANSI; "words": maximum number of words to transfer. + The final character stored from the buffer is followed in memory by a group-mark, + assuming the word count is not exhausted. At exit, updates this.Daddress with the + final transfer address+1. + If this.D23F, updates this.wordCount with any remaining count. + Returns the number of characters stored into memory from the buffer, plus one + for the group-mark */ + var addr = this.Daddress; // local copy of memory address + var buf = this.buffer; // local pointer to buffer + var c; // current character code + var count = 0; // number of characters fetched + var done = (words > 0); // loop control + var overflow = false; // memory address overflowed max + var power = 0x40000000000; // factor for character shifting into a word + var s = 0; // character shift counter + var table = (mode ? B5500IOUnit.BICtoANSI : B5500IOUnit.BICtoBCLANSI); + var w = 0; // local copy of this.W + + while (!done) { // loop through the words + if (count >= chars) { + done = true; + } else { + c = table[buf[offset+(count++)]]; + w += c*power; + power /= 64; + if (++s > 7) { + this.W = w; + if (overflow) { + this.AOFF = 1; // for display only + this.D26F = 1; // address overflow: set invalid address error + done = true; + } else { + this.store(addr); // store the word in memory + } + if (addr < 0x7FFF) { + addr++; + } else { + overflow = true; + } + w = s = 0; power = 0x40000000000; if (--words <= 0) { done = true; @@ -330,18 +477,17 @@ B5500IOUnit.prototype.storeBuffer = function(chars, offset, mode, words) { if (!mode) { // alpha transfer terminates with a group-mark w += 0x1F*power; // set group mark in register - s--; + s++; count++; } - if (s < 8 && words > 0) { // partial word left to be stored + if (s > 0 && words > 0) { // partial word left to be stored this.W = w; if (overflow) { + this.AOFF = 1; // for display only this.D26F = 1; // address overflow: set invalid address error done = true; - } else if (this.store(addr)) { // store the word in memory - if (this.accessor.MAED) { - this.D26F = 1; // set invalid address error - } + } else { + this.store(addr); // store the word in memory } words--; if (addr < 0x7FFF) { diff --git a/tools/BIC-ANSI-xlateTest.html b/tools/BIC-ANSI-xlateTest.html index b137bc9..2a40a1a 100644 --- a/tools/BIC-ANSI-xlateTest.html +++ b/tools/BIC-ANSI-xlateTest.html @@ -6,7 +6,7 @@ var d; var x; var y; -var BICtoANSI = [ // Index by 6-bit BIC to get 8-bit ANSI code +BICtoANSI = [ // Index by 6-bit BIC to get 8-bit ANSI code "0", "1", "2", "3", "4", "5", "6", "7", // 00-07, @00-07 "8", "9", "#", "@", "?", ":", ">", "}", // 08-1F, @10-17 "+", "A", "B", "C", "D", "E", "F", "G", // 10-17, @20-27 @@ -15,8 +15,18 @@ var BICtoANSI = [ // Index by 6-bit BIC to get 8-bit ANSI code "Q", "R", "$", "*", "-", ")", ";", "{", // 28-2F, @50-57 " ", "/", "S", "T", "U", "V", "W", "X", // 30-37, @60-67 "Y", "Z", ",", "%", "!", "=", "]", "\""]; // 38-3F, @70-77 + +BICtoBCLANSI = [ // Index by 6-bit BIC to get 8-bit BCL-as-ANSI code + "#", "1", "2", "3", "4", "5", "6", "7", // 00-07, @00-07 + "8", "9", "@", "?", "0", ":", ">", "}", // 08-1F, @10-17 + ",", "/", "S", "T", "U", "V", "W", "X", // 10-17, @20-27 + "Y", "Z", "%", "!", " ", "=", "]", "\"", // 18-1F, @30-37 + "$", "J", "K", "L", "M", "N", "O", "P", // 20-27, @40-47 + "Q", "R", "*", "-", "|", ")", ";", "{", // 28-2F, @50-57 + "+", "A", "B", "C", "D", "E", "F", "G", // 30-37, @60-67 + "H", "I", "[", "&", ".", "(", "<", "~"]; // 38-3F, @70-77 -var ANSItoBIC = [ // Index by 8-bit ANSI to get 6-bit BIC (upcased, invalid=>"?") +ANSItoBIC = [ // Index by 8-bit ANSI to get 6-bit BIC (upcased, invalid=>"?") 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 00-0F 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 10-1F 0x30,0x3C,0x3F,0x0A,0x2A,0x3B,0x1C,0x0C,0x1D,0x2D,0x2B,0x10,0x3A,0x2C,0x1A,0x31, // 20-2F @@ -34,6 +44,24 @@ var ANSItoBIC = [ // Index by 8-bit ANSI to get 6-bit BIC (upcased 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // E0-EF 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C]; // F0-FF +BCLANSItoBIC = [ // Index by 8-bit BCL-as-ANSI to get 6-bit BIC (upcased, invalid=>"?") + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 00-0F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 10-1F + 0x1C,0x1B,0x1F,0x00,0x20,0x1A,0x3B,0x0C,0x3D,0x2D,0x2A,0x30,0x10,0x2B,0x3C,0x11, // 20-2F + 0x0C,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0D,0x2E,0x3E,0x1D,0x0E,0x0B, // 30-3F + 0x0A,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x21,0x22,0x23,0x24,0x25,0x26, // 40-4F + 0x27,0x28,0x29,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x3A,0x0C,0x1E,0x0C,0x0C, // 50-5F + 0x0C,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x21,0x22,0x23,0x24,0x25,0x26, // 60-6F + 0x27,0x28,0x29,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x2F,0x2C,0x0F,0x3F,0x0C, // 70-7F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 80-8F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 90-9F + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // A0-AF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // B0-BF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // C0-CF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // D0-DF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // E0-EF + 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C]; // F0-FF + function html(c) { switch(c) { case "<": return("<"); @@ -68,6 +96,30 @@ for (x=0; x<256; x++) { } } +document.write("

Test BIC to BCLANSI

"); + +for (x=0; x<64; x++) { + c = BICtoBCLANSI[x]; + y = BCLANSItoBIC[c.charCodeAt(0)]; + document.write("[" + x + "=" + y + "] = " + html(c) + "
"); + if (x != y) { + alert("BICtoBCLANSI mismatch: " + x + "!=" + y + ", " + html(c)); + } +} + +document.write("

Test BCLANSI to BIC

"); + +for (x=0; x<256; x++) { + y = BCLANSItoBIC[x]; + d = String.fromCharCode(x); + c = BICtoBCLANSI[y]; + y = c.charCodeAt(0); + document.write("[" + x + "=" + y + "] : " + html(c) + "=" + html(d) + "
"); + if (y != 63 && c != d.toUpperCase()) { + alert("BCLANSItoBIC mismatch: " + x + "!=" + y + ", " + html(c)); + } +} + \ No newline at end of file