home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / new / misc / emu / z80 / z80_coding.i < prev    next >
Text File  |  1993-12-21  |  8KB  |  352 lines

  1. ** Definitions for coding of Z80 instruction routines.
  2. ** (Macros and register aliases.)
  3.  
  4. ** =====================================================================
  5.  
  6. ** Registers:
  7.  
  8. **  D0     00   A'   00   A       A0      TableBase/Work
  9. **  D1     00   B'   00   B       A1      Pseudo-PC
  10. **  D2     00   C'   00   C       A2      Z80 SP (high word is garbage)
  11. **  D3     00   D'   00   D       A3      Z80 address zero
  12. **  D4     00   E'   00   E       A4      CacheBase
  13. **  D5     scratch    H    L    A5    FlagsBase
  14. **  D6     scratch  saveCCR    A6    InstructionBase
  15. **  D7     --- scratch ---    A7    User Stack Pointer
  16.  
  17. ** Aliases:
  18.  
  19. A    EQUR    d0
  20. B    EQUR    d1
  21. C    EQUR    d2
  22. D    EQUR    d3
  23. E    EQUR    d4
  24. L    EQUR    d5    ;To indicate byte access
  25. HL    EQUR    d5    ;To indicate word access
  26.  
  27. TableB    EQUR    a0    ;pointer to TableBase
  28. Work    EQUR    a0    ;pointer to the Z80_Workspace longword
  29. PPC    EQUR    a1    ;Pseudo-PC
  30. ZSP    EQUR    a2    ;Z80 Stack Pointer (only lower word used)
  31. Z0    EQUR    a3    ;pointer to Z80 address zero
  32. CacheB    EQUR    a4    ;pointer to CacheBase (corresponding to Z0)
  33. FlagsB    EQUR    a5    ;pointer to FlagsBase (corresponding to Z0)
  34. InstrB    EQUR    a6    ;pointer to InstructionBase
  35.  
  36. ** The memory handler refers to most of the base pointers, by their
  37. ** aliases. The only address registers that can be used as scratch pads
  38. ** are PPC and ZSP, so I'd like them to remain in a1 and a2. If they are
  39. ** moved, changes must be done in the memory handler.
  40.  
  41. **    Remember: if you change this, you must also change the labels
  42. **    in the Z80_RegStorage table in Z80_struct.i.
  43.  
  44. ** ======================================================================
  45.  
  46.     IFD VERBOSE
  47.     LIST
  48. ** Compiling the Z80_coding.i file.
  49.     NOLIST
  50.     ENDC
  51.  
  52. ** Macros and local labels:
  53. **
  54. ** Make sure any labels within a macro are truly unique, especially
  55. ** if the macro might be repeated between global labels.
  56. **   Let local labels be on the form "<number>$", where <number>
  57. ** is > 100 in "utility" macros. Local labels in instruction routines
  58. ** (or macros defining such routines) that are on that form should have
  59. ** <number> less than 100.
  60. **   If a macro could be called more than once between global labels, and
  61. ** the macro must contain local labels, those labels must be unique for
  62. ** each macro call (between global labels), but may not be global since
  63. ** that would undefine any other local labels. Standard local labels
  64. ** (<number>$) can't be auto-generated, since the macro 'parameter' \@
  65. ** expands to "_<number>" (plain stupid, if you ask me).
  66. **   My solution (while I can't use Devpac-style local labels here),
  67. ** is to use an extra parameter (the last) to specify a "usage number"
  68. ** to be joined with the local label numbers, i.e. "<number>\3$".
  69. ** This is certainly ugly, but it will work.
  70.  
  71. ** Reserved digit sequences:
  72. **    100-110     testreq
  73. **    (111-119)...    putz (i.e. anything beginning with 111 to 119.)
  74. **    200-210     opcode_2_bytes
  75. **    300-310     opcode_3_bytes
  76.  
  77.  
  78. ** End of instruction, execute next.
  79. next    MACRO
  80.         move.w    (PPC)+,d7
  81.         jmp    (InstrB,d7.w)
  82.     ENDM
  83. ** ----
  84.  
  85. ** Test for requests. Has a built-in "next" function.
  86. ** May only occur once in an instruction routine.
  87. testreq MACRO
  88.         move.w    Z80_Request(TableB),d7
  89.         bne.s    102$    ;skip if no request
  90. 101$        move.w    (PPC)+,d7
  91. 102$        jmp    (InstrB,d7.w)
  92.     ENDM
  93.     ;101$ is supposed to be a known entry point used to
  94.     ;exit to next instruction without testing requests.
  95.     ;Most jumps/calls use this "feature".
  96. ** ----
  97.  
  98. ** Read from z80 memory. Address is a register.
  99. getz    MACRO    ;address,value
  100.         move.b    (Z0,\1.w),\2
  101.     ENDM
  102. ** ----
  103.  
  104. ** Write a byte to memory, marking the cache pointer 'changed'.
  105. ** Address is a register. Memory flags are not checked here. See putz.
  106.     IFD UPDATECACHE
  107. writemem MACRO    ;value,address
  108.         move.b    \1,(Z0,\2.w)
  109.         add.w    \2,CacheB
  110.         clr.w    (CacheB,\2.w)
  111.         sub.w    \2,CacheB
  112.     ENDM
  113.     ELSE
  114. writemem MACRO    ;value,address
  115.         move.b    \1,(Z0,\2.w)    ;write to z80 memory
  116.     ENDM
  117.     IFD VERBOSE
  118.     LIST
  119. **   Writemem does not mark the cache pointer.
  120.     NOLIST
  121.     ENDC
  122.     ENDC ;IFD UPDATECACHE
  123. ** ----
  124.  
  125. ** Write to z80 memory. Address is a register.
  126.     IFND    Z80_MEMCHECK
  127. putz    MACRO    ;value,address
  128.         writemem <\1>,<\2>
  129.     ENDM
  130.     ELSE
  131. ** As above, but do address exception testing.
  132. ** May occur several times in a single instruction routine,
  133. ** therefore, calls beyond the first must specify a "usage number"
  134. ** (preferably a single digit).
  135. putz    MACRO    ;value,address[,use]
  136.         tst.b    (FlagsB,\2.w)
  137.         beq.s    111\3$
  138.         move.w    \2,-(sp)
  139.         move.b    \1,-(sp)
  140.         jsr    memhandler(InstrB)
  141.         addq.l    #4,sp
  142.         bra.s    112\3$
  143. 111\3$        writemem <\1>,<\2>
  144. 112\3$
  145.     ENDM
  146.  
  147.     ;If the handler is called, the write part is skipped. If
  148.     ;the value should be written, the handler will do it.
  149.     ;When the memory handler is reached, the stack should
  150.     ;look like this:
  151.     ; sp+6    word    address
  152.     ;    byte    padding (caused by move.b to stack)
  153.     ; sp+4    byte    value
  154.     ; sp->    long    return address
  155.  
  156. WRITE_ADDR = 6    ;the offsets used by memhandler
  157. WRITE_VAL = 4
  158.  
  159.     ENDC ;IFND Z80_MEMCHECK
  160. ** ----
  161.  
  162. ** Word-sized Increment
  163. incw    MACRO    ;dest
  164.         addq.w    #1,\1
  165.     ENDM
  166. ** ----
  167.  
  168. ** Word-sized decrement
  169. decw    MACRO    ;dest
  170.         subq.w    #1,\1
  171.     ENDM
  172. ** ----
  173.  
  174. ** Byte-sized increment
  175. incb    MACRO    ;dest
  176.         addq.b    #1,\1
  177.     ENDM
  178. ** ----
  179.  
  180. ** Byte-sized decrement
  181. decb    MACRO    ;dest
  182.         subq.b    #1,\1
  183.     ENDM
  184. ** ----
  185.  
  186. ** Move PPC 'count' words forward. (Max 4)
  187. skip    MACRO    ;count
  188.         addq.l    #2*(\1),PPC
  189.     ENDM
  190. ** ----
  191.  
  192. ** Calculate the real 16-bit Z80 PC (result in d7).
  193. getRPC    MACRO
  194.         move.l    PPC,d7
  195.         sub.l    CacheB,d7
  196.         lsr.l    #1,d7
  197.     ENDM
  198. ** ----
  199.  
  200. ** Make new PPC from the Real PC in d7.
  201. ** PPC=CacheB+2*(extended d7.w)
  202. makePPC MACRO
  203.         lea    (CacheB,d7.w),PPC
  204.         add.w    d7,PPC
  205.     ENDM
  206. ** ----
  207.  
  208. ** Test parity. Bits 8-15 must be zero.
  209. parity    MACRO    ;register
  210.         or.b    Z80_Parity(TableB,\1.w),d6
  211.     ENDM
  212. ** ----
  213.  
  214. ** Store the status register / condition code register.
  215.     ;Move from SR is privileged on 68010 and higher. On those,
  216.     ;use Move from CCR (which doesn't exist on 68000).
  217.     IFNE    PROCESSOR<68010
  218.  
  219. putsr    MACRO    ;dest
  220.         move    SR,\1
  221.     ENDM
  222.     IFD VERBOSE
  223.     LIST
  224. **   putsr uses Move from SR.
  225.     NOLIST
  226.     ENDC
  227.  
  228.     ELSE
  229.  
  230. putsr    MACRO    ;dest
  231.         move    CCR,\1
  232.     ENDM
  233.     IFD VERBOSE
  234.     LIST
  235. **   putsr uses Move from CCR.
  236.     NOLIST
  237.     ENDC
  238.  
  239.     ENDC ;IFND CCR_VERSION
  240. ** ----
  241.  
  242. ** Load the condition code register from d6.
  243. getsr    MACRO
  244.         move    d6,CCR
  245.     ENDM
  246. ** ----
  247.  
  248. ** Make a word of two bytes. Result in d7.
  249. join    MACRO    ;High,Low
  250.         move.b    \1,(Work)
  251.         move.w    (Work),d7
  252.         move.b    \2,d7
  253.     ENDM
  254. ** ----
  255.  
  256. ** Index register + offset to d7. Offset is always the third byte.
  257. ** The PPC has been increased by one.
  258. index    MACRO    ;X or Y
  259.         getRPC
  260.         incw    d7
  261.         getz    d7,d7
  262.         ext.w    d7
  263.         add.w    Z80_I\1(TableB),d7
  264.     ENDM
  265. ** ----
  266.  
  267. ** Execute macro/instruction with all r but H as parameter.
  268. do_r    MACRO ;instruction
  269.     \1 A
  270.     \1 B
  271.     \1 C
  272.     \1 D
  273.     \1 E
  274.     \1 L
  275.     ENDM
  276. ** ----
  277.  
  278. ** Execute macro/instruction with B,C and D,E as parameters.
  279. do_ss    MACRO ;instruction
  280.     \1 B,C
  281.     \1 D,E
  282.     ENDM
  283. ** ----
  284.  
  285. ** Execute macro/instruction with X and Y as parameter
  286. do_xy    MACRO ;instruction
  287.     \1 X
  288.     \1 Y
  289.     ENDM
  290. ** ----
  291.  
  292. ** Test multi-byte opcodes for modified code.
  293. ** Only negative cache values are allowed for the second and third
  294. ** bytes of the opcode.
  295.  
  296.  
  297. ** This tests the instructions on the form
  298. **    prefix    (DD/CB)
  299. **    opcode
  300. **    [offset]
  301. **    [data]
  302.  
  303.     ;May only occur once in an instruction routine
  304.  
  305.     IFD MODIFIEDCODE
  306. opcode_2_bytes MACRO
  307.         tst.w    (PPC)
  308.         bmi.s    201$
  309.         jmp    stale_ptr(InstrB)
  310. 201$
  311.     ENDM
  312.     ELSE
  313. opcode_2_bytes MACRO
  314.     ;do nothing
  315.     ENDM
  316.     IFD VERBOSE
  317.     LIST
  318. **   No tests for modified code in 2-byte opcodes are made.
  319.     NOLIST
  320.     ENDC
  321.     ENDC ;IFD MODIFIEDCODE
  322.  
  323.  
  324. ** This tests the instructions on the form
  325. **    prefix    (DD/FD)
  326. **    prefix    (CB)
  327. **    offset
  328. **    opcode
  329.  
  330.     ;May only occur once in an instruction routine
  331.  
  332.     IFD MODIFIEDCODE
  333. opcode_3_bytes MACRO
  334.         move.w    (PPC),d7
  335.         or.w    4(PPC),d7
  336.         bmi.s    301$
  337.         jmp    stale_ptr(InstrB)
  338. 301$
  339.     ENDM
  340.     ELSE
  341. opcode_3_bytes MACRO
  342.     ;do nothing
  343.     ENDM
  344.     IFD VERBOSE
  345.     LIST
  346. **   No tests for modified code in 3-byte opcodes are made.
  347.     NOLIST
  348.     ENDC
  349.     ENDC ;IFD MODIFIEDCODE
  350.  
  351. ** =======================================================================
  352.