// diablotranslate.sr get "BRAVO1.DF" get "CHAR.DF" get "ST.DF" get "DISPLAY.DF" get "VM.DF" get "COM.DF" get "HARDCOPY.DF" get "RN1.DF" get "DIABLO.DF" // Outgoing Procedures external [ DiabloTranslate ] // Outgoing Statics // external // Incoming Procedures external [ endofkeystream getchar FDiabloInit establishfun // setmag invalidatewindow errhlta CpFormatPage ult MoveX SetRegionSys stnum SetRegionW setupdate updatedisplay bravochar FinfoToDiablo PositionYd ] // Incoming Statics external [ vxwChuldiablo vrgcc2 vxDiablo mpWwWwd mpfnof rgmaccp vydDiablo vrlwsys vxleftmargstd dcpendofdoc ] // Local Statics // static // Local Structures // structure // Local Manifests manifest [ chulDiablo = #137 // get from font width description piMax = 20 ] // F D I A B L O A B O R T P A G E let FDiabloAbortPage() = valof [ if endofkeystream() then resultis false let ch = getchar() if ch ne chsp & ch ne chdel then resultis false resultis true ] // end FDiabloAbortPage // D I A B L O T R A N S L A T E and DiabloTranslate(ww, cp, pi, ho) = valof [ unless FDiabloInit(ydMax - ydPerinch) do resultis abWontRestore establishfun(0, 0, modehc) vxwChuldiablo = vrgcc2 ! chulDiablo vxDiablo = 0 let wwd = mpWwWwd ! ww // let tmag = wwd>>WWD.mag; wwd>>WWD.mag = 101; let tfHd = wwd>>WWD.fHd; wwd>>WWD.fHd = true; let txdUd = wwd>>WWD.xdUd; wwd>>WWD.xdUd = vxleftmargstd rshift 5; // setmag(ww); invalidatewindow(ww); if mpfnof ! fnfontw eq -1 then errhlta(206); let doc = wwd>>WWD.doc let cpMac = rgmaccp ! doc - dcpendofdoc let piLast = piNil let mppicp = vec piMax mppicp ! 0 = cp for tpi = 1 to piMax-1 do mppicp ! tpi = cpnil cp = cpnil let fContinuous = false let ch = nil let cchPgbrk = nil let sb = vec 5 let ridPgn = nil let ab = abnil let fGetint = nil [ startpage: test cp eq cpnil ifso [ cp = pi ls piMax ? mppicp ! pi, cpnil if cp eq cpnil then [ let tpi = 0 while tpi ls piMax & mppicp ! tpi ne cpnil do tpi = tpi + 1 tpi = tpi - 1 cp = mppicp ! tpi while tpi ls pi do [ cp = CpFormatPage(ww, cp, modehc, ho, tpi, FDiabloAbortPage, 0, pttodmlt, pttoddiv) if cp eq cpnil-1 then [ ab = abmsg goto resetmag ] if cp eq cpnil then [ ab = abComTerm goto resetmag ] unless ult(cp, cpMac) do goto badpage mppicp ! tpi = cp tpi = tpi + 1 ] ] ] ifnot if pi ls piMax then mppicp ! pi = cp unless ult(cp, cpMac) do break if fContinuous then goto printpage MoveX(-vxDiablo) // this sets y origin: // (assumes print head positioned 1" down from top of page) vydDiablo = ydMax - ydPerinch // "Ready to print page n" SetRegionSys(risysstate, 161) stnum(sb, ho>>HO.pgnFirst+pi) SetRegionW(vrlwsys, 0, sb) ridPgn<>WWD.cpFDispl = cp setupdate(ww) updatedisplay() ch = bravochar() SetRegionSys(risysstate, rinil) SetRegionSys(risyspast, rinil) updatedisplay() switchon (ch ge $A & ch le $Z) ? ch+#40, ch into [ case chsp: case chcr: endcase case $c: SetRegionSys(risysstate, 163) updatedisplay() if bravochar() ne chcr then loop fContinuous = true endcase // case $g: // augmentomseq("M^") // fGetint = FGetUserInt(lv pi, 164) // deactivateomseq("M^", "M^") // unless fGetint do // goto badpage // pi = pi - ho>>HO.pgnFirst // cp = cpnil // loop case $r: unless piLast eq piNil do [ pi = piLast cp = cpnil ] loop case chdel: ab = abComTerm goto resetmag default: ab = abIllOpt goto resetmag ] printpage: cp = CpFormatPage(ww, cp, modehc, ho, pi, FDiabloAbortPage, FinfoToDiablo, pttodmlt, pttoddiv) DiabloPageEject() if cp eq cpnil-1 then [ ab = abmsg goto resetmag ] test cp eq cpnil ifso fContinuous = false ifnot [ piLast = pi pi = pi + 1 ] loop badpage: ab = abBadPage goto resetmag ] repeat resetmag: // wwd>>WWD.mag = tmag wwd>>WWD.fHd = tfHd wwd>>WWD.xdUd = txdUd invalidatewindow(ww) resultis ab ] // end DiabloTranslate // D I A B L O P A G E E J E C T and DiabloPageEject() be [ PositionYd(0) vydDiablo = ydMax ] // end DiabloPageEject