// P R I N T D I S P L A Y 
// Print page to the display.
// errors 3300

get "PDInternals.d"

//outgoing procedures
external PDisplay

//incoming procedures
external
 [
//WINDOW
	WindowInit
	WindowClose
	WindowReadBlock
	WindowGetPosition
	WindowSetPosition
	FileVDA

//PDML
	DoubleAdd
	Ugt
	BitBLT

//OS
	Zero
	MoveBlock
	Timer

//PDPrint
	PDError
	DblShift
	FSGet
	FSGetX
	FSPut
	MulDiv

//CURSOR
	CursorChar
	CursorDigit
	CursorToggle

//PRINT
	PrintError
 ]

// incoming statics
external
	[
	BitsFile
	]

manifest DISWID=36

let PDisplay(pg) be
 [
   let BandWidth = pg>>PageG.BandWidth
   let nbands=pg>>PageG.LastBand-pg>>PageG.FirstBand+1
   if nbands ls 0 then return
   let gbands=nbands		//Number of bands we have dis for
   if gbands gr 800/BandWidth then gbands=800/BandWidth
   let dsiz=nil			//Size of dis buffer
   let dcore=nil			//Dis buffer
   while gbands ge 1 do
     [
      dsiz=gbands*BandWidth*DISWID	//Size
      dcore=FSGet(dsiz+1)		//Try for it
      if dcore then break		//OK
      gbands=gbands-1
     ]
   if dcore eq 0 then [ PDError(1701); return ]
   let dptr=(dcore+1)&(-2)		//Even address

   Zero(dptr,dsiz)		//Zero it.
   let display=vec 10
   display=(display+1)&(-2)			//Even address
   display!0=@#420
   display!1=DISWID
   display!2=dptr
   display!3=gbands*BandWidth/2

   let BitWc=pg>>PageG.BitWc
   let pages=((BitWc*BandWidth+1023)/1024)	//1024 word hunks
   let del=vec 1; del!0=0; del!1=BitWc
   let rwin=WindowInit(BitsFile)	//Get a window.

   let band=0			//Number of bands displayed.
   while band ls nbands do		//Loop through all bands.
     [
      let b=nbands-band
      if b gr gbands then b=gbands	// b= number of bands to show this time

      let wid=0			//Number of words displayed
      while wid ls BitWc do
	[
	let w=BitWc-wid
	if w gr DISWID then w=DISWID	// w= number of words to display

//When we get here, we are to display "b" bands starting at "band".
//In each band, we are to show "w" words starting at "wid"
//  ***** Loop begins here *****
	Zero(dptr,dsiz)

	for db=0 to b-1 do
	   [
	   let pos=vec 1
	   pos!0=0; pos!1=(band+db)*pages+pg>>PageG.BitPage
	   DblShift(pos,-10)		//1024 hunks to Words
	   let dw=vec 1
	   dw!0=0; dw!1=wid		//Amount to pass up
	   DoubleAdd(dw,pos)			//Where to start
	   WindowSetPosition(rwin,dw)

	   let dbase=dptr+DISWID*db*BandWidth

	   for sl=0 to BandWidth-1 do	//For entire band
		[
		WindowReadBlock(rwin,dbase+sl*DISWID,w)
		DoubleAdd(dw,del)		//To next scan line
		WindowSetPosition(rwin,dw)
		]
	   ]
//  ***** Loop ends here *****

	@#420=display			//Now displaying!
	CursorToggle(2); CursorToggle(3)	//Let him know!
	PrintError()			//Wait for response
	@#420=0
	wid=wid+w
	]

      band=band+b
     ]

   WindowClose(rwin)
   @#420=display!0
   FSPut(dcore)
 ]