; AltoIIMRT16K.mu ; ; last modified December 1, 1977 1:13 AM ; ; This is the part of the Memory Refresh Task which ; is specific to Alto IIs with Extended memory. ; ; Copyright Xerox Corporation 1979 $EngNumber $30000; ALTO II WITH EXTENDED MEMORY ; ; This version assumes MRTACT is cleared by BLOCK, not MAR_ R37 ; R37 [4-13] are the low bits of the TOD clock ; R37 [8-14] are the refresh address bits ; Each time MRT runs, four refresh addresses are generated, though ; R37 is incremented only once. Sprinkled throughout the execution ; of this code are the following operations having to do with refresh: ; MAR_ R37 ; R37_ R37 +4 NOTE THAT R37 [14] DOES NOT CHANGE ; MAR_ R37 XOR 2 TOGGLES BIT 14 ; MAR_ R37 XOR 200 TOGGLES BIT 8 ; MAR_ R37 XOR 202 TOGGLES BITS 8 AND 14 MRT: MAR_ R37; **FIRST REFRESH CYCLE** SINK_ MOUSE, BUS; MOUSE DATA IS ANDED WITH 17B MRTA: L_ T_ -2, :TX0; DISPATCH ON MOUSE CHANGE TX0: L_ R37 AND NOT T, T_ R37;INCREMENT CLOCK T_ 3+T+1, SH=0; IE. T_ T +4. IS INTV TIMER ON? L_ REFIIMSK AND T, :DOTIMER; [DOTIMER,NOTIMER] ZERO HIGH 4 BITS NOTIMER: R37_ L; STORE UPDATED CLOCK NOTIMERINT: T_ 2; NO STATE AT THIS POINT IN PUBLIC REGS MAR_ R37 XOR T,T_ R37; **SECOND REFRESH CYCLE** L_ REFZERO AND T; ONLY THE CLOKCK BITS, PLEASE SH=0, TASK; TEST FOR CLOCK OVERFLOW :NOCLK; [NOCLK,CLOCK] NOCLK: T _ 200; MAR_ R37 XOR T; **THIRD FEFRESH CYCLE** L_ CURX, BLOCK; CLEARS WAKEUP REQUEST FF T_ 2 OR T, SH=0; NEED TO CHECK CURSOR? MAR_ R37 XOR T, :DOCUR; **FOURTH REFRESH CYCLE** NOCUR: CURDATA_ L, TASK; MRTLAST:CURDATA_ L, :MRT; END OF MAIN LOOP DOTIMER:R37_ L; STORE UPDATED CLOCK MAR_ EIALOC; INTERVAL TIMER/EIA INTERFACE L_ 2 AND T; SH=0, L_ T_ REFZERO.T; ***V3 CHANGE (USED TO BE BIAS) CURDATA_L, :SPCHK; CURDATA_ CURRENT TIME WITHOUT CONTROL BITS SPCHK: SINK_ MD, BUS=0, TASK; CHECK FOR EIA LINE SPACING SPIA: :NOTIMERINT, CLOCKTEMP_ L; NOSPCHK:L_MD; CHECK FOR TIME = NOW MAR_TRAPDISP-1; CONTAINS TIME AT WHICH INTERRUPT SHOULD HAPPEN MTEMP_L; IF INTERRUPT IS CAUSED, L_ MD-T; LINE STATE WILL BE STORED SH=0, TASK, L_MTEMP, :SPIA; TIMERINT:MAR_ ITQUAN; STORE THE THING IN CLOCKTEMP AT ITQUAN L_ CURDATA; R37_ L; T_NWW; AND CAUSE AN INTERRUPT ON THE CHANNELS MD_CLOCKTEMP; SPECIFIED BY ITQUAN+1 L_MD OR T, TASK; NWW_L,:NOTIMERINT; ;The rest of MRT, starting at the label CLOCK is unchanged