home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / ampro / edrive20.asm < prev    next >
Encoding:
Assembly Source File  |  1994-09-02  |  15.6 KB  |  557 lines

  1.  
  2.     * * * *    * * * *    * * * *    * * * *    * * * *    * * * *    * *
  3.     *                          *
  4.     *           EDRIVE.ASM              *
  5.     *                          *
  6.     *       TERRY HAZEN,     LOS GATOS, CA          *
  7.     *                          *
  8.     *      ADAPTED FROM MULTIDSK    VER 2.2          *
  9.     *  COPYRIGHT (C) 1984,1985 AMPRO COMPUTERS, INC.  *
  10.     *                          *
  11.     * * * *    * * * *    * * * *    * * * *    * * * *    * * * *    * *
  12.  
  13.  
  14.  
  15. ; revision log:
  16. ;
  17. ;    8/18/85 Release Ver 2.0 (Adapted from MULTIDSK Ver 2.2)
  18. ;        Added support for command line specification of an
  19. ;        alternate drive to be used for the "E" drive.
  20. ;
  21. ;        (FOR BIOS VERSIONS GREATER THAN 3.0:
  22. ;        Added support for reading a 48tpi format in a 96tpi
  23. ;        drive, also for its commmand line specification.)
  24. ;
  25. ;
  26. ;    8/06/85 Release Ver 1.0 (Adapted from MULTIDSK Ver 1.0)
  27. ;
  28. ;-----------------------------------------------------------------------
  29. ;
  30. ; EDRIVE allows the "E" drive of the AMPRO series 100 computers to read
  31. ; and write a user-defined foreign 48tpi or 96tpi disk format.
  32. ;
  33. ; EDRIVE is most useful for formats which are not included in MULTIDSK
  34. ; and are used often enough to make the use of ESET awkward, or for
  35. ; MULTIDSK formats when the smaller size and faster operation of EDRIVE
  36. ; are assets.
  37. ;
  38. ; EDRIVE changes the TYPE byte, DPB, drive, and the skew table in the
  39. ; BIOS.  A total of 37 bytes are used (1 for TYPE byte, 15 for DPB,
  40. ; 1 for drive selected, 20 for skew table):
  41. ;
  42. ;    The FTYPE byte identifies the format as 48tpi or 96tpi.
  43. ;
  44. ;    The EDRIVE byte defines which drive will be used as the "E"
  45. ;    drive (A, B, C, or D).
  46. ;
  47. ;    The ETYPE byte defines whether you are reading a 48tpi format on
  48. ;    a 48tpi drive or a 96tpi drive.
  49. ;
  50. ;    The TYPE byte is a single byte which defines the particulars of
  51. ;    the foreign disk format:
  52. ;
  53. ;        bit 7......density: 0=single; 1=double
  54. ;        bit 6......double sided media if = 1
  55. ;        bit 5......double sided mode:
  56. ;                1 = continuous sector numbers (first
  57. ;                    sector on side one = last sector
  58. ;                    on side 0 + 1).
  59. ;                    both tracks are treated as a
  60. ;                    single track with twice as many
  61. ;                    sectors.
  62. ;                0 = same sectors on both sides
  63. ;                    (normal method)
  64. ;        bit 4......reserved
  65. ;        bits 3-2...00 = 1k allocation blocks
  66. ;               01 = 2k allocation blocks
  67. ;               10 = not used
  68. ;               11 = not used
  69. ;        bits 1-0...00 = 128 byte sectors
  70. ;               01 = 256 byte sectors
  71. ;               10 = 512 byte sectors
  72. ;               11 = 1024 byte sectors
  73. ;
  74. ;    The DPB (disk parameter block) is the standard Digital Research
  75. ;    DBP and can be learned by studying the CP/M 2 Alteration Guide
  76. ;    as supplied by Digital Research.  The disk parameter block tells
  77. ;    the system about how the data is arranged on the disk.    The DPB
  78. ;    has ten entries:
  79. ;
  80. ;        SPT    Sectors Per Track        (word)
  81. ;        BSH    Block SHift            (byte)
  82. ;        BLM    BLock Mask            (byte)
  83. ;        EXM    EXtent Mask            (byte)
  84. ;        DSM    Directory Size Minus one    (word)
  85. ;        DRM    DiRictory entries Minus one    (word)
  86. ;        AL0    directory group ALlocation 0    (byte)
  87. ;        AL1    directory group ALlocation 1    (byte)
  88. ;        CKS    ChecK Size            (word)
  89. ;        OFF    OFFset (# of system tracks)    (word)
  90. ;
  91. ;        (You may obtain the DPB and skew table information for
  92. ;        a foreign format by running DSKPRAM on that format.)
  93. ;
  94. ;    The drive byte defines the drive being used as the "E" drive.
  95. ;    It is changed by EDRIVE and is not user-entered data.
  96. ;
  97. ;    The skew table translates between logical and physical sector
  98. ;    numbers.  On some systems the sectors are not contiguously
  99. ;    arranged in order to improve access times.
  100. ;
  101. ;-----------------------------------------------------------------------
  102. ;
  103. ; Customizing EDRIVE for your foreign format:
  104. ;
  105. ;    Put the type of format you will use (48tpi or 96tpi) at FTYPE,
  106. ;    the drive you wish to use as the default "E" drive at EDRIVE,
  107. ;    the type of drive (48tpi or 96tpi) at ETYPE, your foreign format
  108. ;    type byte, DPB, and skew table at FORMAT, the name of your
  109. ;    foreign format in the message at SIGNOFF, and assemble.
  110. ;
  111. ;-----------------------------------------------------------------------
  112. ;
  113. ; Using EDRIVE:
  114. ;
  115. ;    In normal use, the format and drive selections you entered in
  116. ;    EDRIVE.ASM will be used as your "E" drive when the program
  117. ;    is run.  EDRIVE may be run from any drive except "E".  EDRIVE
  118. ;    may also be combined with other commands in a multiple ZCPR
  119. ;    command line in the normal manner:
  120. ;
  121. ;            A>edrive b4;dir e:
  122. ;
  123. ;
  124. ; Modifying Drive and Drive Type Selections on the Command Line:
  125. ;
  126. ;    You may also change the "E" drive and drive type selections by
  127. ;    placing the new drive letter and type on the command line
  128. ;    following the program name:
  129. ;
  130. ;    96tpi Formats:
  131. ;
  132. ;        Since a 96tpi format must be read in a 96tpi drive, only
  133. ;        the new drive letter (which must be a 96tpi drive)
  134. ;        needs to be specified on the command line:
  135. ;
  136. ;            A>edrive b
  137. ;
  138. ;
  139. ;    48tpi Formats (BIOS version less than 3.0):
  140. ;
  141. ;        BIOS versions less than 3.0 do not directly support
  142. ;        reading a 48tpi format in a 96tpi drive, so only the new
  143. ;        drive letter (which must be a 48tpi drive) needs to be
  144. ;        specified on the command line:
  145. ;
  146. ;            A>edrive c
  147. ;
  148. ;        (IF YOUR BIOS VERSION IS LESS THAN 3.0, and you want to
  149. ;        read a 48tpi format in a 96tpi drive, you must run
  150. ;        48TPI.COM prior to running EDRIVE.  48TPI makes your
  151. ;        96tpi "E" drive look like a 48tpi drive, with some
  152. ;        limitations.  See 48TPI.DOC)
  153. ;
  154. ;
  155. ;    48tpi Formats (BIOS versions 3.0 or greater):
  156. ;
  157. ;        EDRIVE supports READING your 48tpi format in a 96tpi
  158. ;        drive (writing a 48tpi format on a 96tpi drive is NOT
  159. ;        recommended.)
  160. ;
  161. ;        To modify your default "E" drive selection, add the new
  162. ;        drive letter to the command line following the program
  163. ;        name.  If the drive type of your new "E" drive is
  164. ;        different than the default type, add the number for the
  165. ;        new drive type after the drive letter (4 for 48tpi or
  166. ;        9 for 96tpi):
  167. ;
  168. ;        Examples:
  169. ;
  170. ;        If your default "E" drive is the 48tpi drive 'B' and you
  171. ;        wanted to make the 48tpi drive 'C' the new "E" drive,
  172. ;        you would type:
  173. ;
  174. ;            A>edrive c    or    A>edrive c4
  175. ;
  176. ;        and if you wanted to make the 96tpi drive 'D' the new "E"
  177. ;        drive, you would type:
  178. ;
  179. ;            A>edrive d9
  180. ;
  181. ;
  182. ;        If your default "E" drive is the 96tpi drive 'D' and you
  183. ;        wanted to make the 48tpi drive 'C' the new "E" drive,
  184. ;        you would type:
  185. ;
  186. ;            A>edrive c4
  187. ;
  188. ;
  189. ;        The default value for ETYPE that you entered in EDRIVE.ASM
  190. ;        file will always be used unless you specify a different
  191. ;        value on the command line.
  192. ;
  193. ;        Whenever you specify a 48tpi format in a 96tpi drive,
  194. ;        EDRIVE will remind you in the sign-off message.
  195. ;
  196. ;-----------------------------------------------------------------------
  197.  
  198. CR:    EQU    0DH        ; carrige return
  199. LF:    EQU    0AH        ; line feed
  200.     ;
  201. BDOS:    EQU    5
  202.     ;
  203.     ORG    0100H        ; base of tpa
  204. BEGIN:    JMP    START        ; leave room for copyright and format data
  205.     ;
  206.     DB    ' EDRIVE Vers 2.0, adapted by Terry Hazen'
  207.     DB    ' from MULTIDSK Vers 2.2, Copyright (c) 1984,1985'
  208.     DB    ' AMPRO Computers, Inc. '
  209.     DB    1AH
  210.     ;
  211. ;=======================================================================;
  212. ;                                    ;
  213. ; USER-ENTERED FOREIGN FORMAT DATA:                    ;
  214. ; ---------------------------------                    ;
  215. ;                                    ;
  216. ; The following table contains the type byte, dpb, drive selected,    ;
  217. ; and skew for your foreign format, and the sign-off message.        ;
  218. ;                                    ;
  219. ; Enter your data here...                        ;
  220. ;                                    ;
  221. ;-----------------------------------------------------------------------;;
  222. ;                                    ;;
  223. ; The use of 96tpi drives to READ 48tpi formats is supported only    ;;
  224. ; with Bios versions 3.0 and above.  If your BIOS version is less    ;;
  225. ; than 3.0, ignore FTYPE and ETYPE:                    ;;
  226. ;                                    ;;
  227. FTYPE:    DB    '4'        ; foreign format type:            ;;
  228. ;                ;    ('4':  it's a 48tpi format)    ;;
  229. ;                ;    ('9':  it's a 96tpi format)    ;;
  230. ;                                    ;;
  231. EDRIVE:    DB    'B'        ; drive selected as "E" drive:        ;;
  232. ;                ;    ('A','B','C',or'D')        ;;
  233. ;                                    ;;
  234. ETYPE:    DB    '4'        ; type of drive:            ;;
  235. ;                ;    48tpi format:            ;;
  236. ;                ;    is the selected drive 48tpi or    ;;
  237. ;                ;    96tpi?                ;;
  238. ;                ;    ('4':  it's a 48tpi drive)    ;;
  239. ;                ;    ('9':  it's a 96tpi drive)    ;;
  240. ;                ;                    ;;
  241. ;                ;    96tpi format:            ;;
  242. ;                ;    ETYPE will be ignored.        ;;
  243. ;-----------------------------------------------------------------------;;
  244. ;                                    ;;
  245. FORMAT:                                    ;;
  246. ;                                    ;;
  247. ;type byte                                ;;
  248.     DB    0C7H        ; MORROW MD3 DSDD 48tpi format        ;;
  249. ;                                    ;;
  250. ;dpb                                    ;;
  251.     DW    40        ; spt                    ;;
  252.     DB    4        ; block shift                ;;
  253.     DB    15        ; block mask                ;;
  254.     DB    1        ; extent mask                ;;
  255.     DW    0C2H        ; disk size-1                ;;
  256.     DW    0BFH        ; # of directories-1            ;;
  257.     DB    0E0H        ; allocation 0                ;;
  258.     DB    0        ; allocation 1                ;;
  259.     DW    48        ; dir check size            ;;
  260.     DW    2        ; reserved tracks            ;;
  261. ;                                    ;;
  262. ;drive                                    ;;
  263.     DB    1        ; this byte is changed by EDRIVE    ;;
  264. ;                ;    and is not user-entered        ;;
  265. ;                                    ;;
  266. ;skew table - must contain 20 bytes total                ;;
  267.     DB    1,4,2,5,3                        ;;
  268.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                ;;
  269. ;                                    ;;
  270. ;-----------------------------------------------------------------------;;
  271. ;                                    ;
  272. ;the sign-off message:                            ;
  273. ;                                    ;
  274. SIGNOFF:                                ;
  275.     DB    CR,LF                            ;
  276.     DB    'Drive A is now a '                    ;
  277. ;-----------------------------------------------------------------------;;
  278. ;                                    ;;
  279. ;      ...Enter the name of your foreign format here:            ;;
  280. ;                                    ;;
  281.     DB    'MORROW MD3 DSDD 48tpi'                    ;;
  282. ;                                    ;;
  283. ;-----------------------------------------------------------------------;;
  284.     DB    CR,LF                            ;
  285.     DB    'drive when you call it "E".'                ;
  286.     DB    CR,LF,'$'                        ;
  287. ;-----------------------------------------------------------------------;
  288. ;                                    ;
  289. ; END OF USER-ENTERED DATA AREA...                    ;
  290. ;                                    ;
  291. ;=======================================================================;
  292.     ;
  293.     ;
  294. START:    LXI    H,0        ; zero out h&l
  295.     DAD    SP        ; add sp to hl
  296.     SHLD    OLDSP        ; save it
  297.     LXI    SP,STACK    ; set up new stack
  298.     ;
  299.     ;
  300.     ;ckdrv loads the default drive and compares it
  301.     ;against the e drive, which isn't allowed.  prints
  302.     ;error message if true.
  303.     ;
  304. CKDRV:    LDA    4        ; get default drive
  305.     CPI    4        ; is it drive "e"?
  306.     JZ    WRGDRV        ; get ready to quit if it is
  307.     ;
  308.     LHLD    01H
  309.     MVI    L,74H
  310.     MOV    A,M
  311.     ANI    3FH        ; mask off D-speed & D-step
  312.     MOV    M,A
  313.     ;
  314.     ;
  315.     ;eaddr gets the location of eparm in the bios.
  316.     ;
  317. EADDR:    LHLD    1        ; get warm boot vector
  318.     MVI    L,36H        ; get edsk offset
  319.     LXI    D,BIORET    ; point to bios return point
  320.     PUSH    D        ; save d
  321.     PCHL            ; return with dpb addr
  322.     ;
  323.     ;
  324.     ;bioret returns with the bios location of eparm
  325.     ;and saves it for use later.
  326.     ;
  327. BIORET:    DCX    H        ; back up to type byte location
  328.     SHLD    ADDR        ; save location
  329.     ;
  330.     ;interrogate the command line for any characters
  331.     ;
  332.     LXI    H,80H
  333.     MOV    A,M
  334.     INX    H
  335.     ORA    A
  336.     JZ    BIOS$VER
  337.     MOV    B,A
  338.     LXI    D,EDRIVE
  339.     MVI    C,2
  340.     ;
  341. NEXTCHR:
  342.     MOV    A,M
  343.     DCR    B
  344.     INX    H
  345.     JM    BIOS$VER
  346.     CPI    ' '
  347.     JZ    NEXTCHR
  348.     STAX    D
  349.     INX    D
  350.     DCR    C
  351.     JZ    BIOS$VER
  352.     JMP    NEXTCHR
  353.     ;
  354. BIOS$VER:
  355.     MVI    A,0        ; clear bios version
  356.     STA    LB$VERS
  357.     CALL    GET$BIOS$VERS    ; get bios version
  358.     JMP    MAIN
  359.     ;
  360.     ;
  361. GET$BIOS$VERS:
  362. ; Get bios version -- Brings the current BIOS jump tables (starting
  363. ;     at warm boot) to a local area for ease of utility access.  If
  364. ;     this BIOS is version 2.1 or greater, the secondary jump table
  365. ;     is brought in as well.
  366. ;
  367. ; Entry: none
  368. ; Exit:  Z  = bios < 2.1 (old bios)
  369. ;     NZ = bios 2.1+  (fixed disk bios)
  370. ;     All registers are modified
  371. ;
  372.     LHLD    1        ; Get start of bios jump table
  373.     LXI    D,LB$BIOS$TBL    ; Move bios to local storage
  374.     LXI    B,LB$LEN    ; .  (length of bios area)
  375.     DB    0EDH,0B0H    ; .  (move routine)
  376.     MVI    A,0        ; Test CP/M version
  377.     CALL    LB$GETNXT    ; Get next jump table
  378.     STA    LB$VERS        ; Save bios version
  379.     INX    H        ; See if HL is 0FFFFh
  380.     MOV    A,H        ; .
  381.     ORA    L        ; .
  382.     RZ            ; If so, then old version
  383.     DCX    H        ; Fix HL as it has the table addr
  384.     LXI    D,LB$XTBL    ; Move extra table to local storage
  385.     LXI    B,LB$XLEN    ; .  (length of extra table)
  386.     DB    0EDH,0B0H    ; .  (move routine)
  387.     MVI    A,0FFH        ; Set NZ to indicate bios
  388.     ORA    A        ; ... version 2.1+
  389.     RET            ; ... and return.
  390.  
  391.  
  392. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  393. ;                            *
  394. ;        Data area . . .             *
  395. ;                            *
  396. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  397. ;
  398. ; Replicated BIOS for ease of use . . .
  399. ;
  400. LB$BIOS$TBL:
  401. LB$WBOOT:    DB    0,0,0    ; Warm boot
  402. LB$CONST:    DB    0,0,0    ; Console status
  403. LB$CONIN:    DB    0,0,0    ; Console input
  404. LB$CONOUT:    DB    0,0,0    ; Console output
  405. LB$LISTOUT:    DB    0,0,0    ; List output
  406. LB$PUNCH:    DB    0,0,0    ; Punch output
  407. LB$READER:    DB    0,0,0    ; Reader input
  408. LB$HOMDSK:    DB    0,0,0    ; Home disk (move to track 00)
  409. LB$SELDSK:    DB    0,0,0    ; Select disk drive
  410. LB$SETTRK:    DB    0,0,0    ; Select track number
  411. LB$SETSEC:    DB    0,0,0    ; Select sector number
  412. LB$SETDMA:    DB    0,0,0    ; Set DMA address
  413. LB$DSKREAD:    DB    0,0,0    ; Disk read
  414. LB$DSKWRITE:    DB    0,0,0    ; Disk write
  415. LB$LISTST:    DB    0,0,0    ; List status
  416. LB$SECTRN:    DB    0,0,0    ; Sector translate routine
  417. ;
  418. ; AMPRO-specific BIOS calls
  419. ;
  420. LB$GETNXT:    DB    0,0,0    ; Get bios ver & next tbl address
  421. LB$GETEDSK:    DB    0,0,0    ; Get pointer to E-disk storage
  422. LB$IOINIT:    DB    0,0,0    ; Set new I/O parameters
  423. LB$SCSIDRV:    DB    0,0,0    ; SCSI direct driver
  424. ;
  425. LB$LEN:    EQU    $-LB$WBOOT    ; Length of bios table
  426. ;
  427. LB$XTBL:
  428. LB$SWAP$DRV:    DB    0,0,0    ; Swap two logical drives
  429. LB$WINDRV:    DB    0,0,0    ; Set/get win drive parameters
  430. LB$PHYTAB:    DB    0,0,0    ; Set/get phytab access
  431. LB$GET$LDTE:    DB    0,0,0    ; Get physical table entry address
  432. LB$RESERVED:    DB    0,0,0    ; Reserved entry
  433. ;
  434. LB$XLEN:EQU    $-LB$XTBL    ; Length of extra table
  435. ;
  436. LB$VERS:    DB    0
  437.     ;
  438.     ;
  439. MAIN:    LDA    EDRIVE        ; get drive back
  440.     STA    SIGNOFF+8    ; store it in sign-off message
  441.     SUI    'A'        ;
  442.     STA    FORMAT+16    ; store it
  443.     LHLD    ADDR        ; get bios pointer back
  444.     MVI    B,37        ; number of bytes to move (1+15+1+20)
  445.     LXI    D,FORMAT    ; point to new dpb
  446.     CALL    LOOP        ; put into memory
  447.     JMP    DONE        ; done
  448.     ;
  449.     ;
  450.     ;wrgdrv loads the wrong drive error message, prints
  451.     ;it and exits to zcpr3.
  452.     ;
  453. WRGDRV:    LXI    D,ERROR        ; load error message
  454.     CALL    OUTPUT        ; bdos
  455.     ;
  456. DONE:    LHLD    OLDSP        ; get stack back
  457.     SPHL            ; put it in sp
  458.     RET            ; return to zcpr3
  459.     ;
  460.     ;
  461.     ;loop moves the type byte, dpb, drive,and
  462.     ;skew table to the location in the bios pointed to
  463.     ;by the hl registers. the bytes to be moved are pointed
  464.     ;to by the de registers and b contains the number
  465.     ;of bytes to be moved.
  466.     ;
  467. LOOP:    LDA    FTYPE
  468.     CPI    '4'        ; 48tpi format?
  469.     JNZ    SIGN        ; no, print sign-off message
  470.     ;
  471. D4896:    LDA    ETYPE
  472.     CPI    '9'        ; 96tpi drive?
  473.     JNZ    SIGN        ; no, print sign-off message
  474.     LDA    LB$VERS        ; yes, so get bios version
  475.     SUI    1EH        ; bios version > 3.0?
  476.     JP    SETDST        ; yes, set double-step
  477.     ;
  478.     LXI    D,WRGBIOS    ; no, 48/96 not supported,
  479.     CALL    OUTPUT        ;    so print error msg and quit
  480.     JMP    DONE
  481.     ;
  482. SETDST:    PUSH    H
  483.     LHLD    1
  484.     MVI    L,74H
  485.     MOV    A,M
  486.     ORI    40H
  487.     MOV    M,A
  488.     ;
  489.     PUSH    B
  490.     PUSH    D
  491.     LXI    D,SIGNOFF    ; point to sign-off message
  492.     CALL    OUTPUT        ; print it
  493.     LXI    D,MSG4896    ; point to 48/96 message
  494.     CALL    OUTPUT        ; print it
  495.     POP    D
  496.     POP    B
  497.     ;
  498.     POP    H
  499.     JMP    LOOP2
  500.     ;
  501. SIGN:    PUSH    B
  502.     PUSH    D
  503.     PUSH    H
  504.     LXI    D,SIGNOFF    ; point to sign-off message
  505.     CALL    OUTPUT        ; print it
  506.     POP    H
  507.     POP    D
  508.     POP    B
  509.     ;
  510. LOOP2:    LDAX    D        ; put 1st byte into a
  511.     MOV    M,A        ; store it in bios
  512.     INX    D        ; roll up d
  513.     INX    H        ; roll up h
  514.     DCR    B        ; decrement b
  515.     JNZ    LOOP2        ; loop until done
  516.     RET
  517.     ;
  518.     ;
  519.     ;output sends the message pointed to by de to the screen.
  520.     ;
  521. OUTPUT:    MVI    C,9        ; print string function
  522.     CALL    5        ; bdos
  523.     RET            ;
  524.     ;
  525. WRGBIOS:
  526.     DB    7,CR,LF
  527.     DB    '+++ Your BIOS is not version 3.0 or greater, so reading '
  528.     DB    CR,LF
  529.     DB    'a 48tpi format in a 96tpi drive is not supported.'
  530.     DB    CR,LF,'$'
  531.     ;
  532. ERROR:    DB    7,CR,LF
  533.     DB    '+++ Wrong drive selected.'
  534.     DB    CR,LF
  535.     DB    'EDRIVE can only be run from drive A, B, C, or D.'
  536.     DB    CR,LF,'$'
  537.     ;
  538. MSG4896:
  539.     DB    CR,LF
  540.     DB    'This is a 48tpi format in a 96tpi drive:'
  541.     DB    CR,LF
  542.     DB    '- Writing to this drive is not recommended!'
  543.     DB    CR,LF,'$'
  544.     ;
  545. ADDR:    DS    2        ; "e" drive parms addr
  546.     ;
  547.     ;
  548.     ;
  549.     DS    64        ; 32 level stack
  550. STACK:
  551.     ;
  552. OLDSP:    DS    2        ; room for old stack pointer
  553.     ;
  554.     ;
  555.     ;
  556.     END    BEGIN
  557.