home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 25 / amigaformatcd25.iso / -in_the_mag- / emulation / z80 / c_stubs.a next >
Text File  |  1998-02-13  |  8KB  |  376 lines

  1. ** This file contains the C interface stubs.
  2. ** It can be compiled separately and needs no include files.
  3.  
  4. ** =======================================================================
  5.  
  6. ** It is assumed here that the stack looks like this upon entry:
  7. **     <return_addr> [,<other_stuff>] [,<parameter_1> [,...] ]
  8. **    SP                               SP+P1OFFS
  9.  
  10. P1OFFS    EQU    4    ;stack offset of parameter 1 at entry
  11.  
  12. ** Sizes of stacked parameters and macros to transfer them to registers:
  13. ** (If you change a size, you might need to change the move instruction
  14. ** in the macro as well.)
  15.  
  16. ARG_START     MACRO ;initial_offset
  17. ARG_OFFS SET \1+P1OFFS
  18.         ENDM
  19.  
  20. LONGSIZ    EQU    4
  21. GETLONG    MACRO    ;register
  22.     move.l    ARG_OFFS(a7),\1
  23. ARG_OFFS SET ARG_OFFS+LONGSIZ
  24.     ENDM
  25.  
  26. INTSIZ    EQU    4    ;supposed sizeof(int)
  27. GETINT    MACRO    ;src,dest
  28.     move.l    ARG_OFFS(a7),\1
  29. ARG_OFFS SET ARG_OFFS+INTSIZ
  30.     ENDM
  31.  
  32. WORDSIZ    EQU    INTSIZ    ;probably promoted to int
  33. GETWORD    MACRO    ;src,dest
  34.     move.l    ARG_OFFS(a7),\1
  35. ARG_OFFS SET ARG_OFFS+WORDSIZ
  36.     ENDM
  37.  
  38. BYTESIZ    EQU    INTSIZ    ;probably promoted to int
  39. GETBYTE    MACRO    ;src,dest
  40.     move.l    ARG_OFFS(a7),\1
  41. ARG_OFFS SET ARG_OFFS+BYTESIZ
  42.     ENDM
  43.  
  44. PTRSIZ    EQU    4    ;size of a pointer
  45. GETPTR    MACRO    ;src,dest
  46.     move.l    ARG_OFFS(a7),\1
  47. ARG_OFFS SET ARG_OFFS+PTRSIZ
  48.     ENDM
  49.         
  50. ** -----------------------------------------------------------------------
  51.  
  52. ** All Z80_ functions that return a value pass it in d0. If this is not
  53. ** what your compiler wants, then edit the stubs. I see no easy way
  54. ** to fix that with macros and conditional assembly.
  55.  
  56. ** -----------------------------------------------------------------------
  57.  
  58. ** Z80_Init takes one parameter:
  59. **   a0   a pointer to the control structure.
  60. ** It returns an error flag in d0.
  61. ** C Prototype:
  62. **    int Z80_Init(struct Z80_Control *)
  63.  
  64.     XREF    Z80_Init
  65.     XDEF    _Z80_Init
  66.  
  67. _Z80_Init    movem.l a0,-(a7)
  68.         ARG_START 1*4
  69.         GETPTR    a0
  70.         jsr    Z80_Init
  71.         movem.l (a7)+,a0
  72.         rts
  73. ** ------------
  74.  
  75. ** Z80_Coldstart takes one parameter:
  76. **   a0   a pointer to the control structure.
  77. ** It returns an error flag in d0.
  78. ** C Prototype:
  79. **    int Z80_Coldstart(struct Z80_Control *)
  80.  
  81.     XREF    Z80_Coldstart
  82.     XDEF    _Z80_Coldstart
  83.  
  84. _Z80_Coldstart    movem.l a0,-(a7)
  85.         ARG_START 1*4
  86.         GETPTR    a0
  87.         jsr    Z80_Coldstart
  88.         movem.l (a7)+,a0
  89.         rts
  90. ** ------------
  91.  
  92. ** Z80_Continue takes one parameter:
  93. **   a0   a pointer to the control structure.
  94. ** It returns an error flag in d0.
  95. ** C Prototype:
  96. **    int Z80_Continue(struct Z80_Control *)
  97.  
  98.     XREF    Z80_Continue
  99.     XDEF    _Z80_Continue
  100.  
  101. _Z80_Continue    movem.l a0,-(a7)
  102.         ARG_START 1*4
  103.         GETPTR    a0
  104.         jsr    Z80_Continue
  105.         movem.l (a7)+,a0
  106.         rts
  107. ** ------------
  108.  
  109. ** Z80_NewSettings takes one parameter:
  110. **   a0   a pointer to the control structure.
  111. ** It returns an error flag in d0.
  112. ** C Prototype:
  113. **    int Z80_NewSettings(struct Z80_Control *)
  114.  
  115.     XREF    Z80_NewSettings
  116.     XDEF    _Z80_NewSettings
  117.  
  118. _Z80_NewSettings
  119.         movem.l a0,-(a7)
  120.         ARG_START 1*4
  121.         GETPTR    a0
  122.         jsr    Z80_NewSettings
  123.         movem.l (a7)+,a0
  124.         rts
  125. ** ------------
  126.  
  127. ** Z80_SetByte takes three parameters:
  128. **   a0   a pointer to the control structure,
  129. **   d0   a word-sized Z80 address,
  130. **   d1   a byte value.
  131. ** It returns nothing.
  132. ** C Prototype:
  133. **    void Z80_SetByte(struct Z80_Control *, UWORD addr, BYTE val)
  134.  
  135.     XREF    Z80_SetByte
  136.     XDEF    _Z80_SetByte
  137.  
  138. _Z80_SetByte    movem.l a0/d1,-(a7)
  139.         ARG_START 2*4
  140.         GETPTR    a0
  141.         GETWORD    d0
  142.         GETBYTE    d1
  143.         jsr    Z80_SetByte
  144.         movem.l (a7)+,a0/d1
  145.         rts
  146. ** ------------
  147.  
  148. ** Z80_SetWordLH takes three parameters:
  149. **   a0   a pointer to the control structure,
  150. **   d0   a word-sized Z80 address,
  151. **   d1   a word value.
  152. ** It returns nothing.
  153. ** C Prototype:
  154. **    void Z80_SetWordLH(struct Z80_Control *, UWORD addr, UWORD val)
  155.  
  156.     XREF    Z80_SetWordLH
  157.     XDEF    _Z80_SetWordLH
  158.  
  159. _Z80_SetWordLH    movem.l a0/d1,-(a7)
  160.         ARG_START 2*4
  161.         GETPTR    a0
  162.         GETWORD    d0
  163.         GETWORD    d1
  164.         jsr    Z80_SetWordLH
  165.         movem.l (a7)+,a0/d1
  166.         rts
  167. ** ------------
  168.  
  169. ** Z80_GetByte takes two parameters:
  170. **   a0   a pointer to the control structure,
  171. **   d0   a word-sized Z80 address.
  172. ** It returns a byte value in d0.
  173. ** C Prototype:
  174. **    BYTE Z80_GetByte(struct Z80_Control *, UWORD addr)
  175.  
  176.     XREF    Z80_GetByte
  177.     XDEF    _Z80_GetByte
  178.  
  179. _Z80_GetByte    movem.l a0,-(a7)
  180.         ARG_START 1*4
  181.         GETPTR    a0
  182.         GETWORD    d0
  183.         jsr    Z80_GetByte
  184.         movem.l (a7)+,a0
  185.         rts
  186. ** ------------
  187.  
  188. ** Z80_GetWordLH takes two parameters:
  189. **   a0   a pointer to the control structure,
  190. **   d0   a word-sized Z80 address.
  191. ** It returns a word value in d0.
  192. ** C Prototype:
  193. **    WORD Z80_GetWordLH(struct Z80_Control *, UWORD addr)
  194.  
  195.     XREF    Z80_GetWordLH
  196.     XDEF    _Z80_GetWordLH
  197.  
  198. _Z80_GetWordLH    movem.l a0,-(a7)
  199.         ARG_START 1*4
  200.         GETPTR    a0
  201.         GETWORD    d0
  202.         jsr    Z80_GetWordLH
  203.         movem.l (a7)+,a0
  204.         rts
  205. ** ------------
  206.  
  207. ** Z80_SetBlock takes four parameters:
  208. **   a0   a pointer to the control structure,
  209. **   d0   a word-sized Z80 address,
  210. **   d1   a block size as an unsigned longword,
  211. **   d2   a byte value.
  212. ** It returns nothing.
  213. ** C Prototype:
  214. **    void Z80_SetBlock(struct Z80_Control *,
  215. **        UWORD start_addr, ULONG size, BYTE val)
  216.  
  217.     XREF    Z80_SetBlock
  218.     XDEF    _Z80_SetBlock
  219.  
  220. _Z80_SetBlock    movem.l a0/d1/d2,-(a7)
  221.         ARG_START 3*4
  222.         GETPTR    a0
  223.         GETWORD    d0
  224.         GETLONG    d1
  225.         GETBYTE    d2
  226.         jsr    Z80_SetBlock
  227.         movem.l (a7)+,a0/d1/d2
  228.         rts
  229. ** ------------
  230.  
  231. ** Z80_ReadBlock takes four parameters:
  232. **   a0   a pointer to the control structure,
  233. **   a1   a pointer to the buffer,
  234. **   d0   a word-sized Z80 address,
  235. **   d1   a block size as an unsigned longword.
  236. ** It returns nothing.
  237. ** C Prototype:
  238. **    void Z80_ReadBlock(struct Z80_Control *,
  239. **        void *buffer, UWORD start_addr, ULONG size)
  240.  
  241.     XREF    Z80_ReadBlock
  242.     XDEF    _Z80_ReadBlock
  243.  
  244. _Z80_ReadBlock    movem.l a0/a1/d1,-(a7)
  245.         ARG_START 3*4
  246.         GETPTR    a0
  247.         GETPTR    a1
  248.         GETWORD    d0
  249.         GETLONG    d1
  250.         jsr    Z80_ReadBlock
  251.         movem.l (a7)+,a0/a1/d1
  252.         rts
  253. ** ------------
  254.  
  255. ** Z80_WriteBlock takes three parameters:
  256. **   a0   a pointer to the control structure,
  257. **   a1   a pointer to the buffer,
  258. **   d0   a word-sized Z80 address,
  259. **   d1   a block size as an unsigned longword.
  260. ** It returns nothing.
  261. ** C Prototype:
  262. **    void Z80_WriteBlock(struct Z80_Control *,
  263. **        void *buffer, UWORD start_addr, ULONG size)
  264.  
  265.     XREF    Z80_WriteBlock
  266.     XDEF    _Z80_WriteBlock
  267.  
  268. _Z80_WriteBlock    movem.l a0/a1/d1,-(a7)
  269.         ARG_START 3*4
  270.         GETPTR    a0
  271.         GETPTR    a1
  272.         GETWORD    d0
  273.         GETLONG    d1
  274.         jsr    Z80_WriteBlock
  275.         movem.l (a7)+,a0/a1/d1
  276.         rts
  277. ** ------------
  278.  
  279. ** Z80_SetMemFlag takes four parameters:
  280. **   a0   a pointer to the control structure,
  281. **   d0   a word-sized Z80 address,
  282. **   d1   a block size as an unsigned longword,
  283. **   d2   a byte-sized flag value.
  284. ** It returns nothing.
  285. ** C Prototype:
  286. **    void Z80_SetMemFlag(struct Z80_Control *,
  287. **        UWORD start_addr, ULONG size, BYTE flag)
  288.  
  289.     XREF    Z80_SetMemFlag
  290.     XDEF    _Z80_SetMemFlag
  291.  
  292. _Z80_SetMemFlag    movem.l a0/d1/d2,-(a7)
  293.         ARG_START 3*4
  294.         GETPTR    a0
  295.         GETWORD    d0
  296.         GETLONG    d1
  297.         GETBYTE    d2
  298.         jsr    Z80_SetMemFlag
  299.         movem.l (a7)+,a0/d1/d2
  300.         rts
  301. ** ------------
  302.  
  303. ** Z80_GetMemFlag takes two parameters:
  304. **   a0   a pointer to the control structure,
  305. **   d0   a word-sized Z80 address.
  306. ** It returns a signed flag value in d0.
  307. ** C Prototype:
  308. **    void Z80_GetMemFlag(struct Z80_Control *, UWORD addr)
  309.  
  310.     XREF    Z80_GetMemFlag
  311.     XDEF    _Z80_GetMemFlag
  312.  
  313. _Z80_GetMemFlag    movem.l a0,-(a7)
  314.         ARG_START 1*4
  315.         GETPTR    a0
  316.         GETWORD    d0
  317.         jsr    Z80_GetMemFlag
  318.         movem.l (a7)+,a0
  319.         rts
  320.  
  321. ** ------------
  322.  
  323. ** The requests take one parameter:
  324. **   a0   a pointer to the control structure.
  325. ** They return nothing.
  326. ** C Prototype:
  327. **    void Z80_XXXreq(struct Z80_Control *)
  328.  
  329.     XREF    Z80_INTreq
  330.     XDEF    _Z80_INTreq
  331.  
  332. _Z80_INTreq    movem.l a0,-(a7)
  333.         ARG_START 4
  334.         GETPTR    a0
  335.         jsr    Z80_INTreq
  336.         movem.l (a7)+,a0
  337.         rts
  338.  
  339. ** ------------
  340.  
  341.     XREF    Z80_NMIreq
  342.     XDEF    _Z80_NMIreq
  343.  
  344. _Z80_NMIreq    movem.l a0,-(a7)
  345.         ARG_START 4
  346.         GETPTR    a0
  347.         jsr    Z80_NMIreq
  348.         movem.l (a7)+,a0
  349.         rts
  350.  
  351. ** ------------
  352.  
  353.     XREF    Z80_RESETreq
  354.     XDEF    _Z80_RESETreq
  355.  
  356. _Z80_RESETreq    movem.l a0,-(a7)
  357.         ARG_START 4
  358.         GETPTR    a0
  359.         jsr    Z80_RESETreq
  360.         movem.l (a7)+,a0
  361.         rts
  362.  
  363. ** ------------
  364.  
  365.     XREF    Z80_EXITreq
  366.     XDEF    _Z80_EXITreq
  367.     
  368. _Z80_EXITreq    movem.l a0,-(a7)
  369.         ARG_START 4
  370.         GETPTR    a0
  371.         jsr    Z80_EXITreq
  372.         movem.l (a7)+,a0
  373.         rts
  374.  
  375. ** ======================================================================
  376.