221 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| # sleigh include file for Skeleton language instructions
 | |
| 
 | |
| define token opbyte (8)
 | |
|    op0_8     = (0,7)
 | |
|    op6_2     = (6,7)
 | |
|    
 | |
|    dRegPair4_2    = (4,5)
 | |
|    pRegPair4_2    = (4,5)
 | |
|    sRegPair4_2    = (4,5)
 | |
|    qRegPair4_2    = (4,5)
 | |
|    qRegPair4_2a   = (4,5)
 | |
|    qRegPair4_2b   = (4,5)
 | |
|    rRegPair4_2    = (4,5)
 | |
| 
 | |
|    reg3_3 = (3,5)
 | |
|    bits3_3   = (3,5)
 | |
|    
 | |
|    bits0_4   = (0,3)
 | |
|    
 | |
|    reg0_3 = (0,2)
 | |
|    bits0_3   = (0,2)
 | |
| ;
 | |
| 
 | |
| define token data8 (8)
 | |
|    imm8		= (0,7)
 | |
|    sign8	= (7,7)
 | |
|    simm8	= (0,7) signed
 | |
| ;
 | |
| 
 | |
| define token data16 (16)
 | |
|    timm4        = (12,15)
 | |
|    imm16        = (0,15)
 | |
|    sign16		= (15,15)
 | |
|    simm16		= (0,15) signed
 | |
| ;
 | |
| 
 | |
| attach variables [ reg0_3 reg3_3 ] [ B C D E H L _ A ];
 | |
| 
 | |
| attach variables [ sRegPair4_2 dRegPair4_2 ] [ BC DE HL SP ];
 | |
| 
 | |
| attach variables [ qRegPair4_2 ] [ BC DE HL AF ];
 | |
| attach variables [ qRegPair4_2a ] [ B D H A ];
 | |
| attach variables [ qRegPair4_2b ] [ C E L F ];
 | |
| 
 | |
| attach variables [ pRegPair4_2 ] [ BC DE IX SP ];
 | |
| attach variables [ rRegPair4_2 ] [ BC DE IY SP ];
 | |
| 
 | |
| ################################################################
 | |
| # Macros
 | |
| ################################################################
 | |
| 
 | |
| macro setResultFlags(result) {
 | |
| 	$(Z_flag) = (result == 0);
 | |
| 	$(S_flag) = (result s< 0);
 | |
| }
 | |
| 
 | |
| macro setAddCarryFlags(op1,op2) {
 | |
| 	$(C_flag) = (carry(op1,zext($(C_flag))) || carry(op2,op1 + zext($(C_flag))));
 | |
| }
 | |
| 
 | |
| macro setAddFlags(op1,op2) {
 | |
| 	$(C_flag) = carry(op1,op2);
 | |
| }
 | |
| 
 | |
| macro setSubtractCarryFlags(op1,op2) {
 | |
| 	notC = ~$(C_flag);
 | |
| 	$(C_flag) = ((op1 < sext(notC)) || (op2 < (op1 - sext(notC))));
 | |
| }
 | |
| 
 | |
| macro setSubtractFlags(op1,op2) {
 | |
| 	$(C_flag) = (op1 < op2);
 | |
| }
 | |
| 
 | |
| macro push16(val16) {
 | |
| 	SP = SP - 2;
 | |
| 	*:2 SP = val16; 
 | |
| }
 | |
| 
 | |
| macro pop16(ret16) {
 | |
| 	ret16 = *:2 SP;
 | |
| 	SP = SP + 2; 
 | |
| }
 | |
| 
 | |
| macro push8(val8) {
 | |
| 	SP = SP - 1;
 | |
| 	ptr:2 = SP;
 | |
| 	*:1 ptr = val8; 
 | |
| }
 | |
| 
 | |
| macro pop8(ret8) {
 | |
|     ptr:2 = SP;
 | |
| 	ret8 = *:1 ptr;
 | |
| 	SP = SP + 1; 
 | |
| }
 | |
| 
 | |
| ################################################################
 | |
| 
 | |
| ixMem8: (IX+simm8)  is IX & simm8								{ ptr:2 = IX + simm8; export *:1 ptr; }
 | |
| ixMem8: (IX-val)    is IX & simm8 & sign8=1	[ val = -simm8; ]	{ ptr:2 = IX + simm8; export *:1 ptr; }
 | |
| 
 | |
| iyMem8: (IY+simm8)  is IY & simm8								{ ptr:2 = IY + simm8; export *:1 ptr; }
 | |
| iyMem8: (IY-val)    is IY & simm8 & sign8=1	[ val = -simm8; ]	{ ptr:2 = IY + simm8; export *:1 ptr; }
 | |
| 
 | |
| Addr16: imm16		is imm16									{ export *:1 imm16; }
 | |
| 
 | |
| Mem16: (imm16)		is imm16									{ export *:2 imm16; }
 | |
| 
 | |
| RelAddr8: loc		is simm8  [ loc = inst_next + simm8; ]		{ export *:1 loc; }
 | |
| 
 | |
| cc: "NZ"            is bits3_3=0x0                              { c:1 = ($(Z_flag) == 0); export c; }
 | |
| cc: "Z"             is bits3_3=0x1                              { c:1 = $(Z_flag); export c; }
 | |
| cc: "NC"            is bits3_3=0x2                              { c:1 = ($(C_flag) == 0); export c; }
 | |
| cc: "C"             is bits3_3=0x3                              { c:1 = $(C_flag); export c; }
 | |
| cc: "PO"            is bits3_3=0x4                              { c:1 = ($(PV_flag) == 0); export c; }
 | |
| cc: "PE"            is bits3_3=0x5                              { c:1 = $(PV_flag); export c; }
 | |
| cc: "P"             is bits3_3=0x6                              { c:1 = ($(S_flag) == 0); export c; }
 | |
| cc: "M"             is bits3_3=0x7                              { c:1 = $(S_flag); export c; }
 | |
| 
 | |
| cc2: "NZ"            is bits3_3=0x4                              { c:1 = ($(Z_flag) == 0); export c; }
 | |
| cc2: "Z"             is bits3_3=0x5                              { c:1 = $(Z_flag); export c; }
 | |
| cc2: "NC"            is bits3_3=0x6                              { c:1 = ($(C_flag) == 0); export c; }
 | |
| cc2: "C"             is bits3_3=0x7                              { c:1 = $(C_flag); export c; }
 | |
| 
 | |
| ################################################################
 | |
| 
 | |
| 
 | |
| :LD IX,Mem16  is op0_8=0xdd & IX; op0_8=0x2a; Mem16 {
 | |
| 	IX = Mem16;
 | |
| }
 | |
| 
 | |
| :LD IY,Mem16  is op0_8=0xfd & IY; op0_8=0x2a; Mem16 {
 | |
| 	IY = Mem16;
 | |
| }
 | |
| 
 | |
| :LD Mem16,HL  is op0_8=0x22 & HL; Mem16 {
 | |
| 	Mem16 = HL;
 | |
| }
 | |
| 
 | |
| :LD Mem16,dRegPair4_2  is op0_8=0xed; op6_2=0x1 & dRegPair4_2 & bits0_4=0x3; Mem16 {
 | |
| 	Mem16 = dRegPair4_2;
 | |
| }
 | |
| 
 | |
| :LD Mem16,IX  is op0_8=0xdd & IX; op0_8=0x22; Mem16 {
 | |
| 	Mem16 = IX;
 | |
| }
 | |
| 
 | |
| :LD Mem16,IY  is op0_8=0xfd & IY; op0_8=0x22; Mem16 {
 | |
| 	Mem16 = IY;
 | |
| }
 | |
| 
 | |
| :NEG  is op0_8=0xed; op0_8=0x44 {
 | |
| 	$(PV_flag) = (A == 0x80);
 | |
| 	$(C_flag) = (A != 0);
 | |
| 	A = -A;
 | |
| 	setResultFlags(A);
 | |
| }
 | |
| 
 | |
| :SET bits3_3,ixMem8  is op0_8=0xdd; op0_8=0xcb; ixMem8; op6_2=0x3 & bits3_3 & bits0_3=0x6 {
 | |
| 	mask:1 = (1 << bits3_3);
 | |
| 	val:1 = ixMem8;
 | |
| 	ixMem8 = val | mask;
 | |
| }
 | |
| 
 | |
| :SET bits3_3,iyMem8  is op0_8=0xfd; op0_8=0xcb; iyMem8; op6_2=0x3 & bits3_3 & bits0_3=0x6 {
 | |
| 	mask:1 = (1 << bits3_3);
 | |
| 	val:1 = iyMem8;
 | |
| 	iyMem8 = val | mask;
 | |
| }
 | |
| 
 | |
| :JP Addr16  is op0_8=0xc3; Addr16 {
 | |
| 	goto Addr16;	
 | |
| }
 | |
| 
 | |
| :JP cc,Addr16  is op6_2=0x3 & cc & bits0_3=0x2; Addr16 {
 | |
| 	if (!cc) goto Addr16;
 | |
| }
 | |
| 
 | |
| :JR RelAddr8  is op0_8=0x18; RelAddr8 {
 | |
| 	goto RelAddr8;
 | |
| }
 | |
| 
 | |
| :JR cc2,RelAddr8  is op6_2=0x0 & cc2 & bits0_3=0x0; RelAddr8 {
 | |
| 	if (cc2) goto RelAddr8;
 | |
| }
 | |
| 
 | |
| :JP (HL)  is op0_8=0xe9 & HL {
 | |
| 	goto [HL];
 | |
| }
 | |
| 
 | |
| :JP (IX)  is op0_8=0xdd & IX; op0_8=0xe9 {
 | |
| 	goto [IX];
 | |
| }
 | |
| 
 | |
| :JP (IY)  is op0_8=0xfd & IY; op0_8=0xe9 {
 | |
| 	goto [IY];
 | |
| }
 | |
| 
 | |
| :CALL Addr16  is op0_8=0xcd; Addr16 {
 | |
|     push16(&:2 inst_next);
 | |
| 	call Addr16;
 | |
| }
 | |
| 
 | |
| :CALL cc,Addr16  is op6_2=0x3 & cc & bits0_3=0x4; Addr16 {
 | |
| 	if (!cc) goto inst_next;
 | |
|     push16(&:2 inst_next);
 | |
| 	call Addr16;
 | |
| }
 | |
| 
 | |
| :RET  is op0_8=0xc9 {
 | |
| 	pop16(PC);
 | |
| 	ptr:2 = zext(PC);
 | |
| 	return [ptr];
 | |
| }
 | |
| 
 | |
| :RET cc  is op6_2=0x3 & cc & bits0_3=0x0 {
 | |
| 	if (!cc) goto inst_next;
 | |
| 	pop16(PC);
 | |
| 	ptr:2 = zext(PC);
 | |
| 	return [ptr];
 | |
| }	
 |