home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / books / 68k_book / arp_src / prg_6ap.s < prev    next >
Text File  |  1985-11-20  |  3KB  |  93 lines

  1.  ; Program Name: PRG_6AP.S
  2.  ;      Version: 1.002
  3.  
  4.  ; Assembly Instructions:
  5.  
  6.  ;     Assemble in PC-relative mode and save with a TOS extension.
  7.  
  8.  ; Program Function:
  9.  
  10.  ;    This is a LSR program that installs custom trap #11, which is invoked
  11.  ; by PRG_6BP.TOS.  This program uses traps installed by CUSTOM.PRG.
  12.  
  13. program_start:                  ; Calculate program size and retain result.
  14.  lea        program_end, a3     ; Fetch program end address.
  15.  suba.l     4(a7), a3           ; Subtract basepage address.
  16.  
  17. enter_supervisor_mode:
  18.  trap       #0                  ; Sets bit 13 of status register to 1.
  19.  
  20. install_trap_11_routine:        ; Note: pointer = vector = pointer.
  21.  lea        trap_11_routine, a0 ; Fetch address of trap #11 routine.
  22.  move.l     a0, $AC             ; Store trap address at pointer address.
  23.  
  24. enter_user_mode:
  25.  andi.w     #$DFFF, SR          ; Sets bit 13 of status register to 0.
  26.  
  27. relinquish_processor_control:   ; Maintain memory residency.
  28.  move.w     #0, -(sp)           ; Exit code.
  29.  move.l     a3, -(sp)           ; Program size.
  30.  move.w     #$31, -(sp)         ; Function = ptermres = GEMDOS $31.
  31.  trap       #1
  32.  
  33. trap_11_routine:
  34.  
  35.  ; When trap #11 is invoked, the CPU pushes the calling program's return
  36.  ; address onto the supervisor stack, then it pushes the calling program's
  37.  ; status register contents onto the supervisor stack.
  38.  
  39.  ; This custom trap #11 handler sets bit #13 of the calling program's status
  40.  ; register.  The bset instruction can be used to set a bit in the first
  41.  ; byte of the word on the top of the stack.  Bit #13 of the status register
  42.  ; is bit #5 of that byte.  Note: to set a bit means to make it equal to 1.
  43.  
  44.  ; When the rte instruction is executed, the CPU will return to the calling
  45.  ; program with the altered copy of its status register, and the calling
  46.  ; program will now be executing in supervisor mode.
  47.  
  48.  ; Register A7 will contain the address of the supervisor stack.  The calling
  49.  ; program now has complete control of the system.  But a decision about
  50.  ; which stack is to be used must be made. 
  51.  
  52.  ; The calling program can choose to continue with A7 pointing to the 
  53.  ; supervisor stack, or it can save the contents of A7 = SSP and load the
  54.  ; address of a user stack into A7.  Processing can continue in that manner
  55.  ; until it is necessary to return to user mode.  The return to user mode
  56.  ; can be accomplished by reloading A7 with the SSP, then by resetting bit
  57.  ; #13 of the status register.  Note: resetting a bit means to make it equal
  58.  ; to 0.
  59.  
  60. print_current_SSP:              ; SSP = address of supervisor stack.
  61.  lea        header_1, a0
  62.  bsr.s      print_string
  63.  move.l     a7, d1              ; Convert to ASCII hexadecimal.
  64.  trap       #5
  65.  bsr.s      print_string
  66.  bsr.s      print_newline
  67.  bset       #5, (sp)            ; The invoking program will be executing in 
  68.  rte                            ; supervisor mode upon return.
  69.  
  70.  ;
  71.  ; SUBROUTINES
  72.  ;
  73.  
  74. print_string:         
  75.  pea        (a0)
  76.  move.w     #9, -(sp) 
  77.  trap       #1        
  78.  addq.l     #6, sp    
  79.  rts
  80.  
  81. print_newline:
  82.  lea        newline, a0
  83.  bsr.s      print_string
  84.  rts
  85.  
  86.  data
  87. newline:     dc.b $D,$A,0
  88. header_1:    dc.b '    During trap 11 invocation:  ',0
  89.  bss
  90.  align
  91. program_end: ds.l 0
  92.  end