!!!!!!!!!!!!!!!!!!!!!!!!!!  Device Control Section  !!!!!!!!!!!!!!!!!!!!!!!!

%option"-low"

%constinteger FRAMEHEIGHT=3500,FRAMEWIDTH=2560,
              FRAMEMULT=framewidth//8, FRAMEINC=-framemult,
              FRAMESIZE=frameheight*framemult

%byte %integer %array FRAME(0:framesize-1);  !or *2
%own %integer newframe = 1

%routine RESET FRAME
%label loop
%bytename p
%integer q
   p == frame(0)
   q = framesize
  *move.l p,a0
  *move.l q,d1
  *moveq #0,d0
loop:
  *move.l d0,(a0)+
  *subq.l #4,d1
  *bpl    loop
  newframe = 0
%end

%routine PRINT PAGE

@16_7FFE0%short %integer prdata
@16_7FFE2%short %integer prdataeol
@16_7FFE4%short %integer cntrstat
@16_7FFE8%short %integer commstat
@16_7FFEC%short %integer interrupten
%constant %shortinteger doprint=1,controlready=8,
       fifoempty=1,fifohalffull=2,fifofull=4,pageout=8,printerready=16,
       statusready=32,commandready=64,printerpowerready=128,
       halffullen=1,pageouten=2,npageouten=4,statusreadyen=8

%constinteger vcount=frameheight-1, hcount=printwidth//16-1,
              print=controlready+doprint,
              topmargin=130
@16_400100%short PTM13
@16_400102%short PTM2
%bytename framebase
%integer i
framebase == frame(0)

!Silence timer
*move.w #16_700,d0; *trap #0
  ptm2 = 0;                    !select PTM3
  ptm13 = 0
  ptm2 = 16_0100;              !select PTM1
  ptm13 = 0
notdone:
  *move.w cntrstat,d2
  *and.w #pageout,d2
  *bne notdone
  i = prdata;                  !reset [eventually]
  cntrstat = controlready
  %for i = 1,1,topmargin %cycle
    prdataeol = 2
  %repeat
!Load registers
  *move framebase,a0
  *move #0,d0
  *move #vcount,d1      {outer loop D1
  *move.w #print,cntrstat;  !start device
notready:
  *move.w cntrstat,d2
  *and.w #pageout,d2
  *beq notready
  *move.w #controlready,cntrstat
!Send data
loop1:
  *move.w cntrstat,d2
  *and.w #fifohalffull,d2
  *bne loop1
!Left margin 16 (15+1) *16
  *move #15,d2
loop11:
  *move.w d0,prdata
  *dbra d2,loop11
!Data for line
  *move a0,a1
  *move #hcount,d2   {inner loop D2
loop2:
  *move.w cntrstat,d4
  *and.w #fifofull,d4
  *bne loop2
  *move.w (a1)+,prdata
  *dbra d2,loop2
  *move.w #0,prdataeol
  *lea framemult(a0),a0
  *dbra d1,loop1

*move.w #0,d0; *trap #0
%end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

