(*~\Глагол\ПриложенияLink\МПГ2008 (комп., но не раб.)\~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                                            ОТДЕЛ СРЕДА;
(*============================================================================*
 * НАЗНАЧЕНИЕ: среда для выполнения малых Глагол-приложений (после МПГ.exe)
 *============================================================================*)

ИСПОЛЬЗУЕТ 
  ОБХОД ;
(*          \Глагол\                *)
(* ОС     ИЗ "..\..\Отделы\Обмен\"; *)       (* ОС.отд - ещё не компилируется *)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Создать-(адрес+,размер:ЦЕЛ); 
(*
 * Цель:  поддержка встроенной в Глагол задачи СОЗДАТЬ(<пер>+:набор)
 * До:    <размер> - размер данных у <пер>
 * После: <адрес>  - адрес выделенной памяти заполненной 0-ми
 *)
УКАЗ
(*
  адрес:=ОС.ВзятьПамять(размер)
*)
КОН Создать;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Стоп-; 
(* Цель:  выполняется в конце приложения *)
УКАЗ
(*
  ОС.Спать(5000) (* 5с до закрытия окна *)
*)
КОН Стоп;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Делить-(делимое,делитель:ЦЕЛ):ЦЕЛ; 
(*
 * Цель: действие ДЕЛИТЬ
 * Прим: должны сохранять все регистры, кроме ответа R0
 *)
КОД
        ; пролог
        STMDB   SP!,{FP,LR}
        MOV     FP,SP
        ; сохраним R1        
        STMDB   SP!,{R1}
        ; регистровые приёмники ДелОст
        LDR     R1,[FP,#12]   ; R1:=делимое
        LDR     R0,[FP,#8]    ; R0:=делитель
        BL      |.СРЕДА.ДелОст|
        ; восстановим R1        
        LDMIA   SP!,{R1}
        ; эпилог
        MOV     SP,FP
        LDR     FP,[SP],#4
        LDR     PC,[SP],#12
КОН Делить;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Остаток-(делимое,делитель:ЦЕЛ):ЦЕЛ; 
(*
 * Цель: действие ОСТАТОК
 * Прим: должны сохранять все регистры, кроме ответа R0
 *)
КОД
        ; пролог
        STMDB   SP!,{FP,LR}
        MOV     FP,SP
        ; сохраним R1        
        STMDB   SP!,{R1}
        ; регистровые приёмники ДелОст
        LDR     R1,[FP,#12]   ; R1:=делимое
        LDR     R0,[FP,#8]    ; R0:=делитель
        BL      |.СРЕДА.ДелОст|
        MOV     R0,R1
        ; восстановим R1        
        LDMIA   SP!,{R1}
        ; эпилог
        MOV     SP,FP
        LDR     FP,[SP],#4
        LDR     PC,[SP],#12
КОН Остаток;

(*----------------------------------------------------------------------------*)
ЗАДАЧА ДелОст;
(*
 * Вычисление: R0 = R1 ДЕЛИТЬ R0 и R1 = R1 ОСТАТОК R0
 *)
(* Заимствовано из NetBSD 1.3.3 и немного подправленно *)
КОД
LUDIVIDE
        CMP     R0,#1
        SWICC   10 ; 10-я ловушка для деления на 0 не работает!!
        BNE     CONT
        ; возврат при R0 = 1
LDIVIDEL0
        MOV     R0,R1
        MOV     R1,#0
        MOV     PC,LR
CONT
        STMDB   SP!,{R2,R3,R4,R5} ; сохраним используемые регистры
        MOV     R5,R0             ; R5:=R0
        ANDS    R4,R0,#0x80000000 ;
        RSBMI   R0,R0,#0          ; R0:=|R0|
        ANDS    R4,R1,#0x80000000 ; R4:=Знак(R1)
        RSBMI   R1,R1,#0          ; R1:=|R1|
LDIVIDEL1
        MOV     R2,#1
        MOV     R3,#0
        CMP     R1,R0
        BCC     LDIVIDEB0
        CMP     R1,R0,LSL #1
        BCC     LDIVIDEB1
        CMP     R1,R0,LSL #2
        BCC     LDIVIDEB2
        CMP     R1,R0,LSL #3
        BCC     LDIVIDEB3
        CMP     R1,R0,LSL #4
        BCC     LDIVIDEB4
        CMP     R1,R0,LSL #5
        BCC     LDIVIDEB5
        CMP     R1,R0,LSL #6
        BCC     LDIVIDEB6
        CMP     R1,R0,LSL #7
        BCC     LDIVIDEB7
        CMP     R1,R0,LSL #8
        BCC     LDIVIDEB8
        CMP     R1,R0,LSL #9
        BCC     LDIVIDEB9
        CMP     R1,R0,LSL #10
        BCC     LDIVIDEB10
        CMP     R1,R0,LSL #11
        BCC     LDIVIDEB11
        CMP     R1,R0,LSL #12
        BCC     LDIVIDEB12
        CMP     R1,R0,LSL #13
        BCC     LDIVIDEB13
        CMP     R1,R0,LSL #14
        BCC     LDIVIDEB14
        CMP     R1,R0,LSL #15
        BCC     LDIVIDEB15
        CMP     R1,R0,LSL #16
        BCC     LDIVIDEB16
        CMP     R1,R0,LSL #20
        BCC     LDIVIDEB20
        CMP     R1,R0,LSL #21
        BCC     LDIVIDEB21
        CMP     R1,R0,LSL #22
        BCC     LDIVIDEB22
        CMP     R1,R0,LSL #23
        BCC     LDIVIDEB23
        CMP     R1,R0,LSL #24
        BCC     LDIVIDEB24
        CMP     R1,R0,LSL #25
        BCC     LDIVIDEB25
        CMP     R1,R0,LSL #26
        BCC     LDIVIDEB26
        CMP     R1,R0,LSL #27
        BCC     LDIVIDEB27
        CMP     R1,R0,LSL #28
        BCC     LDIVIDEB28
        CMP     R1,R0,LSL #29
        BCC     LDIVIDEB29
        CMP     R1,R0,LSL #30
        BCC     LDIVIDEB30
        CMP     R1,R0,LSL #31
        SUBCS   R1,R1,R0,LSL #31
        ADDCS   R3,R3,R2,LSL #31
        CMP     R1,R0,LSL #30
        SUBCS   R1,R1,R0,LSL #30
        ADDCS   R3,R3,R2,LSL #30
LDIVIDEB30
        CMP     R1,R0,LSL #29
        SUBCS   R1,R1,R0,LSL #29
        ADDCS   R3,R3,R2,LSL #29
LDIVIDEB29
        CMP     R1,R0,LSL #28
        SUBCS   R1,R1,R0,LSL #28
        ADDCS   R3,R3,R2,LSL #28
LDIVIDEB28
        CMP     R1,R0,LSL #27
        SUBCS   R1,R1,R0,LSL #27 
        ADDCS   R3,R3,R2,LSL #27
LDIVIDEB27
        CMP     R1,R0,LSL #26
        SUBCS   R1,R1,R0,LSL #26 
        ADDCS   R3,R3,R2,LSL #26
LDIVIDEB26
        CMP     R1,R0,LSL #25
        SUBCS   R1,R1,R0,LSL #25 
        ADDCS   R3,R3,R2,LSL #25
LDIVIDEB25
        CMP     R1,R0,LSL #24
        SUBCS   R1,R1,R0,LSL #24 
        ADDCS   R3,R3,R2,LSL #24
LDIVIDEB24
        CMP     R1,R0,LSL #23
        SUBCS   R1,R1,R0,LSL #23 
        ADDCS   R3,R3,R2,LSL #23
LDIVIDEB23      
        CMP     R1,R0,LSL #22
        SUBCS   R1,R1,R0,LSL #22 
        ADDCS   R3,R3,R2,LSL #22
LDIVIDEB22      
        CMP     R1,R0,LSL #21
        SUBCS   R1,R1,R0,LSL #21 
        ADDCS   R3,R3,R2,LSL #21
LDIVIDEB21      
        CMP     R1,R0,LSL #20
        SUBCS   R1,R1,R0,LSL #20 
        ADDCS   R3,R3,R2,LSL #20
LDIVIDEB20      
        CMP     R1,R0,LSL #19
        SUBCS   R1,R1,R0,LSL #19 
        ADDCS   R3,R3,R2,LSL #19
LDIVIDEB19      
        CMP     R1,R0,LSL #18
        SUBCS   R1,R1,R0,LSL #18 
        ADDCS   R3,R3,R2,LSL #18
LDIVIDEB18      
        CMP     R1,R0,LSL #17
        SUBCS   R1,R1,R0,LSL #17 
        ADDCS   R3,R3,R2,LSL #17
LDIVIDEB17      
        CMP     R1,R0,LSL #16
        SUBCS   R1,R1,R0,LSL #16 
        ADDCS   R3,R3,R2,LSL #16
LDIVIDEB16      
        CMP     R1,R0,LSL #15
        SUBCS   R1,R1,R0,LSL #15 
        ADDCS   R3,R3,R2,LSL #15
LDIVIDEB15      
        CMP     R1,R0,LSL #14
        SUBCS   R1,R1,R0,LSL #14 
        ADDCS   R3,R3,R2,LSL #14
LDIVIDEB14      
        CMP     R1,R0,LSL #13
        SUBCS   R1,R1,R0,LSL #13 
        ADDCS   R3,R3,R2,LSL #13
LDIVIDEB13      
        CMP     R1,R0,LSL #12
        SUBCS   R1,R1,R0,LSL #12 
        ADDCS   R3,R3,R2,LSL #12
LDIVIDEB12      
        CMP     R1,R0,LSL #11
        SUBCS   R1,R1,R0,LSL #11 
        ADDCS   R3,R3,R2,LSL #11
LDIVIDEB11      
        CMP     R1,R0,LSL #10
        SUBCS   R1,R1,R0,LSL #10 
        ADDCS   R3,R3,R2,LSL #10
LDIVIDEB10      
        CMP     R1,R0,LSL #9 
        SUBCS   R1,R1,R0,LSL #9
        ADDCS   R3,R3,R2,LSL #9
LDIVIDEB9       
        CMP     R1,R0,LSL #8 
        SUBCS   R1,R1,R0,LSL #8
        ADDCS   R3,R3,R2,LSL #8
LDIVIDEB8       
        CMP     R1,R0,LSL #7 
        SUBCS   R1,R1,R0,LSL #7
        ADDCS   R3,R3,R2,LSL #7
LDIVIDEB7       
        CMP     R1,R0,LSL #6 
        SUBCS   R1,R1,R0,LSL #6
        ADDCS   R3,R3,R2,LSL #6
LDIVIDEB6       
        CMP     R1,R0,LSL #5 
        SUBCS   R1,R1,R0,LSL #5
        ADDCS   R3,R3,R2,LSL #5
LDIVIDEB5       
        CMP     R1,R0,LSL #4 
        SUBCS   R1,R1,R0,LSL #4
        ADDCS   R3,R3,R2,LSL #4
LDIVIDEB4       
        CMP     R1,R0,LSL #3 
        SUBCS   R1,R1,R0,LSL #3
        ADDCS   R3,R3,R2,LSL #3
LDIVIDEB3       
        CMP     R1,R0,LSL #2 
        SUBCS   R1,R1,R0,LSL #2
        ADDCS   R3,R3,R2,LSL #2
LDIVIDEB2       
        CMP     R1,R0,LSL #1 
        SUBCS   R1,R1,R0,LSL #1
        ADDCS   R3,R3,R2,LSL #1
LDIVIDEB1       
        CMP     R1,R0
        SUBCS   R1,R1,R0
        ADDCS   R3,R3,R2
LDIVIDEB0       
        MOV     R0,R3  
        ; приводим Си-ответ в Глагол-ответ
        TST     R4,#0x80000000 
        BEQ     KON            ; если делимое > 0, то KON
        RSB     R0,R0,#0       ; частное=-частное
        CMP     R1,#0          
        SUBNE   R0,R0,#1       ; УМЕНЬШИТЬ(частное)
        SUBNE   R1,R5,R1       ; остаток:=делитель-остаток
KON              
        LDMIA   SP!,{R2,R3,R4,R5}
        MOV     PC,LR
КОН ДелОст;

КОН СРЕДА.
