TITLE MP2 solved by Douglas Jones S MAIN USE "hawk.macs" USE "monitor.h" COMMON STACK,#1000 PSTACK: W STACK SUBTITLE code for STRNCPY ripped verbatim from text ; activation record format for STRNCPY string copy routine RA = 0 ; the return address ARSIZE = 4 ; size of activation record in bytes ; receiving sequence and assumptions STRNCPY: ; R3 holds dst, the address of the destination ; R4 holds src, the address of the source ; R5 holds len, the maximum length to copy ; R6 and 7 are available for any use ; R8-15 must be saved and restored if we use them STORES R1,R2 MOVE R6,R3 ; return_value = src STNCLP: ; while (TRUE) do { TESTR R5 BZS STNCLX ; if (len == 0) break ;* LOADS R7,R4 EXTB R7,R7,R4 ; ch = *src LOADS R1,R3 STUFFB R1,R7,R3 STORES R1,R3 ; *dst = ch TESTR R7 BZS STNCLX ; if (ch == '\0') break ADDSI R4,1 ; src = src + 1 ADDSI R3,1 ; dst = dst + 1 ADDSI R5,-1 ; len = len - 1 BR STNCLP STNCLX: ; } MOVE R3,R6 LOADS R1,R2 JUMPS R1 ; return return_value SUBTITLE Main Program ; ----------------------------------------------------------------- ; ; Note: This code is a direct translation of C code in mp2.shtml ; ; ----------------------------------------------------------------- ; ; this is an 80 character string constant ALIGN 4 SRCBUF: ASCII "abcdefghijklmnopqrstuvwxyz" ASCII "0123456789<>[]" ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ASCII "0123456789<>[",0 ; this is an 80 character global buffer COMMON DSTBUF,80 ALIGN 4 PDSTBUF:W DSTBUF MAIN: LOAD R2,PSTACK ; set up the stack LOAD R1,PDSPINI JSRS R1,R1 ; dspini() ; global initializations LIS R8,80 ; len = 80 LEA R9,SRCBUF ; src = srcbuf LOAD R10,PDSTBUF ; dst = dstbuf LIS R11,0 ; i = 0 MLOOPI: ; do { LIS R12,0 ; j = 0 MLOOPJ: ; do { LIS R13,0 ; k = 0 MLOOPK: ; do { MOVE R3,R10 MOVE R4,R9 MOVE R5,R8 JSR R1,STRNCPY ; strncpy( dst, src, len ) MOVE R3,R10 LOAD R1,PDSPST JSRS R1,R1 ; dspst( dst ) ADDSI R10,1 ; dst = dst + 1 ADDSI R8,-1 ; len = len - 1 ADDSI R13,1 ; k = k + 1 CMPI R13,4 BLT MLOOPK ; } while (k < 4) ADDSI R9,1 ; src = src + 1 ADDSI R12,1 ; j = j + 1 CMPI R12,4 BLT MLOOPJ ; } while (j < 4) ADDSI R8,-1 ; len = len - 1 ADDSI R11,1 ; i = i + 1 CMPI R11,4 BLT MLOOPI ; } while (i < 4) LOAD R1,PEXIT JSRS R1,R1 ; exit() END