DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 9388 (0x24ac) Types: TextFile Names: »CONSOLE.S«
└─⟦17728abc9⟧ Bits:30005143 8" CR80 Floppy CR80FD_0130 ( CR/D/1422 FLERCPU Source ) └─⟦1815caf3d⟧ └─ ⟦this⟧ »CONSOLE.S«
CONST "***** GENERAL STATUS CONSTANTS *****" BUSY = 15; "***** MAP INSTRUCTIONS FOR AV24 I/O PORT *****" WRITE_BLOCKSIZE = #89D3; WRITE_TIME = #89D4; WRITE_STOPCHAR = #89D5; WRITE_MODE = #89D6; READ_INPUT_STATUS = #89D0; WRITE_INPUT_COMMAND= READ_INPUT_STATUS; READ_ISIZE = #89D1; READ_ISTART = #89D2; READ_INPUT_DATA = #8C00; READ_OUTPUT_STATUS = #89D8; WRITE_OUTPUT_COMMAND = READ_OUTPUT_STATUS; WRITE_OSIZE = #89D9; WRITE_OSTART = #89DA; WRITE_OUTPUT_DATA = #8E00; "****** OC INTERFACE ******" BLOCKSIZE = 511; STOPCHAR = 13; TIME = 0 ; "NO TIMEOUT WILL OCCUR AUTO_ECHO_MODE = 1; "ON "****** CONDITIONAL COMPILATION *****" NRSIGN = FALSE; VAR HEXCH : ARRAY [0..15] OF CHAR ; "ASCII CHARACTERS FOR" "HEX. INTEGERS " VAR CH_COUNT : INTEGER; "POINTER TO CURRENT CHARACTER CH_COUNT1: INTEGER; LOC_COUNT,LOC_COUNT1: INTEGER; OUTBUF, INBUF : INTEGER; LAST_IN : INTEGER; "LAST INPUT CHARACTER READ BREAK_JUMP_LOC: INTEGER; "LOC TO BEE JUMPED TO AFTER 'BREAK' INIT HEXCH [00..00] = '0'; HEXCH [01..01] = '1'; HEXCH [02..02] = '2'; HEXCH [03..03] = '3'; HEXCH [04..04] = '4'; HEXCH [05..05] = '5'; HEXCH [06..06] = '6'; HEXCH [07..07] = '7'; HEXCH [08..08] = '8'; HEXCH [09..09] = '9'; HEXCH [#A..#A] = 'A'; HEXCH [#B..#B] = 'B'; HEXCH [#C..#C] = 'C'; HEXCH [#D..#D] = 'D'; HEXCH [#E..#E] = 'E'; HEXCH [#F..#F] = 'F'; CH_COUNT = 0; CH_COUNT1 = BLOCKSIZE + 1; "FORCES READING OF FIRST BUFFER LAST_IN = STOPCHAR ; " DITTO LOC_COUNT = 0; LOC_COUNT1= 0; OUTBUF = 0; INBUF = 0; "PAGE«ff» EXPORT PROCEDURE INIT_OC "======================" (R7; " C BREAK JUMP LOCATION R6); "LINK" VAR S7, LINK: INTEGER; BEGIN R6 => LINK; R7 => BREAK_JUMP_LOC; CIO(BLOCKSIZE=>R7, WRITE_BLOCKSIZE=>R6); CIO(TIME =>R7, WRITE_TIME =>R6); CIO(STOPCHAR =>R7, WRITE_STOPCHAR=>R6); CIO(AUTO_ECHO_MODE =>R7, WRITE_MODE=>R6); BREAK_JUMP_LOC => R7; EXIT(LINK); END; "INIT_IF" "PAGE«ff» FORWARD PROCEDURE OUTTEXT(R3;R6); EXPORT PROCEDURE FLUSHOUT (R6); CONST TRANSMIT_DATA = #8000; OUTPUT_BUFFER_EMPTY = 8; VAR LINK,S7: INTEGER; BEGIN R6=>LINK; R7=>S7; CH_COUNT=>R6; IF R6 EXTRACT 1 <> 0 THEN BEGIN WRITE_OUTPUT_DATA=>R7 IOR (LOC_COUNT=>R6); CIO(OUTBUF=>R6, R7); END; CIO(0=>R6, WRITE_OSTART=>R7); CIO(CH_COUNT=>R6, WRITE_OSIZE=>R7); 0=>R6; R6=>CH_COUNT; R6=>LOC_COUNT; R6=>OUTBUF; CIO(TRANSMIT_DATA=>R6, WRITE_OUTPUT_COMMAND=>R7); REPEAT SIO(R6, READ_OUTPUT_STATUS=>R7); UNTIL NOT R6[BUSY]; S7=>R7; EXIT(LINK); END; "PAGE«ff» EXPORT PROCEDURE OUTCHAR "======================" (R3; "CHARACTER R6); "LINK" VAR LINK,S3,S7: INTEGER; BEGIN R6=>LINK; R3=>S3; R7=>S7; CH_COUNT=>R6; IF R6 EXTRACT 1 <> 0 THEN BEGIN OUTBUF=>R7 IOR (R3 SHIFTLL 8); LOC_COUNT=>R3; CIO(R7, WRITE_OUTPUT_DATA=>R6 IOR R3); R3+1=>LOC_COUNT; 0=>R7=>OUTBUF; END ELSE R3=>OUTBUF; ADDRESS(CH_COUNT)=>R6; INC(R6@INTEGER); IF R6@INTEGER >= BLOCKSIZE + 1 THEN FLUSHOUT(R6); S3=>R3; S7=>R7; EXIT(LINK); END; "OUTCHAR" «ff» EXPORT PROCEDURE OUTTEXT "======================" (R3; "ADDRESS OF TEXT" R6); "LINK" "-------------------------------------------------------- " PRINT A STRING OF CHARACTERS " TERMINATED BY (:0:) "-------------------------------------------------------- VAR SAVEREGS: ARRAY [0..7] OF INTEGER; BEGIN R7 => SAVEREGS[7]; STC(6,ADDRESS(SAVEREGS[7])=>R7); R3 => R2; 0=>R4; REPEAT OUTCHAR(R2@STRING[R4] => R3, R6); R4 + 1; UNTIL R3 = 0; UNS (7,ADDRESS(SAVEREGS[0])=>R7); EXIT(R6); END; "OUTTEXT" "PAGE«ff» EXPORT PROCEDURE CHECKBREAK (R6); "R3 IS DESTROYED IN CASE OF BREAK OR ERROR CONST "BIT NUMBERS" BREAK = 9; IOV = 10; PARITY_ERR = 11; TIMED_OUT = 13; VAR LINK: INTEGER; BEGIN R6=>LINK; SIO(R6, READ_INPUT_STATUS=>R6); IF NOT R6[BUSY] THEN BEGIN IF R6[BREAK] THEN BEGIN OUTTEXT(ADDRESS(' *BREAK(:0:)')=>R3,R6); EXIT(BREAK_JUMP_LOC); END; IF R6[IOV] THEN BEGIN OUTTEXT(ADDRESS(' *OVERFLOW IN BUF(:0:)')=>R3,R6); EXIT(BREAK_JUMP_LOC); END; IF R6[PARITY_ERR] THEN BEGIN OUTTEXT(ADDRESS(' *PAR ERR IN BUF(:0:)')=>R3,R6); EXIT(BREAK_JUMP_LOC); END; IF R6[TIMED_OUT] THEN BEGIN OUTTEXT(ADDRESS(' *TIMED OUT(:0:)')=>R3,R6); EXIT(BREAK_JUMP_LOC); END; END; EXIT(LINK); END; "PAGE«ff» EXPORT PROCEDURE OUTNEWLINE "=========================" (R6); "LINK" "-------------------------------------------------------- " PRINT A CR CHARACTER ON THE CONSOLE " THEN ISSUE 8 FILLER CHARACTERS ( NULLS) TO GIVE THE CARRIAGE " TIME TO RETURN BEFORE THE NL (LINE FEED) CHARACTER IS ISSUED. "-------------------------------------------------------- VAR S2, S3, S6 : INTEGER; BEGIN R2 => S2; R3 => S3; R6 => S6; OUTCHAR(CR => R3, R6); 0 => R2; NULL => R3; REPEAT OUTCHAR( R3, R6); UNTIL ( R2 + 1) = 8; OUTCHAR( NL => R3, R6); FLUSHOUT(R6); S2 => R2; S3 => R3; EXIT(S6); END; "OUTNEWLINE" "PAGE«ff» EXPORT PROCEDURE OUTHEX "=====================" (R3; "INTEGER TO BE PRINTED" R6); "LINK" "-------------------------------------------------------- " OUTPUT AN INTEGER IN ITS HEX. " REPRESENTATION PRECEDED WITH A BLANK OR SHARP "-------------------------------------------------------- VAR SAVEREGS: ARRAY [0..7] OF INTEGER; BEGIN R7 => SAVEREGS[7]; STC(6,ADDRESS(SAVEREGS[7])=>R7); %WHEN NRSIGN = FALSE SKIP OUTCHAR('#'=>R3, R6); %COMPILE %WHEN NRSIGN = TRUE SKIP OUTCHAR(SP=>R3, R6); %COMPILE SAVEREGS[3]=>R4; 0 => R5; REPEAT R4 SHIFTLC 4; R4=>R6 EXTRACT 4; OUTCHAR(HEXCH[R6]=>R3, R6); UNTIL R5+1 = 4; CHECKBREAK(R6); UNS (7,ADDRESS(SAVEREGS[0])=>R7); EXIT(R6); END; "OUTHEXA" "PAGE«ff» EXPORT PROCEDURE OUTINT "=====================" (R3; "INTEGER TO BE PRINTED" R6); "LINK" "-------------------------------------------------------- " OUTPUT AN INTEGER IN ITS DECIMAL " REPRESENTATION (UNSIGNED AND WITH LEADING ZEROES SUPPRESSED) " THIS ROUTINE DON'T USE DIVIDE INSTRUCTION !!. "-------------------------------------------------------- VAR SAVEREGS: ARRAY[ 0..7] OF INTEGER; EXP_OF_TEN: ARRAY[ 1..4] OF INTEGER; LINE: ARRAY [0..4] OF CHAR; INIT EXP_OF_TEN = 10, 100, 1000, 10000; BEGIN R7 => SAVEREGS[7]; STC(6,ADDRESS(SAVEREGS[7])=>R7); 4 => R4; REPEAT EXP_OF_TEN[ R4] => R1; 0 => R0; 0 => R2; WHILE R3 >= ( R2 + R1) DO R0 + 1; R2 - R1; R3 - R2; R0 + '0' => LINE[ R4]; UNTIL ( R4 - 1) = 0; R3 + '0' => LINE[ R4]; TRUE => R0; 4 => R4; REPEAT LINE[ R4] => R3; IF R0 = TRUE LOGAND R4 >= 1 LOGAND R3 = '0' THEN SP => R3 ELSE FALSE => R0; OUTCHAR( R3, R6); UNTIL ( R4 - 1) < 0; UNS (7,ADDRESS(SAVEREGS[0])=>R7); EXIT(R6); END; "OUT INTEGER" "PAGE«ff» EXPORT PROCEDURE IN_BYTE "======================" (R3; "CHARACTER VALUE (RETURN)" R6); "LINK" CONST CLEAR_INPUT_BUFFER = #8001; GET_DATA = #8000; IBR = 8; VAR SAVE: ARRAY [0..7] OF INTEGER; BEGIN R7=>SAVE[7]; STC(6, ADDRESS(SAVE[7])=>R7); CH_COUNT1=>R0; LOC_COUNT1=>R1; IF R0 >= BLOCKSIZE+1 LOGOR LAST_IN=>R6 = STOPCHAR THEN BEGIN CIO(CLEAR_INPUT_BUFFER=>R7, WRITE_INPUT_COMMAND=>R6); REPEAT SIO(R7, READ_INPUT_STATUS=>R6); UNTIL NOT R7[BUSY]; 0=>R0; 0=>R1; CIO(GET_DATA=>R7, WRITE_INPUT_COMMAND=>R6); REPEAT CHECKBREAK(R6); SIO(R7, READ_INPUT_STATUS=>R6); UNTIL NOT R7[BUSY]; END "NEW BUFFER"; IF R0=>R6 EXTRACT 1 = 0 THEN BEGIN SIO(R3, READ_INPUT_DATA=>R6 IOR R1); R3=>INBUF; R3 EXTRACT 7; R1+1=>LOC_COUNT1; END ELSE INBUF=>R3 SHIFTRL 8; R3=>LAST_IN; R3=>SAVE[3]; R0+1=>CH_COUNT1; UNS(7,ADDRESS(SAVE[0])=>R7); EXIT(R6); END; "IN_BYTE" "page«ff» type charclass = (alfa, numeric, delimiter); export procedure getchar (r0; "char r7; "charclass r6); "link var s3,link: integer; begin r6=>link; r3=>s3; in_byte (r3, r6); r3=>r0; if r3 >= 'A' then alfa=>r7 else if r3 >= '0' logand r3 <'9'+1 then numeric=>r7 else delimiter=>r7; s3=>r3; exit(link); end; export procedure inhexa (r3; "hexa r0; "delimiter r6); "link var s7,link: integer; begin r6=>link; r7=>s7; getchar (r0, r7, r6); 0=>r3; while r7 < delimiter logand r0 < 'G' do begin if r7 = numeric then r0-'0' else r0-('A'-10); r3 shiftll 4 + r0; getchar (r0, r7, r6); end; s7=>r7; exit(link); end; «a5»