;;; runtime module for P compiler; ;;; ;;; !!!! CAUTION: THIS MODULE MUST BE LINKED AT LAST !!! ;;; MULT START ; GR1 <- GR1*GR2 ,GR2のみ保存 XOR GR0,GR0 LD GR1,GR1 L1 JZE L2 ADDA GR0,GR2 SUBA GR1,=1 JUMP L1 L2 LD GR1,GR0 RET END ; DIV START ; GR1 <- GR1/GR2 ,GR2のみ保存 XOR GR3,GR3 LD GR0,GR1 JPL L1 JZE L1 XOR GR4,GR4 SUBA GR4,GR0 LD GR0,GR4 LAD GR3,1,GR3 L1 LD GR2,GR2 JPL L2 JZE L2 XOR GR4,GR4 SUBA GR4,GR2 LD GR2,GR4 LAD GR3,-1,GR3 L2 XOR GR1,GR1 L3 LAD GR1,1,GR1 SUBA GR0,GR2 JMI L4 JUMP L3 L4 ADDA GR0,GR2 LAD GR1,-1,GR1 LD GR3,GR3 JZE L5 XOR GR4,GR4 SUBA GR4,GR1 LD GR1,GR4 L5 RET END ; ; int str2int(char *str); STR2INT START XOR GR1,GR1 ; 結果変数 LAD GR4,1 ; 符号フラグ(0: マイナス,1: プラス) LD GR3,1,GR7 ; 入力文字列の先頭アドレス L1 LD GR0,0,GR3 ; 1文字読んで GR0 へ JZE L4 CPL GR0,=#20 ; ' ' JZE L3 CPL GR0,=#2B ; '+' JZE L3 CPL GR0,=#2D ; '-' JNZ L2 XOR GR4,GR4 JUMP L3 L2 LD GR2,GR1 SLA GR1,3 ; 8倍 SLA GR2,1 ; 2倍 ADDA GR1,GR2 SUBL GR0,=#30 ; '0' ADDL GR1,GR0 L3 LAD GR3,1,GR3 JUMP L1 L4 LD GR4,GR4 JNZ L5 SUBA GR4,GR1 LD GR1,GR4 L5 RET END ; ; char *int2str(char *buffer, int num); INT2STR START LAD GR4,STR LAD GR3,#20 LD GR1,2,GR7 JPL L2 JMI L1 LAD GR0,#30 ST GR0,-1,GR4 ST GR3,-2,GR4 LAD GR1,-2,GR4 RET ; L1 XOR GR0,GR0 SUBA GR0,GR1 LD GR1,GR0 LAD GR3,#2D L2 JZE L5 XOR GR2,GR2 L3 LAD GR2,1,GR2 SUBA GR1,=10 JMI L4 JUMP L3 L4 ADDA GR1,=10 LAD GR2,-1,GR2 LAD GR1,#30,GR1 LAD GR4,-1,GR4 ST GR1,0,GR4 LD GR1,GR2 JUMP L2 L5 ST GR3,-1,GR4 LAD GR1,-1,GR4 LD GR2,1,GR7 L6 LD GR0,0,GR1 ST GR0,0,GR2 JZE L7 LAD GR1,1,GR1 LAD GR2,1,GR2 JUMP L6 L7 LD GR1,1,GR7 RET DS 6 STR DC 0 END ; ; char *readln(char *buffer); READLN START IN BUF,LEN XOR GR1,GR1 LD GR2,1,GR7 L1 LD GR0,BUF,GR1 ST GR0,0,GR2 CPL GR1,LEN JZE L2 LAD GR1,1,GR1 LAD GR2,1,GR2 JUMP L1 L2 XOR GR0,GR0 ST GR0,0,GR2 LD GR1,1,GR7 RET BUF DS 256 LEN DS 1 END ; ; void writeln(char *str, ...) WRITELN START ADDL GR1,GR7 LD GR2,GR7 LAD GR4,BUF L1 CPL GR2,GR1 JZE L3 LAD GR2,1,GR2 LD GR3,0,GR2 L2 LD GR0,0,GR3 JZE L1 ST GR0,0,GR4 LAD GR3,1,GR3 LAD GR4,1,GR4 JUMP L2 L3 LAD GR0,BUF SUBL GR4,GR0 ST GR4,LEN OUT BUF,LEN RET BUF DS 256 LEN DS 1 END ; DSTACK START DS 0 END