home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG019.ARK / ADE.ASM next >
Assembly Source File  |  1984-04-29  |  17KB  |  552 lines

  1. ;         ADE - ABSOLUTE DISK EDITOR
  2. ;
  3. ;         L.E. HUGHES
  4. ;         8080 SOFTWARE DEVELOPMENT CENTER
  5. ;         1506 MYRICK ROAD
  6. ;         TALLAHASSEE, FLORIDA  32303
  7. ;
  8. ;         JULY, 1977
  9. ;
  10. ;            *ADE* ALLOWS THE USER TO EDIT ABSOLUTE SECTORS AND/OR
  11. ;         TRACKS ON A 3740 COMPATIBLE DISKETTE. THE USER SHOULD BE
  12. ;         VERY FAMILIAR WITH THE CP/M FILE STRUCTURE BEFORE CHANGING
  13. ;         SECTORS ON A DISKETTE CONTAINING CP/M FILES. THE
  14. ;         FOLLOWING COMMANDS ARE CURRENTLY AVAILABLE:
  15. ;
  16. ;            DX,Y      - DUMP TRACK X, SECTOR Y TO CONSOLE
  17. ;            DX        - DUMP ALL OF TRACK X TO CONSOLE
  18. ;            D         - DUMP ENTIRE DISK TO CONSOLE
  19. ;
  20. ;            LX,Y      - LIST TRACK X, SECTOR Y TO PRINTER
  21. ;            LX        - LIST ALL OF TRACK X TO PRINTER
  22. ;            L         - LIST ENTIRE DISK TO PRINTER
  23. ;
  24. ;            I         - SET INTERLACE SECTOR MAPPING
  25. ;            A         - SET ABSOLUTE SECTOR MAPPING
  26. ;            X         - EXIT TO CP/M
  27.  
  28. ;         ABSOLUTE DISK I/O ENTRY POINTS
  29.  
  30.  MSIZE     EQU    32
  31.  
  32.  BASE      EQU    MSIZE*1024-300H
  33.  
  34.  SELDSK    EQU    BASE+1BH       ;SELECT DISK
  35.  SETTRK    EQU    BASE+1EH       ;SET TRACK ADDRESS
  36.  SETSEC    EQU    BASE+21H       ;SET SECTOR ADDRESS
  37.  SETDMA    EQU    BASE+24H       ;SET DMA ADDRESS
  38.  RDABS     EQU    BASE+27H       ;READ ABSOLUTE SECTOR
  39.  WRABS     EQU    BASE+2AH       ;WRITE ABSOLUTE SECTOR
  40.  
  41. ;          BDOS ENTRY POINT AND FUNCTION CODES
  42.  
  43.  BDOS      EQU    0005H
  44.  RCFC      EQU    1              ;READ CONSOLE
  45.  WCFC      EQU    2              ;WRITE CONSOLE
  46.  CCFC      EQU    11             ;CHECK CONSOLE (FOR RDA)
  47.  
  48. ;          MISC. EQUATES
  49.  
  50.  DBUF      EQU    80H
  51.  CR        EQU    0DH
  52.  LF        EQU    0AH
  53.  DEL       EQU    7FH
  54.  IOBYT     EQU    0003H
  55.  
  56. ;          MAIN PROGRAM
  57.  
  58.            ORG    100H
  59.  ADE:      LXI    H,0            ;DO THE STACK POINTER TRICK
  60.            DAD    SP
  61.            SHLD   OLDSP
  62.            LXI    SP,STACK+64
  63.            LDA    IOBYT
  64.            STA    OLDIO
  65.            XRA    A              ;DEFAULT TO ABS MODE
  66.            STA    MODE
  67.            LXI    H,ADES1        ;PRINT HEADING
  68.            CALL   WASC
  69.  ADE1:     CALL   WEOLC          ;ISSUE PROMPT SEQUENCE
  70.            MVI    A,'?'
  71.            CALL   WACC
  72.            LXI    H,IBUF         ;READ COMMAND INTO IBUF
  73.            CALL   RASC
  74.            CALL   WEOLC          ;WRITE END-OF-LINE TO CONSOLE
  75.            LXI    H,IBUF         ;PARSE COMMAND
  76.            MOV    A,M            ;FETCH COMMAND CODE
  77.            INX    H
  78.            CPI    141Q            ;IF LC, CONVERT TO UC
  79.            JC     $+5
  80.            SUI    40Q
  81.            STA    CODE
  82.            MOV    A,M            ;CHECK FIRST PARAM.
  83.            CPI    CR             ;JUMP IF NOT END-OF-LINE
  84.            JNZ    ADE2
  85.            MVI    A,77           ;SET 'ALL TRACKS' FLAG
  86.            STA    NTRKS    
  87.            MVI    A,0
  88.            STA    TRK
  89.            MVI    A,26           ;SET 'ALL SECTORS' FLAG
  90.            STA    NSECS
  91.            MVI    A,1
  92.            STA    SEC
  93.            JMP    ADE6
  94.  ADE2:     CALL   DDB            ;DECODE FIRST PARAM. INTO A
  95.            JC     ADEX           ;EXIT ON ERROR
  96.            STA    TRK            ;ELSE STORE PARAM.
  97.            MVI    A,1
  98.            STA    NTRKS
  99.  ADE3:     MOV    A,M            ;IF COMMA, SKIP IT
  100.            CPI    ','
  101.            JNZ    $+4
  102.            INX    H              ;ELSE SKIP COMMA
  103.            MOV    A,M            ;CHECK SECOND PARAM.
  104.            CPI    CR             ;JUMP IF NOT END-OF-LINE
  105.            JNZ    ADE4
  106.            MVI    A,26           ;SET 'ALL SECTORS' FLAG
  107.            STA    NSECS
  108.            MVI    A,1
  109.            STA    SEC
  110.            JMP    ADE6
  111.  ADE4:     CALL   DDB              ;DECODE SECOND PARAM. INTO A
  112.            JC     ADEX           ;EXIT ON ERROR
  113.            STA    SEC            ;SAVE SECOND PARAM.
  114.            MVI    A,1
  115.            STA    NSECS
  116.  ADE6:     LDA    CODE           ;FETCH COMMAND CODE
  117.            CPI    'D'            ;WAS IT 'D' FOR DUMP
  118.            JNZ    ADE7
  119.            CALL   DAS            ;DUMP ABSOLUTE SECTORS
  120.            JMP    ADE1           ;LOOP
  121.  ADE7:     CPI    'L'            ;WAS IT 'L' FOR LIST
  122.            JNZ    ADE8
  123.            LXI    H,IOBYT        ;FETCH I/O MAP
  124.            MOV    A,M
  125.            STA    OLDIO          ;SAVE IT
  126.            ANI    0FCH           ;DISCARD OLD CONSOLE ASSIGNMENT
  127.            MOV    M,A
  128.            ANI    0C0H           ;COPY LIST ASSIGNMENT INTO IT
  129.            RLC
  130.            RLC
  131.            ORA    M
  132.            MOV    M,A
  133.            CALL   DAS            ;LIST ABSOLUTE SECTOR(S)
  134.            LDA    OLDIO          ;RESTORE OLD I/O MAP
  135.            STA    IOBYT
  136.            JMP    ADE1
  137.  ADE8:     CPI    'I'            ;JUMP IF NOT 'I'
  138.            JNZ    ADE9
  139.            MVI    A,1            ;SET MODE = INTERLACE
  140.            STA    MODE
  141.            JMP    ADE1
  142.  ADE9:     CPI    'A'            ;JUMP IF NOT 'A'
  143.            JNZ    ADEA
  144.            XRA    A              ;SET MODE = ABSOLUTE
  145.            STA    MODE
  146.            JMP    ADE1
  147.  ADEA:     CPI    'X'            ;JUMP IF NOT 'X'
  148.            JNZ    ADEB
  149.            LHLD   OLDSP          ;CLEAN UP ACT AND GO HOME TO MAMA
  150.            SPHL
  151.            RET
  152.  ADEB:     LXI    H,ADES2        ;PRINT 'ILLEGAL COMMAND'
  153.            CALL   WASC
  154.            JMP    ADE1 
  155.  ADEX:     LXI    H,ADES3        ;PRINT 'SYNTAX ERROR'
  156.            CALL   WASC
  157.            JMP    ADE1
  158.  
  159.  ADES1:    DB     'ABSOLUTE DISK EDITOR V1.0',CR,LF,0
  160.  ADES2:    DB     'ILLEGAL COMMAND',CR,LF,0
  161.  ADES3:    DB     'SYNTAX ERROR',CR,LF,0
  162.  
  163. ;         DAS - DUMP ABSOLUTE DISK SECTOR(S)
  164.  
  165.  DAS:     LDA    TRK            ;SET ABSOLUTE TRACK
  166.           CALL   SAT
  167.           JC     DASX           ;EXIT IF ILLEGAL TRACK NO.
  168.  DAS1:    LDA    SEC            ;SET ABSOLUTE SECTOR
  169.           CALL   SAS
  170.           JC     DASX           ;EXIT IF ILLEGAL SECTOR NO.
  171.           CALL   RAS            ;READ ABSOLUTE SECTOR INTO DBUF
  172.           CMA                   ;DISPLAY STATUS ON LIGHTS
  173.           OUT    0FFH
  174.           CMA
  175.           CALL   WEOLC          ;START NEW LINE
  176.           LXI    H,DASS1        ;PRINT 'DUMP OF TRACK '
  177.           CALL   WASC
  178.           LDA    TRK
  179.           CALL   WDBC           ;PRINT TRACK NUMBER (DECIMAL)
  180.           LDA    MODE           ;PRINT MODE (ABS OR ISN)
  181.           ORA    A
  182.           JNZ    DAS2
  183.           LXI    H,DASS4
  184.           JMP    DAS3
  185.  DAS2:    LXI    H,DASS5
  186.  DAS3:    CALL   WASC
  187.           LXI    H,DASS2        ;PRINT ' SECTOR '
  188.           LXI    H,DASS2        ;PRINT ', SECTOR '
  189.           CALL   WASC
  190.           LDA    SEC            ;PRINT SECTOR NUMBER (DECIMAL)
  191.           CALL   WDBC
  192.           CALL   WEOLC          ;WRITE END OF LINE
  193.           LXI    H,0            ;CLEAR DUMP ADDR
  194.           SHLD   DMPAD
  195.           LXI    H,DBUF         ;DUMP DBUF TO CONOSOLE
  196.           LXI    D,128
  197.           CALL   DUMPC
  198.           LDA    SEC            ;SEC = SEC + 1
  199.           INR    A
  200.           STA    SEC
  201.           LDA    NSECS          ;NSECS = NSECS-1
  202.           DCR    A
  203.           STA    NSECS
  204.           JNZ    DAS1           ;LOOP IF STILL NON-ZERO
  205.           MVI    A,1            ;ELSE SET SEC = 1
  206.           STA    SEC
  207.           MVI    A,26           ;AND SET NSECS = 26
  208.           STA    NSECS
  209.           LDA    TRK            ;THEN SET TRK=TRK+1
  210.           INR    A
  211.           STA    TRK
  212.           LDA    NTRKS          ;NTRKS = NTRKS - 1
  213.           DCR    A
  214.           STA    NTRKS
  215.           JNZ    DAS            ;LOOP IF STILL NON-ZERO
  216.           RET                   ;ELSE ALL DONE!
  217.  DASX:    LXI    H,DASS3        ;PRINT 'ILLEGAL ADDRESS'
  218.           JMP    WASC           ;AND RETURN
  219.  
  220.  DASS1:   DB     'DUMP OF TRACK ',0
  221.  DASS2:   DB     ' SECTOR ',0
  222.  DASS4:   DB     ', ABS',0
  223.  DASS5:   DB     ', ISN',0
  224.  DASS3:   DB     'ILLEGAL ADDRESS',CR,LF,0
  225.  
  226. ;         WDBC - WRITE DECIMAL BYTE TO CONSOLE
  227.  
  228.  WDBC:    PUSH   PSW            ;SAVE REGS
  229.           PUSH   B
  230.           MVI    B,0
  231.  WDBC1:   CPI    100            ;B = A/100, A = REMAINDER
  232.           JC     WDBC2
  233.           SUI    100
  234.           INR    B
  235.           JMP    WDBC1
  236.  WDBC2:   MOV    C,A            ;PRINT HUNDREDS DIGIT
  237.           MOV    A,B
  238.           ADI    '0'
  239.           CALL   WACC
  240.           MOV    A,C
  241.           MVI    B,0            ;B = A/10, A = REMAINDER
  242.  WDBC3:   CPI    10
  243.           JC     WDBC4
  244.           SUI    10
  245.           INR    B
  246.           JMP    WDBC3
  247.  WDBC4:   MOV    C,A            ;PRINT TENS DIGIT
  248.           MOV    A,B
  249.           ADI    '0'
  250.           CALL   WACC
  251.           MOV    A,C            ;PRINT ONES DIGIT
  252.           ADI    '0'
  253.           CALL   WACC
  254.           POP    B              ;RESTORE REGS
  255.           POP    PSW
  256.           RET
  257.  
  258. ;         DUMPC - DUMP MEMORY IN HEX (TO CONSOLE)
  259. ;
  260. ;         ENTRY CONDITIONS
  261. ;            HL - FWA OF BLOCK TO DUMP
  262. ;            DE - NUMBER OF BYTES TO DUMP
  263. ;            DMPAD - ADDRESS TO BE PRINTED AT START OF LINE
  264. ;                    AUTOMATICALLY INCREMENTED. INIT BY USER.
  265.  
  266.  DUMPC:   MOV    A,D            ;EXIT IF DONE
  267.           ORA    E
  268.           JZ     WEOLC
  269.           CALL   CHECK          ;JUMP IF NO RDA FROM CONSOLE
  270.           CPI    1
  271.           JNZ    DUMP0
  272.           CALL   RACC           ;DISCARD CHAR
  273.           LXI    SP,STACK+64      ;ABORT DUMP OR LIST
  274.           LDA    OLDIO
  275.           STA    IOBYT
  276.           JMP    ADE1
  277.  DUMP0:   CALL   WEOLC            ;START NEW LINE
  278.           LDA    DMPAD+1          ;WRITE DUMP ADDRESS IN HEX
  279.           CALL   WHBC
  280.           LDA    DMPAD
  281.           CALL   WHBC
  282.           PUSH   H
  283.           PUSH   D
  284.           MVI    C,16           ;NUMBER OF BYTES PER LINE
  285.  DUMP1:   MOV    A,D            ;JUMP IF DONE
  286.           ORA    E
  287.           JZ     DUMP2
  288.           MVI    A,' '          ;PRINT 1 BLANK
  289.           CALL   WACC
  290.           MOV    A,M            ;FETCH NEXT BYTE
  291.           INX    H
  292.           CALL   WHBC           ;WRITE TO CONSOLE IN HEX
  293.           PUSH   H              ;INCREMENT DUMP ADDRESS
  294.           LHLD   DMPAD
  295.           INX    H
  296.           SHLD   DMPAD
  297.           POP    H
  298.           DCX    D              ;DECREMENT COUNT
  299.           DCR    C              ;CONTINUE UNTIL 16 BYTES DUMPED
  300.           JNZ    DUMP1
  301.           JMP    DUMP3          ;GO DUMP BYTES IN ASCII
  302.  DUMP2:   INR    C              ;EXIT WHEN C=0
  303.           DCR    C
  304.           JZ     DUMP3
  305.           MVI    A,' '          ;PRINT 3 SPACES
  306.           CALL   WACC
  307.           CALL   WACC
  308.           CALL   WACC
  309.           DCR    C              ;CONTINUE
  310.           JMP    DUMP2
  311.  DUMP3:   POP    D              ;RESTORE COUNT
  312.           POP    H              ;RESTORE POINTER
  313.           MVI    A,' '          ;PRINT 2 SPACES
  314.           CALL   WACC
  315.           CALL   WACC
  316.           MVI    C,16           ;NUMBER OF BYTES PER LINE
  317.  DUMP4:   MOV    A,D            ;EXIT VIA WEOLC IF DONE
  318.           ORA    E
  319.           JZ     WEOLC
  320.           MOV    A,M            ;FETCH NEXT BYTE
  321.           INX    H
  322.           ANI    177Q           ;DISCARD PARITY BIT
  323.           CPI    40Q            ;SUBSTITUTE PERIOD FOR CONTROL CODES
  324.           JNC    $+5
  325.           MVI    A,'.'
  326.           CALL   WACC           ;PRINT BYTE IN ASCII
  327.           DCX    D              ;DECREMENT COUNT
  328.           DCR    C              ;CONTINUE UNTIL C=0
  329.           JNZ    DUMP4
  330.           JMP    DUMPC          ;PROCEED TO NEXT LINE
  331.  
  332. ;         WHBC - WRITE HEX BYTE TO CONSOLE
  333.  
  334.  WHBC:    PUSH   PSW            ;PRINT FIRST DIGIT
  335.           RRC
  336.           RRC
  337.           RRC
  338.           RRC
  339.           CALL   WHDC
  340.           POP    PSW            ;PRINT SECOND DIGIT
  341.           PUSH   PSW
  342.           CALL   WHDC
  343.           POP    PSW
  344.           RET
  345.  
  346. ;         WHDC - WRITE HEX DIGIT TO CONSOLE
  347.  
  348.  WHDC:    ANI    0FH            ;DISCARD TOP 4 BITS
  349.           CPI    10             ;ADJUST 10-15
  350.           JC     $+5
  351.           ADI    7
  352.           ADI    '0'
  353.           JMP    WACC           ;GO PRINT DIGIT
  354.  
  355. ;         WEOLC - WRITE END-OF-LINE TO CONSOLE
  356.  
  357.  WEOLC:   MVI    A,CR
  358.           CALL   WACC
  359.           MVI    A,LF
  360.           JMP    WACC
  361.  
  362. ;         WASC - WRITE ASCII STRING TO CONSOLE
  363.  
  364.  WASC:    MOV    A,M            ;FETCH NEXT BYTE IN STRING
  365.           ORA    A              ;RETURN IF END-OF-STRING
  366.           RZ
  367.           CALL   WACC           ;PRINT CHAR
  368.           INX    H              ;ADVANCE TO NEXT CHAR
  369.           JMP    WASC
  370.  
  371. ;         WACC - WRITE ASCII CHARACTER TO CONSOLE
  372.  
  373.  WACC:    PUSH   H
  374.           PUSH   D
  375.           PUSH   B
  376.           PUSH   PSW
  377.           MOV    E,A
  378.           MVI    C,WCFC
  379.           CALL   BDOS
  380.           POP    PSW
  381.           POP    B
  382.           POP    D
  383.           POP    H
  384.           RET
  385.  
  386. ;         RASC - READ ASCII STRING FROM CONSOLE
  387.  
  388.  RASC:    PUSH   H              ;SAVE BUFFER POINTER
  389.           MVI    B,0            ;COUNT = 0
  390.  RASC1:   CALL   RACC           ;READ NEXT CHAR FROM CONSOLE
  391.           CPI    'U'-100Q       ;JUMP IF NOT CTRL-U
  392.           JNZ    RASC2
  393.           CALL   WEOLC          ;ABORT OLD LINE
  394.           POP    H              ;RESTORE BUFFER POINTER
  395.           JMP    RASC           ;START OVER
  396.  RASC2:   CPI    DEL            ;JUMP IF NOT DEL
  397.           JNZ    RASC3
  398.           INR    B              ;IGNORE DEL IF IBUF EMPTY
  399.           DCR    B
  400.           JZ     RASC1
  401.           DCX    H
  402.           MOV    A,M            ;ECHO DELETED CHAR TO CONSOLE
  403.           CALL   WACC
  404.           DCR    B              ;DECREMENT COUNT
  405.           JMP    RASC1
  406.  RASC3:   MOV    M,A            ;STORE CHAR IN BUFFER
  407.           INX    H              ;INCREMENT BUFFER POINTER
  408.           INR    B              ;INCREMENT COUNT
  409.           CPI    CR             ;LOOP UNTIL CR
  410.           JNZ    RASC1
  411.           POP    H              ;RESTORE BUFFER POINTER
  412.           RET                   ;  AND RETURN
  413.  
  414. ;         RACC - READ ASCII CHARACTER FROM CONSOLE
  415.  
  416.  RACC:    PUSH   H
  417.           PUSH   D
  418.           PUSH   B
  419.           MVI    C,RCFC
  420.           CALL   BDOS
  421.           POP    B
  422.           POP    D
  423.           POP    H
  424.           RET
  425.  
  426. ;         CHECK - CHECK CONSOLE (FOR RDA)
  427.  
  428.  CHECK:   PUSH   H
  429.           PUSH   D
  430.           PUSH   B
  431.           MVI    C,CCFC
  432.           CALL   BDOS
  433.           POP    B
  434.           POP    D
  435.           POP    H
  436.           RET
  437.  
  438. ;         DDB - DECODE DECIMAL BYTE
  439.  
  440.  DDB:     PUSH   B
  441.           XRA    A              ;CLEAR TEMPORARY
  442.           STA    DDBT
  443.  DDB1:    MOV    A,M            ;FETCH NEXT BYTE
  444.           CPI    ','            ;EXIT IF DELIMITER
  445.           JZ     DDB2
  446.           CPI    CR
  447.           JZ     DDB2
  448.           INX    H
  449.           SUI    '0'            ;CONVERT FROM ASCII
  450.           JC     DDBX
  451.           CPI    10
  452.           JNC    DDBX
  453.           MOV    B,A            ;SAVE NEW DIGIT
  454.           LDA    DDBT           ;TEMP = TEMP * 10
  455.           ADD    A
  456.           MOV    C,A
  457.           ADD    A
  458.           ADD    A
  459.           ADD    C
  460.           ADD    B              ;TEMP = TEMP + NEW DIGIT
  461.           STA    DDBT
  462.           JMP    DDB1
  463.  DDB2:    POP    B              ;NORMAL EXIT
  464.           LDA    DDBT
  465.           STC
  466.           CMC
  467.           RET
  468.  DDBX:    POP    B              ;ERROR EXIT
  469.           XRA    A
  470.           STC
  471.           RET
  472.  
  473. ;         ABSOLUTE DISK I/O SUBROUTINES
  474.  
  475. ;         SAT - SET ABSOLUTE TRACK
  476.  
  477.  SAT:     CPI    77             ;EXIT IF A>76
  478.           JNC    SATX
  479.           STA    TRKNO
  480.           STC                   ;NORMAL EXIT
  481.           CMC
  482.           RET
  483.  SATX:    STC                   ;ERROR EXIT
  484.           RET
  485.  
  486. ;         SAS - SET ABSOLUTE SECTOR
  487.  
  488.  SAS:     CPI    1              ;EXIT IF A<1
  489.           JC     SASX
  490.           CPI    27             ;EXIT IF A>26
  491.           JNC    SASX
  492.           STA    SECNO
  493.           STC                   ;NORMAL EXIT
  494.           CMC
  495.           RET
  496.  SASX:    STC                   ;ERROR EXIT
  497.           RET
  498.  
  499. ;         RAS - READ ABSOLUTE SECTOR
  500.  
  501.  RAS:     PUSH   H
  502.           PUSH   D
  503.           PUSH   B
  504.           LDA    TRKNO
  505.           MOV    C,A
  506.           CALL   SETTRK
  507.           LDA    MODE
  508.           ORA    A
  509.           JNZ    RAS1
  510.           LDA    SECNO
  511.           JMP    RAS2
  512.  RAS1:    LDA    SECNO
  513.           LXI    H,LPMAP-1
  514.           ADD    L
  515.           MOV    L,A
  516.           JNC    $+4
  517.           INR    H
  518.           MOV    A,M
  519.  RAS2:    MOV    C,A
  520.           CALL   SETSEC
  521.           CALL   RDABS
  522.            POP    B
  523.           POP    D
  524.           POP    H
  525.           RET
  526.  
  527. ;         LPMAP - LOGICAL/PHYSICAL SECTOR MAP
  528.  
  529.  LPMAP:   DB     01,07,13,19,25,05,11,17,23,03,09,15,21
  530.           DB     02,08,14,20,26,06,12,18,24,04,10,16,22
  531.  
  532. ;         SCRATCH RAM AREA
  533.  
  534.  OLDSP:   DS     2
  535.  STACK:   DS     2
  536.  
  537.  IBUF:    DS     256
  538.  CODE:    DS     1
  539.  NTRKS:   DS     1
  540.  TRK:     DS     1
  541.  NSECS:   DS     1
  542.  SEC:     DS     1
  543.  DMPAD:   DS     1
  544.  
  545.  OLDIO:   DS     1
  546.  DDBT:    DS     1
  547.  MODE:    DS     1
  548.  TRKNO:   DS     1
  549.  SECNO:   DS     1
  550.  
  551.           END
  552.