home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 12 / dc / dcexe.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-09-21  |  6.7 KB  |  175 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                                  DCEXE.PAS                              *)
  3. (*                  hier arbeitet der didaktische Computer                 *)
  4. (* ----------------------------------------------------------------------- *)
  5. PROCEDURE Stop;     (* nach Programmende bei "RUN" und "GO" alles anzeigen *)
  6. BEGIN
  7.   IF command <> step THEN BEGIN Print_MemPage(counter); display_status;  END;
  8.   end_of_program := TRUE;
  9. END;
  10.  
  11. PROCEDURE End_Condition;                  (* Programm in Endlos-Schleife ? *)
  12. BEGIN
  13.   IF (ar = pc) AND ((command = run) OR (command = go)) THEN
  14.     BEGIN  Stop;  error(loops);  END;
  15. END;
  16. (* ----------------------------------------------------------------------- *)
  17. PROCEDURE Load_Accu (value: INTEGER);
  18. BEGIN
  19.   IF (value > (-1 * Succ(sign_val))) AND (value < sign_val) THEN
  20.     BEGIN  Load_Int(value,ac);  Transfer_DR_ALU;  END
  21.   ELSE  BEGIN  Stop;  error(ovf);  END;                        (* Overflow *)
  22. END;
  23. (* ----------------------------------------------------------------------- *)
  24. PROCEDURE Memory_Cycle;
  25. BEGIN  Copy_Bits(ir,ar,addr_start,addr_end);  Transfer_AD_AR;  END;
  26.  
  27. PROCEDURE Memory_Read;
  28. BEGIN  Memory_Cycle;  dr := memory[address];  Read_Cycle;  END;
  29.  
  30. PROCEDURE Memory_Write;
  31. BEGIN  Memory_Cycle;  memory[address] := dr;  Write_Cycle;  END;
  32.  
  33. PROCEDURE Memory_Push;
  34. BEGIN
  35.   ar := sp;  Transfer_SP_AR;  memory[s_ptr] := dr;  Write_Cycle;
  36.   decrement(s_ptr); Int_to_Bin(s_ptr,addr_start,addr_end,sp);  Dec_SP;
  37. END;
  38.  
  39. PROCEDURE Memory_Pop;
  40. BEGIN
  41.   increment(s_ptr);  Int_to_Bin(s_ptr,addr_start,addr_end,sp);  Inc_SP;
  42.   ar := sp;  Transfer_SP_AR;  dr := memory[s_ptr];  Read_Cycle;
  43. END;
  44. (* ----------------------------------------------------------------------- *)
  45. PROCEDURE Load;
  46. BEGIN  Memory_Read;  ac := dr;  Transfer_DR_ALU;  END;
  47.  
  48. PROCEDURE Store;
  49. BEGIN  dr := ac;  Transfer_AC_DR;  Memory_Write;  END;
  50. (* ----------------------------------------------------------------------- *)
  51. PROCEDURE Add;
  52. BEGIN
  53.  Memory_Read;                         Gate(pl,28,12,TRUE);
  54.  Load_Accu(Int_Val(ac)+Int_Val(dr));  Gate(sp1,28,12,FALSE);
  55. END;
  56.  
  57. PROCEDURE Subtract;
  58. BEGIN
  59.   Memory_Read;                         Gate(mi,28,12,TRUE);
  60.   Load_Accu(Int_Val(ac)-Int_Val(dr));  Gate(sp1,28,12,FALSE);
  61. END;
  62. (* ----------------------------------------------------------------------- *)
  63. PROCEDURE Jump;
  64. BEGIN
  65.   Copy_Bits(ir,pc,addr_start,addr_end); Transfer_AD_PC;
  66.   counter := address;  End_Condition;
  67. END;
  68.  
  69. PROCEDURE Jump_if_Minus;
  70. BEGIN  IF is_Minus(ac) THEN  Jump;  END;
  71.  
  72. PROCEDURE Jump_to_Subroutine;
  73. BEGIN
  74.   dr := pc;  Transfer_PC_DR;  Memory_Push;
  75.   Copy_Bits(ir,pc,addr_start,addr_end);  Transfer_AD_PC;
  76.   Int_to_Bin(address,addr_start,addr_end,pc);  counter := address;
  77. END;
  78.  
  79. PROCEDURE Return;
  80. BEGIN
  81.   Memory_Pop; pc := dr; Transfer_DR_PC;
  82.   Bin_to_Int(pc,addr_start,addr_end,counter);  End_Condition;
  83. END;
  84. (* ----------------------------------------------------------------------- *)
  85. PROCEDURE Fetch_Instruction;
  86. BEGIN
  87.   ar := pc;  Transfer_PC_AR;  Bin_to_Int(ar,addr_start,addr_end,address);
  88.   dr := memory[address];  Read_Cycle;  increment(counter);
  89.   Int_to_Bin(counter,addr_start,addr_end,pc);  Inc_PC;
  90.   ir := dr;  Transfer_DR_IR;  Bin_to_Int(ir,op_start,op_end,op_code);
  91.   Bin_to_Int(ir,addr_start,addr_end,address);
  92. END;
  93. (* ----------------------------------------------------------------------- *)
  94. PROCEDURE do_Interrupt;                        (* Unterbrechung ausfuehren *)
  95. BEGIN
  96.   dr := pc;  Transfer_PC_DR;  Memory_Push;  counter := int_addr;
  97.   Int_to_Bin(int_addr,addr_start,addr_end,pc);  Transfer_IA_PC;
  98. END;
  99.  
  100. PROCEDURE check_Interrupt;                  (* Unterbrechung aufgetreten ? *)
  101. VAR  ch: CHAR;
  102. BEGIN
  103.   IF Legal(int_addr) THEN
  104.     IF KeyEntered AND ((command = run) OR (command = go)) THEN BEGIN
  105.         GotoXY(2,25);  RevOn;  Write(' Interrupt wird ausgefuehrt ');
  106.         RevOff;  Bell;  Delay(2 * time);  ch := ReadKeyboard;
  107.         Erase_Error;  do_Interrupt;
  108.         IF ch = esc THEN BEGIN  Stop;  error(break);  END;
  109.       END
  110.     ELSE IF command = step THEN BEGIN
  111.         GotoXY(2,25);  RevOn;  Write('<ESC>: Interrupt ausfuehren');  RevOff;
  112.         ch := ReadKeyboard;  Erase_Error;
  113.         IF ch = esc THEN  do_Interrupt;
  114.       END;
  115. END;
  116. (* ----------------------------------------------------------------------- *)
  117. PROCEDURE check_Breakpoint;
  118. BEGIN
  119.   IF (counter = break_addr)
  120.   AND ((command = run) OR (command = go)) THEN BEGIN
  121.     Stop; GotoXY(2,25); RevOn; Write('Stop: Breakpoint erreicht'); RevOff;
  122.   END
  123. END;
  124. (* ----------------------------------------------------------------------- *)
  125. PROCEDURE Execute_Instruction;
  126. VAR old_pc: INTEGER;  ch: CHAR;
  127. BEGIN
  128.   end_of_program := FALSE;  old_pc := counter;  Invert_Cell(old_pc);
  129.   Fetch_Instruction;
  130.   CASE op_code OF
  131.      0: Load;                1: Store;                2: Add;
  132.      3: Subtract;            4: Jump;                 5: Jump_if_Minus;
  133.      6: Jump_to_Subroutine;  7: Return;
  134.   END;
  135.   IF out_cycle THEN Print_Registers;
  136.   check_Interrupt;  check_Breakpoint;
  137.   IF KeyEntered THEN
  138.     IF ReadKeyboard = esc THEN BEGIN Stop; error(break); END;
  139.   print_cell(old_pc);
  140. END;
  141. (* ----------------------------------------------------------------------- *)
  142. PROCEDURE Execute_Program;
  143. BEGIN
  144.   blink_num := 0; blink_time := 0;  out_cycle := mode = delaying;
  145.   IF out_cycle THEN blink_num := 2;
  146.   REPEAT  Execute_Instruction;  UNTIL end_of_program;  END;
  147. (* ----------------------------------------------------------------------- *)
  148. PROCEDURE Go_From;
  149. VAR  err: INTEGER;
  150. BEGIN
  151.   Val(item[2],counter,err);
  152.   IF (err = null) AND Legal(counter) THEN
  153.     BEGIN  Int_to_Bin(counter,addr_start,addr_end,pc);  Execute_Program; END
  154.   ELSE  error(illadd);                                  (* Illegal address *)
  155. END;
  156. (* ----------------------------------------------------------------------- *)
  157. PROCEDURE Single_Step;
  158. BEGIN
  159.   blink_num := 2;  blink_time := time DIV 2;
  160.   out_cycle := TRUE;   Execute_Instruction;
  161. END;
  162. (* ----------------------------------------------------------------------- *)
  163. PROCEDURE Clear;                          (* Computer zuruecksetzen: RESET *)
  164. VAR  i: INTEGER;
  165. BEGIN
  166.   FOR i := 0 TO mem_size DO  memory[i] := zero;
  167.   ac := zero;  ar := zero;  pc := zero;  dr := zero;  ir := zero;
  168.   counter := 0;    address := 0;  s_ptr := mem_size;
  169.   Int_to_Bin(s_ptr,addr_start,addr_end,sp);
  170.   mempage := -1;   Print_MemPage(0);         out_cycle := TRUE;
  171.   display_status;  items := 1;  breakpoint;  interrupt;
  172. END;
  173. (* ----------------------------------------------------------------------- *)
  174. (*                                  DCEXE.PAS                              *)
  175.