home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
books
/
68k_book
/
arp_src
/
prg_6cp.s
< prev
next >
Wrap
Text File
|
1985-11-20
|
6KB
|
175 lines
; Program Name: PRG_6CP.S
; Version: 1.002
; Assembly Instructions:
; Assemble in PC-relative mode and save with a TOS extension.
; Execution Instructions:
; Execute from the desktop or from SPAWN.TTP. This program uses traps
; installed by CUSTOM.PRG.
; Program Function:
; Prints the content of register A7 during various stages of execution
; while the state of the processor is varied from user mode to supervisor
; mode, from supervisor mode back to user mode, from user mode to supervisor
; mode a second time and from supervisor mode back to user mode a second time.
; In this program, GEMDOS function $20 is used to toggle the state of the
; processor. Refer to pages 117 and 118 of the Internals book, under the
; $20 SUPER heading. Aside from the fundamental methodology of function
; invocation, two important items of information are discussed there.
; 1. GEMDOS $20 transfers the address of the user stack to the supervisor
; stack pointer (SSP). This means that while the processor is in the
; supervisor state, if that state was forced by invocation of GEMDOS $20,
; then the user stack is active and the supervisor stack is inactive. This
; means that the user stack must be large enough to accomodate supervisor
; state activity. Among other things, this activity includes the storage of
; the program counter and status register during exception processing.
; 2. Invocation of GEMDOS $20 can corrupt, and usually does as far as I can
; determine, registers A1 and D1. Information in that section of the Internals
; book indicates that only this GEMDOS function can alter the values in those
; registers.
calculate_program_size:
lea -$102(pc), a1 ; Fetch basepage start address.
lea program_end, a0 ; Fetch program end address.
trap #6 ; Return unused memory to op system.
print_heading:
lea heading, a0
bsr print_string
; NOTE: During this section of the program, no user stack has yet been
; assigned, therefore, the user stack address is that of the default
; user stack assigned by the system when execution commences.
print_address_of_default_user_stack:
lea header_1, a0
bsr print_string
move.l a7, d1 ; Convert address to ASCII hexadecimal.
trap #5
bsr print_string
bsr print_newline
invoke_gemdos_super_mode_function:
move.l #0, -(sp) ; The zero turns on supervisor mode.
move.w #$20, -(sp) ; Function = super = GEMDOS $20.
trap #1 ; Supervisor stack pointer (SSP) returned in D0.
addq.l #6, sp ; SSP = address of supervisor stack.
movea.l d0, a5 ; Save SSP in scratch register.
print_SSP_returned_by_GEMDOS_20:
lea header_6, a0
bsr print_string
move.l a5, d1 ; Convert to ASCII hexadecimal.
trap #5
bsr print_string
bsr print_newline
print_current_SSP: ; Did GEMDOS $20 alter the address in the
lea header_2, a0 ; supervisor stack pointer?
bsr print_string
move.l a7, d1 ; Convert to ASCII hexadecimal.
trap #5
bsr.s print_string
bsr print_newline
bsr print_newline
enter_user_mode:
pea (a5) ; Restore supervisor stack pointer.
move.w #$20, -(sp) ; Function = super = GEMDOS $20.
trap #1
addq.l #6, sp
; NOTE: During this section of the program, a user stack is assigned. The
; user stack address is that of the label "stack".
print_address_of_assigned_user_stack:
lea header_3, a0
bsr.s print_string
lea stack, a7
move.l a7, d1 ; Convert to ASCII hexadecimal.
trap #5
bsr.s print_string
bsr.s print_newline
invoke_gemdos_function_again:
move.l #0, -(sp) ; The zero turns on supervisor mode.
move.w #$20, -(sp) ; Function = super = GEMDOS $20.
trap #1 ; Supervisor stack pointer (SSP) returned in D0.
addq.l #6, sp
movea.l d0, a5 ; Save SSP in scratch register.
print_SSP_returned_by_GEMDOS_20_again:
lea header_7, a0
bsr print_string
move.l a5, d1
trap #5
bsr print_string
bsr print_newline
print_current_SSP_again:
lea header_4, a0
bsr.s print_string
move.l a7, d1 ; Convert to ASCII hexadecimal.
trap #5
bsr.s print_string
bsr.s print_newline
enter_user_mode_again:
pea (a5) ; Restore supervisor stack pointer.
move.w #$20, -(sp) ; Function = super = GEMDOS $20.
trap #1
addq.l #6, sp
print_address_of_assigned_user_stack_again:
lea header_5, a0
bsr.s print_string
move.l a7, d1 ; Convert to ASCII hexadecimal.
trap #5
bsr.s print_string
bsr.s print_newline
terminate:
trap #8
;
; SUBROUTINES
;
print_string:
pea (a0)
move.w #9, -(sp)
trap #1
addq.l #6, sp
rts
print_newline:
lea newline, a0
bsr.s print_string
rts
data
newline: dc.b $D,$A,0
heading: dc.b 'PRG_6CP Execution Results => Content of A7:',$D,$A,$D,$A,0
header_1: dc.b ' NO USER STACK ASSIGNED',$D,$A
dc.b ' Start of program: ',0
header_2: dc.b ' After GEMDOS $20 invocation: ',0
header_6: dc.b ' SSP returned by GEMDOS $20: ',0
header_3: dc.b ' USER STACK ASSIGNED',$D,$A
dc.b ' After force to user mode: ',0
header_4: dc.b ' After GEMDOS $20 invocation: ',0
header_7: dc.b ' SSP returned by GEMDOS $20: ',0
header_5: dc.b ' After force to user mode: ',0
bss
align
ds.l 96
stack: ds.l 0
program_end: ds.l 0
end