IMD 1.18: 20/07/2019 14:31:26   ,IBM 2.0p  % *P3м|أzx!|s|&||||| &||~r|~}pػ.|.|.*|2PXr8.( |v.|.& |%u@@|u3~}p}.$tMP.|CXr,3 & &M G3} u } uþ}36|ˆ|36|||.|. 6|ʆ.| Non-System disk or disk error Replace and strike any key when ready Disk Boot failure ibmbio com0ibmdos com0U@`  @`! #@%`')+-//3@5`79;=?AC@E`GIKMQ S@U`WY[a c@ogikmoq s@u`w @o @ ` 9r.suڊ"(bڊ (sI u2Јj,e* )XC&I)p(S [u(S[t5Cڊ/C*sQRS,[Zu CuY2 Y*÷(SRC+K< t :uC[Q/C .ڈ+ڈY[s u Cu([aPڊ/C 0 then character_present := false else begin character_present := true; character := reg.ax.byte[low]; dummy.signed := ord(reg.ax.byte[high]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; scan_code := dummy.word; end; end {test_kb_buffer}; {--------------------------------------------------------------------} procedure get_kb_shift_status(var kb_flag: byte); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ibm_get_kb_shift_status); bios_interrupt(ibm_keyboard_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; kb_flag := dummy.word; end {get_kb_shift_status}; {--------------------------------------------------------------------} {--------------------------------------------------------------------} {----------------------------------------} {procedures for temporary rs232 interface} {----------------------------------------} procedure temp_rs232_init(params: byte; module_number: integer); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_temp_rs232_init); dummy.word := params; reg.ax.byte[low] := chr(dummy.signed); reg.dx.signed := module_number;  bios_interrupt(ms_temp_rs232_int,reg); end {temp_rs232_init}; procedure temp_rs232_send_char(character: char; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_temp_rs232_send_char); reg.ax.byte[low] := character; reg.dx.signed := module_number; bios_interrupt(ms_temp_rs232_int,reg); end {temp_rs232_send_char}; procedure temp_rs232_rcv_char(var character: char; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_temp_rs232_rcv_char); reg.dx.signed := module_number; bios_interrupt(ms_temp_rs232_int,reg); character := reg.ax.byte[low]; end {temp_rs232_rcv_char}; procedure temp_rs232_get_status(var port_status: word; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_temp_rs232_get_status); reg.dx.signed := module_number; bios_interrupt(ms_temp_rs232_int,reg); port_status := reg.ax.word; end {temp_rs232_get_status}; {--------------------------------------------------------------------} {--------------------------------------------------------------------} {---------------------------------------------} {procedures for Mindset unique io entry points} {---------------------------------------------} procedure set_display_device(tv_monitor: byte); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_display_device); reg.ax.byte[low] := chr(tv_monitor); {0=tv, 1=monitor} bios_interrupt(ms_io_int,reg); end {set_display_device}; {--------------------------------------------------------------------} procedure set_ext_sync(mode: byte); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_ext_sync); reg.ax.byte[low] := chr(mode); bios_interrupt(ms_io_int,reg); end {set_ext_sync}; {--------------------------------------------------------------  ------} procedure set_display_int(scan_line: integer; diagnostic_mark: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_display_int); reg.ax.byte[low] := chr(scan_line); reg.bx.byte[low] := chr(diagnostic_mark); bios_interrupt(ms_io_int,reg); end {set_display_int}; {--------------------------------------------------------------------} procedure joystick_io(var a_switch: byte; var b_switch: byte; var a_x: integer; var a_y: integer; var b_x: integer; var b_y: integer); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_joystick_io); bios_interrupt(ms_io_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; a_switch := dummy.word; dummy.signed := ord(reg.ax.byte[high]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; b_switch := dummy.word; a_x := reg.bx.signed;  a_y := reg.cx.signed; b_x := reg.dx.signed; b_y := reg.si.signed; end {joystick_io}; {--------------------------------------------------------------------} procedure rs232_write_char(character: char; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_rs232_write_char); reg.ax.byte[low] := character; reg.dx.signed := module_number; bios_interrupt(ms_io_int,reg); end {rs232_write_char}; {--------------------------------------------------------------------} procedure rs232_read_char(var character: char; var comm_status: byte; module_number: integer); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_rs232_read_char); reg.dx.signed := module_number; bios_interrupt(ms_io_int,reg); dummy.signed := ord(reg.ax.byte[high]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed;  comm_status := dummy.word; character := reg.ax.byte[low]; end {rs232_read_char}; {--------------------------------------------------------------------} procedure rs232_write_string(string_offset: word; string_segment: word; character_count: integer; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_rs232_write_string); reg.bx.word := string_offset;  reg.cx.signed := character_count; reg.dx.signed := module_number; reg.es.word := string_segment; bios_interrupt(ms_io_int,reg); end {rs232_write_string}; {--------------------------------------------------------------------} procedure rs232_get_buffer_status(var buffer_status: byte; var avail_words_input: integer; var avail_words_output: integer; module_number: integer);  var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_rs232_get_buffer_status); reg.dx.signed := module_number; bios_interrupt(ms_io_int,reg); dummy.signed := ord(reg.ax.byte[high]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; buffer_status := dummy.word; avail_words_input := reg.bx.signed; avail_words_output := reg.cx.signed; end {rs232_get_buffer_status}; {--------------------------------------------------------------------} procedure rs232_set_input_buffer(buffer_offset: word; buffer_segment: word; size_in_words: integer; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_rs232_set_input_buffer); reg.bx.word := buffer_offset; reg.cx.signed := size_in_words; reg.dx.signed := module_number; reg.es.word := buffer_segment; bios_interrupt(ms_io_int,reg); end {rs232_set_input_buffer}; {--------------------------------------------------------------------} procedure rs232_set_output_buffer(buffer_offset: word; buffer_segment: word; size_in_words: integer; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_rs232_set_output_buffer); reg.bx.word := buffer_offset; reg.cx.signed := size_in_wor  ds; reg.dx.signed := module_number; reg.es.word := buffer_segment; bios_interrupt(ms_io_int,reg); end {rs232_set_output_buffer}; {--------------------------------------------------------------------} procedure rs232_set_comm_controls(rts_dtr: byte; tx_rs_interrupts: byte; module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_rs232_set_comm_controls); reg.ax.byte[low] := chr(rts_dtr); reg.bx.byte[low] := chr(tx_rs_interrupts); reg.dx.signed := module_number; bios_interrupt(ms_io_int,reg); end {rs232_set_comm_controls}; {--------------------------------------------------------------------} procedure rs232_get_comm_controls(var rts_dtr: byte; var tx_rs_interrupts: byte; module_number: integer); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_rs232_get_comm_controls); reg.dx.signed := module_number; bios_interrupt(ms_io_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; rts_dtr := dummy.word; dummy.signed := ord(reg.bx.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; tx_rs_interrupts := dummy.word; end {rs232_get_comm_controls}; {--------------------------------------------------------------------} procedure rs232_get_modem_status(var modem_status: byte; module_number: integer); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_rs232_get_modem_status); reg.dx.signed := module_number; bios_interrupt(ms_io_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; modem_status := dummy.word; end {rs232_get_modem_status}; {--------------------------------------------------------------------} {--------------------------------------------------------------------} {------------------------------------------------} {procedures for Mindset unique video entry points} {------------------------------------------------} procedure set_screen_mode(mode: byte); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_screen_mode); reg.ax.byte[low] := chr(mode); bios_interrupt(mindset_video_int,reg); end {set_screen_mode}; {--------------------------------------------------------------------} procedure get_screen_mode(var mode: byte; var flags: word; var bits_per_pixel: integer); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_get_screen_mode); bios_interrupt(mindset_video_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; mode := dummy.word; flags := reg.bx.word; bits_per_pixel := reg.cx.signed; end {get_screen_mode}; {--------------------------------------------------------------------} {--------------------------------------------------------------------} procedure set_transfer_mode(mode: byte; logical: byte); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_transfer_mode); reg.bx.byte[high] := chr(mode); reg.bx.byte[low] := chr(logical); bios_interrupt(mindset_video_int,reg); end {set_transfer_mode}; {--------------------------------------------------------------------} procedure get_transfer_mode(var mode: byte; var logical: byte); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_get_transfer_mode); bios_interrupt(mindset_video_int,reg); dummy.signed := ord(reg.bx.byte[high]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; mode := dummy.word; dummy.signed := ord(reg.bx.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; logical := dummy.word; end {get_transfer_mode}; {--------------------------------------------------------------------} procedure set_dest_buffer(buffer_offset_addr: word; buffer_segment_addr: word; width: integer; lines: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_dest_buffer); reg.bx.word := buffer_offset_addr; reg.es.word := buffer_segment_addr; reg.cx.signed := width; reg.dx.signed := lines; b  ios_interrupt(mindset_video_int,reg); end {set_transfer_mode}; {--------------------------------------------------------------------} procedure get_dest_buffer(var buffer_offset_addr: word; var buffer_segment_addr: word; var width: integer; var lines: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_dest_buffer); bios_interrupt(mindset_video_int,reg); buffer_offset_addr := reg.bx.word; buffer_segment_addr := reg.es.word; width := reg.cx.signed; lines := reg.dx.signed; end {get_transfer_mode}; {--------------------------------------------------------------------} procedure set_write_mask(mask: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_write_mask); reg.bx.word := mask; bios_interrupt(mindset_video_int,reg); end {set_write_mask}; {--------------------------------------------------------------------} procedure get_write_mask(var mask: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_write_mask); bios_interrupt(mindset_video_int,reg); mask := reg.bx.word; end {get_write_mask}; {--------------------------------------------------------------------} procedure blt_copy(blt_id: byte; n_blts: integer; modes: integer; xorg: integer; yorg: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_blt_copy); reg.ax.byte[low] := chr(blt_id); reg.cx.signed := n_blts; reg.dx.signed := modes; reg.si.signed := xorg; reg.di.signed := yorg; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_copy}; {--------------------------------------------------------------------} procedure blt_copy_word(blt_id: byte; n_blts: integer; xorg: integer; yorg: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_blt_copy_word); reg.ax.byte[low] := chr(blt_id); reg.cx.signed := n_blts; reg.si.signed := xorg; reg.di.signed := yorg; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_copy_word}; {--------------------------------------------------------------------} procedure set_palette(border_index: byte; offset: integer; nwords: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_palette); reg.ax.byte[low] := chr(border_index); reg.cx.signed := nwords; reg.dx.signed := offset; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {set_palette}; {--------------------------------------------------------------------} procedure get_palette(var border_index: byte; offset: integer;  nwords: integer; data_offset: word; data_segment: word); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_get_palette); reg.cx.signed := nwords; reg.dx.signed := offset; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; border_index := dummy.word; end {get_palette}; {--------------------------------------------------------------------} procedure blt_polypoint(blt_id: byte; n_points: integer; color_index: byte; xorg: integer; yorg: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_blt_polypoint); reg.ax.byte[low] := chr(blt_id); reg.cx.signed := n_points; reg.dx.byte[high] := chr(color_index); reg.si.signed := xorg; reg.di.signed := yorg;  reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_polypoint}; {--------------------------------------------------------------------} procedure blt_polyline(blt_id: byte; n_points: integer; color_index: byte; mode: polyline_mode; xorg: integer; yorg: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(  ms_blt_polyline); reg.ax.byte[low] := chr(blt_id); reg.cx.signed := n_points; reg.dx.byte[high] := chr(color_index); if (mode = chained) then reg.dx.byte[low] := chr(0) else reg.dx.byte[low] := chr(1); reg.si.signed := xorg; reg.di.signed := yorg; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_polyline}; {--------------------------------------------------------------------} procedure blt_polygon(blt_id: byte; n_points: integer; even_color_index: byte; odd_color_index: byte; xorg: integer; yorg: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_blt_polygon); reg.ax.byte[low] := chr(blt_id); reg.cx.signed := n_points; reg.dx.byte[high] := chr(even_color_index); reg.dx.byte[low] := chr(odd_color_index); reg.si.signed := xorg; reg.di.signed := yorg; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_polygon}; {--------------------------------------------------------------------} procedure blt_ellipses(blt_id: byte; interior: interior_style; n_points: integer; even_color_index: byte; odd_color_index: byte; xorg: integer; yorg: integer; data_offset: word; data_segment: word); var  reg: reg_block; begin if (interior = filled) then reg.ax.byte[high] := chr(ms_blt_ellipses_filled) else reg.ax.byte[high] := chr(ms_blt_ellipses_arcs); reg.ax.byte[low] := chr(blt_id); reg.cx.signed := n_points; reg.dx.byte[high] := chr(even_color_index); reg.dx.byte[low] := chr(odd_color_index); reg.si.signed := xorg; reg.di.signed := yorg; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_ellipses}; {--------------------------------------------------------------------} procedure set_clip_rectangle(xleft: integer; xright: integer; ytop: integer; ybottom: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_clip_rectangle); reg.si.signed := xleft; reg.di.signed := xright; reg.cx.signed := ytop; reg.dx.signed := ybottom; bios_interrupt(mindset_video_int,reg); end {set_clip_rectangle}; {--------------------------------------------------------------------} procedure get_clip_rectangle(var xleft: integer; var xright: integer; var ytop: integer; var ybottom: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_clip_rectangle); bios_interrupt(mindset_video_int,reg); xleft := reg.si.signed; xright := reg.di.signed; ytop := reg.cx.signed; ybottom := reg.dx.signed; end {get_clip_rectangle}; {--------------------------------------------------------------------} procedure set_collision_pattern(polarity: collision_polarity; pattern: byte; mask: byte); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_collision_pattern); if (polarity = collide_on) then reg.ax.byte[low] := chr(0) else reg.ax.byte[low] := chr(1); reg.bx.byte[high] := chr(mask); reg.bx.byte[low] := chr(pattern); bios_interrupt(mindset_video_int,reg); end {set_collision_pattern}; {--------------------------------------------------------------------} procedure get_collision_pattern(var polarity: collision_polarity; var pattern: byte; var mask: byte); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_get_collision_pattern); bios_interrupt(mindset_video_int,reg); if (reg.ax.byte[low] = chr(0)) then polarity := collide_on else polarity := collide_on_all_except; dummy.signed := ord(reg.bx.byte[high]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; mask := dummy.word; dummy.signed := ord(reg.bx.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; pattern := dummy.word; end {get_collision_pattern}; {--------------------------------------------------------------------} procedure set_collclip_detect(mode: byte; address_offset: word; address_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_collclip_detect);    reg.ax.byte[low] := chr(mode); reg.bx.word := address_offset; reg.es.word := address_segment; bios_interrupt(mindset_video_int,reg); end {set_collclip_detect}; {--------------------------------------------------------------------} procedure get_collclip_detect(var mode: byte; var address_offset: word; var address_segment: word); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_get_collclip_detect); bios_interrupt(mindset_video_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; mode := dummy.word; address_offset := reg.bx.word; address_segment := reg.es.word; end {get_collclip_detect}; {--------------------------------------------------------------------} procedure set_display_int_addr(address_offset: word; address_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_display_int_addr); reg.bx.word := address_offset; reg.es.word := address_segment; bios_interrupt(mindset_video_int,reg); end {set_display_int_addr}; {--------------------------------------------------------------------} procedure get_display_int_addr(var address_offset: word; var address_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_display_int_addr); bios_interrupt(mindset_video_int,reg); address_offset := reg.bx.word; address_segment := reg.es.word; end {get_display_int_addr}; {--------------------------------------------------------------------} procedure get_buffer_info(var fb1_segment_addr: word; var fb2_segment_addr: word; var fb_byte_size: integer; var char_80_segment_addr: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_buffer_info); bios_interrupt(mindset_video_int,reg); fb1_segment_addr := reg.bx.word; fb2_segment_addr := reg.dx.word; fb_byte_size := reg.cx.signed; char_80_segment_addr := reg.si.word; end {get_buffer_info}; {--------------------------------------------------------------------} procedure switch_active_buffer; var reg: reg_block; begin reg.ax.byte[high] := chr(ms_switch_active_buffer); bios_interrupt(mindset_video_int,reg); end {switch_active_buffer}; {--------------------------------------------------------------------} procedure blt_wait(var blt_id: byte; var collisions: word;  var clips: word); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_blt_wait); bios_interrupt(mindset_video_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; blt_id := dummy.word; collisions := reg.bx.word; clips := reg.cx.word; end {blt_wait}; {--------------------------------------------------------------------} procedure save_blter(mode: byte; data_offset: word; data_segment: word; var data_size: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_save_blter); reg.ax.byte[low] := chr(mode); reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); reg.ax.signed := data_size; end {save_blter}; {--------------------------------------------------------------------} procedure restore_blter(data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_restore_blter); reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {restore_blter}; {--------------------------------------------------------------------} procedure fill_dest_buffer(fill_data: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_fill_dest_buffer); reg.bx.signed := fill_data; bios_interrupt(mindset_video_int,reg); end {fill_dest_buffer}; {--------------------------------------------------------------------} procedure set_font_pointer(address_offset: word; address_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_font_pointer); reg.bx.word := address_offset; reg.es.word := address_segment; bios_interrupt(mindset_video_int,reg); end {set_font_pointer}; {--------------------------------------------------------------------} procedure get_font_pointer(var address_of  fset: word; var address_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_font_pointer); bios_interrupt(mindset_video_int,reg); address_offset := reg.bx.word; address_segment := reg.es.word; end {get_font_pointer}; {--------------------------------------------------------------------} procedure blt_string(blt_id: byte; n_strings: byte; n_ignore: byte; direction: byte; mask: byte; xorg: integer;  yorg: integer; data_offset: word; data_segment: word); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_blt_string); reg.ax.byte[low] := chr(blt_id); reg.cx.byte[high] := chr(n_strings); reg.cx.byte[low] := chr(n_ignore); reg.dx.byte[high] := chr(direction); reg.dx.byte[low] := chr(mask); reg.si.signed := xorg; reg.di.signed := yorg; reg.bx.word := data_offset; reg.es.word := data_segment; bios_interrupt(mindset_video_int,reg); end {blt_string}; {--------------------------------------------------------------------} procedure set_link_mode(mode: byte); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_set_param_block_mode); reg.ax.byte[low] := chr(mode); bios_interrupt(mindset_video_int,reg); end {set_link_mode}; {--------------------------------------------------------------------} procedure get_link_mode(var mode: byte); var reg: reg_block; dummy: reg_typ; begin reg.ax.byte[high] := chr(ms_get_param_block_mode); bios_interrupt(mindset_video_int,reg); dummy.signed := ord(reg.ax.byte[low]); if dummy.signed < 0 then dummy.signed := 256 + dummy.signed; mode := dummy.word; end {get_link_mode}; {--------------------------------------------------------------------} procedure get_gcp_status(var gcp_idle: integer; var system_fly: integer; var collision_detected: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_blter_status); bios_interrupt(mindset_video_int,reg); gcp_idle := reg.bx.signed AND 16#0001; system_fly := reg.bx.signed AND 16#0002; collision_detected := reg.bx.signed AND 16#0004; end {get_gcp_status}; {--------------------------------------------------------------------} procedure get_char_bitmap(var normal_font: integer; var extras_font: integer; var segment: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_char_bitmap); bios_interrupt(mindset_video_int,reg); normal_font := reg.si.signed; extras_font := reg.di.signed; segment := reg.es.signed; end {get_char_bitmap}; {--------------------------------------------------------------------} procedure get_gcp_memory(var memory_flag: integer; var first_segment: integer; var last_segment: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ms_get_gcp_memory); bios_interrupt(mindset_video_int,reg); memory_flag := reg.ax.signed AND 16#0001; first_segment := reg.si.signed; last_segment := reg.di.signed; end {get_gcp_memory}; {--------------------------------------------------------------------} end {module bios_calls}. BIOS0 CST !K4"COPYRT PAS F!T'COPYRT ASM b!VBIOS CST cX"IOS BAK Wc|9BIOS PAS fmfBIOS EXT ma9IOS LST m{ ********************************************************* * Copyright 1983 Mindset Corp. This program * * is an unpublished work of authorship protected * * by the copyright laws of the United States. * * This program is also the confidential, * * proprietary information of Mindset Corp. and * * is not to be copied, used or altered in any * * way without the express permission of Mindset * * Corp. * ********************************************************* ********************************************************* * This program is designated a Mindset Utility as * * defined in the Mindset Corp. Development Software * * License Agreement. * ****************************  ***************************** } {External declarations for bios calls} {------------------} {Utility procedures} {------------------} procedure get_word_addr(vars variable: word; var address_offset: word; var address_segment: word); extern; procedure get_integer_addr(vars variable: integer; var address_offset: word; var address_segment: word); extern; procedure get_char_addr(vars variable: char; var address_offset: word; var address_segment: word); extern; procedure get_external_procedure_addr(procedure proc; var address_offset: word; var address_segment: word); extern; {------------------------------------------------} {procedures for IBM compatible video entry points} {------------------------------------------------} procedure set_ibm_mode(mode: byte); extern; procedure set_cursor_position(page: byte; row: byte; column: byte); extern; procedure read_cursor_position(page: byte; var row: byte; var column: byte; var cursor_start: byte; var cursor_end: byte); extern; procedure write_dot(row: integer; column: integer; color: byte); extern; procedure read_dot(row: integer; column: integer; var color: byte); extern; procedure write_teletype(page: byte; character: char; color: byte); extern; procedure write_char_only(page: byte; character: char;  count: integer; color: byte); extern; {---------------------------------------------------} {procedures for IBM compatible keyboard entry points} {---------------------------------------------------} procedure get_kb_char(var character: char; var scan_code: byte); extern; procedure test_kb_buffer(var character_present: boolean; var character: char;  var scan_code: byte); extern; procedure get_kb_shift_status(var kb_flag: byte); extern; {----------------------------------------} {procedures for temporary rs232 interface} {----------------------------------------} procedure temp_rs232_init(params: byte; module_number: integer); extern; procedure temp_rs232_send_char(character: char; module_number: integer); extern; procedure temp_rs232_rcv_char(var character: char; module_number: integer); extern; procedure temp_rs232_get_status(var port_status: word; module_number: integer); extern; {---------------------------------------------} {procedures for IBM compatible rs232 interface} {---------------------------------------------} procedure rs232_init(params: byte; module_number: integer); extern;  procedure rs232_send_char(character: char; module_number: integer); extern; procedure rs232_rcv_char(var character: char; module_number: integer); extern; procedure rs232_get_status(var port_status: word; module_number: integer); extern; {---------------------------------------------} {procedures for Mindset unique io entry points} {---------------------------------------------} procedure set_display_device(tv_monitor: byte); extern; procedure set_ext_sync(mode: byte); extern; procedure set_display_int(scan_line: integer; diagnostic_mark: integer); extern; procedure joystick_io(var a_switch: byte; var b_switch: byte; var a_x: integer; var a_y: integer; var b_x: integer; var b_y: integer); extern; procedur  e rs232_write_char(character: char; module_number: integer); extern; procedure rs232_read_char(var character: char; var comm_status: byte; module_number: integer); extern; procedure rs232_write_string(string_offset: word; string_segment: word; character_count: integer; module_number: integer); extern; procedure rs232_get_buffer_status(var buffer_status: byte; var avail_words_input: integer; var avail_words_output: integer; module_number: integer); extern; procedure rs232_set_input_buffer(buffer_offset: word; buffer_segment: word; size_in_words: integer; module_number: integer); extern; procedure rs232_set_output_buffer(buffer_offset: word; buffer_segment: word; size_in_words: integer; module_number: integer); extern; procedure rs232_set_comm_controls(rts_dtr: byte; tx_rs_interrupts: byte; module_number: integer); extern; procedure rs232_get_comm_controls(var rts_dtr: byte; var tx_rs_interrupts: byte; module_number: integer); extern; procedure rs232_get_modem_status(var modem_status: byte; module_number: integer); extern; {------------------------------------------------} {procedures for Mindset unique video entry points} {------------------------------------------------} procedure set_screen_mode(mode: byte); extern; procedure get_screen_mode(var mode: byte; var flags: word; var bits_per_pixel: integer); extern; procedure set_transfer_mode(mode: byte; logical: byte); extern; procedure get_transfer_mode(var mode: byte; var logical: byte); extern; procedure set_dest_buffer(buffer_offset_addr: word; buffer_segment_addr: word;  width: integer; lines: integer); extern; procedure get_dest_buffer(var buffer_offset_addr: word; var buffer_segment_addr: word; var width: integer; var lines: integer); extern; procedure set_write_mask(mask: word); extern; procedure get_write_mask(var mask: word); extern; procedure blt_copy(blt_id: byte; n_blts: integer; modes: integer; xorg: integer; yorg: integer; data_offset: word; data_segment: word); extern; procedure blt_copy_word(blt_id: byte; n_blts: integer; xorg: integer; yorg: integer; data_offset: word; data_segment: word); extern;  procedure set_palette(border_index: byte; offset: integer; nwords: integer; data_offset: word; data_segment: word); extern; procedure get_palette(var border_index: byte; offset: integer; nwords: integer; data_offset: word; data_segment: word); extern; procedure blt_polypoint(blt_id: byte; n_points: integer; color_index: byte; xorg: integer; yorg: integer; data_offset: word; data_segment: word); extern; procedure blt_polyline(blt_id: byte; n_points: integer; color_index: byte; mode: polyline_mode;    xorg: integer; yorg: integer; data_offset: word; data_segment: word); extern; procedure blt_polygon(blt_id: byte; n_points: integer; even_color_index: byte; odd_color_index: byte; xorg: integer; yorg: integer; data_offset: word;  data_segment: word); extern; procedure blt_ellipses(blt_id: byte; interior: interior_style; n_points: integer; even_color_index: byte; odd_color_index: byte; xorg: integer; yorg: integer; data_offset: word; data_segment: word); extern; procedure set_clip_rectangle(xleft: integer; xright: integer; ytop: integer; ybottom: integer); extern; procedure get_clip_rectangle(var xleft: integer; var xright: integer; var ytop: integer; var ybottom: integer); extern; procedure set_collision_pattern(polarity: collision_polarity;  pattern: byte; mask: byte); extern; procedure get_collision_pattern(var polarity: collision_polarity; var pattern: byte; var mask: byte); extern; procedure set_collclip_detect(mode: byte; address_offset: word; address_segment: word); extern; procedure get_collclip_detect(var mode: byte;  var address_offset: word; var address_segment: word); extern; procedure set_display_int_addr(address_offset: word; address_segment: word); extern; procedure get_display_int_addr(var address_offset: word; var address_segment: word); extern; procedure get_buffer_info(var fb1_segment_addr: word; var fb2_segment_addr: word;  var fb_byte_size: integer; var char_80_segment_addr: integer); extern; procedure switch_active_buffer; extern; procedure blt_wait(var blt_id: byte; var collisions: word; var clips: word); extern; procedure save_blter(mode: byte; data_offset: word; data_segment: word; var data_size: integer); extern;  procedure restore_blter(data_offset: word; data_segment: word); extern; procedure fill_dest_buffer(fill_data: integer); extern; procedure set_font_pointer(address_offset: word; address_segment: word); extern; procedure get_font_pointer(var address_offset: word; var address_segment: word); extern; procedure blt_string(blt_id: byte; n_strings: byte;  n_ignore: byte; direction: byte; mask: byte; xorg: integer; yorg: integer; data_offset: word; data_segment: word); extern; procedure set_link_mode(mode: byte); extern; procedure get_link_mode(var mode: byte); extern; procedure get_gcp_status(var gcp_idle: integer; var system_fly: integer; var collision_detected: integer); extern; procedure get_char_bitmap(var normal_font: integer; var extras_font: integer; var segment: integer); extern; procedure get_gcp_memory(var memory_flag: integer; var first_segment: integer; var last_segment: integer); extern; {end of bios external declarations} IOS BAK Wc|9BIOS PAS fmfBIOS EXT ma9IOS LST m   { ********************************************************* * Copyright 1983 Mindset Corp. This program * * is an unpublished work of authorship protected * * by the copyright laws of the United States. * * This program is also the confidential, * * proprietary information of Mindset Corp. and * * is not to be copied, used or altered in any * * way without the express permission of Mindset * * Corp. * ********************************************************* ********************************************************* * This program is designated a Mindset Utility as * * defined in the Mindset Corp. Development Software * * License Agreement. * ********************************************************* } {---Type declarations for bios calls---} pinteger = word; byte_position = (low,high); two_chars = packed array [byte_position] of char; polyline_mode = (chained, paired); interior_style = (hollow, filled); collision_polarity = (collide_on, collide_on_all_except); reg_typ = packed record case integer of 0: (signed: integer); 1: (word: pinteger); 2: (byte: two_chars); end; reg_block = packed record ax,bx,cx,dx,si,di,es,flags: reg_typ; end; {end of bios type definitions} @e gikmoq s@u`wy{ @ ` O o O ` #A%a')+-/1! BIOS_CALLSo MS PASCAL PASCAL:QHIMEMCOMMONCOMMQQCONSTCOMADSDATASTACKMEMORYHEAPCODE BIOS_CALLSDGROUP#@ UD  T H H H X H  6{GET_GCP_MEMORYVGET_CHAR_BITMAPGET_GCP_STATUS GET_LINK_MODE SET_LINK_MODE BLT_STRING+GET_FONT_POINTERSET_FONT_POINTERFILL_DEST_BUFFER RESTORE_BLTER SAVE_BLTERHBLT_WAIT SWITCH_ACTIVE_BUFFER GET_BUFFER_INFO GET_DISPLAY_INT_ADDRs SET_DISPLAY_INT_ADDRH GET_COLLCLIP_DETECT SET_COLLCLIP_DETECT GET_COLLISION_PATTERNd SET_COLLISION_PATTERN) GET_CLIP_RECTANGLE SET_CLIP_RECTANGLE BLT_ELLIPSESX BLT_POLYGON BLT_POLYLINE BLT_POLYPOINTg GET_PALETTE SET_PALETTE BLT_COPY_WORD BLT_COPYL GET_WRITE_MASK% SET_WRITE_MASK GET_DEST_BUFFERSET_DEST_BUFFERGET_TRANSFER_MODE5SET_TRANSFER_MODE GET_SCREEN_MODESET_SCREEN_MODERS232_GET_MODEM_STATUS[RS232_GET_COMM_CONTROLSRS232_SET_COMM_CONTROLSRS232_SET_OUTPUT_BUFFERRS232_SET_INPUT_BUFFERaRS232_GET_BUFFER_STATUSRS232_WRITE_STRINGRS232_READ_CHARRS232_WRITE_CHARg JOYSTICK_IOSET_DISPLAY_INT SET_EXT_SYNCSET_DISPLAY_DEVICE}qTEMP_RS232_GET_STATUSPTEMP_RS232_RCV_CHAR#TEMP_RS232_SEND_CHARTEMP_RS232_INITGET_KB_SHIFT_STATUSTEST_KB_BUFFER3 GET_KB_CHARRS232_GET_STATUSRS232_RCV_CHARRS232_SEND_CHARl RS232_INIT9WRITE_CHAR_ONLYWRITE_TELETYPEREAD_DOT WRITE_DOTZREAD_CURSOR_POSITIONSET_CURSOR_POSITION SET_IBM_MODEs GET_CHAR_ADDRMGET_INTEGER_ADDR' BIOS_CALLS GET_WORD_ADDRBIOS_INTERRUPT DBWBIOS.PAS  G*U^ ^FFvFv]z GET_WORD_ADDR&`|*'U^ ^FFvFv]zGET_INTEGER_ADDR'&`|*MU^ ^FFvFv]gz GET_CHAR_ADDRM&`|)sUFFFPFP]lV!z SET_IBM_MODEs%`|  5UFF FFFFFPFP]'VzSET_CURSOR_POSITION1`-|UFFFPFPF2F~}FFv F2F~}FFv F2F~}FFvF2F~}FFv] <V!z READ_CURSOR_POSITION`j|5ZUF FFF FFFPFP],'Vz WRITE_DOTZ1`|<UF F FFFPFPF2F~}Fh!V89:;!D.E7F?GGPTQ]ReSm_z`~abmnopqr &19ALTaekqwFv]zREAD_DOTF`|5UFFFF FFFPFP]'VzWRITE_TELETYPE1`|;UF F FF FFFFFPFP]-VzWRITE_CHAR_ONLY7`|79UFF2FFFFFPFP]^)Vz RS232_INIT93`|/lUFFFFFPFP]Ɯ!VzRS232_SEND_CHARl+` |1UFFFPFPFv]ٜV!zRS232_RCV_CHAR-`4|1UFFFPFPFv]V!zRS232_GET_STATUS-`H|FUFPFPFvF2F~}FFv]V'z GET_KB_CHARB`|C3UFPFPF%@tv )v FvF2FZV'  %3@DLRXfsw} )*+ ,-.%/-;:<>=L>TA\BbCj4r~}FFv]zTEST_KB_BUFFER3X`*|>UFPFPF2F~}FFv]V'zGET_KB_SHIFT_STATUS:`?|7UFF2FFFFFPFP])VzTEMP_RS232_INIT3`|/UFFFFFPFP]`!Vz TEMP_RS232_SEND_CHAR+`|1#UFFFPFPFv]rV!zTEMP_RS232_RCV_CHAR#-`|1PUFFFPFPFv]CV!z!TEMP_RS232_GET_STATUSP-`|)}UFFFPFP]~V!zSET_DISPLAY_DEVICE}%`|)UFFFPFP]UV!z SET_EXT_SYNC%`^|/UFFFFFPFP]!VzSET_DISPLAY_INT+`Z|@UFPFPF2F~}FFvF2FUV'DrE}FGQRSTUVhijklmvwx yz*.4BJW[aow &=.~}FFvFv Fv FvFv] Wz JOYSTICK_IOu`1|/gUF(FFFFPFP]ǜ!VzRS232_WRITE_CHARg+`|LUF)FFPFPF2F~}FFvFv ]V!zRS232_READ_CHARH`|;UF*F FFFFFF FPFP]-VzRS232_WRITE_STRING7`|TUF+FFPFPF2F~}FFv Fv Fv]V!z#RS232_GET_BUFFER_STATUSP`|;aUF,F FFFFFF FPFP]o-Vz"RS232_SET_INPUT_BUFFERa7`|;UF-F FFFFFF FPFP]7-Vz#RS232_SET_OUTPUT_BUFFER7`&| U6.9AIQYanrx~ +,-".0/80C1K2S3[AhBlCrDxE~FGUVWXYZ[ޠ.F.F FFFFFPFP] Vz#RS232_SET_COMM_CONTROLS1`|_UF/FFPFPF2F~}FFv F2F~}FFv]fV!z#RS232_GET_COMM_CONTROLS[`|D[UF0FFPFPF2F~}FFv]:V!z"RS232_GET_MODEM_STATUS[@`|)UFFFPFP]^V!zSET_SCREEN_MODE%`|NUFPFPF2F~}FFv FvFv]ߜV'zGET_SCREEN_MODEJ`g|/ UFFFFFPFP]H!VzSET_TRANSFER_MODE +`|Y5UFPFPF2F~}FFvF2F~}FFv]V'zGET_TRANSFER_MODE5U`=|  UFthijklm{| }~'2:BMUbflz!/<@NVaiq|=0F FF FFFFFPFP]"VzSET_DEST_BUFFER7`|CUFPFPFv Fv FvFv]/V'zGET_DEST_BUFFER?`k|) UFFFPFP]V!zSET_WRITE_MASK %`n|+% UFPFPFv]V'zGET_WRITE_MASK% '`S|ML UFFFFFFFF FF FFFFFPFP]?VzBLT_COPYL I`|G UF FFFFF FF FFFFFPFP] 9Vz BLT_COPY_WORD C`|A UF FFF FF FFFFFPFP] q3V z SET_PALETTE =`| UF F F:     , 0 > !F 1S 2W 3] 4c 5i 6o 7u 8{ 9 : I J K L M N O P Q _ ` a b c d e f t u ^E& F FFFFFPFPF2F~}FFv] V z GET_PALETTE R`D|Mg UF FFFFFFF FF FFFFFPFP]{?Vz BLT_POLYPOINTg I`6|] UF FFFFFF~uFFF FF FFFFFPFP]OVz BLT_POLYLINE Y`A|S  UFFFFFFFFFF FF FFFFFPFP]EVz BLT_POLYGON O`7|9X U~uFFFFFFFFFFF Fv& w, x2 y8 zF {N |Y }a n r x ~                        & , 2 8 > D R _ e k o u {   * F FFFFFPFP]RV z BLT_ELLIPSESX [`|; UFF FF FFFFFPFP]+-VzSET_CLIP_RECTANGLE 7`|C UFPFPFv Fv FvFv]V'zGET_CLIP_RECTANGLE ?`f|?) UF~ uFFFFFFPFP]1V z!SET_COLLISION_PATTERN) ;` |md UFPFP~uv v F2F~}FFvF2F~}FFv]V'z!GET_COLLISION_PATTERNd i`|5 UFF FFFFFPFP]'VzSET_COLLCLIP_DETECT 1`4|8 UFPFPF2F~}FFv V'                  # 0 4 !: #@ $D %J &P '^ 3k 4o 5} 6 8 9 : ; < = > ? K L M N O P \ ] ^ _ `* \2 FvFv]zGET_COLLCLIP_DETECT J`|/H UFFFFFPFP]!Vz SET_DISPLAY_INT_ADDRH +`L|3s UFPFPFvFv]?V'z GET_DISPLAY_INT_ADDRs /`)|C UFPFPFv Fv FvFv]DV'zGET_BUFFER_INFO ?`|! UFPFP]˟V'z SWITCH_ACTIVE_BUFFER `|N UFPFPF2F~}FFv FvFv]V'zBLT_WAIT J`>|=HUFF FF FFFPFPvF]ٜ'Vz SAVE_BLTERH9`o|/UFFFFFPFP]!Vz RESTORE_BLTER+`I|)UFFFPFP]%V!zFILL_DEST_BUFFER%`K|UFFFFFĔa2 b: cB nO oS pY q_ rm |z }~ ~              *2:BOSY_es{PFP] V2zSET_FONT_POINTER+`|3UF PFPFvFv]V'zGET_FONT_POINTER/`|Y+UF!FFFFFFFFFFF FF FFFFFPFP];KVz BLT_STRING+U`^|)UF"FFPFP]OV!z SET_LINK_MODE%`N|>UF#PFPF2F~}FFv]V'z GET_LINK_MODE:` |DUF$PFPF%v F%vF%v]V'zGET_GCP_STATUS@`s|;UF%PFPFv Fv  Fv]V'zGET_CHAR_BITMAP7`|>VUF&PFPF%v FvFv]V'zGET_GCP_MEMORYV:` |U]z BIOS_CALLS `_|%26<BHNTZ`flz%&'(345678DEFGHIU&V*W8X@YHZPf]gahoizjkEt#A%a')+-/1!H P2 T'COPYRT ASM b!VBIOS CST cX"IOS BAK Wc|9BIOS PAS fmfBIOS EXT ma9IOS LST mASM86_BIOS_PASCAL_INTERFACEj ASM86_CODECODEfhM-COLL_CLIP_INT_HANDLERDISPLAY_INT_HANDLER UF .^ ~E ]MUu} W~E EE ]MUu]UVv ^D^^].ːPSQRVWU.]_^ZY[XPSQRVWU.]_^ZY[X' &fjxj{&ĕj̘&HBIOS_INTERRUPTCOLL_CLIP_INT_ENTRY͐DISPLAY_INT_ENTRYl"GET_EXTERNAL_PROCEDURE_ADDRHƐSAVE_DS_REGISTERcta9IOS LST mTITLE (ASM86 ROUTINES TO INTERFACE BIOS TO MS-DOS PASCAL) ; ********************************************************* ; * Copyright 1983 Mindset Corp. This program * ; * is an unpublished work of authorship protected * ; * by the copyright laws of the United States. * ; * This program is also the confidential, * ; * proprietary information of Mindset Corp. and * ; * is not to be copied, used or altered in any * ; * way without the express permission of Mindset * ; * Corp. * ; ********************************************************* ; ********************************************************* ; * This program is designated a Mindset Utility as * ; * defined in the Mindset Corp. Development Software * ; * License Agreement.  * ; ********************************************************* NAME ASM86_BIOS_PASCAL_INTERFACE PUBLIC BIOS_INTERRUPT PUBLIC GET_EXTERNAL_PROCEDURE_ADDR PUBLIC SAVE_DS_REGISTER PUBLIC DISPLAY_INT_ENTRY PUBLIC COLL_CLIP_INT_ENTRY ;THESE EXTERNALS MUST BE DECLARED OUTSIDE OF A SEGMENT BLOCK EXTRN DISPLAY_INT_HANDLER:FAR EXTRN COLL_CLIP_INT_HANDLER:FAR ASSUME CS:ASM86_CODE ASM86_CODE SEGMENT PUBLIC 'CODE' BIOS_INTERRUPT PROC FAR ;-------------------- BIOS_INTERRUPT    ------------------------------------------ ; ; BIOS_INTERRUPT IS AN ASM86 ROUTINE WHICH MAY BE CALLED FROM PASCAL ; USING THE FOLLOWING DECLARATION: ; ; PROCEDURE BIOS_INTERRUPT (INT_VECTOR: INTEGER; ; VAR REGISTERS: REG_BLOCK); ; ; WHERE REG_BLOCK DEFINES A BLOCK OF 8 WORDS REPRESENTING ; THE REGISTERS AX, BX, CX, DX, SI, DI, ES, AND FLAGS, ; AND INT_VECTOR IS THE SOFTWARE INTERRUPT NUMBER. ; ; THIS ROUTINE LOADS THE VALUES FOUND IN REG_BLOCK INTO ; THE REAL REGISTERS, EXECUTES THE SOFTWARE INTERRUPT, ; LOADS THE RETURNED VALUES OF THE REAL REGISTERS BACK ; INTO REG_BLOCK AND RETURNS TO THE CALLER. ; ;------------------------------------------------------------------------------ STACK_DEF STRUC ;DEFINES STACK CONFIGURATION OLD_BP DW ? ;SAVE CALLER'S BP REGISTER OLD_DS DW ? ;SAVE CALLER'S DS REGISTER RETURN DD ? ;RETURN ADDRESS REG_BLOCK_OFF DW ? ;ADDRESS OFFSET TO REG_BLOCK REG_BLOCK_SEG DW ? ;ADDRESS SEGMENT FOR REG_BLOCK INT_VECTOR DW ? ;IMMEDIATE DATA CONTAINING INTERRUPT NUMBER STACK_DEF ENDS ;DEFINE POINTERS TO USER'S REG_BLOCK AREA REG_AX EQU WORD PTR DS:[DI+ 0] REG_BX EQU WORD PTR DS:[DI+ 2] REG_CX EQU WORD PTR DS:[DI+ 4] REG_DX EQU WORD PTR DS:[DI+ 6] REG_SI EQU WORD PTR DS:[DI+ 8] REG_DI EQU WORD PTR DS:[DI+10] REG_ES EQU WORD PTR DS:[DI+12] REG_FLAGS EQU WORD PTR DS:[DI+14] ;SAVE CALLER'S REGISTERS PUSH DS PUSH BP MOV BP,SP ;PATCH THE CODE TO GET THE PROPER INTERRUPT NUMBER BELOW MOV AL,BYTE PTR [BP].INT_VECTOR MOV CS:[INTERRUPT_NUMBER],AL ;POINT TO REG_BLOCK MOV DS,[BP].REG_BLOCK_SEG MOV DI,[BP].REG_BLOCK_OFF ;LOAD REG_BLOCK VALUES INTO REGISTERS ; WE WILL NOT LOAD FLAGS FROM THE REGISTER BLOCK MOV ES,REG_ES MOV AX,REG_AX MOV BX,REG_BX MOV CX,REG_CX MOV DX,REG_DX MOV SI,REG_SI MOV DI,REG_DI ;EXECUTE THE APPROPRIATE SOFTWARE INTERRUPT INTERRUPT_NUMBER EQU ($ + 1) ;ADDRESS OF BYTE TO MODIFY INT 0 ;0 MODIFIED BY ABOVE MOV ;PUT RETURN VALUES OF REGISTERS BACK INTO REG_BLOCK LOAD_REG_BLOCK: PUSHF ;SAVE THE FLAGS PUSH DI ;SAVE DI SO WE CAN USE IT AS POINTER MOV DI,[BP].REG_BLOCK_OFF ;USE DI AS POINTER TO REG_BLOCK POP REG_DI ;PUT SAVED (DI) INTO REG_BLOCK POP REG_FLAGS ;PUT SAVED FLAGS INTO REG_BLOCK MOV REG_ES,ES ;NOW MOVE IN THE REST OF THE REGS MOV REG_AX,AX MOV REG_BX,BX MOV REG_CX,CX MOV REG_DX,DX MOV REG_SI,SI EOJ: POP BP POP DS RET 6 ;RETURN AND POP STACK ARGS BIOS_INTERRUPT ENDP PAGE GET_EXTERNAL_PROCEDURE_ADDR PROC FAR ;-------------------- GET_EXTERNAL_PROCEDURE_ADDR -------------------------------------- ; ; GET_EXTERNAL_PROCEDURE_ADDR IS AN ASM86 ROUTINE WHICH MAY BE CALLED ; FROM PASCAL USING THE FOLLOWING DECLARATION: ; ; PROCEDURE GET_EXTERNAL_PROCEDURE_ADDR(PROCEDURE PROC [EXTERNAL]; ; VAR ADDRESS_OFFSET: PINTEGER; ; VAR ADDRESS_SEGMENT: PINTEGER); ; ; GET_EXTERNAL_PROCEDURE_ADDR RETURNS THE POSITIVE INTEGER ; OFFSET/SEGMENT ADDRESS OF THE PROCEDURE. ; ;------------------------------------------------------------------------------ STACK_DEF3 STRUC ;DEFINES STACK CONFIGURATION ;VALID FOR MSDOS PASCAL OLD_BP3 DW ? ;SAVE CALLER'S BP REGISTER RETURN3 DD ? ;RETURN ADDRESS ADDR_SEG_OFF3 DW ? ;OFFSET OF ADDRESS_SEGMENT ADDR_OFF_OFF3 DW ? ;OFFSET OF ADDRESS_OFFSET PROC_FRAME DW ? ;OFFSET OF ADDRESS OF PROC FRAME PROC_ADDR DW ? ;OFFSET OF ADDRESS OF PROCEDURE ADDRESS STACK_DEF3 ENDS ;SAVE CALLER'S REGISTERS PUSH BP MOV BP,SP ;MOVE IN OFFSET ADDRESS PUSH SI  MOV SI,[BP].PROC_ADDR ;SI POINTS TO OFFSET MOV AX,DS:[SI] ;AX CONTAINS OFFSET ITSELF MOV BX,[BP].ADDR_OFF_OFF3 MOV DS:[BX],AX ;MOVE IN SEGMENT ADDRESS MOV AX,DS:[SI+2] ;AX CONTAINS SEGMENT ITSELF MOV BX,[BP].ADDR_SEG_OFF3 MOV DS:[BX],AX POP SI POP BP RET 8 ;RETURN AND POP STACK ARGS GET_EXTERNAL_PROCEDURE_ADDR ENDP PAGE SAVE_DS_REGISTER PROC FAR ;----------------- SAVE_DS_REGISTER ----------------------------------- ; THIS ROUTINE SAVES PASCAL'S DEFAULT DS REGISTER, SO THAT IT CAN BE ; LOADED BY THE INTERRUPT ENTRY ROUTINES BELOW BEFORE CALLING THE ; USER'S PASCAL INTERRUPT HANDLER. ; THIS ROUTINE IS CALLED WITHOUT PARAMETERS FROM PASCAL. ;---------------------------------------------------------------------- MOV CS:SAVE_DS,DS RET EVEN SAVE_DS DW 0 SAVE_DS_REGISTER ENDP PAGE DISPLAY_INT_ENTRY PROC FAR ;--------------- DISPLAY_INT_ENTRY ------------------------------ ; THIS ROUTINE IS TO BE USED AS THE ENTRY PROCEDURE TO BE ; PASSED TO SET_D  ISPLAY_INT_ADDR. ALL IT DOES IS SAVE THE ; REGISTERS, LOAD DS WITH THE VALUE PREVIOUSLY STORED BY ; CALLING SAVE_DS_REGISTER ABOVE, AND CALL THE PASCAL PROCEDURE ; NAMED DISPLAY_INT_HANDLER. ;---------------------------------------------------------------- PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP PUSH DS PUSH ES MOV DS,CS:SAVE_DS CALL DISPLAY_INT_HANDLER POP ES POP DS POP BP POP DI POP SI POP DX POP CX POP BX POP AX RET DISPLAY_INT_ENTRY ENDP PAGE COLL_CLIP_INT_ENTRY PROC FAR ;--------------- COLL_CLIP_INT_ENTRY ------------------------------ ; THIS ROUTINE IS TO BE USED AS THE ENTRY PROCEDURE TO BE ; PASSED TO SET_COLLCLIP_DETECT. ALL IT DOES IS SAVE THE ; REGISTERS, LOAD DS WITH THE VALUE PREVIOUSLY STORED BY ; CALLING SAVE_DS_REGISTER ABOVE, AND CALL THE PASCAL PROCEDURE ; NAMED COLL_CLIP_INT_HANDLER. ;---------------------------------------------------------------- PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP PUSH DS PUSH ES ;THIS CALL IS INCOMPLETE. WE NEED TO PUSH (IN PASCAL ORDER) ;THE PARAMETERS BLT_ID, N, AND CC_FLAGS SO THE USER CAN ;KNOW WHAT HAPPENED. MOV DS,CS:SAVE_DS CALL COLL_CLIP_INT_HANDLER POP ES POP DS POP BP POP DI POP SI POP DX POP CX POP BX POP AX RET COLL_CLIP_INT_ENTRY ENDP ASM86_CODE ENDS END  module_number: integer); var reg: reg_block; begin reg.ax.byte[high] := chr(ibm_rs232_get_status); reg.dx.signed := module_n { ********************************************************* * Copyright 1983 Mindset Corp. This program * * is an unpublished work of authorship protected * * by the copyright laws of the United States. * * This program is also the confidential, * * proprietary information of Mindset Corp. and * * is not to be copied, used or altered in any * * way without the express permission of Mindset * * Corp. * ********************************************************* ********************************************************* * This program is designated a Mindset Utility as * * defined in the Mindset Corp. Development Software * * License Agreement. * ********************************************************* } ! #@%`')+-/1 3@5`79;=?AOE`GIMOQ SUWY[]_/c@e gikmoq s@u`wy{ @ ` O o O ` #A%a')+-/1! ; ********************************************************* ; * Copyright 1983 Mindset Corp. This program * ; * is an unpublished work of authorship protected * ; * by the copyright laws of the United States. * ; * This program is also the confidential, * ; * proprietary information of Mindset Corp. and * ; * is not to be copied, used or altered in any * ; * way without    the express permission of Mindset * ; * Corp. * ; ********************************************************* ; ********************************************************* ; * This program is designated a Mindset Utility as * ; * defined in the Mindset Corp. Development Software * ; * License Agreement. * ; ********************************************************* ************* } ! #@%`')+-/1 3@5`79;=?AOE`GIMOQ SUWY[]_/c@e gikmoq s@u`wy{ @ ` O o O ` #A%a')+-/1!pas1 %1,%1,,; pas2 link %1 bios pasifc,%1,,; del %1.map del %1.obj del %1.lst %1 =?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq ow{ `  O @ ` &@ `  p  @` @`0!p  "$%q(*-/3!7A5a{ POINT.PAS - program to display a single white point at screen coords } { (100,100). The program may be terminated by pressing any } { key after the point has been displayed. } program point(input,output); type POINTS = array[0 .. 1] of word; { data descriptor for blt_polypoint } {$include:'bios.typ'} { MINDSET register definitions } var kb_scan: byte; { variable used to get keyboard scan} kb_char: char; { variable used to get keyboard char} data_offset: word; { BX for variable in get_word_addr } data_segment: word; { ES for variable in get_word_addr } color_index: byte; { defines color palette index } x_org: integer; { x-coordinate of point to display } y_org: integer; { y-coordinate of point to display } point: POINTS; { variable array for display point } ptr_point: ADS OF word; { get PASCAL pointer to array point } {$include:'bios.ext'} { MINDSET BIOS procedure definitions} {**************************** P O I N T . P A S ****************************} begin { start of main POINT.PAS program } ptr_point := ADS point; { get pointer to array point } point[0] := 0; { value of 0,0 in data descriptor } point[1] := 0; { means end of data (only one point)} color_index := 1; { palette index = 1 --> white point } x_org := 100; { x-coord = 100 pixels from top-left} y_org := 100; { y-coord = 100 pixels from top-left} set_screen_mode(2); { MINDSET mode 320x200x16 color mode} get_word_addr(ptr_point^,data_offset,data_segment); { get ES:BX for point array } blt_polypoint(0,1,color_index,x_org,y_org,data_offset,data_segment); { MINDSET BIOS call to display point} get_kb_char(kb_char,kb_scan); { wait for user to press any key } set_screen_mode(3); { MINDSET mode 640x200 for 80 column} set_ibm_mode(2); { set IBM character mode with cursor} end. { end of POINT.PAS program }   { COLOR0.PAS - program to display MINDSET basic (eg. RGB) color palette } { Pressing any key will exit the program. } program color0(input,output); const COLOR = 15; { 0-15 colors in MINDSET RGB palette} type COLORS = { ascending order of colors by RGB } (BLACK, DKBLUE, DKGREEN, DKCYAN, DKRED, DKMAGENTA, DKYELLOW, DKWHITE, DKGRAY, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE); POINTS = array [0..1] of word; { definition of (x,y) point } {$include:'bios.typ'} { MINDSET register definitions } var kb_scan: byte; { variable used to get keyboard scan} kb_char: char; { variable used to get keyboard char} data_offset: word; { BX for variable in get_word_addr } data_segment: word; { ES for variable in get_word_addr } ptr_palette: ADS OF word; { basic color palette for MINDSET } palette: array [0..COLOR] of word; { MINDSET basic COLORS palette } even_color: byte; { even numbered pixel color } odd_color: byte; { odd numbered pixel color } x,y: integer; { loop variables for x_ & y_org } x_org: integer; { x-coordinate of point to display } y_org: integer; { y-coordinate of point to display } ptr_square: ADS OF word; { pointer to square definition } square: array [0..3] of POINTS; { definition of square POINTS array } ptr_outline: ADS OF word; { pointer to outline array } outline: array [0..6] of POINTS;  { definition of outline array } {$include:'bios.ext'} { MINDSET BIOS procedure definitions} {*************************** C O L O R 0 . P A S ***************************} begin { start of main COLOR0.PAS program } ptr_square := ADS square; { set pointer to square } { store corner points of square } square[0][0] := 00; { square point [0] at (00,00) } square[0][1] := 00; { square point [0] at (00,00) } square[1][0] := 40; { square point [1] at (40,00) } square[1][1] := 00; { square point [1] at (40,00) } square[2][0] := 40; { square point [2] at (40,60) } square[2][1] := 50; { square point [2] at (40,50) } square[3][0] := 00; { square point [3] at (00,50) } square[3][1] := 50; { square point [3] at (00,50) } ptr_outline := ADS outline; { set pointer to outline } outline[0][0] := 000; { outline point [0] at (000,000) } outline[0][1] := 000; { outline point [0] at (000,000) } outline[1][0] := 319; { outline point [1] at (319,000) } outline[1][1] := 000; { outline point [1] at (319,000) } outline[2][0] := 319; { outline point [2] at (319,100) } outline[2][1] := 100; { outline point [2] at (319,100) } outline[3][0] := 000; { outline point [3] at (000,100) } outline[3][1] := 100; { outline point [3] at (000,100) } outline[4][0] := 000; { outline point [4] at (000,000) } outline[4][1] := 000; { outline point [4] at (000,000) } outline[5][0] := 000; { outline point [5] at (000,050) } outline[5][1] := 050; { outline point [5] at (000,050) } outline[6][0] := 319; { outline point [6] at (319,050) } outline[6][1] := 050; { outline point [6] at (319,050) } ptr_palette := ADS palette; { set up pointer to palette } { store MINDSET RGB palette values } palette[ord(BLACK)] := 16#0000; palette[ord(DKBLUE)] := 16#1000; palette[ord(DKGREEN)] := 16#2000; palette[ord(DKCYAN)] := 16#3000; palette[ord(DKRED)] := 16#4000; palette[ord(DKMAGENTA)] := 16#5000; palette[ord(DKYELLOW)] := 16#6000; palette[ord(DKWHITE)] := 16#7000; palette[ord(DKGRAY)] := 16#8000; palette[ord(BLUE)] := 16#9000; palette[ord(GREEN)] := 16#A000; palette[ord(CYAN)] := 16#B000; palette[ord(RED)] := 16#C000; palette[ord(MAGENTA)] := 16#D000; palette[ord(YELLOW)] := 16#E000; palette[ord(WHITE)] := 16#F000; set_screen_mode(2); { MINDSET mode 320x200x16 color mode} fill_dest_buffer(ord(BLACK)); { erase screen by writing all BLACK } get_word_addr(ptr_palette^,data_offset,data_segment); { get ES:BX for palette } set_palette(ord(BLACK),ord(BLACK),COLOR,data_offset,data_segment); { set MINDSET palette on machine } get_word_addr(ptr_square^,data_offset,data_segment); { get ES:BX for square } even_color := ord(BLACK); { even numbered pixels initially } odd_color := ord(BLACK); { odd numbered pixels initially } x_o   rg := 40; { set up x & y increment values } y_org := 50; { draw 16 colors in boxes on display} for y := 0 to 1 do { two rows of eight colors each } for x := 0 to 7 do begin blt_polygon(0,4,even_color,odd_color,x*x_org,y*y_org, data_offset,data_segment); { data_offset & segment for square } even_color := even_color + 1; odd_color := odd_color + 1; end; x_org := 0; { start outline display at (0,0) } y_org := 0; get_word_addr(ptr_outline^,data_offset,data_segment); { get ES:BX for outline } blt_polyline(0,7,ord(WHITE),chained,x_org,y_org, data_offset,data_segment); { outline palette with white lines } get_kb_char(kb_char,kb_scan); { wait for user to press any key } set_screen_mode(3); { MINDSET mode 640x200 for 80 column} set_ibm_mode(2); { set IBM character mode with cursor} end. { end of COLOR0.PAS program } MZ'(`h-) y ':Qd(1######9#l#####R#####H#u########6####%####5#T###% #D # # # #L # # #X # # # #d # # # #s # # ###y#########>#u#$8Y8a8q8y888:8p8888 8)8.888888L88888 8+8B8N8l88888888838\8y8~88888888 8#8.8:8H8_8888 848k8p8888888&858Q8e8888 8 8% 8m 8u 8z 8 8 8 8 8 8 8 8 8l 8| 8 8 8 8 8 8 8 8 88 8H 8X 8 8 8 8 8 8 8 8 8 8 8) 8: 8L 8^ 8g 8p 8u 8 8 8 8 8 8APY 6wX O_w9Ly ? M        &Udo&/8AJS;3x33333SGQ Q?QGQ[QbQgQQQiiiiiiiii.i3i` $)U 8PLNPRT(VX(Z2\^2d`bdfh?jl?ndprdtvxz2|?~2  "$ &0(@*P,`.p02468:<>P#3P#SPP #3P3PP66 #LSPP #@BH(J2FD3PP6@6BH.DPJ.FP66 #@BD@D=uF@F=uHJ`SPP #3PQQP6H6J66 #PP#P#P{#]U^ ^FFvFv]U^ ^FFvFv]U^ ^FFvFv]UFFFPFP.]UFF FFFFFPFP.]UFFFPFP.F2F~}FFv F2F~}FFv F2F~}FFvF2F~}FFv] UF FFF FFFPFP.]UF F FFFPFP.F2F~}FFv]UFFFF FFFPFP.]UF F FF FFFFFPFP.]UFF2FFFFFPFP.]UFFFFFPFP.]UFFFPFP.Fv]UFFFPFP.Fv]UFPFP.FvF2F~}FFv]UFPFP.F%@tv )v FvF2F~}FFv]UFPFP.F2F~}FFv]U  FF2FFFFFPFP.]UFFFFFPFP.]UFFFPFP.Fv]UFFFPFP.Fv]UFFFPFP.]UFFFPFP.]UFFFFFPFP.]UFPFP.F2F~}FFvF2F~}FFvFv Fv FvFv] UF(FFFFPFP.]UF)FFPFP.F2F~}FFvFv ]UF*F FFFFFF FPFP.]UF+FFPFP.F2F~}FFv Fv Fv]UF,F FFFFFF FPFP.]UF-F FFFFFF FPFP.]UF.F FFFFFPFP.]UF/FFPFP.F2F~}FFv F2F~}FFv]UF0FFPFP.F2F~}FFv]UFFFPFP.]UFPFP.F2F~}FFv FvFv]UFFFFFPFP.]UFPFP.F2F~}FFvF2F~}FFv]UFF FF FFFFFPFP.]UFPFP.Fv Fv FvFv]UFFFPFP.]UFPFP.Fv]UFFFFFFFF FF FFFFFPFP.]UF FFFFF FF FFFFFPFP.] UF FFF FF FFFFFPFP.] UF F FF FFFFFPFP.F2F~}FFv] UF FFFFFFF FF FFFFFPFP.]UF FFFFFF~uFFF FF FFFFFPFP.]UFFFFFFFFFF FF FFFFFPFP.]U~uFFFFFFFFFFF FF FFFFFPFP.]UFF FF FFFFFPFP.]UFPFP.Fv Fv FvFv]UF~ uFFFFFFPFP.]UFPFP.~uv v F2F~}FFvF2F~}FFv]UFF FFFFFPFP.]UFPFP.F2F~}FFv FvFv]UFFFFFPFP.]UFPFP.FvFv]UFPFP.Fv Fv FvFv]UFPFP.]UFPFP.F2F~}FFv FvFv]UFF FF FFFPFP.vF]UFFFFFPFP.]UFFFPFP.]UFFFFFPFP.]UF PFP.FvFv]UF!FFFFFFFFFFF FF FFFFFPFP.]UF"FFPFP.]UF#PFP.F2F~}FFv]UF$PFP.F%v F%vF%v]UF%PFP.Fv FvFv]UF&PFP.F%v FvFv]U]UF .&^ ~E ]MUu} W~E EE ]MUu]UVv ^D^^].jːPSQRVWU.j]_^ZY[XPSQRVWU.j]_^ZY[X vDrFt P.Sv|uBD s;D$r4Dr-|uPD +DP@8vq #u v P vjv|uDvDVF;Ftv~ED vDvDP{8vD] Pv|uF4Dv|uauZDr DND HvD:Fu DPD2vDVF8:Fuv|uDs vDODv|u@F-F]6 Pv|usD2拄2䉆ƑPP?PP2P?2@v+@PPHPPvtti-]{ F;FtvD;FtFFFF]I vDDD$DDDDD!DPvDD|u@DDs D6] Pv v vvv D$rD r1v DD st v |tD v DD v D"D-]q P~vrFFFF;Fr'v|uFPPPM vD"DыF%F~v!v|uPvPM vD"D-] Pv |uDF ;D v DWDv v vvM F v Dv |u@F-F]{ PvP8s,Ftvv 2PFP8vFLDD   v{8-]  Pv Ds DLD@v ~ u@^& ɺuB"ˆDDs P:Gv v ^SHv {8-]Pv|uSDs@D!rPGvD s&DsDrPQDP8vD vDMDv{8-]+PvPi-]PvvtD-]PvDr DQDv 8vD%FP{8-F]Pv3P8rv{8vD$F-F]^Pv|tDr DRDv|uDrDD%vDr DTDhvD%s DSDSvD rPt DP87vDsD'vPvDP8vD%s DSDv{8-]Pv DDDDDDFD DFD PG-]9Pt 4L-] PuP1QFF;w[vvP6 #u6<t 2䣖,vv 3P P 3P@PP3>u@-]XPv|tDr DUDv|uDvDs DVD^vD sPQDP8Avvt DP8s*vq v|tD vDDvDv{8-]Pv3PvD%DDDP vDsD r|tPt DP8v{8-]/Pv3PnvD%DDPv{8-]Pv3P8s#vD$r|uPQDP8݋vDP{8-]vDr D`D jv|t DaDVvDr-D$r&D sPD +DP@8v|uPq vDD$|u Pvv7 vDP{8]Pvv3PN-]Pv FPFP'-]PvP8sYv|uD$rPD +DP@8v|uPq #u v P v|tD vDDvD$DP{8-]PvP8s>vD$rP 8v|u$|u P1P vP P8v{8-]PPPP(8PPP(8PPPHPPPHP 8P 8-]6PPPPP(8PPPP(8-]^. FFU+r;.wVNot Enough Memory$ !...+B&-r3+s++Ӹ،o+sTЎ¾Ҽ&.À€.3.......>t3E E3>tL!.^_ZXWVU!]UPFvP.vD?s"PLP."t vFDDvD?|u@FF]UvP rvD@|muDmvDmv|mu DD\vDr|uL!PFLP.2>uv|t D\%DBv>t@>tA"D%v|u@L"L%4"ȈNF]UvD s|uDr P P vDr#|uD s|<tPP?PM v|t|<tPP vDrw|uqDmDoD\D@DmD^;TmsvDo2DpDZD[(PLP.vDmDoDpDZD[]UFv|<uPLP.PFLP.F]Uv1v|<uPLP.vD2FF]Uv D"D% DrD%DrD%r~ uF v D rDD$v D";F rD@;DBrJ|<u1 PtP.P P.v Du2Ev D@v frv Dvv F +D" DB+D@; s v D@vPD"^S P v D"L@>tB2ЉT@> uD$|<uDBD@5>u+v DD" uAL%D%4DrD$D2Fv D$s&|<u D@;DBuPfv |@}v uD@v |<t2v D";F s%ЋD=2PPV.^^&v D"uv D";F sjD@;DBrPfrv D%D"Iv F +D" DB+D@; s v D@vPD"^S6  v D"D@닋v D2FF]Uv D&2;F sF F F~r,""F D&2"I^&"@"H;FuڋF FF]Uv N^&< u ~ vF v ~ v@DsDssD& v F D&v D&2F~rF$$F >$O^&D&&2PPPrv Ds$@$H;Fu]UvDvDvtD&2~;E|Bu|&.t9|&:t3~֋vD2@E܋vD܋~ȋE2E&vD뫋vtD&2~;E|֋vUE&DvD]U&FvDss DDFLP$P3PyvDtFU vD<~:t@FFuXF2Fڃ~r((6(zar B2Bܡ(@(H;Fuހ~u~ArvF2DLFUF2#t=~vDDR&F2;&|&F>&C܈DL &FDL &@&= uˀ~v&F2;&|#6&z`sB܈B6&B2B6&B &@&=uvtvu,vD s D=D> vD=D>vDD<XvuvD=D>DD<3v%  tv+uvD=D>DD<~.uUWF2=~vDDF&F2;&|&F>&C܈DT &FDT &@&=uˋv|<u[Dr|tPFLP.<v:vDsDD ~"PFLP.<vvDDZvDZD[|u|<t DDvD?DmD$D4D%DBDrDD!D@D D2FF]Uv|tD r1*,^2-.D.<.5*,'.1w+r.% v|uP6.6,6*M vD$vD vD2FF]UvD s|tPP=PM F vD FvD$F]U02v0& tA2&2+F2;FwttF8v2F~|(44F>4G0&4@4H;FutF]Uv D$F D"|<tH|>u;F F~r/6v D>2P66N^&2P.6@6H;Fut66;F sfv D@;DBr PfrNF +68v DB+D@;8s8^6Sv D@vP68v D?8D@6뒋v D2FF]Uv FDNL#tF FFF2 uAvvv D ЋD 2R

PN"Fr>>r<%@< > £:v Dm;:tGPP v :Dm!PLP.2>v >>t@>>tA"Drv D%L@;@sB"ˆDrv @D@DrLB;L@wB ˆDrv Drv D%D2FF]U]Uv<tm4DsDvP.Gv4D s0D$r)Dr"|u|uPq vP P vPjvu!܋_ݍFG_U]F;rU؎v ~Ns]U؎v ~NNO]U؎~ NFs]UF؋v F ~Ns] UF؋v F ~NNO] UF ~ NFs]UF FnFr@]UF fnFr@]UF FnFp~t@]UF nnFp~t@]U^^H]UF^&];>r;>s E;vA؎X>u[X&.&XX[PS.XX[PS$XX[PSXX[PS.MMX][YZQS8 Uvn3&VE&8uC]Uvn3&VE&8rw C]Uvnǎ&FE&C]&CGZ^++;&r&CCGGVRRVPUv ;vwvN ,r3]U^Ӌ^~ vn &FE< t<t &C3 2ڋ+щ] U~ t0F HFxP6x^&2P.x@xH;Fu݋]U~ w F |Ɔ| P|P.~Pvv}2PPyP 3}2FF]U]UFgq]UP P.P P.]U]U]U]U]UvD!]UvzvDDsD&]UPF&P P?F 30T&3H=uӋ]U]UF@%F;r6+;wF%u_>t@H;Fs.@@FF6FF;Fv +FH6g@@;uO>uFD>t6>u F@@P;uF]UPvQF~s~u-F]UP-]Uvv 3]U>u~ ~F~t/vF360Rz9v B2BF36FFHFu¸PFPvn]U P3 PPUGv 2PFPU83 PPU' vU3~t PPUvU3>tq>tPPU 6UPPU6tD2P6DPUPPU642P6@PU3>tzPPUe6UvPPUQ6UbPPU=^FÓPUCPPU6U/PPU 6U3-]UP-]too smallunsigneddivide by zeroREALlong integermath overflowSIN or COSargumentrangeEXPSQRTofLNTRUNC/ROUNDTANARCSIN or ARCCOS> 1.0negativetopowermath underflowstackno room inis invalidallocator interruptedheapnon-positive3 #4 d# (5 5 6 5*e#54(5>fCNWHg]NWShafN^iifNjjlNWvxN|f###T-t(h#[#Q:G=3)JB:62J*.C.2 .Y>a>q>y>>>:>p>>>> >)>.>>>>8>L>>>>> >+>B>N>l>>>>>>>>>3>\>y>~>>>>>>>> >#>.>:>H>_>>>> >4>k>p>>>>>>>&>5>Q>e>>>> > >% >m >u >z > > > > > > > > >l >| > > > > > > > > >8 >H >X > > > > > > > > > > >) >: >L >^ >g >p >u > > > > > >A P Y           6 w  X     O _ w    9   L y     ? M        &Udo&/8AJS;9x99999SMW W?WGW[WbWgWWWooooooooo.o3o` $)U >plnprtvxz |~ @<>@BD F0H@JPL`NpPRTVXZ\^P)3P)<S8P:P )3P3PP686: )lS8P:P )`bhdj`3PP6`6``2.dhP6j686: )`@`<uhj f b3PP6b6b6hb2.fjP686: )b@b<uhj df `b3PP6`6b`2.dhPb2.fjP686: )b@b<u`@`<upr t3v x3z|~ 3PQQP3PP686: )6P4P)P)P)]U^ ^FFvFv]U^ ^FFvFv]U^ ^FFvFv]UFFFPFP4]UFF FFFFFPFP4]UFFFPFP4F2F~}FFv F2F~}FFv F2F~}FFvF2F~}FFv] UF   FFF FFFPFP4]UF F FFFPFP4F2F~}FFv]UFFFF FFFPFP4]UF F FF FFFFFPFP4]UFF2FFFFFPFP4]UFFFFFPFP4]UFFFPFP4Fv]UFFFPFP4Fv]UFPFP4FvF2F~}FFv]UFPFP4F%@tv )v FvF2F~}FFv]UFPFP4F2F~}FFv]UFF2FFFFFPFP4]UFFFFFPFP4]UFFFPFP4Fv]UFFFPFP4Fv]UFFFPFP4]UFFFPFP4]UFFFFFPFP4]UFPFP4F2F~}FFvF2F~}FFvFv Fv FvFv] UF(FFFFPFP4]UF)FFPFP4F2F~}FFvFv ]UF*F FFFFFF FPFP4]UF+FFPFP4F2F~}FFv Fv Fv]UF,F FFFFFF FPFP4]UF-F FFFFFF FPFP4]UF.F FFFFFPFP4]UF/FFPFP4F2F~}FFv F2F~}FFv]UF0FFPFP4F2F~}FFv]UFFFPFP4]UFPFP4F2F~}FFv FvFv]UFFFFFPFP4]UFPFP4F2F~}FFvF2F~}FFv]UFF FF FFFFFPFP4]UFPFP4Fv Fv FvFv]UFFFPFP4]UFPFP4Fv]UFFFFFFFF FF FFFFFPFP4]UF FFFFF FF FFFFFPFP4] UF FFF FF FFFFFPFP4] UF F FF FFFFFPFP4F2F~}FFv] UF FFFFFFF FF FFFFFPFP4]UF FFFFFF~uFFF FF FFFFFPFP4]UFFFFFFFFFF FF FFFFFPFP4]U~uFFFFFFFFFFF FF FFFFFPFP4]UFF FF FFFFFPFP4]UFPFP4Fv Fv FvFv]UF~ uFFFFFFPFP4]UFPFP4~uv v F2F~}FFvF2F~}FFv]UFF FFFFFPFP4]UFPFP4F2F~}FFv FvFv]UFFFFFPFP4]UFPFP4FvFv]UFPFP4Fv Fv FvFv]UFPFP4]UFPFP4F2F~}FFv FvFv]UFF FF FFFPFP4vF]UFFFFFPFP4]UFFFPFP4]UFFFFFPFP4]UF PFP4FvFv]UF!FFFFFFFFFFF FF FFFFFPFP4]UF"FFPFP4]UF#PFP4F2F~}FFv]UF$PFP4F%v F%vF%v]UF%PFP4Fv FvFv]UF&PFP4F%v FvFv]U]UF .&^ ~E ]MUu} W~E EE ]MUu]UVv ^D^^].jːPSQRVWU.j]_^ZY[XPSQRVWU.j]_^ZY[X vDrFt P. Sv|uBD s;D$r4Dr-|uPD +DP@>vq #u v P vj v|uDvDVF;Ftv~ED vDvDP{>vD] Pv|uF4Dv|uauZDr DND HvD:Fu DPD2vDVF>:Fuv|uDs vDODv|u@F-F]6 Pv|usD2拄2䉆ƕPP?PP2P?2@v+@PP HPPv  tto-]{ F;FtvD;FtFFFF]I vDDD$DDDDD!DP vDD|u@DDs D6] Pv v vv v D$rD r1v DD st v |tD v DD v D"D-]q P~vrFFFF;Fr'v|uFPPPM vD"DыF%F~v!v|uPvPM vD"D-] Pv |uDF ;D v DWDv v vvM F v Dv |u@F-F]{ PvP>s,Ftvv 2PFP>vFLDDv{>-]  Pv Ds DLD@v ~ u@^& ɺuB"ˆDDs P:Mv v ^SH v {>-]Pv|uSDs@D!rPMvD s&DsDrPQDP>vD vDMDv{>-]+PvPi-]PvvtD-]PvDr DQDv >vD%FP{>-F]Pv3P>rv{>vD$F-F]^Pv|tDr DRDv|uDrDD%vDr DTDhvD%s DSDSvD rPt DP>7vDsD'vPvDP>vD%s DSDv{>-]Pv DDDDDDFD DFD PM-]9Pt 4L-] PuP1WFF;w[vvP6 #u6<t 2䣚,vv 9P P 9P@PP9>u@-]XPv|tDr DUDv|uDvDs DVD^vD sPQDP>Avvt DP>s*vq v|tD vDDvDv{>-]Pv3PvD%DDDP vDsD r|tPt DP>v{>-]/Pv3PnvD%DDPv{>-]Pv3P>s#vD$r|uPQDP>݋vDP{>-]vDr D`D jv|t DaDVvDr-D$r&D sPD +DP@>v|uPq vDD$|u Pvv7 vDP{>]Pvv3PN-]Pv FPFP'-]PvP>sYv|uD$rPD +DP@>v|uPq #u v P v|tD vDDvD$DP{>-]PvP>s>vD$rP >v|u$|u P1P vP P>v{>-]PPPP(>PPP(>PPPH PPPH P >P >-]6PPPPP(>PPPP(>-]^. FFU+r;.wVNot Enough Memory$ !... +B&-r3+s++Ӹ،s+sTЎ¾Ҽ &.À„.3.......>t9K K9>tL!.^_ZXWVU!]UPFvP. vD?s"PLP. "t vFDDvD?|u@FF]UvP rvD@|muDmvDmv|mu DD\vDr|uL!PFLP. 2>uv|t D\%DBv>t@>tA"D%v|u@L"L%4"ȈNF]UvD s|uDr P P vDr#|uD s|<tPP?PM v|t|<tPP vDrw|uqDmDoD\D@DmD^;TmsvDo2DpDZD[(PLP. vDmDoDpDZD[]UFv|<uPLP. PFLP. F]Uv1 v|<uPLP. vD2FF]Uv D"D% DrD%DrD%r~ uF v D rDD$v D";F rD@;DBrJ|<u1 PtP. P P. v Du2Ev D@v f rv Dvv F +D" DB+D@; s v D@vPD"^S P v D"L@>tB2ЉT@> uD$|<uDBD@5>u+v DD" uAL%D%4DrD$D2Fv D$s&|<u D@;DBuPf v |@}v uD@v |<t2v D";F s%ЋD=2PPV. ^^&v D"uv D";F sjD@;DBrPf rv D%D"Iv F +D" DB+D@; s v D@vPD"^S6  v D"D@닋v D2FF]Uv D&2;F sF F F~r,""F D&2"I^&"@"H;FuڋF FF]Uv N^&< u ~ vF v ~ v@DsDssD& v F D&v D&2F~rF$$F >$O^&D&&2PPPrv Ds$@$H;Fu]UvDvD  vtD&2~;E|Bu|&.t9|&:t3~֋vD2@E܋vD܋~ȋE2E&vD뫋vtD&2~;E|֋vUE&DvD]U&FvDss DDFLP$P3PyvDtFU vD<~:t@FFuXF2Fڃ~r((6(zar B2Bܡ(@(H;Fuހ~u~ArvF2DLFUF2#t=~vDDR&F2;&|&F>&C܈DL &FDL &@&= uˀ~v&F2;&|#6&z`sB܈B6&B2B6&B &@&=uvtvu,vD s D=D> vD=D>vDD<XvuvD=D>DD<3v%tv+uvD=D>DD<~.uUWF2=~vDDF&F2;&|&F>&C܈DT &FDT &@&=uˋv|<u[Dr|tPFLP. <v:vDsDD ~"PFLP. <vvDDZvDZD[|u|<t DDvD?DmD$D4D%DBDrDD!D@D D2FF]Uv|tD r1*,^2-.D.<.5*,'.1w+r.% v|uP6.6,6*M vD$vD vD2FF]UvD s|tPP=PM F vD FvD$F]U02v0& tA2&2+F2;FwttF8v2F~|(44F>4G0&4@4H;FutF]Uv D$F D"|<tH|>u;F F~r/6v D>2P66N^&2P. 6@6H;Fut66;F sfv D@;DBr Pf rNF +68v DB+D@;8s8^6Sv D@vP68v D?8D@6뒋v D2FF]Uv FDNL#tF FFF2 uAvvv D ЋD 2R

PN"Fr>>r<%@< > £:v Dm;:tGPP v :Dm!PLP. 2>v >>t@>>tA"Drv D%L@;@sB"ˆDrv @D@DrLB;L@wB ˆDrv Drv D%D2FF]U]Uv<tm4DsDvP. Gv4D s0D$r)Dr"|u|uPq vP P vPj vu!܋_ݍFG_U]F;rU؎v ~Ns]U؎v ~NNO]U؎~ NFs]UF؋v F ~Ns] UF؋v F ~NNO] UF ~ NFs]UF FnFr@]UF fnFr@]UF FnFp~t@]UF nnFp~t@]U^^H]UF^&];>r;>s E;vA؎X>u[X&.&XX[PS.XX[PS$XX[PSXX[PS.MMX][YZQS8 Uvn3&VE&8uC]Uvn3&VE&8rw C]Uvnǎ&FE&C]&CGZ^++;&r&CCGGVRRVPUv ;vwvN ,r3]U^Ӌ^~ vn &FE< t<t &C3 2ڋ+щ] U~ t0F HFxP6x^&2P. x@xH;Fu݋]U~ w F |Ɔ| P|P. ~Pvv}2PPyP 9}2FF]U]UFgq]UP P. P P. ]U]U]U]U]UvD!]UvzvDDsD&]UPF&P P?F 30T&3H=uӋ]U]UF@%F;r6+;wF%u_>t@H;Fs.@@FF6FF;Fv +FH6g@@;uO>uFD>t6>u F@@P;uF]UPvWF~s~u-F]UP-]Uvv 9]U>u~ ~F~t/vF360Rz9v B2BF36FFHFu¸PFPvn]U P9 PPUGv 2PFPU89 PPU' vU3~t PPUvU9>tq>tPPU 6UPPU6tD2P6DPUPPU642P6@PU9>tzPPUe6UvPPUQ6UbPPU=^FÓPUCPPU6U/PPU 6U9 -]UP-]too smallunsigneddivide by zeroREALlong integermath overflowSIN or COSargumentrangeEXPSQRTofLNTRUNC/ROUNDTANARCSIN or ARCCOS> 1.0negativetopowermath underflowstackno room inis invalid  allocator interruptedheapnon-positive3 #4 d# (5 5 6 5*e#54(5>fCNWHg]NWShafN^iifNjjlNWvxN|f###T-t(h#[#Q:G=3)JB:62J*.C.2 .