23.11.1996 Mika Heiskanen mheiskan@delta.hut.fi Hack Library v9.2 This library is a collection of various utilities I've programmed myself or saved from various sources over the years. All the commands work in SX and GX unless otherwise noted. All commands also work from covered ports. Many of the common 'hacking'-library commands are directly from various sources, such as <-LIB-> by Detlef Mueller, Rick Grevelle's Tools library and Mario Mikocevic's personal hacking library. Credits for whom they belong, I've lost the information a long time ago as this library started out just as a personal collection of favourite hacking programs. I have mentioned original authors though when I've been sure about them. Suggested key bindings: Command Key ------- --- COERCE [->NUM] PG [PURGE] XRCL [RCL] XSTO [STO] STOX [DEF] UP [UP] Command Index --------------- COERCE - Perform object conversions XRCL - General RCL replacement XSTO - General STO replacement TIM - High precision timer USEND - Fast IR send URECV - Fast IR receive BZ - Compressor RFU - RF uncompressor SYS - Floating point number conversions + SYSEVAL COD - Convert hex data to object DCOD - Convert object to hex data OBJFIX - Fix bad download (by HP) VARS - Fast VARS replacement VARS2 - Fast VARS which lists nullids too PG - General PURGE replacement PG0 - Purge everything in port0 ORD - Fast ORDER replacement REN - Rename variable TB - Tabify srpl/ml source code FMT - Format data in a hex string into readable form ITYPE - Get type number of object CTIM - Measure cycle count for instruction (Requires Jazz) DTEMP - Dump non-bints from tempob area GRX2 - Double the size of a grob CDHD - Change into hidden directory WKEY - Wait for key press, get corresponding object SC - Memory scanner by Rick Grevelle (Requires UFL) ->ASC - Convert object to hex chars USE - Subroutine usage analyzer PMEM - Return free memory in port by Christophe Meynard D->LIB - Library builder by Rick Grevelle L->DIR - Library splitter by Rick Grevelle OB-> - Object splitter ->DIR - Directory builder by Rick Grevelle ->PRG - Program builder ->XLIB - Romptr builder ->ALG - Symbolic builder ->BAK - Backup object builder ->ID - Identifier builder ADDR - Returns address of object LBCRC - Recalculate library CRC RHASH - Recall library hash table RLINK - Recall library link table RMSG - Recall library message table RTITLE - Recall library title XGET - XRECV replacement (fixes the memory bug) (GX only) USES - Subroutine usage analyzer USED - Subroutine usage analyzer BY - BYTES command STOX - Store variable to desired position UP - Replacement for UPDIR Syntax Descriptions ------------------- COERCE % --> # hxs --> # # --> % %% --> % C%% --> C% chr --> $ other --> [->NUM] XRCL $bz --> ob (Convenient key for BZ) id --> ob lam --> ob PICT --> grob romptr --> ob hxs_adr --> ob #addr --> ob acptr --> ob %port --> Pvars (All objects in port) %lid --> Libs (With port numbers) :&:lid --> lib (Works for unprologed libs too) tagged --> ob {seco} --> seco {romptr} --> ob {path} --> ob XSTO ob tag --> Libraries will be installed ob id --> into use automatically. ob lam --> Reports if config object ob symb --> bypass was suspect. grob PICT --> backup %port --> lib %port --> USEND ob --> {names} --> URECV --> ? BZ ob --> $bz $bz --> ob RFU $rf --> ob SYS hxs_addr--> ? (SYSEVAL) % --> %% (also arrays) C% --> C%% %% --> % (also arrays) C%% --> C% COD $ --> ob (whitespace is ignored) DCOD ob --> $ (whitespace shows rpl structure) OBJFIX $ --> ob VARS --> {ids} VARS2 --> {ids} PG id --> tagged --> PICT --> %lid --> (purges active lib) {ob} --> (containing any of above types) PG0 --> ( 0 PVARS PG ) ORD {ids} --> REN old new --> (Renames variable) TB $ --> $' ITYPE ob --> #type DTEMP --> ob1 .. obn CDHD --> WKEY --> ob %keycode ->ASC ob --> $ PMEM %port --> %bytesfree FMT $ %nibbles %columns --> $ OB-> arry --> obs {dims} seco --> obs %n ->PRG is reverse symb --> obs %n ->ALG is reverse romp --> %lid %cmd ->XLIB is reverse rrp --> obs %n ->DIR is reverse backup --> ob id ->BAK is reverse id --> $ ->ID is reverse #addr --> ob acptr --> ob + default OBJ-> stuff ADDR ob --> hxs_addr LBCRC lib --> lib' RHASH %lid --> hash table RLINK %lid --> link table RCFG %lid --> config object RMSG %lid --> message table RTITLE %lid --> library title STOX ob id --> Keys: VAR, UP = page 1 NXT, RIGHT = next page LEFT = previous page DOWN = last page Menu keys = insert variable ON = abort UP --> UPDIR replacement which goes to the page in which the old directory was USE rrp --> { name1 { name1_calls } .. ob --> { name1 { name1_calls } .. USED rrp --> { name1 { calls_name1 } .. USES rrp id --> { calls_id } D->LIB rrp --> lib --> lib (Uses current directory) L->DIR lib --> rrp %lid --> rrp (Cannot handle internal libs!) hxs_lid --> rrp TIM ob --> :ticks: %time_unit Returns time in seconds if time >= 0.1s, else in milliseconds. "Accuracy" is 0.02 ticks in GX, 0.03 ticks in SX. The high accuracy becomes meaningless for long execution times due to CPU speed variations. CTIM $instr --> %nibbles %cycles_even %cycles_odd Measures cycle count for opcode(s) at even and odd addresses. Details on proper use: 1) Special instructions such as CONFIG, PC=A etc cannot be measured directly. 2) Register D is used as a loop counter during the measurement and cannot thus be used. 3) D0 and D1 are initialized to point inside IRAMBUFF so that on SX D0 = #70100 and D1 = #70101, on GX D0 = #80100 and D1 = #80101. 4) Accuracy may be lost if measuring long opcode sequences. Examples on GX: SASM.DOC cycles "A=DAT1 A" -> 18.00 19.50 18 "SETDEC" -> 2.75 3.00 3 "A=R0" -> 11.00 12.25 19 "ASRB" -> 11.50 12.75 20 "A=A+1 A" -> 4.75 5.00 7 "A=A+1 X" -> 4.50 5.75 6 "P= 4" -> 2.50 2.50 2 "P= 4\n A=A+1 WP" -> 8.00 9.25 10 (2+8) SC --> (Start at address #00100) #addr --> hxs_adr --> Key Description ^^^ ^^^^^^^^^^^ [Cursor keys] Move cursor [0-9A-F] Poke nibble [-] Previous nibble [+] Next nibble [*] Skip #100 nibbles [/] Back #100 nibbles [+/-] Toggle ascii/hex [ENTER] Go to address #100 [<==] Go to address of RAM [DEL] Go to address #C0000 [EEX] Go to address #80000 [SIN] Go to TEMPTOP address \ Left to right [COS] Go to RSKTOP address = [TAN] Go to DSKTOP address Low mem to hi mem [SQRT] Go to ROMPARTS address / [1/X] Jump to address at cursor [y^x] Skip object [EVAL] Evaluate RPL at cursor [SPC] Dump 32Kb starting at cursor