home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 515.lha / NewSer / ioexp.i next >
Text File  |  1991-06-08  |  14KB  |  492 lines

  1. *****************************************************************************
  2. * Program:  newser.i - ©1990 by The Puzzle Factory
  3. * Function: The One & Only master include file for the I/O Expansion board.
  4. *
  5. * Author:   Jeff Lavin
  6. * History:  08/23/90 JL V0.50 Created
  7. *           11/25/90 JL V0.51 Started to add parallel stuff
  8. *           12/10/90 JL V0.51 Added some more parallel stuff
  9. *           01/13/91 JL V0.52 Changed PUTDEBUG macro slightly
  10. *
  11. * [To all: Please don't forget to bump the revision numbers if you do *any*
  12. *          modifications at all.  -Jeff]
  13. *
  14. *****************************************************************************
  15. *
  16. * Some of the following is:
  17. *
  18. *****************************************************************************
  19. *
  20. * Copyright (C) 1985, Commodore Amiga Inc.  All rights reserved.
  21. * Permission granted for non-commercial use
  22. *
  23. * asmsupp.i -- random low level assembly support routines
  24. *              used by the Commodore sample Library & Device
  25. *
  26. *****************************************************************************
  27.  
  28. ;Set Tabs           |       |                 |       |
  29.  
  30.  
  31. PUTDEBUG     macro        ;[level,msg]
  32.     ifgt    INFO_LEVEL-\1
  33.     pea    subSysName
  34.     movem.l a0/a1/d0/d1,-(sp)
  35.     lea    .msg\@,a0    ;Point to static format string
  36.     lea    4*4(sp),a1    ;Point to args
  37.     bsr    KPutFmt
  38.     movem.l (sp)+,d0/d1/a0/a1
  39.     addq.w    #4,sp
  40.     bra.b    .end\@
  41.  
  42. .msg\@    dc.b    '%s/',\2,10
  43.     even
  44. .end\@
  45.     endc
  46.     endm
  47.  
  48. ISDEBUG    macro
  49.     ifne    INFO_LEVEL    ;If any debugging enabled at all
  50. KPutFmt
  51.     move.l    a2,-(sp)
  52.     lea    KPutChar,a2
  53.     bsr.b    KDoFmt
  54.     movea.l    (sp)+,a2
  55.     rts
  56.  
  57. KDoFmt    
  58.         move.l    a6,-(sp)
  59.     movea.l    (SysBase).w,a6
  60.     mySYS    RawDoFmt
  61.     movea.l    (sp)+,a6
  62.     rts
  63.     
  64. KPutChar
  65.     move.l    a6,-(sp)
  66.     movea.l    (SysBase).w,a6
  67.     mySYS    RawPutChar
  68.     movea.l    (sp)+,a6
  69.     rts
  70.  
  71. subSysName    dc.b    \1    ;This name for debugging use
  72.     even
  73.     endc
  74.     endm
  75.  
  76.  
  77. *****************************************************************************
  78. *
  79. * Here are the includes for the serial portion of the I/O Expansion Board.
  80. * Everything from here to the end of the file is:
  81. *
  82. *      Copyright (C) 1990 by Jeff Lavin  --  All rights reserved.
  83. *      Permission granted for non-commercial use.
  84. *
  85. *****************************************************************************
  86.  
  87. *** MACROS ***
  88.  
  89.     ifnd    SYS
  90. mySYS    macro
  91.     jsr    _LVO\1(a6)
  92.     endm
  93.     endc
  94.  
  95. myEXEC    macro
  96.     move.l    a1,-(sp)
  97.     move.l    a6,-(sp)
  98.     movea.l    (SysBase).w,a6
  99.     jsr    _LVO\1(a6)
  100.     movea.l    (sp)+,a6
  101.     movea.l    (sp)+,a1
  102.     endm
  103.  
  104. myDisable    macro
  105.     ifc    '\1',''
  106.     move.w    #INTF_INTEN,(_intena).l
  107.     move.l    a6,-(sp)
  108.     movea.l    (SysBase).w,a6
  109.     addq.b    #1,IDNestCnt(a6)
  110.     movea.l    (sp)+,a6
  111.     endc
  112.     ifnc    '\1',''
  113.     movea.l    (SysBase).w,\1
  114.     move.w    #INTF_INTEN,(_intena).l
  115.     addq.b    #1,IDNestCnt(\1)
  116.     endc
  117.     endm
  118.  
  119.  
  120. myEnable    macro
  121.     ifc    '\1',''
  122.     move.l    a6,-(sp)
  123.     movea.l    (SysBase).w,a6
  124.     subq.b    #1,IDNestCnt(a6)
  125.     movea.l    (sp)+,a6
  126.     bge.s    .Enable\@
  127.     move.w    #INTF_SETCLR!INTF_INTEN,(_intena).l
  128. .Enable\@
  129.     endc
  130.     ifnc    '\1',''
  131.     movea.l    (SysBase).w,\1
  132.     subq.b    #1,IDNestCnt(\1)
  133.     bge.s    .Enable\@
  134.     move.w    #INTF_SETCLR!INTF_INTEN,(_intena).l
  135. .Enable\@
  136.     endc
  137.     endm
  138.  
  139. myForbid    macro
  140.     move.l    a6,-(sp)
  141.     movea.l    (SysBase).w,a6
  142.     addq.b    #1,TDNestCnt(a6)
  143.     movea.l    (sp)+,a6
  144.     endm
  145.  
  146. myPermit    macro
  147.     movem.l    d0/d1/a0/a1/a6,-(sp)
  148.     movea.l    (SysBase).w,a6
  149.     mySYS    Permit
  150.     movem.l    (sp)+,d0/d1/a0/a1/a6
  151.     endm
  152.  
  153. PREFFILE macro
  154.     dc.b    'S:Serial-Preferences',0
  155.     even
  156.     endm
  157.  
  158.  
  159. MYUNITNAME1 macro
  160.     dc.b    'SER1:',0
  161.     even
  162.     endm
  163.  
  164. MYUNITNAME2 macro
  165.     dc.b    'SER2:',0
  166.     even
  167.     endm
  168.  
  169. MYUNITNAME3 macro
  170.     dc.b    'SER3:',0
  171.     even
  172.     endm
  173.  
  174. MYUNITNAME4 macro
  175.     dc.b    'SER4:',0
  176.     even
  177.     endm
  178.  
  179. PARDEVNAME macro
  180.         dc.b    'eightbit.device',0
  181.         even
  182.     endm
  183.  
  184.  
  185. PARIDENT macro
  186.     dc.b    'eightbit alpha test version 1.0 (10 Dec 1990)',13,10,0
  187.     even
  188.     endm
  189.  
  190. PARUNITNAME1 macro
  191.     dc.b    'PAR1:',0
  192.     even
  193.     endm
  194.  
  195. PARUNITNAME2 macro
  196.     dc.b    'PAR2:',0
  197.     even
  198.     endm
  199.  
  200. PARUNITNAME3 macro
  201.     dc.b    'PAR3:',0
  202.     even
  203.     endm
  204.  
  205. PARUNITNAME4 macro
  206.     dc.b    'PAR4:',0
  207.     even
  208.     endm
  209.  
  210. *** EQUATES ***
  211.  
  212.     ifnd    SysBase
  213. SysBase    equ    4
  214.     endc
  215.  
  216. MYPROCSTACKSIZE    equ    $900        ;Stack size for the task we will create
  217.  
  218. MYDEV_END    equ    CMD_NONSTD+7    ;Number of device comands
  219.  
  220. MD_NUMUNITS    equ    4           ;Maximum number of units in this device
  221.  
  222. *** New SerialPrefs Structure ***
  223.  
  224. ;UnitPrefs
  225.  STRUCTURE    up,0
  226.     UWORD       up_BufSize    ;0 to 7
  227.     UWORD       up_BaudRate    ;0 to 15
  228.     UBYTE       up_WordLen    ;0=5, 1=6, 2=7, 3=8
  229.     UBYTE       up_StopBits    ;0=1, 1=2
  230.     UBYTE       up_Parity    ;0=Odd, 1=Even, 2=Mark, 3=Space, 4=None
  231.     UBYTE       up_Shake    ;0=RTS/CTS, 1=xON/xOFF
  232.     LABEL       up_SIZE
  233.  
  234. ;SerialPrefs
  235.  STRUCTURE    sp,0
  236.    STRUCT       sp_Unit01,up_SIZE    ;For ACIA 0, Unit 1
  237.    STRUCT       sp_Unit02,up_SIZE    ;For ACIA 0, Unit 2
  238.    STRUCT       sp_Unit11,up_SIZE    ;For ACIA 1, Unit 1
  239.    STRUCT       sp_Unit12,up_SIZE    ;For ACIA 1, Unit 2
  240.     LABEL       sp_SIZE
  241.  
  242. ;serprefs
  243.  STRUCTURE    prefs,0
  244.     ULONG       prefs_CTLCHAR    ;Control char's (order = xON,xOFF,rsvd,rsvd)
  245.     ULONG       prefs_RBUFLEN    ;Length in bytes of serial port's read buffer
  246.     ULONG       prefs_EXTFLAGS    ;Additional serial flags
  247.     ULONG       prefs_BAUD    ;Baud rate requested (true baud)
  248.     ULONG       prefs_BRKTIME    ;Duration of break signal in MICROseconds
  249.    STRUCT       prefs_TERMARRAY,TERMARRAY_SIZE    ;Termination character array
  250.     UBYTE       prefs_READLEN    ;Bits per read char (bit count)
  251.     UBYTE       prefs_WRITELEN    ;Bits per write char (bit count)
  252.     UBYTE       prefs_STOPBITS    ;Stopbits for read (count)
  253.     UBYTE       prefs_SERFLAGS    ;See SERFLAGS bit definitions
  254.     LABEL       prefs_SIZE
  255.  
  256. ;MyDev    
  257.  STRUCTURE    md,LIB_SIZE
  258.     UBYTE       md_Flags
  259.     UBYTE       md_Pad1
  260.     ULONG       md_SysLib
  261.     ULONG       md_SegList
  262.    STRUCT       md_Units,MD_NUMUNITS*4
  263.    STRUCT       prefs_unit0,prefs_SIZE    ;The reason why prefs are in this
  264.    STRUCT       prefs_unit1,prefs_SIZE    ;structure instead of the unit structure
  265.    STRUCT       prefs_unit2,prefs_SIZE    ;is that the pref settings should be saved
  266.    STRUCT       prefs_unit3,prefs_SIZE    ;across CloseDevice calls (which usually
  267.     LABEL       md_SIZE                ;causes the unit to be dumped).
  268.  
  269. ;MyDevUnit
  270.  STRUCTURE    mdu,UNIT_SIZE                    ;Odd # longwords
  271.    STRUCT       mdu_wport,MP_SIZE           ;MsgPort for write task
  272.     UBYTE       MDU_FLAGS
  273.     UBYTE       IERstate                    ;Current state of IER used as a mask
  274.     UBYTE       mdu_UnitNum
  275.     UBYTE       frstate                      ;This var mirrors a write-only register
  276.     ULONG       mdu_SysLib                   ;Copy of location 4
  277.     ULONG       mdu_Device                  ;Ptr to main device struct
  278.    STRUCT       mdu_rstack,MYPROCSTACKSIZE    ;For read task
  279.    STRUCT       mdu_wstack,MYPROCSTACKSIZE    ;For write task
  280.    STRUCT       mdu_rtcb,TC_SIZE            ;Task Control Block (TCB) for read task
  281.    STRUCT       mdu_wtcb,TC_SIZE            ;Task Control Block (TCB) for write task
  282.    STRUCT       mdu_is,IS_SIZE                    ;Interrupt structure
  283.    STRUCT       timerport,MP_SIZE
  284.    STRUCT       timeriorequest,IOTV_SIZE
  285.    STRUCT       AltBuf,64                   ;64-byte alternate buffer
  286.     ULONG       readsig                     ;Read task signals
  287.     ULONG       readabortsig
  288.     ULONG       tdresig                     ;Transmit buffer empty - put another byte
  289.     ULONG       dsrsig                      ;Transition on DSR - used for handshaking (if enabled)
  290.     ULONG       writeabortsig
  291.     ULONG       xonsig                      ;Comes from read task, and indicates xon received
  292.     ULONG       breaksig                    ;This is an Exec exception signal
  293.     ULONG       head                        ;Ptr to start of circular buffer (logical)
  294.     ULONG       tail                         ;Ptr to end of circular buffer (logical)
  295.     ULONG       startbuf                     ;Ptr to physical start of input buffer
  296.     ULONG       endbuf                       ;Ptr to physical end of input buffer
  297.     ULONG       ReadRequestPtr
  298.     ULONG       WriteRequestPtr
  299.     ULONG       breakiorequest
  300.     UBYTE       xstate                      ;Zero if 'x-off' received, else $FF
  301.     UBYTE       ISRcopy                     ;Used for read error diagnosis
  302.     UBYTE       CSRcopy                     ;Used for read error diagnosis
  303.     UBYTE       Exclusive                   ;True if someone has exclusive access to this unit
  304.     ULONG       daciabase
  305.     ULONG       mdu_prefs                   ;Ptr to prefs for this unit (in MyDev)
  306.     LABEL       mdu_SIZE
  307.  
  308. ;Note that we have a single unit structure used by both the read and write
  309. ;tasks (and the interrupt routine).
  310.  
  311. * UNIT_FLAG definitions:
  312.  
  313.     BITDEF    UNIT,INREADTASK,0    
  314.     BITDEF    UNIT,INWRITETASK,1
  315.     BITDEF    UNIT,READACTIVE,2
  316.     BITDEF    UNIT,WRITEACTIVE,3
  317.     BITDEF    UNIT,BREAKACTIVE,4
  318.     BITDEF    UNIT,INBREAK,5
  319.  
  320. ;INBREAK is used by the queued break routine to protect against immediate breaks
  321. ;(a rather unlikely scenereo, but it might happen; who knows?)
  322.  
  323. * Bit definitions for MDU_FLAGS
  324.  
  325.     BITDEF    MDU,STOPPED,2    ;State bit for unit stopped
  326.     BITDEF    MDU,V,3     ;Buffer overflow flag - set in int routine if an overflow occurs
  327.  
  328. * Bit definitions for ioflags
  329.  
  330.     BITDEF    ioflags,Active,4    ;IO request in progress
  331.     BITDEF    ioflags,Ignore,5    ;Ignore this IO request
  332.  
  333. * Equates & bit defs for IERstate
  334.  
  335. READINT     equ    $87
  336. READINTMASK    equ    $7
  337.  
  338. HANDINT     equ    $88
  339. HANDINTMASK    equ    $8
  340.  
  341. WRITEINT    equ    $C0
  342. WRITEINTMASK    equ    $40
  343.  
  344. WRITEOFF    equ    $40
  345. WRITEOFFMASK    equ    $BF
  346.  
  347. *** The Hardware ***
  348.  
  349. _custom    equ    $DFF000
  350. _intena    equ    _custom+intena
  351.  
  352. ;The ACIAs are located at $400 byte boundaries beginning at ACIA_Base:
  353. ;
  354. ; Unit1    equ    $BF9000    ;65C52 DACIA chip 1, unit 1
  355. ; Unit2    equ    $BF9400    ;65C52 DACIA chip 1, unit 2
  356. ; Unit3    equ    $BF9800    ;65C52 DACIA chip 2, unit 1
  357. ; Unit4    equ    $BF9C00    ;65C52 DACIA chip 2, unit 2
  358.  
  359. ACIA_Base    equ    $BF9000    ;Base address of all units
  360. ACIA0    equ    $0000    ;Offset of 1st chip
  361. ACIA1    equ    $0800    ;Offset of 2nd chip
  362. UNIT2    equ    $0400    ;Offset of 2nd unit
  363.  
  364. IER    equ    $0000    ;Interrupt Enable Register
  365. ISR    equ    $0000    ;Interrupt Status Register
  366. CTR    equ    $0100    ;Control Register
  367. FMR    equ    $0100    ;Format Register
  368. CSR    equ    $0100    ;Control Status Register
  369. CDR    equ    $0200    ;Compare Data Register
  370. ACR    equ    $0200    ;Auxilliary Control Register
  371. TDR    equ    $0300    ;Transmit Data Register
  372. RDR    equ    $0300    ;Receive Data Register
  373.  
  374. * Interrupt Status Registers (ISR1=0, ISR2=4) Read only
  375.  
  376.     BITDEF    ISR,SETCLR,7    ;Any bit set
  377.     BITDEF    ISR,TDRE,6    ;Transmit Data Register Empty
  378.     BITDEF    ISR,CTST,5    ;Transition on *CTS Line
  379.     BITDEF    ISR,DCDT,4    ;Transition on *DCD Line
  380.     BITDEF    ISR,DSRT,3    ;Transition on *DSR Line
  381.     BITDEF    ISR,PAR,2    ;Parity status
  382.     BITDEF    ISR,FEOB,1    ;Frame error, Overrun, Break
  383.     BITDEF    ISR,RDRF,0    ;Receive Data Register Full
  384.  
  385. * Interrupt Enable Registers (IER1=0, IER2=4) Write only
  386.  
  387.     BITDEF    IER,SETCLR,7    ;Same as above
  388.     BITDEF    IER,TDRE,6
  389.     BITDEF    IER,CTST,5
  390.     BITDEF    IER,DCDT,4
  391.     BITDEF    IER,DSRT,3
  392.     BITDEF    IER,PAR,2
  393.     BITDEF    IER,FEOB,1
  394.     BITDEF    IER,RDRF,0
  395.  
  396. * Control Status Registers (CSR1=1, CSR2=5) Read only
  397.  
  398.     BITDEF    CSR,FE,7    ;Framing Error
  399.     BITDEF    CSR,TUR,6    ;Transmitter Underrun
  400.     BITDEF    CSR,CTSL,5    ;*CTS Level
  401.     BITDEF    CSR,DCDL,4    ;*DCD Level
  402.     BITDEF    CSR,DSRL,3    ;*DSR Level
  403.     BITDEF    CSR,RBRK,2    ;Receive Break
  404.     BITDEF    CSR,DTRL,1    ;*DTR Level
  405.     BITDEF    CSR,RTSL,0    ;*RTS Level
  406.  
  407. * Control Registers (CR1=1, CR2=5) Write only
  408.  
  409.     BITDEF    CR,CTRL,7    ;1=Access FMR,  0=Access CTR
  410.     BITDEF    CR,AUX,6    ;1=Access ACR,  0=Access CDR
  411.     BITDEF    CR,STOP2,5    ;1=2 stop bits, 0=1 stop bit
  412.     BITDEF    CR,ECHO,4    ;1=Echo mode,   0=Echo mode disabled
  413.  
  414. Baud_50     equ    %00000000    ;Bits 3-0
  415. Baud_110    equ    %00000001
  416. Baud_134    equ    %00000010
  417. Baud_150    equ    %00000011
  418. Baud_300    equ    %00000100
  419. Baud_600    equ    %00000101
  420. Baud_1200    equ    %00000110
  421. Baud_1800    equ    %00000111
  422. Baud_2400    equ    %00001000
  423. Baud_3600    equ    %00001001
  424. Baud_4800    equ    %00001010
  425. Baud_7200    equ    %00001011
  426. Baud_9600    equ    %00001100
  427. Baud_19200    equ    %00001101
  428. Baud_38400    equ    %00001110
  429. Baud_EXT    equ    %00001111
  430.  
  431. * Format Registers (FR1=1, FR2=5) Write only
  432.  
  433.     BITDEF    FR,FRMT,7    ;1=Access FR, 0=Access CR
  434.  
  435. WORDLEN_5    equ    %00000000    ;Bits 5-6
  436. WORDLEN_6    equ    %00100000
  437. WORDLEN_7    equ    %01000000
  438. WORDLEN_8    equ    %01100000
  439.  
  440. PAR_ODD     equ    %00000000    ;Bits 3-4
  441. PAR_EVEN    equ    %00001000
  442. PAR_MARK    equ    %00010000
  443. PAR_SPACE    equ    %00011000
  444.  
  445.     BITDEF    FR,PAR,2    ;1=Parity as specified in bits 3-4
  446.     BITDEF    FR,DTR,1    ;1=Set DTR hi, 0=Set DTR lo
  447.     BITDEF    FR,RTS,0    ;1=Set RTS hi, 0=Set RTS lo
  448.  
  449. * Compare Data Register  (CDR1=2, CDR2=6) Write only
  450.  
  451. ;Bit 6 of Control Register must be 0.  By writing a value into this
  452. ;register, the DACIA is put into the compare mode.  In this mode the Receive
  453. ;Data Register Full bit is inhibited until a character is received that
  454. ;matches the value in this register.  The next character is then received
  455. ;normally.
  456.  
  457. * Auxiliary Control Registers (ACR1=2, ACR2=6) Write only
  458.  
  459. ;Bit 6 of Control Register must be 1.
  460.  
  461.     BITDEF    ACR,BRK,1    ;Transmit break
  462.     BITDEF    ACR,ARM,0    ;Address recognition mode
  463.  
  464. *****************************************************************************
  465. *
  466. * Here are the includes for the parallel portion of the I/O Expansion Board.
  467. *
  468. *****************************************************************************
  469.  
  470. VIA_Base    equ    $BF1000    ;Base address of all units
  471. VIA0    equ    $0000    ;VIA #0 Base offset
  472. VIA1    equ    $4000    ;VIA #1 Base offset
  473.  
  474. ORB    equ    $0000    ;I/O Register B
  475. ORA    equ    $0100    ;I/O Register A
  476. DDRB    equ    $0200    ;Data Direction Register B
  477. DDRA    equ    $0300    ;Data Direction Register A
  478. T1CL    equ    $0400    ;Timer #1 Counter (lower 8 bits)
  479. T1CH    equ    $0500    ;Timer #1 Counter (upper 8 bits)
  480. T1LL    equ    $0600    ;Timer #1 Latch (lower 8 bits)
  481. T1LH    equ    $0700    ;Timer #1 Latch (upper 8 bits)
  482. T2CL    equ    $0800    ;Timer #2 Counter (lower 8 bits)
  483. T2CH    equ    $0900    ;Timer #2 Counter (upper 8 bits)
  484. SHFTR    equ    $0A00    ;Shift Register
  485. AUXCR    equ    $0B00    ;Auxiliary Control Register
  486. PERCR    equ    $0C00    ;Peripheral Control Register
  487. INTFR    equ    $0D00    ;Interrupt Flag Register
  488. INTER    equ    $0E00    ;Interrupt Enable Register
  489. ORAF    equ    $0F00    ;I/O Register A (no handshake)
  490.  
  491. ;End of File
  492.