|
|
1.1 root 1: ;----------------------------------------------------------------------------;
2: ; RAZE-x86 Z80 emulator.
3: ; version 1.06
4: ;
5: ; Copyright (c) 1999 Richard Mitton
6: ;
7: ; This may only be distributed as part of the complete RAZE package.
8: ; See RAZE.TXT for license information.
9: ;----------------------------------------------------------------------------;
10:
11: %macro cglobal 1
12: global @UNDERSCORE@%1
13: %define %1 @UNDERSCORE@%1
14: %endmacro
15:
16: ; You are not expected to understand this.
17:
18:
19: ;----------------------------------------------------------------------------;
20: ; Comment these in/out for faster speed (less accurate):
21: %define EMULATE_UNDOC_FLAGS ; a couple of undocumented flags
22: %define EMULATE_BITS_3_5 ; bits 3/5 of the flags (undocumented)
23: %define EMULATE_WEIRD_STUFF ; misc *very obscure* undocumented behaviour
24: %define EMULATE_R_REGISTER ; precise R register (not usually needed)
25: ;;;;%define USE_FETCH_CALLBACK ; call a callback for every fetch (slow!)
26: ;----------------------------------------------------------------------------;
27:
28: ; Registers:
29: ; AF = ax (flags in AH)
30: ; HL = bx
31: ; BC = cx
32: ; PC = si
33: ; R = ebp
34: ;
35: ; GCC wants EBX, ESI, EDI, ESP, and EBP to be preserved at all times
36: ; DH should always be clear between macros
37: ; The high 16-bits of all registers should be clear at all times (except EBP)
38: ; This assumes LAHF will set bit 1 of AH. (supposed to be undefined...)
39:
40: BITS 32
41: SECTION .bss USE32
42:
43: ; Maximum number of memory handlers
44: %define MAX_MEM_HANDLERS 64
45:
46: ; The current context
47: align 16
48: context_start:
49: z80_AF resd 1
50: z80_BC resd 1
51: z80_DE resd 1
52: z80_HL resd 1
53: z80_IX resd 1
54: z80_IY resd 1
55: z80_PC resd 1
56: z80_SP resd 1
57: z80_AF2 resd 1
58: z80_BC2 resd 1
59: z80_DE2 resd 1
60: z80_HL2 resd 1
61: z80_IFF1 resb 1
62: z80_IFF2 resb 1
63: z80_R resd 1
64: z80_R2 resd 1
65: z80_I resb 1
66: z80_flag35 resb 1
67: z80_IM resb 1
68: z80_IRQVector resb 1
69: z80_IRQLine resb 1
70: z80_halted resb 1
71: z80_Extra_Cycles resd 1
72: registers_end:
73:
74: z80_Fetch resd 256
75: z80_Read resd (256*2)
76: z80_Write resd (256*2)
77: z80_In resd 1
78: z80_Out resd 1
79: z80_RetI resd 1
80: z80_Fetch_Callback resd 1
81: _read_handlers resd 4*MAX_MEM_HANDLERS
82: _write_handlers resd 4*MAX_MEM_HANDLERS
83: context_end:
84: resd 1 ; safety gap, so z80_reset can use 32-bit transfers
85:
86: ; Variables
87: z80_ICount resd 1
88: z80_Initial_ICount resd 1
89: z80_TempICount resd 1
90: z80_afterEI resb 1
91:
92: SECTION .text USE32
93: ;----------------------------------------------------------------------------;
94: ; Prepare to call a GCC function
95: %macro CALLGCC_START 0
96: mov [z80_AF], ezAF ; eax
97: mov [z80_BC], ezBC ; ecx
98: mov [z80_PC], ezPC ; esi
99: mov [z80_R], zR ; ebp
100: %endmacro
101:
102: ; Return from a GCC function
103: %macro CALLGCC_END 0
104: mov ezAF, [z80_AF] ; eax
105: mov ezBC, [z80_BC] ; ecx
106: mov ezPC, [z80_PC] ; esi
107: mov zR, [z80_R] ; ebp
108: %endmacro
109:
110: ; Read a byte from the PC, into DL
111: ; GETBYTE
112: %macro GETBYTE 0
113: %ifdef USE_FETCH_CALLBACK
114: CALLGCC_START
115: push ezPC
116: call [z80_Fetch_Callback]
117: add esp, 4
118: CALLGCC_END
119: %endif
120: mov edx, ezPC
121: shr edx, 8
122: mov edi, [z80_Fetch+edx*4]
123:
124: mov dl, [edi+ezPC]
125: inc zPC
126: xor edi, edi
127: %endmacro
128:
129: ; Read a byte from the PC, sign-extended into DI
130: ; GETDISP
131: %macro GETDISP 0
132: %ifdef USE_FETCH_CALLBACK
133: CALLGCC_START
134: push ezPC
135: call [z80_Fetch_Callback]
136: add esp, 4
137: CALLGCC_END
138: %endif
139: mov edx, ezPC
140: shr edx, 8
141: mov edx, [z80_Fetch+edx*4]
142:
143: movsx di, [edx+ezPC]
144: inc zPC
145: xor edx, edx
146: %endmacro
147:
148: ; Read a word from the PC, into DI
149: ; GETWORD
150: %macro GETWORD 0
151: %ifdef USE_FETCH_CALLBACK
152: CALLGCC_START
153: push ezPC
154: call [z80_Fetch_Callback]
155: add esp, 4
156: CALLGCC_END
157: %endif
158: mov [z80_BC], ezBC
159: mov edx, ezPC ; low byte
160: shr edx, 8
161: mov edi, [z80_Fetch+edx*4]
162:
163: mov dl, [edi+ezPC]
164: inc zPC
165:
166: %ifdef USE_FETCH_CALLBACK
167: push edx
168: CALLGCC_START
169: push ezPC
170: call [z80_Fetch_Callback]
171: add esp, 4
172: CALLGCC_END
173: pop edx
174: %endif
175: mov ecx, ezPC ; high byte
176: shr ecx, 8
177: mov edi, [z80_Fetch+ecx*4]
178:
179: mov dh, [edi+ezPC]
180: inc zPC
181: mov edi, edx
182: mov ezBC, [z80_BC]
183: xor edx, edx
184: %endmacro
185:
186: ; Read a byte from memory (DI) into DL
187: ; MEMREAD
188: %macro MEMREAD 0
189: CALLGCC_START
190: mov edx, edi
191: shr edx, 8
192: mov ecx, [z80_Read+edx*8]
193:
194: test ecx, ecx ; if handler exists, call it
195: jnz %%handler
196: ; no handler, so go direct
197: mov ecx, [z80_Read+edx*8+4]
198: mov dl, [ecx+edi]
199: jmp %%finish
200:
201: %%handler:
202: push edi
203: call ecx
204: xor edx, edx
205: add esp, 4
206: mov dl, al
207: %%finish:
208: CALLGCC_END
209: %endmacro
210:
211: ; Write a byte in DL to memory (DI)
212: %macro MEMWRITE 0
213: CALLGCC_START
214: xor eax, eax
215: mov al, dl
216:
217: mov edx, edi
218: shr edx, 8
219: mov ecx, [z80_Write+edx*8]
220:
221: test ecx, ecx ; if handler exists, call it
222: jnz %%handler
223: ; no handler, so go direct
224: mov ecx, [z80_Write+edx*8+4]
225: mov [ecx+edi], al
226: jmp %%finish
227:
228: %%handler:
229: push eax
230: push edi
231: call ecx
232: add esp, 8
233: %%finish:
234: CALLGCC_END
235: xor edx, edx
236: %endmacro
237:
238: ; Read a byte from port (DI) into DL
239: ; IOREAD
240: %macro IOREAD 0
241: push edi
242: CALLGCC_START
243: call [z80_In]
244: xor edx, edx
245: add esp, 4
246: mov dl, al
247: CALLGCC_END
248: %endmacro
249:
250: ; Write a byte in DL to port (DI)
251: %macro IOWRITE 0
252: CALLGCC_START
253: xor dh, dh
254: push edx
255: push edi
256: call [z80_Out]
257: add esp, 8
258: CALLGCC_END
259: xor edx, edx
260: %endmacro
261:
262: ; Align code to the default boundary
263: %macro ALIGN 0
264: align 4
265: %endmacro
266:
267: ; Define an instruction
268: ; DEF prefix, opcode, std_cycles, extra_cycles
269: %macro DEF 4
270: ALIGN
271: %define std_cycles %3
272: %define extra_cycles %4
273: %{1}_%2:
274: %endmacro
275:
276: ; Subtract the clock cycles for this instruction from the ICount
277: %macro DO_CYCLES 0
278: sub dword [z80_ICount], std_cycles
279: jbe near z80_finish
280: %endmacro
281:
282: ; Subtract the extra clock cycles for this instruction from the ICount
283: %macro DO_EXTRA_CYCLES 0
284: sub dword [z80_ICount], extra_cycles
285: jbe near z80_finish
286: %endmacro
287:
288: ; Finish straight away
289: %macro EXIT 0
290: jmp z80_finish
291: %endmacro
292:
293: ; Jump to the next instruction
294: %macro NEXT 0
295: %ifdef EMULATE_R_REGISTER
296: inc zR
297: %endif
298: GETBYTE
299: jmp [OpTable+edx*4]
300: %endmacro
301:
302: ; Check the IRQ line, cause an interrupt if needed
303: %macro CHECK_IRQ 0
304: cmp [z80_IRQLine], byte 0 ; check the IRQ line
305: je near %%finish
306: cmp [z80_IFF1], byte 0 ; check ints are enabled
307: je near %%finish
308:
309: ; disable interrupts
310: mov [z80_IFF1], byte 0
311: mov [z80_IFF2], byte 0
312: %ifdef EMULATE_R_REGISTER
313: inc zR
314: %endif
315:
316: mov [z80_halted], byte 0 ; Un-HALT the Z80
317:
318: mov edx, ezPC ; write the PC
319: dec zSP
320:
321: xchg dl, dh
322: mov edi, ezSP
323: MEMWRITE
324: dec zSP
325: mov edx, ezPC
326: mov edi, ezSP
327: MEMWRITE
328:
329: cmp [z80_IM], byte 0
330: jne %%not_im0
331: ; IM 0, 13 T-states
332: add [z80_Extra_Cycles], dword 13
333: mov dl, [z80_IRQVector]
334: sub dl, 0c7h
335: movzx ezPC, dl
336: jmp %%finish
337:
338: %%not_im0:
339: cmp [z80_IM], byte 1
340: jne %%not_im1
341: ; IM 1, 13 T-states
342: add [z80_Extra_Cycles], dword 13
343: mov ezPC, 38h
344: jmp %%finish
345:
346: %%not_im1:
347: ; IM 2, 19 T-states
348: add [z80_Extra_Cycles], dword 19
349: mov dl, [z80_IRQVector]
350: mov dh, zI
351: mov edi, edx
352: MEMREAD
353: inc di
354: mov ezPC, edx
355: MEMREAD
356: xchg dl, dh
357: or ezPC, edx
358: xor dh, dh
359: %%finish:
360: %endmacro
361:
362: ;----------------------------------------------------------------------------;
363: ; Helper functions
364:
365: ; Add A, %1
366: %macro DO_ADD 1
367: add zA, %1
368: %ifdef EMULATE_BITS_3_5
369: mov [z80_flag35], zA
370: %endif
371: lahf
372: jo %%set_overflow
373:
374: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C
375: jmp %%finish
376:
377: %%set_overflow:
378: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C
379: or zF, FLAG_P
380: %%finish:
381: %endmacro
382:
383: ; Sub A, %1
384: %macro DO_SUB 1
385: sub zA, %1
386: %ifdef EMULATE_BITS_3_5
387: mov [z80_flag35], zA
388: %endif
389: lahf
390: jo %%set_overflow
391:
392: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C|FLAG_N
393: jmp %%finish
394:
395: %%set_overflow:
396: or zF, FLAG_P
397: %%finish:
398: %endmacro
399:
400: ; Adc A, %1
401: %macro DO_ADC 1
402: ror zF, 1
403: adc zA, %1
404: %ifdef EMULATE_BITS_3_5
405: mov [z80_flag35], zA
406: %endif
407: lahf
408: jo %%set_overflow
409:
410: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C
411: jmp %%finish
412:
413: %%set_overflow:
414: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C
415: or zF, FLAG_P
416: %%finish:
417: %endmacro
418:
419: ; Sbc A, %1
420: %macro DO_SBC 1
421: ror zF, 1
422: sbb zA, %1
423: %ifdef EMULATE_BITS_3_5
424: mov [z80_flag35], zA
425: %endif
426: lahf
427: jo %%set_overflow
428:
429: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C|FLAG_N
430: jmp %%finish
431:
432: %%set_overflow:
433: or zF, FLAG_P
434: %%finish:
435: %endmacro
436:
437: ; And A, %1
438: %macro DO_AND 1
439: and zA, %1
440: %ifdef EMULATE_BITS_3_5
441: mov [z80_flag35], zA
442: %endif
443: lahf
444: and zF, ~(FLAG_N|FLAG_C) ; clear N and carry
445: or zF, FLAG_H ; set half-carry
446: %endmacro
447:
448: ; Or A, %1
449: %macro DO_OR 1
450: or zA, %1
451: %ifdef EMULATE_BITS_3_5
452: mov [z80_flag35], zA
453: %endif
454: lahf
455: and zF, ~(FLAG_N|FLAG_C|FLAG_H) ; clear N, carry and half-carry
456: %endmacro
457:
458: ; Xor A, %1
459: %macro DO_XOR 1
460: xor zA, %1
461: %ifdef EMULATE_BITS_3_5
462: mov [z80_flag35], zA
463: %endif
464: lahf
465: and zF, ~(FLAG_N|FLAG_C|FLAG_H) ; clear N, carry and half-carry
466: %endmacro
467:
468: ; Cp A, %1
469: %macro DO_CP 1
470: %ifdef EMULATE_BITS_3_5
471: mov ah, %1
472: mov [z80_flag35], ah
473: %endif
474: cmp zA, %1
475: lahf
476: jo %%overflow
477:
478: and zF, ~FLAG_P ; clear the overflow
479: or zF, FLAG_N ; set the N flag
480: jmp %%finish
481:
482: %%overflow:
483: or zF, FLAG_P|FLAG_N ; set the overflow and N flag
484: %%finish:
485: %endmacro
486:
487: ; Inc %1
488: %macro DO_INC 1
489: and zF, FLAG_C ; leave carry alone
490: %ifnidn %1, dl
491: mov dl, %1
492: %endif
493: or zF, [INC_Table+edx]
494: inc %1
495: %ifdef EMULATE_BITS_3_5
496: %ifnidn %1, dl
497: inc dl
498: %endif
499: mov [z80_flag35], dl
500: %endif
501: %endmacro
502:
503: ; Dec %1
504: %macro DO_DEC 1
505: and zF, FLAG_C ; leave carry alone
506: %ifnidn %1, dl
507: mov dl, %1
508: %endif
509: or zF, [DEC_Table+edx]
510: dec %1
511: %ifdef EMULATE_BITS_3_5
512: %ifnidn %1, dl
513: dec dl
514: %endif
515: mov [z80_flag35], dl
516: %endif
517: %endmacro
518:
519: ; Add16 %1, %2
520: %macro DO_ADD16 2
521: %ifidn %2, dx
522: %error "DX used as parameter for DO_ADD16!"
523: %endif
524: mov edi, e%2
525: %ifdef EMULATE_UNDOC_FLAGS
526: mov edx, e%1
527: %endif
528: and zF, FLAG_S|FLAG_Z|FLAG_P
529:
530: add %1, di ; do it
531: adc zF, 0 ; merge the new carry in
532:
533: %ifdef EMULATE_UNDOC_FLAGS
534: xor edx, e%1 ; work out our new half-carry
535: xor edx, edi
536: and dh, FLAG_H
537: or zF, dh
538: %endif
539:
540: %ifdef EMULATE_BITS_3_5
541: mov dl, h%1
542: mov [z80_flag35], dl
543: %endif
544: %ifdef EMULATE_UNDOC_FLAGS
545: xor dh, dh
546: %endif
547: %endmacro
548:
549: ; Adc16 %1, %2
550: %macro DO_ADC16 2
551: %ifidn %2, dx
552: %error "DX used as parameter for DO_ADC16!"
553: %endif
554: mov edi, e%2
555: %ifdef EMULATE_UNDOC_FLAGS
556: mov edx, e%1
557: %endif
558: ror zF, 1 ; load the carry
559: adc %1, %2
560: lahf
561: jo %%overflow
562:
563: and zF, ~(FLAG_N|FLAG_H|FLAG_P) ; clear N,H and overflow
564: jmp %%finish
565:
566: %%overflow:
567: and zF, ~(FLAG_N|FLAG_H) ; clear N and H
568: or zF, FLAG_P ; set overflow
569: %%finish:
570:
571: %ifdef EMULATE_UNDOC_FLAGS
572: xor edx, e%1 ; work out our new half-carry
573: xor edx, edi
574: and dh, FLAG_H
575: or zF, dh
576: %endif
577:
578: %ifdef EMULATE_BITS_3_5
579: mov dl, h%1
580: mov [z80_flag35], dl
581: %endif
582: %ifdef EMULATE_UNDOC_FLAGS
583: xor dh, dh
584: %endif
585: %endmacro
586:
587: ; Sbc16 %1, %2
588: %macro DO_SBC16 2
589: %ifidn %2, dx
590: %error "DX used as parameter for DO_SBC16!"
591: %endif
592: %ifdef EMULATE_UNDOC_FLAGS
593: mov edi, e%2
594: %endif
595: mov edx, e%1
596: ror zF, 1 ; load the carry
597: sbb %1, %2
598: lahf
599: jo %%overflow
600:
601: and zF, ~(FLAG_P|FLAG_H) ; clear H and overflow
602: or zF, FLAG_N ; set N
603: jmp %%finish
604:
605: %%overflow:
606: or zF, FLAG_N|FLAG_P ; set overflow and N
607: and zF, ~FLAG_H ; clear H
608: %%finish:
609:
610: %ifdef EMULATE_UNDOC_FLAGS
611: xor edx, e%1 ; work out our new half-carry
612: xor edx, edi
613: and dh, FLAG_H
614: or zF, dh
615: %endif
616:
617: %ifdef EMULATE_BITS_3_5
618: mov dl, h%1
619: mov [z80_flag35], dl
620: %endif
621: %ifdef EMULATE_UNDOC_FLAGS
622: xor dh, dh
623: %endif
624: %endmacro
625:
626: ; Rotate method, reg8
627: %macro DO_ROT 2
628: %ifidn %1, RLA
629: mov dl, zF
630: and dl, FLAG_S|FLAG_Z|FLAG_P
631: sahf
632: rcl zA, 1
633: adc dl, 0
634: %ifdef EMULATE_BITS_3_5
635: mov [z80_flag35], zA
636: %endif
637: mov zF, dl
638: %elifidn %1, RRA
639: mov dl, zF
640: and dl, FLAG_S|FLAG_Z|FLAG_P
641: sahf
642: rcr zA, 1
643: adc dl, 0
644: %ifdef EMULATE_BITS_3_5
645: mov [z80_flag35], zA
646: %endif
647: mov zF, dl
648: %elifidn %1, RLCA
649: and zF, FLAG_S|FLAG_Z|FLAG_P
650: rol zA, 1
651: adc zF, 0
652: %ifdef EMULATE_BITS_3_5
653: mov [z80_flag35], zA
654: %endif
655: %elifidn %1, RRCA
656: and zF, FLAG_S|FLAG_Z|FLAG_P
657: ror zA, 1
658: adc zF, 0
659: %ifdef EMULATE_BITS_3_5
660: mov [z80_flag35], zA
661: %endif
662: %else
663: %ifnidn %2, dl
664: mov dl, %2
665: %endif
666:
667: %ifidn %1, RLC
668: rol dl, 1
669: %elifidn %1, RRC
670: ror dl, 1
671: %elifidn %1, RL
672: sahf
673: rcl dl, 1
674: %elifidn %1, RR
675: sahf
676: rcr dl, 1
677: %endif
678:
679: adc dh, dh
680: test dl, dl
681: lahf
682: and zF, FLAG_S|FLAG_Z|FLAG_P
683: or zF, dh
684: %ifdef EMULATE_BITS_3_5
685: mov [z80_flag35], dl
686: %endif
687: %ifnidn %2, dl
688: mov %2, dl
689: %endif
690: xor dh, dh
691: %endif
692: %endmacro
693:
694: ; Shift method, reg8
695: %macro DO_SHF 2
696: %ifnidn %2, dl
697: mov dl, %2
698: %endif
699:
700: %ifidn %1, SLA
701: add dl, dl
702: adc dh, dh
703: %elifidn %1, SLL
704: add dl, dl
705: adc dh, dh
706: inc dl
707: %elifidn %1, SRA
708: sar dl, 1
709: adc dh, dh
710: %elifidn %1, SRL
711: shr dl, 1
712: adc dh, dh
713: %endif
714:
715: test dl, dl
716: lahf
717: and zF, FLAG_S|FLAG_Z|FLAG_P
718: or zF, dh
719: %ifdef EMULATE_BITS_3_5
720: mov [z80_flag35], dl
721: %endif
722: %ifnidn %2, dl
723: mov %2, dl
724: %endif
725: xor dh, dh
726: %endmacro
727:
728: ; BIT r,n n = bit (0-7)
729: ; r = 8-bit register
730: %macro DO_BIT 2
731: and zF, FLAG_C
732: test %1, (1 << %2)
733: %ifdef EMULATE_BITS_3_5
734: ; bit 3 and 5 are set from the register
735: ; (actually they are bizarrely set, but
736: ; there's no point emulating that, it's just
737: ; plain silly...)
738: %ifnidn %1, dl
739: mov dl, %1 ; put in DL if not there already
740: %endif
741: mov [z80_flag35], dl
742: %endif
743:
744: jz %%bit_is_clear
745: %ifidn %2, 7
746: or zF, FLAG_H|FLAG_S ; set sign bit, if testing bit 7
747: %else
748: or zF, FLAG_H ; set half-carry, and parity
749: %endif
750: jmp %%finish
751:
752: %%bit_is_clear:
753: or zF, FLAG_H|FLAG_Z|FLAG_P ; set half-carry, parity, and zero
754: %%finish:
755: %endmacro
756:
757: ; SET r,n n = bit (0-7)
758: ; r = 8-bit register
759: %macro DO_SET 2
760: or %1, (1 << %2)
761: %endmacro
762:
763: ; RES r,n n = bit (0-7)
764: ; r = 8-bit register
765: %macro DO_RES 2
766: and %1, ~(1 << %2)
767: %endmacro
768:
769: ;----------------------------------------------------------------------------;
770: ; Here are the interface functions:
771:
772: ; Move a register to another
773: ; LD_R_R d8, s8 s8 = src reg, d8 = dest reg
774: %macro LD_R_R 2
775: %ifnidn %1, %2
776: %ifidn %2, D
777: mov dl, zD
778: mov z%1, dl
779: %elifidn %2, E
780: mov dl, zE
781: mov z%1, dl
782: %else
783: mov z%1, z%2
784: %endif
785: %endif
786: DO_CYCLES
787: NEXT
788: %endmacro
789:
790: ; Move a register to another (IXh/IXl)
791: ; LD_XYr_XYr d8, s8 s8 = src reg, d8 = dest reg
792: %macro LD_XYr_XYr 2
793: %ifnidn %1, %2
794: mov dl, z%2
795: mov z%1, dl
796: %endif
797: DO_CYCLES
798: NEXT
799: %endmacro
800:
801: ; Move an immediate byte into a register
802: ; LD_R_N d8 d8 = dest reg
803: %macro LD_R_N 1
804: GETBYTE
805: mov z%1, dl
806: DO_CYCLES
807: NEXT
808: %endmacro
809:
810: ; Move from (RR) into a register
811: ; LD_R_mRR d8, s16 d8 = dest reg, s16 = src reg
812: %macro LD_R_mRR 2
813: mov edi, ez%2
814: MEMREAD
815: mov z%1, dl
816: DO_CYCLES
817: NEXT
818: %endmacro
819:
820: ; Move from (XY+dd) into a register
821: ; LD_R_mXY d8, s16 d8 = dest reg, s16 = src reg
822: %macro LD_R_mXY 2
823: GETDISP
824: add di, z%2
825: MEMREAD
826: mov z%1, dl
827: DO_CYCLES
828: NEXT
829: %endmacro
830:
831: ; Move from a register into (RR)
832: ; LD_mRR_R d16, s8 d16 = destreg, s8 = src reg
833: %macro LD_mRR_R 2
834: mov edi, ez%1
835: mov dl, z%2
836: MEMWRITE
837: DO_CYCLES
838: NEXT
839: %endmacro
840:
841: ; Move from a register into (XY+dd)
842: ; LD_mXY_R d16, s8 d16 = dest reg, s8 = src reg
843: %macro LD_mXY_R 2
844: GETDISP
845: add di, z%1
846: mov dl, z%2
847: MEMWRITE
848: DO_CYCLES
849: NEXT
850: %endmacro
851:
852: ; Move an immediate into (RR)
853: ; LD_mRR_N d16 d16 = dest reg
854: %macro LD_mRR_N 1
855: GETBYTE
856: mov edi, ez%1
857: MEMWRITE
858: DO_CYCLES
859: NEXT
860: %endmacro
861:
862: ; Move an immediate into (XY+dd)
863: ; LD_mXY_N d16 d16 = dest reg
864: %macro LD_mXY_N 1
865: GETDISP
866: add di, z%1
867: push edi
868: GETBYTE
869: pop edi
870: MEMWRITE
871: DO_CYCLES
872: NEXT
873: %endmacro
874:
875: ; Move from (NN) into a register
876: ; LD_R_mNN d8 d8 = dest reg
877: %macro LD_R_mNN 1
878: GETWORD
879: MEMREAD
880: mov z%1, dl
881: DO_CYCLES
882: NEXT
883: %endmacro
884:
885: ; Move from a register into (NN)
886: ; LD_mNN_R s8 s8 = src reg
887: %macro LD_mNN_R 1
888: GETWORD
889: mov dl, z%1
890: MEMWRITE
891: DO_CYCLES
892: NEXT
893: %endmacro
894:
895: ; Move the Interrupt register into a register
896: ; LD_R_I d8 d8 = dest reg
897: %macro LD_R_I 1
898: mov z%1, zI
899: and zF, FLAG_C ; keep old carry
900: mov dl, zF
901:
902: test z%1, z%1
903: lahf
904: and zF, FLAG_S|FLAG_Z ; set S/Z from the I register
905: or zF, dl
906: or zF, [z80_IFF2]
907: %ifdef EMULATE_BITS_3_5
908: mov [z80_flag35], z%1
909: %endif
910: DO_CYCLES
911: NEXT
912: %endmacro
913:
914: ; Move a register into the Interrupt register
915: ; LD_I_R s8 s8 = src reg
916: %macro LD_I_R 1
917: mov zI, z%1
918: DO_CYCLES
919: NEXT
920: %endmacro
921:
922: ; Move the Refresh register into a register
923: ; LD_R_Rf d8 d8 = dest reg
924: %macro LD_R_Rf 1
925: mov edx, [z80_R2]
926: and edx, 80h ; take bits 0-6 from R, bit 7 from R2
927:
928: %ifndef EMULATE_R_REGISTER
929: ; attempt to fake the R-register
930: ; take the ICount, invert it, divide by 4
931: ; this produces an increasing counter, roughly proportional to
932: ; the number of instructions done
933: mov zR, [z80_ICount]
934: not zR
935: shr zR, 2
936: %endif
937:
938: and zR, 7fh
939: or edx, zR
940: mov z%1, dl
941:
942: mov dl, zF
943: and dl, FLAG_C ; keep the old carry
944:
945: test z%1, z%1
946: lahf
947: and zF, FLAG_S|FLAG_Z
948: or zF, dl
949: or zF, [z80_IFF2]
950: %ifdef EMULATE_BITS_3_5
951: mov [z80_flag35], z%1
952: %endif
953: DO_CYCLES
954: NEXT
955: %endmacro
956:
957: ; Move a register into the Refresh register
958: ; LD_Rf_R s8 s8 = src reg
959: %macro LD_Rf_R 1
960: mov dl, z%1
961: mov zR, edx
962: mov [z80_R2], edx
963: DO_CYCLES
964: NEXT
965: %endmacro
966:
967: ; Move a 16-bit immediate into a register
968: ; LD_RR_NN d16 d16 = dest reg
969: %macro LD_RR_NN 1
970: GETWORD
971: mov ez%1, edi
972: DO_CYCLES
973: NEXT
974: %endmacro
975:
976: ; Move from (NN) into a 16-bit register
977: ; LD_RR_mNN d16 d16 = dest reg
978: %macro LD_RR_mNN 1
979: GETWORD
980: MEMREAD
981: mov lz%1, dl
982: inc di
983: MEMREAD
984: mov hz%1, dl
985: DO_CYCLES
986: NEXT
987: %endmacro
988:
989: ; Move from a 16-bit register into (NN)
990: ; LD_mNN_RR s16 s16 = src reg
991: %macro LD_mNN_RR 1
992: GETWORD
993: mov dl, lz%1
994: MEMWRITE
995: inc di
996: mov dl, hz%1
997: MEMWRITE
998: DO_CYCLES
999: NEXT
1000: %endmacro
1001:
1002: ; Move from a 16-bit register into another
1003: ; LD_RR_RR d16, s16 s16 = src reg, d16 = dest reg
1004: %macro LD_RR_RR 2
1005: mov ez%1, ez%2
1006: DO_CYCLES
1007: NEXT
1008: %endmacro
1009:
1010: ; Move from a 16-bit register into another
1011: ; LD_RR_XY d16, s16 s16 = src reg, d16 = dest reg
1012: %macro LD_RR_XY 2
1013: mov edi, ez%2
1014: mov ez%1, edi
1015: DO_CYCLES
1016: NEXT
1017: %endmacro
1018:
1019: ; Push a word on the stack
1020: ; PUSH_RR s16 s16 = src reg
1021: %macro PUSH_RR 1
1022: mov dl, hz%1
1023: dec zSP
1024: mov edi, ezSP
1025: MEMWRITE
1026: dec zSP
1027: mov edi, ezSP
1028: %ifidn %1, AF
1029: ; merge bits 3 and 5 in
1030: and zF, ~(FLAG_3|FLAG_5)
1031: mov dl, [z80_flag35]
1032: and dl, FLAG_3|FLAG_5
1033: or zF, dl
1034: %endif
1035: mov dl, lz%1
1036: MEMWRITE
1037: DO_CYCLES
1038: NEXT
1039: %endmacro
1040:
1041: ; Pop a word from the stack
1042: ; POP_RR s16 s16 = src reg
1043: %macro POP_RR 1
1044: mov edi, ezSP
1045: MEMREAD
1046: %ifidn %1, AF
1047: mov [z80_flag35], dl ; take out bits 3/5
1048: %endif
1049: mov lz%1, dl
1050: inc zSP
1051: mov edi, ezSP
1052: MEMREAD
1053: mov hz%1, dl
1054: inc zSP
1055: DO_CYCLES
1056: NEXT
1057: %endmacro
1058:
1059: ; Exchange 2 16-bit registers
1060: ; EX_RR_RR s16, d16 s16 = src reg, d16 = dest reg
1061: %macro EX_RR_RR 2
1062: xchg ez%1, ez%2
1063: DO_CYCLES
1064: NEXT
1065: %endmacro
1066:
1067: ; Exchange AF with AF'
1068: ; EX_AF_AF2
1069: %macro EX_AF_AF2 0
1070: ; Merge bits 3+5 of the flags in first
1071: and zF, ~(FLAG_3|FLAG_5)
1072: mov dl, [z80_flag35]
1073: and dl, FLAG_3|FLAG_5
1074: or zF, dl
1075: xchg ezAF, ezAF2
1076:
1077: ; Un-merge the flags again
1078: mov [z80_flag35], zF
1079: DO_CYCLES
1080: NEXT
1081: %endmacro
1082:
1083: ; Exchange the 16-bit registers with their primes
1084: ; EXX
1085: %macro EXX 0
1086: mov edi, ezDE
1087: xchg ezBC, ezBC2
1088: xchg ezHL, ezHL2
1089: xchg edi, ezDE2
1090: mov ezDE, edi
1091: DO_CYCLES
1092: NEXT
1093: %endmacro
1094:
1095: ; Exchange a 16-bit register with (RR)
1096: ; EX_RR_mRR d16, m16 d16 = dest reg, m16 = memory reg
1097: %macro EX_RR_mRR 2
1098: mov edi, ez%2 ; swap low byte
1099: MEMREAD
1100: xchg dl, lz%1
1101: MEMWRITE
1102:
1103: inc di ; swap high byte
1104: MEMREAD
1105: xchg dl, hz%1
1106: MEMWRITE
1107:
1108: DO_CYCLES
1109: NEXT
1110: %endmacro
1111:
1112: ; Move from (HL) to (DE), post-increment
1113: ; LDI
1114: %macro LDI 0
1115: mov edi, ezHL
1116: MEMREAD
1117: %ifdef EMULATE_BITS_3_5
1118: push edx
1119: %endif
1120: mov edi, ezDE
1121: MEMWRITE
1122:
1123: %ifdef EMULATE_BITS_3_5
1124: pop edx
1125: add dl, zA
1126: mov dh, dl
1127: shl dl, 4
1128: and edx, FLAG_5 | (FLAG_3 << 8)
1129: or dl, dh
1130: mov [z80_flag35], dl
1131: xor dh, dh
1132: %endif
1133:
1134: and zF, FLAG_S|FLAG_Z|FLAG_C
1135: inc zHL
1136: inc zDE
1137: dec zBC
1138: jz %%ldi_zero
1139: or zF, FLAG_P
1140: %%ldi_zero:
1141: DO_CYCLES
1142: NEXT
1143: %endmacro
1144:
1145: ; Move from (HL) to (DE), post-decrement
1146: ; LDD
1147: %macro LDD 0
1148: mov edi, ezHL
1149: MEMREAD
1150: %ifdef EMULATE_BITS_3_5
1151: push edx
1152: %endif
1153: mov edi, ezDE
1154: MEMWRITE
1155:
1156: %ifdef EMULATE_BITS_3_5
1157: pop edx
1158: add dl, zA
1159: mov dh, dl
1160: shl dl, 4
1161: and edx, FLAG_5 | (FLAG_3 << 8)
1162: or dl, dh
1163: mov [z80_flag35], dl
1164: xor dh, dh
1165: %endif
1166:
1167: and zF, FLAG_S|FLAG_Z|FLAG_C
1168: dec zHL
1169: dec zDE
1170: dec zBC
1171: jz %%ldd_zero
1172: or zF, FLAG_P
1173: %%ldd_zero:
1174: DO_CYCLES
1175: NEXT
1176: %endmacro
1177:
1178: ; Move from (HL) to (DE), post-increment, repeat
1179: ; LDIR
1180: %macro LDIR 0
1181: %ifdef EMULATE_WEIRD_STUFF
1182: ; Code marked with CG is from Charles Gallagher, to fix the
1183: ; Spectrum game 'Quazatron'
1184: push ezPC ; CG
1185: sub zPC, 2 ; CG
1186: mov edi, ezPC ; CG
1187: shr edi, 8 ; CG
1188: add ezPC, [z80_Fetch+edi*4] ; CG
1189: %endif
1190:
1191: %%ldir_loop:
1192: %ifdef EMULATE_WEIRD_STUFF
1193: cmp [ezPC], word 0b0edh ; CG - check for self modifiying code!
1194: jne near %%ldir_modified
1195: %endif
1196:
1197: mov edi, ezHL
1198: MEMREAD
1199: %ifdef EMULATE_BITS_3_5
1200: push edx
1201: %endif
1202: mov edi, ezDE
1203: MEMWRITE
1204: %ifdef EMULATE_BITS_3_5
1205: pop edx
1206: %endif
1207:
1208: inc zHL
1209: inc zDE
1210: dec zBC
1211: jz %%ldir_zero
1212:
1213: %ifdef EMULATE_R_REGISTER
1214: inc zR
1215: %endif
1216: sub [z80_ICount], dword extra_cycles
1217: ja near %%ldir_loop
1218:
1219: %ifdef EMULATE_WEIRD_STUFF
1220: pop ezPC ; CG
1221: %endif
1222:
1223: and zF, FLAG_S|FLAG_Z|FLAG_C
1224: %ifdef EMULATE_BITS_3_5
1225: add dl, zA
1226: mov dh, dl
1227: shl dl, 4
1228: and edx, FLAG_5 | (FLAG_3 << 8)
1229: or dl, dh
1230: mov [z80_flag35], dl
1231: xor dh, dh
1232: %endif
1233: or zF, FLAG_P
1234: sub zPC, 2 ; rewind to instruction start
1235: EXIT
1236:
1237: %ifdef EMULATE_WEIRD_STUFF
1238: %%ldir_modified:
1239: sub [esp], word 2 ; CG
1240: %endif
1241:
1242: %%ldir_zero:
1243: %ifdef EMULATE_WEIRD_STUFF
1244: pop ezPC ; CG
1245: %endif
1246: and zF, FLAG_S|FLAG_Z|FLAG_C
1247: %ifdef EMULATE_BITS_3_5
1248: add dl, zA
1249: mov dh, dl
1250: shl dl, 4
1251: and edx, FLAG_5 | (FLAG_3 << 8)
1252: or dl, dh
1253: mov [z80_flag35], dl
1254: xor dh, dh
1255: %endif
1256: DO_CYCLES
1257: NEXT
1258: %endmacro
1259:
1260: ; Move from (HL) to (DE), post-decrement, repeat
1261: ; LDDR
1262: %macro LDDR 0
1263: %%lddr_loop:
1264: mov edi, ezHL
1265: MEMREAD
1266: %ifdef EMULATE_BITS_3_5
1267: push edx
1268: %endif
1269: mov edi, ezDE
1270: MEMWRITE
1271: %ifdef EMULATE_BITS_3_5
1272: pop edx
1273: %endif
1274:
1275: dec zHL
1276: dec zDE
1277: dec zBC
1278: jz %%lddr_zero
1279:
1280: %ifdef EMULATE_R_REGISTER
1281: inc zR
1282: %endif
1283: sub [z80_ICount], dword extra_cycles
1284: ja near %%lddr_loop
1285:
1286: and zF, FLAG_S|FLAG_Z|FLAG_C
1287: %ifdef EMULATE_BITS_3_5
1288: add dl, zA
1289: mov dh, dl
1290: shl dl, 4
1291: and edx, FLAG_5 | (FLAG_3 << 8)
1292: or dl, dh
1293: mov [z80_flag35], dl
1294: xor dh, dh
1295: %endif
1296: or zF, FLAG_P
1297: sub zPC, 2 ; rewind to instruction start
1298: EXIT
1299:
1300: %%lddr_zero:
1301: and zF, FLAG_S|FLAG_Z|FLAG_C
1302: %ifdef EMULATE_BITS_3_5
1303: add dl, zA
1304: mov dh, dl
1305: shl dl, 4
1306: and edx, FLAG_5 | (FLAG_3 << 8)
1307: or dl, dh
1308: mov [z80_flag35], dl
1309: xor dh, dh
1310: %endif
1311: DO_CYCLES
1312: NEXT
1313: %endmacro
1314:
1315: ; Compare A against (HL), post-increment
1316: ; CPI
1317: %macro CPI 0
1318: mov edi, ezHL
1319: MEMREAD
1320:
1321: and zF, FLAG_C ; keep the old carry
1322: mov dh, zF
1323: cmp zA, dl
1324: lahf
1325: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N
1326: or zF, dh ; SZHN from compare, C unchanged, rest are zero
1327:
1328: inc zHL
1329: dec zBC
1330: jz %%cpi_zero
1331: or zF, FLAG_P ; set P if BC != 0
1332: %%cpi_zero:
1333:
1334: %ifdef EMULATE_BITS_3_5
1335: mov dh, zA
1336: sub dh, dl
1337: test zF, FLAG_H
1338: jz %%cpi_hzero
1339: dec dh
1340: %%cpi_hzero:
1341:
1342: mov dl, dh
1343: shl dl, 4
1344: and edx, FLAG_5 | (FLAG_3 << 8)
1345: or dl, dh
1346: mov [z80_flag35], dl
1347: %endif
1348: xor dh, dh
1349:
1350: DO_CYCLES
1351: NEXT
1352: %endmacro
1353:
1354: ; Compare A against (HL), post-decrement
1355: ; CPD
1356: %macro CPD 0
1357: mov edi, ezHL
1358: MEMREAD
1359:
1360: and zF, FLAG_C ; keep the old carry
1361: mov dh, zF
1362: cmp zA, dl
1363: lahf
1364: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N
1365: or zF, dh ; SZHN from compare, C unchanged, rest are zero
1366:
1367: dec zHL
1368: dec zBC
1369: jz %%cpd_zero
1370: or zF, FLAG_P ; set P if BC != 0
1371: %%cpd_zero:
1372:
1373: %ifdef EMULATE_BITS_3_5
1374: mov dh, zA
1375: sub dh, dl
1376: test zF, FLAG_H
1377: jz %%cpd_hzero
1378: dec dh
1379: %%cpd_hzero:
1380:
1381: mov dl, dh
1382: shl dl, 4
1383: and edx, FLAG_5 | (FLAG_3 << 8)
1384: or dl, dh
1385: mov [z80_flag35], dl
1386: %endif
1387: xor dh, dh
1388:
1389: DO_CYCLES
1390: NEXT
1391: %endmacro
1392:
1393: ; Compare A against (HL), post-increment, repeat
1394: ; CPIR
1395: %macro CPIR 0
1396: and zF, FLAG_C ; keep the old carry
1397: %%cpir_loop:
1398: mov edi, ezHL
1399: MEMREAD
1400:
1401: inc zHL
1402: dec zBC
1403: jz %%cpir_end_bc ; end due to BC=0
1404:
1405: %ifdef EMULATE_R_REGISTER
1406: inc zR
1407: %endif
1408: cmp zA, dl
1409: je %%cpir_end_equal ; end due to A=(HL)
1410:
1411: sub [z80_ICount], dword extra_cycles
1412: ja %%cpir_loop
1413:
1414: ; out of cycles, but not finished
1415: mov dh, zF
1416: cmp zA, dl
1417: lahf
1418: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N
1419: or zF, dh ; SZHN from compare, C unchanged, rest are zero
1420:
1421: %ifdef EMULATE_BITS_3_5
1422: mov dh, zA
1423: sub dh, dl
1424: test zF, FLAG_H
1425: jz %%cpir_hzero
1426: dec dh
1427: %%cpir_hzero:
1428:
1429: mov dl, dh
1430: shl dl, 4
1431: and edx, FLAG_5 | (FLAG_3 << 8)
1432: or dl, dh
1433: mov [z80_flag35], dl
1434: %endif
1435: or zF, FLAG_P ; set P to indicate not finished
1436: sub zPC, 2 ; rewind to instruction start
1437: xor dh, dh
1438: EXIT
1439:
1440: %%cpir_end_equal:
1441: or zF, FLAG_P ; set P to indicate not finished
1442: %%cpir_end_bc:
1443: mov dh, zF
1444: cmp zA, dl
1445: lahf
1446: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N
1447: or zF, dh ; SZHN from compare, C unchanged, rest are zero
1448:
1449: %ifdef EMULATE_BITS_3_5
1450: mov dh, zA
1451: sub dh, dl
1452: test zF, FLAG_H
1453: jz %%cpir_hzero2
1454: dec dh
1455: %%cpir_hzero2:
1456:
1457: mov dl, dh
1458: shl dl, 4
1459: and edx, FLAG_5 | (FLAG_3 << 8)
1460: or dl, dh
1461: mov [z80_flag35], dl
1462: %endif
1463: xor dh, dh
1464: DO_CYCLES
1465: NEXT
1466: %endmacro
1467:
1468: ; Compare A against (HL), post-decrement, repeat
1469: ; CPDR
1470: %macro CPDR 0
1471: and zF, FLAG_C ; keep the old carry
1472: %%cpdr_loop:
1473: mov edi, ezHL
1474: MEMREAD
1475:
1476: dec zHL
1477: dec zBC
1478: jz %%cpdr_end_bc ; end due to BC=0
1479:
1480: %ifdef EMULATE_R_REGISTER
1481: inc zR
1482: %endif
1483: cmp zA, dl
1484: je %%cpdr_end_equal ; end due to A=(HL)
1485:
1486: sub [z80_ICount], dword extra_cycles
1487: ja %%cpdr_loop
1488:
1489: ; out of cycles, but not finished
1490: mov dh, zF
1491: cmp zA, dl
1492: lahf
1493: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N
1494: or zF, dh ; SZHN from compare, C unchanged, rest are zero
1495:
1496: %ifdef EMULATE_BITS_3_5
1497: mov dh, zA
1498: sub dh, dl
1499: test zF, FLAG_H
1500: jz %%cpdr_hzero
1501: dec dh
1502: %%cpdr_hzero:
1503:
1504: mov dl, dh
1505: shl dl, 4
1506: and edx, FLAG_5 | (FLAG_3 << 8)
1507: or dl, dh
1508: mov [z80_flag35], dl
1509: %endif
1510: or zF, FLAG_P ; set P to indicate not finished
1511: sub zPC, 2 ; rewind to instruction start
1512: xor dh, dh
1513: EXIT
1514:
1515: %%cpdr_end_equal:
1516: or zF, FLAG_P ; set P to indicate not finished
1517: %%cpdr_end_bc:
1518: mov dh, zF
1519: cmp zA, dl
1520: lahf
1521: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N
1522: or zF, dh ; SZHN from compare, C unchanged, rest are zero
1523:
1524: %ifdef EMULATE_BITS_3_5
1525: mov dh, zA
1526: sub dh, dl
1527: test zF, FLAG_H
1528: jz %%cpdr_hzero2
1529: dec dh
1530: %%cpdr_hzero2:
1531:
1532: mov dl, dh
1533: shl dl, 4
1534: and edx, FLAG_5 | (FLAG_3 << 8)
1535: or dl, dh
1536: mov [z80_flag35], dl
1537: %endif
1538: xor dh, dh
1539: DO_CYCLES
1540: NEXT
1541: %endmacro
1542:
1543: ; Perform arithmetic on the A register
1544: ; ART_R method, src8
1545: %macro ART_R 2
1546: %ifidn %1, ADD
1547: DO_ADD z%2
1548: %elifidn %1, ADC
1549: DO_ADC z%2
1550: %elifidn %1, SUB
1551: DO_SUB z%2
1552: %elifidn %1, SBC
1553: DO_SBC z%2
1554: %endif
1555:
1556: DO_CYCLES
1557: NEXT
1558: %endmacro
1559:
1560: ; Perform arithmetic on the A register (using an immediate)
1561: ; ART_N method
1562: %macro ART_N 1
1563: GETBYTE
1564: %ifidn %1, ADD
1565: DO_ADD dl
1566: %elifidn %1, ADC
1567: DO_ADC dl
1568: %elifidn %1, SUB
1569: DO_SUB dl
1570: %elifidn %1, SBC
1571: DO_SBC dl
1572: %endif
1573:
1574: DO_CYCLES
1575: NEXT
1576: %endmacro
1577:
1578: ; Perform arithmetic on the A register, using (XY)
1579: ; ART_mXY method, src16
1580: %macro ART_mXY 2
1581: GETDISP
1582: add di, z%2
1583: MEMREAD
1584: %ifidn %1, ADD
1585: DO_ADD dl
1586: %elifidn %1, ADC
1587: DO_ADC dl
1588: %elifidn %1, SUB
1589: DO_SUB dl
1590: %elifidn %1, SBC
1591: DO_SBC dl
1592: %endif
1593:
1594: DO_CYCLES
1595: NEXT
1596: %endmacro
1597:
1598: ; Perform arithmetic on the A register using (RR)
1599: ; ART_mRR method, src16
1600: %macro ART_mRR 2
1601: mov edi, ez%2
1602: MEMREAD
1603: %ifidn %1, ADD
1604: DO_ADD dl
1605: %elifidn %1, ADC
1606: DO_ADC dl
1607: %elifidn %1, SUB
1608: DO_SUB dl
1609: %elifidn %1, SBC
1610: DO_SBC dl
1611: %endif
1612:
1613: DO_CYCLES
1614: NEXT
1615: %endmacro
1616:
1617: ; Perform logic on the A register
1618: ; LOG_R method, src8
1619: %macro LOG_R 2
1620: %ifidn %1, AND
1621: DO_AND z%2
1622: %elifidn %1, OR
1623: DO_OR z%2
1624: %elifidn %1, XOR
1625: DO_XOR z%2
1626: %endif
1627:
1628: DO_CYCLES
1629: NEXT
1630: %endmacro
1631:
1632: ; Perform logic on the A register (using an immediate)
1633: ; LOG_N method
1634: %macro LOG_N 1
1635: GETBYTE
1636: %ifidn %1, AND
1637: DO_AND dl
1638: %elifidn %1, OR
1639: DO_OR dl
1640: %elifidn %1, XOR
1641: DO_XOR dl
1642: %endif
1643:
1644: DO_CYCLES
1645: NEXT
1646: %endmacro
1647:
1648: ; Perform logic on the A register, using (RR)
1649: ; LOG_mRR method, src16
1650: %macro LOG_mRR 2
1651: mov edi, ez%2
1652: MEMREAD
1653: %ifidn %1, AND
1654: DO_AND dl
1655: %elifidn %1, OR
1656: DO_OR dl
1657: %elifidn %1, XOR
1658: DO_XOR dl
1659: %endif
1660:
1661: DO_CYCLES
1662: NEXT
1663: %endmacro
1664:
1665: ; Perform logic on the A register, using (XY+dd)
1666: ; LOG_mXY method, src16
1667: %macro LOG_mXY 2
1668: GETDISP
1669: add di, z%2
1670: MEMREAD
1671: %ifidn %1, AND
1672: DO_AND dl
1673: %elifidn %1, OR
1674: DO_OR dl
1675: %elifidn %1, XOR
1676: DO_XOR dl
1677: %endif
1678:
1679: DO_CYCLES
1680: NEXT
1681: %endmacro
1682:
1683: ; Compare against the A register
1684: ; CP_R src8
1685: %macro CP_R 1
1686: DO_CP z%1
1687:
1688: DO_CYCLES
1689: NEXT
1690: %endmacro
1691:
1692: ; Compare against the A register, using an immediate
1693: ; CP_N
1694: %macro CP_N 0
1695: GETBYTE
1696: DO_CP dl
1697:
1698: DO_CYCLES
1699: NEXT
1700: %endmacro
1701:
1702: ; Compare against the A register, using (RR)
1703: ; CP_mRR src16
1704: %macro CP_mRR 1
1705: mov edi, ez%1
1706: MEMREAD
1707: DO_CP dl
1708:
1709: DO_CYCLES
1710: NEXT
1711: %endmacro
1712:
1713: ; Compare against the A register, using (XY+dd)
1714: ; CP_mXY src16
1715: %macro CP_mXY 1
1716: GETDISP
1717: add di, z%1
1718: MEMREAD
1719: DO_CP dl
1720:
1721: DO_CYCLES
1722: NEXT
1723: %endmacro
1724:
1725: ; Inc/dec a register
1726: ; DECINC_R method, reg8
1727: %macro DECINC_R 2
1728: %ifidn %1, INC
1729: DO_INC z%2
1730: %elifidn %1, DEC
1731: DO_DEC z%2
1732: %endif
1733:
1734: DO_CYCLES
1735: NEXT
1736: %endmacro
1737:
1738: ; Inc/dec (RR)
1739: ; DECINC_mRR method
1740: %macro DECINC_mRR 2
1741: mov edi, ez%2
1742: MEMREAD
1743: %ifidn %1, INC
1744: DO_INC dl
1745: %elifidn %1, DEC
1746: DO_DEC dl
1747: %endif
1748: MEMWRITE
1749:
1750: DO_CYCLES
1751: NEXT
1752: %endmacro
1753:
1754: ; Inc/dec (XY+dd)
1755: ; DECINC_mXY method
1756: %macro DECINC_mXY 2
1757: GETDISP
1758: add di, z%2
1759: MEMREAD
1760: %ifidn %1, INC
1761: DO_INC dl
1762: %elifidn %1, DEC
1763: DO_DEC dl
1764: %endif
1765: MEMWRITE
1766:
1767: DO_CYCLES
1768: NEXT
1769: %endmacro
1770:
1771: ; Add two 16-bit registers
1772: ; ADD_RR_RR dest16, src16
1773: %macro ADD_RR_RR 2
1774: DO_ADD16 z%1, z%2
1775:
1776: DO_CYCLES
1777: NEXT
1778: %endmacro
1779:
1780: ; Add two 16-bit registers, with carry
1781: ; ADC_RR_RR dest16, src16
1782: %macro ADC_RR_RR 2
1783: DO_ADC16 z%1, z%2
1784:
1785: DO_CYCLES
1786: NEXT
1787: %endmacro
1788:
1789: ; Subtract two 16-bit registers, with carry
1790: ; SBC_RR_RR dest16, src16
1791: %macro SBC_RR_RR 2
1792: DO_SBC16 z%1, z%2
1793:
1794: DO_CYCLES
1795: NEXT
1796: %endmacro
1797:
1798: ; Inc/dec a 16-bit register
1799: ; DECINC_RR method, reg16
1800: %macro DECINC_RR 2
1801: %ifidn %1, INC
1802: inc z%2
1803: %elifidn %1, DEC
1804: dec z%2
1805: %endif
1806:
1807: DO_CYCLES
1808: NEXT
1809: %endmacro
1810:
1811: ; Rotate a register
1812: ; ROT_R method, reg8
1813: %macro ROT_R 2
1814: DO_ROT %1, z%2
1815:
1816: DO_CYCLES
1817: NEXT
1818: %endmacro
1819:
1820: ; Rotate (RR)
1821: ; ROT_mRR method, src16
1822: %macro ROT_mRR 2
1823: mov edi, ez%2
1824: MEMREAD
1825: DO_ROT %1, dl
1826: MEMWRITE
1827:
1828: DO_CYCLES
1829: NEXT
1830: %endmacro
1831:
1832: ; Rotate (XY+dd)
1833: ; ROT_mXY method
1834: %macro ROT_mXY 1
1835: MEMREAD
1836: DO_ROT %1, dl
1837: MEMWRITE
1838:
1839: DO_CYCLES
1840: NEXT
1841: %endmacro
1842:
1843: ; Rotate (XY+dd), and store into a register
1844: ; ROT_mXY_R method, dest8
1845: %macro ROT_mXY_R 2
1846: MEMREAD
1847: DO_ROT %1, dl
1848: mov z%2, dl
1849: MEMWRITE
1850:
1851: DO_CYCLES
1852: NEXT
1853: %endmacro
1854:
1855: ; Shift a register
1856: ; SHF_R method, reg8
1857: %macro SHF_R 2
1858: DO_SHF %1, z%2
1859:
1860: DO_CYCLES
1861: NEXT
1862: %endmacro
1863:
1864: ; Shift (RR)
1865: ; SHF_mRR method, src16
1866: %macro SHF_mRR 2
1867: mov edi, ez%2
1868: MEMREAD
1869: DO_SHF %1, dl
1870: MEMWRITE
1871:
1872: DO_CYCLES
1873: NEXT
1874: %endmacro
1875:
1876: ; Shift (XY+dd)
1877: ; SHF_mXY method
1878: %macro SHF_mXY 1
1879: MEMREAD
1880: DO_SHF %1, dl
1881: MEMWRITE
1882:
1883: DO_CYCLES
1884: NEXT
1885: %endmacro
1886:
1887: ; Shift (XY+dd), and store into a register
1888: ; SHF_mXY_R method, dest8
1889: %macro SHF_mXY_R 2
1890: MEMREAD
1891: DO_SHF %1, dl
1892: mov z%2, dl
1893: MEMWRITE
1894:
1895: DO_CYCLES
1896: NEXT
1897: %endmacro
1898:
1899: ; Rotate A/(HL) left, via nibbles
1900: ; RLD
1901: %macro RLD 0
1902: mov edi, ezHL
1903: MEMREAD
1904: mov dh, zA
1905: and zF, FLAG_C
1906: shl dh, 4
1907: rol dx, 4
1908: and zA, 0f0h
1909: or zA, dh
1910: mov dh, zF
1911: lahf
1912: and zF, FLAG_S|FLAG_Z|FLAG_P
1913: or zF, dh
1914: %ifdef EMULATE_BITS_3_5
1915: mov [z80_flag35], zA
1916: %endif
1917: MEMWRITE
1918:
1919: DO_CYCLES
1920: NEXT
1921: %endmacro
1922:
1923: ; Rotate A/(HL) right, via nibbles
1924: ; RRD
1925: %macro RRD 0
1926: mov edi, ezHL
1927: MEMREAD
1928: mov dh, zA
1929: and zF, FLAG_C
1930: ror dx, 4
1931: shr dh, 4
1932: and zA, 0f0h
1933: or zA, dh
1934: mov dh, zF
1935: lahf
1936: and zF, FLAG_S|FLAG_Z|FLAG_P
1937: or zF, dh
1938: %ifdef EMULATE_BITS_3_5
1939: mov [z80_flag35], zA
1940: %endif
1941: MEMWRITE
1942:
1943: DO_CYCLES
1944: NEXT
1945: %endmacro
1946:
1947: ; Bit-test a register
1948: ; BIT_R src8, bit
1949: %macro BIT_R_b 2
1950: DO_BIT z%1, %2
1951:
1952: DO_CYCLES
1953: NEXT
1954: %endmacro
1955:
1956: ; Bit-test (RR)
1957: ; BIT_mRR_b src16, bit
1958: %macro BIT_mRR_b 2
1959: and zF, FLAG_C
1960: mov edi, ez%1
1961: MEMREAD
1962:
1963: test dl, (1 << %2)
1964:
1965: ; bit 3 and 5 are always cleared
1966: ; (actually they are bizarrely set, but
1967: ; there's no point emulating that, it's just
1968: ; plain silly...)
1969:
1970: jz %%bit_is_clear
1971: %ifidn %2, 7
1972: or zF, FLAG_H|FLAG_S ; set sign bit, if testing bit 7
1973: %else
1974: or zF, FLAG_H ; set half-carry, and parity
1975: %endif
1976: jmp %%finish
1977:
1978: %%bit_is_clear:
1979: or zF, FLAG_H|FLAG_Z|FLAG_P ; set half-carry, parity, and zero
1980: %%finish:
1981:
1982: DO_CYCLES
1983: NEXT
1984: %endmacro
1985:
1986: ; Bit-test (XY+dd)
1987: ; BIT_mXY_b bit
1988: %macro BIT_mXY_b 1
1989: %ifdef EMULATE_BITS_3_5
1990: mov edx, edi
1991: mov [z80_flag35], dh
1992: %endif
1993:
1994: MEMREAD
1995: and zF, FLAG_C
1996: test dl, (1 << %1)
1997:
1998: jz %%bit_is_clear
1999: %ifidn %1, 7
2000: or zF, FLAG_H|FLAG_S ; set sign bit, if testing bit 7
2001: %else
2002: or zF, FLAG_H ; set half-carry, and parity
2003: %endif
2004: jmp %%finish
2005:
2006: %%bit_is_clear:
2007: or zF, FLAG_H|FLAG_Z|FLAG_P ; set half-carry, parity, and zero
2008: %%finish:
2009:
2010: DO_CYCLES
2011: NEXT
2012: %endmacro
2013:
2014: ; Bit-clear a register
2015: ; RES_R_b src8, bit
2016: %macro RES_R_b 2
2017: DO_RES z%1, %2
2018:
2019: DO_CYCLES
2020: NEXT
2021: %endmacro
2022:
2023: ; Bit-clear (RR)
2024: ; RES_mRR_b src16, bit
2025: %macro RES_mRR_b 2
2026: mov edi, ez%1
2027: MEMREAD
2028: DO_RES dl, %2
2029: MEMWRITE
2030:
2031: DO_CYCLES
2032: NEXT
2033: %endmacro
2034:
2035: ; Bit-clear (XY+dd)
2036: ; RES_mXY_b bit
2037: %macro RES_mXY_b 1
2038: MEMREAD
2039: DO_RES dl, %1
2040: MEMWRITE
2041:
2042: DO_CYCLES
2043: NEXT
2044: %endmacro
2045:
2046: ; Bit-clear (XY+dd), with extra store
2047: ; RES_mXY_b_R bit, dest8
2048: %macro RES_mXY_b_R 2
2049: MEMREAD
2050: DO_RES dl, %1
2051: mov z%2, dl
2052: MEMWRITE
2053:
2054: DO_CYCLES
2055: NEXT
2056: %endmacro
2057:
2058: ; Bit-set a register
2059: ; SET_R_b src8, bit
2060: %macro SET_R_b 2
2061: DO_SET z%1, %2
2062:
2063: DO_CYCLES
2064: NEXT
2065: %endmacro
2066:
2067: ; Bit-set (RR)
2068: ; SET_mRR_b src16, bit
2069: %macro SET_mRR_b 2
2070: mov edi, ez%1
2071: MEMREAD
2072: DO_SET dl, %2
2073: MEMWRITE
2074:
2075: DO_CYCLES
2076: NEXT
2077: %endmacro
2078:
2079: ; Bit-set (XY+dd)
2080: ; SET_mXY_b bit
2081: %macro SET_mXY_b 1
2082: MEMREAD
2083: DO_SET dl, %1
2084: MEMWRITE
2085:
2086: DO_CYCLES
2087: NEXT
2088: %endmacro
2089:
2090: ; Bit-set (XY+dd), with extra store
2091: ; SET_mXY_b_R bit, dest8
2092: %macro SET_mXY_b_R 2
2093: MEMREAD
2094: DO_SET dl, %1
2095: mov z%2, dl
2096: MEMWRITE
2097:
2098: DO_CYCLES
2099: NEXT
2100: %endmacro
2101:
2102: ; Jump to an absolute address
2103: ; JP_NN
2104: %macro JP_NN 0
2105: GETWORD
2106: mov ezPC, edi
2107: DO_CYCLES
2108: NEXT
2109: %endmacro
2110:
2111: ; Jump to an absolute address, conditionally
2112: ; JP_cc_NN nz,cc
2113: %macro JP_cc_NN 2
2114: test zF, FLAG_%2
2115: j%1 near %%dont_take_jump
2116: GETWORD
2117: mov ezPC, edi
2118: DO_CYCLES
2119: NEXT
2120:
2121: ALIGN
2122: %%dont_take_jump:
2123: add zPC, 2 ; skip address
2124: DO_CYCLES
2125: NEXT
2126: %endmacro
2127:
2128: ; Jump to an relative address
2129: ; JR_N
2130: %macro JR_N 0
2131: GETDISP
2132: add zPC, di
2133: DO_CYCLES
2134: NEXT
2135: %endmacro
2136:
2137: ; Jump to an relative address, conditionally
2138: ; JR_cc_N nz,cc
2139: %macro JR_cc_N 2
2140: test zF, FLAG_%2
2141: j%1 near %%dont_take_jump
2142: GETDISP
2143: add zPC, di
2144: DO_EXTRA_CYCLES
2145: NEXT
2146:
2147: ALIGN
2148: %%dont_take_jump:
2149: inc zPC ; skip over the displacement
2150: DO_CYCLES
2151: NEXT
2152: %endmacro
2153:
2154: ; Jump to an absolute address (in a register)
2155: ; JP_RR addr16
2156: %macro JP_RR 1
2157: mov ezPC, ez%1
2158: DO_CYCLES
2159: NEXT
2160: %endmacro
2161:
2162: ; Decrease B, if non-zero, jump to a relative address
2163: ; DJNZ_N
2164: %macro DJNZ_N 0
2165: dec zB
2166: jz near %%dont_take_jump
2167: GETDISP
2168: add zPC, di
2169: DO_EXTRA_CYCLES
2170: NEXT
2171:
2172: ALIGN
2173: %%dont_take_jump:
2174: inc zPC ; skip over the displacement
2175: DO_CYCLES
2176: NEXT
2177: %endmacro
2178:
2179: ; Call an absolute address
2180: ; CALL_NN
2181: %macro CALL_NN 0
2182: GETWORD
2183: mov edx, ezPC ; write the PC
2184: dec zSP
2185: push edi
2186:
2187: xchg dl, dh
2188: mov edi, ezSP
2189: MEMWRITE
2190: dec zSP
2191: mov edx, ezPC
2192: mov edi, ezSP
2193: MEMWRITE
2194:
2195: pop ezPC ; get the new PC
2196: DO_CYCLES
2197: NEXT
2198: %endmacro
2199:
2200: ; Call an absolute address, conditionally
2201: ; CALL_cc_NN
2202: %macro CALL_cc_NN 2
2203: test zF, FLAG_%2
2204: j%1 near %%dont_take_jump
2205: GETWORD
2206: mov edx, ezPC ; write the PC
2207: push edi
2208:
2209: dec zSP
2210: xchg dl, dh
2211: mov edi, ezSP
2212: MEMWRITE
2213: dec zSP
2214: mov edx, ezPC
2215: mov edi, ezSP
2216: MEMWRITE
2217:
2218: pop ezPC ; get the new PC
2219: DO_CYCLES
2220: NEXT
2221:
2222: ALIGN
2223: %%dont_take_jump:
2224: add zPC, 2 ; skip address
2225: DO_CYCLES
2226: NEXT
2227: %endmacro
2228:
2229: ; Pop the PC
2230: ; RET
2231: %macro RET 0
2232: mov edi, ezSP
2233: MEMREAD
2234: inc zSP
2235: mov ezPC, edx
2236: mov edi, ezSP
2237: MEMREAD
2238: xchg dl, dh
2239: or ezPC, edx
2240: inc zSP
2241:
2242: xor dh, dh
2243: DO_CYCLES
2244: NEXT
2245: %endmacro
2246:
2247: ; Pop the PC, conditionally
2248: ; RET_cc
2249: %macro RET_cc 2
2250: test zF, FLAG_%2
2251: j%1 near %%dont_take_jump
2252: mov edi, ezSP
2253: MEMREAD
2254: inc zSP
2255: mov ezPC, edx
2256: mov edi, ezSP
2257: MEMREAD
2258: xchg dl, dh
2259: or ezPC, edx
2260: inc zSP
2261:
2262: xor dh, dh
2263: DO_CYCLES
2264: NEXT
2265:
2266: ALIGN
2267: %%dont_take_jump:
2268: DO_CYCLES
2269: NEXT
2270: %endmacro
2271:
2272: ; Pop the PC, restore IFF1, signal the BUS
2273: ; RETI
2274: %macro RETI 0
2275: mov edi, ezSP
2276: MEMREAD
2277: mov ezPC, edx
2278: inc zSP
2279: mov edi, ezSP
2280: MEMREAD
2281: xchg dl, dh
2282: or ezPC, edx
2283: inc zSP
2284:
2285: mov dl, [z80_IFF2]
2286: mov [z80_IFF1], dl
2287: call [z80_RetI] ; signal the user handler
2288:
2289: DO_CYCLES
2290: NEXT
2291: %endmacro
2292:
2293: ; Pop the PC, restore IFF1
2294: ; RETN
2295: %macro RETN 0
2296: mov edi, ezSP
2297: MEMREAD
2298: mov ezPC, edx
2299: inc zSP
2300: mov edi, ezSP
2301: MEMREAD
2302: xchg dl, dh
2303: or ezPC, edx
2304: inc zSP
2305:
2306: mov dl, [z80_IFF2]
2307: mov [z80_IFF1], dl
2308: DO_CYCLES
2309: NEXT
2310: %endmacro
2311:
2312: ; Call an absolute address
2313: ; RST addr8
2314: %macro RST 1
2315: dec zSP
2316: mov edx, ezPC ; write the PC
2317: xchg dl, dh
2318: mov edi, ezSP
2319: MEMWRITE
2320: dec zSP
2321: mov edx, ezPC
2322: mov edi, ezSP
2323: MEMWRITE
2324:
2325: mov ezPC, %1 ; get the new PC
2326: DO_CYCLES
2327: NEXT
2328: %endmacro
2329:
2330: ; Out R to R*256+N
2331: ; OUT_N_R src8
2332: %macro OUT_N_R 1
2333: GETBYTE
2334: mov dh, z%1
2335: mov edi, edx
2336: mov dl, z%1
2337: IOWRITE
2338: DO_CYCLES
2339: NEXT
2340: %endmacro
2341:
2342: ; In from R*256+N, into R
2343: ; IN_R_N dest8
2344: %macro IN_R_N 1
2345: GETBYTE
2346: mov dh, z%1
2347: mov edi, edx
2348: IOREAD
2349: mov z%1, dl
2350: DO_CYCLES
2351: NEXT
2352: %endmacro
2353:
2354: ; In from BC
2355: ; IN_R dest8
2356: %macro IN_R 1
2357: mov edi, ezBC
2358: IOREAD
2359: mov dh, zF
2360: and dh, FLAG_C ; keep the old carry
2361: mov z%1, dl
2362: test dl, dl ; other flags come from the result
2363: lahf
2364: and zF, FLAG_S|FLAG_Z|FLAG_P
2365: or zF, dh
2366: %ifdef EMULATE_BITS_3_5
2367: mov [z80_flag35], dl
2368: %endif
2369: xor dh, dh
2370:
2371: DO_CYCLES
2372: NEXT
2373: %endmacro
2374:
2375: ; In from BC, ignore result
2376: ; IN_F
2377: %macro IN_F 0
2378: mov edi, ezBC
2379: IOREAD
2380: mov dh, zF
2381: and dh, FLAG_C ; keep the old carry
2382: test dl, dl ; other flags come from the result
2383: lahf
2384: and zF, FLAG_S|FLAG_Z|FLAG_P
2385: or zF, dh
2386: %ifdef EMULATE_BITS_3_5
2387: mov [z80_flag35], dl
2388: %endif
2389: xor dh, dh
2390:
2391: DO_CYCLES
2392: NEXT
2393: %endmacro
2394:
2395: ; Out to BC
2396: ; OUT_R src8
2397: %macro OUT_R 1
2398: mov edi, ezBC
2399: mov dl, z%1
2400: IOWRITE
2401: DO_CYCLES
2402: NEXT
2403: %endmacro
2404:
2405: ; Out zero to BC
2406: ; OUT_0
2407: %macro OUT_0 0
2408: mov edi, ezBC
2409: xor dl, dl
2410: IOWRITE
2411: DO_CYCLES
2412: NEXT
2413: %endmacro
2414:
2415: ; In from BC into (HL), increase HL, decrease B
2416: %macro INI 0
2417: ; FIXME - Parity flag is not emulated
2418: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2419:
2420: IOREAD ; read from the port
2421: mov edi, ezHL
2422: %ifdef EMULATE_WEIRD_STUFF
2423: push edx ; preserve the value
2424: %endif
2425: MEMWRITE ; write to (HL)
2426: %ifdef EMULATE_WEIRD_STUFF
2427: pop edx
2428: %endif
2429:
2430: inc zHL ; increase HL
2431: dec zB ; decrease B
2432: %ifdef EMULATE_BITS_3_5
2433: mov [z80_flag35], zB
2434: %endif
2435:
2436: lahf
2437: and zF, FLAG_S|FLAG_Z|FLAG_P
2438:
2439: ; This is a prime example of the weirdness of the Z80...
2440: %ifdef EMULATE_WEIRD_STUFF
2441: mov dh, zC
2442: inc dh
2443: add dh, dl
2444: jnc %%no_carry
2445: or zF, FLAG_H|FLAG_C
2446: %%no_carry:
2447: shr dl, 6
2448: and edx, FLAG_N
2449: or zF, dl
2450: %endif
2451: DO_CYCLES
2452: NEXT
2453: %endmacro
2454:
2455: ; In from BC into (HL), decrease HL, decrease B
2456: %macro IND 0
2457: ; FIXME - Parity flag is not emulated
2458: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2459:
2460: IOREAD ; read from the port
2461: mov edi, ezHL
2462: %ifdef EMULATE_WEIRD_STUFF
2463: push edx ; preserve the value
2464: %endif
2465: MEMWRITE ; write to (HL)
2466: %ifdef EMULATE_WEIRD_STUFF
2467: pop edx
2468: %endif
2469:
2470: dec zHL ; increase HL
2471: dec zB ; decrease B
2472: %ifdef EMULATE_BITS_3_5
2473: mov [z80_flag35], zB
2474: %endif
2475:
2476: lahf
2477: and zF, FLAG_S|FLAG_Z|FLAG_P
2478:
2479: ; This is a prime example of the weirdness of the Z80...
2480: %ifdef EMULATE_WEIRD_STUFF
2481: mov dh, zC
2482: dec dh
2483: add dh, dl
2484: jnc %%no_carry
2485: or zF, FLAG_H|FLAG_C
2486: %%no_carry:
2487: shr dl, 6
2488: and edx, FLAG_N
2489: or zF, dl
2490: %endif
2491: DO_CYCLES
2492: NEXT
2493: %endmacro
2494:
2495: ; In from BC into (HL), increase HL, decrease B, repeat
2496: %macro INIR 0
2497: ; FIXME - Parity flag is not emulated
2498: %%inir_loop:
2499: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2500:
2501: IOREAD ; read from the port
2502: mov edi, ezHL
2503: %ifdef EMULATE_WEIRD_STUFF
2504: push edx ; preserve the value
2505: %endif
2506: MEMWRITE ; write to (HL)
2507: %ifdef EMULATE_WEIRD_STUFF
2508: pop edx
2509: %endif
2510:
2511: inc zHL ; increase HL
2512: dec zB ; decrease B
2513: jz %%inir_zero
2514:
2515: sub [z80_ICount], dword extra_cycles
2516: ja near %%inir_loop ; repeat while cycles left and B>0
2517:
2518: ; out of cycles, but operation not finished
2519: %ifdef EMULATE_BITS_3_5
2520: mov [z80_flag35], zB
2521: %endif
2522:
2523: mov zF, zB
2524: and zF, FLAG_S
2525:
2526: ; This is a prime example of the weirdness of the Z80...
2527: %ifdef EMULATE_WEIRD_STUFF
2528: mov dh, zC
2529: inc dh
2530: add dh, dl
2531: jnc %%no_carry
2532: or zF, FLAG_H|FLAG_C
2533: %%no_carry:
2534: shr dl, 6
2535: and edx, FLAG_N
2536: or zF, dl
2537: %endif
2538: sub zPC, 2 ; rewind to instruction start
2539: EXIT
2540:
2541: ; B=0
2542: %%inir_zero:
2543: mov zF, FLAG_Z|FLAG_P
2544: %ifdef EMULATE_BITS_3_5
2545: mov [z80_flag35], zF
2546: %endif
2547:
2548: ; This is a prime example of the weirdness of the Z80...
2549: %ifdef EMULATE_WEIRD_STUFF
2550: mov dh, zC
2551: inc dh
2552: add dh, dl
2553: jnc %%no_carry2
2554: or zF, FLAG_H|FLAG_C
2555: %%no_carry2:
2556: shr dl, 6
2557: and edx, FLAG_N
2558: or zF, dl
2559: %endif
2560: DO_CYCLES
2561: NEXT
2562: %endmacro
2563:
2564: ; In from BC into (HL), decrease HL, decrease B, repeat
2565: %macro INDR 0
2566: ; FIXME - Parity flag is not emulated
2567: %%indr_loop:
2568: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2569:
2570: IOREAD ; read from the port
2571: mov edi, ezHL
2572: %ifdef EMULATE_WEIRD_STUFF
2573: push edx ; preserve the value
2574: %endif
2575: MEMWRITE ; write to (HL)
2576: %ifdef EMULATE_WEIRD_STUFF
2577: pop edx
2578: %endif
2579:
2580: dec zHL ; decrease HL
2581: dec zB ; decrease B
2582: jz %%indr_zero
2583:
2584: sub [z80_ICount], dword extra_cycles
2585: ja near %%indr_loop ; repeat while cycles left and B>0
2586:
2587: ; out of cycles, but operation not finished
2588: %ifdef EMULATE_BITS_3_5
2589: mov [z80_flag35], zB
2590: %endif
2591:
2592: mov zF, zB
2593: and zF, FLAG_S
2594:
2595: ; This is a prime example of the weirdness of the Z80...
2596: %ifdef EMULATE_WEIRD_STUFF
2597: mov dh, zC
2598: inc dh
2599: add dh, dl
2600: jnc %%no_carry
2601: or zF, FLAG_H|FLAG_C
2602: %%no_carry:
2603: shr dl, 6
2604: and edx, FLAG_N
2605: or zF, dl
2606: %endif
2607: sub zPC, 2 ; rewind to instruction start
2608: EXIT
2609:
2610: ; B=0
2611: %%indr_zero:
2612: mov zF, FLAG_Z|FLAG_P
2613: %ifdef EMULATE_BITS_3_5
2614: mov [z80_flag35], zF
2615: %endif
2616:
2617: ; This is a prime example of the weirdness of the Z80...
2618: %ifdef EMULATE_WEIRD_STUFF
2619: mov dh, zC
2620: inc dh
2621: add dh, dl
2622: jnc %%no_carry2
2623: or zF, FLAG_H|FLAG_C
2624: %%no_carry2:
2625: shr dl, 6
2626: and edx, FLAG_N
2627: or zF, dl
2628: %endif
2629: DO_CYCLES
2630: NEXT
2631: %endmacro
2632:
2633: ; Out from (HL) into BC, increase HL, decrease B
2634: %macro OUTI 0
2635: ; FIXME - Parity flag is not emulated
2636: mov edi, ezHL
2637:
2638: MEMREAD ; read from (HL)
2639: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2640: %ifdef EMULATE_WEIRD_STUFF
2641: push edx ; preserve the value
2642: %endif
2643: IOWRITE ; write to the port
2644: %ifdef EMULATE_WEIRD_STUFF
2645: pop edx
2646: %endif
2647:
2648: inc zHL ; increase HL
2649: dec zB ; decrease B
2650: %ifdef EMULATE_BITS_3_5
2651: mov [z80_flag35], zB
2652: %endif
2653:
2654: lahf
2655: and zF, FLAG_S|FLAG_Z|FLAG_P
2656:
2657: ; This is a prime example of the weirdness of the Z80...
2658: %ifdef EMULATE_WEIRD_STUFF
2659: mov dh, zC
2660: inc dh
2661: add dh, dl
2662: jnc %%no_carry
2663: or zF, FLAG_H|FLAG_C
2664: %%no_carry:
2665: shr dl, 6
2666: and edx, FLAG_N
2667: or zF, dl
2668: %endif
2669: DO_CYCLES
2670: NEXT
2671: %endmacro
2672:
2673: ; Out from (HL) into BC, decrease HL, decrease B
2674: %macro OUTD 0
2675: ; FIXME - Parity flag is not emulated
2676: mov edi, ezHL
2677:
2678: MEMREAD ; read from (HL)
2679: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2680: %ifdef EMULATE_WEIRD_STUFF
2681: push edx ; preserve the value
2682: %endif
2683: IOWRITE ; write to the port
2684: %ifdef EMULATE_WEIRD_STUFF
2685: pop edx
2686: %endif
2687:
2688: dec zHL ; decrease HL
2689: dec zB ; decrease B
2690: %ifdef EMULATE_BITS_3_5
2691: mov [z80_flag35], zB
2692: %endif
2693:
2694: lahf
2695: and zF, FLAG_S|FLAG_Z|FLAG_P
2696:
2697: ; This is a prime example of the weirdness of the Z80...
2698: %ifdef EMULATE_WEIRD_STUFF
2699: mov dh, zC
2700: inc dh
2701: add dh, dl
2702: jnc %%no_carry
2703: or zF, FLAG_H|FLAG_C
2704: %%no_carry:
2705: shr dl, 6
2706: and edx, FLAG_N
2707: or zF, dl
2708: %endif
2709: DO_CYCLES
2710: NEXT
2711: %endmacro
2712:
2713: ; Out from (HL) into BC, increase HL, decrease B, repeat
2714: %macro OTIR 0
2715: %%otir_loop:
2716: mov edi, ezHL
2717: MEMREAD
2718: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2719: %ifdef EMULATE_WEIRD_STUFF
2720: push edx ; preserve the value
2721: %endif
2722: IOWRITE
2723: %ifdef EMULATE_WEIRD_STUFF
2724: pop edx
2725: %endif
2726:
2727: inc zHL
2728: dec zB
2729: jz %%otir_zero
2730:
2731: %ifdef EMULATE_R_REGISTER
2732: inc zR
2733: %endif
2734: sub [z80_ICount], dword extra_cycles
2735: ja near %%otir_loop
2736:
2737: ; out of cycles, but not finished
2738: %ifdef EMULATE_BITS_3_5
2739: mov [z80_flag35], zB
2740: %endif
2741:
2742: mov zF, zB
2743: and zF, FLAG_S
2744:
2745: %ifdef EMULATE_WEIRD_STUFF
2746: mov dh, zC
2747: inc dh
2748: add dh, dl
2749: jnc %%otir_nocarry
2750: or zF, FLAG_H|FLAG_C
2751: %%otir_nocarry:
2752: shr dl, 6
2753: and edx, FLAG_N
2754: or zF, dl
2755: %endif
2756: sub zPC, 2 ; rewind to instruction start
2757: EXIT
2758:
2759: %%otir_zero:
2760: mov zF, FLAG_Z|FLAG_P
2761: %ifdef EMULATE_BITS_3_5
2762: mov [z80_flag35], zF
2763: %endif
2764: %ifdef EMULATE_WEIRD_STUFF
2765: mov dh, zC
2766: inc dh
2767: add dh, dl
2768: jnc %%otir_nocarry2
2769: or zF, FLAG_H|FLAG_C
2770: %%otir_nocarry2:
2771: shr dl, 6
2772: and edx, FLAG_N
2773: or zF, dl
2774: %endif
2775: DO_CYCLES
2776: NEXT
2777: %endmacro
2778:
2779: ; Out from (HL) into BC, decrease HL, decrease B, repeat
2780: %macro OTDR 0
2781: %%otdr_loop:
2782: mov edi, ezHL
2783: MEMREAD
2784: movzx edi, zC ; high byte clear? (documentation is fuzzy)
2785: %ifdef EMULATE_WEIRD_STUFF
2786: push edx ; preserve the value
2787: %endif
2788: IOWRITE
2789: %ifdef EMULATE_WEIRD_STUFF
2790: pop edx
2791: %endif
2792:
2793: dec zHL
2794: dec zB
2795: jz %%otdr_zero
2796:
2797: %ifdef EMULATE_R_REGISTER
2798: inc zR
2799: %endif
2800: sub [z80_ICount], dword extra_cycles
2801: ja near %%otdr_loop
2802:
2803: ; out of cycles, but not finished
2804: %ifdef EMULATE_BITS_3_5
2805: mov [z80_flag35], zB
2806: %endif
2807:
2808: mov zF, zB
2809: and zF, FLAG_S
2810:
2811: %ifdef EMULATE_WEIRD_STUFF
2812: mov dh, zC
2813: inc dh
2814: add dh, dl
2815: jnc %%otdr_nocarry
2816: or zF, FLAG_H|FLAG_C
2817: %%otdr_nocarry:
2818: shr dl, 6
2819: and edx, FLAG_N
2820: or zF, dl
2821: %endif
2822: sub zPC, 2 ; rewind to instruction start
2823: EXIT
2824:
2825: %%otdr_zero:
2826: mov zF, FLAG_Z|FLAG_P
2827: %ifdef EMULATE_BITS_3_5
2828: mov [z80_flag35], zF
2829: %endif
2830: %ifdef EMULATE_WEIRD_STUFF
2831: mov dh, zC
2832: inc dh
2833: add dh, dl
2834: jnc %%otdr_nocarry2
2835: or zF, FLAG_H|FLAG_C
2836: %%otdr_nocarry2:
2837: shr dl, 6
2838: and edx, FLAG_N
2839: or zF, dl
2840: %endif
2841: DO_CYCLES
2842: NEXT
2843: %endmacro
2844:
2845: ; BCD adjust
2846: %macro DAA 0
2847: test zF, FLAG_H
2848: jnz %%daa_h_set
2849: and eax, 03ffh
2850: mov ax, [DAA_Table + eax*2]
2851: %ifdef EMULATE_BITS_3_5
2852: mov [z80_flag35], zF
2853: %endif
2854: DO_CYCLES
2855: NEXT
2856:
2857: %%daa_h_set:
2858: and eax, 03ffh
2859: mov ax, [DAA_Table + eax*2 + 4*512]
2860: %ifdef EMULATE_BITS_3_5
2861: mov [z80_flag35], zF
2862: %endif
2863: DO_CYCLES
2864: NEXT
2865: %endmacro
2866:
2867: ; Complement A
2868: %macro CPL 0
2869: not zA
2870: or zF, FLAG_H|FLAG_N
2871: %ifdef EMULATE_BITS_3_5
2872: mov [z80_flag35], zA
2873: %endif
2874: DO_CYCLES
2875: NEXT
2876: %endmacro
2877:
2878: ; Negate A
2879: %macro NEG 0
2880: neg zA
2881: lahf
2882: %ifdef EMULATE_BITS_3_5
2883: mov [z80_flag35], zA
2884: %endif
2885: jo %%neg_overflow
2886: and zF, ~FLAG_P
2887: DO_CYCLES
2888: NEXT
2889:
2890: %%neg_overflow:
2891: or zF, FLAG_P
2892: DO_CYCLES
2893: NEXT
2894: %endmacro
2895:
2896: ; Set carry flag
2897: %macro SCF 0
2898: and zF, FLAG_S|FLAG_Z|FLAG_P
2899: or zF, FLAG_C
2900: %ifdef EMULATE_BITS_3_5
2901: mov [z80_flag35], zA
2902: %endif
2903: DO_CYCLES
2904: NEXT
2905: %endmacro
2906:
2907: ; Complement carry flag
2908: %macro CCF 0
2909: test zF, FLAG_C
2910: jz %%set_carry
2911: and zF, FLAG_S|FLAG_Z|FLAG_P
2912: or zF, FLAG_H
2913: %ifdef EMULATE_BITS_3_5
2914: mov [z80_flag35], zA
2915: %endif
2916: DO_CYCLES
2917: NEXT
2918:
2919: %%set_carry:
2920: SCF
2921: %endmacro
2922:
2923: ; No operation
2924: %macro NOP 0
2925: DO_CYCLES
2926: NEXT
2927: %endmacro
2928:
2929: ; Halt the processor
2930: %macro HALT 0
2931: and [z80_ICount], dword 3
2932: sub [z80_ICount], dword 4
2933: mov [z80_halted], byte 1
2934: EXIT
2935: %endmacro
2936:
2937: ; Enable interrupts
2938: %macro EI 0
2939: mov dl, FLAG_P ; set the P/V bit, for use in "LD I,A" etc
2940: mov [z80_IFF1], dl
2941: mov [z80_IFF2], dl
2942:
2943: ; force the next instruction to be executed, regardless of ICount
2944: ; then force an IRQ check after it.
2945: mov [z80_afterEI], byte 1
2946: push eax
2947: mov eax, [z80_ICount] ; set ICount to zero, so it will terminate
2948: mov [z80_TempICount], eax ; after the next instruction.
2949: mov [z80_ICount], dword 1 ; we can then pick it up again and carry on.
2950: pop eax
2951: NEXT
2952: %endmacro
2953:
2954: ; Disable interrupts
2955: %macro DI 0
2956: xor edx, edx
2957: mov [z80_IFF1], dl
2958: mov [z80_IFF2], dl
2959: DO_CYCLES
2960: NEXT
2961: %endmacro
2962:
2963: ; Set interrupt mode
2964: %macro IM 1
2965: mov [z80_IM], byte %1
2966: DO_CYCLES
2967: NEXT
2968: %endmacro
2969:
2970: ;----------------------------------------------------------------------------;
2971: ; Bring in the opcodes...
2972: %include 'raze.inc'
2973: ;----------------------------------------------------------------------------;
2974:
2975: ;----------------------------------------------------------------------------;
2976: ; Support functions:
2977:
2978: DEF op, cb, 0, 0
2979: %ifdef EMULATE_R_REGISTER
2980: inc zR
2981: %endif
2982: GETBYTE
2983: jmp [CBTable+edx*4]
2984:
2985: DEF op, ed, 0, 0
2986: %ifdef EMULATE_R_REGISTER
2987: inc zR
2988: %endif
2989: GETBYTE
2990: jmp [EDTable+edx*4]
2991:
2992: DEF op, dd, 0, 0
2993: %ifdef EMULATE_R_REGISTER
2994: inc zR
2995: %endif
2996: GETBYTE
2997: jmp [DDTable+edx*4]
2998:
2999: DEF op, fd, 0, 0
3000: %ifdef EMULATE_R_REGISTER
3001: inc zR
3002: %endif
3003: GETBYTE
3004: jmp [FDTable+edx*4]
3005:
3006: DEF dd, cb, 0, 0
3007: %ifdef EMULATE_R_REGISTER
3008: inc zR
3009: %endif
3010: GETDISP
3011: add di, zIX
3012: push edi
3013: GETBYTE
3014: pop edi
3015: jmp [DDCBTable+edx*4]
3016:
3017: DEF fd, cb, 0, 0
3018: %ifdef EMULATE_R_REGISTER
3019: inc zR
3020: %endif
3021: GETDISP
3022: add di, zIY
3023: push edi
3024: GETBYTE
3025: pop edi
3026: jmp [DDCBTable+edx*4]
3027:
3028: DEF ed, xx, 8, 0
3029: %ifdef EMULATE_R_REGISTER
3030: inc zR
3031: %endif
3032: DO_CYCLES
3033: NEXT
3034:
3035: DEF dd, xx, 4, 0
3036: dec zPC
3037: DO_CYCLES
3038: NEXT
3039:
3040: DEF fd, xx, 0, 0
3041: dec zPC
3042: DO_CYCLES
3043: NEXT
3044:
3045: ; called when out-of-cycles
3046: z80_finish:
3047: cmp [z80_afterEI], byte 1 ; test for the post-EI behaviour
3048: jne near really_finish
3049: push eax
3050: mov eax, [z80_TempICount]
3051: mov [z80_ICount], eax
3052: mov [z80_afterEI], byte 0
3053: pop eax
3054: CHECK_IRQ
3055: sub dword [z80_ICount], 4 ; subtract EI's cycles
3056: jbe near z80_finish
3057: NEXT
3058:
3059: really_finish:
3060: ; merge bits 3 and 5 of the flags into the regs
3061: and zF, ~(FLAG_3|FLAG_5)
3062: mov dl, [z80_flag35]
3063: and dl, FLAG_3|FLAG_5
3064: or zF, dl
3065:
3066: mov [z80_AF], ezAF
3067: mov [z80_HL], ezHL
3068: mov [z80_BC], ezBC
3069: mov [z80_PC], ezPC
3070: mov [z80_R], zR
3071: pop ebp
3072: pop edi
3073: pop esi
3074: pop ebx
3075: mov eax, [z80_Initial_ICount]
3076: sub eax, [z80_ICount]
3077: ret
3078:
3079: z80_default_in:
3080: z80_default_read:
3081: mov eax, 0ffh
3082: ret
3083:
3084: z80_default_out:
3085: z80_default_write:
3086: z80_default_reti:
3087: z80_default_fetch_callback:
3088: ret
3089:
3090: ; called to look up a read handler
3091: ; address is on the stack
3092: read_dispatcher:
3093: mov eax, [esp+4]
3094: mov edx, _read_handlers
3095: rd_find:
3096: add edx, 16
3097: cmp [edx-16], eax
3098: ja rd_find
3099: cmp [edx-12], eax
3100: jb rd_find
3101:
3102: cmp [edx-8], dword 1
3103: je rd_handler
3104:
3105: add eax, [edx-4]
3106: movzx eax, byte [eax]
3107: ret
3108:
3109: rd_handler:
3110: jmp [edx-4] ; call the GCC function
3111:
3112: ; called to look up a write handler
3113: ; address+value are on the stack
3114: write_dispatcher:
3115: mov eax, [esp+4]
3116: mov edx, _write_handlers
3117: wd_find:
3118: add edx, 16
3119: cmp [edx-16], eax
3120: ja wd_find
3121: cmp [edx-12], eax
3122: jb wd_find
3123:
3124: cmp [edx-8], dword 1
3125: je wd_handler
3126:
3127: add eax, [edx-4]
3128: mov ecx, [esp+8]
3129: mov [eax], cl
3130: ret
3131:
3132: wd_handler:
3133: jmp [edx-4] ; call the GCC function
3134:
3135: ; int z80_emulate(int cycles)
3136: ; Emulate for 'cycles' T-states,
3137: ; Returns the number of cycles actually emulated.
3138: cglobal z80_emulate
3139: z80_emulate:
3140: mov eax, [esp+4]
3141: push ebx
3142: push esi
3143: push edi
3144: push ebp
3145:
3146: add eax, [z80_Extra_Cycles]
3147: mov [z80_ICount], eax
3148: mov [z80_Initial_ICount], eax
3149: xor edx, edx
3150: xor edi, edi
3151: mov [z80_Extra_Cycles], edx
3152: mov [z80_afterEI], dl
3153: mov ezAF, [z80_AF]
3154: mov ezHL, [z80_HL]
3155: mov ezBC, [z80_BC]
3156: mov ezPC, [z80_PC]
3157: mov zR, [z80_R]
3158: mov [z80_flag35], zF ; take out bits 3/5
3159: cmp [z80_halted], byte 0
3160: je not_halted
3161: and [z80_ICount], dword 3 ; If we're halted, just skip it all.
3162: sub [z80_ICount], dword 4
3163: EXIT
3164: not_halted:
3165: NEXT
3166:
3167: ; void z80_reset(void)
3168: ; Resets the Z80.
3169: cglobal z80_reset
3170: z80_reset:
3171: push edi
3172: xor eax, eax ; just zero it all
3173: mov edi, context_start
3174: mov ecx, (registers_end - context_start)
3175: rep stosb
3176: pop edi
3177: mov [z80_IX], word 0ffffh
3178: mov [z80_IY], word 0ffffh
3179: mov [z80_AF], word 04000h
3180: ret
3181:
3182: ; void z80_raise_IRQ(UBYTE vector)
3183: ; Causes an interrupt with the given vector.
3184: ; In IM 0, the vector has to be an RST opcode.
3185: ; If interrupts are disabled, the interrupt will still happen as long as
3186: ; the IRQ line stays raised.
3187: cglobal z80_raise_IRQ
3188: z80_raise_IRQ:
3189: mov [z80_IRQLine], byte 1
3190: mov eax, [esp+4]
3191: mov [z80_IRQVector], al
3192:
3193: xor edx, edx
3194: push ebx
3195: push esi
3196: push edi
3197: push ebp
3198: CALLGCC_END ; grab our Z80 regs
3199:
3200: CHECK_IRQ
3201:
3202: CALLGCC_START
3203: pop ebp
3204: pop edi
3205: pop esi
3206: pop ebx
3207: ret
3208:
3209: ; void z80_lower_IRQ(void)
3210: ; Lowers the IRQ line.
3211: cglobal z80_lower_IRQ
3212: z80_lower_IRQ:
3213: mov [z80_IRQLine], byte 0
3214: ret
3215:
3216: ; void z80_cause_NMI(void)
3217: ; Causes a non-maskable interrupt.
3218: ; This will always be accepted.
3219: ; There is no raise/lower functions, as the NMI is edge-triggered.
3220: cglobal z80_cause_NMI
3221: z80_cause_NMI:
3222: xor edx, edx
3223: push ebx
3224: push esi
3225: push edi
3226: push ebp
3227: CALLGCC_END ; grab our Z80 regs
3228:
3229: ; disable interrupts
3230: mov [z80_IFF1], byte 0
3231:
3232: ; take up 11 T-states
3233: add [z80_Extra_Cycles], dword 11
3234: %ifdef EMULATE_R_REGISTER
3235: inc zR
3236: %endif
3237:
3238: mov [z80_halted], byte 0 ; Un-HALT us.
3239:
3240: mov edx, ezPC ; write the PC
3241: dec zSP
3242:
3243: xchg dl, dh
3244: mov edi, ezSP
3245: MEMWRITE
3246: dec zSP
3247: mov edx, ezPC
3248: mov edi, ezSP
3249: MEMWRITE
3250:
3251: mov ezPC, 66h ; set the new PC
3252:
3253: CALLGCC_START
3254: pop ebp
3255: pop edi
3256: pop esi
3257: pop ebx
3258: ret
3259:
3260: ; int z80_get_context_size(void)
3261: ; Returns the size of the context, in bytes
3262: cglobal z80_get_context_size
3263: z80_get_context_size:
3264: mov eax, (context_end - context_start) + 4 ; +4 for a safety buffer
3265: ret
3266:
3267:
3268: ; void z80_set_context(void *context)
3269: ; Copy the given context to the current Z80.
3270: cglobal z80_set_context
3271: z80_set_context:
3272: push esi
3273: push edi
3274: mov ecx, (context_end - context_start) / 4
3275: mov esi, [esp+12]
3276: mov edi, context_start
3277: rep movsd
3278: pop edi
3279: pop esi
3280: ret
3281:
3282: ; void z80_get_context(void *context)
3283: ; Copy the current Z80 to the given context.
3284: cglobal z80_get_context
3285: z80_get_context:
3286: push esi
3287: push edi
3288: mov ecx, (context_end - context_start) / 4
3289: mov edi, [esp+12]
3290: mov esi, context_start
3291: rep movsd
3292: pop edi
3293: pop esi
3294: ret
3295:
3296: ; int z80_get_cycles_elapsed(void)
3297: ; Returns the number of cycles emulated since z80_emulate was called.
3298: cglobal z80_get_cycles_elapsed
3299: z80_get_cycles_elapsed:
3300: mov eax, [z80_Initial_ICount]
3301: sub eax, [z80_ICount]
3302: cmp [z80_afterEI], byte 0
3303: je z80_gcd_fin
3304: sub eax, [z80_TempICount]
3305: z80_gcd_fin:
3306: ret
3307:
3308: ; void z80_stop_emulating(void)
3309: ; Stops the emulation dead. (waits for the current instruction to finish
3310: ; first though).
3311: ; The return value from z80_execute will obviously be lower than expected.
3312: cglobal z80_stop_emulating
3313: z80_stop_emulating:
3314: mov eax, [z80_ICount]
3315: sub [z80_Initial_ICount], eax
3316: cmp [z80_afterEI], byte 0
3317: je z80_se_fin
3318: mov ecx, [z80_TempICount]
3319: sub [z80_Initial_ICount], ecx
3320: z80_se_fin:
3321: mov [z80_ICount], dword 0
3322: mov [z80_TempICount], dword 0
3323: ret
3324:
3325: ; void z80_skip_idle(void)
3326: ; Stops the emulation dead. (waits for the current instruction to finish
3327: ; first though).
3328: ; The return value from z80_execute will appear as though it had executed
3329: ; all the instructions like normal.
3330: cglobal z80_skip_idle
3331: z80_skip_idle:
3332: mov [z80_ICount], dword 0
3333: mov [z80_TempICount], dword 0
3334: ret
3335:
3336: ; void z80_do_wait_states(int n)
3337: ; Halts the CPU temporarily, to execute 'n' memory wait states.
3338: cglobal z80_do_wait_states
3339: z80_do_wait_states:
3340: add [z80_Initial_ICount], eax
3341: ret
3342:
3343: ; UWORD z80_get_reg(z80_register reg)
3344: ; Return the value of the specified register.
3345: cglobal z80_get_reg
3346: z80_get_reg:
3347: mov ecx, [esp+4]
3348: cmp ecx, Z80_REG_HL2
3349: mov eax, [context_start + ecx*4]
3350: jbe getreg_simple
3351:
3352: cmp ecx, Z80_REG_IFF1
3353: mov al, [z80_IFF1]
3354: je getreg_boolean
3355:
3356: cmp ecx, Z80_REG_IFF2
3357: mov al, [z80_IFF2]
3358: je getreg_boolean
3359:
3360: cmp ecx, Z80_REG_IRQLine
3361: mov al, [z80_IRQLine]
3362: je getreg_boolean
3363:
3364: cmp ecx, Z80_REG_Halted
3365: mov al, [z80_halted]
3366: je getreg_boolean
3367:
3368: cmp ecx, Z80_REG_IM
3369: movzx eax, byte [z80_IM]
3370: je getreg_finish
3371:
3372: cmp ecx, Z80_REG_IRQVector
3373: movzx eax, byte [z80_IRQVector]
3374: je getreg_finish
3375:
3376: ; construct IR
3377: mov eax, [z80_R]
3378: and eax, 7fh
3379: mov edx, [z80_R2]
3380: and edx, 80h
3381: or eax, edx
3382: mov ah, byte [z80_I]
3383: ret
3384:
3385: getreg_simple:
3386: cmp ecx, Z80_REG_AF
3387: je getreg_swap
3388: cmp ecx, Z80_REG_AF2
3389: je getreg_swap
3390: getreg_finish:
3391: ret
3392: getreg_swap:
3393: xchg al, ah ; swap A and F
3394: ret
3395:
3396: getreg_boolean:
3397: and eax, 0ffh
3398: jz getreg_finish
3399: mov al, 1
3400: ret
3401:
3402: ; void z80_set_reg(z80_register reg, UWORD value)
3403: ; Set the specified register to a new value.
3404: cglobal z80_set_reg
3405: z80_set_reg:
3406: mov ecx, [esp+4]
3407: mov eax, [esp+8]
3408: and eax, 0ffffh
3409: cmp ecx, Z80_REG_HL2
3410: jbe setreg_simple
3411:
3412: cmp ecx, Z80_REG_IFF1
3413: lea edx, [z80_IFF1]
3414: jbe setreg_boolean
3415:
3416: cmp ecx, Z80_REG_IFF2
3417: lea edx, [z80_IFF2]
3418: jbe setreg_boolean
3419:
3420: cmp ecx, Z80_REG_IRQLine
3421: lea edx, [z80_IRQLine]
3422: je setreg_boolean
3423:
3424: cmp ecx, Z80_REG_Halted
3425: lea edx, [z80_halted]
3426: je setreg_boolean
3427:
3428: cmp ecx, Z80_REG_IM
3429: lea edx, [z80_IM]
3430: je setreg_value
3431:
3432: cmp ecx, Z80_REG_IRQVector
3433: lea edx, [z80_IRQVector]
3434: je setreg_value
3435:
3436: ; deconstruct IR
3437: mov [z80_I], ah
3438: mov [z80_R2], eax
3439: mov [z80_R], eax
3440: ret
3441:
3442: setreg_simple:
3443: cmp ecx, Z80_REG_AF
3444: je setreg_swap
3445: cmp ecx, Z80_REG_AF2
3446: je setreg_swap
3447: setreg_finish:
3448: mov [context_start + ecx*4], eax
3449: ret
3450: setreg_swap:
3451: xchg al, ah ; swap A and F
3452: mov [context_start + ecx*4], eax
3453: ret
3454:
3455: setreg_boolean:
3456: test eax, eax
3457: jz setreg_value
3458: mov al, FLAG_P
3459:
3460: setreg_value:
3461: mov [edx], al
3462: ret
3463:
3464: ; void z80_init_memmap(void)
3465: ; Reset the current memory map
3466: cglobal z80_init_memmap
3467: z80_init_memmap:
3468: mov [z80_In], dword z80_default_in
3469: mov [z80_Out], dword z80_default_out
3470: mov [z80_RetI], dword z80_default_reti
3471: mov [z80_Fetch_Callback], dword z80_default_fetch_callback
3472:
3473: push edi ; clear the memory handlers
3474: mov eax, -1
3475: mov ecx, MAX_MEM_HANDLERS*4
3476: mov edi, _read_handlers
3477: rep stosd
3478: mov ecx, MAX_MEM_HANDLERS*4
3479: mov edi, _write_handlers
3480: rep stosd
3481:
3482: ; reset the read table
3483: mov edi, z80_Read
3484: mov ecx, 100h
3485: clear_read:
3486: mov [edi], dword z80_default_read
3487: add edi, 8
3488: loop clear_read
3489:
3490: ; reset the write table
3491: mov edi, z80_Write
3492: mov ecx, 100h
3493: clear_write:
3494: mov [edi], dword z80_default_write
3495: add edi, 8
3496: loop clear_write
3497:
3498: pop edi
3499: ret
3500:
3501: ; void z80_end_memmap(void)
3502: ; Finishes the current memory map
3503: cglobal z80_end_memmap
3504: z80_end_memmap:
3505: ; put the entry at the end of the read table
3506: mov edx, _read_handlers
3507: er_find:
3508: add edx, 16
3509: cmp [edx-16], dword (-1)
3510: jne er_find
3511: sub edx, 16
3512:
3513: ; put it in there
3514: mov [edx], dword 0
3515: mov [edx+4], dword 0ffffh
3516: mov [edx+8], dword 0
3517: mov [edx+12], dword z80_default_read
3518:
3519: ; put the entry at the end of the write table
3520: mov edx, _write_handlers
3521: ew_find:
3522: add edx, 16
3523: cmp [edx-16], dword (-1)
3524: jne ew_find
3525: sub edx, 16
3526:
3527: ; put it in there
3528: mov [edx], dword 0
3529: mov [edx+4], dword 0ffffh
3530: mov [edx+8], dword 0
3531: mov [edx+12], dword z80_default_write
3532: ret
3533:
3534: ; void z80_map_fetch(UWORD start, UWORD end, UBYTE *memory)
3535: ; Set the given area for op-code fetching
3536: ; start/end = the area it covers
3537: ; memory = the ROM/RAM to read from
3538: cglobal z80_map_fetch
3539: z80_map_fetch:
3540: push ebx
3541: mov eax, [esp+8]
3542: mov ebx, [esp+12]
3543: mov ecx, [esp+16]
3544: and eax, 0ffffh
3545: and ebx, 0ffffh
3546: sub ecx, eax
3547:
3548: mf_loop:
3549: ; if there's no area left inbetween, stop now.
3550: mov edx, eax
3551: shr edx, 8
3552:
3553: cmp eax, ebx
3554: ja mf_finish
3555:
3556: mov [z80_Fetch+edx*4], ecx
3557: add eax, 0100h
3558: jmp mf_loop
3559:
3560: mf_finish:
3561: pop ebx
3562: ret
3563:
3564: ; void z80_map_read(UWORD start, UWORD end, UBYTE *memory)
3565: ; Moves a Z80_MAP_MAPPED area to use a different region of memory
3566: ; start/end = the area it covers (must be page-aligned)
3567: ; memory = the ROM/RAM to read from
3568: cglobal z80_map_read
3569: z80_map_read:
3570: push ebx
3571: mov eax, [esp+8]
3572: mov ebx, [esp+12]
3573: mov ecx, [esp+16]
3574: and eax, 0ffffh
3575: and ebx, 0ffffh
3576: sub ecx, eax
3577:
3578: mr_loop:
3579: ; if there's no area left inbetween, stop now.
3580: mov edx, eax
3581: shr edx, 8
3582:
3583: cmp eax, ebx
3584: ja mr_finish
3585:
3586: mov [z80_Read+edx*8], dword 0
3587: mov [z80_Read+edx*8+4], ecx
3588: add eax, 0100h
3589: jmp mr_loop
3590:
3591: mr_finish:
3592: pop ebx
3593: ret
3594:
3595: ; void z80_map_write(UWORD start, UWORD end, UBYTE *memory)
3596: ; Moves a Z80_MAP_MAPPED area to use a different region of memory
3597: ; start/end = the area it covers (must be page-aligned)
3598: ; memory = the ROM/RAM to read from
3599: cglobal z80_map_write
3600: z80_map_write:
3601: push ebx
3602: mov eax, [esp+8]
3603: mov ebx, [esp+12]
3604: mov ecx, [esp+16]
3605: and eax, 0ffffh
3606: and ebx, 0ffffh
3607: sub ecx, eax
3608:
3609: mw_loop:
3610: ; if there's no area left inbetween, stop now.
3611: mov edx, eax
3612: shr edx, 8
3613:
3614: cmp eax, ebx
3615: ja mw_finish
3616:
3617: mov [z80_Write+edx*8], dword 0
3618: mov [z80_Write+edx*8+4], ecx
3619: add eax, 0100h
3620: jmp mw_loop
3621:
3622: mw_finish:
3623: pop ebx
3624: ret
3625:
3626: ; void z80_add_read(UWORD start, UWORD end, int method, void *data)
3627: ; Add a READ memory handler to the memory map
3628: ; start/end = the area it covers
3629: ; method = 0 for direct, 1 for handled
3630: ; data = RAM for direct, handler for handled
3631: cglobal z80_add_read
3632: z80_add_read:
3633: push ebx
3634: mov eax, [esp+8]
3635: mov ebx, [esp+12]
3636: mov ecx, [esp+20]
3637: and eax, 0ffffh
3638: and ebx, 0ffffh
3639:
3640: ; put the entry in the read table first
3641: mov edx, _read_handlers
3642: ar_find:
3643: add edx, 16
3644: cmp [edx-16], dword (-1)
3645: jne ar_find
3646: sub edx, 16
3647:
3648: ; put it in there
3649: mov [edx], eax
3650: mov [edx+4], ebx
3651: mov eax, [esp+16]
3652: mov [edx+8], eax
3653:
3654: mov eax, ecx ; if direct, subtract the start from the memory area
3655: push ebx
3656: mov ebx, [esp+12]
3657: and ebx, 0ffffh
3658: cmp [esp+20], dword 1
3659: je ar_dont_adjust
3660: sub eax, ebx
3661: ar_dont_adjust:
3662: mov [edx+12], eax
3663:
3664: mov eax, ebx
3665: pop ebx
3666:
3667: ; process the start, so it's page aligned
3668: test al, al
3669: jz ar_start_done
3670:
3671: ; put the start handler to go to the dispatcher
3672: mov edx, eax
3673: shr edx, 8
3674: mov [z80_Read+edx*8], dword read_dispatcher
3675: xor al, al
3676: add eax, 0100h
3677:
3678: ar_start_done:
3679: ; process the end, so it's page aligned
3680: cmp bl, 0ffh
3681: je ar_end_done
3682:
3683: ; put the end handler to go to the dispatcher
3684: mov edx, ebx
3685: shr edx, 8
3686: mov [z80_Read+edx*8], dword read_dispatcher
3687: mov bl, 0ffh
3688: sub ebx, 0100h
3689:
3690: ar_end_done:
3691:
3692: sub ecx, eax
3693: ar_loop:
3694: ; if there's no area left inbetween, stop now.
3695: mov edx, eax
3696: shr edx, 8
3697:
3698: cmp eax, ebx
3699: jg ar_finish
3700:
3701: cmp [esp+16], dword 0
3702: je ar_put_direct
3703:
3704: push ecx
3705: mov ecx, [esp+24]
3706: mov [z80_Read+edx*8], ecx
3707: pop ecx
3708: add eax, 0100h
3709: jmp ar_loop
3710:
3711: ar_put_direct:
3712: mov [z80_Read+edx*8], dword 0
3713: mov [z80_Read+edx*8+4], ecx
3714: add eax, 0100h
3715: jmp ar_loop
3716:
3717: ar_finish:
3718: pop ebx
3719: ret
3720:
3721: ; void z80_add_write(UWORD start, UWORD end, int method, void *data)
3722: ; Add a WRITE memory handler to the memory map
3723: ; start/end = the area it covers
3724: ; method = 0 for direct, 1 for handled
3725: ; data = RAM for direct, handler for handled
3726: cglobal z80_add_write
3727: z80_add_write:
3728: push ebx
3729: mov eax, [esp+8]
3730: mov ebx, [esp+12]
3731: mov ecx, [esp+20]
3732: and eax, 0ffffh
3733: and ebx, 0ffffh
3734:
3735: ; put the entry in the read table first
3736: mov edx, _write_handlers
3737: aw_find:
3738: add edx, 16
3739: cmp [edx-16], dword (-1)
3740: jne aw_find
3741: sub edx, 16
3742:
3743: ; put it in there
3744: mov [edx], eax
3745: mov [edx+4], ebx
3746: mov eax, [esp+16]
3747: mov [edx+8], eax
3748:
3749: mov eax, ecx ; if direct, subtract the start from the memory area
3750: push ebx
3751: mov ebx, [esp+12]
3752: and ebx, 0ffffh
3753: cmp [esp+20], dword 1
3754: je aw_dont_adjust
3755: sub eax, ebx
3756: aw_dont_adjust:
3757: mov [edx+12], eax
3758:
3759: mov eax, ebx
3760: pop ebx
3761:
3762: ; process the start, so it's page aligned
3763: test al, al
3764: jz aw_start_done
3765:
3766: ; put the start handler to go to the dispatcher
3767: mov edx, eax
3768: shr edx, 8
3769: mov [z80_Write+edx*8], dword write_dispatcher
3770: xor al, al
3771: add eax, 0100h
3772:
3773: aw_start_done:
3774: ; process the end, so it's page aligned
3775: cmp bl, 0ffh
3776: je aw_end_done
3777:
3778: ; put the end handler to go to the dispatcher
3779: mov edx, ebx
3780: shr edx, 8
3781: mov [z80_Write+edx*8], dword write_dispatcher
3782: mov bl, 0ffh
3783: sub ebx, 0100h
3784:
3785: aw_end_done:
3786:
3787: sub ecx, eax
3788: aw_loop:
3789: ; if there's no area left inbetween, stop now.
3790: mov edx, eax
3791: shr edx, 8
3792:
3793: cmp eax, ebx
3794: jg aw_finish
3795:
3796: cmp [esp+16], dword 0
3797: je aw_put_direct
3798:
3799: push ecx
3800: mov ecx, [esp+24]
3801: mov [z80_Write+edx*8], ecx
3802: pop ecx
3803: add eax, 0100h
3804: jmp aw_loop
3805:
3806: aw_put_direct:
3807: mov [z80_Write+edx*8], dword 0
3808: mov [z80_Write+edx*8+4], ecx
3809: add eax, 0100h
3810: jmp aw_loop
3811:
3812: aw_finish:
3813: pop ebx
3814: ret
3815:
3816: ; void z80_set_in(UBYTE (*handler)(UWORD port))
3817: ; Set the IN port handler to the given function
3818: cglobal z80_set_in
3819: z80_set_in:
3820: mov eax, [esp+4]
3821: mov [z80_In], eax
3822: ret
3823:
3824: ; void z80_set_out(void (*handler)(UWORD port, UBYTE value))
3825: ; Set the OUT port handler to the given function
3826: cglobal z80_set_out
3827: z80_set_out:
3828: mov eax, [esp+4]
3829: mov [z80_Out], eax
3830: ret
3831:
3832: ; void z80_set_reti(void (*handler)(void))
3833: ; Set the RETI handler to the given function
3834: cglobal z80_set_reti
3835: z80_set_reti:
3836: mov eax, [esp+4]
3837: mov [z80_RetI], eax
3838: ret
3839:
3840: ; void z80_set_fetch_callback(void (*handler)(UWORD pc))
3841: ; Set the fetch callback to the given function
3842: cglobal z80_set_fetch_callback
3843: z80_set_fetch_callback:
3844: mov eax, [esp+4]
3845: mov [z80_Fetch_Callback], eax
3846: ret
3847:
3848: ;----------------------------------------------------------------------------;
3849: ; the jump tables
3850: OpTable:
3851: dd op_00, op_01, op_02, op_03, op_04, op_05, op_06, op_07
3852: dd op_08, op_09, op_0a, op_0b, op_0c, op_0d, op_0e, op_0f
3853: dd op_10, op_11, op_12, op_13, op_14, op_15, op_16, op_17
3854: dd op_18, op_19, op_1a, op_1b, op_1c, op_1d, op_1e, op_1f
3855: dd op_20, op_21, op_22, op_23, op_24, op_25, op_26, op_27
3856: dd op_28, op_29, op_2a, op_2b, op_2c, op_2d, op_2e, op_2f
3857: dd op_30, op_31, op_32, op_33, op_34, op_35, op_36, op_37
3858: dd op_38, op_39, op_3a, op_3b, op_3c, op_3d, op_3e, op_3f
3859: dd op_40, op_41, op_42, op_43, op_44, op_45, op_46, op_47
3860: dd op_48, op_49, op_4a, op_4b, op_4c, op_4d, op_4e, op_4f
3861: dd op_50, op_51, op_52, op_53, op_54, op_55, op_56, op_57
3862: dd op_58, op_59, op_5a, op_5b, op_5c, op_5d, op_5e, op_5f
3863: dd op_60, op_61, op_62, op_63, op_64, op_65, op_66, op_67
3864: dd op_68, op_69, op_6a, op_6b, op_6c, op_6d, op_6e, op_6f
3865: dd op_70, op_71, op_72, op_73, op_74, op_75, op_76, op_77
3866: dd op_78, op_79, op_7a, op_7b, op_7c, op_7d, op_7e, op_7f
3867: dd op_80, op_81, op_82, op_83, op_84, op_85, op_86, op_87
3868: dd op_88, op_89, op_8a, op_8b, op_8c, op_8d, op_8e, op_8f
3869: dd op_90, op_91, op_92, op_93, op_94, op_95, op_96, op_97
3870: dd op_98, op_99, op_9a, op_9b, op_9c, op_9d, op_9e, op_9f
3871: dd op_a0, op_a1, op_a2, op_a3, op_a4, op_a5, op_a6, op_a7
3872: dd op_a8, op_a9, op_aa, op_ab, op_ac, op_ad, op_ae, op_af
3873: dd op_b0, op_b1, op_b2, op_b3, op_b4, op_b5, op_b6, op_b7
3874: dd op_b8, op_b9, op_ba, op_bb, op_bc, op_bd, op_be, op_bf
3875: dd op_c0, op_c1, op_c2, op_c3, op_c4, op_c5, op_c6, op_c7
3876: dd op_c8, op_c9, op_ca, op_cb, op_cc, op_cd, op_ce, op_cf
3877: dd op_d0, op_d1, op_d2, op_d3, op_d4, op_d5, op_d6, op_d7
3878: dd op_d8, op_d9, op_da, op_db, op_dc, op_dd, op_de, op_df
3879: dd op_e0, op_e1, op_e2, op_e3, op_e4, op_e5, op_e6, op_e7
3880: dd op_e8, op_e9, op_ea, op_eb, op_ec, op_ed, op_ee, op_ef
3881: dd op_f0, op_f1, op_f2, op_f3, op_f4, op_f5, op_f6, op_f7
3882: dd op_f8, op_f9, op_fa, op_fb, op_fc, op_fd, op_fe, op_ff
3883:
3884: CBTable:
3885: dd cb_00, cb_01, cb_02, cb_03, cb_04, cb_05, cb_06, cb_07
3886: dd cb_08, cb_09, cb_0a, cb_0b, cb_0c, cb_0d, cb_0e, cb_0f
3887: dd cb_10, cb_11, cb_12, cb_13, cb_14, cb_15, cb_16, cb_17
3888: dd cb_18, cb_19, cb_1a, cb_1b, cb_1c, cb_1d, cb_1e, cb_1f
3889: dd cb_20, cb_21, cb_22, cb_23, cb_24, cb_25, cb_26, cb_27
3890: dd cb_28, cb_29, cb_2a, cb_2b, cb_2c, cb_2d, cb_2e, cb_2f
3891: dd cb_30, cb_31, cb_32, cb_33, cb_34, cb_35, cb_36, cb_37
3892: dd cb_38, cb_39, cb_3a, cb_3b, cb_3c, cb_3d, cb_3e, cb_3f
3893: dd cb_40, cb_41, cb_42, cb_43, cb_44, cb_45, cb_46, cb_47
3894: dd cb_48, cb_49, cb_4a, cb_4b, cb_4c, cb_4d, cb_4e, cb_4f
3895: dd cb_50, cb_51, cb_52, cb_53, cb_54, cb_55, cb_56, cb_57
3896: dd cb_58, cb_59, cb_5a, cb_5b, cb_5c, cb_5d, cb_5e, cb_5f
3897: dd cb_60, cb_61, cb_62, cb_63, cb_64, cb_65, cb_66, cb_67
3898: dd cb_68, cb_69, cb_6a, cb_6b, cb_6c, cb_6d, cb_6e, cb_6f
3899: dd cb_70, cb_71, cb_72, cb_73, cb_74, cb_75, cb_76, cb_77
3900: dd cb_78, cb_79, cb_7a, cb_7b, cb_7c, cb_7d, cb_7e, cb_7f
3901: dd cb_80, cb_81, cb_82, cb_83, cb_84, cb_85, cb_86, cb_87
3902: dd cb_88, cb_89, cb_8a, cb_8b, cb_8c, cb_8d, cb_8e, cb_8f
3903: dd cb_90, cb_91, cb_92, cb_93, cb_94, cb_95, cb_96, cb_97
3904: dd cb_98, cb_99, cb_9a, cb_9b, cb_9c, cb_9d, cb_9e, cb_9f
3905: dd cb_a0, cb_a1, cb_a2, cb_a3, cb_a4, cb_a5, cb_a6, cb_a7
3906: dd cb_a8, cb_a9, cb_aa, cb_ab, cb_ac, cb_ad, cb_ae, cb_af
3907: dd cb_b0, cb_b1, cb_b2, cb_b3, cb_b4, cb_b5, cb_b6, cb_b7
3908: dd cb_b8, cb_b9, cb_ba, cb_bb, cb_bc, cb_bd, cb_be, cb_bf
3909: dd cb_c0, cb_c1, cb_c2, cb_c3, cb_c4, cb_c5, cb_c6, cb_c7
3910: dd cb_c8, cb_c9, cb_ca, cb_cb, cb_cc, cb_cd, cb_ce, cb_cf
3911: dd cb_d0, cb_d1, cb_d2, cb_d3, cb_d4, cb_d5, cb_d6, cb_d7
3912: dd cb_d8, cb_d9, cb_da, cb_db, cb_dc, cb_dd, cb_de, cb_df
3913: dd cb_e0, cb_e1, cb_e2, cb_e3, cb_e4, cb_e5, cb_e6, cb_e7
3914: dd cb_e8, cb_e9, cb_ea, cb_eb, cb_ec, cb_ed, cb_ee, cb_ef
3915: dd cb_f0, cb_f1, cb_f2, cb_f3, cb_f4, cb_f5, cb_f6, cb_f7
3916: dd cb_f8, cb_f9, cb_fa, cb_fb, cb_fc, cb_fd, cb_fe, cb_ff
3917:
3918: EDTable:
3919: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3920: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3921: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3922: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3923: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3924: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3925: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3926: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3927: dd ed_40, ed_41, ed_42, ed_43, ed_44, ed_45, ed_46, ed_47
3928: dd ed_48, ed_49, ed_4a, ed_4b, ed_4c, ed_4d, ed_4e, ed_4f
3929: dd ed_50, ed_51, ed_52, ed_53, ed_54, ed_55, ed_56, ed_57
3930: dd ed_58, ed_59, ed_5a, ed_5b, ed_5c, ed_5d, ed_5e, ed_5f
3931: dd ed_60, ed_61, ed_62, ed_63, ed_64, ed_65, ed_66, ed_67
3932: dd ed_68, ed_69, ed_6a, ed_6b, ed_6c, ed_6d, ed_6e, ed_6f
3933: dd ed_70, ed_71, ed_72, ed_73, ed_74, ed_75, ed_76, ed_xx
3934: dd ed_78, ed_79, ed_7a, ed_7b, ed_7c, ed_7d, ed_7e, ed_xx
3935: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3936: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3937: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3938: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3939: dd ed_a0, ed_a1, ed_a2, ed_a3, ed_xx, ed_xx, ed_xx, ed_xx
3940: dd ed_a8, ed_a9, ed_aa, ed_ab, ed_xx, ed_xx, ed_xx, ed_xx
3941: dd ed_b0, ed_b1, ed_b2, ed_b3, ed_xx, ed_xx, ed_xx, ed_xx
3942: dd ed_b8, ed_b9, ed_ba, ed_bb, ed_xx, ed_xx, ed_xx, ed_xx
3943: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3944: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3945: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3946: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3947: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3948: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3949: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3950: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx
3951:
3952: DDTable:
3953: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3954: dd dd_xx, dd_09, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3955: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3956: dd dd_xx, dd_19, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3957: dd dd_xx, dd_21, dd_22, dd_23, dd_24, dd_25, dd_26, dd_xx
3958: dd dd_xx, dd_29, dd_2a, dd_2b, dd_2c, dd_2d, dd_2e, dd_xx
3959: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_34, dd_35, dd_36, dd_xx
3960: dd dd_xx, dd_39, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3961: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_44, dd_45, dd_46, dd_xx
3962: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_4c, dd_4d, dd_4e, dd_xx
3963: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_54, dd_55, dd_56, dd_xx
3964: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_5c, dd_5d, dd_5e, dd_xx
3965: dd dd_60, dd_61, dd_62, dd_63, dd_xx, dd_65, dd_66, dd_67
3966: dd dd_68, dd_69, dd_6a, dd_6b, dd_6c, dd_xx, dd_6e, dd_6f
3967: dd dd_70, dd_71, dd_72, dd_73, dd_74, dd_75, dd_xx, dd_77
3968: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_7c, dd_7d, dd_7e, dd_xx
3969: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_84, dd_85, dd_86, dd_xx
3970: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_8c, dd_8d, dd_8e, dd_xx
3971: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_94, dd_95, dd_96, dd_xx
3972: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_9c, dd_9d, dd_9e, dd_xx
3973: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_a4, dd_a5, dd_a6, dd_xx
3974: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_ac, dd_ad, dd_ae, dd_xx
3975: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_b4, dd_b5, dd_b6, dd_xx
3976: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_bc, dd_bd, dd_be, dd_xx
3977: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3978: dd dd_xx, dd_xx, dd_xx, dd_cb, dd_xx, dd_xx, dd_xx, dd_xx
3979: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3980: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3981: dd dd_xx, dd_e1, dd_xx, dd_e3, dd_xx, dd_e5, dd_xx, dd_xx
3982: dd dd_xx, dd_e9, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3983: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3984: dd dd_xx, dd_f9, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx
3985:
3986: FDTable:
3987: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
3988: dd fd_xx, fd_09, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
3989: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
3990: dd fd_xx, fd_19, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
3991: dd fd_xx, fd_21, fd_22, fd_23, fd_24, fd_25, fd_26, fd_xx
3992: dd fd_xx, fd_29, fd_2a, fd_2b, fd_2c, fd_2d, fd_2e, fd_xx
3993: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_34, fd_35, fd_36, fd_xx
3994: dd fd_xx, fd_39, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
3995: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_44, fd_45, fd_46, fd_xx
3996: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_4c, fd_4d, fd_4e, fd_xx
3997: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_54, fd_55, fd_56, fd_xx
3998: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_5c, fd_5d, fd_5e, fd_xx
3999: dd fd_60, fd_61, fd_62, fd_63, fd_xx, fd_65, fd_66, fd_67
4000: dd fd_68, fd_69, fd_6a, fd_6b, fd_6c, fd_xx, fd_6e, fd_6f
4001: dd fd_70, fd_71, fd_72, fd_73, fd_74, fd_75, fd_xx, fd_77
4002: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_7c, fd_7d, fd_7e, fd_xx
4003: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_84, fd_85, fd_86, fd_xx
4004: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_8c, fd_8d, fd_8e, fd_xx
4005: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_94, fd_95, fd_96, fd_xx
4006: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_9c, fd_9d, fd_9e, fd_xx
4007: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_a4, fd_a5, fd_a6, fd_xx
4008: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_ac, fd_ad, fd_ae, fd_xx
4009: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_b4, fd_b5, fd_b6, fd_xx
4010: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_bc, fd_bd, fd_be, fd_xx
4011: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
4012: dd fd_xx, fd_xx, fd_xx, fd_cb, fd_xx, fd_xx, fd_xx, fd_xx
4013: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
4014: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
4015: dd fd_xx, fd_e1, fd_xx, fd_e3, fd_xx, fd_e5, fd_xx, fd_xx
4016: dd fd_xx, fd_e9, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
4017: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
4018: dd fd_xx, fd_f9, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx
4019:
4020: DDCBTable:
4021: dd ddcb_00, ddcb_01, ddcb_02, ddcb_03, ddcb_04, ddcb_05, ddcb_06, ddcb_07
4022: dd ddcb_08, ddcb_09, ddcb_0a, ddcb_0b, ddcb_0c, ddcb_0d, ddcb_0e, ddcb_0f
4023: dd ddcb_10, ddcb_11, ddcb_12, ddcb_13, ddcb_14, ddcb_15, ddcb_16, ddcb_17
4024: dd ddcb_18, ddcb_19, ddcb_1a, ddcb_1b, ddcb_1c, ddcb_1d, ddcb_1e, ddcb_1f
4025: dd ddcb_20, ddcb_21, ddcb_22, ddcb_23, ddcb_24, ddcb_25, ddcb_26, ddcb_27
4026: dd ddcb_28, ddcb_29, ddcb_2a, ddcb_2b, ddcb_2c, ddcb_2d, ddcb_2e, ddcb_2f
4027: dd ddcb_30, ddcb_31, ddcb_32, ddcb_33, ddcb_34, ddcb_35, ddcb_36, ddcb_37
4028: dd ddcb_38, ddcb_39, ddcb_3a, ddcb_3b, ddcb_3c, ddcb_3d, ddcb_3e, ddcb_3f
4029: dd ddcb_40, ddcb_41, ddcb_42, ddcb_43, ddcb_44, ddcb_45, ddcb_46, ddcb_47
4030: dd ddcb_48, ddcb_49, ddcb_4a, ddcb_4b, ddcb_4c, ddcb_4d, ddcb_4e, ddcb_4f
4031: dd ddcb_50, ddcb_51, ddcb_52, ddcb_53, ddcb_54, ddcb_55, ddcb_56, ddcb_57
4032: dd ddcb_58, ddcb_59, ddcb_5a, ddcb_5b, ddcb_5c, ddcb_5d, ddcb_5e, ddcb_5f
4033: dd ddcb_60, ddcb_61, ddcb_62, ddcb_63, ddcb_64, ddcb_65, ddcb_66, ddcb_67
4034: dd ddcb_68, ddcb_69, ddcb_6a, ddcb_6b, ddcb_6c, ddcb_6d, ddcb_6e, ddcb_6f
4035: dd ddcb_70, ddcb_71, ddcb_72, ddcb_73, ddcb_74, ddcb_75, ddcb_76, ddcb_77
4036: dd ddcb_78, ddcb_79, ddcb_7a, ddcb_7b, ddcb_7c, ddcb_7d, ddcb_7e, ddcb_7f
4037: dd ddcb_80, ddcb_81, ddcb_82, ddcb_83, ddcb_84, ddcb_85, ddcb_86, ddcb_87
4038: dd ddcb_88, ddcb_89, ddcb_8a, ddcb_8b, ddcb_8c, ddcb_8d, ddcb_8e, ddcb_8f
4039: dd ddcb_90, ddcb_91, ddcb_92, ddcb_93, ddcb_94, ddcb_95, ddcb_96, ddcb_97
4040: dd ddcb_98, ddcb_99, ddcb_9a, ddcb_9b, ddcb_9c, ddcb_9d, ddcb_9e, ddcb_9f
4041: dd ddcb_a0, ddcb_a1, ddcb_a2, ddcb_a3, ddcb_a4, ddcb_a5, ddcb_a6, ddcb_a7
4042: dd ddcb_a8, ddcb_a9, ddcb_aa, ddcb_ab, ddcb_ac, ddcb_ad, ddcb_ae, ddcb_af
4043: dd ddcb_b0, ddcb_b1, ddcb_b2, ddcb_b3, ddcb_b4, ddcb_b5, ddcb_b6, ddcb_b7
4044: dd ddcb_b8, ddcb_b9, ddcb_ba, ddcb_bb, ddcb_bc, ddcb_bd, ddcb_be, ddcb_bf
4045: dd ddcb_c0, ddcb_c1, ddcb_c2, ddcb_c3, ddcb_c4, ddcb_c5, ddcb_c6, ddcb_c7
4046: dd ddcb_c8, ddcb_c9, ddcb_ca, ddcb_cb, ddcb_cc, ddcb_cd, ddcb_ce, ddcb_cf
4047: dd ddcb_d0, ddcb_d1, ddcb_d2, ddcb_d3, ddcb_d4, ddcb_d5, ddcb_d6, ddcb_d7
4048: dd ddcb_d8, ddcb_d9, ddcb_da, ddcb_db, ddcb_dc, ddcb_dd, ddcb_de, ddcb_df
4049: dd ddcb_e0, ddcb_e1, ddcb_e2, ddcb_e3, ddcb_e4, ddcb_e5, ddcb_e6, ddcb_e7
4050: dd ddcb_e8, ddcb_e9, ddcb_ea, ddcb_eb, ddcb_ec, ddcb_ed, ddcb_ee, ddcb_ef
4051: dd ddcb_f0, ddcb_f1, ddcb_f2, ddcb_f3, ddcb_f4, ddcb_f5, ddcb_f6, ddcb_f7
4052: dd ddcb_f8, ddcb_f9, ddcb_fa, ddcb_fb, ddcb_fc, ddcb_fd, ddcb_fe, ddcb_ff
4053:
4054:
4055: ;----------------------------------------------------------------------------;
4056: ; flag tables ('borrowed' from MAZE, by Ishmair)
4057: INC_Table:
4058: DB 0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,16,0,0,0,0
4059: DB 0,0,0,8,8,8,8,8,8,8,8,48,32,32,32,32,32,32,32,40
4060: DB 40,40,40,40,40,40,40,48,32,32,32,32,32,32,32,40,40,40,40,40
4061: DB 40,40,40,16,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,16
4062: DB 0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,48,32,32,32,32
4063: DB 32,32,32,40,40,40,40,40,40,40,40,48,32,32,32,32,32,32,32,40
4064: DB 40,40,40,40,40,40,40,148,128,128,128,128,128,128,128,136,136,136,136,136
4065: DB 136,136,136,144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,176
4066: DB 160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,176,160,160,160,160
4067: DB 160,160,160,168,168,168,168,168,168,168,168,144,128,128,128,128,128,128,128,136
4068: DB 136,136,136,136,136,136,136,144,128,128,128,128,128,128,128,136,136,136,136,136
4069: DB 136,136,136,176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,176
4070: DB 160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,80
4071:
4072: DEC_Table:
4073: DB 186,66,2,2,2,2,2,2,2,10,10,10,10,10,10,10,26,2,2,2
4074: DB 2,2,2,2,2,10,10,10,10,10,10,10,26,34,34,34,34,34,34,34
4075: DB 34,42,42,42,42,42,42,42,58,34,34,34,34,34,34,34,34,42,42,42
4076: DB 42,42,42,42,58,2,2,2,2,2,2,2,2,10,10,10,10,10,10,10
4077: DB 26,2,2,2,2,2,2,2,2,10,10,10,10,10,10,10,26,34,34,34
4078: DB 34,34,34,34,34,42,42,42,42,42,42,42,58,34,34,34,34,34,34,34
4079: DB 34,42,42,42,42,42,42,42,62,130,130,130,130,130,130,130,130,138,138,138
4080: DB 138,138,138,138,154,130,130,130,130,130,130,130,130,138,138,138,138,138,138,138
4081: DB 154,162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,162,162,162
4082: DB 162,162,162,162,162,170,170,170,170,170,170,170,186,130,130,130,130,130,130,130
4083: DB 130,138,138,138,138,138,138,138,154,130,130,130,130,130,130,130,130,138,138,138
4084: DB 138,138,138,138,154,162,162,162,162,162,162,162,162,170,170,170,170,170,170,170
4085: DB 186,162,162,162,162,162,162,162,162,170,170,170,170,170,170,170
4086:
4087: ; DAA table ('borrowed' from Z80Emul, by unknown)
4088: DAA_Table:
4089: DW 04400h, 00001h, 00002h, 00403h, 00004h, 00405h, 00406h, 00007h
4090: DW 00808h, 00C09h, 01010h, 01411h, 01412h, 01013h, 01414h, 01015h
4091: DW 00010h, 00411h, 00412h, 00013h, 00414h, 00015h, 00016h, 00417h
4092: DW 00C18h, 00819h, 03020h, 03421h, 03422h, 03023h, 03424h, 03025h
4093: DW 02020h, 02421h, 02422h, 02023h, 02424h, 02025h, 02026h, 02427h
4094: DW 02C28h, 02829h, 03430h, 03031h, 03032h, 03433h, 03034h, 03435h
4095: DW 02430h, 02031h, 02032h, 02433h, 02034h, 02435h, 02436h, 02037h
4096: DW 02838h, 02C39h, 01040h, 01441h, 01442h, 01043h, 01444h, 01045h
4097: DW 00040h, 00441h, 00442h, 00043h, 00444h, 00045h, 00046h, 00447h
4098: DW 00C48h, 00849h, 01450h, 01051h, 01052h, 01453h, 01054h, 01455h
4099: DW 00450h, 00051h, 00052h, 00453h, 00054h, 00455h, 00456h, 00057h
4100: DW 00858h, 00C59h, 03460h, 03061h, 03062h, 03463h, 03064h, 03465h
4101: DW 02460h, 02061h, 02062h, 02463h, 02064h, 02465h, 02466h, 02067h
4102: DW 02868h, 02C69h, 03070h, 03471h, 03472h, 03073h, 03474h, 03075h
4103: DW 02070h, 02471h, 02472h, 02073h, 02474h, 02075h, 02076h, 02477h
4104: DW 02C78h, 02879h, 09080h, 09481h, 09482h, 09083h, 09484h, 09085h
4105: DW 08080h, 08481h, 08482h, 08083h, 08484h, 08085h, 08086h, 08487h
4106: DW 08C88h, 08889h, 09490h, 09091h, 09092h, 09493h, 09094h, 09495h
4107: DW 08490h, 08091h, 08092h, 08493h, 08094h, 08495h, 08496h, 08097h
4108: DW 08898h, 08C99h, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h
4109: DW 04500h, 00101h, 00102h, 00503h, 00104h, 00505h, 00506h, 00107h
4110: DW 00908h, 00D09h, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h
4111: DW 00110h, 00511h, 00512h, 00113h, 00514h, 00115h, 00116h, 00517h
4112: DW 00D18h, 00919h, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h
4113: DW 02120h, 02521h, 02522h, 02123h, 02524h, 02125h, 02126h, 02527h
4114: DW 02D28h, 02929h, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h
4115: DW 02530h, 02131h, 02132h, 02533h, 02134h, 02535h, 02536h, 02137h
4116: DW 02938h, 02D39h, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h
4117: DW 00140h, 00541h, 00542h, 00143h, 00544h, 00145h, 00146h, 00547h
4118: DW 00D48h, 00949h, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h
4119: DW 00550h, 00151h, 00152h, 00553h, 00154h, 00555h, 00556h, 00157h
4120: DW 00958h, 00D59h, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h
4121: DW 02560h, 02161h, 02162h, 02563h, 02164h, 02565h, 02566h, 02167h
4122: DW 02968h, 02D69h, 03170h, 03571h, 03572h, 03173h, 03574h, 03175h
4123: DW 02170h, 02571h, 02572h, 02173h, 02574h, 02175h, 02176h, 02577h
4124: DW 02D78h, 02979h, 09180h, 09581h, 09582h, 09183h, 09584h, 09185h
4125: DW 08180h, 08581h, 08582h, 08183h, 08584h, 08185h, 08186h, 08587h
4126: DW 08D88h, 08989h, 09590h, 09191h, 09192h, 09593h, 09194h, 09595h
4127: DW 08590h, 08191h, 08192h, 08593h, 08194h, 08595h, 08596h, 08197h
4128: DW 08998h, 08D99h, 0B5A0h, 0B1A1h, 0B1A2h, 0B5A3h, 0B1A4h, 0B5A5h
4129: DW 0A5A0h, 0A1A1h, 0A1A2h, 0A5A3h, 0A1A4h, 0A5A5h, 0A5A6h, 0A1A7h
4130: DW 0A9A8h, 0ADA9h, 0B1B0h, 0B5B1h, 0B5B2h, 0B1B3h, 0B5B4h, 0B1B5h
4131: DW 0A1B0h, 0A5B1h, 0A5B2h, 0A1B3h, 0A5B4h, 0A1B5h, 0A1B6h, 0A5B7h
4132: DW 0ADB8h, 0A9B9h, 095C0h, 091C1h, 091C2h, 095C3h, 091C4h, 095C5h
4133: DW 085C0h, 081C1h, 081C2h, 085C3h, 081C4h, 085C5h, 085C6h, 081C7h
4134: DW 089C8h, 08DC9h, 091D0h, 095D1h, 095D2h, 091D3h, 095D4h, 091D5h
4135: DW 081D0h, 085D1h, 085D2h, 081D3h, 085D4h, 081D5h, 081D6h, 085D7h
4136: DW 08DD8h, 089D9h, 0B1E0h, 0B5E1h, 0B5E2h, 0B1E3h, 0B5E4h, 0B1E5h
4137: DW 0A1E0h, 0A5E1h, 0A5E2h, 0A1E3h, 0A5E4h, 0A1E5h, 0A1E6h, 0A5E7h
4138: DW 0ADE8h, 0A9E9h, 0B5F0h, 0B1F1h, 0B1F2h, 0B5F3h, 0B1F4h, 0B5F5h
4139: DW 0A5F0h, 0A1F1h, 0A1F2h, 0A5F3h, 0A1F4h, 0A5F5h, 0A5F6h, 0A1F7h
4140: DW 0A9F8h, 0ADF9h, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h
4141: DW 04500h, 00101h, 00102h, 00503h, 00104h, 00505h, 00506h, 00107h
4142: DW 00908h, 00D09h, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h
4143: DW 00110h, 00511h, 00512h, 00113h, 00514h, 00115h, 00116h, 00517h
4144: DW 00D18h, 00919h, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h
4145: DW 02120h, 02521h, 02522h, 02123h, 02524h, 02125h, 02126h, 02527h
4146: DW 02D28h, 02929h, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h
4147: DW 02530h, 02131h, 02132h, 02533h, 02134h, 02535h, 02536h, 02137h
4148: DW 02938h, 02D39h, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h
4149: DW 00140h, 00541h, 00542h, 00143h, 00544h, 00145h, 00146h, 00547h
4150: DW 00D48h, 00949h, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h
4151: DW 00550h, 00151h, 00152h, 00553h, 00154h, 00555h, 00556h, 00157h
4152: DW 00958h, 00D59h, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h
4153: DW 04600h, 00201h, 00202h, 00603h, 00204h, 00605h, 00606h, 00207h
4154: DW 00A08h, 00E09h, 00204h, 00605h, 00606h, 00207h, 00A08h, 00E09h
4155: DW 00210h, 00611h, 00612h, 00213h, 00614h, 00215h, 00216h, 00617h
4156: DW 00E18h, 00A19h, 00614h, 00215h, 00216h, 00617h, 00E18h, 00A19h
4157: DW 02220h, 02621h, 02622h, 02223h, 02624h, 02225h, 02226h, 02627h
4158: DW 02E28h, 02A29h, 02624h, 02225h, 02226h, 02627h, 02E28h, 02A29h
4159: DW 02630h, 02231h, 02232h, 02633h, 02234h, 02635h, 02636h, 02237h
4160: DW 02A38h, 02E39h, 02234h, 02635h, 02636h, 02237h, 02A38h, 02E39h
4161: DW 00240h, 00641h, 00642h, 00243h, 00644h, 00245h, 00246h, 00647h
4162: DW 00E48h, 00A49h, 00644h, 00245h, 00246h, 00647h, 00E48h, 00A49h
4163: DW 00650h, 00251h, 00252h, 00653h, 00254h, 00655h, 00656h, 00257h
4164: DW 00A58h, 00E59h, 00254h, 00655h, 00656h, 00257h, 00A58h, 00E59h
4165: DW 02660h, 02261h, 02262h, 02663h, 02264h, 02665h, 02666h, 02267h
4166: DW 02A68h, 02E69h, 02264h, 02665h, 02666h, 02267h, 02A68h, 02E69h
4167: DW 02270h, 02671h, 02672h, 02273h, 02674h, 02275h, 02276h, 02677h
4168: DW 02E78h, 02A79h, 02674h, 02275h, 02276h, 02677h, 02E78h, 02A79h
4169: DW 08280h, 08681h, 08682h, 08283h, 08684h, 08285h, 08286h, 08687h
4170: DW 08E88h, 08A89h, 08684h, 08285h, 08286h, 08687h, 08E88h, 08A89h
4171: DW 08690h, 08291h, 08292h, 08693h, 08294h, 08695h, 08696h, 08297h
4172: DW 08A98h, 08E99h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h
4173: DW 00340h, 00741h, 00742h, 00343h, 00744h, 00345h, 00346h, 00747h
4174: DW 00F48h, 00B49h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h
4175: DW 00750h, 00351h, 00352h, 00753h, 00354h, 00755h, 00756h, 00357h
4176: DW 00B58h, 00F59h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h
4177: DW 02760h, 02361h, 02362h, 02763h, 02364h, 02765h, 02766h, 02367h
4178: DW 02B68h, 02F69h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h
4179: DW 02370h, 02771h, 02772h, 02373h, 02774h, 02375h, 02376h, 02777h
4180: DW 02F78h, 02B79h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h
4181: DW 08380h, 08781h, 08782h, 08383h, 08784h, 08385h, 08386h, 08787h
4182: DW 08F88h, 08B89h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h
4183: DW 08790h, 08391h, 08392h, 08793h, 08394h, 08795h, 08796h, 08397h
4184: DW 08B98h, 08F99h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h
4185: DW 0A7A0h, 0A3A1h, 0A3A2h, 0A7A3h, 0A3A4h, 0A7A5h, 0A7A6h, 0A3A7h
4186: DW 0ABA8h, 0AFA9h, 0A3A4h, 0A7A5h, 0A7A6h, 0A3A7h, 0ABA8h, 0AFA9h
4187: DW 0A3B0h, 0A7B1h, 0A7B2h, 0A3B3h, 0A7B4h, 0A3B5h, 0A3B6h, 0A7B7h
4188: DW 0AFB8h, 0ABB9h, 0A7B4h, 0A3B5h, 0A3B6h, 0A7B7h, 0AFB8h, 0ABB9h
4189: DW 087C0h, 083C1h, 083C2h, 087C3h, 083C4h, 087C5h, 087C6h, 083C7h
4190: DW 08BC8h, 08FC9h, 083C4h, 087C5h, 087C6h, 083C7h, 08BC8h, 08FC9h
4191: DW 083D0h, 087D1h, 087D2h, 083D3h, 087D4h, 083D5h, 083D6h, 087D7h
4192: DW 08FD8h, 08BD9h, 087D4h, 083D5h, 083D6h, 087D7h, 08FD8h, 08BD9h
4193: DW 0A3E0h, 0A7E1h, 0A7E2h, 0A3E3h, 0A7E4h, 0A3E5h, 0A3E6h, 0A7E7h
4194: DW 0AFE8h, 0ABE9h, 0A7E4h, 0A3E5h, 0A3E6h, 0A7E7h, 0AFE8h, 0ABE9h
4195: DW 0A7F0h, 0A3F1h, 0A3F2h, 0A7F3h, 0A3F4h, 0A7F5h, 0A7F6h, 0A3F7h
4196: DW 0ABF8h, 0AFF9h, 0A3F4h, 0A7F5h, 0A7F6h, 0A3F7h, 0ABF8h, 0AFF9h
4197: DW 04700h, 00301h, 00302h, 00703h, 00304h, 00705h, 00706h, 00307h
4198: DW 00B08h, 00F09h, 00304h, 00705h, 00706h, 00307h, 00B08h, 00F09h
4199: DW 00310h, 00711h, 00712h, 00313h, 00714h, 00315h, 00316h, 00717h
4200: DW 00F18h, 00B19h, 00714h, 00315h, 00316h, 00717h, 00F18h, 00B19h
4201: DW 02320h, 02721h, 02722h, 02323h, 02724h, 02325h, 02326h, 02727h
4202: DW 02F28h, 02B29h, 02724h, 02325h, 02326h, 02727h, 02F28h, 02B29h
4203: DW 02730h, 02331h, 02332h, 02733h, 02334h, 02735h, 02736h, 02337h
4204: DW 02B38h, 02F39h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h
4205: DW 00340h, 00741h, 00742h, 00343h, 00744h, 00345h, 00346h, 00747h
4206: DW 00F48h, 00B49h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h
4207: DW 00750h, 00351h, 00352h, 00753h, 00354h, 00755h, 00756h, 00357h
4208: DW 00B58h, 00F59h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h
4209: DW 02760h, 02361h, 02362h, 02763h, 02364h, 02765h, 02766h, 02367h
4210: DW 02B68h, 02F69h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h
4211: DW 02370h, 02771h, 02772h, 02373h, 02774h, 02375h, 02376h, 02777h
4212: DW 02F78h, 02B79h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h
4213: DW 08380h, 08781h, 08782h, 08383h, 08784h, 08385h, 08386h, 08787h
4214: DW 08F88h, 08B89h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h
4215: DW 08790h, 08391h, 08392h, 08793h, 08394h, 08795h, 08796h, 08397h
4216: DW 08B98h, 08F99h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h
4217: DW 00406h, 00007h, 00808h, 00C09h, 00C0Ah, 0080Bh, 00C0Ch, 0080Dh
4218: DW 0080Eh, 00C0Fh, 01010h, 01411h, 01412h, 01013h, 01414h, 01015h
4219: DW 00016h, 00417h, 00C18h, 00819h, 0081Ah, 00C1Bh, 0081Ch, 00C1Dh
4220: DW 00C1Eh, 0081Fh, 03020h, 03421h, 03422h, 03023h, 03424h, 03025h
4221: DW 02026h, 02427h, 02C28h, 02829h, 0282Ah, 02C2Bh, 0282Ch, 02C2Dh
4222: DW 02C2Eh, 0282Fh, 03430h, 03031h, 03032h, 03433h, 03034h, 03435h
4223: DW 02436h, 02037h, 02838h, 02C39h, 02C3Ah, 0283Bh, 02C3Ch, 0283Dh
4224: DW 0283Eh, 02C3Fh, 01040h, 01441h, 01442h, 01043h, 01444h, 01045h
4225: DW 00046h, 00447h, 00C48h, 00849h, 0084Ah, 00C4Bh, 0084Ch, 00C4Dh
4226: DW 00C4Eh, 0084Fh, 01450h, 01051h, 01052h, 01453h, 01054h, 01455h
4227: DW 00456h, 00057h, 00858h, 00C59h, 00C5Ah, 0085Bh, 00C5Ch, 0085Dh
4228: DW 0085Eh, 00C5Fh, 03460h, 03061h, 03062h, 03463h, 03064h, 03465h
4229: DW 02466h, 02067h, 02868h, 02C69h, 02C6Ah, 0286Bh, 02C6Ch, 0286Dh
4230: DW 0286Eh, 02C6Fh, 03070h, 03471h, 03472h, 03073h, 03474h, 03075h
4231: DW 02076h, 02477h, 02C78h, 02879h, 0287Ah, 02C7Bh, 0287Ch, 02C7Dh
4232: DW 02C7Eh, 0287Fh, 09080h, 09481h, 09482h, 09083h, 09484h, 09085h
4233: DW 08086h, 08487h, 08C88h, 08889h, 0888Ah, 08C8Bh, 0888Ch, 08C8Dh
4234: DW 08C8Eh, 0888Fh, 09490h, 09091h, 09092h, 09493h, 09094h, 09495h
4235: DW 08496h, 08097h, 08898h, 08C99h, 08C9Ah, 0889Bh, 08C9Ch, 0889Dh
4236: DW 0889Eh, 08C9Fh, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h
4237: DW 00506h, 00107h, 00908h, 00D09h, 00D0Ah, 0090Bh, 00D0Ch, 0090Dh
4238: DW 0090Eh, 00D0Fh, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h
4239: DW 00116h, 00517h, 00D18h, 00919h, 0091Ah, 00D1Bh, 0091Ch, 00D1Dh
4240: DW 00D1Eh, 0091Fh, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h
4241: DW 02126h, 02527h, 02D28h, 02929h, 0292Ah, 02D2Bh, 0292Ch, 02D2Dh
4242: DW 02D2Eh, 0292Fh, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h
4243: DW 02536h, 02137h, 02938h, 02D39h, 02D3Ah, 0293Bh, 02D3Ch, 0293Dh
4244: DW 0293Eh, 02D3Fh, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h
4245: DW 00146h, 00547h, 00D48h, 00949h, 0094Ah, 00D4Bh, 0094Ch, 00D4Dh
4246: DW 00D4Eh, 0094Fh, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h
4247: DW 00556h, 00157h, 00958h, 00D59h, 00D5Ah, 0095Bh, 00D5Ch, 0095Dh
4248: DW 0095Eh, 00D5Fh, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h
4249: DW 02566h, 02167h, 02968h, 02D69h, 02D6Ah, 0296Bh, 02D6Ch, 0296Dh
4250: DW 0296Eh, 02D6Fh, 03170h, 03571h, 03572h, 03173h, 03574h, 03175h
4251: DW 02176h, 02577h, 02D78h, 02979h, 0297Ah, 02D7Bh, 0297Ch, 02D7Dh
4252: DW 02D7Eh, 0297Fh, 09180h, 09581h, 09582h, 09183h, 09584h, 09185h
4253: DW 08186h, 08587h, 08D88h, 08989h, 0898Ah, 08D8Bh, 0898Ch, 08D8Dh
4254: DW 08D8Eh, 0898Fh, 09590h, 09191h, 09192h, 09593h, 09194h, 09595h
4255: DW 08596h, 08197h, 08998h, 08D99h, 08D9Ah, 0899Bh, 08D9Ch, 0899Dh
4256: DW 0899Eh, 08D9Fh, 0B5A0h, 0B1A1h, 0B1A2h, 0B5A3h, 0B1A4h, 0B5A5h
4257: DW 0A5A6h, 0A1A7h, 0A9A8h, 0ADA9h, 0ADAAh, 0A9ABh, 0ADACh, 0A9ADh
4258: DW 0A9AEh, 0ADAFh, 0B1B0h, 0B5B1h, 0B5B2h, 0B1B3h, 0B5B4h, 0B1B5h
4259: DW 0A1B6h, 0A5B7h, 0ADB8h, 0A9B9h, 0A9BAh, 0ADBBh, 0A9BCh, 0ADBDh
4260: DW 0ADBEh, 0A9BFh, 095C0h, 091C1h, 091C2h, 095C3h, 091C4h, 095C5h
4261: DW 085C6h, 081C7h, 089C8h, 08DC9h, 08DCAh, 089CBh, 08DCCh, 089CDh
4262: DW 089CEh, 08DCFh, 091D0h, 095D1h, 095D2h, 091D3h, 095D4h, 091D5h
4263: DW 081D6h, 085D7h, 08DD8h, 089D9h, 089DAh, 08DDBh, 089DCh, 08DDDh
4264: DW 08DDEh, 089DFh, 0B1E0h, 0B5E1h, 0B5E2h, 0B1E3h, 0B5E4h, 0B1E5h
4265: DW 0A1E6h, 0A5E7h, 0ADE8h, 0A9E9h, 0A9EAh, 0ADEBh, 0A9ECh, 0ADEDh
4266: DW 0ADEEh, 0A9EFh, 0B5F0h, 0B1F1h, 0B1F2h, 0B5F3h, 0B1F4h, 0B5F5h
4267: DW 0A5F6h, 0A1F7h, 0A9F8h, 0ADF9h, 0ADFAh, 0A9FBh, 0ADFCh, 0A9FDh
4268: DW 0A9FEh, 0ADFFh, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h
4269: DW 00506h, 00107h, 00908h, 00D09h, 00D0Ah, 0090Bh, 00D0Ch, 0090Dh
4270: DW 0090Eh, 00D0Fh, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h
4271: DW 00116h, 00517h, 00D18h, 00919h, 0091Ah, 00D1Bh, 0091Ch, 00D1Dh
4272: DW 00D1Eh, 0091Fh, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h
4273: DW 02126h, 02527h, 02D28h, 02929h, 0292Ah, 02D2Bh, 0292Ch, 02D2Dh
4274: DW 02D2Eh, 0292Fh, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h
4275: DW 02536h, 02137h, 02938h, 02D39h, 02D3Ah, 0293Bh, 02D3Ch, 0293Dh
4276: DW 0293Eh, 02D3Fh, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h
4277: DW 00146h, 00547h, 00D48h, 00949h, 0094Ah, 00D4Bh, 0094Ch, 00D4Dh
4278: DW 00D4Eh, 0094Fh, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h
4279: DW 00556h, 00157h, 00958h, 00D59h, 00D5Ah, 0095Bh, 00D5Ch, 0095Dh
4280: DW 0095Eh, 00D5Fh, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h
4281: DW 0BEFAh, 0BAFBh, 0BEFCh, 0BAFDh, 0BAFEh, 0BEFFh, 04600h, 00201h
4282: DW 00202h, 00603h, 00204h, 00605h, 00606h, 00207h, 00A08h, 00E09h
4283: DW 01E0Ah, 01A0Bh, 01E0Ch, 01A0Dh, 01A0Eh, 01E0Fh, 00210h, 00611h
4284: DW 00612h, 00213h, 00614h, 00215h, 00216h, 00617h, 00E18h, 00A19h
4285: DW 01A1Ah, 01E1Bh, 01A1Ch, 01E1Dh, 01E1Eh, 01A1Fh, 02220h, 02621h
4286: DW 02622h, 02223h, 02624h, 02225h, 02226h, 02627h, 02E28h, 02A29h
4287: DW 03A2Ah, 03E2Bh, 03A2Ch, 03E2Dh, 03E2Eh, 03A2Fh, 02630h, 02231h
4288: DW 02232h, 02633h, 02234h, 02635h, 02636h, 02237h, 02A38h, 02E39h
4289: DW 03E3Ah, 03A3Bh, 03E3Ch, 03A3Dh, 03A3Eh, 03E3Fh, 00240h, 00641h
4290: DW 00642h, 00243h, 00644h, 00245h, 00246h, 00647h, 00E48h, 00A49h
4291: DW 01A4Ah, 01E4Bh, 01A4Ch, 01E4Dh, 01E4Eh, 01A4Fh, 00650h, 00251h
4292: DW 00252h, 00653h, 00254h, 00655h, 00656h, 00257h, 00A58h, 00E59h
4293: DW 01E5Ah, 01A5Bh, 01E5Ch, 01A5Dh, 01A5Eh, 01E5Fh, 02660h, 02261h
4294: DW 02262h, 02663h, 02264h, 02665h, 02666h, 02267h, 02A68h, 02E69h
4295: DW 03E6Ah, 03A6Bh, 03E6Ch, 03A6Dh, 03A6Eh, 03E6Fh, 02270h, 02671h
4296: DW 02672h, 02273h, 02674h, 02275h, 02276h, 02677h, 02E78h, 02A79h
4297: DW 03A7Ah, 03E7Bh, 03A7Ch, 03E7Dh, 03E7Eh, 03A7Fh, 08280h, 08681h
4298: DW 08682h, 08283h, 08684h, 08285h, 08286h, 08687h, 08E88h, 08A89h
4299: DW 09A8Ah, 09E8Bh, 09A8Ch, 09E8Dh, 09E8Eh, 09A8Fh, 08690h, 08291h
4300: DW 08292h, 08693h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h
4301: DW 03F3Ah, 03B3Bh, 03F3Ch, 03B3Dh, 03B3Eh, 03F3Fh, 00340h, 00741h
4302: DW 00742h, 00343h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h
4303: DW 01B4Ah, 01F4Bh, 01B4Ch, 01F4Dh, 01F4Eh, 01B4Fh, 00750h, 00351h
4304: DW 00352h, 00753h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h
4305: DW 01F5Ah, 01B5Bh, 01F5Ch, 01B5Dh, 01B5Eh, 01F5Fh, 02760h, 02361h
4306: DW 02362h, 02763h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h
4307: DW 03F6Ah, 03B6Bh, 03F6Ch, 03B6Dh, 03B6Eh, 03F6Fh, 02370h, 02771h
4308: DW 02772h, 02373h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h
4309: DW 03B7Ah, 03F7Bh, 03B7Ch, 03F7Dh, 03F7Eh, 03B7Fh, 08380h, 08781h
4310: DW 08782h, 08383h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h
4311: DW 09B8Ah, 09F8Bh, 09B8Ch, 09F8Dh, 09F8Eh, 09B8Fh, 08790h, 08391h
4312: DW 08392h, 08793h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h
4313: DW 09F9Ah, 09B9Bh, 09F9Ch, 09B9Dh, 09B9Eh, 09F9Fh, 0A7A0h, 0A3A1h
4314: DW 0A3A2h, 0A7A3h, 0A3A4h, 0A7A5h, 0A7A6h, 0A3A7h, 0ABA8h, 0AFA9h
4315: DW 0BFAAh, 0BBABh, 0BFACh, 0BBADh, 0BBAEh, 0BFAFh, 0A3B0h, 0A7B1h
4316: DW 0A7B2h, 0A3B3h, 0A7B4h, 0A3B5h, 0A3B6h, 0A7B7h, 0AFB8h, 0ABB9h
4317: DW 0BBBAh, 0BFBBh, 0BBBCh, 0BFBDh, 0BFBEh, 0BBBFh, 087C0h, 083C1h
4318: DW 083C2h, 087C3h, 083C4h, 087C5h, 087C6h, 083C7h, 08BC8h, 08FC9h
4319: DW 09FCAh, 09BCBh, 09FCCh, 09BCDh, 09BCEh, 09FCFh, 083D0h, 087D1h
4320: DW 087D2h, 083D3h, 087D4h, 083D5h, 083D6h, 087D7h, 08FD8h, 08BD9h
4321: DW 09BDAh, 09FDBh, 09BDCh, 09FDDh, 09FDEh, 09BDFh, 0A3E0h, 0A7E1h
4322: DW 0A7E2h, 0A3E3h, 0A7E4h, 0A3E5h, 0A3E6h, 0A7E7h, 0AFE8h, 0ABE9h
4323: DW 0BBEAh, 0BFEBh, 0BBECh, 0BFEDh, 0BFEEh, 0BBEFh, 0A7F0h, 0A3F1h
4324: DW 0A3F2h, 0A7F3h, 0A3F4h, 0A7F5h, 0A7F6h, 0A3F7h, 0ABF8h, 0AFF9h
4325: DW 0BFFAh, 0BBFBh, 0BFFCh, 0BBFDh, 0BBFEh, 0BFFFh, 04700h, 00301h
4326: DW 00302h, 00703h, 00304h, 00705h, 00706h, 00307h, 00B08h, 00F09h
4327: DW 01F0Ah, 01B0Bh, 01F0Ch, 01B0Dh, 01B0Eh, 01F0Fh, 00310h, 00711h
4328: DW 00712h, 00313h, 00714h, 00315h, 00316h, 00717h, 00F18h, 00B19h
4329: DW 01B1Ah, 01F1Bh, 01B1Ch, 01F1Dh, 01F1Eh, 01B1Fh, 02320h, 02721h
4330: DW 02722h, 02323h, 02724h, 02325h, 02326h, 02727h, 02F28h, 02B29h
4331: DW 03B2Ah, 03F2Bh, 03B2Ch, 03F2Dh, 03F2Eh, 03B2Fh, 02730h, 02331h
4332: DW 02332h, 02733h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h
4333: DW 03F3Ah, 03B3Bh, 03F3Ch, 03B3Dh, 03B3Eh, 03F3Fh, 00340h, 00741h
4334: DW 00742h, 00343h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h
4335: DW 01B4Ah, 01F4Bh, 01B4Ch, 01F4Dh, 01F4Eh, 01B4Fh, 00750h, 00351h
4336: DW 00352h, 00753h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h
4337: DW 01F5Ah, 01B5Bh, 01F5Ch, 01B5Dh, 01B5Eh, 01F5Fh, 02760h, 02361h
4338: DW 02362h, 02763h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h
4339: DW 03F6Ah, 03B6Bh, 03F6Ch, 03B6Dh, 03B6Eh, 03F6Fh, 02370h, 02771h
4340: DW 02772h, 02373h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h
4341: DW 03B7Ah, 03F7Bh, 03B7Ch, 03F7Dh, 03F7Eh, 03B7Fh, 08380h, 08781h
4342: DW 08782h, 08383h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h
4343: DW 09B8Ah, 09F8Bh, 09B8Ch, 09F8Dh, 09F8Eh, 09B8Fh, 08790h, 08391h
4344: DW 08392h, 08793h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h
4345:
4346: NEG_Table:
4347: DB 0,66,255,187,254,187,253,187,252,187,251,187,250,187,249,187,248,187,247,179
4348: DB 246,179,245,179,244,179,243,179,242,179,241,179,240,163,239,187,238,187,237,187
4349: DB 236,187,235,187,234,187,233,187,232,187,231,179,230,179,229,179,228,179,227,179
4350: DB 226,179,225,179,224,163,223,155,222,155,221,155,220,155,219,155,218,155,217,155
4351: DB 216,155,215,147,214,147,213,147,212,147,211,147,210,147,209,147,208,131,207,155
4352: DB 206,155,205,155,204,155,203,155,202,155,201,155,200,155,199,147,198,147,197,147
4353: DB 196,147,195,147,194,147,193,147,192,131,191,187,190,187,189,187,188,187,187,187
4354: DB 186,187,185,187,184,187,183,179,182,179,181,179,180,179,179,179,178,179,177,179
4355: DB 176,163,175,187,174,187,173,187,172,187,171,187,170,187,169,187,168,187,167,179
4356: DB 166,179,165,179,164,179,163,179,162,179,161,179,160,163,159,155,158,155,157,155
4357: DB 156,155,155,155,154,155,153,155,152,155,151,147,150,147,149,147,148,147,147,147
4358: DB 146,147,145,147,144,131,143,155,142,155,141,155,140,155,139,155,138,155,137,155
4359: DB 136,155,135,147,134,147,133,147,132,147,131,147,130,147,129,147,128,135,127,59
4360: DB 126,59,125,59,124,59,123,59,122,59,121,59,120,59,119,51,118,51,117,51
4361: DB 116,51,115,51,114,51,113,51,112,35,111,59,110,59,109,59,108,59,107,59
4362: DB 106,59,105,59,104,59,103,51,102,51,101,51,100,51,99,51,98,51,97,51
4363: DB 96,35,95,27,94,27,93,27,92,27,91,27,90,27,89,27,88,27,87,19
4364: DB 86,19,85,19,84,19,83,19,82,19,81,19,80,3,79,27,78,27,77,27
4365: DB 76,27,75,27,74,27,73,27,72,27,71,19,70,19,69,19,68,19,67,19
4366: DB 66,19,65,19,64,3,63,59,62,59,61,59,60,59,59,59,58,59,57,59
4367: DB 56,59,55,51,54,51,53,51,52,51,51,51,50,51,49,51,48,35,47,59
4368: DB 46,59,45,59,44,59,43,59,42,59,41,59,40,59,39,51,38,51,37,51
4369: DB 36,51,35,51,34,51,33,51,32,35,31,27,30,27,29,27,28,27,27,27
4370: DB 26,27,25,27,24,27,23,19,22,19,21,19,20,19,19,19,18,19,17,19
4371: DB 16,3,15,27,14,27,13,27,12,27,11,27,10,27,9,27,8,27,7,19
4372: DB 6,19,5,19,4,19,3,19,2,19,1,19
4373:
4374: ;- the end ------ (blimey) --------------------------------------------------;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.