home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 508.lha / IO_Expansion_Board / Test / PARtest.asm < prev   
Assembly Source File  |  1991-05-06  |  5KB  |  211 lines

  1. *****************************************************************************
  2. * Program:  PARtest.asm - Copyright ©1990 by Jeff Lavin
  3. * Function: A test program for the Rockwell 65C22.  This program takes a
  4. *           filespec as its only argument, and stuffs the file out parallel
  5. *           Port 2 (VIA #1, Port A) to a printer.  No devices are involved;
  6. *           this goes right to the hardware.  Also, in this version,
  7. *           interrupts are not used handshaking is accomplished by hardware
  8. *           polling.
  9. *
  10. * Author:   Jeff Lavin
  11. * History:  01/09/91 V0.50 Created
  12. *****************************************************************************
  13.  
  14. ;Set Tabs           |       |                 |       |
  15.  
  16.     ifnd    __m68
  17.     fail    'Wrong assembler!'
  18.     endc
  19.     exeobj
  20.     macfile 'Includes:IOexp.i' ;The One & Only include file
  21.     objfile    'PARtest'
  22.  
  23. ;This program as written stuffs a file out parallel Port 2 (VIA #1, Port A)
  24. ;to a printer.  The parallel interface should be arranged as follows:
  25. ;
  26. ;   Name    P3   Centronics
  27. ;   ====    ==   ==========
  28. ;   CA2.3    2   1  STROBE*
  29. ;   PA0.3    3   2  DATA0
  30. ;   PA1.3    4   3  DATA1
  31. ;   PA2.3    5   4  DATA2
  32. ;   PA3.3    6   5  DATA3
  33. ;   PA4.3    7   6  DATA4
  34. ;   PA5.3    8   7  DATA5
  35. ;   PA6.3    9   8  DATA6
  36. ;   PA7.3   10   9  DATA7
  37. ;   CA1.3    1  10  ACK*
  38. ;   GND    PAD  16  GND
  39.  
  40. Error    equr    d6
  41.  
  42. MyStack    clrfo
  43. DosBase    fo.l    1
  44. BufSiz    fo.l    1
  45. BufPtr    fo.l    1
  46. MS_SIZE    foval
  47.  
  48. *** Begin Mainline
  49.  
  50. PARtest    link.w    a5,#MS_SIZE
  51.     movem.l    d0/a0,-(sp)    ;Save cmd line
  52.     clr.l    (BufSiz,a5)
  53.     clr.l    (BufPtr,a5)
  54.     moveq    #RETURN_OK,Error
  55.  
  56.     lea    (DosName,pc),a1
  57.     movea.l    (SysBase).w,a6
  58.     SYS    OldOpenLibrary    ;Open dos.library
  59.     movea.l    d0,a6
  60.     move.l    d0,(DosBase,a5)
  61.     bne.b    .Parse
  62.     addq.w    #8,sp
  63.     rts
  64.  
  65. .Parse    movem.l    (sp)+,d0/a0    ;Get cmd line
  66.     lea    (a0,d0.w),a1
  67. ..    cmpi.b    #' ',-(a1)    ;Eat trailing garbage
  68.     dbhi    d0,..
  69.     blt.w    BadArgs    ;If no arguments, quit
  70.     clr.b    (1,a1)    ;Null terminate the string
  71.  
  72. ..    move.b    (a0)+,d0
  73.     beq.w    BadArgs    ;If no arguments, quit
  74.     cmpi.b    #' ',d0    ;Skip leading spaces
  75.     beq.b    ..
  76.     cmpi.b    #'?',d0    ;User wants help
  77.     beq.w    Instruct
  78.     subq.l    #1,a0    ;Adjust ptr
  79.     movea.l    a0,a2    ;Save cmd line
  80.  
  81.     move.l    a2,d1    ;FileName
  82.     move.l    #MODE_OLDFILE,d2    ;Access mode
  83.     SYS    Open    ;Open file
  84.     move.l    d0,d4    ;Save filehandle
  85.     bne.b    .GetSize
  86.     bra.w    OpenError
  87.  
  88. .GetSize    moveq    #OFFSET_END,d3    ;Mode
  89.     moveq    #0,d2    ;Position
  90.     move.l    d4,d1    ;FileHandle
  91.     SYS    Seek
  92.     tst.l    d0
  93.     bmi.b    .SeekErr
  94.  
  95.     moveq    #OFFSET_BEGINNING,d3 ;Mode
  96.     moveq    #0,d2    ;Position
  97.     move.l    d4,d1    ;FileHandle
  98.     SYS    Seek
  99.     move.l    d0,d3    ;Length of file
  100.     bpl.b    .GetBuffer
  101. .SeekErr    move.l    d4,d1    ;FileHandle
  102.     SYS    Close    ;Close file
  103.     bra.w    SeekError
  104.  
  105. .GetBuffer    moveq    #MEMF_PUBLIC,d1
  106.     move.l    d3,d0
  107.     move.l    a6,-(sp)
  108.     movea.l    (SysBase).w,a6
  109.     SYS    AllocMem    ;Allocate a read buffer
  110.     movea.l    (sp)+,a6
  111.     move.l    d0,(BufPtr,a5)
  112.     bne.b    .GotBuffer
  113.     move.l    d4,d1    ;FileHandle
  114.     SYS    Close    ;Close file
  115.     bra.w    MemError
  116.  
  117. .GotBuffer    movea.l    d0,a3    ;Buffer
  118.     move.l    d3,(BufSiz,a5)
  119.  
  120.     move.l    a3,d2    ;Buffer
  121.     move.l    d4,d1    ;FileHandle
  122.     SYS    Read
  123.     cmp.l    d3,d0    ;ActualLength
  124.     beq.b    .CloseFile
  125.     move.l    d4,d1    ;FileHandle
  126.     SYS    Close    ;Close file
  127.     bra.w    ReadError
  128.  
  129. .CloseFile    move.l    d4,d1    ;FileHandle
  130.     SYS    Close    ;Close file
  131.  
  132. * Initialize VIA registers
  133.  
  134.     lea    (VIA_Base+VIA1),a4    ;Get chip base
  135.     move.b    #%10000000,(INTER,a4)    ;Disable interrupts
  136.     move.b    #%00001000,(PERCR,a4)    ;CA2 = Handshake output
  137.                 ;CA1 = Negative edge input
  138.     clr.b    (ORA,a4)        ;Clear garbage
  139.     move.b    #%11111111,(DDRA,a4)    ;All outputs
  140.  
  141. * Stuff chars out Port A, as fast as the printer'll take 'em.
  142.  
  143. .StuffLoop    move.b    (a3)+,(ORA,a4)    ;Send char & data strobe
  144.     subq.l    #1,d3    ;Decrement count
  145.     beq.w    Cleanup    ;Zero is all done
  146. .WaitLoop    btst    #1,(INTFR,a4)    ;Test CA1 bit for not busy
  147.     beq.b    .WaitLoop    ;Wait 'til char is taken
  148.     bra.b    .StuffLoop    ;Do it again
  149.  
  150. BadArgs    lea    (BadArgs.msg,pc),a2
  151.     moveq    #RETURN_WARN,Error
  152.     bra.b    ErrorMsg
  153.  
  154. Instruct    lea    (Instruct.msg,pc),a2
  155.     bra.b    ErrorMsg
  156.  
  157. OpenError    lea    (OpenError.msg,pc),a2
  158.     moveq    #RETURN_FAIL,Error
  159.     bra.b    ErrorMsg
  160.  
  161. SeekError    lea    (SeekError.msg,pc),a2
  162.     moveq    #RETURN_FAIL,Error
  163.     bra.b    ErrorMsg
  164.  
  165. MemError    lea    (MemError.msg,pc),a2
  166.     moveq    #RETURN_FAIL,Error
  167.     bra.b    ErrorMsg
  168.  
  169. ReadError    lea    (ReadError.msg,pc),a2
  170.     moveq    #RETURN_FAIL,Error
  171.  
  172. ErrorMsg    movea.l    (DosBase,a5),a6
  173.     SYS    Output
  174.     move.l    d0,d1    ;FileHandle
  175.     beq.b    Cleanup
  176.     move.l    a2,d3
  177. ..    tst.b    (a2)+
  178.     bne.s    ..
  179.     exg    a2,d3
  180.     sub.l    a2,d3
  181.     subq.l    #1,d3    ;Length
  182.     move.l    a2,d2    ;Buffer
  183.     SYS    Write
  184.  
  185. Cleanup    movea.l    (SysBase).w,a6
  186.     move.l    (BufPtr,a5),d0
  187.     beq.b    .CloseDos
  188.     movea.l    d0,a1
  189.     move.l    (BufSiz,a5),d0
  190.     SYS    FreeMem
  191.  
  192. .CloseDos    move.l    (DosBase,a5),d0
  193.     beq.b    .Exit
  194.     movea.l    d0,a1
  195.     SYS    CloseLibrary
  196.  
  197. .Exit    unlk    a5
  198.     move.l    Error,d0
  199.     rts
  200.  
  201. DosName    cstr    'dos.library'
  202. BadArgs.msg    db    'Bad arguments:',10
  203. Instruct.msg    db    'Usage:',10
  204.     cstr    '1> PARtest <filespec>',10
  205. OpenError.msg    cstr    'Couldn''t open file',10
  206. SeekError.msg    cstr    'Seek error on file',10
  207. MemError.msg    cstr    'Couldn''t allocate buffer',10
  208. ReadError.msg    cstr    'Read error on file',10
  209.  
  210.     end
  211.