home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0657.ZIP / CCE_0657.PD / ASSLASER.S < prev    next >
Text File  |  1993-09-01  |  12KB  |  322 lines

  1. * Projekt: laser.s
  2. * modified by Thomas Klingelhöfer
  3. * improved by Markus Fritze
  4. * last change: 20.05.1989
  5. * Source is for the OMIKRON.Assembler
  6. * An DVI_100 und Turbo C angepaßt von markus pristovsek am 16.7.93 *
  7.  
  8. * Die Beispielroutine laser() gibt eine Grafikseite auf dem
  9. * Atari SLM 804 aus
  10. * der Lasercontroller wird automatisch gesucht !!!
  11. * Eingabe: Zeiger auf Bitmap
  12. * Bitmap hat 3386 Zeilen, jede Zeile ist genau 292 Bytes breit
  13. * also 2336 Pixel
  14.  
  15. * Definitions
  16. dmadata        EQU $FFFF8604.W
  17. dmahigh        EQU $FFFF8609.W
  18. dmamid         EQU $FFFF860B.W
  19. dmalow         EQU $FFFF860D.W
  20. gpip           EQU $FFFFFA01.W
  21. flock          EQU $043E.W
  22. _hz_200        EQU $04BA.W
  23.  
  24. EXPORT    print_laser, check_laser, kop2_1
  25.  
  26.                 TEXT
  27. ; **** Für DVI_100 hinzugefügt 16.7.93 ****
  28. ; ******* Vergrößert eine Zeile auf 2:1
  29. ; ******* Aufruf:  kop2_1( start, startbreite, ziel )
  30. kop2_1:    MOVE.L    A2,    -(A7)
  31.     LEA    tab_21,    A2
  32.     SUBQ    #1,    D0
  33.     MOVEQ    #0,    D1
  34.     MOVEQ    #0,    D2
  35. kl2_11:    MOVE.B    (A0)+,    D1    ; Nur auf Speicherspar
  36.     BEQ    kl2_12
  37.     MOVE.B    D1,    D2    ; nicht auf Tempo, da
  38.     ANDI.B    #$0F,    D1    ; nur für Lupe nötig
  39.     LSR.B    #4,    D2
  40.     MOVE.B    0(A2,D2),(A1)+
  41.     MOVE.B    0(A2,D1),(A1)+
  42.     DBRA    D0,    kl2_11
  43.     MOVE.L    (A7)+,    A2
  44.     RTS
  45.  
  46. kl2_12:
  47.     CLR.W    (A1)+
  48.     DBRA    D0,    kl2_11
  49.     MOVE.L    (A7)+,    A2
  50.     RTS
  51.  
  52.  
  53. print_laser:    move.l  A0,D0
  54.                 movem.l D2-D7/A2-A6,-(SP)
  55.                 movea.l D0,A4           * save pointer
  56.                 pea     ikaus           * Keyboard off
  57.                 move.l  #$190000,-(SP)
  58.                 trap    #14
  59.                 addq.l  #8,SP
  60.                 clr.l   -(SP)
  61.                 move.w  #$20,-(SP)      * supervisor mode on
  62.                 trap    #1
  63.                 addq.l  #6,SP
  64.                 movea.l D0,A5
  65.                 bsr.s   print           * do the work...
  66.                 move.l  D0,D7
  67.                 move.l  A5,-(SP)
  68.                 move.w  #$20,-(SP)      * back to user mode
  69.                 trap    #1
  70.                 addq.l  #6,SP
  71.                 pea     ikein           * Keyboard on
  72.                 move.l  #$190000,-(SP)
  73.                 trap    #14
  74.                 addq.l  #8,SP
  75.                 move.l  D7,D0
  76. laser2:         movem.l (SP)+,D2-D7/A2-A6
  77.                 rts
  78.  
  79. * Druckroutine print
  80. * Eingabe: Zeiger auf Bitmap in A4
  81. * verwendete Register: d0,d1,d2,d3,d4,d7,a0,a1
  82.  
  83. print:          lea     dmadata.w,A0
  84.                 lea     dmahigh.w,A1
  85.                 st      flock.w         * lock dma channel
  86. *
  87. * Command Phase
  88. *                move.w  #$88,2(A0)      * assert command signal
  89.                 move.w  controller,D0
  90.                 lsl.w   #5,D0
  91.                 or.w    #$0A,D0         * PRINT
  92.                 bsr     writcmnd        * command byte 0
  93.                 bne     prabrt
  94.                 moveq   #3,D2
  95. send_loop:      moveq   #0,D0           * command byte 1-4
  96.                 bsr     writcmnd
  97.                 bne     prabrt
  98.                 dbra    D2,send_loop
  99.                 and.b   #$F7,D0         * command byte 5 (Bit 3 cleared)
  100.                 move.l  D0,(A0)
  101.                 moveq   #4,D1
  102.                 add.l   _hz_200.w,D1
  103. codel:          cmp.l   _hz_200.w,D1    * wait a moment
  104.                 bge.s   codel
  105. *
  106. * Data out phase
  107. *
  108.                 move.w  #$98,2(A0)      * reset fifo
  109.                 move.w  #$0198,2(A0)
  110.                 move.w  #$98,2(A0)
  111.                 move.w  #1,(A0)
  112.                 move.w  #$88,2(A0)
  113.                 move.l  A4,D0           * load initial band base
  114.                 move.l  D0,-(SP)
  115.                 move.b  3(SP),dmalow.w  * initialize dma base address
  116.                 move.b  2(SP),dmamid.w
  117.                 move.b  1(SP),dmahigh.w
  118.                 addq.l  #4,SP
  119.                 move.w  #$0192,2(A0)
  120.                 move.l  #$730112,(A0)   * write sector count, start dma
  121.                 clr.b   D3              * clear two-byte fifo adjust flag
  122.                 moveq   #16,D7          * do 15 more bands
  123.                 moveq   #32,D4          * for SUB.L #32,D0
  124.                 move    SR,D1           * save status register
  125.                 ori     #$0700,SR       * no interrupts, please
  126. bdloop:         add.l   #200*292+32,D0  * get final adress + 32
  127.                 tst.w   D7              * last band?
  128.                 bne.s   bdwait          * No =>
  129.                 sub.l   #14*292,D0      * 186 lines instead of 200 lines
  130. bdwait:         btst    #5,gpip.w       * check for premature status phase
  131.                 beq.s   forget          * abort and get status byte
  132.                 movep.w 2(A1),D2        * get current dma mid and low
  133.                 cmp.w   D2,D0           * compare to final adress
  134.                 bne.s   bdwait          * not there yet ?
  135.                 sub.l   D4,D0           * point to next band base
  136.                 tas.b   D3              * test two_byte fifo adjust flag
  137.                 bne.s   noadju          * do not adjust next base
  138.                 addq.l  #2,D0           * compensate for two-byte fifo
  139. noadju:         move.l  D0,-(SP)
  140.                 move.b  3(SP),dmalow.w  * reinitialize dma base address
  141.                 move.b  2(SP),dmamid.w
  142.                 move.b  1(SP),dmahigh.w
  143.                 addq.l  #4,SP
  144.                 move.w  #$92,2(A0)      * reset fifo
  145.                 move.w  #$0192,2(A0)    * select sector count register
  146.                 move.l  #$730112,(A0)   * reload sector count register
  147.                 dbra    D7,bdloop       * more bands
  148.                 move    D1,SR           * restore status register
  149. *
  150. * status phase
  151. *
  152. stwait:         btst    #5,gpip.w       * wait for status byte
  153.                 bne.s   stwait
  154. stbyte:         move.w  #$8A,2(A0)      * select status register
  155.                 move.w  (A0),D0         * read status byte
  156.                 moveq   #2,D1           * ca. 5 millisec delay
  157.                 add.l   _hz_200.w,D1    * nb minimum delay is 20 microsec
  158. stdel:          cmp.l   _hz_200.w,D1
  159.                 bge.s   stdel
  160.                 clr.l   D0
  161.                 bra.s   prexit          * return status byte
  162. prabrt:         moveq   #-1,D0          * return error flag
  163. prexit:         sf      flock.w         * unlock dma channel
  164.                 rts
  165. forget:         move    D1,SR
  166.                 bra.s   stbyte
  167.  
  168. *
  169. * writcmnd
  170. * write command byte to DMA controller
  171. *
  172. * inputs:       d0.l = data control words
  173. *                       a0       = pointer to DMA controller (ff8604)
  174. * outputs:      EQ   = successfull command write
  175. *                       NE       = Error occured
  176. * modified: d1
  177. *
  178. writcmnd:       swap    D0
  179.                 move.w  #$8A,D0
  180.                 move.l  D0,(A0)
  181.                 moveq   #2,D1           * ca. 5 millisec delay
  182.                 add.l   _hz_200.w,D1    * nb minimum delay is 20 microsec
  183. wrdel:          cmp.l   _hz_200.w,D1
  184.                 bge.s   wrdel
  185.                 moveq   #40,D1          * 200 millisec timeout
  186.                 add.l   _hz_200.w,D1
  187. writlp:         btst    #5,gpip.w
  188.                 beq.s   writok          * command byte acknowledged
  189.                 cmp.l   _hz_200.w,D1
  190.                 bge.s   writlp
  191.                 moveq   #-1,D1          * timeout - set error flag
  192. writok:         rts
  193.  
  194. ;inquiry(Device=D7)
  195. inquiry_slm804: movem.l D1-A6,-(SP)
  196.                 st      $043E.w
  197.                 moveq   #0,D5
  198.                 lsl.b   #5,D7
  199.                 or.b    #$12,D7         ;Inquiry-Opcode
  200.                 pea     prn_name_buffer
  201.                 move.b  3(SP),$FFFF860D.w
  202.                 move.b  2(SP),$FFFF860B.w
  203.                 move.b  1(SP),$FFFF8609.w
  204.                 addq.l  #4,SP
  205.                 bsr.s   do_cmd
  206.                 beq.s   inquiry_slm8041
  207.                 or.b    #$80,D5
  208.                 bsr.s   do_cmd
  209.                 bra.s   inquiry_slm8042
  210. inquiry_slm8041:moveq   #0,D0
  211. inquiry_slm8042:sf      $043E.w
  212.                 movem.l (SP)+,D1-A6
  213.                 rts
  214.  
  215. do_cmd:         lea     $FFFF8604.w,A0
  216.                 move.w  #$98,2(A0)
  217.                 move.w  #$0198,2(A0)
  218.                 move.w  #$98,2(A0)
  219.                 move.w  #1,(A0)
  220.                 move.w  #$88,2(A0)
  221.                 move.w  D7,D0
  222.                 bsr     writcmnd        ;Befehlscode & Controller Number senden
  223.                 bne.s   do_cmd_error
  224.                 moveq   #3,D3
  225. do_cmd1:        moveq   #0,D0           ;4 Füllbytes senden (Device=0)
  226.                 bsr     writcmnd
  227.                 bne.s   do_cmd_error
  228.                 dbra    D3,do_cmd1
  229.                 move.w  D5,D0           ;Im zweiten Druchlauf $80
  230.                 bsr.s   send_byte
  231.                 bsr.s   get_status
  232.                 move.b  D0,D3
  233.                 bne.s   do_cmd_error
  234.                 tst.b   D5
  235.                 bpl.s   do_cmd_error
  236.  
  237.                 moveq   #4,D2           ;5 Bytes holen
  238.                 moveq   #0,D0
  239. do_cmd2:        bsr.s   get_status      ;Byte holen
  240.                 bne.s   do_cmd_error    ;Fehler, raus
  241.                 dbra    D2,do_cmd2      ;schon alle Bytes?
  242.                 moveq   #0,D2
  243.                 move.b  D0,D2           ;das letzte Byte war die Stringlänge
  244.                 bra.s   do_cmd5
  245. do_cmd4:        bsr.s   get_status      ;Byte holen
  246.                 bne.s   do_cmd_error    ;Fehler, raus
  247.                 move.b  D0,(A1)+        ;String merken
  248. do_cmd5:        dbra    D2,do_cmd4      ;schon alle Bytes?
  249.  
  250.                 moveq   #0,D0
  251.                 move.b  D3,D0           ;alten Status zurückholen
  252. do_cmd_error:   rts
  253.  
  254. get_status:     moveq   #80,D1
  255.                 add.l   $04BA.w,D1
  256. send_cmd2:      btst    #5,$FFFFFA01.w
  257.                 beq.s   send_cmd3
  258.                 cmp.l   $04BA.w,D1
  259.                 bge.s   send_cmd2
  260.                 moveq   #-1,D0
  261. send_cmd3:      bne.s   do_command_err
  262.                 move.w  #$8A,2(A0)
  263.                 move.w  (A0),D0
  264.                 bsr.s   pause
  265.                 moveq   #0,D1
  266. do_command_err: rts
  267.  
  268. send_byte:      swap    D0
  269.                 move.w  #$8A,D0
  270.                 move.l  D0,(A0)
  271. pause:          move.l  D1,-(SP)
  272.                 moveq   #2,D1           * ca. 5 millisec delay
  273.                 add.l   _hz_200.w,D1    * nb minimum delay is 20 microsec
  274. send_byte1:     cmp.l   _hz_200.w,D1
  275.                 bge.s   send_byte1
  276.                 move.l  (SP)+,D1
  277.                 rts
  278.  
  279. check_laser:    movem.l D1-A6,-(SP)
  280.                 clr.l   -(SP)
  281.                 move.w  #$20,-(SP)
  282.                 trap    #1              ;Super(0L)
  283.                 addq.l  #6,SP
  284.                 move.l  D0,-(SP)
  285.                 moveq   #7,D7           ;Mit Device 7 anfangen
  286. check_laser1:   lea     prn_name_buffer,A1
  287.                 bsr     inquiry_slm804
  288.                 tst.w   D0
  289.                 bne.s   check_laser3
  290.                 lea     slm_name,A0
  291. check_laser2:   move.b  (A0)+,D0
  292.                 beq.s   check_laser4
  293.                 cmp.b   (A1)+,D0
  294.                 beq.s   check_laser2
  295. check_laser3:   dbra    D7,check_laser1
  296.                 moveq   #-1,D7
  297. check_laser4:   move.w  D7,controller
  298.                 move.w  #$20,-(SP)
  299.                 trap    #1              ;Super(OldStack)
  300.                 addq.l  #6,SP
  301.                 tst.l   D7
  302.                 smi     D0
  303.                 addq.b  #1,D0
  304.                 ext.w   D0              ;0=Fehler, 1=Ok
  305.                 movem.l (SP)+,D1-A6
  306.                 rts
  307.  
  308.  
  309.                 DATA
  310. ; *** Kopiertabelle 2:1 ***
  311. tab_21:         DC.B    $00, $03, $0C, $0F, $30, $33, $3C, $3F
  312.                 DC.B    $C0, $C3, $CC, $CF, $F0, $F3, $FC, $FF
  313.  
  314. ikaus:          DC.B $13        ;IKBD aus
  315. ikein:          DC.B $11        ;IKBD an
  316. controller:     DC.W -1         ;Devicenummer 0-7 (-1: Fehler)
  317. slm_name:       DC.B 'PAGE PRINTER',0
  318.  
  319.                 BSS
  320. prn_name_buffer:DS.B 128
  321.                 END
  322.