home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / books / alw2 / chap2 / prog2.s < prev    next >
Text File  |  1993-09-07  |  8KB  |  231 lines

  1. ;---------------------------------------------------------------------
  2. ; THE ST ASSEMBLY LANGUAGE WORKSHOP, VOLUME 2
  3. ; PROGRAM 2
  4. ;
  5. ; COPYRIGHT 1992 BY CLAYTON WALNUM
  6. ;---------------------------------------------------------------------
  7.  
  8. PTERM0          equ     0
  9. CCONIN          equ     1
  10. CCONWS          equ     9
  11. APPL_INIT       equ     10
  12. APPL_EXIT       equ     19
  13. DGETDRV         equ     25
  14. DGETPATH        equ     71
  15. MSHRINK         equ     74
  16. FSEL_INPUT      equ     90
  17. AES_OPCODE      equ     200
  18.  
  19. ;--------------------------------------------------------------------
  20. ; MACROS
  21. ;--------------------------------------------------------------------
  22.  
  23. ;--------------------------------------------------------------------
  24. ; This macro gets a single character from the keyboard, using the
  25. ; Cconin GEMDOS function.
  26. ;--------------------------------------------------------------------
  27. get_char macro
  28.         move    #CCONIN,-(sp)
  29.         trap    #1
  30.         addq.l  #2,sp
  31.         endm
  32.  
  33. ;--------------------------------------------------------------------
  34. ; MAIN PROGRAM
  35. ;--------------------------------------------------------------------
  36.         text
  37.  
  38. ; Calculate the size of the program area.
  39.  
  40.         move.l  a7,a5                   ; Save addr of TPA.
  41.         lea     stack,sp                ; Load addr of our stack.
  42.         
  43.         move.l  4(a5),a5                ; Get addr of TPA.              
  44.         move.l  12(a5),d0               ; Get len of text segment.
  45.         add.l   20(a5),d0               ; Add len of data segment.
  46.         add.l   28(a5),d0               ; Add len of BSS segment.
  47.         add.l   #$100,d0                ; Add len of TPA. 
  48.  
  49. ; Release unused memory back to the system.
  50.         
  51.         move.l  d0,-(sp)                ; Push size of program on stack.
  52.         move.l  a5,-(sp)                ; Push program addr on stack.
  53.         clr     -(sp)                   ; Clear dummy word on stack.    
  54.         move    #MSHRINK,-(sp)          ; Push Mshrink opcode.
  55.         trap    #1                      ; Call GEMDOS.
  56.         add.l   #12,sp                  ; Reset stack pointer.
  57.  
  58. ; Clear some fields of the global array.
  59.  
  60.         clr.l   ap_ptree        
  61.         clr.l   ap_1resv
  62.         clr.l   ap_2resv
  63.         clr.l   ap_3resv
  64.         clr.l   ap_4resv
  65.  
  66. ; Call appl_init to initialize application.
  67.  
  68.         move    #APPL_INIT,control0     ; Place opcode in control array.
  69.         clr     control1                ; Load length of init_in. 
  70.         move    #1,control2             ; Load length of int_out.
  71.         clr     control3                ; Load length of addr_in.
  72.         clr     control4                ; Load length of addr_out.
  73.         jsr     aes                     ; Call the AES.
  74.         cmpi    #$FFFF,ap_id            ; Error?
  75.         beq     end                     ; Yep.  Outta here.
  76.  
  77. ; Get current drive letter.
  78.  
  79.         move    #DGETDRV,-(sp)          ; Call Dgetdrv function.
  80.         trap    #1
  81.         addq.l  #2,sp
  82.         add     #'A',d0                 ; Convert drive to ASCII.
  83.         move.b  d0,pathname             ; Move drive letter to pathname.
  84.         move.b  #':',pathname+1         ; Add colon to pathname.
  85.  
  86. ; Get current path.
  87.  
  88.         move    #0,-(sp)                ; Call Dgetpath function.
  89.         move.l  #pathname+2,-(sp)
  90.         move    #DGETPATH,-(sp)
  91.         trap    #1
  92.         addq.l  #8,sp
  93.  
  94. ; Add *.* to end of pathname.
  95.  
  96.         move    #127,d5                 ; Init loop counter.
  97.         lea     pathname,a5             ; Get address of pathname.
  98. loop1:
  99.         tst.b   (a5)+                   ; Is character a null?
  100.         beq     add_filespec            ; Yep. Found end of pathname.
  101.         dbra    d5,loop1                ; Nope. Try next character.
  102. add_filespec:
  103.         subq.l  #1,a5                   ; Set addr to proper byte.
  104.         move.b  #'\',(a5)+              ; Add \*.* to path.
  105.         move.b  #'*',(a5)+
  106.         move.b  #'.',(a5)+
  107.         move.b  #'*',(a5)
  108.         
  109. ; Bring up the file selector.
  110.  
  111.         move    #FSEL_INPUT,control0    ; Load fsel_input opcode.
  112.         move    #0,control1             ; Load length of int_in.
  113.         move    #2,control2             ; Load length of int_out.
  114.         move    #2,control3             ; Load length of addr_in.
  115.         move    #0,control4             ; Load length of addr_out.
  116.         move.l  #pathname,addr_in       ; Load addr of path string.
  117.         move.l  #filename,addr_in+4     ; Load addr of filename string.
  118.         jsr     aes                     ; Call the AES.
  119.  
  120.         cmpi    #1,int_out+2            ; Chose OK button?
  121.         bne     exit                    ; No, exit program.
  122.         tst.b   filename                ; Do we have a filename?
  123.         beq     exit                    ; No, exit program.
  124.  
  125. ; Construct final pathname.
  126.  
  127.         move    #127,d5                 ; Init loop counter.
  128.         lea     pathname,a5             ; Get addr of pathname.
  129. loop2:
  130.         tst.b   (a5)+                   ; Is character a null?
  131.         beq     found_null              ; Yep.
  132.         dbra    d5,loop2                ; Nope. Try next character.
  133.  
  134. found_null:
  135.         move    #14,d5                  ; Init loop counter.
  136. loop3:
  137.         cmpi.b  #'\',-(a5)              ; Found backslash?
  138.         beq     add_filename            ; Yes. Go tack on filename.
  139.         dbra    d5,loop3                ; No. Try next character.
  140.  
  141. add_filename:
  142.         addq.l  #1,a5                   ; Set addr to char after \.
  143.         move    #14,d5                  ; Init loop counter.
  144.         lea filename,a6                 ; Get addr of filename.
  145. loop4:
  146.         move.b  (a6),(a5)+              ; Add character to path.
  147.         tst.b   (a6)+                   ; Test for null.
  148.         beq     got_filename            ; If null, all done.
  149.         dbra    d5,loop4                ; Copy next character.
  150.  
  151. ; Show final pathname.
  152.  
  153. got_filename:
  154.         move.l  #pathname,-(sp)         ; call Cconws to show...
  155.         move    #CCONWS,-(sp)           ; the final pathname.
  156.         trap    #1
  157.         addq.l  #6,sp
  158.         get_char                        ; Wait for keypress.
  159.         
  160. ; Close down application.
  161.  
  162. exit:
  163.         move    #APPL_EXIT,control0     ; Load appl_exit opcode.
  164.         move    #0,control1             ; Load length of int_in.
  165.         move    #1,control2             ; Load length of int_out.
  166.         move    #0,control3             ; Load length of addr_in.
  167.         move    #0,control4             ; Load length of addr_out.
  168.         jsr     aes                     ; Call the AES.
  169.         
  170. end:
  171.         move.w  #PTERM0,-(sp)           ; Back to desktop.
  172.         trap    #1
  173.  
  174. ;--------------------------------------------------------------------
  175. ; This subroutine calls the AES.  Before calling this subroutine, the
  176. ; program must have correctly initialized the AES control, int_in,
  177. ; and addr_in arrays.
  178. ;
  179. ; Input:        Appropriate values in the int_in, addr_in, and
  180. ;               control arrays.
  181. ; Output:       Appropriate values in the int_out, addr_out, and
  182. ;               global arrays.
  183. ; Regs changed: NONE
  184. ; Uses: apb, global, int_in, int_out, addr_in, addr_out
  185. ;--------------------------------------------------------------------
  186. aes:
  187.         movem.l a0-a7/d0-d7,-(sp)       ; Save registers.
  188.         move.l  #apb,d1                 ; Load addr of apb.
  189.         move.l  #AES_OPCODE,d0          ; Load AES opcode.
  190.         trap    #2                      ; Call AES.
  191.         movem.l (sp)+,a0-a7/d0-d7       ; Restore registers.
  192.         rts
  193.  
  194.         data
  195.         
  196. apb:            dc.l    control,global,int_in,int_out,addr_in,addr_out
  197.  
  198.         bss
  199.  
  200.         even
  201.  
  202. global:
  203. ap_version:     ds.w    1
  204. ap_count:       ds.w    1
  205. ap_id:          ds.w    1
  206. ap_private:     ds.l    1
  207. ap_ptree:       ds.l    1
  208. ap_1resv:       ds.l    1
  209. ap_2resv:       ds.l    1
  210. ap_3resv:       ds.l    1
  211. ap_4resv:       ds.l    1
  212.  
  213. control:
  214. control0:       ds.w    1
  215. control1:       ds.w    1
  216. control2:       ds.w    1
  217. control3:       ds.w    1
  218. control4:       ds.w    1
  219.  
  220. int_in:         ds.w    1
  221. int_out:        ds.w    2
  222. addr_in:        ds.l    2
  223. addr_out:       ds.l    1
  224.  
  225. pathname:       ds.b    128
  226. filename:       ds.b    13
  227.  
  228.                 ds.l    255
  229. stack:          ds.l    1
  230.  
  231.