home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
books
/
68k_book
/
arp_src
/
prg_8ar.s
< prev
next >
Wrap
Text File
|
1985-11-20
|
14KB
|
328 lines
; Program Name: PRG_8AR.S
; Version: 1.006
; MAJOR NOTE:
; THIS PROGRAM MAY NOT FUNCTION CORRECTLY IF TURBO ST IS INSTALLED.
; Assembly Instructions:
; Assemble in Relocatable mode and save with a PRG extension. From
; the desktop, change the extension to ACC. Programs that are to function
; as desk accessories MUST be assembled in Relocatable mode. If you design
; a desk accessory so that it can be assembled in PC-relative mode, and if
; you attempt to load that accessory via MultiDesk, you will receive an
; error pertaining to the attempt to read in the accessory. If you place
; that accessory in the boot directory, the system will reset every time
; it attempts to load the accessory. Sei gewarnt!
; Function:
; This program is used to observe system corruption of AES arrays
; during the execution of AES functions. Data is output into a file which
; assumes the name declared at the variable "filename". You may wish to
; alter the file's path to something like "A:\PRG_8DR.DAT" if you decide to
; assemble and execute the program.
; The program's output data is written with GEMDOS function $9, the write
; string to screen function. But the data is redirected to the file with
; GEMDOS function $46, the f_force function.
; Execution Instructions:
; Place PRG_8AR.ACC in the root directory of your boot disk. During
; the next power-up cycle, the program will be installed in memory as a desk
; accessory; assuming that it is not blocked by a program that permits desk
; accessory loading selections. Of course, if you use MultiDesk, you need
; not power up to use PRG_8AR.ACC immediately.
; The desk accessory is identified as a menu selection by the name
; Accessory Arrays. Choose the desk accessory twice so that the contents
; of the arrays will be printed twice from within the message handler. The
; message handler is disabled after it has been invoked twice.
; MAJOR NOTE:
; Although accessories such as MultiDesk add significant power to a ST
; system; and although initial testing of a desk accessory program can be
; accomplished via MultiDesk loading of the program, thereby alleviating the
; the testing process, the program under test cannot be pronounced correct
; until it has been permitted to load normally from the boot disk.
; For example, if the first statement of this program, which loads the
; stack's address into A7, is moved to a location following any instruction
; that requires stack usage, the accessory will function perfectly when it is
; loaded and executed via MultiDesk; but it will bomb during boot because, at
; that time, no default stack has yet been assigned by the system.
; REMEMBER: Programs executed during boot MUST provide their own stacks.
; NOTE: Within the program, registers are used as variables as much as
; possible to speed things up.
lea stack(pc), a7 ; This must be the first instruction.
create_output_file: ; COMPUTE! TOS book page 270.
move.w #0, -(sp) ; File attribute = read/write.
pea filename(pc)
move.w #$3C, -(sp) ; Function = f_create = GEMDOS $3C.
trap #1 ; File handle is returned in D0.
addq.l #8, sp
move.w d0, handle
redirect_output_bound_for_screen:
; NOTE: If the output file's handle is exchanged with the video screen's
; handle, then the printline function = GEMDOS $9 can be used to
; write to the file.
redirect_output: ; Exchange file handle with screen's handle.
move.w handle(pc), -(sp) ; This is the disk file's handle.
move.w #1, -(sp) ; This is the video screen's handle.
move.w #$46, -(sp) ; Function = f_force = GEMDOS $46.
trap #1
addq.l #6, sp
initialize_register_variables:
move.w #$C8, d3 ; *** D3 is variable for AES call number.
lea aes_pb(pc), a5 ; A5 is pointer to array address block.
lea control(pc), a4 ; A4 is pointer for array 'control'.
lea hex_table(pc), a3 ; A3 points to hexadecimal ASCII digits.
; For each test point, the contents of each AES array are printed.
;
; TEST POINT 0: Before appl_init
;
bsr print_arrays
initialize_application: ; COMPUTE! AES book page 223.
; Application identification = apid returned in int_out[0] and global[2].
move.w #$A, (a4) ; Function = appl_init = AES $A.
move.w #0, 2(a4) ; Input no 16-bit integer parameters.
move.w #1, 4(a4) ; Return one 16-bit integer parameter.
move.w #0, 6(a4) ; Input no 32-bit pointer parameters.
move.w #0, 8(a4) ; Return no 32-bit pointer parameters.
bsr aes ; Invoke trap #2 AES exception.
;
; TEST POINT 1: After appl_init, before menu_register
;
bsr print_arrays
menu_installation: ; COMPUTE! AES book page 248.
; Menu identification number returned in int_out[0].
move.w #$23, (a4) ; Function = menu_register = AES $23.
move.w #1, 2(a4) ; Input one 16-bit integer parameter.
move.w #1, 4(a4) ; Return one 16-bit integer parameter.
move.w #1, 6(a4) ; Input one 32-bit pointer parameter.
move.w #0, 8(a4) ; Return no 32-bit pointer parameters.
lea global(pc), a0 ; Fetch address of global array.
move.w 4(a0), int_in ; Application identification to int_in[0].
move.l #menu_text, addr_in ; Menu text address to addr_in[0].
bsr aes
move.w int_out(pc), menu_id ; Store menu identification number.
; MAIN ACCESSORY LOOP
;
; TEST POINT 2: After menu_register, before evnt_mesag
;
bsr print_arrays
move.l #message, addr_in ; Address of message array to addr_in.
wait_for_message: ; COMPUTE! AES book page 235.
move.w #$17, (a4) ; Function = evnt_mesag = AES $17.
move.w #0, 2(a4) ; Input one 16-bit integer parameter.
move.w #1, 4(a4) ; Return one 16-bit integer parameter.
move.w #1, 6(a4) ; Input one 32-bit pointer parameter.
move.w #0, 8(a4) ; Return no 32-bit pointer parameters.
bsr aes
; When a message is received it is placed in array 'message'.
; ****************************************************************************
; ****************************************************************************
message_handler: ; Entrance point when message is received.
lea message(pc), a0 ; Fetch address of array 'message'.
cmpi.w #$28, (a0) ; Compare ACCESSORY OPEN code with message[0].
bne.s wait_for_message ; Execute the evnt_mesag function.
move.w 8(a0), d0 ; The menu item selected is stored in element
; four (message[4]) of array 'message'. This
; application's id # is in menu_id.
cmp.w menu_id(pc), d0 ; Was this application selected.
bne.s wait_for_message ; Execute the evnt_mesag function.
; ****************************************************************************
; ****************************************************************************
; Execution proceeds past this point only when this application has been
; selected from the menu.
cmpi.w #5, test ; Have five array groups been printed?
beq wait_for_message ; Disable message handler if true.
;
; TEST POINT 3: In message handler, before evnt_mesag
;
bsr print_arrays
cmpi.w #5, test ; Branch after 2nd entrance in message handler.
beq.s close_file
bra wait_for_message ; Execute the evnt_mesag function.
close_file:
move.w handle(pc), -(sp)
move.w #$3E, -(sp) ; Function = GEMDOS $3E = f_close.
trap #1
addq.l #4, sp
redirect_screen_output:
move.w #1, -(sp) ; This is the screen's handle.
move.w handle(pc), -(sp) ; This is the file's handle.
move.w #$46, -(sp) ; Function = f_force = GEMDOS $46.
trap #1
addq.l #6, sp
bra wait_for_message
;
; SUBROUTINES
;
print_arrays:
lea newline(pc), a0
bsr print_line
lea test_header(pc), a0 ; Setup to fetch test point header.
move.w test(pc), d0 ; Load test point number into D0.
lsl.w #2, d0 ; Multiply by 4 to reach next pointer slot.
movea.l 0(a0,d0.w), a0 ; Print test point header.
bsr print_line
lea pre_spaces(pc), a0 ; Print spaces before column headers.
bsr print_line
lea aes_names(pc), a0 ; Print AES array column headers.
bsr print_line
lea pre_spaces(pc), a0 ; Print spaces before underline.
bsr print_line
lea aes_underline(pc), a0; Print AES underline.
bsr print_line
moveq.l #0, d7 ; D7 is up counter to print 5 rows.
moveq.l #4, d6 ; D6 is down counter to print 5 elements.
put_row:
lea buffer(pc), a0 ; Buffer is an 80 byte line buffer.
movea.l a5, a6 ; Copy aes parameter block address.
move.w #5, d5 ; D5 is array counter for 6 arrays.
move.w #11, d0 ; Print beginning spaces to line up columns.
put_space:
move.b #$20, (a0)+
dbra d0, put_space
put_element: ; Print contents of array element.
move.w d7, d0 ; Print array element number.
andi.b #$F, d0 ; Mask most significant nibble.
move.b 0(a3,d0.w), d0 ; Store appropriate hex character in D0.
move.b d0, (a0)+
move.b #$3A, (a0)+ ; A colon.
move.b #$20, (a0)+ ; A space.
move.w d7, d0 ; Multiply contents of D7 by 2 in D0 to
lsl.w #1, d0 ; obtain offset for next array element.
movea.l (a6)+, a1 ; Copy array address into A1 and increment
; A6 to point to next array address.
move.w 0(a1,d0.w), d0 ; Fetch contents of array element.
moveq #3, d2 ; D2 is loop counter for ASCII conversion.
convert_digit: ; Convert a nibble, then print it.
rol.w #4, d0 ; Rotate most significant nibble to the
; least significant nibble position.
move.b d0, d1 ; Copy least significant byte of D0 to D1.
andi.b #$F, d1 ; Mask out most significant nibble of D1.
ext.w d1 ; Extend to word length.
move.b 0(a3,d1.w), d1 ; Fetch ASCII hex digit to D1.
put_digit:
move.b d1, (a0)+
dbra d2, convert_digit ; Loop until D2 = -1.
_put_spaces:
move.b #$20, (a0)+
move.b #$20, (a0)+
dbra d5, put_element
move.b #0, (a0) ; Store NULL at end of string.
lea buffer(pc), a0
bsr print_line
lea newline(pc), a0 ; Print a newline.
bsr print_line
addi.w #1, d7 ; Increment up counter.
dbra d6, put_row
add.w #1, test ; Increment test for next test point.
rts
aes: ; COMPUTE! AES book page 13,
move.l a5, d1 ; Address of aes_pb.
move.w d3, d0 ; AES identifier = $C8.
trap #2
rts
print_line:
move.l a0, -(sp) ; Push string onto stack.
move.w #9, -(sp) ; Function = c_conws.
trap #1
addq.l #6, sp
rts
data
aes_pb: dc.l control,global,int_in,int_out,addr_in,addr_out
test_header: dc.l zero,one,two,three,four
zero:
dc.b $D,$A,'TEST POINT 0: Before appl_init',$D,$A,$D,$A,0
one:
dc.b $D,$A,'TEST POINT 1: After appl_init, before menu_register',$D,$A,$D,$A,0
two:
dc.b $D,$A,'TEST POINT 2: After menu_register, before evnt_mesag',$D,$A,$D,$A,0
three:
dc.b $D,$A,'TEST POINT 3: In message handler, before evnt_mesag',$D,$A,$D,$A,0
four:
dc.b $D,$A,'TEST POINT 4: In message handler second time',$D,$A,$D,$A,0
hex_table: dc.b '0123456789ABCDEF'
newline: dc.b $D,$A,0
aes_header: dc.b ' AES ARRAYS',$D,$A,0
aes_names: dc.b 'CONTROL GLOBAL INT_IN INT_OUT ADDR_IN '
dc.b 'ADDR_OUT',$D,$A,0
aes_underline:dc.b '------- ------- ------- ------- ------- '
dc.b '--------',$D,$A,0
pre_spaces: dc.b ' ',0
spaces: dc.b ' ',0
menu_text: dc.b ' Accessory Arrays ',0
filename: dc.b 'E:\PRG_8\PRG_8AR.DAT',0
bss
align
;
; AES ARRAYS:
;
; The addresses of the arrays declared below will be stored in the pointer
; array 'aes_pb'. That happens because the program is assembled in Relocatable
; mode. The sizes declared for the arrays are identical simply because I am
; making it easy to line up the program's output.
control: ds.w 5 ; Control parameters.
global: ds.w 5 ; Global parameters.
int_in: ds.w 5 ; Input parameters.
int_out: ds.w 5 ; Output parameters.
addr_in: ds.w 5 ; Input addresses.
addr_out: ds.w 5 ; Output addresses.
;
; APPLICATION VARIABLES
;
handle: ds.w 1
test: ds.w 1
message: ds.l 4 ; 16 byte array.
menu_id: ds.w 1
buffer: ds.b 80
ds.l 300 ; Program stack.
stack: ds.l 0 ; Address of program stack.
end