home *** CD-ROM | disk | FTP | other *** search
/ kermit.columbia.edu / kermit.columbia.edu.tar / kermit.columbia.edu / extra / promlb.mac < prev    next >
Text File  |  1988-08-16  |  15KB  |  563 lines

  1.     .TITLE    KERMLB - Kermit Macro library
  2.     .SBTTL    Robert C. McQueen/S Hecht
  3.  
  4. ;++
  5. ; This file contains the various macros and symbol definitions for
  6. ; PRO/Kermit.  All of the symbol definitions are defined in the KERDEF
  7. ; macro
  8. ; Create using: LIBRARY/RSX/CREATE/MACRO KERMLB KERMLB
  9. ;--
  10.  
  11. ; Version:
  12.  
  13.     .IDENT    /1.0.03/
  14.  
  15.     .SBTTL    Revision History
  16.  
  17. ;++
  18. ;
  19. ; 1.0.00    By: Robert C. Mcqueen
  20. ;        Create this module
  21. ;
  22. ; 1.0.01    By: Stuart Hecht        On: 24-Feb-1984
  23. ;        Change MSG macro so that the length does not include the
  24. ;        null byte at the end.
  25. ;
  26. ; 1.0.02    By: Robert C. McQueen        On: 5-March-1984
  27. ;        Add SPAWN EFN (SPNEFN).
  28. ;
  29. ; 1.0.03    By: Robert C. McQueen        On: 8-March-1984
  30. ;        Clean the module some and add the InterTask Communication
  31. ;        EFN (ITCEFN).
  32. ;
  33. ; 1.0.04    By: Robert C. McQueen        On: 12-March-1984
  34. ;        Change the intertask communications to use send/receive data.
  35. ;--
  36.  
  37.  
  38. .MACRO    KERDEF
  39.  
  40. keyerr=    -16                ; Code returned in status when a 
  41.                     ;   function key was pressed on a menu
  42. badcod=    -7                ; Code returned in status
  43. lefone=    1*400                ; A one in the left byte
  44. putdat=    1                ; Put data in flag.
  45. ;
  46. ; Logical Unit Numbers
  47. ;
  48. TERLUN=    7.                ; Terminal LUN number
  49. XKLUN=    8.                ; Communications port LUN
  50. DFLLUN=    10.                ; Defaults file LUN
  51. ;
  52. ; Event falgs used by KERMIT
  53. ;
  54. TTAEFN=    0                ; Terminal attach/detach EFN
  55. TTREFN=    1                ; Terminal read event flag number
  56. TTWEFN=    2                ; Terminal write EFN
  57. XKAEFN=    3                ; Communication attach/detach EFN
  58. XKREFN=    4                ; Communication read EFN
  59. XKWEFN=    5                ; Communication write EFN
  60. GENEFN=    6                ; General EFN
  61. CONEFN= 7                ; Connect processing EFN
  62. SPNEFN=10                ; Spawn EFN
  63. ITCEFN=11                ; Intertask communication EFN
  64. RESEFN=12                ; Resume EFN
  65. ;
  66. ; File modes that are possible
  67. ;
  68. MODBLK    =0
  69. MODASC    =1
  70. MODBIN    =2
  71. MODFIX    =3
  72. ;
  73. ; Random items
  74. ;
  75. ON=    1                ; Value for on (bit set)
  76. off=    0                ; Value for off (bit clear)
  77. true=    1                ; Value for true
  78. false=    0                ; Value for false
  79. msb    =    100000            ; Most significant bit for BIC/BIS
  80.  
  81.  
  82. knormal        ==    ^b000000001        ; 001 = information
  83. internalerr    ==    ^b000001010        ; 010 = error
  84. cmderr        ==    ^b000010010
  85. illeol        ==    ^b000011010
  86. illpktlen    ==    ^b000100010
  87. illpadchr    ==    ^b000101010
  88. illnpad        ==    ^b000110010
  89. lintoolng    ==    ^b000111010
  90. eof        ==    ^b001000001
  91. rms11        ==    ^b001001010
  92. nomorfiles    ==    ^b001010001
  93. illfiltyp    ==    ^b001011010
  94. rec.too.big    ==    ^b001100010
  95. errmsg        ==    ^b001101010
  96. chksumerr    ==    ^b001110010
  97. snderr        ==    ^b001111010
  98. retries        ==    ^b010000010
  99. iexit        ==    ^b010001001
  100. unimplgen    ==    ^b010010010
  101. unisrv        ==    ^b010011010
  102. protoerr    ==    ^b010100010
  103. timeout        ==    ^b010110100        ; 100 = warning
  104. aborted        ==    ^b010111010
  105. recerr        ==    ^b011000010
  106.  
  107. .ENDM
  108.  
  109.     .SBTTL    Symbols for the control characters
  110.  
  111. .MACRO    CHRDEF
  112.     .CHCAT=    000        ; Control atsign (@) (Null)
  113.     .CHCNA=    001        ; Control A
  114.     .CHCNB=    002        ; Control B
  115.     .CHCNC=    003        ; Control C
  116.     .CHCND=    004        ; Control D
  117.     .CHCNE=    005        ; Control E
  118.     .CHCNF=    006        ; Control F
  119.     .CHCNG=    007        ; Control G (Bell)
  120.     .CHCNH=    010        ; Control H (Backspace)
  121.     .CHCNI=    011        ; Control I (Tab)
  122.     .CHCNJ=    012        ; Control J (Line feed)
  123.     .CHCNK=    013        ; Control K (Vertical tab)
  124.     .CHCNL=    014        ; Control L (Form feed)
  125.     .CHCNM=    015        ; Control M (Carriage return)
  126.     .CHCNN=    016        ; Control N
  127.     .CHCNO=    017        ; Control O
  128.     .CHCNP=    020        ; Control P
  129.     .CHCNQ=    021        ; Control Q
  130.     .CHCNR=    022        ; Control R
  131.     .CHCNS=    023        ; Control S
  132.     .CHCNT=    024        ; Control T
  133.     .CHCNU=    025        ; Control U
  134.     .CHCNV=    026        ; Control V
  135.     .CHCNW=    027        ; Control W
  136.     .CHCNX=    030        ; Control X
  137.     .CHCNY=    031        ; Control Y
  138.     .CHCNZ=    032        ; Control Z
  139.     .CHCLB=    033        ; Control left bracket
  140.     .CHCBS=    034        ; Control back slash
  141.     .CHCRB=    035        ; Control right bracket
  142.     .CHCCF=    036        ; Control circonflex
  143.     .CHCUN=    037        ; Control underline
  144.  
  145. ; Symbols with ASCII names for control characters
  146.  
  147.     .CHNUL=    000        ; Null (tape feed character, fill character)
  148.     .CHSOH=    001        ; Start of header
  149.     .CHSTX=    002        ; Start of text
  150.     .CHETX=    003        ; End of text
  151.     .CHEOT=    004        ; End of transmission
  152.     .CHENQ=    005        ; Enquiry (WRU "Who are you?")
  153.     .CHACK=    006        ; Acknowledge
  154.     .CHBEL=    007        ; Bell
  155.     .CHBS=    010        ; Backspace
  156.     .CHHT=    011        ; Horizontal tab
  157.     .CHLF=    012        ; Line feed
  158.     .CHVT=    013        ; Vertical tab
  159.     .CHFF=    014        ; Form feed
  160.     .CHCR=    015        ; Carriage return
  161.     .CHSO=    016        ; Shift out
  162.     .CHSI=    017        ; Shift in
  163.     .CHDLE=    020        ; Data link escape
  164.     .CHDC1=    021        ; Device control 1 (also XON)
  165.     .CHDC2=    022        ; Device control 2 (also TAPE or AUX ON)
  166.     .CHDC3=    023        ; Device control 3 (also XOFF)
  167.     .CHDC4=    024        ; Device control 4 (also AUX OFF)
  168.     .CHNAK=    025        ; Negative acknowledge
  169.     .CHSYN=    026        ; Synchronous idle (SYNC)
  170.     .CHETB=    027        ; End of transmission block
  171.     .CHCAN=    030        ; Cancel
  172.     .CHEM=    031        ; End of medium
  173.     .CHSUB=    032        ; Substitute
  174.     .CHESC=    033        ; Escape
  175.     .CHFS=    034        ; File separator
  176.     .CHGS=    035        ; Group separator
  177.     .CHRS=    036        ; Record separator
  178.     .CHUS=    037        ; Unit separator
  179.     .CHSPC=    040        ; Space
  180.  
  181.     .CHSEM=    ';        ; Semicolon
  182.     .CHCMA=    ',        ; Comma
  183.  
  184.     .CHALT=    175        ; Old altmode
  185.     .CHAL2=    176        ; Other type of old altmode
  186.     .CHDEL=    177        ; Delete
  187.     .CHCSI=    233        ; CSI
  188.  
  189. ; Alternate names for motion characters
  190.  
  191.     .CHTAB=    .CHHT        ; Tab
  192.     .CHLFD=    .CHLF        ; Line feed
  193.     .CHVTB=    .CHVT        ; Vertical tab
  194.     .CHFFD=    .CHFF        ; Form feed
  195.     .CHCRT=    .CHCR        ; Carriage return
  196. .ENDM
  197.  
  198.  
  199.     .SBTTL    Macros -- Bit definitions
  200.  
  201. ;++
  202. ; The following gives names to the various bits that are found in
  203. ; this small machine.  It really needs 20 more bits
  204. ;--
  205.  
  206. .MACRO    BITS
  207.     B0=001        ;; Bit 0
  208.     B1=002        ;; Bit 1
  209.     B2=004        ;; Bit 2
  210.     B3=010        ;; Bit 3
  211.     B4=020        ;; Bit 4
  212.     B5=040        ;; Bit 5
  213.     B6=100        ;; Bit 6
  214.     B7=200        ;; Bit 7
  215. .ENDM
  216.  
  217.     .SBTTL    Macro definitions -- IOSBDF - IOSB definitions
  218.  
  219. ;++
  220. ; The following symbols define the format of an IOSB
  221. ;--
  222.  
  223. .MACRO    IOSBDF
  224.     IB.STS=    0            ; Status byte
  225.     IB.XXX=    1            ; Other half (I forget what this is)
  226.     IB.CNT=    2            ; Count of characters read/written
  227.     IB.FLG=    4            ; Flag byte
  228.     IB.XXX=    5            ; Filler
  229.     IB.SIZ=    6            ; Max size
  230.     IB.MSZ=    4            ; Minimum size
  231. .ENDM    ; End of IOSBDF macro definition
  232.  
  233.     .SBTTL    Macro definitions -- PJMP
  234.  
  235. ;++
  236. ; This macro is used similarly to the PJRST opdef that is used in MACRO-10/20.
  237. ; That is to jump to a routine that will RTS PC back to a higher level.
  238. ;--
  239.  
  240. .MACRO    PJMP    ADDR
  241.     JMP    ADDR
  242. .ENDM
  243.  
  244.     .SBTTL    Bliss interface definition macro -- BLSRTN
  245.  
  246. ; The following macros are used to generate the proper entry for
  247. ;a routine which is to be callable from BLISS, and to generate the
  248. ;proper call to a BLISS routine.
  249. ;
  250. ; Usage:
  251. ;    BLSRTN    Routine.name,Registers,<Argument.names>,<Temp.names>
  252. ;
  253. ; Where:
  254. ;    Routine.name is the name of the routine to be defined.
  255. ;    Register is the number of the highest register to save (2-5)
  256. ;    Argument.names is the list of the names to be defined for the arguments
  257. ;        These are in the same order as supplied in the BLISS call.
  258. ;    Temp.names is a list of names to be defined as stack locals
  259. ;
  260.  
  261. .MACRO    BLSRTN    RTNNAM,REG,ARGS,TEMPS,?LBL
  262. RTNNAM::                ;; Define the routine entry point
  263. .IF NB <REG>
  264.     ..REG=REG            ;; If have a register to save, remember it
  265. .IFF                    ;; Else
  266.     ..REG=0                ;; Don't save anything
  267. .ENDC                    ;; .IF NB <REG>
  268. .IF GE ..REG-2
  269.     JSR    R1,$SAVE'REG        ;; Save needed registers
  270.     ..AOFS=    2+2+<2*REG>        ;; Define offset to last argument
  271.                     ;; 2 for SAVEn return,
  272.                     ;; 2 for our return address
  273.                     ;; Plus 2 for each register saved
  274. .IFF                    ;; if not saving registers
  275.     ..AOFS=    2            ;; Just have our return address
  276. .ENDC                    ;; .IF GE REG-2
  277.     ..TCNT=    0            ;; Assume no temps
  278. .IF NB <TEMPS>                ;; Any temps to define?
  279.     ..TOFS=    2            ;; First temp is +2 (we add a return address)
  280.     .IRP    TEMP,<TEMPS>            ;; Yes, loop for each one
  281.     TEMP=    ..TOFS            ;; Define the offset
  282.     ..TOFS=    ..TOFS+2        ;; One more temp        
  283.     .ENDR    
  284. ;; Now generate the code to allocate the space and remove it
  285.     .IF EQ ..TOFS-4            ;; Only one temp?
  286.     TST    -(SP)            ;; Yes, just use a test
  287.     .IFF
  288.     .IF EQ ..TOFS-6            ;; Just two temps?
  289.         CMP    -(SP),-(SP)        ;; Yes, allocate two items
  290.     .IFF
  291.         ADD    #..TOFS-2,SP        ;; Otherwise allocate the desired space
  292.     .ENDC
  293.     .ENDC    
  294.     JSR    PC,LBL            ;; Call routine
  295. ;; Now generate the code to remove the arguments
  296.     .IF EQ ..TOFS-4            ;; Only one temp?
  297.     TST    (SP)+            ;; Yes, just use a test
  298.     .IFF
  299.     .IF EQ ..TOFS-6            ;; Just two temps?
  300.         CMP    (SP)+,(SP)+        ;; Yes, remove two items
  301.     .IFF
  302.         SUB    #..TOFS-2,SP        ;; Otherwise remove what we allocated
  303.     .ENDC
  304.     .ENDC    
  305.     RTS    PC            ;; And continue returning
  306. LBL:                    ;; Define label for where routine really starts
  307.  
  308.     ..AOFS=    ..AOFS+..TOFS        ;; Argument offset is now greater
  309. .ENDC
  310.     ..ACNT=    0            ;; Assume no arguments
  311. .IF NB <ARGS>
  312. .IRP    ARG,<ARGS>            ;; Once for each argument
  313.     ..ACNT=..ACNT+1            ;; Count the arguments
  314. .ENDR                    ;; .IRP ARGS ARG
  315. .IRP    ARG,<ARGS>            ;; Once for each arg
  316.     ..ACNT=..ACNT-1            ;; Decrement counter
  317.     ARG=..AOFS+<2*..ACNT>        ;; Define offset for argument
  318. .ENDR                    ;; .IRP ARGS ARG
  319. .ENDC
  320. .ENDM    BLSRTN
  321.  
  322.     .SBTTL    Bliss interface definition macro -- BLSCAL
  323.  
  324. ;
  325. ; Macro to call a BLISS routine.
  326. ;
  327. ; Usage:
  328. ;
  329. ;    BLSCAL    Routine.name,<Arguments>,Flag
  330. ;
  331. ; Where:
  332. ;    Routine.name is the name of the routine to call
  333. ;    Arguments is the list of arguments to pass to the routine
  334. ;    Where flag is:
  335. ;        blank to cause stack space for the arguments to be allocated
  336. ;            before calling and removed afterwords
  337. ;        + to cause stack space to be allocated (if additional space is
  338. ;            necessary) but not removed
  339. ;        - to cause stack space to be allocated if additional space is
  340. ;            needed, and all argument stack space removed after the
  341. ;            call.
  342. ;
  343. ; Flag is typically used for a series of BLSCAL's, so that stack space being
  344. ; allocated for arguments does not have to be removed each time.
  345. ;
  346. ; Example:
  347. ;    BLSCAL    FIRST,<ARG1,ARG2>,+
  348. ;    BLSCAL    SECOND,<ARG1,ARG2,ARG3>,+
  349. ;    BLSCAL    THIRD,<ARG1,ARG2>,+
  350. ;    BLSCAL    LAST,<ARG1,ARG2>,-
  351. ;
  352. ; BLSCAL keeps a variable which is the current stack offset.  It needs it to
  353. ; determine if more stack space must be allocated, or how much needs to be
  354. ; removed.  This variable can also be used by the calling program to correctly
  355. ; access its own arguments or stack locals.  The variable is called ..STKO
  356. ;
  357.  
  358. .MACRO    BLSCAL    RTNNAM,ARGS,FLAG
  359. .IIF NDF,..STKO    ..STKO=0        ;; Nothing on the stack to start
  360.     ..ACNT=    0            ;; Assume no arguments
  361. .IRP    ARG,<ARGS>            ;; First count the arguments
  362.     ..ACNT=..ACNT+1            ;; Count the argument
  363. .ENDR                    ;; End of .IRP
  364.  
  365. ;; Now determine how to allocate the stack space and store the arguments
  366. .IF NB <FLAG>                ;; If flag is not blank, we can use what we already have on the stack
  367.     .IF GE ..STKO-<2*..ACNT>        ;; Have enough space for all the arguments?
  368.     ..STKB=    2*<..ACNT-1>        ;; Offset to position on stack for first argument
  369.     .IFF                ;; If we need more space
  370.     ..STKB=    ..STKO-2        ;; Offset to first argument
  371.     .ENDC
  372.     .IRP ARG,<ARGS>            ;; Repeat for all arguments
  373.     .IF LT ..STKB            ;; If we have used up all previous space
  374.     MOV    ARG,-(SP)        ;; Just stack the argument
  375.     ..STKO=    ..STKO+2        ;; More info on the stack
  376.     .IFF                ;; Otherwise
  377.         .IF NE ..STKB
  378.             MOV    ARG,..STKB(SP)    ;; Store on previously allocated space
  379.         .IFF
  380.         MOV    ARG,@SP        ;; Store last argument
  381.         .ENDC
  382.     .ENDC                ;; End of .IF LE....
  383.     ..STKB=    ..STKB-2        ;; And account for the space
  384.     .ENDR                ;; End of .IRP ARG,<ARGS>
  385. .IFF                    ;; If we want to allocate new space always
  386.     .IRP ARG,<ARGS>            ;; Repeat for all arguments
  387.     MOV    ARG,-(SP)        ;; Stack the argument
  388.     .ENDR                ;; End of .IRP
  389. .ENDC
  390.     JSR    PC,RTNNAM        ;; Call the routine
  391. .IF IDN <FLAG>,<->
  392.     ..ACNT=..STKO/2            ;; Yes, get the amount we need to remove
  393.     ..STKO=0            ;; Nothing on the stack now
  394. .ENDC
  395. .IIF IDN <FLAG>,<+>..ACNT=0        ;; If we should leave things on, remember that
  396. .IF NE ..ACNT                ;; Any arguments at all?
  397. .IIF EQ ..ACNT-1,TST    (SP)+        ;; Remove argument if only one
  398. .IIF EQ ..ACNT-2,CMP    (SP)+,(SP)+    ;; Remove if exactly two args
  399. .IIF GT ..ACNT-2,ADD    #<2*..ACNT>,SP    ;; Remove if many arguments
  400. .ENDC
  401. .ENDM    BLSCAL
  402.  
  403.     .SBTTL    Text processing definition macro
  404.  
  405. ;++
  406. ; The MSG macro will generate a length symbol for the message and the]
  407. ; text associated with the message.  It is called with a four character
  408. ; name of the text and then will generate M$xxxx for the address of the
  409. ; message and xxxx$L for the length in bytes
  410. ;
  411. ; Usage:
  412. ;
  413. ;    MSG    xxxx,<This is the text for the xxxx message>
  414. ;
  415. ;--
  416.  
  417. .MACRO    MSG    NAME,TEXT
  418.  
  419. M$'NAME:
  420.                 ;; Generate the ASCIZ string
  421.     .ASCIZ    ^TEXT^
  422.                 ;;[01] Length of the text (without null)
  423. NAME'$L= .-M$'NAME-1
  424.     .EVEN
  425. .ENDM
  426.  
  427.     .SBTTL    Macro definitions -- TABLE
  428.  
  429. ;++
  430. ; This macro is used to build the text tables for KERMNU.
  431. ;--
  432.  
  433. .MACRO    TABLE    NAME,MCRNAM
  434.     .SAVE            ;; Save the current program section
  435.     .ENABL    LSB        ;; Start local symbol block
  436. ;;
  437. ;; First go to the table PSECT
  438. ;;
  439.     .PSECT    $TABL$, RO, D
  440. ;;
  441. ;; Define the start of the table
  442. ;;
  443. T$'NAME:
  444.     .MACRO $TAB    VALUE,TEXT,?TXTADR,?TXTEND
  445.     .WORD    VALUE
  446.     .ENDM
  447.     .MACRO $TABA VALUE,ADDR
  448.     .WORD    VALUE
  449.     .ENDM
  450.     MCRNAM            ;; Build the table
  451.  
  452. NAME'$L=.-T$'NAME
  453. ;;
  454. ;; Now redefine to point to the associated text.
  455. ;;
  456.     .MACRO $TAB    VALUE,TEXT,?TXTADR,?TXTEND
  457.     ;;
  458.     ;; First go to the text PSECT
  459.     ;;
  460.     .PSECT    $TEXT$, RO, D
  461.     ;;
  462.     ;; Expand the text
  463.     ;;
  464.     .EVEN            ;; Must be on word boundary
  465. TXTADR:    .BYTE    TXTEND-.-1
  466.     .ASCII    ^TEXT^
  467. TXTEND:
  468.     ;;
  469.     ;; Now to the table PSECT
  470.     ;;
  471.         .PSECT    $TABL$, RO, D
  472.     ;;
  473.     ;; Generate the entry
  474.     ;;
  475.     .WORD    TXTADR
  476.     .ENDM
  477. ;;
  478. ;; Macro for defining a table of values and addresses
  479. ;;
  480.     .MACRO $TABA VALUE,ADDR
  481.     .WORD    ADDR
  482.     .ENDM
  483. ;;
  484. ;; Expand the macro a second time
  485. ;;
  486.     MCRNAM            ;; Expand the macro for a second time
  487.     .DSABL    LSB        ;; End of local symbol block
  488.     .RESTORE        ;; Restore the program section
  489. .ENDM
  490.  
  491.     .SBTTL    BIT. - Define bit mask for a bit number
  492.  
  493. ; This macro is used to define a mask for a given bit number
  494.  
  495. .MACRO BIT.    MASK,BIT
  496.     .IF NDF, BIT..
  497.     .MACRO BIT.. ARG1,ARG2
  498.     ARG1=B'ARG2        ; Define the mask
  499.     .ENDM
  500.     .ENDC
  501.     .IF NDF B0
  502.     .MCALL    BITS
  503.     BITS            ; Define the bits
  504.     .ENDC
  505.     BIT..    MASK,\BIT
  506. .ENDM
  507.  
  508.  
  509. .MACRO    ND    ARG1,ARG2
  510.     .IIF NDF ARG1,ARG1=ARG2
  511. .ENDM
  512.  
  513. ;MACRO FOR BUILDING VARIOUS BLOCK STRUCTURES
  514.  
  515.  
  516. .MACRO    BLOCK    TYPE
  517.     ...OFF=0            ;START WITH ZERO OFFSET
  518.     .MACRO ITIS A,B
  519.         .LIST
  520. A=B
  521.         .NLIST
  522.     .ENDM    ITIS
  523.     .MACRO    .X    Q,QQ
  524.         .IF  NB <Q>
  525.             ITIS    .'TYPE''Q,\...OFF
  526.         .ENDC
  527.         .IF NB <QQ>
  528.             ...OFF=...OFF+<2*<QQ>>
  529.         .IFF
  530.             ...OFF=...OFF+2
  531.         .ENDC
  532.     .ENDM
  533.     .MACRO    .XX    Q,QQ
  534.         .IF NB <Q>
  535.             ITIS    .'TYPE''Q,\...OFF
  536.         .ENDC
  537.         .IF NB <QQ>
  538.             ...OFF=...OFF+<QQ>
  539.         .IFF
  540.             ...OFF=...OFF+1
  541.         .ENDC
  542.     .ENDM
  543. .ENDM    BLOCK
  544.  
  545.  
  546. ; Macro to ensure that values are placed into correct position in
  547. ;block
  548.  
  549. .MACRO SETBLK TYPE
  550.     ...ORG=.        ; Remember origin
  551.     .MACRO .X NAME,VALUE
  552.     .IFGT ...ORG+.'TYPE''NAME-.
  553.     .REPT ...ORG+.'TYPE''NAME-.
  554.         .BYTE 0
  555.     .ENDR
  556.     .ENDC
  557.     .IIF NE ...ORG+.'TYPE''NAME-.,.ERROR 0; With val=VALUE
  558.     VALUE    ; Generate the value
  559.     .ENDM .X
  560. .ENDM SETBLK
  561.  
  562.     .END
  563.