;; ------------------------------------------------ ;; strcenter.s for Mac OS X (PowerPC 32bit) ;; % as -o strcenter.o strcenter.s ;; ------------------------------------------------ .machine ppc .globl _strcenter ;; char *strcenter(char *dest, const char *s, size_t width) ;; ;; r3: char *dest ;; r4: const char *s ;; r5: size_t width ;; ;; r7: 文字列 s のサイズ ;; r8: 文字列の前のスペースのサイズ ;; r9: 文字列の後のスペースのサイズ ;; r10: スペースのASCIIコード ;; r11: r3 のコピー ;; r12: r4 のコピー ;; _strcenter: ;; 初期化 li r7, 0 li r10, 32 ; ' ' mr r11, r3 mr r12, r4 b _strlen _init_sizes: ;; 基準となるスペースのサイズ sub r2, r5, r7 ; r2 = width - strlen(s) li r0, 2 divw r2, r2, r0 ; r2 = r2 / 2 ;; 余り sub r0, r5, r7 ; r0 = width - strlen(s) andi. r0, r0, 1 ;; 前後のスペースのサイズを決定、コピー add r8, r2, r0 ; 余りがあれば前のスペースに追加 addi r9, r2, 0 ;; 基準のスペースのサイズが負の場合 cmpi cr7, r2, 0 blt cr7, _shorten_strcenter ;; 前のスペースをコピー _copy_former_spaces: stb r10, 0(r11) addi r11, r11, 1 subi r8, r8, 1 cmpli cr7, r8, 0 bgt cr7, _copy_former_spaces ;; 文字列をコピー _copy_str: lbz r0, 0(r12) stb r0, 0(r11) addi r11, r11, 1 addi r12, r12, 1 subi r7, r7, 1 cmpli cr7, r7, 0 bgt cr7, _copy_str ;; 後のスペースをコピー _copy_latter_spaces: stb r10, 0(r11) addi r11, r11, 1 subi r9, r9, 1 cmpli cr7, r9, 0 bgt cr7, _copy_latter_spaces ;; 終端をコピーして終了 _end_strcenter: li r0, 0 stb r0, 0(r11) blr ; 関数を終了 ;; 文字列の前後をカットしてコピー _shorten_strcenter: sub r12, r12, r8 ; 文字列の前半をカット add r7, r7, r8 add r7, r7, r9 ; 文字列の後半をカット _copy_shorten_str: lbz r0, 0(r12) stb r0, 0(r11) addi r11, r11, 1 addi r12, r12, 1 subi r7, r7, 1 cmpli cr7, r7, 0 bgt cr7, _copy_shorten_str b _end_strcenter _strlen: mr r2, r4 li r7, 0 __strlen: lbz r0, 0(r2) ; 1文字レジスタに移す cmpli cr7, r0, 0 beq cr7, _init_sizes addi r2, r2, 1 addi r7, r7, 1 b __strlen