diff --git a/src/samplesrc/test.pla b/src/samplesrc/test.pla
index 92fedc7..01b94d5 100755
--- a/src/samplesrc/test.pla
+++ b/src/samplesrc/test.pla
@@ -143,5 +143,6 @@ putln
 puti(mystruc)
 putln
 puts(@constr); puti(constval); putln
+puts("Signed byte constant:"); puti(-3); putln
 puts("Hello from in-line string!\$7F\n")
 done
diff --git a/src/toolsrc/codegen.c b/src/toolsrc/codegen.c
index b51ca6b..942a4e3 100755
--- a/src/toolsrc/codegen.c
+++ b/src/toolsrc/codegen.c
@@ -540,12 +540,12 @@ void emit_codetag(int tag)
 }
 void emit_const(int cval)
 {
-    if (cval == 0)
+    if (cval == 0x0000)
         printf("\t%s\t$00\t\t\t; ZERO\n", DB);
-    else if (cval > 0 && cval < 256)
+    else if ((cval & 0xFF00) == 0x0000)
         printf("\t%s\t$2A,$%02X\t\t\t; CB\t%d\n", DB, cval, cval);
-    else if ((cval&0xFF00) >= 0xFF00)
-        printf("\t%s\t$5E,$%02X\t\t\t; CFFB\t%d\n", DB, cval&0xFF, cval&0xFF);
+    else if ((cval & 0xFF00) == 0xFF00)
+        printf("\t%s\t$5E,$%02X\t\t\t; CFFB\t%d\n", DB, cval&0xFF, cval);
     else
         printf("\t%s\t$2C,$%02X,$%02X\t\t; CW\t%d\n", DB, cval&0xFF,(cval>>8)&0xFF, cval);
 }
diff --git a/src/vmsrc/plvm.c b/src/vmsrc/plvm.c
index f05e305..62356d6 100755
--- a/src/vmsrc/plvm.c
+++ b/src/vmsrc/plvm.c
@@ -776,7 +776,9 @@ void interp(code *ip)
                 fp += PLA;
             case 0x5C: // RET : IP = TOFP
                 return;
-            case 0x5E: // ???
+            case 0x5E: // CFFB : TOS = CONSTANTBYTE(IP) | 0xFF00
+                PUSH(BYTE_PTR(ip) | 0xFF00);
+                ip++;
                 break;
                 /*
                  * 0x60-0x6F