PROCinit base% = &33C0000 DIM hdr% 15 FOR pod% = 0 TO 3 podbase% = base% + pod%*&4000 PRINT "Podule ";pod%;":" SYS "XPodule_ReadID",,,,pod% TO lowbyte%;f% IF f% AND 1 THEN PRINT "not present" ELSE IF lowbyte% AND &80 THEN PRINT "non-confomant ELSE IF (lowbyte% AND &74) = 0 THEN PRINT "extended ECId" SYS "Podule_ReadHeader",,,hdr%, pod% flags% = hdr%?1 CASE flags% AND &0C OF WHEN 0: PRINT "8-bit code" WHEN 4: PRINT "16-bit code" WHEN 8: PRINT "32-bit code" ENDCASE prodlow% = hdr%?3 prodhigh% = hdr%?4 manlow% = hdr%?5 manhigh% = hdr%?6 PRINT "Manufacturer ";RIGHT$("000"+STR$~(manlow%+(manhigh%<<8)),4); PRINT " product ";RIGHT$("000"+STR$~(prodlow%+(prodhigh%<<8)),4); PRINT " country ";RIGHT$("0"+STR$~(hdr%?7)) IF flags% AND 2 THEN PRINT "irq/fiq flags relocated" fiqmask% = hdr%?8 IF fiqmask% THEN fiqaddr% = hdr%?9 + (hdr%?10 << 8) + (hdr%?11 << 16) PRINT "fiq flag at &";~fiqaddr%;" mask &";~fiqmask% ENDIF irqmask% = hdr%?12 IF irqmask% THEN irqaddr% = hdr%?13 + (hdr%?14 << 8) + (hdr%?15 << 16) PRINT "irq flag at &";~irqaddr%;" mask &";~irqmask% ENDIF ENDIF IF flags% AND 1 THEN PRINT "chunk directory present" ptr% = podbase%+&40 REPEAT chunktype% = FNget_byte(ptr%) chunklen% = FNget_byte(ptr%+4) + (FNget_byte(ptr%+8) << 8) + (FNget_byte(ptr%+12) << 16) IF chunklen% <> 0 THEN chunkaddr% = FNget_byte(ptr%+16) + (FNget_byte(ptr%+20) << 8) + (FNget_byte(ptr%+24) << 16) + (FNget_byte(ptr%+28) << 24) PRINT "chunk type &";~chunktype%;" address &";~chunkaddr%;" length &";~chunklen%; CASE chunktype% AND &70 OF WHEN &00 PRINT " (RISC OS"; CASE chunktype% AND &0F OF WHEN &00: PRINT " loader"; WHEN &01: PRINT " BBC ROM"; OTHERWISE: PRINT " type &";~chunktype% AND &0F; ENDCASE PRINT ")" WHEN &70 PRINT " (device"; CASE chunktype% AND &0F OF WHEN &00: PRINT " link"; WHEN &01: PRINT " serial number """;FNget_string(podbase%+(chunkaddr%<<2), chunklen%);""""; WHEN &02: PRINT " date of manufacture """;FNget_string(podbase%+(chunkaddr%<<2), chunklen%);""""; WHEN &03: PRINT " modification status """;FNget_string(podbase%+(chunkaddr%<<2), chunklen%);""""; WHEN &04: PRINT " place of manufacture """;FNget_string(podbase%+(chunkaddr%<<2), chunklen%);""""; WHEN &05: PRINT " description """;FNget_string(podbase%+(chunkaddr%<<2), chunklen%);""""; WHEN &06: PRINT " part number """;FNget_string(podbase%+(chunkaddr%<<2), chunklen%);""""; WHEN &07: PRINT " Ethernet address"; WHEN &08: PRINT " hardware revision"; WHEN &09: PRINT " ROM CRC"; OTHERWISE: PRINT " type &";~chunktype% AND &0F; ENDCASE PRINT ")" OTHERWISE PRINT ENDCASE ENDIF ptr% += 32 UNTIL chunklen% = 0 ENDIF ELSE PRINT "simple ID &";~(lowbyte% AND &74)>>3 ENDIF ENDIF ENDIF NEXT END DEF FNget_string(addr%, len%) LOCAL str$, i%, chr% str$ = "" FOR i% = 0 TO len%-1 chr% = FNget_byte(addr%+4*i%) IF chr% < 32 THEN IF chr% <>0 THEN str$ += "%"+RIGHT$("0"+STR$~(chr%), 2) ELSE str$ += CHR$(chr%) ENDIF NEXT =str$ DEF FNget_byte(A%) =USR(get_byte%) DEF PROCinit DIM x% 100 P% = x% [ OPT 3 .get_byte% SWI "OS_EnterOS" LDRB R0,[R0] TEQP PC,#0 MOV R0,R0 MOV PC,R14 ] ENDPROC