! ISMDEF Version 2.0(7) Written by J.R.Bown 18-Jul-90 ! *************************************************************** ! * * ! * A-Shell ISAM file access definitions * ! * and global definitions * ! * * ! *************************************************************** ! Edit history of ISMDEF.BSI:- ! 18-Jul-90 - Write it to ease ISMDMP.LIT implementation./ JRB ! 21-Aug-90 - Handle ODD key sizes in directory blocks properly./ JRB ! 22-Aug-90 - Add code to handle next directory (same level) ptr./ JRB ! 23-Aug-90 - Add definitions for ISMBLD.LIT implementation./ JRB ! 30-Jul-91 - Add SECONDARY'FLAG for secondary index support./ JRB ! 9-Sep-91 - Change SECONDARY'FLAG to bitmapped INDEX'TYPE./ JRB ! 4-Nov-93 - Add DATA'DEV for stored data file device./ JRB ! 7-May-95 - Add DIR'BLOCK'SIZE symbol to rock /jdm (see [jm]) ! 23-Jan-97 - [1] Take advantage of new ability in 4.2(533) to read ! a rec into a larger unformatted var /jdm ! 17-Aug-99 - [2] Increase NO'DIR'BLOCKS from B,2 to B,4 to allow >64K /jdm ! 25-Jun-03 - [3] Expand max rec length supported from 2048 to 4096 /jdm ! ! Version 2.0 - (variable IDX block size) ! 24-Jul-08 - [4] Support block sizes up to 16384 bytes (up from 512) /jdm ! 28-Jul-08 - [5] Add IDX'DIR'LEVELS /jdm ! 29-Jul-08 - [6] Add I'SWB, I'ASH51, MAX_ISAM_xxx, IBF_xxx /jdm ! 02-Aug-08 - [7] Increase record buf from 4096 to 16384; ! chg IBF_SECONDARY to 2 (to match I'SECONDARY) /jdm define MAX_ISAM_KEY_SIZE = 164 ! [6] define MAX_ISAM_IDX_BLOCK_SIZE = 16384 ! [6] define MAX_ISAM_IDX_LEVELS = 9 ! [6] define MAX_ISAM_IDA_RECORD_SIZE = 16384 ! [7] ! [6] flags used in ISMBLD.SBX define IBF_SECONDARY = &h0002 ! build secondary index [7] was 1 define IBF_AUTOBLKLVL = &h0004 ! auto compute block size and levels define IBF_EXISTING = &h0008 ! process existing file (else error if exists) [7] was 2 define IBF_PROGRESS1 = &h0100 ! progress style 1 (% at cursor location) map1 I'VARIABLE,f,6,1 ! File has variable length records map1 I'SECONDARY,f,6,2 ! File is secondary directory map1 I'OLDFORMAT,f,6,4 ! File is old format header map1 I'ASH51,f,6,&h0080 ! A-Shell 5.1 flag (block size & levels) map1 I'SWB,f,6,&h3000 ! SWB IDX? map1 MAXKEY,f,6,164 ! Maximum symbolic key size map1 DIR'BLOCK,f,6 ! Directory block map1 DIR'ENTRY,f,6 ! Directory entry map1 FIDA,f,6,2 ! ISAM .IDA file channel map1 KIDA,f,6 ! ISAM .IDA file key map1 FIDX,f,6,1 ! ISAM .IDX file channel map1 KIDX,f,6 ! ISAM .IDX file key map1 FSEQ,f,6,3 ! Sequential .SEQ file channel map1 FISAM,f,6,4 ! ISAM #ISAM file channel map1 KISAM,f,6 ! ISAM #ISAM file key map1 FISAM2,f,6,6 ! Secondary ISAM #ISAM file channel map1 KISAM2,f,6 ! Secondary ISAM #ISAM file key map1 ISAM'DIRECTORY,x,16384 ! ISAM directory block [4] (was ,512) map1 ISAM'D'ENTRY ! ISAM directory entry map2 DIR'KEY,x,164 ! Up to 164 byte key map2 DIR'PTR,b,4 ! Pointer to data record map2 DIR'PTR'O,@DIR'PTR map3 DIR'PTR'1,b,2 map3 DIR'PTR'2,b,2 map2 NEXT'PTR,b,4 ! Pointer to next directory block map1 DATA'DEVICE,s,6 ! ASCII of data device map1 ISAM'HEADER ! ISAM file header format map2 DATA'DEV'RAD50 map3 DATA'DEVDEV,b,2 ! RAD50 device name map3 DATA'DEVDRV,b,2 ! Drive number map2 ISAM'X'3,x,2 ! Unknown map2 UPDATE'COUNTER,b,4 ! Update counter map2 UPDATE'COUNTER'O,@UPDATE'COUNTER map3 UPDATE'COUNTER'1,b,2 map3 UPDATE'COUNTER'2,B,2 map2 RECORD'SIZE,b,2 ! Record size map2 KEY'SIZE,b,1 ! Size of key map2 DIR'SIZE,b,1 ! Size of directory entry map2 DIR'ENTRIES,b,2 ! Entries per directory block map2 KEY'POSITION,b,2 ! Position of key map2 DATA'ENTRIES,b,2 ! Data record blocking factor map2 IDA'FREELIST,b,4 ! Data file free list pointer map2 IDA'FREELIST'O,@IDA'FREELIST map3 IDA'FREELIST'1,b,2 map3 IDA'FREELIST'2,B,2 map2 IDA'FREECOUNT,b,4 ! Data file freecount map2 IDA'FREECOUNT'O,@IDA'FREECOUNT map3 IDA'FREECOUNT'1,b,2 map3 IDA'FREECOUNT'2,B,2 map2 IDX'FREELIST,b,4 ! Index file free list pointer map2 IDX'FREELIST'O,@IDX'FREELIST map3 IDX'FREELIST'1,b,2 map3 IDX'FREELIST'2,B,2 map2 IDX'FREECOUNT,b,4 ! Index file freecount map2 IDX'FREECOUNT'O,@IDX'FREECOUNT map3 IDX'FREECOUNT'1,b,2 map3 IDX'FREECOUNT'2,B,2 map2 RECORDS'USED,b,4 ! No. data records allocated map2 RECORDS'USED'O,@RECORDS'USED map3 RECORDS'USED'1,b,2 map3 RECORDS'USED'2,B,2 map2 ISAM'X'4,x,2 ! Unknown map2 ISAM'X'5,x,2 ! Unknown map2 ISAM'X'6,x,2 ! Unknown map2 ISAM'X'7,x,2 ! Unknown map2 TOP'DIR'BLOCK,b,4 ! Top dir blk pointer map2 TOP'DIR'BLOCK'O,@TOP'DIR'BLOCK map3 TOP'DIR'BLOCK'1,b,2 map3 TOP'DIR'BLOCK'2,b,2 ![jm] map2 ISAM'X'8,x,32 ! Unknown map2 ISAM'X'8A,x,8 ! [jm] Unknown map2 DIR'BLOCK'SIZE,b,2 ! [jm] directory blk size (512/1024/2048) map2 ISAM'X'8B,x,20 ! [jm] Unknown [2] (was 22) map2 NO'DIR'BLOCKS,b,4 ! [2] No. directory blocks map2 NO'DIR'BLOCKS'0,@NO'DIR'BLOCKS ! [2] map3 NO'DIR'BLOCKS'1,b,2 ! [2] map3 NO'DIR'BLOCKS'2,b,2 ! [2] map2 ISAM'X'9,x,23 ! Unknown [5] was 24 map2 IDX'DIR'LEVELS,b,1 ! [5] map2 INDEX'TYPE,b,2 ! Secondary index flag map2 ISAM'X'10,x,176 ! Filler to 512 bytes map1 SWAPPER,f,6 ! Variable used in word swaps map1 RECORDDATA ! FILFIX-style technique map2 RECORD,x,16384 ! Master record [1] was 512 [3] was 2048 [7] was 4096 ! map2 FILLER1,x,64,@RECORD ! Fillers for reading variable length ! map2 FILLER2,x,128,@RECORD ! records ! map2 FILLER3,x,192,@RECORD ! map2 FILLER4,x,256,@RECORD ! map2 FILLER5,x,320,@RECORD ! map2 FILLER6,x,384,@RECORD ! map2 FILLER7,x,448,@RECORD map2 F(512),x,1,@RECORD ! Short variable name ! Due to the nature of AlphaBasic, the only way to read variable ! length records is to use error trapping to trap 'record size overflow' ! [1] The above is now changed in A-Shell 4.2(533) and higher to allow ! [1] a read into a larger unformatted rec ![1] on error goto OVERFLOW'TRAP goto SKIP'ISAM ! *** Routine to read and swap longwords in ISAM'HEADER *** READ'ISAM'HEADER: read #FIDX,ISAM'HEADER KIDX = 0 call SWAP'HEADER'BYTES if DATA'DEVDEV then & xcall UNPACK,DATA'DEVDEV,DATA'DEVICE : & DATA'DEVICE = DATA'DEVICE[1;3]+str(DATA'DEVDRV) & else & DATA'DEVICE = "" return ! *** Routine to swap longwords and write ISAM'HEADER *** WRITE'ISAM'HEADER: call SWAP'HEADER'BYTES if DATA'DEVICE <> "" then & xcall PACK,DATA'DEVICE,DATA'DEVDEV : & DATA'DEVDRV = val(DATA'DEVICE[4,-1]) & else & DATA'DEVDEV = 0 : & DATA'DEVDRV = 0 KIDX = 0 write #FIDX,ISAM'HEADER return ! *** Internal routine to swap bytes from BASIC to native AMOS longwords *** SWAP'HEADER'BYTES: SWAPPER = UPDATE'COUNTER'1 UPDATE'COUNTER'1 = UPDATE'COUNTER'2 UPDATE'COUNTER'2 = SWAPPER SWAPPER = IDA'FREELIST'1 IDA'FREELIST'1 = IDA'FREELIST'2 IDA'FREELIST'2 = SWAPPER SWAPPER = IDA'FREECOUNT'1 IDA'FREECOUNT'1 = IDA'FREECOUNT'2 IDA'FREECOUNT'2 = SWAPPER SWAPPER = IDX'FREELIST'1 IDX'FREELIST'1 = IDX'FREELIST'2 IDX'FREELIST'2 = SWAPPER SWAPPER = IDX'FREECOUNT'1 IDX'FREECOUNT'1 = IDX'FREECOUNT'2 IDX'FREECOUNT'2 = SWAPPER SWAPPER = RECORDS'USED'1 RECORDS'USED'1 = RECORDS'USED'2 RECORDS'USED'2 = SWAPPER SWAPPER = TOP'DIR'BLOCK'1 TOP'DIR'BLOCK'1 = TOP'DIR'BLOCK'2 TOP'DIR'BLOCK'2 = SWAPPER SWAPPER = NO'DIR'BLOCKS'1 ! [2] NO'DIR'BLOCKS'1 = NO'DIR'BLOCKS'2 ! [2] NO'DIR'BLOCKS'2 = SWAPPER ! [2] return ! *** Routine to read ISAM directory block *** READ'ISAM'DIRECTORY: KIDX = DIR'BLOCK read #FIDX,ISAM'DIRECTORY DIR'KEY = ISAM'DIRECTORY[1+(DIR'ENTRY-1)*DIR'SIZE;KEY'SIZE] DIR'PTR'O = ISAM'DIRECTORY[1+(DIR'ENTRY-1)*DIR'SIZE+DIR'SIZE-4;4] call SWAP'PTR'BYTES return ! *** Routine to set up next free and same level directory entry pointers *** READ'PTR'DIRECTORY: KIDX = DIR'BLOCK read #FIDX,ISAM'DIRECTORY ![4] DIR'PTR'O = ISAM'DIRECTORY[509;4] DIR'PTR'O = ISAM'DIRECTORY[(DIR'BLOCK'SIZE-3);4] ! [4] was 509;4 call SWAP'PTR'BYTES NEXT'PTR = DIR'PTR DIR'PTR'O = ISAM'DIRECTORY[1;4] call SWAP'PTR'BYTES return ! *** Routine to swap directory pointer bytes *** SWAP'PTR'BYTES: SWAPPER = DIR'PTR'1 DIR'PTR'1 = DIR'PTR'2 DIR'PTR'2 = SWAPPER return ! *** Routine to read record of general size from file *** ! AlphaBasic will not allow READ #G'CHANNEL,RECORD[1;GREC'SIZE] ! Hence the following - in conjunction with error trapping RD'FILE: ! [1] Following trick no longer necessary as of A-Shell 4.2(533) ! if RECORD'SIZE < 64 then & ! read #FISAM,F(1),F(2),F(3),F(4),F(5),F(6),F(7),F(8), & ! F(9),F(10),F(11),F(12),F(13),F(14),F(15),F(16), & ! F(17),F(18),F(19),F(20),F(21),F(22),F(23),F(24), & ! F(25),F(26),F(27),F(28),F(29),F(30),F(31),F(32), & ! F(33),F(34),F(35),F(36),F(37),F(38),F(39),F(40), & ! F(41),F(42),F(43),F(44),F(45),F(46),F(47),F(48), & ! F(49),F(50),F(51),F(52),F(53),F(54),F(55),F(56), & ! F(57),F(58),F(59),F(60),F(61),F(62),F(63) : & ! goto EX'RD'FILE ! if RECORD'SIZE < 128 then & ! read #FISAM,FILLER1,F(65),F(66),F(67),F(68),F(69),F(70),F(71),F(72),& ! F(73),F(74),F(75),F(76),F(77),F(78),F(79),F(80), & ! F(81),F(82),F(83),F(84),F(85),F(86),F(87),F(88), & ! F(89),F(90),F(91),F(92),F(93),F(94),F(95),F(96), & ! F(97),F(98),F(99),F(100),F(101),F(102),F(103),F(104), & ! F(105),F(106),F(107),F(108),F(109),F(110),F(111),F(112), & ! F(113),F(114),F(115),F(116),F(117),F(118),F(119),F(120), & ! F(121),F(122),F(123),F(124),F(125),F(126),F(127) ! goto EX'RD'FILE ! if RECORD'SIZE > 191 goto SKIP'RD1 ! read #FISAM,FILLER2,F(129),F(130),F(131),F(132),F(133),F(134),F(135),F(136), & ! F(137),F(138),F(139),F(140),F(141),F(142),F(143),F(144), & ! F(145),F(146),F(147),F(148),F(149),F(150),F(151),F(152), & ! F(153),F(154),F(155),F(156),F(157),F(158),F(159),F(160), & ! F(161),F(162),F(163),F(164),F(165),F(166),F(167),F(168), & ! F(169),F(170),F(171),F(172),F(173),F(174),F(175),F(176), & ! F(177),F(178),F(179),F(180),F(181),F(182),F(183),F(184), & ! F(185),F(186),F(187),F(188),F(189),F(190),F(191) ! goto EX'RD'FILE !SKIP'RD1: ! if RECORD'SIZE > 255 goto SKIP'RD2 ! read #FISAM,FILLER3,F(193),F(194),F(195),F(196),F(197),F(198),F(199),F(200), & ! F(201),F(202),F(203),F(204),F(205),F(206),F(207),F(208), & ! F(209),F(210),F(211),F(212),F(213),F(214),F(215),F(216), & ! F(217),F(218),F(219),F(220),F(221),F(222),F(223),F(224), & ! F(225),F(226),F(227),F(228),F(229),F(230),F(231),F(232), & ! F(233),F(234),F(235),F(236),F(237),F(238),F(239),F(240), & ! F(241),F(242),F(243),F(244),F(245),F(246),F(247),F(248), & ! F(249),F(250),F(251),F(252),F(253),F(254),F(255) ! goto EX'RD'FILE !SKIP'RD2: ! if RECORD'SIZE > 319 goto SKIP'RD3 ! read #FISAM,FILLER4,F(257),F(258),F(259),F(260),F(261),F(262),F(263),F(264), & ! F(265),F(266),F(267),F(268),F(269),F(270),F(271),F(272), & ! F(273),F(274),F(275),F(276),F(277),F(278),F(279),F(280), & ! F(281),F(282),F(283),F(284),F(285),F(286),F(287),F(288), & ! F(289),F(290),F(291),F(292),F(293),F(294),F(295),F(296), & ! F(297),F(298),F(299),F(300),F(301),F(302),F(303),F(304), & ! F(305),F(306),F(307),F(308),F(309),F(310),F(311),F(312), & ! F(313),F(314),F(315),F(316),F(317),F(318),F(319) ! goto EX'RD'FILE !SKIP'RD3: ! if RECORD'SIZE > 383 goto SKIP'RD4 ! read #FISAM,FILLER5,F(321),F(322),F(323),F(324),F(325),F(326),F(327),F(328), & ! F(329),F(330),F(331),F(332),F(333),F(334),F(335),F(336), & ! F(337),F(338),F(339),F(340),F(341),F(342),F(343),F(344), & ! F(345),F(346),F(347),F(348),F(349),F(350),F(351),F(352), & ! F(353),F(354),F(355),F(356),F(357),F(358),F(359),F(360), & ! F(361),F(362),F(363),F(364),F(365),F(366),F(367),F(368), & ! F(369),F(370),F(371),F(372),F(373),F(374),F(375),F(376), & ! F(377),F(378),F(379),F(380),F(381),F(382),F(383) ! goto EX'RD'FILE !SKIP'RD4: ! if RECORD'SIZE > 447 goto SKIP'RD5 ! read #FISAM,FILLER6,F(385),F(386),F(387),F(388),F(389),F(390),F(391),F(392), & ! F(393),F(394),F(395),F(396),F(397),F(398),F(399),F(400), & ! F(401),F(402),F(403),F(404),F(405),F(406),F(407),F(408), & ! F(409),F(410),F(411),F(412),F(413),F(414),F(415),F(416), & ! F(417),F(418),F(419),F(420),F(421),F(422),F(423),F(424), & ! F(425),F(426),F(427),F(428),F(429),F(430),F(431),F(432), & ! F(433),F(434),F(435),F(436),F(437),F(438),F(439),F(440), & ! F(441),F(442),F(443),F(444),F(445),F(446),F(447) ! goto EX'RD'FILE !SKIP'RD5: ! read #FISAM,FILLER7,F(449),F(450),F(451),F(452),F(453),F(454),F(455),F(456), & ! F(457),F(458),F(459),F(460),F(461),F(462),F(463),F(464), & ! F(465),F(466),F(467),F(468),F(469),F(470),F(471),F(472), & ! F(473),F(474),F(475),F(476),F(477),F(478),F(479),F(480), & ! F(481),F(482),F(483),F(484),F(485),F(486),F(487),F(488), & ! F(489),F(490),F(491),F(492),F(493),F(494),F(495),F(496), & ! F(497),F(498),F(499),F(500),F(501),F(502),F(503),F(504), & ! F(505),F(506),F(507),F(508),F(509),F(510),F(511),F(512) read #FISAM, RECORD ! [1] read into 4096 byte X var EX'RD'FILE: return ! Special error trapping routine to trap 'record size overflow' ! [1] trap no longer needed ! OVERFLOW'TRAP: ! if ERR(0) = 15 then & ! resume EX'RD'FILE & ! else & ! on error goto 0 SKIP'ISAM: