home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0613.ZIP / CCE_0613.PD / XHARDCOP.Y / XHARDCPY.LST < prev    next >
File List  |  1991-05-01  |  8KB  |  213 lines

  1. ' eXtended-Hardcopy-Accessory
  2. ' ---------------------------
  3. '
  4. ' © HayoSoft 1990 (und Uwe Seimet 1988)
  5. ' Hayo Schmidt
  6. ' Grotiusweg 1
  7. ' 2000 Hamburg 55
  8. '
  9. ' Anregungen von:
  10. ' Uwe Seimet, vgl. ST-Computer 4/90, S.94ff
  11. '
  12. $m300
  13. ' $I- Option kostet 1200 Bytes
  14. $U- ! Option bringt nichts
  15. $%3 ! "
  16. $E- ! "
  17. $P< ! "
  18. $*& ! bringt scheinbar 92 Bytes
  19. '
  20. '
  21. REM Als Accessory initialisieren
  22. ' ap_id&=APPL_INIT() ![direkt übergeben spart 4 Bytes]
  23. IF {BASEPAGE+&H24}=0   ! wenn p_parent gleich null, ist es ein Accessory
  24.   INLINE adr_buffer%,16
  25.   IF MENU_REGISTER(APPL_INIT(),"  XHardcopy 1.2")=-1 ! registrieren
  26.     ' PRINT "pXHardcopy nicht installiert - Menu_register() fehlgeschlagenq"
  27.     END
  28.   ENDIF
  29.   DO
  30.     ~EVNT_MESAG(adr_buffer%) ! warten bis Aufruf 40 AC_OPEN
  31.     '
  32.     IF WORD{adr_buffer%}=40
  33.       ~WIND_UPDATE(3)
  34.       xhard
  35.       ~WIND_UPDATE(2)
  36.     ENDIF
  37.   LOOP
  38. ELSE
  39.   xhard
  40. ENDIF
  41. END
  42. ' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  43. '
  44. '
  45. PROCEDURE xhard
  46.   '
  47.   ' LOCAL mx&,my&,lw&,lh&,m_state&
  48.   '
  49.   REM Bildschirmparameter
  50.   '   (müssen immer wieder neu geholt werden wegen AutoSwitchOverScan)
  51.   xres&=WORD{L~A-12}                  ! Bildschirmauflösung
  52.   yres&=WORD{L~A-4}
  53.   v_lin_wr&=WORD{L~A+2}               ! Bytes pro Videozeile
  54.   v_planes&=WORD{L~A}                 ! Anzahl Bildebenen
  55.   pixperline&=v_lin_wr& DIV v_planes& ! Pixel pro Zeile
  56.   '
  57.   al&=FORM_ALERT(2,"[2][       *** XHardcopy ***| |      Bildschirm-Hardcopy|      Ausschnitt-Hardcopy|         ©HayoSoft 1990][Bildschirm|Ausschnitt|Abbruch]")
  58.   '
  59.   IF al&=1
  60.     blkhardcopy(0,0,xres&,yres&)         ! gesamter Bildschirm
  61.   ELSE IF al&=2
  62.     DEFMOUSE 3                           ! Ausschnitt
  63.     ~EVNT_BUTTON(1,1,1,mx&,my&,d&,d&)       ! x,y-Koordinaten bestimmen
  64.     ~GRAF_RUBBERBOX(mx&,my&,0,0,lw&,lh&)    ! Breite, Höhe bestimmen
  65.     '
  66.     ' statt GRAPHMODE 3
  67.     REM vswr_mode()
  68.     '   Set Writing Mode
  69.     CONTRL(6)=V~H
  70.     INTIN(0)=3
  71.     VDISYS 32,1,0
  72.     '
  73.     REM vsf_interior(vsfi_hd&,style&)
  74.     '   Set Fill Interior Style
  75.     ' CONTRL(6)=V~H
  76.     INTIN(0)=0
  77.     VDISYS 23,1,0
  78.     '
  79.     FOR i&=3 DOWNTO 0
  80.       ' statt BOX mx&,my&,mx&+lw&,my&+lh&   ! Ausschnitt nochmal anzeigen
  81.       REM v_bar()
  82.       ' CONTRL(6)=V~H
  83.       PTSIN(0)=mx&
  84.       PTSIN(1)=my&
  85.       PTSIN(2)=mx&+lw&
  86.       PTSIN(3)=my&+lh&
  87.       VDISYS 11,0,2,1
  88.       '
  89.       PAUSE 5
  90.     NEXT i&
  91.     DEFMOUSE 0
  92.     blkhardcopy(mx&,my&,lw&,lh&)
  93.   ENDIF
  94. RETURN
  95. ' --------------------------------
  96. '
  97. PROCEDURE blkhardcopy(x&,y&,w&,h&)
  98.   ' Block-Hardcopy:
  99.   ' Führt automatisch Hardcopy eines bestimmten Bildausschnittes durch.
  100.   ' Läuft auch unter Hyperscreen/OverScan.
  101.   ' ©HayoSoft 1990
  102.   '
  103.   ' LOCAL setprt%,pmask%,prttype&
  104.   '
  105.   setprt%=XBIOS(33,-1)       ! SETPRT
  106.   ' RESTORE prttypes
  107.   '   FOR i&=0 TO setprt% AND 7
  108.   '   READ prttype&
  109.   ' NEXT i&
  110.   '
  111.   '                        ! Wesentlich kürzer folgende Form der Tabelle
  112.   INLINE prttypes%,8
  113.   {prttypes%}=&H201FF      ! Tabelle in FLOAT-Variable (15 B kürzer als String)
  114.   {prttypes%+4}=&H3FFFFFF
  115.   prttype&=BYTE{prttypes%+(setprt% AND 7)}
  116.   '
  117.   ' RESTORE pmask
  118.   ' pmask$=""
  119.   ' FOR i&=0 TO 17
  120.   '   READ pm|
  121.   '   pmask$=pmask$+CHR$(pm|)
  122.   ' NEXT i&
  123.   '
  124.   ' wesentlich kürzer ist
  125.   INLINE pmask%,18
  126.   {pmask%}=&HF0F0D06
  127.   {pmask%+4}=&H9060806
  128.   {pmask%+8}=&H8020800
  129.   {pmask%+12}=&H8000800       ! durch die 2 Änderungen habe ich über 1800
  130.   ' WORD{pmask%+16}=0           ! Bytes eingespart.
  131.   '
  132.   xdiv8&=x& DIV 8
  133.   a%=XBIOS(3)+xdiv8&*v_planes&              ! Die Zerlegung der Parameter
  134.   ADD a%,MUL(y&,v_lin_wr&)
  135.   SUB x&,MUL(xdiv8&,8)                      ! auf Variablen
  136.   c&=MUL(pixperline&,8)-w&                  ! bringt nochmal 740 Bytes
  137.   d&=-BTST(setprt%,2)
  138.   e&=-BTST(setprt%,4)
  139.   prtblk(a%,x&,w&,h&,c&,0,XBIOS(4),d&,&HFF8240,prttype&,e&,pmask%)
  140.   '
  141.   ' prtblk(XBIOS(3)+x& DIV 8+y&*v_lin_wr&/v_planes&,x& MOD 8,w&,h&,v_lin_wr&*8-w&,0,XBIOS(4),-1*(BTST(setprt%,2)),&HFF8240,prttype&,-1*(BTST(setprt%,4)),pmask%)
  142.   '     logbase   x,y in Bytes umrechnen   x-Rest  Breite
  143.   '                                                 Höhe
  144.   ' prttypes:               ! Druckertypen entsprechend OS-Tabelle
  145.   ' DATA 0,2,1,-1,3,-1,-1,-1
  146.   '
  147.   ' pmask:                  ! Graustufenmaske
  148.   ' DATA $0F,$0F,$0D,$06,$09,$06,$08,$06
  149.   ' DATA $08,$02,$08,$00,$08,$00,$08,$00
  150.   ' DATA $00,$00
  151.   '
  152.   ' Parameterbeschreibung:
  153.   ' ----------------------
  154.   ' blkprt%        logbase
  155.   '                + x-Koordinate in Bytes
  156.   '                + y-Koordinate mal Bytes pro Videozeile.
  157.   ' offset&        ist der nicht durch 8 teilbare Rest der x-Koordinate.
  158.   ' width&,height& ist wohl klar.
  159.   ' left&          v_lin_wr, die Anzahl Bytes pro Videozeile wird ermittelt
  160.   '                durch v_planes (bit je Pixel) geteilt und
  161.   '                mit 8 multipliziert (dieses umständliche Verfahren
  162.   '                ist notwendig um Overscan-kompatibel zu sein). left& ist
  163.   '                die Videozeilenbreite in Pixeln abzüglich width&.
  164.   ' right&         wird auf 0 gesetzt (dieser 2. Parameter ist scheinbar
  165.   '                ziemlich überflüssig?).
  166.   '                left&+width&+right& muß = Videozeilenbreite in Pixel sein.
  167.   ' scrres&        GETREZ-Rückgabewert (0,1 oder 2), entspricht sshiftmd.
  168.   ' dstres&        wird über Bit 2 von SETPRT ermittelt.
  169.   ' colpal%        über das Farbpalettenregister 0 ($FF8240).
  170.   ' type&          das Verfahren der XBIOS-Hardcopy-Routine wird nachempfunden.
  171.   ' port&          Bit 4 aus SETPRT.
  172.   ' masks%         0 würde grundsätzlich auch reichen, jedoch enthält das XBIOS
  173.   '                einen Fehler und gibt den rechten Rand nicht immer voll-
  174.   '                ständig aus. Deshalb verwendet man eine eigene Kopie der
  175.   '                masks-Tabelle (vgl. ST-Computer 4/90, S. 94ff).
  176.   '
  177. RETURN
  178. ' -----------------
  179. '
  180. PROCEDURE prtblk(blkprt%,offset&,width&,height&,left&,right&,scrres&,dstres&,colpal%,type&,port&,masks%)
  181.   ' Aufruf der entsprechenden XBIOS-Routine prtblk()
  182.   ' vgl. ST-Computer 4/90, S.95
  183.   REM Normale Hardcopy wäre z.B.:
  184.   REM prtblk(LPEEK(&H44E),0,640,400,0,0,PEEK(&H44C),1,&HFF8240,3,0,0)
  185.   '
  186.   ' LOCAL par% ! entfällt zum Speicherplatz sparen
  187.   INLINE par%,30
  188.   LONG{par%}=blkprt%        ! Startadresse = _v_bas_ad + x,y-Offset
  189.   WORD{par%+4}=offset&      ! 0 bis 7 Pixel links ausblenden
  190.   WORD{par%+6}=width&       ! Breite
  191.   WORD{par%+8}=height&      ! Höhe
  192.   WORD{par%+10}=left&       ! ???? linker Rand in Pixeln (geht nicht)
  193.   WORD{par%+12}=right&      ! ???? rechter Rand in Pixeln (dito)
  194.   '                         ! [width+left+right = Bildschirmbreite in Pixeln]
  195.   WORD{par%+14}=scrres&     ! _sshiftmod
  196.   WORD{par%+16}=dstres&     ! Druckerauflösung in Punkten
  197.   LONG{par%+18}=colpal%     ! Farbpalette (aus Videoregister)
  198.   WORD{par%+22}=type&       ! Druckertyp (z.B. Epson SW Matrix=3)
  199.   WORD{par%+24}=port&       ! 0=parallel  1=seriell
  200.   LONG{par%+26}=masks%      ! Graustufenmaske
  201.   '
  202.   SDPOKE &H4EE,1            ! _dmpflg setzen
  203.   ~XBIOS(36,L:par%)         ! PRTBLK
  204.   ' Der Rückgabewert ist meistens -65536, also $FFFF0000,
  205.   ' Läßt das auf einen unkorrekten Abbruch der Funktion schließen?
  206.   ' Ein Rückgabewert von -1 bedeutet fehlerhafte Parameter.
  207.   ' Ein Rückgabewert von 0 wird erzeugt, wenn der Ausschnitt als Breite
  208.   ' UND Höhe 0 hat. Nur Höhe=0 gibt -65536, nur Breite=0 gibt -1.
  209.   SDPOKE &H4EE,-1           ! scrdmp-flag rücksetzen
  210.   '
  211. RETURN
  212. '
  213.