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

  1. *****************************************************************************
  2. * IOTest.asm - ©1990 by The Puzzle Factory
  3. *          Performs some simple tests on the I/O Expansion Board Hardware.
  4. *
  5. * History: 08/15/89 V0.50 Created by Jeff Lavin
  6. *          11/25/90 V0.51 Converted to new syntax, de-ARPed program.
  7. *          12/03/90 V0.52 Killed a small bug.
  8. *
  9. * [To all: Please don't forget to bump the revision numbers if you do *any*
  10. *          modifications at all.  -Jeff]
  11. *
  12. *   Usage: 1> IOTest <Test Number>
  13. *          Where <Test Number> is one of the following:
  14. *                1 = Read  VIA0      2 = Write VIA0
  15. *                3 = Read  VIA1      4 = Write VIA1
  16. *                5 = Read  ACIA0     6 = Write ACIA0
  17. *                7 = Read  ACIA1     8 = Write ACIA1
  18. *                9 = Term  ACIA1
  19. *
  20. *          Typing no arguments, or any non-decimal character will cause these
  21. *          instructions to be printed.
  22. *
  23. * There are no error messages if anything goes wrong.  Feel free to add them.
  24. * Do *not* use 'run' with test 9.  If you need another CLI, use NewCLI.
  25. *
  26. * None of these tests requires any drivers or other software to be used.
  27. * Tests 1-8 do either a read or write of the hardware and after checking for
  28. * a ^C, loop continuously.  These tests are mostly useful for checking if
  29. * chip select signals exist with a logic probe.
  30. *
  31. * Test 9 must be used with a terminal.  The executable is hardwired for 9600
  32. * baud and must be reassembled, or zapped, for other baud rates.  The test
  33. * works as follows:
  34. *
  35. *   1. ACIA0 is initialized for 9600 baud, 1 stop bit, 8 data bits, no parity
  36. *   2. The console is set to RAW mode to allow getting single chars without
  37. *      having to type returns.
  38. *   3. A character is read from the local console (the Amiga).  If the
  39. *      character is an ESC, go to step 9.
  40. *   4. The character is echoed back to the local console.
  41. *   5. The character is then echoed to the terminal.
  42. *   6. A character is read from the terminal.  This function does not block.
  43. *      You should type the character on the terminal *before* you type the
  44. *      character on the console in step 3.
  45. *   7. This character is then echoed to the local console.
  46. *   8. Loop back to step 3.
  47. *   9. Reset console to CON mode, and exit.
  48. *
  49. * Notes:
  50. * RAW modes does not support ^C.  Also, ^C might get eaten if you try running
  51. * this program from a debugger.
  52. *
  53. *****************************************************************************
  54.  
  55. ;Set Tabs           |       |                 |       |
  56.  
  57.     exeobj
  58.     objfile    'ram:IOTest'
  59.     macfile 'Includes:IOexp.i'    ;The One & Only include file
  60.  
  61. IOTest    movea.l    a0,a2
  62.     move.l    d0,d2    ;Save cmd line
  63.      lea    (DosName,pc),a1    ;Open DOS library
  64.     moveq    #0,d0
  65.     movea.l (SysBase).w,a6
  66.     SYS    OpenLibrary
  67.     movea.l d0,a6
  68.     tst.l    d0
  69.     bne.b    1$
  70.     rts
  71.  
  72. 1$    SYS    Input
  73.     move.l    d0,d5
  74.     beq.b    Cleanup
  75.  
  76.     SYS    Output
  77.     move.l    d0,d6    ;Output filehandle
  78.     beq.b    Cleanup
  79.  
  80.     movea.l    a2,a0    ;Get cmd line
  81.     lea    (0,a0,d2.w),a1
  82. 2$    cmpi.b    #' ',-(a1)    ;Eat trailing garbage
  83.     dbhi    d2,2$
  84.     blt.b    4$    ;If no arguments, quit
  85.     clr.b    (1,a1)    ;Null terminate the string
  86.  
  87.     moveq    #0,d0
  88. 3$    move.b    (a0)+,d0    ;Get a char
  89.     beq.b    4$    ;Nothing there
  90.     cmpi.b    #' ',d0    ;Skip leading spaces
  91.     bls.b    3$
  92.     subi.b    #'0',d0    ;Check values
  93.     bmi.b    4$
  94.     cmpi.b    #9,d0
  95.     bls.b    5$
  96. 4$    lea    (HelpMsg,pc),a0
  97.     bsr    Puts
  98.     bra.b    Cleanup
  99.  
  100. 5$    subq.w    #1,d0        ;0 to (n-1)
  101.     lsl.w    #1,d0        ;WORD index
  102.     move.w    d0,-(sp)
  103.     move.w    (TextTable,pc,d0.w),d0
  104.     lea    (Text1,pc),a0
  105.     lea    (a0,d0.w),a0
  106.     bsr    Puts        ;Write test name
  107.  
  108.     move.w    (sp)+,d0
  109.     move.w    (FuncTable,pc,d0.w),d0
  110.     jsr    (Test1,pc,d0.w)
  111.  
  112. Cleanup    movea.l    a6,a1
  113.     movea.l (SysBase).w,a6
  114.     SYS    CloseLibrary
  115.     moveq    #0,d0
  116.     rts
  117.  
  118. TextTable    dw    Text1-Text1
  119.     dw    Text2-Text1
  120.     dw    Text3-Text1
  121.     dw    Text4-Text1
  122.     dw    Text5-Text1
  123.     dw    Text6-Text1
  124.     dw    Text7-Text1
  125.     dw    Text8-Text1
  126.     dw    Text9-Text1
  127.  
  128. FuncTable    dw    Test1-Test1
  129.     dw    Test2-Test1
  130.     dw    Test3-Test1
  131.     dw    Test4-Test1
  132.     dw    Test5-Test1
  133.     dw    Test6-Test1
  134.     dw    Test7-Test1
  135.     dw    Test8-Test1
  136.     dw    Test9-Test1
  137.  
  138. Test1    lea    (VIA_Base+VIA0),a5
  139. 1$    move.b    (ORB,a5),d0    ;Read VIA0
  140.     bsr    CheckAbort
  141.     beq.b    1$
  142.     rts
  143.  
  144. Test2    lea    (VIA_Base+VIA0),a5
  145. 1$    moveq    #0,d0    ;Write VIA0
  146.     move.b    d0,(ORB,a5)
  147.     bsr    CheckAbort
  148.     beq.b    1$
  149.     rts
  150.  
  151. Test3    lea    (VIA_Base+VIA1),a5
  152. 1$    move.b    (ORB,a5),d0    ;Read VIA1
  153.     bsr    CheckAbort
  154.     beq.b    1$
  155.     rts
  156.  
  157. Test4    lea    (VIA_Base+VIA1),a5
  158. 1$    moveq    #0,d0    ;Write VIA1
  159.     move.b    d0,(ORB,a5)
  160.     bsr    CheckAbort
  161.     beq.b    1$
  162.     rts
  163.  
  164. Test5    lea    (ACIA_Base+ACIA0),a5
  165. 1$    move.b    (RDR,a5),d0    ;Read ACIA0
  166.     bsr    CheckAbort
  167.     beq.b    1$
  168.     rts
  169.  
  170. Test6    lea    (ACIA_Base+ACIA0),a5
  171. 1$    moveq    #0,d0    ;Write ACIA0
  172.     move.b    d0,(TDR,a5)
  173.     bsr    CheckAbort
  174.     beq.b    1$
  175.     rts
  176.  
  177. Test7    lea    (ACIA_Base+ACIA1),a5
  178. 1$    move.b    (RDR,a5),d0    ;Read ACIA1
  179.     bsr.b    CheckAbort
  180.     beq.b    1$
  181.     rts
  182.  
  183. Test8    lea    (ACIA_Base+ACIA1),a5
  184. 1$    moveq    #0,d0    ;Write ACIA1
  185.     move.b    d0,(TDR,a5)
  186.     bsr.b    CheckAbort
  187.     beq.b    1$
  188.     rts
  189.  
  190. Test9    lea    (ACIA_Base+ACIA0),a5
  191.     move.b    (ISR,a5),d0    ;Term ACIA0
  192.     move.b    (CSR,a5),d0    ;Clear garbage
  193.     move.b    (RDR,a5),d0    ;Clear RDRF bit
  194.     move.b    #Baud_9600,(CTR,a5) ;9600 baud, 1 stop bit, no echo
  195.     move.b    #FRF_FRMT!WORDLEN_8!PAR_MARK,d0
  196.     move.b    d0,(FMR,a5)    ;8 bits, mark par, no par, DTR hi
  197.  
  198. 1$    lea    (Buffer,pc),a2
  199.     bsr    SetRAWmode    ;So we can get single chars
  200.     tst.l    d0
  201.     beq.b    4$    ;Something failed
  202.  
  203. 2$    move.l    d5,d1    ;Filehandle
  204.     move.l    a2,d2    ;Buffer
  205.     moveq    #1,d3    ;Length
  206.     SYS    Read    ;Get a char from keybd
  207.     moveq    #-1,d1    ;Check for I/O error
  208.     cmp.l    d0,d1
  209.     beq.b    3$
  210.     move.b    (a2),d0
  211.     cmpi.b    #$1B,d0    ;Was an ESC typed?
  212.     beq.b    3$    ;Yes, quit
  213.  
  214.     move.l    d6,d1    ;Filehandle
  215.     SYS    Write    ;Echo char to local console
  216.     moveq    #-1,d1    ;Check for I/O error
  217.     cmp.l    d0,d1
  218.     beq.b    3$
  219.  
  220.     move.b    (a2),(TDR,a5)    ;Echo char to terminal
  221.     move.b    (RDR,a5),(a2)    ;Get a char from terminal
  222.     move.l    d6,d1    ;Filehandle
  223.     SYS    Write    ;Echo char to local console
  224.     moveq    #-1,d1    ;Check for I/O error
  225.     cmp.l    d0,d1
  226.     bne.b    2$
  227.  
  228. 3$    bsr    SetCONmode    ;Reset console
  229. 4$    rts
  230.  
  231. *************************************************************************
  232. * NAME:     CheckAbort()
  233. * FUNCTION: Check for a ^C, and echo if found.
  234. * INPUTS:   None.
  235. * RETURN:   D0 = 1 if ^C, else 0.
  236. * SCRATCH:  D0-D1/A0-A1
  237. *************************************************************************
  238.  
  239. CheckAbort    moveq    #0,d0
  240.     move.l    #SIGBREAKF_CTRL_C,d1
  241.     move.l    a6,-(sp)
  242.     movea.l    (SysBase).w,a6
  243.     SYS    SetSignal
  244.     movea.l    (sp)+,a6
  245.     andi.l    #SIGBREAKF_CTRL_C,d0
  246.     beq.b    1$
  247.     lea    (BrkMsg,pc),a0
  248.     bsr.b    Puts
  249.     moveq    #1,d0
  250. 1$    rts
  251.  
  252. *************************************************************************
  253. * NAME:     Puts()
  254. * FUNCTION: Writes a message to stdout.
  255. * INPUTS:   A0 = Ptr to message.
  256. * RETURN:   None
  257. * SCRATCH:  D0-D1/A0-A1
  258. *************************************************************************
  259.  
  260. Puts    movem.l    d2-d3,-(sp)
  261.     move.l    a0,d3
  262. 1$    tst.b    (a0)+
  263.     bne.s    1$
  264.     exg    a0,d3
  265.     sub.l    a0,d3
  266.     subq.l    #1,d3    ;Length
  267.     move.l    a0,d2    ;Buffer
  268.     move.l    d6,d1    ;FileHandle
  269.     SYS    Write
  270.     movem.l    (sp)+,d2-d3
  271.     rts
  272.  
  273. SetRAWmode    moveq    #DOSTRUE,d0
  274.     bra.b    SendPacket
  275.  
  276. SetCONmode    moveq    #DOSFALSE,d0
  277.  
  278. SendPacket    movem.l    d2-d3/a2-a3/a6,-(sp)
  279.     move.l    d0,d2
  280.     moveq    #0,d3    ;Default return value
  281.     movea.l    (SysBase).w,a6
  282.     bsr    CreatePort
  283.     movea.l    D0,A3
  284.     tst.l    D0
  285.     beq.b    3$
  286.  
  287.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  288.     moveq    #sp_SIZEOF,d0
  289.     SYS    AllocMem
  290.     movea.l    D0,A2
  291.     tst.l    D0
  292.     beq.b    2$
  293.  
  294.     movea.l    a2,a1    ;Message
  295.     movea.l    a2,a0
  296.     adda.l    #sp_Pkt,A0
  297.     move.l    A0,(LN_NAME,A1)
  298.     move.l    A2,(sp_Pkt,A1)
  299.     move.l    A3,(dp_Port,A0)
  300.     move.l    #ACTION_SCREEN_MODE,(dp_Type,A0)
  301.     move.l    d2,(dp_Arg1,A0)
  302.     movea.l    (ThisTask,a6),a0
  303.     cmpi.b    #NT_PROCESS,(LN_TYPE,A0)
  304.     bne.b    1$
  305.     move.l    (pr_ConsoleTask,A0),d0
  306.     beq.b    1$
  307.     movea.l    d0,a0    ;Port
  308.     SYS    PutMsg
  309.  
  310.     movea.l    a3,a0
  311.     SYS    WaitPort
  312.  
  313.     movea.l    a3,a0
  314.     SYS    GetMsg
  315.     move.l    (sp_Pkt+dp_Res1,A2),d3
  316.  
  317. 1$    movea.l    a2,a1
  318.     moveq    #sp_SIZEOF,d0
  319.     SYS    FreeMem
  320.  
  321. 2$    movea.l    a3,a0
  322.     bsr    DeletePort
  323.     move.l    d3,D0
  324. 3$    movem.l    (sp)+,d2-d3/a2-a3/a6
  325.     rts
  326.  
  327. CreatePort    movem.l    d2/a2/a6,-(sp)
  328.     moveq    #-1,d0
  329.     SYS    AllocSignal
  330.     move.l    d0,d2
  331.     cmpi.l    #-1,d0
  332.     beq.b    2$
  333.  
  334.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  335.     moveq    #MP_SIZE,d0
  336.     SYS    AllocMem
  337.     movea.l    d0,a2
  338.     tst.l    d0
  339.     bne.b    1$
  340.     move.l    d2,d0
  341.     SYS    FreeSignal
  342.     bra.b    2$
  343.  
  344. 1$    move.b    #NT_MSGPORT,(LN_TYPE,a2)
  345.     move.b    d2,(MP_SIGBIT,a2)
  346.     move.l    (ThisTask,a6),(MP_SIGTASK,a2)
  347.  
  348.     lea    (MP_MSGLIST,a2),a0    ;NEWLIST
  349.     move.l    a0,(a0)
  350.     addq.l    #LH_TAIL,(a0)
  351.     clr.l    (LH_TAIL,a0)
  352.     move.l    a0,(LH_TAIL+LN_PRED,a0)
  353.     move.l    a2,d0
  354.     bra.b    3$
  355.  
  356. 2$    moveq    #0,d0
  357. 3$    movem.l    (sp)+,d2/a2/a6
  358.     rts
  359.  
  360. DeletePort    movem.l    a2/a6,-(sp)
  361.     movea.l    a0,a2
  362.     move.b    #-1,(LN_TYPE,a2)
  363.     move.l    #-1,(MP_MSGLIST,a2)
  364.     moveq    #0,d0
  365.     move.b    (MP_SIGBIT,a2),d0
  366.     SYS    FreeSignal
  367.  
  368.     moveq    #MP_SIZE,d0
  369.     movea.l    a2,a1
  370.     SYS    FreeMem
  371.     movem.l    (sp)+,a2/a6
  372.     rts
  373.  
  374. DosName    cstr    'dos.library'
  375.  
  376. BrkMsg    cstr    '**** Break',10
  377.  
  378. HelpMsg    db    10
  379.     db    'Usage:',10
  380.     db    '1> <Test Number>',10
  381.     db    '    1 = Read  VIA0',10
  382.     db    '    2 = Write VIA0',10
  383.     db    '    3 = Read  VIA1',10
  384.     db    '    4 = Write VIA1',10
  385.     db    '    5 = Read  ACIA0',10
  386.     db    '    6 = Write ACIA0',10
  387.     db    '    7 = Read  ACIA1',10
  388.     db    '    8 = Write ACIA1',10
  389.     db    '    9 = Term  ACIA1',10,0
  390.  
  391. Text1    cstr    'Test1: Read VIA0',10
  392. Text2    cstr    'Test2: Write VIA0',10
  393. Text3    cstr    'Test3: Read VIA1',10
  394. Text4    cstr    'Test4: Write VIA1',10
  395. Text5    cstr    'Test5: Read ACIA0',10
  396. Text6    cstr    'Test6: Write ACIA0',10
  397. Text7    cstr    'Test7: Read ACIA1',10
  398. Text8    cstr    'Test8: Write ACIA1',10
  399. Text9    cstr    'Test9: Term  ACIA0',10
  400.  
  401. Buffer    dx.b    80
  402.  
  403.     end
  404.