test to boot hpux11...
diff --git a/src/parisc/head.S b/src/parisc/head.S
index f3ed30f..e5c3408 100644
--- a/src/parisc/head.S
+++ b/src/parisc/head.S
@@ -446,6 +446,13 @@
 	addb,*>,n %r0,%r0,pdc_called_narrow /* branch if narrow addressing */
 
 pdc_called_wide:
+#if 0	/* automatically set wide-bit */
+	.import psw_defaults, data
+	load32_firmware psw_defaults,%r1	/* set PDC_PSW_ENDIAN_BIT in psw_defaults */
+	ldi PDC_PSW_ENDIAN_BIT,%r31
+	stw %r31,0(%r1)
+#endif
+
 	/* we know that PDC was called with PSW.W=1 */
 	load32_firmware pdc_entry_64_64,%r1
 	bv,n %r0(%r1)
@@ -546,11 +553,12 @@
 	cmpb,=,n %r1,%r0,5f	/* skip copy results */
 #endif
 
+	cmpib,>=,n 15,%arg2,5f /* skip copy results if target buffer in PAGE0 */
+
 	/* copy 64-bit-wide PDC result to 32-bit wide results */
 	/* TODO?: skip copy results if return value was < 0 */
 	ldi 32,%r1
 	copy %arg2,%arg3
-	cmpib,>=,n 15,%arg2,5f /* skip copy results if target buffer in PAGE0 */
 .L1:	ldd,ma 8(%arg2),%arg1
 	stwm %arg1, 4(%arg3)
 	ldo -1(%r1),%r1
diff --git a/src/parisc/parisc.c b/src/parisc/parisc.c
index 4e732b2..c502d07 100644
--- a/src/parisc/parisc.c
+++ b/src/parisc/parisc.c
@@ -65,6 +65,8 @@
 /* running 64-bit PDC, but called from 32-bit app */
 #define is_compat_mode()  (is_64bit_PDC() && ((psw_defaults & PDC_PSW_WIDE_BIT) == 0))
 
+#define COMPAT_VAL(val)   ((long)(int)(val))    // (is_compat_mode() ? (long)(int)(val) : (val))
+
 u8 BiosChecksum;
 
 char zonefseg_start, zonefseg_end;  // SYMBOLS
@@ -175,7 +177,7 @@
 
 #define MIN_RAM_SIZE	(16*1024*1024) // 16 MB
 
-#define CPU_HPA_IDX(i)  (CPU_HPA + (i)*0x1000) /* CPU_HPA of CPU#i */
+#define CPU_HPA_IDX(i)  (F_EXTEND(CPU_HPA) + (i)*0x1000) /* CPU_HPA of CPU#i */
 
 static int index_of_CPU_HPA(unsigned long hpa) {
     int i;
@@ -652,11 +654,11 @@
         offs = elroy_offset(pci->bdf);
         BUG_ON(offs == -1UL);
 #if 0
-        pfa = (unsigned long) elroy_port(0, offs);
+        pfa = F_EXTEND(elroy_port(0, offs));
         pfa += pci->bdf << 8;
         pfa |= SCSI_HPA;
 #else
-        pfa = pci_get_first_mmio_or_io(pci);
+        pfa = F_EXTEND(pci_get_first_mmio_or_io(pci));
         BUG_ON(!pfa);
 #endif
 #if 0
@@ -679,7 +681,7 @@
         pdev->mod_path  = &hppa_pci_mod_path[curr_pci_devices];
         pdev->num_addr  = 0;
         pdev->pci = pci;
-        pdev->hpa_parent = pci_hpa;
+        pdev->hpa_parent = F_EXTEND(pci_hpa);
         pdev->index     = curr_pci_devices;
         dprintf(1, "PCI device #%d %pP bdf 0x%x at pfa 0x%lx\n", curr_pci_devices, pci, pci->bdf, pfa);
 
@@ -696,6 +698,8 @@
 {
     int i;
 
+    hpa = COMPAT_VAL(hpa);
+
     /* search classical HPPA devices */
     if (hpa) {
         for (i = 0; i < (MAX_DEVICES-1); i++) {
@@ -1107,7 +1111,7 @@
 
 int __VISIBLE parisc_iodc_ENTRY_IO(unsigned int *arg FUNC_MANY_ARGS)
 {
-    unsigned long hpa = ARG0;
+    unsigned long hpa = COMPAT_VAL(ARG0);
     unsigned long option = ARG1;
     unsigned int *result = (unsigned int *)ARG4;
     hppa_device_t *dev;
@@ -1116,9 +1120,9 @@
     struct disk_op_s disk_op;
 
     dev = find_hpa_device(hpa);
+printf("HPA = %lx  dev %p\n", hpa, dev);
     if (!dev) {
 
-printf("HPA = %lx\n", hpa);
         BUG_ON(1);
         return PDC_INVALID_ARG;
     }
@@ -1223,7 +1227,7 @@
 
 int __VISIBLE parisc_iodc_ENTRY_INIT(unsigned int *arg FUNC_MANY_ARGS)
 {
-    unsigned long hpa = ARG0;
+    unsigned long hpa = COMPAT_VAL(ARG0);
     unsigned long option = ARG1;
     unsigned long *result = (unsigned long *)ARG4;
     hppa_device_t *dev;
@@ -1280,7 +1284,7 @@
 
 int __VISIBLE parisc_iodc_ENTRY_TEST(unsigned int *arg FUNC_MANY_ARGS)
 {
-    unsigned long hpa = ARG0;
+    unsigned long hpa = COMPAT_VAL(ARG0);
     unsigned long option = ARG1;
     unsigned int *result = (unsigned int *)ARG4;
     hppa_device_t *dev;
@@ -1411,7 +1415,10 @@
     switch (option) {
         case PDC_CHASSIS_DISP:
             ARG3 = ARG2;
+            /* WARNING: Avoid copyig the 64-bit result array to ARG2 */
+            ARG2 = 0;   /* do not write back in compat mode */
             result = (unsigned long *)&ARG4; // do not write to ARG2, use &ARG4 instead
+    printf("\nPDC_CHASSIS: %p ARG3 = %lx\n", result, ARG3);
             // fall through
         case PDC_CHASSIS_DISPWARN:
             ARG4 = (ARG3 >> 17) & 7;
@@ -1624,6 +1631,7 @@
     switch (option) {
         case PDC_HPA_PROCESSOR:
             hpa = mfctl(CPU_HPA_CR_REG); /* get CPU HPA from cr7 */
+printf("HPA = %lx\n", hpa);
             i = index_of_CPU_HPA(hpa);
             BUG_ON(i < 0 || i >= smp_cpus); /* ARGH, someone modified cr7! */
             result[0] = hpa;    /* CPU_HPA */
@@ -1666,14 +1674,11 @@
     // dprintf(1, "\n\nSeaBIOS: Info PDC_IODC function %ld ARG3=%lx ARG4=%lx ARG5=%lx ARG6=%lx\n", option, ARG3, ARG4, ARG5, ARG6);
     switch (option) {
         case PDC_IODC_READ:
-            if (is_compat_mode())
-                hpa = (long)(int)ARG3;
-            else
-                hpa = ARG3;
+            hpa = COMPAT_VAL(ARG3);
             // dev = find_hpa_device(hpa);
             // searches for 0xf1041000
             dev = find_hppa_device_by_hpa(hpa);
-            // dprintf(1, "pdc_iodc found dev %p\n", dev);
+            printf("pdc_iodc found dev %p\n", dev);
             if (!dev)
                 return -4; // not found
 
@@ -2232,7 +2237,7 @@
 
     switch (option) {
         case PDC_PAT_CPU_GET_NUMBER:
-            hpa = ARG3;
+            hpa = COMPAT_VAL(ARG3);
             result[0] = index_of_CPU_HPA(hpa);
             result[1] = hpa;    /* location */
             result[2] = 0;      /* num siblings */
@@ -2305,8 +2310,9 @@
     unsigned long option = ARG1;
 
     if (pdc_debug & DEBUG_PDC) {
-        printf("\nSeaBIOS: Start PDC proc %s(%ld) option %ld result=0x%lx ARG3=0x%lx %s ",
-                pdc_name(ARG0), ARG0, ARG1, ARG2, ARG3, (proc == PDC_IODC)?hpa_name(ARG3):"");
+        printf("\nSeaBIOS: Start PDC%d proc %s(%ld) option %ld result=0x%lx ARG3=0x%lx %s ",
+                is_compat_mode() ? 32 : 64, pdc_name(ARG0), ARG0, ARG1, ARG2, ARG3,
+                (proc == PDC_IODC)?hpa_name(ARG3):"");
         printf("ARG4=0x%lx ARG5=0x%lx ARG6=0x%lx ARG7=0x%lx\n", ARG4, ARG5, ARG6, ARG7);
     }